/* Autor: Leandro Bernsmuller
Faz o metabolismo de um ser vivo: altera os niveis de energia do agente e
conforme o caso, altera o estado do agente. */



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



/* construtor
**********************************************************/
CMetabolismo::CMetabolismo ()
{
   m_dwTipoAcao = ID_ACAO_METABOLISMO;
}



/* Acao.
pDado1 - ignorado
pDado2 - ignorado
return TRUE - certo / FALSE - erro
**********************************************************/
BOOL CMetabolismo::mAtiva ( PTRVAL pDado1, PTRVAL pDado2 )
{
   CDadosFisicos
      *poDados = (CDadosFisicos*) m_poMeuAgente->m_poDados;

   // altera niveis o estado do agente

   // gasto de energia para se manter vivo
   poDados->m_fFome += TX_PERDA_ENERGIA;

   // altera relogio biologico interno
   poDados->m_fRelogioBiologico += TX_AVANCO_TEMPO;

   // altera acoes conforme o estado

   // morre de fome (verifica taxa de fome)
   if ( poDados->m_fFome <= TX_MORRE_FOME ) {

      // substitui o que estah fazendo pela acao de morrer
      m_poMeuAgente->mPreparaSubstituirPos ( NDX_EVENTO_ATIVIDADE_2, ID_ACAO_MORRE, ID_ACAO_MORRE );

      // REVER bugfix (24/9/98)
      //m_poMeuAgente->mTrataEvento ( NDX_EVENTO_MORRE, 0, 0 );
      //return TRUE;
   }   
   else {

      // morre de idade avancada (somente vegetais e microorganismos)
      if ( ( poDados->m_dwTipoCorpo == NDX_MODELO_MICROORGANISMO || 
             poDados->m_yComposicao == ID_CORPO_VEGETAL ) &&
           poDados->m_fRelogioBiologico > TX_MORRE_IDADE )
         // substitui o que estah fazendo pela acao de morrer
         m_poMeuAgente->mPreparaSubstituirPos ( NDX_EVENTO_ATIVIDADE_2, ID_ACAO_MORRE, ID_ACAO_MORRE );

      // verifica se deve se reproduzir (REVER criar uma acao para cada teste)

      // no caso de plantas
      if ( poDados->m_yComposicao == ID_CORPO_VEGETAL &&
           poDados->m_fFome > TX_BOM_REPRODUZIR_MONO )

         // tenta reproduzir, se nao conseguiu, mesmo assim desconta energia
         if ( ! m_poMeuAgente->mTrataEvento ( NDX_EVENTO_REPRODUZIR, 0, 1 ) )
            ( (CDadosFisicos*) m_poMeuAgente->m_poDados )->m_fFome +=
               ( (CDadosFisicos*) m_poMeuAgente->m_poDados )->m_fPerdeReproduzindo;

      // no caso de microorganismos
      if ( poDados->m_dwTipoCorpo == NDX_MODELO_MICROORGANISMO &&
           poDados->m_fFome > TX_BOM_REPRODUZIR_MONO )
         m_poMeuAgente->mTrataEvento ( NDX_EVENTO_REPRODUZIR, 0, 1 );

      // no caso de peixes
      if ( ( poDados->m_dwTipoCorpo == NDX_MODELO_PEIXE_LISTRADO ||
             poDados->m_dwTipoCorpo == NDX_MODELO_PEIXE_AZUL     ||
             poDados->m_dwTipoCorpo == NDX_MODELO_PEIXE_GORDO       ) &&
           ( (int) poDados->m_fRelogioBiologico % poDados->m_nFreqReproducao ) == 0 &&
           poDados->m_fFome > TX_BOM_REPRODUZIR_BI )
         m_poMeuAgente->mPreparaSubstituirPos ( NDX_EVENTO_ATIVIDADE_2, ID_ACAO_APROXIMA, ID_ACAO_MOVE_LIVRE );
   }

   return TRUE;
}
