// State.h: interface for the CState class.
// 2001 Fleury David, Nevrax
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_STATE_H__8501C0A2_320A_42B9_BD7E_3D77F27301ED__INCLUDED_)
#define AFX_STATE_H__8501C0A2_320A_42B9_BD7E_3D77F27301ED__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include <afxtempl.h>


namespace NLLOGIC
{
class CLogicState;
}

/**
 * class CEvent
 */
class CEvent
{
public:
	CEvent()
	{
		m_bActionIsMessage = FALSE;
	}

	virtual ~CEvent()
	{
	}

	const CString &getEventAsString() const;

//attributes:
public:
	CString		m_sConditionName;

	/// bool, true if the event action is sending a message, false if it's changing state
	bool		m_bActionIsMessage;

	/// \name event message
	//@{
	///destination of the message (name of a .bot, .flaura, .var... file)
	CString		m_sMessageDestination; 
	/// message ID (selected from valid ID for given destination (file extension))
	CString		m_sMessageID;
	/// message arguments, syntax defined for given message ID
	CString		m_sArguments;
	//@}

	/// \name state change event
	//@{
	/// destination state (if m_bActionIsMessage == false)
	CString		m_sStateChange;
	//@]

	/// temp string used to store the event as a string when requested
	mutable CString eventString;

	friend bool operator==( const CEvent &ev1, const CEvent &ev2);
};


typedef CList< CEvent *, CEvent *&> TPEventList;





/**
 * class State
 */
class CState  
{
public:
	/// constructor
	CState( const CString &name = CString("") );

	/// copy constructor
	CState( const CState &state );

	virtual ~CState();

	/// add an event to this State
	inline void addEvent( CEvent *event) { m_evEvents.AddTail( event ) ; }

	/// remove the specified event from the state object, return TRUE if done, FALSE if event not found
	BOOL removeEvent( CEvent *event);

	
// attributes
//private:
public:
	CString		m_sName;

	/// list of pointers on CEvent objects
	TPEventList	m_evEvents;
};


/**
 * Set a CLogicState from a CState 
 */
void cStateToCLogicState( CState& state, NLLOGIC::CLogicState& logicState );

/**
 * Set a CState from a CLogicState 
 */
void cLogicStateToCState( const NLLOGIC::CLogicState& logicState, CState& state );


#endif // !defined(AFX_STATE_H__8501C0A2_320A_42B9_BD7E_3D77F27301ED__INCLUDED_)