/*  Autor: Leandro Bernsmuller
Declara agente.cpp */



class CAgente {

public:

   CAgente ();
   ~CAgente ();
   BOOL mCria ( DWORD* padwConfiguracao, CAgente* paoOsAgentes, CCenarioFisico* poCenario );
   void mDestroi ();

private:

   // dados sobre uma nova acao que deve ser alocada no lugar de outra
   // (usado quando uma acao solicida sua propria substituicao)
   BOOL  m_bSubstAcao; // TRUE - os dados sao validos, e deve haver troca
   DWORD m_dwSubstNdxEvento;
   DWORD m_dwSubstIDNovaAcao;
   DWORD m_dwSubstIDSubsAcao;
   
   // usado se deve ser criado uma nova configuracao para esse agente
   BOOL  m_bReconfigurarAgente; // TRUE - dados validos, reconfigurar
   DWORD m_adwConfiguracao [ TAM_CONFIG ];  // nova configuracao 

public:
 
   // comunicacao com o exterior
   CCenarioFisico* m_poCenario;     // aponta para o cenario
   CAgente*  m_paoOsAgentes;        // aponta agentes do sistema

   // estado do agente (manipulados pelas acoes do agente)
   CDados* m_poDados;                   // informacoes do agente
   DWORD m_dwTipoDados;                // qual o tipo (classe) usado

   CAcao* m_apoAcoes [ NUM_EVENTOS ];  // as acoes do agente (1 por evento)

   // altera acoes
   void mPreparaReconfigurarPos ( DWORD *padwConfiguracao );
   void mPreparaSubstituirPos ( DWORD dwNdxEvento, DWORD dwIDNovaAcao, DWORD dwIDSubsAcao );
   void mSubstituiAcao ( DWORD dwNdxEvento, DWORD dwIDNovaAcao, DWORD dwIDSubsAcao );

   // trata eventos
   BOOL mTrataEvento ( DWORD dwEvento, PTRVAL pDado1, PTRVAL pDado2 );
};
