/* Autor: Leandro Bernsmuller
Verifica se deve reproduzir o ser, se sim, gera evento de reproducao. */



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



/* construtor
**********************************************************/
CPreparaReproduz::CPreparaReproduz ()
{
   m_dwTipoAcao = ID_ACAO_PREPARA_REPRODUZ;
}



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

   // verifica se deve se reproduzir

   // 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;
}
