/* Autor: Leandro Bernsmuller
Faz o agente se mover livremente pelo cenario, trocando ocasionalmente
de direcao. */



#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 "movelivr.h"



/* construtor
**********************************************************/
CMoveLivre::CMoveLivre ()
{
   m_dwTipoAcao = ID_ACAO_MOVE_LIVRE;
}



/* Acao.
pDado1 - ignorado
pDado2 - ignorado
return TRUE - certo / FALSE - erro
**********************************************************/
BOOL CMoveLivre::mAtiva ( PTRVAL pDado1, PTRVAL pDado2 )
{
   CDadosFisicos
      *poDados = (CDadosFisicos*) m_poMeuAgente->m_poDados;
   
   // verifica estah parado, caso esteja provoca movimento
   float
      fDX,
      fDY,
      fDZ;
   m_poMeuAgente->m_poCenario->mPegaDirecaoDeslocamentoObjeto ( poDados->m_dwGrupo, poDados->m_dwNdxObjeto, fDX, fDY, fDZ );
   if ( fDX == 0 && fDY == 0 && fDZ == 0 )
      m_poMeuAgente->mPreparaSubstituirPos ( m_dwNdxMeuEvento, ID_ACAO_MUDA_DIRECAO, m_dwTipoAcao );
   
   // verifica se deve mudar direcao por estar indo para a mesma direcao por muito tempo
   DWORD
      // determina quando virar
      dwTempoQuandoVirar = rand () % 4000 + 2000,
      // quanto tempo esta indo para a mesma direcao
      dwTempoMesmaDirecao = ::GetTickCount () - poDados->m_dwTempoUltimaDir;
   if ( dwTempoMesmaDirecao > dwTempoQuandoVirar )
      m_poMeuAgente->mPreparaSubstituirPos ( m_dwNdxMeuEvento, ID_ACAO_MUDA_DIRECAO, m_dwTipoAcao );

   // verifica se tem pouca energia, caso afirmativo para de se mover
   if ( poDados->m_fFome < TX_BOM_MOVER ) {
      m_poMeuAgente->mPreparaSubstituirPos ( m_dwNdxMeuEvento, ID_ACAO_MUDA_DIRECAO, m_dwTipoAcao );
      return TRUE;
   }

   return TRUE;
}
