/* (c) Ubi Studios 1998*/
 
/*For game material*/
#include "GMT/GmtHandl.h"
 
#include "ACP_base.h"
/*memory management of geometry.*/
#include "GEO.h"
#include "GLI.h"
#include "SCR.h"
 
/*Include For "Sector.h"*/
#include "MTH.h"
#include "COL.h"
#include "SPO.h"
#include "LST.h"
 
#include "VIG.h"
 
/*For the sound*/
#include "SND.h"
 
#include "SCT.h"
 
/*PATH NAME*/
#include "DPT.h"
 
#include "SNA.h"
 
#include "ldt.h"
 
extern SCR_tdst_Link_Table SECT_stLinkTable;
 
#define lTagMinPointOfBorder	'PniM'
#define lTagMaxPointOfBorder	'PxaM'
#define lTagZmaxOfBorder			'xamZ'
 
#define lTagAddLst						'LddA'
#define lTagAddLstActivity		'itcA'
#define lTagAddLstGraphic			'parG'
#define lTagAddLstCollision		'lloC'	
#define lTagAddLstSound				'nuoS'
#define lTagVirtual						'triV'
#define lTagCameraType				'emaC'
#define lTagZFar							'raFZ'
 
 
/*****************************************************************
Function name   : fn_iCreateSector
Description     : 
Author          : Ovidiu Scripa (oscripa@ubisoft.ro) - ROMTEAM
Creation Date   : 14-Oct-98
Modified        : 
Return type     : int 
Argument        : LDT_tdst_Link *pLink
*****************************************************************/
int fn_iCreateSector( LDT_tdst_Link *pLink )
{
  /* new Sector for that section*/
	pLink->pObject = (void*)SECT_fn_hCreateSector();
 
  return 0;
}
 
 
 
/*****************************************************************
Function name   : fn_iLoadSector
Description     : 
Author          : Ovidiu Scripa (oscripa@ubisoft.ro) - ROMTEAM
Creation Date   : 14-Oct-98
Modified        : 
Return type     : int 
Argument        : LDT_tdst_Link *pLink
*****************************************************************/
int fn_iLoadSector( LDT_tdst_Link *pLink )
{
  LDT_tdeParseResult result=ParseResult_BeginSection;
	char a255_cLinkKey[255];
	SECT_tdxHandleOfSectorObject	hNewSector = (SECT_tdxHandleOfSectorObject)pLink->pObject;
	int nLen;
 
  VIG_fn_vAddToProgressBar(1);
	nLen = LDT_ComputeSectionName( pLink, a255_cLinkKey );
#ifdef _DEBUG
	strcpy(hNewSector->szSectorName, a255_cLinkKey);
#endif /* _DEBUG */
 
  SCR_M_v_Link_SetAdditionalLong(
      SCR_fnp_st_Link_SetValue(&SECT_stLinkTable, a255_cLinkKey, (unsigned long)hNewSector),
      1, nLen) ;
 
	do{
		result=LDT_GetNextEntry();
		if( result== ParseResult_BeginSection )
				LDT_LoadSection( NULL );
	}while ( result!=ParseResult_EndSection );
 
  return 0;
}
 
 
 
/*****************************************************************
Function name   : fn_iLoadSectorBorder
Description     : 
Author          : Ovidiu Scripa (oscripa@ubisoft.ro) - ROMTEAM
Creation Date   : 14-Oct-98
Modified        : 
Return type     : int 
Argument        : LDT_tdst_Link *pLink
*****************************************************************/
int fn_iLoadSectorBorder( LDT_tdst_Link *pLink )
{
  LDT_tdeParseResult result=ParseResult_BeginSection;
	SECT_tdxHandleOfSectorObject	hSector = (SECT_tdxHandleOfSectorObject)pLink->pParent->pObject;
	MTH3D_tdstVector				stMaxPoint, stMinPoint;
 
 
  while( result!=ParseResult_EndSection ) 
  {
  	result=LDT_GetNextEntry();
  	switch( result )
  	{
  	  case ParseResult_Entry: /* an entry */
  	  {
  	    char *szEntry=LDT_szGetEntryName();
  	    switch (*(long*)szEntry)
  	    {
 
  	      case  lTagMinPointOfBorder : /*  */
  	      {
						MTH3D_M_vSetVectorElements(&stMinPoint, 
							GLI_M_FloatToValue(atof(LDT_szGetParam(1))),
							GLI_M_FloatToValue(atof(LDT_szGetParam(2))),
							GLI_M_FloatToValue(atof(LDT_szGetParam(3))));
						SECT_fn_vSetMinPointInBorder(hSector, &stMinPoint);
 
  	      }
  	      break;
  	      case  lTagMaxPointOfBorder : /*  */
  	      {
						MTH3D_M_vSetVectorElements(&stMaxPoint, 
							GLI_M_FloatToValue(atof(LDT_szGetParam(1))),
							GLI_M_FloatToValue(atof(LDT_szGetParam(2))),
							GLI_M_FloatToValue(atof(LDT_szGetParam(3))));
						SECT_fn_vSetMaxPointInBorder(hSector, &stMaxPoint);
  	      }
  	      break;
  	      case  lTagZmaxOfBorder : /*  */
  	      {
						stMaxPoint.xX = stMaxPoint.xY = MTH_C_InfinitMinus;
						stMaxPoint.xZ = GLI_M_FloatToValue(atof(LDT_szGetParam(1)));
						SECT_fn_vSetMaxPointInBorder(hSector, &stMaxPoint);
			
#ifdef ACTIVE_EDITOR
						SECT_fn_vSetZmaxOfBorder(hSector, GLI_M_FloatToValue(atof(LDT_szGetParam(1))));
#endif /*ACTIVE_EDITOR*/
 
  	      }
  	      break;
  	    }
  	  }
  	}
  }
 
 
  return 0;
}
 
 
 
/*****************************************************************
Function name   : fn_iLoadSectorsLink
Description     : 
Author          : Ovidiu Scripa (oscripa@ubisoft.ro) - ROMTEAM
Creation Date   : 14-Oct-98
Modified        : 
Return type     : int 
Argument        : LDT_tdst_Link *pLink
*****************************************************************/
int fn_iLoadSectorsLink( LDT_tdst_Link *pLink )
{
  LDT_tdeParseResult result=ParseResult_BeginSection;
  SECT_tdxHandleOfSectorObject	hSector = (SECT_tdxHandleOfSectorObject)pLink->pParent->pObject;
  SECT_tdxHandleOfElementLstGraphicInteraction hGElement;  
  SECT_tdxHandleOfElementLstCollisionInteraction hColElement;
  SECT_tdxHandleOfElementLstActivityInteraction hActElement;
  SECT_tdxHandleOfElementLstSoundInteraction hSoundElement;
  SCT_tdxHandleOfLstSoundEvent hSoundEventElement;
 
  while( result!=ParseResult_EndSection ) 
  {
  	result=LDT_GetNextEntry();
  	switch( result )
  	{
  	  case ParseResult_Entry: /* an entry */
  	  {
  	    char *szEntry=LDT_szGetEntryName();
  	    switch (*(long*)szEntry)
  	    {
 
  	      case  lTagAddLst : /*  */
  	      {
  					switch (*(long*)(szEntry+6))
  					{
 
  						case  lTagAddLstActivity : /*  */
  						{
								HIE_tdxHandleToSuperObject hSPO = (HIE_tdxHandleToSuperObject)LDT_LoadSection(LDT_szGetParam(1));
								if (hSPO)
								{
									hActElement=SECT_fn_hCreateElementLstActivityInteraction();
									SECT_fn_vSetSectorPointedElementLSTActivityInt(hActElement, hSPO);
									LST2_M_StaticAddTail(&(hSector->stListOfSectorsInActivityInteraction),hActElement);
 
								}
 
  						}
  						break;
  						case  lTagAddLstGraphic : /*  */
  						{
								HIE_tdxHandleToSuperObject hSPO = (HIE_tdxHandleToSuperObject)LDT_LoadSection(LDT_szGetParam(1));
								if (hSPO)
								{
									hGElement=SECT_fn_hCreateElementLstGraphicInteraction();
									SECT_fn_vSetSectorPointedElementLSTGraphicInt(hGElement, hSPO);
									SECT_fn_vSetLevelElementLSTGraphicInt(hGElement, (short)atoi(LDT_szGetParam(2)));	
									LST2_M_StaticAddTail(&(hSector->stListOfSectorsInGraphicInteraction),hGElement);
								}
 
  						}
  						break;
  						case  lTagAddLstCollision : /*  */
  						{
								HIE_tdxHandleToSuperObject hSPO = (HIE_tdxHandleToSuperObject)LDT_LoadSection(LDT_szGetParam(1));
								if (hSPO)
								{
									hColElement=SECT_fn_hCreateElementLstCollisionInteraction();
									SECT_fn_vSetSectorPointedElementLSTCollisionInt(hColElement, hSPO);
									LST2_M_StaticAddTail(&(hSector->stListOfSectorsInCollisionInteraction),hColElement);
								}
 
  						}
  						break;
  						case  lTagAddLstSound : /*  */
  						{
								if (strlen(szEntry)>12) /*AddLstSoundEvent*/
								{
									 if( strcmp(LDT_szGetParam(1),"FromAllSectors")==0 )
									 {
											SND_tdxHandleToSoundEvent handle;
											hSoundEventElement = SCT_fn_hCreateElementLstSoundEvent();
											SCT_fn_vSetSectorPointedElementLSTSoundEvent(hSoundEventElement,NULL);
											handle = (SND_tdxHandleToSoundEvent) LDT_LoadSection(LDT_szGetParam(2));
											if(handle)
											{
		  									if (SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT)		/* MR0110*/
													SNA_fn_vWriteSoundEntryInSoundTableFile(SND_fn_ulGetEventBinIdFromPointer(handle) ,(unsigned long)&(hSoundEventElement->uSoundEvent.pstPtr));
												SCT_fn_vSetEventListElementLSTSoundEvent(hSoundEventElement, handle);
											}
											LST2_M_StaticAddTail(&(hSector->stListOfSoundEvent),hSoundEventElement);
									 }
									 else
									 {
											HIE_tdxHandleToSuperObject hSPO = (HIE_tdxHandleToSuperObject)LDT_LoadSection(LDT_szGetParam(1));
											if (hSPO)
											{
												 SND_tdxHandleToSoundEvent handle;
												 hSoundEventElement=SCT_fn_hCreateElementLstSoundEvent();
												 SCT_fn_vSetSectorPointedElementLSTSoundEvent(hSoundEventElement, hSPO);
												 handle = (SND_tdxHandleToSoundEvent) LDT_LoadSection(LDT_szGetParam(2));
												 if(handle)
													{
		  											if (SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT)		/* MR0110*/
															SNA_fn_vWriteSoundEntryInSoundTableFile(SND_fn_ulGetEventBinIdFromPointer(handle) ,(unsigned long)&(hSoundEventElement->uSoundEvent.pstPtr));
														SCT_fn_vSetEventListElementLSTSoundEvent(hSoundEventElement, handle);
													}
												 LST2_M_StaticAddTail(&(hSector->stListOfSoundEvent),hSoundEventElement);
											}
										}
 
								}
								else /*AddLstSound*/
								{
									HIE_tdxHandleToSuperObject hSPO = (HIE_tdxHandleToSuperObject)LDT_LoadSection(LDT_szGetParam(1));
									if (hSPO)
									{
										hSoundElement=SECT_fn_hCreateElementLstSoundInteraction();
										SECT_fn_vSetSectorPointedElementLSTSoundInt(hSoundElement, hSPO);
										SCT_fn_vSetVolumeLSTSoundInt(hSoundElement,atol(LDT_szGetParam(2)));
										LST2_M_StaticAddTail(&(hSector->stListOfSectorsInSoundInteraction),hSoundElement);
									}
 
								}
  						}
  						break;
						}
  	      }
  	      break;
  	      case  lTagVirtual : /*  */
  	      {
						SECT_fn_vSetOnVirtualSector(hSector);
  	      }
  	      break;
  	      case  lTagCameraType : /*  */
  	      {
						hSector->cCameraType = atoi(LDT_szGetParam(1));
  	      }
  	      break;
  	      case  lTagZFar : /*  */
  	      {
						hSector->xZFar = (MTH_tdxReal) atof(LDT_szGetParam(1));
  	      }
  	      break;
          case 'oirP' : /* Priority */
          {
            SECT_fn_vSetSectorPriority(hSector, (char)atoi(LDT_szGetParam(1)));
          }
          break; 
 
  	    }
  	  }
  	}
  }
 
 
  return 0;
}
 
 
 
 
/*****************************************************************
Function name   : fn_iLoadStaticLightsSector
Description     : 
Author          : Ovidiu Scripa (oscripa@ubisoft.ro) - ROMTEAM
Creation Date   : 14-Oct-98
Modified        : 
Return type     : int 
Argument        : LDT_tdst_Link *pLink
*****************************************************************/
int fn_iLoadStaticLightsSector( LDT_tdst_Link *pLink )
{
  LDT_tdeParseResult result=ParseResult_BeginSection;
  SECT_tdxHandleOfSectorObject	hSector = (SECT_tdxHandleOfSectorObject)pLink->pParent->pObject;
  SECT_tdxHandleOfElementLstStaticLights hStaticLightsElement;
 
  while( result!=ParseResult_EndSection ) 
  {
  	result=LDT_GetNextEntry();
  	switch( result )
  	{
  	  case ParseResult_Entry: /* an entry */
  	  {
        GLI_tdxHandleToLight hLight= (GLI_tdxHandleToLight)LDT_LoadSection(LDT_szGetParam(1));
      
				if(hLight)
				{
					hStaticLightsElement=SECT_fn_hCreateElementLstStaticLights();
					SECT_fn_vSetHandleOfLightsInStaticLightsList(hStaticLightsElement,hLight);
					LST2_M_StaticAddTail(&(hSector->stListOfStaticLights),hStaticLightsElement);
				}
 
  	  }
  	}
  }
 
 
  return 0;
}
 
