// EdIRIC.hpp : header file
//

#ifndef _EDIRIC_HPP_
#define _EDIRIC_HPP_

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

#define D_ZdxStuff_StructureDefine

#include "MTH.h"
#include "ai_intf.hpp"
#include "Ctl.h"
#include "CPA_NLL.hpp"
#include "ITF.h"
#include "incAI.h"

typedef enum tdeNodeType_
{
	eCreateSchedule			,
	eCreateRule					,
	eCreateDsgVar				,
	//BEGIN ROMTEAM Cristi Petrescu 98-04-
	eCreateSubr,
	eSubrRef,
	//END ROMTEAM Cristi Petrescu 98-04-

	eBeginMacro					,
	eEndMacro						,

	eIncDepth						,
	eDecDepth						,

	eStopEngine					,
	eStopRule						,
	eNonStop						,

	eKeyWord						,
	eCondition					,
	eMetaAction					,
	eProcedure					,
	eField							,
	eConstant						,
	eOperator						,
	eFunction						,
	eDsgVar							,
	eConstantInt				,
	eConstantReal				,
	ePerso							,
	eReal								,
	eZdd								,
	eZde								,
	eZdm								,
	eVector							,
	eVectorConstant			,
	eAction							,
	eState							,
	eWay								,
	eWayPoint						,
	eModule							,
	eKeyButton					,
	eComport						,
	eMaskType						,
	ePower							,
	eSurface						,
	eEnvironment				,
	eSector							,
	eSuperObject				,
	eLipSynchro					,
	eObjectTable				,
	eFamily							,
	eModel							,
	eSoundEvent					,
	eString							,
	eText								,
	eFont								,
	eGameMaterial				,
	eLight							,
	eCaps               ,
	eGraph              ,
	eParticleGenerator	,
	eMyRfxBehaviour			,
	eMyIABehaviour			,
	eRfxBehaviour				,
	eIABehaviour				,
	eZdr			,
	eInvalidNode
} tdeNodeType;

/////////////////////////////////////////////////////////////////////////////
// class CPA_EdIR_IntermediateCode
/////////////////////////////////////////////////////////////////////////////

class CPA_Actor;

class CPA_EdIR_IntermediateCode
{
	private:
		enum eType
		{
			eUseLong,
			eUseReal,
			eUseVector,
			eUseString,
			eInvalidType
		};

		long							m_lOffset;		//in original text
		tdeNodeType				m_eNodeType;	//node type
		unsigned char			m_ucDepth;		//depth
		eType							m_eType;			//to know if we use m_lIndex, m_dfValue or m_tdstVector
		long							m_lIndex;			//value
		CPA_Actor					*m_pclModel;	//for behaviour
		double						m_dfValue;		//value
		MTH3D_tdstVector	m_tdstVector;	//value
		CString						m_csString;		//value

	public:
		tdstNodeInterpret			*pstRefNode; /* To remember address of node for a reference */
		CPA_EdIR_IntermediateCode();
		CPA_EdIR_IntermediateCode(CPA_EdIR_IntermediateCode *);
		CPA_EdIR_IntermediateCode(long,tdeNodeType,long,CPA_Actor *pclModel=NULL);
		CPA_EdIR_IntermediateCode(long,tdeNodeType,double);
		CPA_EdIR_IntermediateCode(long,tdeNodeType,double,double,double);
		CPA_EdIR_IntermediateCode(long,tdeNodeType,CString);

		CString						m_fn_csGetValue();
		long							m_fn_lGetIndex();
		CPA_Actor					*m_fn_pclGetModel();
		double						m_fn_dfGetValue();
		MTH3D_tdstVector	m_fn_tdstGetVector();
		CString						m_fn_csGetString();

		long							m_fn_lGetOffset();

		tdeNodeType				m_fn_tdeGetNodeType();
		unsigned char			m_fn_ucGetDepth();

		void							m_fn_vSetIndex(long);
		void							m_fn_vSetValue(double);
		void							m_fn_vSetNodeType(tdeNodeType);
		void							m_fn_vSetDepth(unsigned char);
		void							m_fn_vSetModel(CPA_Actor *);
/////////////////////////////////////////////////////////////////////////////////
		//TEMPORAIRE
		void							m_fn_vSetString(CString);
/////////////////////////////////////////////////////////////////////////////////
};

#endif //_EDIRIC_HPP_
