reman3/Rayman_X/cpa/tempgrp/OSC/Src/SECTelem.cpp

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;
}
}
*/