/*******************/
/*** Layer Thing ***/
/*******************/

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

#include	"..\MkLevel.h"
#include	"MkLevelLayer.h"
#include	"MkLevelLayerThing.h"

/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
CMkLevelLayerThing::CMkLevelLayerThing(sExpLayerHdr *LayerHdr)
{
u8		*Ptr=(u8*)LayerHdr;

		Type=LayerHdr->Type;
		SubType=LayerHdr->SubType;
		Width=LayerHdr->Width;
		Height=LayerHdr->Height;

int		*iPtr=(int*)(Ptr+sizeof(sExpLayerHdr));

int		i,ListSize=*iPtr++;
		ThingList.resize(ListSize);
		Ptr=(u8*)iPtr;
		for (i=0; i<ListSize; i++)
		{
			Ptr=LoadThing(ThingList[i],Ptr);
		}
		LoadThingNames((char*)Ptr);

}

/*****************************************************************************/
u8		*CMkLevelLayerThing::LoadThing(sMkLevelLayerThing &ThisThing,u8 *Ptr)
{
int		i,ListSize;

sLayerThingData	*DPtr=(sLayerThingData*)Ptr;

		ThisThing.Data=*DPtr++;
int		*iPtr=(int*)DPtr;

		ListSize=ThisThing.Data.WaypointCount;
		ThisThing.XY.resize(ListSize);
		for (i=0; i<ListSize; i++)
		{
			ThisThing.XY[i].x=*iPtr++;
			ThisThing.XY[i].y=*iPtr++;
		}
		
		return((u8*)iPtr);
}

/*****************************************************************************/
void	CMkLevelLayerThing::LoadThingNames(char *Ptr)
{
int		i,ListSize=ThingList.size();

		for (i=0; i<ListSize; i++)
		{
			sMkLevelLayerThing	&ThisThing=ThingList[i];

			ThisThing.Name=Ptr;
			Ptr+=strlen(Ptr)+1;
		}

}

/*****************************************************************************/
void	CMkLevelLayerThing::ProcessList(CMkLevel *Core)
{
int		i,ListSize=ThingList.size();
CIni	&Config=Core->GetConfig();
int		KeyCount=Config.GetKeyCount(GetTypeName());
vector<int>	Counts;

		Counts.resize(KeyCount);
		for (i=0;i<KeyCount;i++)
		{
			Counts[i]=0;
		}

		for (i=0; i<ListSize; i++)
		{
			sMkLevelLayerThing	&ThisThing=ThingList[i];
			bool	Found=Config.GetInt(GetTypeName(),ThisThing.Name,ThisThing.Type);

			int	Idx=Config.FindKey(GetTypeName(),ThisThing.Name);
			Counts[Idx]++;
			ASSERT(Idx<KeyCount);
			if (!Found)
				GObject::Error(ERR_FATAL,"%s not found in list\n",ThisThing.Name);
		}
// Create Inf Data


		for (i=0; i<KeyCount; i++)
		{
			GString	OutName="TOTAL_";
			char	*Name=Config.GetKeyName(GetTypeName(),i);

			OutName+=GetTypeName();
			OutName+="_";
			OutName+=Name;
			
			Core->AddInfItem(OutName,Counts[i]);
		}


}

/*****************************************************************************/
int		CMkLevelLayerThing::CountThing(CMkLevel *Core,const char *Name)
{
int		i,ListSize=ThingList.size();
int		Count=0;

		for (i=0; i<ListSize; i++)
		{
			sMkLevelLayerThing	&ThisThing=ThingList[i];
			if (ThisThing.Name=Name)
			{
				Count++;
			}
		}

		return(Count);
}