reman3/Rayman_X/cpa/tempgrp/Tot/Src/ot_obj.cpp

399 lines
14 KiB
C++

/*=========================================================================
*
* edit_ot.cpp : ObjectTable Editor Object - inplementation
*
* Version 2.0
* Creation date 06/06/97 Author : Vincent Lhullier
* Revision date 18/08/97 Author : Shaitan
*
* Shaitan
*=======================================================================*/
#define D_ObjsTbls_Define
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "stdafx.h"
#include "acp_base.h"
#include "TFA.h"
#include "incGAM.h"
#include "ITF.h"
#include "incPO.h"
#include "incOPD.h"
#include "TOT.h"
#include "OT_inter.hpp"
#include "incGam.h"
#include "DPT.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#undef D_ObjsTbls_Define
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
DeclareTemplateStatic( tdxHandleToObjectsTablesList );
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void del(tdxHandleToObjectsTablesList h)
{
}
/*===========================================================================
* Description: Static init (engine struct)
* Creation date: 06/06/97
* Author: Vincent Lhullier
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void EditorObjectTable::StaticInit()
{
CPA_EdMot<tdxHandleToObjectsTablesList>::Init(NULL,NULL,del);
}
/*===========================================================================
* Description: Constructor
* Creation date: 06/06/97
* Author: Vincent Lhullier
*---------------------------------------------------------------------------
* Revision date: 18/08/97 Author: Shaitan
* Revision date: 05/09/97 Author: Vincent Lhullier
*=========================================================================*/
EditorObjectTable::EditorObjectTable (CPA_EditorBase *p_oDLL,
tdxHandleToObjectsTablesList hObjTable,
CPA_SaveObject *p_oOwner,
CString csFileName)
: CPA_SaveObject (p_oDLL, // owner editor
C_szObjectTableTypeName, // type
E_ss_NoSave, // status
p_oOwner, // owner
(hObjTable != NULL), // validity
fn_szGetFamiliesDataPath(), // data path
NULL // callback for save
),
CPA_EdMot<tdxHandleToObjectsTablesList> (hObjTable)
{
unsigned short uwIndex;
//unsigned short uwEndName;
CString csName;
// section object
SetSectionData(this);
// section name
SetReferencedSectionName(csFileName);
// name
uwIndex = csFileName.ReverseFind('\\');
csName = csFileName.Mid(uwIndex + 1);
if (fn_eRename(csName) != E_mc_None)
SetDefaultValidName();
fn_vUpdateSectionName();
// existence
SetExistingSection(TRUE);
// validity
if (hObjTable != NULL)
{
// Shaitan => module list in the level
fn_vLoadUnusedPOsInObjectTable();
// End Shaitan => module list in the level
fn_vCreateEditorPhysicalObjects();
}
SetAvailable(hObjTable!=NULL);
};
/*===========================================================================
* Description: Destructor
* Creation date: 06/06/97
* Author: Vincent Lhullier
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
EditorObjectTable::~EditorObjectTable()
{
}
/*===========================================================================
* Description: Section Name
* => FamilyName / Name.TBL
* Creation date: 18/08/97
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: 05/09/97 Author: Vincent Lhullier
*=========================================================================*/
void EditorObjectTable::fn_vUpdateSectionName (void)
{
CString csSectionName, csFileName;
int iPos;
// get old section name
csSectionName = GetReferencedSectionName();
// build new section name
iPos = csSectionName.ReverseFind('\\');
csFileName = csSectionName.Left(iPos+1) + GetName(); // + ".tbl";
// set new section name
SetReferencedSectionName(csFileName);
}
/*===========================================================================
* Description: Name for dialogs
* => FamilyName + Name
* Creation date: 18/08/97
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
CString EditorObjectTable::GetNameToDraw (void)
{
CString csName;
csName = (GetOwner()) ? GetOwner()->GetName() : "Unknown";
csName += " " + GetName();
return csName;
}
/*===========================================================================
* Description: Create all editor POs
* Creation date: 06/06/97
* Author: Vincent Lhullier
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void EditorObjectTable::fn_vCreateEditorPhysicalObjects( void )
{
PO_tdxHandleToPhysicalObject hPO;
CPA_ObjectDLLBase *p_oDLLPO;
tdxHandleToObjectsTableElement hOTElement;
EditorPO *p_oPO;
unsigned short uwIndex;
// Get Physical object DLL
p_oDLLPO = GetMainWorld()->GetObjectDLLWithName(C_szDLLPhysicalObjectName);
if (p_oDLLPO != NULL)
{
// First pass
for (uwIndex = 0 ; uwIndex < GetStruct()->wNumberOfElement; uwIndex ++)
{
hOTElement = fn_d_hGetElementByNumberInObjectsTable( GetStruct(), uwIndex );
// for each po in the object table, create a editor po
if (fn_wObjectsTableGetTypeOfTarget( hOTElement ) == C_wTdO_PhysicalObject )
{
hPO = (PO_tdxHandleToPhysicalObject) fn_hObjectsTableGetTarget( hOTElement );
if (hPO == NULL)
p_oPO = NULL;
else
{
p_oPO = (EditorPO *) p_oDLLPO->OnQueryAction( (CPA_DLLBase *) this, OPD_ActionEncapsulateObject, (LPARAM) hPO );
// update Index
if (p_oPO)
p_oPO -> m_fn_vSetIndexInObjectTable( uwIndex );
}
}
}
// Second pass
for (uwIndex = 0 ; uwIndex < GetStruct()->wNumberOfElement; uwIndex ++)
{
hOTElement = fn_d_hGetElementByNumberInObjectsTable( GetStruct(), uwIndex );
// for each po in the object table, create a editor po
if (fn_wObjectsTableGetTypeOfTarget( hOTElement ) == C_wTdO_PhysicalObject )
{
hPO = (PO_tdxHandleToPhysicalObject) fn_hObjectsTableGetTarget( hOTElement );
p_oDLLPO->OnQueryAction( (CPA_DLLBase *) this, OPD_ActionSecondPass, (LPARAM) hPO );
}
}
}
}
// Shaitan => module list in the level
/*===========================================================================
* Description: Load unused POs of the object table
* Creation date:
* Author:
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void EditorObjectTable::fn_vLoadUnusedPOsInObjectTable( void )
{
SCR_tdst_Anl_Callback *pCallback;
// if the engine object table is not created, it will be loaded as usual
if (!GetStruct())
return;
// if the family is not optimized, no need to reload
CPA_Family * pFamily = (CPA_Family *) GetOwner();
if (((tdxHandleToFamilyList) pFamily->GetStruct())->ucOptimized == 0)
return;
// first get the engine callback functions for tbl file
pCallback = SCR_fnp_st_RdL0_GetRegisterCallback(C_Section_TBLHeader, SCR_CRC_c_RdL0_ForSection);
SCR_tdpfn_Anl_Callback pHeaderCallback = pCallback->pfn_eCallback;
pCallback = SCR_fnp_st_RdL0_GetRegisterCallback(C_Section_TBLGeneral, SCR_CRC_c_RdL0_ForSection);
SCR_tdpfn_Anl_Callback pTBLCallback = pCallback->pfn_eCallback;
pCallback = SCR_fnp_st_RdL0_GetRegisterCallback(C_Section_EVTGeneral, SCR_CRC_c_RdL0_ForSection);
SCR_tdpfn_Anl_Callback pEVTCallback = pCallback->pfn_eCallback;
// then unregister them
SCR_fn_v_RdL0_DeleteRegisterCallback(C_Section_TBLHeader, SCR_CRC_c_RdL0_ForSection, SCR_CDR_c_RdL0_Match);
SCR_fn_v_RdL0_DeleteRegisterCallback(C_Section_TBLGeneral, SCR_CRC_c_RdL0_ForSection, SCR_CDR_c_RdL0_Match);
SCR_fn_v_RdL0_DeleteRegisterCallback(C_Section_EVTGeneral, SCR_CRC_c_RdL0_ForSection, SCR_CDR_c_RdL0_Match);
// register the new callback
SCR_fn_v_RdL0_RegisterCallback(C_Section_TBLHeader, m_fn_tdeEmtpyCallBack,SCR_CRC_c_RdL0_ForSection);
SCR_fn_v_RdL0_RegisterCallback(C_Section_TBLGeneral, m_fn_tdeCallBackLoadUnusedPOs,SCR_CRC_c_RdL0_ForSection);
SCR_fn_v_RdL0_RegisterCallback(C_Section_EVTGeneral,m_fn_tdeEmtpyCallBack,SCR_CRC_c_RdL0_ForSection);
// then force the script to analyze the section
SCR_M_RdL0_SetContextLong(C_GrandChildContext,0,GetStruct());
SCR_fnp_st_RdL0_AnalyseSection((char *)(LPCTSTR) GetReferencedSectionName(), SCR_CDF_uw_Anl_ForceAnalyse);
// unregister the editor callback
SCR_fn_v_RdL0_DeleteRegisterCallback(C_Section_TBLHeader, SCR_CRC_c_RdL0_ForSection, SCR_CDR_c_RdL0_Match);
SCR_fn_v_RdL0_DeleteRegisterCallback(C_Section_TBLGeneral, SCR_CRC_c_RdL0_ForSection, SCR_CDR_c_RdL0_Match);
SCR_fn_v_RdL0_DeleteRegisterCallback(C_Section_EVTGeneral, SCR_CRC_c_RdL0_ForSection, SCR_CDR_c_RdL0_Match);
// restore the normal loading function
SCR_fn_v_RdL0_RegisterCallback(C_Section_TBLHeader, pHeaderCallback,SCR_CRC_c_RdL0_ForSection);
SCR_fn_v_RdL0_RegisterCallback(C_Section_TBLGeneral, pTBLCallback,SCR_CRC_c_RdL0_ForSection);
SCR_fn_v_RdL0_RegisterCallback(C_Section_EVTGeneral, pEVTCallback,SCR_CRC_c_RdL0_ForSection);
}
// End Shaitan => module list in the level
/*===========================================================================
* Description: Load engine struct
* Creation date: 06/06/97
* Author: Vincent Lhullier
*---------------------------------------------------------------------------
* Revision date: 18/08/97 Author: Shaitan
*=========================================================================*/
void EditorObjectTable::fn_vLoadEngineObjectTable (void)
{
SCR_tdst_Cxt_Values *p_stVal;
tdxHandleToObjectsTablesList hOT;
BOOL bIsLoadingWorld;
if (!fn_bIsAvailable())
{
// loading flag
bIsLoadingWorld = GetEditor()->GetInterface()->fn_bIsLoadingWorld();
GetEditor()->GetInterface()->SetLoadingWorld( TRUE );
// Shaitan => module list in the level
// make sure that all POs will be loaded !
CPA_Family * pFamily = (CPA_Family *) GetOwner();
((tdxHandleToFamilyList) pFamily->GetStruct())->ucOptimized = 0;
// End Shaitan => module list in the level
// load engine struct
p_stVal = SCR_fnp_st_RdL0_AnalyseSection( (char *)(LPCTSTR) GetReferencedSectionName(), SCR_CDF_uw_Anl_Normal );
hOT = (tdxHandleToObjectsTablesList) SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);
// update flag
GetEditor()->GetInterface()->SetLoadingWorld(bIsLoadingWorld);
// update engine struct
fn_vUpdateData( hOT );
SetStruct(hOT);
fn_vCreateEditorPhysicalObjects();
// update validity
SetAvailable(TRUE);
// add to family list
// ((CPA_Family *) GetOwner())->mfn_vAddObjectTable(this);
}
}
// Shaitan => module list in the level
/*===========================================================================
* Description: loa unused POs of the object table
* Creation date: 06/06/97
* Author: Vincent Lhullier
*---------------------------------------------------------------------------
* Revision date: 18/08/97 Author: Shaitan
*=========================================================================*/
SCR_tde_Anl_ReturnValue EditorObjectTable::m_fn_tdeCallBackLoadUnusedPOs(SCR_tdst_File_Description *_p_stFile,char *_p_szName,char *_ap_szParams[],SCR_tde_Anl_Action _eAction)
{
SCR_tde_Anl_ReturnValue eReturnValue = SCR_ERV_Anl_NormalReturn;
tdxHandleToObjectsTablesList h_ObjectsTablesListElement;
PO_tdxHandleToPhysicalObject hPO;
long l_NumberInTable;
if ( M_IsTitle )
{
SCR_M_RdL0_SetContextLong(C_ThisContext,1,atoi(_p_szName));
}
else if ( M_IsEntry )
{
SCR_M_RdL0_GetContextLong(C_ThisContext,0,tdxHandleToObjectsTablesList,h_ObjectsTablesListElement);
SCR_M_RdL0_GetContextLong(C_ThisContext,1,long,l_NumberInTable);
if ( M_ActionIs( C_Entry_PHY ) )
{
PO_tdxHandleToPhysicalObject hPO;
if (!h_ObjectsTablesListElement->d_stObjectsTable[l_NumberInTable-1].h_Target)
{
hPO = CS_fn_xLoadPhysicalObject(_ap_szParams[0]);
if (hPO)
{
h_ObjectsTablesListElement->d_stObjectsTable[l_NumberInTable-1].h_Target = hPO;
h_ObjectsTablesListElement->d_stObjectsTable[l_NumberInTable-1].wTypeOfTarget = C_wTdO_PhysicalObject;
if (PO_fn_hGetCollideSet (hPO))
{
if (PCS_fn_hGetGeoObjOfPhysicalCollSet (C_ucTypeZdd , PO_fn_hGetCollideSet (hPO))) h_ObjectsTablesListElement->wZDxUsed |= C_wObjectTableHasZdd;
if (PCS_fn_hGetGeoObjOfPhysicalCollSet (C_ucTypeZde , PO_fn_hGetCollideSet (hPO))) h_ObjectsTablesListElement->wZDxUsed |= C_wObjectTableHasZde;
}
}
}
}
if ( M_ActionIs( C_Entry_MIRROR ) )
{
hPO = CS_fn_xFindPhysicalObject(_ap_szParams[0]);
if (!h_ObjectsTablesListElement->d_stObjectsTable[l_NumberInTable-1].h_Target)
{
hPO = CS_fn_xLoadPhysicalObject(_ap_szParams[0]);
if (hPO)
{
h_ObjectsTablesListElement->d_stObjectsTable[l_NumberInTable-1].h_Target = hPO;
h_ObjectsTablesListElement->d_stObjectsTable[l_NumberInTable-1].wTypeOfTarget = C_wTdO_PhysicalObject;
}
}
}
}
else if( M_IsEnd )
{
SCR_M_RdL0_GetSectionLong(C_ParentSection,0,tdxHandleToObjectsTablesList,h_ObjectsTablesListElement);
}
return ( eReturnValue );
}
// End Shaitan => module list in the level
// Shaitan => module list in the level
/*===========================================================================
* Description: loa unused POs of the object table
* Creation date: 06/06/97
* Author: Vincent Lhullier
*---------------------------------------------------------------------------
* Revision date: 18/08/97 Author: Shaitan
*=========================================================================*/
SCR_tde_Anl_ReturnValue EditorObjectTable::m_fn_tdeEmtpyCallBack(SCR_tdst_File_Description *_p_stFile,char *_p_szName,char *_ap_szParams[],SCR_tde_Anl_Action _eAction)
{
return ( SCR_ERV_Anl_NormalReturn );
}