/***********************/
/*** 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 ********************************************************************/
/*****************************************************************************/
/*****************************************************************************/
static const u8		s_collisionTileRemapTable[17]=
{
	0,	
	1,
	1,
	1,
	1,
	2,
	3,
	0,
	0,
	4,
	5,
	0,
	0,
	6,
	7,
	0,
	0,
};

int		CMkLevelLayerCollision::Write(CMkLevel *Core,FILE *File,const char *LayerName)
{
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=s_collisionTileRemapTable[ThisElem.Tile];
				OutElem|=ThisElem.Flags<<COLLISION_TYPE_FLAG_SHIFT;
				fwrite(&OutElem,sizeof(u8),1,File);
			}
		}
		PadFile(File);

		Size=ftell(File)-ThisPos;
		return(ThisPos);
}

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