mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-12-25 10:20:54 +00:00
233 lines
5.3 KiB
C++
233 lines
5.3 KiB
C++
// State.cpp: implementation of the CState class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "logic_editor.h"
|
|
#include "State.h"
|
|
|
|
#include "nel/logic/logic_state.h"
|
|
|
|
#include <string>
|
|
|
|
using namespace std;
|
|
using namespace NLLOGIC;
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
const CString & CEvent::getEventAsString() const
|
|
{
|
|
eventString.Empty();
|
|
|
|
eventString = m_sConditionName;
|
|
|
|
if (m_bActionIsMessage)
|
|
{
|
|
eventString += " MSG ";
|
|
eventString += this->m_sMessageID;
|
|
|
|
}
|
|
else
|
|
{
|
|
eventString += " State Chg to ";
|
|
eventString += m_sStateChange;
|
|
}
|
|
|
|
return eventString;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool operator==( const CEvent &ev1, const CEvent &ev2)
|
|
{
|
|
return ( (ev1.m_sConditionName == ev2.m_sConditionName)
|
|
&& (ev1.m_bActionIsMessage == ev2.m_bActionIsMessage )
|
|
&& (ev1.m_sArguments == ev2.m_sArguments )
|
|
&& (ev1.m_sMessageDestination == ev2.m_sMessageDestination)
|
|
&& (ev1.m_sMessageID == ev2.m_sMessageID)
|
|
&& (ev1.m_sStateChange == ev2.m_sStateChange)
|
|
);
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
// cEventToCLogicEvent
|
|
//
|
|
//-----------------------------------------------
|
|
void cEventToCLogicEvent( CEvent& event, CLogicEvent& logicEvent )
|
|
{
|
|
/// condition name
|
|
logicEvent.ConditionName = string( (LPCSTR)event.m_sConditionName );
|
|
|
|
/// event action
|
|
logicEvent.EventAction.IsStateChange = !event.m_bActionIsMessage;
|
|
|
|
if( logicEvent.EventAction.IsStateChange )
|
|
{
|
|
/// state name for state change
|
|
logicEvent.EventAction.StateChange = string( (LPCSTR)event.m_sStateChange );
|
|
}
|
|
else
|
|
{
|
|
/// message destination
|
|
logicEvent.EventAction.EventMessage.Destination = string( (LPCSTR)event.m_sMessageDestination );
|
|
|
|
/// message id
|
|
logicEvent.EventAction.EventMessage.MessageId = "LOGIC"; //string( (LPCSTR)event.m_sMessageID ); //TEMP!!!
|
|
|
|
/// message arguments
|
|
logicEvent.EventAction.EventMessage.Arguments = string( (LPCSTR)event.m_sArguments );
|
|
}
|
|
|
|
} // cEventToCLogicEvent //
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// CState Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
CState::CState(const CString &name )
|
|
: m_sName( name )
|
|
{
|
|
}
|
|
|
|
|
|
|
|
CState::CState( const CState &state )
|
|
{
|
|
this->m_sName = state.m_sName;
|
|
|
|
// copy events (allocate new objects)
|
|
CEvent *pEvent;
|
|
CEvent *newEvent;
|
|
POSITION pos = state.m_evEvents.GetHeadPosition();
|
|
while (pos != NULL)
|
|
{
|
|
pEvent = state.m_evEvents.GetNext( pos );
|
|
if ( pEvent != NULL)
|
|
{
|
|
newEvent = new CEvent( *pEvent );
|
|
this->m_evEvents.AddTail( newEvent );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
CState::~CState()
|
|
{
|
|
// delete all events
|
|
POSITION pos = m_evEvents.GetHeadPosition();
|
|
while (pos != NULL)
|
|
{
|
|
CEvent *ev = m_evEvents.GetNext( pos );
|
|
if ( ev != NULL)
|
|
{
|
|
delete ev;
|
|
ev = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
BOOL CState::removeEvent( CEvent *event)
|
|
{
|
|
// go through all the events and remove the first event equal to the one in param
|
|
POSITION pos = m_evEvents.GetHeadPosition();
|
|
POSITION oldpos;
|
|
|
|
while (pos != NULL)
|
|
{
|
|
oldpos = pos;
|
|
CEvent *ev = m_evEvents.GetNext( pos );
|
|
if (*ev == *event)
|
|
{
|
|
m_evEvents.RemoveAt(oldpos);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------
|
|
// cStateToCLogicState
|
|
//
|
|
//-----------------------------------------------
|
|
void cStateToCLogicState( CState& state, CLogicState& logicState )
|
|
{
|
|
/// state name
|
|
logicState.setName( string( (LPCSTR)state.m_sName ) );
|
|
|
|
POSITION pos;
|
|
for( pos = state.m_evEvents.GetHeadPosition(); pos != NULL; )
|
|
{
|
|
CEvent * pEvent = state.m_evEvents.GetNext( pos );
|
|
|
|
CLogicEvent logicEvent;
|
|
cEventToCLogicEvent( *pEvent, logicEvent );
|
|
|
|
logicState.addEvent( logicEvent );
|
|
}
|
|
|
|
} // cStateToCLogicState //
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
// cLogicStateToCState
|
|
//
|
|
//-----------------------------------------------
|
|
void cLogicStateToCState( const CLogicState& logicState, CState& state )
|
|
{
|
|
state.m_sName = CString( logicState._StateName.c_str() );
|
|
|
|
vector<CLogicEventMessage>::const_iterator itMsg;
|
|
for( itMsg = logicState._EntryMessages.begin(); itMsg != logicState._EntryMessages.end(); ++itMsg )
|
|
{
|
|
//TODO
|
|
}
|
|
for( itMsg = logicState._ExitMessages.begin(); itMsg != logicState._ExitMessages.end(); ++itMsg )
|
|
{
|
|
//TODO
|
|
}
|
|
|
|
|
|
vector<CLogicEvent>::const_iterator itEvt;
|
|
for( itEvt = logicState._Events.begin(); itEvt != logicState._Events.end(); ++itEvt )
|
|
{
|
|
CEvent * event = new CEvent();
|
|
event->m_sConditionName = CString((*itEvt).ConditionName.c_str());
|
|
|
|
event->m_bActionIsMessage = !(*itEvt).EventAction.IsStateChange;
|
|
|
|
event->m_sMessageDestination = CString( (*itEvt).EventAction.EventMessage.Destination.c_str() );
|
|
event->m_sMessageID = CString( (*itEvt).EventAction.EventMessage.MessageId.c_str() );
|
|
event->m_sArguments = CString( (*itEvt).EventAction.EventMessage.Arguments.c_str() );
|
|
|
|
event->m_sStateChange = CString( (*itEvt).EventAction.StateChange.c_str() );
|
|
|
|
state.addEvent( event );
|
|
}
|
|
|
|
|
|
} // cLogicStateToCState //
|