reman3/Rayman_X/cpa/tempgrp/OAC/Src/EdActors/EDACInst.cpp

328 lines
10 KiB
C++

// Implementation for the class of Editor Actors Instances
///////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "EDACInst.hpp"
#include "EDACActr.hpp"
#include "EDACModl.hpp"
#include "EDACStrg.hpp"
#include "EDACDgIA.hpp"
//External Modules
#include "ErO.h"
//End of External Modules
#undef CPA_WANTS_IMPORT
#undef CPA_EXPORT
#define CPA_WANTS_EXPORT
#include "_Actors.hpp"
#undef CPA_WANTS_EXPORT
#define CPA_WANTS_IMPORT
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//****************************************************************
// PROVISOIRE....
//This constructor should not exist in final version....
EdActors_EditorActorInstance::EdActors_EditorActorInstance( CAR_EDIT_TDSTACTOR *ptdstActor)
: EdActors_EditorActor(EDCAR_ACTOR_TYPE_INSTANCE)
{
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!! BE CAREFUL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!! There is no Model for this Instance at that time !!
//!! The Model must be set elsewhere, or Editor won't work correctly !!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
m_pclModel = NULL;
m_pclActorModel = NULL;
m_fn_vSetMotorActor(ptdstActor);
//Creates datas
m_fn_vCreateActorMSDataList();
//Calls special functions
m_fn_vCallSpecialFunctions();
m_pri_tdstWatchField.eType = OAC_WATCH_FIELD_TYPE__NONE;
m_pri_tdstWatchField.p_vData = (void *)this;
m_pri_tdstWatchField.pclWatchData = NULL;
}
//****************************************************************
EdActors_EditorActorInstance::EdActors_EditorActorInstance( CPA_Actor *pclBaseModel,
CPA_Actor *pclActor,
CAR_EDIT_TDSTACTOR *p_tdstMotorActor,
CPA_SuperObject *p_oSuperObject
)
: EdActors_EditorActor(EDCAR_ACTOR_TYPE_INSTANCE)
{
//Sets the pointer to the motor actor now.
m_pclActor = pclActor;
//and back-sets the motor actor's pointer on the editor actor
m_pclActor->m_fn_vSetEditorActor(this);
//Sets base model pointer
m_pclActorModel = pclBaseModel;
if ( pclBaseModel != NULL )
{
ERROR_ASSERT( pclBaseModel->m_fn_bIsAModel() );
m_pclModel = (EdActors_EditorActorModel *)m_pclActorModel->m_fn_pclGetEditorActor();
}
else
m_pclModel = NULL;
//Sets Family
if ( m_pclModel != NULL )
{
//Updates Model's list of Instances
m_pclModel->m_clInstancesList.AddTail(this);
m_pclActor->m_pub_fn_vSetFamily(m_pclModel->m_pclActor->m_pub_fn_pclGetFamily());
}
else
{
m_pclActor->m_pub_fn_vSetFamily(NULL);
}
if ( m_pclModel != NULL )
{
//Creates a new motor actor
CAR_EDIT_TDSTACTOR *p_tdstNewMotorActor;
if ( p_tdstMotorActor == NULL )
p_tdstNewMotorActor = (CAR_EDIT_TDSTACTOR *)malloc(sizeof(CAR_EDIT_TDSTACTOR));
else
p_tdstNewMotorActor = p_tdstMotorActor;
m_fn_vSetMotorActor(p_tdstNewMotorActor);
if ( p_tdstMotorActor == NULL )
m_fn_vSetMSPointersToNULL();
//Allocates MS if the corresponding MS in the Model is allocated
if ( p_tdstMotorActor == NULL )
m_fn_vAllocateMSAsInModel(m_pclModel);
m_pclActor->fn_vUpdateData(p_tdstNewMotorActor);
m_pclActor->SetEngineStruct(p_tdstNewMotorActor);
}
//Creates datas
m_fn_vCreateActorMSDataList();
// if the superobject is given, give it the object
if ( p_oSuperObject != NULL )
p_oSuperObject->SetObject(m_pclActor);
//Updates datas with model's ones (including 'model link' state)
if ( (m_pclModel != NULL) && (p_tdstMotorActor == NULL) )
m_fn_vUpdateDatas(m_pclModel, TRUE, CTL_UPDATE_REASON__USE_USER_DEFINED_REASON, OAC_E_ur_InstanciatedFromModel);
//Calls special functions
if ( (m_pclModel != NULL) && (p_tdstMotorActor == NULL) )
m_fn_vCallSpecialFunctions();
//else it's done in m_fn_vSetModel(...)
m_pri_tdstWatchField.eType = OAC_WATCH_FIELD_TYPE__NONE;
m_pri_tdstWatchField.p_vData = (void *)this;
m_pri_tdstWatchField.pclWatchData = NULL;
}
//****************************************************************
EdActors_EditorActorInstance::~EdActors_EditorActorInstance()
{
//Removes from Model's list of Instances
m_pclModel->m_fn_vRemoveFromInstancesList(this);
m_fn_vDeleteAllMS();
//PROVISOIRE !?! ( will be deleted by motor ? )
// free(m_fn_ptdstGetMotorActor());
}
//****************************************************************
// Looks in the list of datas if they have been modified
void EdActors_EditorActorInstance::m_fn_vLookForModifiedDatas()
{
EdActors_ActorMiniStructure *pclInstanceCurrentMS;
CTL_Editor_DataList *pclInstanceDataList;
POSITION InstanceMSPos = m_pclActorCurrentMSList->GetHeadPosition();
while ( InstanceMSPos != NULL )
{
pclInstanceCurrentMS = m_pclActorCurrentMSList->GetNext(InstanceMSPos);
//Looks only for the developped MS
if ( pclInstanceCurrentMS->m_fn_bIsAllocated() )
{
pclInstanceDataList = pclInstanceCurrentMS->m_pclDataList;
POSITION DataPos = pclInstanceDataList->GetHeadPosition();
while ( DataPos != NULL )
pclInstanceDataList->GetNext(DataPos)->m_fn_vLookIfDataHasBeenModified();
}
}
}
//****************************************************************
CPA_Actor *EdActors_EditorActorInstance::m_fn_pclGetModel()
{
return m_pclActorModel;
}
//****************************************************************
BOOL EdActors_EditorActorInstance::m_pub_fn_bCheckAllMSWithModel()
{
BOOL bCheckIsOK = TRUE;
EdActors_EditorActorModel *pclEdModel = m_pclModel;
ERROR_ASSERT( pclEdModel != NULL );
//Checks the number of MS in Model and in Actor
long lNumberOfAMSGroupsInInstance = m_clListOfAMSLists.GetCount();
long lNumberOfAMSGroupsInModel = pclEdModel->m_clListOfAMSLists.GetCount();
CString csHeaderMessage = "Checking MS in the (loaded) Actor '" + m_fn_csGetActorName();
csHeaderMessage += "', according to its Model ('" + pclEdModel->m_fn_csGetActorName() + "')";
ERROR_PREPARE_M(g_c_csActorModuleNameForErrors,csHeaderMessage,
"EdActors_EditorActorInstance::m_pub_fn_bCheckAllMSWithModel()",
E_ERROR_GRAVITY_FATAL,
"Number of groups of MS are not the same in Instance and Model");
ERROR_ASSERT( lNumberOfAMSGroupsInInstance == lNumberOfAMSGroupsInModel );
EdActors_ActorMiniStructureList *pclInstanceAMSList;
EdActors_ActorMiniStructureList *pclModelAMSList;
long lNumberOfAMSInInstance;
long lNumberOfAMSInModel;
POSITION ActorPos = m_clListOfAMSLists.GetHeadPosition();
POSITION ModelPos = pclEdModel->m_clListOfAMSLists.GetHeadPosition();
while ( ActorPos != NULL )
{
ERROR_ASSERT( ModelPos != NULL );
pclInstanceAMSList = m_clListOfAMSLists.GetNext(ActorPos);
pclModelAMSList = pclEdModel->m_clListOfAMSLists.GetNext(ModelPos);
lNumberOfAMSInInstance = pclInstanceAMSList->GetCount();
lNumberOfAMSInModel = pclModelAMSList->GetCount();
ERROR_PREPARE_M(g_c_csActorModuleNameForErrors,
csHeaderMessage,
"EdActors_EditorActorInstance::m_pub_fn_bCheckAllMSWithModel()",
E_ERROR_GRAVITY_FATAL,
"Number of MS are not the same in Instance and Model");
ERROR_ASSERT( lNumberOfAMSInInstance == lNumberOfAMSInModel );
EdActors_ActorMiniStructure *pclInstanceAMS;
EdActors_ActorMiniStructure *pclModelAMS;
POSITION InstanceAMSPos = pclInstanceAMSList->GetHeadPosition();
POSITION ModelAMSPos = pclModelAMSList->GetHeadPosition();
while ( InstanceAMSPos != NULL )
{
ERROR_ASSERT( ModelAMSPos != NULL );
pclInstanceAMS = pclInstanceAMSList->GetNext(InstanceAMSPos);
pclModelAMS = pclModelAMSList->GetNext(ModelAMSPos);
if ( pclInstanceAMS->m_fn_bIsAllocated() != pclModelAMS->m_fn_bIsAllocated() )
{
// Shaitan FastC {
if (pclModelAMS->m_fn_csGetScriptName() == "Brain")
{
pclModelAMS->m_fn_bAllocate(FALSE);
m_pclActor->m_fn_pclGetModel()->fn_vNotifySave();
}
else
{
//End Shaitan FastC }
EdActors_Dialog_InconsistentAllocations Dial( m_pclActor->m_fn_pclGetModel(),
m_pclActor,
pclModelAMS->m_fn_bIsAllocated(),
pclModelAMS,
pclInstanceAMS,
&g_oBaseFrame);
//The Dialog does all...
Dial.DoModal();
// Shaitan FastC {
}
//End Shaitan FastC }
}
}
}
return bCheckIsOK;
}
//****************************************************************
// Sets the Model for an Instance who does not have any
// i.e. which has been loaded from a file
void EdActors_EditorActorInstance::m_fn_vSetModel(CPA_Actor *pclNewModel)
{
ERROR_ASSERT( pclNewModel != NULL );
m_pclActorModel = pclNewModel;
m_pclModel = (EdActors_EditorActorModel *)m_pclActorModel->m_fn_pclGetEditorActor();
//Sets the Model as Owner
m_pclActor->fn_bSetOwner(pclNewModel);
//Is a GenDoor if Model is one
m_pclActor->m_fn_vMakeGenDoor(pclNewModel->m_fn_bIsAGenDoor());
//Allocates MS if the corresponding MS in the Model is allocated
// m_fn_vAllocateMSAsInModel(m_pclModel);
//Creates datas
m_fn_vCreateActorMSDataList();
//Updates datas with model's ones (including 'model link' state)
// m_fn_vUpdateDatas(m_pclModel);
//PROVISOIRE...
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
// !!!!! Data Consistency will have to be tested !!!!! //
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
//Calls special fucntions
m_fn_vCallSpecialFunctions();
//Updates model's list of instances
m_pclModel->m_clInstancesList.AddTail(this);
}
//****************************************************************
void EdActors_EditorActorInstance::m_fn_vCallSpecialFunctions()
{
POSITION pos = m_clListOfAMSLists.GetHeadPosition();
POSITION AMSpos;
EdActors_ActorMiniStructureList *pclAMSList;
while ( pos != NULL )
{
pclAMSList = m_clListOfAMSLists.GetNext(pos);
AMSpos = pclAMSList->GetHeadPosition();
while ( AMSpos != NULL )
pclAMSList->GetNext(AMSpos)->m_fn_bCallSpecialFunction();
}
}
//****************************************************************
void EdActors_EditorActorInstance::m_pub_fn_vSetLink(CTL_Editor_Data *_pclSourceData,
BOOL _bMustLink)
{
OAC_fn_tdeSetLink(_pclSourceData, eNot(OAC_fn_tdeGetLink(_pclSourceData)));
}
//***************************************************************************
OAC_tdstWatchField *EdActors_EditorActorInstance::m_pub_fn_p_tdstGetWatchField()
{
return (&m_pri_tdstWatchField);
}