/* 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 "nasce.h"



/* construtor
**********************************************************/
CNasce::CNasce ()
{
   m_dwTipoAcao = ID_ACAO_NASCE;
}



/* Acao.
pDado1 - aponta configuracao do agente
pDado2 - aponta coordenadas iniciais do objeto
return TRUE - certo / FALSE - erro
**********************************************************/
BOOL CNasce::mAtiva ( PTRVAL pDado1, PTRVAL pDado2 )
{
   // converte parametros
   // configuracao
   DWORD
      *padwConfiguracao = (DWORD*) pDado1;
   // coordenadas iniciais
   float
      *pafCoords = (float*) pDado2;

   // modelo
   DWORD
      dwGrupo = padwConfiguracao [ NUM_EVENTOS * 2 + 0 ],
      dwNdxModelo = padwConfiguracao [ NUM_EVENTOS * 2 + 1 ];

   // angulo de rotacao do objeto no eixo y (valor * 100)
   float
       fAng = ( (float) padwConfiguracao [ NUM_EVENTOS * 2 + 3 ] ) / 100;
   
   // inclui objeto no cenario
   DWORD
      dwNdxObjeto = m_poMeuAgente->m_poCenario->mCriaObjeto ( m_poMeuAgente,
                                                             dwGrupo,
                                                             dwNdxModelo,
                                                             pafCoords [ 0 ],
                                                             pafCoords [ 1 ],
                                                             pafCoords [ 2 ],
                                                             0.0, 0.0, 0.0,
                                                             0.0, 1.0, 1.0,
                                                             fAng );
   // verifica se criou objeto
   if ( dwNdxObjeto == (DWORD) -1 && dwNdxModelo < NDX_MODELO_NULO )
     return FALSE;
   
   // atualiza dados do agente

   CDadosFisicos
      *poDados = new CDadosFisicos;
   if ( poDados == NULL )
      return FALSE;

   // define valores iniciais
   poDados->m_dwGrupo = dwGrupo;
   poDados->m_dwNdxObjeto = dwNdxObjeto;
   poDados->m_fRelogioBiologico = 0;
   poDados->m_yComposicao = (BYTE) padwConfiguracao [ NUM_EVENTOS * 2 + 2 ];
   poDados->m_nFreqReproducao = padwConfiguracao [ NUM_EVENTOS * 2 + 4 ];
   poDados->m_dwTipoCorpo = dwNdxModelo;
   poDados->m_fLocalReproduzX = (float) (int) padwConfiguracao [ NUM_EVENTOS * 2 + 5 ];
   poDados->m_fLocalReproduzY = (float) (int) padwConfiguracao [ NUM_EVENTOS * 2 + 6 ];
   poDados->m_fLocalReproduzZ = (float) (int) padwConfiguracao [ NUM_EVENTOS * 2 + 7 ];
   poDados->m_fPerdeReproduzindo = (float) (int) padwConfiguracao [ NUM_EVENTOS * 2 + 8 ];
   poDados->m_fFome = (float) (int) padwConfiguracao [ NUM_EVENTOS * 2 + 9 ];

   // altera a energia (fome) conforme um pequeno fator aleatorio
   float
      fDelta = ( (float) ( rand () % 300 ) - 150 ) / 100;
   poDados->m_fFome += fDelta;

   // altera agente
   m_poMeuAgente->m_poDados = poDados;

   // cria as novas acoes para o agente
   m_poMeuAgente->mPreparaReconfigurarPos ( padwConfiguracao );

   return TRUE;
}
