/* Autor: Leandro Bernsmuller
Faz o agente absorver alimento do ambiente (especial para plantas);
diminui fome. */



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



/* construtor
**********************************************************/
CAbsorveAlimento::CAbsorveAlimento ()
{
   m_dwTipoAcao = ID_ACAO_ABSORVE_ALIMENTO;
}



/* Acao.
pDado1 - ignorado
pDado2 - quantidade de energia que eh absorvida / 100
return TRUE - certo / FALSE - erro
**********************************************************/
BOOL CAbsorveAlimento::mAtiva ( PTRVAL pDado1, PTRVAL pDado2 )
{
   CDadosFisicos
      *poDados = (CDadosFisicos*) m_poMeuAgente->m_poDados;

   // procura agente de onde retirar o alimento
   for ( int ncA = MAX_AGENTES - 1; ncA >= 0; ncA -- ) {

      // pega dados do agente
      CDados
         *poDadosAg = (CDados*) m_poMeuAgente->m_paoOsAgentes [ ncA ].m_poDados;

      // se nao tem informacoes fisicas, ignora ocorrencia
      if ( poDadosAg != NULL && poDadosAg->m_dwTipoDado == TIPO_FISICO ) {

         // tenta acessar dados fisicos
         CDadosFisicos
            *poDadosFisicosAg = (CDadosFisicos*) poDadosAg;

         // se este agente eh um microorganismo e encontrou o agente
         // agua ou se este eh planta e encontrou fundo do lago
         if ( ( poDados->m_dwTipoCorpo == NDX_MODELO_MICROORGANISMO &&
                poDadosFisicosAg->m_dwTipoCorpo == NDX_MODELO_AGUA_INVISIVEL ) || 
              ( poDados->m_dwTipoCorpo == NDX_MODELO_ALGA_VERDE &&
                poDadosFisicosAg->m_dwTipoCorpo == NDX_MODELO_FUNDO_LAGO_INVISIVEL ) ) {

            // quanto absorver de energia
            float
               fQuanto = 0;

            // envia mensagem para agente, pedindo quanto vai fornecer
            m_poMeuAgente->m_paoOsAgentes [ ncA ].mTrataEvento ( NDX_EVENTO_ATIVIDADE_3, 0, (PTRVAL) &fQuanto );

            // atualiza quantidade de energia (== fome)
            poDados->m_fFome += fQuanto;

            return TRUE;
         }
      }
   }

   return TRUE;
}
