reman3/Rayman_X/cpa/tempgrp/TAc/src/ACModif.cpp

535 lines
16 KiB
C++

//#################################################################################
//
// BASE IMPLEMENTATION CLASS OF DLL interface Modification
//
//#################################################################################
//
//
#include "stdafx.h"
#include "ACP_Base.h"
#include "ITF.h"
#include "TAC.h"
#include "TFa.h"
#include "TAn.h"
#include "ACModif.hpp"
#include "ACInterf.hpp"
#include "x:\Cpa\Main\inc\_EditID.h"
#include "x:\Cpa\tempgrp\tia\inc\ai_intf.hpp"
///////////////////////////////////////////////////////////////////////////////
// MACROS
///////////////////////////////////////////////////////////////////////////////
#define M_ForEachElement(oList,p_oElement,Pos)\
for( p_oElement = (oList) . GetHeadElement( Pos ) ;\
p_oElement ;\
p_oElement = (oList) . GetNextElement( Pos )\
)
#define M_DeleteList(oList)\
while( ! (oList) . IsEmpty() )\
delete (oList) . RemoveHead();
#define M_FreeList(oList)\
while( ! (oList) . IsEmpty() )\
free( (oList) . RemoveHead() );
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// class Action_New
Action_New::Action_New(TAction_Interface *_p_oParentDLL, CPA_Family *_p_oFamily, char *_szNewName)
:CPA_Modif(0, "New action", FALSE)
{
m_p_oParentDLL = _p_oParentDLL ;
m_p_oFamily = _p_oFamily ;
m_szName = (char*) malloc ( strlen ( _szNewName ) + 1 ) ;
strcpy ( m_szName , _szNewName ) ;
m_p_oAction = NULL ;
}
Action_New::~Action_New()
{
if( m_szName )
free(m_szName);
if( !HasBeenDone() && m_p_oAction )
delete m_p_oAction;
}
BOOL Action_New::Do()
{
// make data modif
if( m_p_oAction == NULL )
{
// create action
m_p_oAction = new CPA_Action( m_p_oParentDLL, m_p_oFamily, m_szName );
m_p_oAction -> SetExistingSection( FALSE );
}
else
{
// Re-register action
free(m_szName);
m_szName = (char*) malloc ( m_p_oAction -> GetName() . GetLength() + 1 ) ;
strcpy ( m_szName , (char*)(LPCTSTR)m_p_oAction -> GetName() ) ;
m_p_oAction -> fn_bValidate();
}
// notify save
m_p_oAction -> fn_vNotifySave();
// add action to family
m_p_oFamily -> mfn_vAddAction( m_p_oAction );
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionCreated( m_p_oFamily , m_p_oAction );
return TRUE;
}
BOOL Action_New::Undo()
{
POSITION xPos;
// make data modif
// remove action from family
xPos = m_p_oFamily -> m_oListOfActions . Find ( m_p_oAction ) ;
if( xPos )
m_p_oFamily -> m_oListOfActions . RemoveAt ( xPos ) ;
// unregister action
m_p_oAction -> fn_bUnValidate();
m_p_oAction -> fn_vNotifyUnSave();
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionDeleted ( m_p_oFamily ) ;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// class Action_Copy
Action_Copy::Action_Copy(TAction_Interface *_p_oParentDLL, CPA_Family *_p_oFamily, CPA_Action *_p_oAction)
:CPA_Modif(0, "Copy action", FALSE)
{
m_p_oParentDLL = _p_oParentDLL ;
m_p_oFamily = _p_oFamily ;
m_p_oActionSource = _p_oAction ;
m_p_oActionTarget = NULL ;
}
Action_Copy::~Action_Copy()
{
if( !HasBeenDone() && m_p_oActionTarget )
{
// delete states
while( ! m_p_oActionTarget -> m_oListOfStates . IsEmpty() )
{
delete m_p_oActionTarget -> m_oListOfStates . RemoveHead();
}
// delete action
delete m_p_oActionTarget ;
}
}
BOOL Action_Copy::Do()
{
POSITION xPos;
CPA_State *p_oState;
// make data modif
if( m_p_oActionTarget == NULL )
{
// create copy of action
m_p_oActionTarget = m_p_oActionSource -> mfn_p_oDuplicateAction () ;
}
else
{
// Re-register action
m_p_oActionTarget -> fn_bValidate();
// Re-register states
M_ForEachElement( m_oListOfStates, p_oState, xPos )
{
p_oState -> fn_bValidate();
p_oState -> fn_vNotifySave();
m_p_oActionTarget -> mfn_vAddState( p_oState );
}
}
// notify to save state
m_p_oActionTarget -> fn_vNotifySave();
// add action to family
m_p_oFamily -> mfn_vAddAction( m_p_oActionTarget );
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionCreated( m_p_oFamily , m_p_oActionTarget );
return TRUE;
}
BOOL Action_Copy::Undo()
{
CPA_State *p_oState;
// make data modif
m_oListOfStates . RemoveAll();
// remove states from action
while ( ! m_p_oActionTarget -> m_oListOfStates . IsEmpty() )
{
p_oState = m_p_oActionTarget -> m_oListOfStates . GetHead();
//
m_oListOfStates . AddTail( p_oState );
//
p_oState -> fn_bUnValidate();
p_oState -> fn_vNotifyUnSave();
//
m_p_oActionTarget -> mfn_vRemoveState( p_oState );
}
// remove action from family
m_p_oFamily -> mfn_vRemoveAction( m_p_oActionTarget ) ;
// unregister action and state
m_p_oActionTarget -> fn_bUnValidate();
m_p_oActionTarget -> fn_vNotifyUnSave();
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionDeleted ( m_p_oFamily ) ;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// class Action_Rename
Action_Rename::Action_Rename(TAction_Interface *_p_oParentDLL, CPA_Action *_p_oAction, char *_szNewName)
:CPA_Modif(0, "Rename action", FALSE)
{
m_p_oParentDLL = _p_oParentDLL ;
m_p_oAction = _p_oAction ;
m_szNewName = (char*) malloc ( strlen ( _szNewName ) + 1 ) ;
strcpy ( m_szNewName , _szNewName ) ;
}
Action_Rename::~Action_Rename()
{
if( m_szNewName )
free(m_szNewName);
}
// actions
BOOL Action_Rename::Do()
{
char *szLastName;
// make data modif
szLastName = (char*) malloc ( strlen ( m_p_oAction -> GetName () ) + 1 ) ;
strcpy ( szLastName , m_p_oAction -> fn_p_szGetName () ) ;
if( m_p_oAction -> fn_eRename ( m_szNewName ) != E_mc_None )
{
// error
free( szLastName );
return FALSE;
}
free ( m_szNewName ) ;
m_szNewName = szLastName;
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionCreated( (CPA_Family*) m_p_oAction -> GetOwner () , m_p_oAction ) ;
return TRUE;
}
BOOL Action_Rename::Undo()
{
return Do();
}
///////////////////////////////////////////////////////////////////////////////
// class Action_Delete
Action_Delete::Action_Delete(TAction_Interface *_p_oParentDLL, CPA_Family *_p_oFamily, CPA_Action *_p_oAction)
:CPA_Modif(0, "Delete action", FALSE)
{
m_p_oParentDLL = _p_oParentDLL ;
m_p_oFamily = _p_oFamily ;
m_p_oAction = _p_oAction ;
m_p_oOACDLL = m_p_oParentDLL ? m_p_oParentDLL -> GetMainWorld() -> GetObjectDLLWithName( C_szDLLActorName ) : NULL;
m_p_oDefaultState = _p_oAction -> mfn_p_oGetDefaultState();
}
Action_Delete::~Action_Delete()
{
if( HasBeenDone() && m_p_oAction )
{
// delete states of action
M_DeleteList( m_oListOfStates );
// delete transitional states
while( ! m_oListOfTransitionalStates . IsEmpty() )
{
tdstTSIState *p_oTSIState = m_oListOfTransitionalStates . RemoveHead();
free( p_oTSIState -> p_stTSI );
free( p_oTSIState );
}
// delete action
delete m_p_oAction;
}
}
// actions
BOOL Action_Delete::Do()
{
POSITION xPos;
CPA_State *p_oState;
// make data modif
m_oListOfStates . RemoveAll();
m_oListOfTransitionalStates . RemoveAll ();
// remove all states of action from family
while( ! m_p_oAction -> m_oListOfStates . IsEmpty() )
{
p_oState = m_p_oAction -> m_oListOfStates . GetHead();
// save State
m_oListOfStates . AddTail( p_oState );
// remove state from action
m_p_oAction -> mfn_vRemoveState( p_oState );
// unregister state
p_oState -> fn_bUnValidate();
p_oState -> fn_vNotifyUnSave();
}
// remove action from family
m_p_oFamily -> mfn_vRemoveAction( m_p_oAction );
// remove action from all transitional states
M_ForEachElement( m_p_oFamily -> m_oListOfStates, p_oState, xPos )
{
tdstTransitionStateInfo *p_stTSI = p_oState -> mfn_p_stGetTransitionStateInfo( m_p_oAction );
if( p_stTSI )
{
// backup
tdstTSIState *p_stTSIState = (tdstTSIState*) malloc( sizeof tdstTSIState);
p_stTSIState -> p_oState = p_oState;
p_stTSIState -> p_stTSI = (tdstTransitionStateInfo*) malloc( sizeof tdstTransitionStateInfo );
memcpy( p_stTSIState -> p_stTSI, p_stTSI, sizeof tdstTransitionStateInfo );
m_oListOfTransitionalStates . AddTail( p_stTSIState );
// remove from state
p_oState -> mfn_vRemoveActionFromTransition( m_p_oAction );
// notify modification
if( p_oState -> fn_bIsValid() )
p_oState -> fn_vNotifySave();
}
}
// save al IA using this Action
CPA_BaseObject *p_oFamily = m_p_oAction->GetOwner();
CPA_List<CPA_BaseObject> oModelsList;
m_p_oParentDLL->GetMainWorld()->fn_lFindObjects(&oModelsList, "", C_szActorModelTypeName, p_oFamily);
g_oCoherenceManager . m_fn_vDeleteObject( m_p_oAction );
if( m_p_oOACDLL )
m_p_oOACDLL -> OnQueryAction( m_p_oParentDLL, C_uiActor_ActionDeleted, (LPARAM) m_p_oAction );
// unregister action
m_p_oAction -> fn_bUnValidate();
m_p_oAction -> fn_vNotifyUnSave();
if (oModelsList.GetCount())
{
CPA_DLLBase *pclIADLL = (CPA_DLLBase*)(m_p_oParentDLL->GetMainWorld()->GetToolDLLWithName(C_szDLLAIEditorName));
tdstActorsIACom stCom;
POSITION xPos = oModelsList.GetHeadPosition();
while (xPos)
{
CPA_BaseObject *p_oBsObj = oModelsList.GetNext(xPos);
stCom.pvThis=p_oBsObj;
stCom.pvData=NULL;
pclIADLL->OnQueryAction(m_p_oParentDLL,C_uiAI_ProcessIA, (LPARAM)&stCom);
}
}
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionDeleted( m_p_oFamily );
return TRUE;
}
BOOL Action_Delete::Undo()
{
CPA_State *p_oState;
POSITION xPos;
// make data modif
// restore action
m_p_oFamily -> mfn_vAddAction( m_p_oAction ) ;
// Re-register action
m_p_oAction -> fn_bValidate();
m_p_oAction -> fn_vNotifyRestore();
// restore saved active transitional state
while( ! m_oListOfTransitionalStates . IsEmpty() )
{
tdstTSIState *p_stTSIState = m_oListOfTransitionalStates . RemoveHead();
if( p_stTSIState -> p_oState -> fn_bIsValid() )
{
p_stTSIState -> p_oState -> mfn_vSetTransitionStateInfo( p_stTSIState -> p_stTSI -> p_oAction,
p_stTSIState -> p_stTSI -> eState,
p_stTSIState -> p_stTSI -> p_oStateToGo );
p_stTSIState -> p_oState -> fn_vNotifySave();
}
free( p_stTSIState -> p_stTSI );
free( p_stTSIState );
}
// restore state
M_ForEachElement( m_oListOfStates, p_oState, xPos )
{
m_p_oAction -> mfn_vAddState( p_oState ) ;
// Re-register state
p_oState -> fn_bValidate();
p_oState -> fn_vNotifyRestore();
}
// restore default state
m_p_oAction -> mfn_vSetDefaultState( m_p_oDefaultState );
//
g_oCoherenceManager . m_fn_vRestoreObject( m_p_oAction );
if( m_p_oOACDLL )
m_p_oOACDLL -> OnQueryAction( m_p_oParentDLL, C_uiActor_ActionRestored, (LPARAM) m_p_oAction );
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionCreated( m_p_oFamily , m_p_oAction );
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// class Action_DelAllStates
Action_DelAllStates::Action_DelAllStates(TAction_Interface *_p_oParentDLL, CPA_Family *_p_oFamily, CPA_Action *_p_oAction)
:CPA_Modif(0, "Delete all states", FALSE)
{
m_p_oParentDLL = _p_oParentDLL ;
m_p_oFamily = _p_oFamily ;
m_p_oAction = _p_oAction ;
m_p_oDefaultState = _p_oAction -> mfn_p_oGetDefaultState();
}
Action_DelAllStates::~Action_DelAllStates()
{
if( HasBeenDone() )
{
M_DeleteList( m_oListOfStates );
}
}
// actions
BOOL Action_DelAllStates::Do()
{
CPA_State *p_oState;
// copy all states of action
m_oListOfStates . RemoveAll () ;
while( ! m_p_oAction -> m_oListOfStates . IsEmpty() )
{
CPA_State *p_oStateI;
POSITION xPosI;
p_oState = m_p_oAction -> m_oListOfStates . GetHead();
// copy state
m_oListOfStates . AddTail ( p_oState ) ;
// unregister state
p_oState -> fn_bUnValidate() ;
// remove from family
m_p_oAction -> mfn_vRemoveState( p_oState );
// remove from all states in whitch this state is the next state
M_ForEachElement( p_oState -> m_oListOfUsedAsNextState, p_oStateI, xPosI )
{
if( p_oStateI -> mfn_p_oGetAction() != m_p_oAction )
p_oStateI -> mfn_vSetNextState( NULL );
}
// remove from all state in whitch this state is a transitional state
M_ForEachElement( p_oState -> m_oListOfUsedAsTransitional, p_oStateI, xPosI )
{
tdstTransitionStateInfo *p_stTSI = p_oStateI -> mfn_p_stGetTransitionStateInfo( m_p_oAction );
if( p_stTSI && ( p_stTSI -> eState == E_ts_Allowed ) )
{
p_oStateI -> mfn_vSetTransitionStateInfo( m_p_oAction, p_stTSI -> eState, NULL );
if( p_oStateI -> fn_bIsValid() )
p_oStateI -> fn_vNotifySave();
}
}
p_oState -> fn_vNotifyUnSave();
}
// remove default state
m_p_oAction -> mfn_vSetDefaultState( NULL );
// Notify
m_p_oAction -> fn_vNotifySave();
// Shaitan => optimisation lists in the level
// set modification flag in the corresponding family
((CPA_Family *) m_p_oAction->GetOwner())->mfn_vSetModifiedStateList();
// End Shaitan => optimisation lists in the level
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionCreated( m_p_oFamily , m_p_oAction );
return TRUE;
}
BOOL Action_DelAllStates::Undo()
{
CPA_State *p_oState;
POSITION xPos;
// restore States
M_ForEachElement( m_oListOfStates, p_oState, xPos )
{
CPA_State *p_oStateI;
POSITION xPosI;
// add state to action (and to family)
m_p_oAction -> mfn_vAddState( p_oState );
// Re-register state
p_oState -> fn_bValidate();
p_oState -> fn_vNotifyRestore();
// restore from all state in whitch this state is the next state
M_ForEachElement( p_oState -> m_oListOfUsedAsNextState, p_oStateI, xPosI )
{
if( p_oStateI -> mfn_p_oGetAction() != m_p_oAction )
p_oStateI -> mfn_vSetNextState( p_oState );
}
// restore from all states in whitch this state is a transitional state
M_ForEachElement( p_oState -> m_oListOfUsedAsTransitional, p_oStateI, xPosI )
{
if( p_oStateI -> mfn_p_oGetAction() != m_p_oAction )
{
tdstTransitionStateInfo *p_stTSI = p_oStateI -> mfn_p_stGetTransitionStateInfo( m_p_oAction );
if( p_stTSI && ( p_stTSI -> eState == E_ts_Allowed ) )
{
p_oStateI -> mfn_vSetTransitionStateInfo( m_p_oAction, p_stTSI -> eState, p_oState );
if( p_oStateI -> fn_bIsValid() )
p_oStateI -> fn_vNotifySave();
}
}
}
}
// restore default state
m_p_oAction -> mfn_vSetDefaultState( m_p_oDefaultState );
// Notify
m_p_oAction -> fn_vNotifySave();
// Shaitan => optimisation lists in the level
// set modification flag in the corresponding family
((CPA_Family *) m_p_oAction->GetOwner())->mfn_vSetModifiedStateList();
// End Shaitan => optimisation lists in the level
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionCreated( m_p_oFamily , m_p_oAction );
return TRUE;
}