328 lines
10 KiB
C++
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);
|
|
}
|