/********************/
/*** Layer Hazard ***/
/********************/

#include	"stdafx.h"
#include	<Vector3.h>
#include	<gl\gl.h>
#include	<gl\glu.h>
#include	"GLEnabledView.h"

#include	"MapEdit.h"
#include	"MapEditDoc.h"
#include	"MapEditView.h"
#include	"MainFrm.h"

#include	"Core.h"
#include	"LayerThing.h"
#include	"LayerHazard.h"
#include	"Utils.h"
#include	"Export.h"

/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
CLayerHazard::CLayerHazard(sLayerDef &Def)
{
		InitLayer(Def);
}

/*****************************************************************************/
void	CLayerHazard::InitLayer(sLayerDef &Def)
{
		ThingBank=new CElemBank(-1,-1,false,CElem::CentreModeLR | CElem::CentreModeB);
		CLayerThing::InitLayer(Def);
		LoadThingScript(theApp.GetConfigStr("LayerScript","HazardScript"));
}

/*****************************************************************************/
void	CLayerHazard::InitSubView(CCore *Core)
{
}

/*****************************************************************************/
void	CLayerHazard::LoadDefThing(const char *Name,sLayerThing &ThisDef)
{
		ThisDef.Data.Hazard.HazardSpeed=ThingScript.GetInt(Name,"Speed");
		ThisDef.Data.Hazard.HazardTurnRate=ThingScript.GetInt(Name,"TurnRate");
		ThisDef.Data.Hazard.HazardHealth=ThingScript.GetInt(Name,"Health");
		ThisDef.Data.Hazard.HazardAttackStrength=ThingScript.GetInt(Name,"AttackStrength");
		ThisDef.Data.Hazard.HazardRespawn=ThingScript.GetInt(Name,"Respawn");
		ThisDef.Data.Hazard.HazardCollisionFlag=ThingScript.GetInt(Name,"Collision")==1;

}

/*****************************************************************************/
void	CLayerHazard::LoadOldThing(CFile *File,sLayerThing &ThisThing)
{
sLayerThingDataOLD	OldThing;

		File->Read(&OldThing,sizeof(sLayerThingDataOLD));
		ThisThing.Data.Hazard.HazardSpeed=OldThing.Speed;
		ThisThing.Data.Hazard.HazardTurnRate=OldThing.TurnRate;
		ThisThing.Data.Hazard.HazardHealth=OldThing.Health;
		ThisThing.Data.Hazard.HazardAttackStrength=OldThing.AttackStrength;
		ThisThing.Data.Hazard.HazardRespawn=OldThing.Speed;
		ThisThing.Data.Hazard.HazardCollisionFlag=OldThing.CollisionFlag;
}


/*****************************************************************************/
/*** Gui *********************************************************************/
/*****************************************************************************/
void	CLayerHazard::GUIInit(CCore *Core)
{
		GUIHazard.DisableCallback(true);
		Core->GUIAdd(GUIThing,IDD_LAYER_THING);
		Core->GUIAdd(GUIThingPos,IDD_LAYER_THING_POS);
		Core->GUIAdd(GUIHazard,IDD_LAYER_HAZARD);
		GUIHazard.DisableCallback(false);

		GUIHazard.m_HealthSpin.SetRange(0,255);
		GUIHazard.m_AttackSpin.SetRange(0,255);
		GUIHazard.m_SpeedSpin.SetRange(0,255);
		GUIHazard.m_TurnRateSpin.SetRange(0,255);
		GUIHazard.m_RespawnSpin.SetRange(0,255);

}

/*****************************************************************************/
void	CLayerHazard::GUIKill(CCore *Core)
{
		Core->GUIRemove(GUIThing,IDD_LAYER_THING);
		Core->GUIRemove(GUIThingPos,IDD_LAYER_THING_POS);
		Core->GUIRemove(GUIHazard,IDD_LAYER_HAZARD);
}

/*****************************************************************************/
void	CLayerHazard::GUIUpdate(CCore *Core)
{
int			i,ListSize;
CComboBox	&List=GUIThing.m_DefList;

// Setup Def Hazard List
		ListSize=DefList.size();
		List.ResetContent();
		for (i=0; i<ListSize; i++)
		{
			List.AddString(DefList[i].Name);
		}
		List.SetCurSel(CurrentDefThing);

		GUIThingUpdate();
}

/*****************************************************************************/
void	CLayerHazard::GUIThingDefClear()
{
CComboBox	&List=GUIThing.m_DefList;
		CurrentDefThing=-1;
		List.SetCurSel(CurrentDefThing);
}

/*****************************************************************************/
void	CLayerHazard::GUIThingUpdate(bool OnlySel)
{
		GUIThingUpdateList(GUIThing.m_List,false);
// Params
		GUIHazard.DisableCallback(true);
		if (CurrentThing!=-1)
		{
			sLayerThing	&ThisThing=ThingList[CurrentThing];
			GUIHazard.SetVal(GUIHazard.m_Speed,ThisThing.Data.Hazard.HazardSpeed);
			GUIHazard.SetVal(GUIHazard.m_TurnRate,ThisThing.Data.Hazard.HazardTurnRate);
			GUIHazard.SetVal(GUIHazard.m_Health,ThisThing.Data.Hazard.HazardHealth);
			GUIHazard.SetVal(GUIHazard.m_Attack,ThisThing.Data.Hazard.HazardAttackStrength);
			GUIHazard.SetVal(GUIHazard.m_Respawn,ThisThing.Data.Hazard.HazardRespawn);
			GUIHazard.m_Collision.SetCheck(ThisThing.Data.Hazard.HazardCollisionFlag);
		}
		else
		{
			GUIHazard.m_Speed.SetWindowText("");
			GUIHazard.m_TurnRate.SetWindowText("");
			GUIHazard.m_Health.SetWindowText("");
			GUIHazard.m_Attack.SetWindowText("");
			GUIHazard.m_Respawn.SetWindowText("");
			GUIHazard.m_Collision.SetCheck(false);
		}
		GUIHazard.DisableCallback(false);
}

/*****************************************************************************/
void	CLayerHazard::GUIThingPointUpdate(bool OnlySel)
{
		GUIThingPointUpdateList(GUIThingPos.m_List,OnlySel);
}

/*****************************************************************************/
void	CLayerHazard::GUIChanged(CCore *Core)
{
		if (CurrentThing!=-1)
		{
			sLayerThing	&ThisThing=ThingList[CurrentThing];
			ThisThing.Data.Hazard.HazardSpeed=GUIHazard.GetVal(GUIHazard.m_Speed);
			ThisThing.Data.Hazard.HazardTurnRate=GUIHazard.GetVal(GUIHazard.m_TurnRate);
			ThisThing.Data.Hazard.HazardHealth=GUIHazard.GetVal(GUIHazard.m_Health);
			ThisThing.Data.Hazard.HazardAttackStrength=GUIHazard.GetVal(GUIHazard.m_Attack);
			ThisThing.Data.Hazard.HazardRespawn=GUIHazard.GetVal(GUIHazard.m_Respawn);
			ThisThing.Data.Hazard.HazardCollisionFlag=GUIHazard.m_Collision.GetCheck()!=0;
		}

}

/*****************************************************************************/
void	CLayerHazard::Export(CCore *Core,CExport &Exp)
{
		CLayerThing::Export(Core,Exp);
}

/*****************************************************************************/
void	CLayerHazard::ExportThingData(CCore *Core,CExport &Exp,sLayerThing &ThisThing,sLayerThingData &OutThing)
{
CElem	&ThisElem=ThingBank->GetElem(ThisThing.ElemID,0);

		Exp.ExportElem3d(Core,ThisElem,OutThing.Hazard.HazardTriStart,OutThing.Hazard.HazardTriCount);
		
}