/* Autor: Leandro Bernsmuller
Implementa a acao de iniciar um agente com representacao fisica:
cria modelo no cenario,... */



#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#include <d3drmwin.h>
#include "..\..\princip\defs.h"
#include "..\..\cenario\cenario.h"
#include "..\..\cenario\cenfis.h"
#include "acao.h"
#include "..\dados\dados.h"
#include "..\dados\dadosfis.h"
#include "..\agente.h"
#include "mudadir.h"



/* construtor
**********************************************************/
CMudaDirecao::CMudaDirecao ()
{
   m_dwTipoAcao = ID_ACAO_MUDA_DIRECAO;
}



/* Acao.
pDado1 - flags informando se colidiu com limites do cenario
         (ver cenfis.cpp, mDetectaColisaoComBordas)
pDado2 - nao usado
return TRUE - certo / FALSE - erro
**********************************************************/
BOOL CMudaDirecao::mAtiva ( PTRVAL pDado1, PTRVAL pDado2 )
{
   CDadosFisicos
      *poDados = (CDadosFisicos*) m_poMeuAgente->m_poDados;

   float
      fDX,
      fDY,
      fDZ = 0;

   // Define nova direcao, conforme a quantidade de energia que possua pode:
   // parar ou mudar a direcao.
   // Verifica se tem pouca energia -> para
   if ( poDados->m_fFome < TX_BOM_MOVER ) {

      // direcao de deslocamento atual
      m_poMeuAgente->m_poCenario->mPegaDirecaoDeslocamentoObjeto ( poDados->m_dwGrupo, poDados->m_dwNdxObjeto, fDX, fDY, fDZ );

      // valor da direcao nunca pode ser zero (problemas ao girar)
      fDX = ( fDX >= 0 ) ? 0.0001 : -0.0001;
      fDY = fDZ = 0;
   }
   else {

      // se tem mais energia, se move para uma nova direcao

      // define coordenadas do agente
      int
         // nova direcao (escolhe um numero entre -50 e +50)
         nDX = rand () % 100 - 50,
         nDY = rand () % 100 - 50;

      // normaliza valor da direcao de deslocamento (entre -1 e +1 )
      fDX = (float) nDX / 50,
      fDY = (float) nDY / 50;
   }

   // verifica os flags de colisao com o cenario
   if ( ( ( pDado1 & 1 ) && fDY > 0 ) ||   // borda superior
        ( ( pDado1 & 2 ) && fDY < 0 ) )    // borda inferior
      fDY = - fDY;
   if ( ( ( pDado1 & 4 ) && fDX < 0 ) ||   // borda esquerda
        ( ( pDado1 & 8 ) && fDX > 0 ) )    // borda direita
      fDX = - fDX;

   // atualiza direcao
   m_poMeuAgente->m_poCenario->mMudaDirecaoDeslocamentoObjeto ( poDados->m_dwGrupo, poDados->m_dwNdxObjeto, fDX, fDY, fDZ );

   // informa quando foi a mudanca de direcao
   poDados->m_dwTempoUltimaDir = ::GetTickCount ();

   // substitui estah acao por outra
   m_poMeuAgente->mPreparaSubstituirPos ( m_dwNdxMeuEvento, m_dwTipoSubs, m_dwTipoSubs );

   return TRUE;
}
