370 lines
14 KiB
C++
370 lines
14 KiB
C++
/*=========================================================================
|
|
*
|
|
* SECTelem.cpp : Implementation of Editor Elements
|
|
*
|
|
*
|
|
* Version 1.0
|
|
* Creation date
|
|
* Revision date
|
|
*
|
|
* Shaitan
|
|
*=======================================================================*/
|
|
|
|
#include "stdafx.h"
|
|
#include "acp_base.h"
|
|
|
|
#include "SECTint.hpp"
|
|
|
|
#include "DPT.h"
|
|
|
|
//#################################################################################
|
|
// Element Base
|
|
//#################################################################################
|
|
SECT_ElementBase::SECT_ElementBase (Sector_Object *pOwnerSector)
|
|
: CPA_SectionObject ("", fn_szGetLevelsDataPath(), SECT_ElementBase::CallBackSaveSectorsLink,
|
|
pOwnerSector, pOwnerSector->fn_bHasSectorsLinkSection())
|
|
{
|
|
// init owner
|
|
m_pOwnerSector = pOwnerSector;
|
|
// init section name
|
|
SetReferencedSectionName(m_pOwnerSector->GetSectorsLinkSection());
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: callback for save
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void SECT_ElementBase::CallBackSaveSectorsLink (SCR_tdst_File_Description *p_stFile, char *szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
|
|
{
|
|
SECT_SoundEventElement *pSoundEventElem;
|
|
SECT_SndEvtEngineElem *pEngineElem;
|
|
SECT_CollisionElement *pCollisionElem;
|
|
SECT_ActivityElement *pActivityElem;
|
|
SECT_GraphicElement *pGraphicElem;
|
|
SECT_SoundElement *pSoundElem;
|
|
SECT_ElementBase *pElem;
|
|
Sector_Object *pSector;
|
|
POSITION pos, pos1;
|
|
CString csReference, csSoundEvent;
|
|
char szNewSectionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
int iSaveIndentLevel;
|
|
|
|
// get sector
|
|
pSector = (Sector_Object *) p_vData;
|
|
|
|
switch (eAction)
|
|
{
|
|
case SCR_EA_Ntfy_AddSection:
|
|
case SCR_EA_Ntfy_RebuildSection:
|
|
// indent level
|
|
iSaveIndentLevel = SCR_g_ui_SvL0_IndentationLevel;
|
|
SCR_g_ui_SvL0_IndentationLevel = 1;
|
|
// save begin section
|
|
SCR_fn_v_RdL0_ComputeSectionName(szNewSectionName, NULL, C_szSectorsLinkSubSection, " ");
|
|
SCR_M_SvL0_SaveBeginSection(p_stFile, szNewSectionName, SCR_CC_C_Cfg_EOL);
|
|
// virtual
|
|
if (pSector->fn_bIsVirtual())
|
|
{
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "Virtual", SCR_CC_C_Cfg_EOL);
|
|
}
|
|
pSector->GetVirtualSection()->fn_vSectionSaved();
|
|
// Zfar clipping
|
|
if (pSector->GetZfarInSector() > MTH_C_ZERO)
|
|
{
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "ZFar", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%f", GLI_M_ValueToFloat(pSector->GetZfarInSector()));
|
|
}
|
|
// camera type
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "CameraType", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", (int) pSector->GetCameraType());
|
|
pSector->GetCameraSection()->fn_vSectionSaved();
|
|
// priority
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "Priority", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", (int) pSector->GetPriority());
|
|
pSector->GetPrioritySection()->fn_vSectionSaved();
|
|
// graphic list
|
|
for (pGraphicElem = pSector->GetGraphicList()->GetHeadElement(pos); pGraphicElem;
|
|
pGraphicElem = pSector->GetGraphicList()->GetNextElement(pos))
|
|
{
|
|
csReference = pGraphicElem->GetSector()->GetReferencedSectionName();
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "AddLstGraphic", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s,%d,%d",
|
|
(char *) (LPCSTR) csReference, pGraphicElem->GetGraphicLevel(), pGraphicElem->GetGraphicMode());
|
|
pGraphicElem->fn_vSectionSaved();
|
|
}
|
|
// collision list
|
|
for (pCollisionElem = pSector->GetCollisionList()->GetHeadElement(pos); pCollisionElem;
|
|
pCollisionElem = pSector->GetCollisionList()->GetNextElement(pos))
|
|
{
|
|
csReference = pCollisionElem->GetSector()->GetReferencedSectionName();
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "AddLstCollision", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s,0",
|
|
(char *) (LPCSTR) csReference);
|
|
pCollisionElem->fn_vSectionSaved();
|
|
}
|
|
// activity list
|
|
for (pActivityElem = pSector->GetActivityList()->GetHeadElement(pos); pActivityElem;
|
|
pActivityElem = pSector->GetActivityList()->GetNextElement(pos))
|
|
{
|
|
csReference = pActivityElem->GetSector()->GetReferencedSectionName();
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "AddLstActivity", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s,0",
|
|
(char *) (LPCSTR) csReference);
|
|
pActivityElem->fn_vSectionSaved();
|
|
}
|
|
// sound list
|
|
for (pSoundElem = pSector->GetSoundList()->GetHeadElement(pos); pSoundElem;
|
|
pSoundElem = pSector->GetSoundList()->GetNextElement(pos))
|
|
{
|
|
csReference = pSoundElem->GetSector()->GetReferencedSectionName();
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "AddLstSound", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s,%d,0",
|
|
(char *) (LPCSTR) csReference, pSoundElem->GetSoundLevel());
|
|
pSoundElem->fn_vSectionSaved();
|
|
}
|
|
// sound event list
|
|
for (pElem = pSector->GetSoundEventList()->GetHeadElementBase(pos); pElem;
|
|
pElem = pSector->GetSoundEventList()->GetNextElementBase(pos))
|
|
{
|
|
// get sound event element
|
|
pSoundEventElem = (SECT_SoundEventElement *) pElem;
|
|
if (pSoundEventElem->GetSector())
|
|
csReference = pSoundEventElem->GetSector()->GetReferencedSectionName();
|
|
else
|
|
csReference = "FromAllSectors";
|
|
// save all sound events
|
|
for (pEngineElem = pSoundEventElem->GetSndEvtList()->GetHeadElement(pos1); pEngineElem;
|
|
pEngineElem = pSoundEventElem->GetSndEvtList()->GetNextElement(pos1))
|
|
{
|
|
// get references
|
|
csSoundEvent = pEngineElem->GetSoundEventReference();
|
|
// save element
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "AddLstSoundEvent", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s,%s",
|
|
(char *) (LPCSTR) csReference, (char *) (LPCSTR) csSoundEvent);
|
|
}
|
|
pSoundEventElem->fn_vSectionSaved();
|
|
}
|
|
|
|
// end section
|
|
SCR_M_SvL0_SaveEndSection (p_stFile, SCR_CC_C_Cfg_EOL);
|
|
if (eAction == SCR_EA_Ntfy_AddSection)
|
|
SCR_M_SvL0_SaveBlankLine (p_stFile);
|
|
|
|
// indent level
|
|
SCR_g_ui_SvL0_IndentationLevel = iSaveIndentLevel;
|
|
// reinit super-object
|
|
pSector->SetExistingSectorsLinkSection(TRUE);
|
|
break;
|
|
|
|
case SCR_EA_Ntfy_DeleteSection:
|
|
// reinit super-object
|
|
pSector->SetExistingSectorsLinkSection(FALSE);
|
|
// virtual
|
|
pSector->GetVirtualSection()->fn_vSectionDeleted();
|
|
// camera
|
|
pSector->GetCameraSection()->fn_vSectionDeleted();
|
|
// priority
|
|
pSector->GetPrioritySection()->fn_vSectionDeleted();
|
|
// graphic list
|
|
for (pGraphicElem = pSector->GetGraphicList()->GetHeadElement(pos); pGraphicElem;
|
|
pGraphicElem = pSector->GetGraphicList()->GetNextElement(pos))
|
|
pGraphicElem->fn_vSectionDeleted();
|
|
// collision list
|
|
for (pCollisionElem = pSector->GetCollisionList()->GetHeadElement(pos); pCollisionElem;
|
|
pCollisionElem = pSector->GetCollisionList()->GetNextElement(pos))
|
|
pCollisionElem->fn_vSectionDeleted();
|
|
// activity list
|
|
for (pActivityElem = pSector->GetActivityList()->GetHeadElement(pos); pActivityElem;
|
|
pActivityElem = pSector->GetActivityList()->GetNextElement(pos))
|
|
pActivityElem->fn_vSectionDeleted();
|
|
// sound list
|
|
for (pSoundElem = pSector->GetSoundList()->GetHeadElement(pos); pSoundElem;
|
|
pSoundElem = pSector->GetSoundList()->GetNextElement(pos))
|
|
pSoundElem->fn_vSectionDeleted();
|
|
// sound event list
|
|
for (pElem = pSector->GetSoundEventList()->GetHeadElementBase(pos); pElem;
|
|
pElem = pSector->GetSoundEventList()->GetNextElementBase(pos))
|
|
{
|
|
// get sound event element
|
|
pSoundEventElem = (SECT_SoundEventElement *) pElem;
|
|
pSoundEventElem->fn_vSectionDeleted();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// List Base
|
|
//#################################################################################
|
|
|
|
SECT_ListBase::SECT_ListBase (void)
|
|
{
|
|
// init owner
|
|
m_pOwnerSector = NULL;
|
|
// init nb elements
|
|
m_lNbElements = 0;
|
|
}
|
|
|
|
/*===========================================================================
|
|
Add Element
|
|
===========================================================================*/
|
|
BOOL SECT_ListBase::fn_bAddAnElement (SECT_ElementBase *pNewElem, BOOL bUpdateEngine)
|
|
{
|
|
// check owner sector
|
|
if (pNewElem->GetOwnerSector() != m_pOwnerSector)
|
|
return FALSE;
|
|
// check linked sector
|
|
if (pNewElem->GetSector() && (pNewElem->GetSector()->GetObject() == m_pOwnerSector))
|
|
return FALSE;
|
|
|
|
// update nb elements
|
|
m_lNbElements++;
|
|
// update links
|
|
g_oCoherenceManager.m_fn_vAddALink(m_pOwnerSector, pNewElem->GetSector());
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Remove Element
|
|
===========================================================================*/
|
|
void SECT_ListBase::fn_vRemoveAnElement (SECT_ElementBase *pOldElem, BOOL bUpdateEngine)
|
|
{
|
|
// update nb elements
|
|
m_lNbElements--;
|
|
// update links
|
|
g_oCoherenceManager.m_fn_vRemoveALink(m_pOwnerSector, pOldElem->GetSector());
|
|
}
|
|
|
|
/*===========================================================================
|
|
Remove All Elements
|
|
===========================================================================*/
|
|
void SECT_ListBase::fn_vRemoveAllElements (BOOL bUpdateEngine)
|
|
{
|
|
// update nb elements
|
|
m_lNbElements = 0;
|
|
}
|
|
|
|
/*===========================================================================
|
|
Get Element With Sector
|
|
===========================================================================*/
|
|
SECT_ElementBase * SECT_ListBase::GetElementWithSector (CPA_SuperObject *pSector)
|
|
{
|
|
SECT_ElementBase *pElem;
|
|
POSITION pos;
|
|
|
|
// search all element in list
|
|
for (pElem = GetHeadElementBase(pos); pElem; pElem = GetNextElementBase(pos))
|
|
{
|
|
if (pElem->GetSector() == pSector)
|
|
return pElem;
|
|
}
|
|
|
|
// sector was not found
|
|
return NULL;
|
|
}
|
|
|
|
|
|
|
|
//#################################################################################
|
|
// Environment Element Base
|
|
//#################################################################################
|
|
|
|
/*
|
|
SECT_EnvElementBase::SECT_EnvElementBase (Sector_Object *pOwnerSector)
|
|
: CPA_SectionObject ("", fn_szGetLevelsDataPath(), SECT_EnvElementBase::CallBackSaveEnvAndSurf,
|
|
pOwnerSector, pOwnerSector->fn_bHasEnvAndSurfSection())
|
|
{
|
|
// init owner
|
|
m_pOwnerSector = pOwnerSector;
|
|
// init section name
|
|
SetReferencedSectionName(m_pOwnerSector->GetEnvAndSurfSection());
|
|
}
|
|
*/
|
|
|
|
/*===========================================================================
|
|
* Description: callback for save
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
/*
|
|
void SECT_EnvElementBase::CallBackSaveEnvAndSurf (SCR_tdst_File_Description *p_stFile, char *szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
|
|
{
|
|
Sector_Object *pSector;
|
|
SECT_SurfElem *pSurfElem;
|
|
SECT_EnvElem *pEnvElem;
|
|
POSITION pos;
|
|
CString csReference;
|
|
char szNewSectionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
int iSaveIndentLevel;
|
|
|
|
// get sector
|
|
pSector = (Sector_Object *) p_vData;
|
|
|
|
switch (eAction)
|
|
{
|
|
case SCR_EA_Ntfy_AddSection:
|
|
case SCR_EA_Ntfy_RebuildSection:
|
|
// indent level
|
|
iSaveIndentLevel = SCR_g_ui_SvL0_IndentationLevel;
|
|
SCR_g_ui_SvL0_IndentationLevel = 1;
|
|
// save begin section
|
|
SCR_fn_v_RdL0_ComputeSectionName(szNewSectionName, NULL, C_szEnvAndSurfSubSection, " ");
|
|
SCR_M_SvL0_SaveBeginSection(p_stFile, szNewSectionName, SCR_CC_C_Cfg_EOL);
|
|
// environment list
|
|
for (pEnvElem = pSector->GetEnvironmentList()->GetHeadElement(pos); pEnvElem;
|
|
pEnvElem = pSector->GetEnvironmentList()->GetNextElement(pos))
|
|
{
|
|
csReference = pEnvElem->GetEnvironment()->GetReferencedSectionName();
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "AddLstEnvironment", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s",
|
|
(char *) (LPCSTR) csReference);
|
|
pEnvElem->fn_vSectionSaved();
|
|
}
|
|
// surface list
|
|
for (pSurfElem = pSector->GetSurfaceList()->GetHeadElement(pos); pSurfElem;
|
|
pSurfElem = pSector->GetSurfaceList()->GetNextElement(pos))
|
|
{
|
|
csReference = pSurfElem->GetSurface()->GetReferencedSectionName();
|
|
SCR_M_SvL0_SaveEntry(p_stFile, "AddLstSurface", SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s",
|
|
(char *) (LPCSTR) csReference);
|
|
pSurfElem->fn_vSectionSaved();
|
|
}
|
|
|
|
// end section
|
|
SCR_M_SvL0_SaveEndSection (p_stFile, SCR_CC_C_Cfg_EOL);
|
|
if (eAction == SCR_EA_Ntfy_AddSection)
|
|
SCR_M_SvL0_SaveBlankLine (p_stFile);
|
|
|
|
// indent level
|
|
SCR_g_ui_SvL0_IndentationLevel = iSaveIndentLevel;
|
|
// reinit super-object
|
|
pSector->SetExistingEnvAndSurfSection(TRUE);
|
|
break;
|
|
|
|
case SCR_EA_Ntfy_DeleteSection:
|
|
// reinit super-object
|
|
pSector->SetExistingEnvAndSurfSection(FALSE);
|
|
// environment list
|
|
for (pEnvElem = pSector->GetEnvironmentList()->GetHeadElement(pos); pEnvElem;
|
|
pEnvElem = pSector->GetEnvironmentList()->GetNextElement(pos))
|
|
pEnvElem->fn_vSectionDeleted();
|
|
// surface list
|
|
for (pSurfElem = pSector->GetSurfaceList()->GetHeadElement(pos); pSurfElem;
|
|
pSurfElem = pSector->GetSurfaceList()->GetNextElement(pos))
|
|
pSurfElem->fn_vSectionDeleted();
|
|
break;
|
|
|
|
}
|
|
}
|
|
*/
|
|
|