/* Autor: Leandro Bernsmuller
Aproxima um agente de uma certa coordaneada no SRU. Quando estiver
proximo ativa evento de reprozir e substitui essa acao pela
predefinida. */



#include <math.h>
#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 "aproxima.h"



/* construtor
**********************************************************/
CAproxima::CAproxima ()
{
   m_dwTipoAcao = ID_ACAO_APROXIMA;
}



/* Acao.
pDado1 - ignorado
pDado2 - ignorado
return TRUE - certo / FALSE - erro
**********************************************************/
BOOL CAproxima::mAtiva ( PTRVAL pDado1, PTRVAL pDado2 )
{
   // dados do agente que vai se aproximar
   CDadosFisicos
      *poDados = (CDadosFisicos*) m_poMeuAgente->m_poDados;

   // obtem a posicao do objeto desse agente
   float
      fXM,
      fYM,
      fZM;
   m_poMeuAgente->m_poCenario->mPegaPosicaoObjeto ( poDados->m_dwGrupo, poDados->m_dwNdxObjeto, fXM, fYM, fZM );

   // define nova direcao de deslocamento para o agente
   float
      fDX = poDados->m_fLocalReproduzX - fXM,
      fDY = poDados->m_fLocalReproduzY - fYM,
      fDZ = poDados->m_fLocalReproduzZ - fZM;

   // valores usados para testar se peixe estah proximo da area de
   // reproducao
   float
      fValX = fDX >= 0 ? fDX : - fDX,  // transforma vetor para positivo
      fValY = fDY >= 0 ? fDY : - fDY,
      fValZ = fDZ >= 0 ? fDZ : - fDZ;

   // se estiver bastante perto desativa, reproduz e substitui,
   // senao continua
   if ( fValX < 40 && fValY < 20 ) {

      // REVER - disparar um evento proprio para aproximacoes
      // reproduz
      m_poMeuAgente->mTrataEvento ( NDX_EVENTO_REPRODUZIR, 0, 1 );

      // apohs reproducao volta ao estado anterior
      m_poMeuAgente->mPreparaSubstituirPos ( m_dwNdxMeuEvento, m_dwTipoSubs, m_dwTipoSubs );
   }
   else {

      // define vetor deslocamento para local de reproducao

      /* Ideal, mas lento devido ao sqrt:
      // define distancia ateh o local
      float      
         fModulo = sqrt ( fDX * fDX + fDY * fDY + fDZ * fDZ );
      // normaliza vetor deslocamento
      fDX /= fModulo;
      fDY /= fModulo;
      fDZ /= fModulo;*/

      // acha o maior componente e divide demais pelo maior

      // componentes temporarios
      float
         fTX = fDX,
         fTY = fDY,
         fTZ = fDZ,
         fMaior;

      // torna todos os componentes positivos
      if ( fTX < 0 )
         fTX *= -1;
      if ( fTY < 0 )
         fTY *= -1;
      if ( fTZ < 0 )
         fTZ *= -1;

      // define o maior
      if ( fTX >= fTY && fTX >= fTZ )
         fMaior = fTX;
      else
         if ( fTY > fTX && fTY > fTZ )
            fMaior = fTY;
         else
            fMaior = fTZ;

      // altera vetor usando esse componente
      fDX /= fMaior;
      fDY /= fMaior;
      fDZ /= fMaior;

      // altera trajetoria do agente para encontrar o outro
      m_poMeuAgente->m_poCenario->mMudaDirecaoDeslocamentoObjeto ( poDados->m_dwGrupo, poDados->m_dwNdxObjeto, fDX, fDY, fDZ );
   }

   return TRUE;
}
