/***********************/
/*** Layer Collision ***/
/***********************/

#include	<DaveLib.h>
#include	<List2d.h>

#include	"MkLevelLayer.h"
#include	"MkLevelLayerCollision.h"

/*
0	- Blank
1	- Solid block (no flips)
2	- slope0
3	- slope0 flip x
4	- slope1
5	- slope1 flip x
6	- slope2
7	- slope2 flip x
*/
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
CMkLevelLayerCollision::CMkLevelLayerCollision(sExpLayerHdr *LayerHdr)
{
		Type=LayerHdr->Type;
		SubType=LayerHdr->SubType;
		Width=LayerHdr->Width;
		Height=LayerHdr->Height;

sExpColTile	*MapPtr=(sExpColTile*)((int)LayerHdr+sizeof(sExpLayerHdr));

		Map.SetSize(Width,Height);
		
		for (int Y=0; Y<Height; Y++)
		{
			for (int X=0; X<Width; X++)
			{
				Map.Set(X,Y,*MapPtr++);
			}
		}
}

/*****************************************************************************/
/*****************************************************************************/
/*** Pre-Process *************************************************************/
/*****************************************************************************/
/*****************************************************************************/
void	CMkLevelLayerCollision::PreProcess(CMkLevel *Core)
{
		//printf("PreProcess Collision Layer\n");
}

/*****************************************************************************/
/*****************************************************************************/
/*** Process *****************************************************************/
/*****************************************************************************/
/*****************************************************************************/
void	CMkLevelLayerCollision::Process(CMkLevel *Core)
{
		//printf("Process Collision Layer\n");
}

/*****************************************************************************/
/*****************************************************************************/
/** Write ********************************************************************/
/*****************************************************************************/
/*****************************************************************************/
int		CMkLevelLayerCollision::Write(FILE *File,const char *LayerName,const char *MapName)
{
sLayerHdr	Hdr;
int			ThisPos=ftell(File);
int			Width=Map.GetWidth();
int			Height=Map.GetHeight();

		Hdr.Type=Type;
		Hdr.SubType=SubType;
		Hdr.Width=Width;
		Hdr.Height=Height;
		fwrite(&Hdr,sizeof(sLayerHdr),1,File);

		for (int Y=0; Y<Height; Y++)
		{
			for (int X=0; X<Width; X++)
			{
				sExpColTile	&ThisElem=Map.Get(X,Y);	
				u8		OutElem;

				OutElem=ThisElem.Tile;
				OutElem|=ThisElem.Flags<<COLLISION_TYPE_FLAG_SHIFT;
/*
				OutElem=0;
				if (ThisElem.Tile || ThisElem.Flags)
				{
					int	FF=ThisElem.Tile & 1;
					int	T=(ThisElem.Tile>>1)+1;
					OutElem=((T-1)*4)+1;
					OutElem+=FF;
					OutElem|=ThisElem.Flags<<COLLISION_TYPE_FLAG_SHIFT;

				}

*/
/*				if (ThisElem.Tile>(u16)COLLISION_MASK)
				{
					printf("COLLISION OVERFLOW %s: %i,%i=(%i,%i)!!\n",MapName,X,Y,ThisElem.Tile,ThisElem.Flags);
				}
*/
				fwrite(&OutElem,sizeof(u8),1,File);
			}
		}
		PadFile(File);

		return(ThisPos);
}

/*****************************************************************************/