/* Autor: Leandro Bernsmüller
Funcoes de exibicao e remocao de: informacoes, controles, botoes,...
na janela principal
Arquivos complementares: apl.cpp, partida.cpp  */



#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#include <d3drmwin.h>
#include <mmsystem.h>
#include <dsound.h>
#include "defs.h"
#include "..\extra\ddutil.h"
#include "..\extra\ddmm.h"
#include "..\extra\arqs.h"
#include "..\cenario\gr.h"
#include "..\cenario\cenario.h"
#include "..\cenario\cenfis.h"
#include "..\som\sons.h"
#include "..\ia\acoes\acao.h"
#include "..\ia\dados\dados.h"
#include "..\ia\dados\dadosfis.h"
#include "..\ia\agente.h"
#include "..\ia\agencia.h"
#include "..\interf\janela.h"
#include "..\interf\jancen.h"
#include "..\interf\dlgconpa.h"
#include "..\interf\dlgconf.h"
#include "..\interf\dlgmodo.h"
#include "..\interf\dlgsobre.h"
#include "..\comunic\sockcomu.h"
#define IDIRECTPLAY2_OR_GREATER
#include <dplay.h>
#include "..\comunic\dplayinf.h"
#include "..\comunic\dpcomu.h"
#include "apl.h"



/* Exibe os "tips" dos botoes e outros controles.
**********************************************************/
void CApl::mExibeTips ( HWND& hWnd, DWORD dwX, DWORD dwY )
{
   // normaliza coordenadas do mouse conforme janela (ver defs.h)
   float
      fX = (float) dwX,
      fY = (float) dwY;
   TRANSJAN_NORM ( fX, fY, m_nPorcentagemUsoJanela, m_nPorcentagemUsoJanela );
  
   char
      szTexto [ 300 ];
   szTexto [ 0 ] = 32;            // texto associado ao botao
   szTexto [ 1 ] = 0;
   BOOL
      bAlinharDireita = TRUE,    // como alinhar o texto
      bAlinharSobre = FALSE;

   // numero do personagem ou ferramenta cuja string deve ser definida
   DWORD
      dwQuem = 10000;   // nenhum definido
  
   // define sobre qual controle o mouse estah (cada controle tem um bitmap)
   int
      nQualControle = -1;  // qual controle estah selecionado
   for ( int ncB = 0; ncB < (int) m_oBmps.m_dwNumBmps; ncB ++ )
      
      // testa se ponto estah sobre bitmap
      if ( m_oBmps.mTestaPontoSobreBmp ( ncB, fX, fY ) ) {

         nQualControle = ncB;

         // se eh do estado mental, nao exibe se sem o tutor
         if ( nQualControle == 9 )
            return;

         // se estah, executa acao especifica conforme controle
         switch ( nQualControle ) {

            case 9:
               strcat ( szTexto, STR_TIP_MENTAL );
               break;

            case 10:
               strcat ( szTexto, STR_TIP_AJUDA );
               break;

            case 3:
               // define string para personagem da esquerda
               dwQuem = m_dwQuemJogador1;

            case 4:
               // define string para personagem da direita
               if ( dwQuem == 10000 )
                  dwQuem = m_dwQuemJogador2;

               // define string de personagem
               switch ( dwQuem ) {

                  case ID_PERS_MAE_NATUREZA:
                     strcat ( szTexto, STR_TIP_PERS_MAE_NATUREZA );
                     break;

                  case ID_PERS_PESCADOR:
                     strcat ( szTexto, STR_TIP_PERS_PESCADOR );
                     break;

                  case ID_PERS_PREFEITO:
                     strcat ( szTexto, STR_TIP_PERS_PREFEITO );
                     break;

                  case ID_PERS_TURISTA:
                     strcat ( szTexto, STR_TIP_PERS_TURISTA );
                     break;
               }
               break;

            case 11:
               // define string para ferramenta do personagem da esquerda
               dwQuem = m_dwQuemJogador1;
               bAlinharDireita = FALSE;
               bAlinharSobre = TRUE;

            case 15:
               // define string para ferramenta do personagem da direita
               if ( dwQuem == 10000 )
                  dwQuem = m_dwQuemJogador2;

               // define string
               switch ( dwQuem ) {

                  case ID_PERS_MAE_NATUREZA:
                     strcat ( szTexto, STR_TIP_FERR_ABRIR_SOL );
                     break;

                  case ID_PERS_PESCADOR:
                     strcat ( szTexto, STR_TIP_FERR_PESCA_PROIBIDA );
                     break;

                  case ID_PERS_PREFEITO:
                     strcat ( szTexto, STR_TIP_FERR_PROIB_POLUICAO_SONORA );
                     break;

                  case ID_PERS_TURISTA:
                     strcat ( szTexto, STR_TIP_FERR_NADAR_LAGO );
                     break;
               }
               break;

            case 12:
               // define string para ferramenta do personagem da esquerda
               dwQuem = m_dwQuemJogador1;
               bAlinharDireita = FALSE;
               bAlinharSobre = TRUE;

            case 16:
               // define string para ferramenta do personagem da direita
               if ( dwQuem == 10000 )
                  dwQuem = m_dwQuemJogador2;

               // define string
               switch ( dwQuem ) {

                  case ID_PERS_MAE_NATUREZA:
                     strcat ( szTexto, STR_TIP_FERR_COLOCAR_AGUAPES );
                     break;

                  case ID_PERS_PESCADOR:
                     strcat ( szTexto, STR_TIP_FERR_RECOLHER_LIXO );
                     break;

                  case ID_PERS_PREFEITO:
                     strcat ( szTexto, STR_TIP_FERR_MULTA );
                     break;

                  case ID_PERS_TURISTA:
                     strcat ( szTexto, STR_TIP_FERR_LIXO_CHAO );
                     break;
               }
               break;

            case 13:
               // define string para ferramenta do personagem da esquerda
               dwQuem = m_dwQuemJogador1;
               bAlinharDireita = FALSE;
               bAlinharSobre = TRUE;

            case 17:
               // define string para ferramenta do personagem da direita
               if ( dwQuem == 10000 )
                  dwQuem = m_dwQuemJogador2;

               // define string
               switch ( dwQuem ) {

                  case ID_PERS_MAE_NATUREZA:
                     strcat ( szTexto, STR_TIP_FERR_TROCAR_FUNDO );
                     break;

                  case ID_PERS_PESCADOR:
                     strcat ( szTexto, STR_TIP_FERR_PESCAR_ALIMENTAR );
                     break;

                  case ID_PERS_PREFEITO:
                     strcat ( szTexto, STR_TIP_FERR_COLOCAR_LIXEIRAS );
                     break;

                  case ID_PERS_TURISTA:
                     strcat ( szTexto, STR_TIP_FERR_LEMBRANCA_LAGO );
                     break;
               }
               break;

            case 14:
               // define string para ferramenta do personagem da esquerda
               dwQuem = m_dwQuemJogador1;
               bAlinharDireita = FALSE;
               bAlinharSobre = TRUE;

            case 18:
               // define string para ferramenta do personagem da direita
               if ( dwQuem == 10000 )
                  dwQuem = m_dwQuemJogador2;

               // define string
               switch ( dwQuem ) {

                  case ID_PERS_MAE_NATUREZA:
                     strcat ( szTexto, STR_TIP_FERR_ACELERAR_DEGRAD );
                     break;

                  case ID_PERS_PESCADOR:
                     strcat ( szTexto, STR_TIP_FERR_PESCAR_EPOCA_PERM );
                     break;

                  case ID_PERS_PREFEITO:
                     strcat ( szTexto, STR_TIP_FERR_LICENCA );
                     break;

                  case ID_PERS_TURISTA:
                     strcat ( szTexto, STR_TIP_FERR_FOTO );
                     break;
               }
               break;

            case 5:       // ecometro
               strcat ( szTexto, STR_TIP_ECOMETRO );

               // nivel do ecometro
               float
                  fTotalEnergia,
                  fMaximoEnergia,
                  fMaxAbsEnergia;
               DWORD
                  dwNumAgentes;
               m_oAgencia.mInformaEnergia ( dwNumAgentes, fTotalEnergia, fMaximoEnergia, fMaxAbsEnergia );
               if ( fTotalEnergia < 0 )
                  fTotalEnergia = 0;
               
               // calcula total de energia entre 0 e 100
               int
                  nTotalPorc = (int) ( fTotalEnergia / fMaxAbsEnergia * 100 );
               
               // mensagem
               sprintf ( szTexto, "%s%d     energia do ecômetro: %3d", szTexto, dwNumAgentes, nTotalPorc );

               bAlinharDireita = FALSE;
               break;
         }
      }

   // verifica se algum controle estah selecionado
   if ( nQualControle == -1 )
      return;

   // como sao testados todos os bitmaps, deve ser considerado o ultimo
   // bitmap testado nos testes com a variavel nQualControle:

   // se o texto eh de uma ferramenta, adiciona quantidade
   if ( nQualControle >= 21 && nQualControle <= 24 )
      sprintf ( szTexto, "%s :  %d", szTexto, m_adwNumFerramentas1 [ nQualControle - 21 ] );
   
   // se nao estah usando rede deve exibir quantidade desses controles
   if ( ! bUSANDO_REDEDP && nQualControle >= 25 && nQualControle <= 28 )
      sprintf ( szTexto, "%s :  %d", szTexto, m_adwNumFerramentas2 [ nQualControle - 25 ] );

   // exibe o texto
   mExibeTextoJanela ( szTexto,
                       m_oBmps.m_astBmps [ nQualControle ].fPropXIni,
                       m_oBmps.m_astBmps [ nQualControle ].fPropYIni,
                       bAlinharDireita,
                       bAlinharSobre );
}



/* Exibe um texto na janela principal
szTexto - texto a ser escrito
fPosNormX, fPosNormY - coordenadas normalizadas onde escrever
                       (0,0) a (1,1)
bAlinharDireita - alinha texto a direita (comecar pela direita)
bAlinharSobre - alinha texto acima (coordenada faz referencia ao
                extremo inferior e nao superior)
**********************************************************/
void CApl::mExibeTextoJanela ( char* szTexto,
                               float fPosNormX, float fPosNormY,
                               BOOL bAlinharDireita, BOOL bAlinharSobre )
{
   // define caracteristicas do texto
   HDC
      hDCont = GetWindowDC ( GetDesktopWindow () );
   SetBkColor( hDCont, RGB( 128, 0, 0 ) );
   SetTextColor( hDCont, RGB ( 255, 255, 0 ) );

   // coordenadas onde desenhar

   // coordenadas da area de cliente
   RECT
      stRect;
   ::GetClientRect ( m_oBmps.m_hWnd, &stRect );

   // canto superior esquerdo
   RECT
      stRectDest;
   stRectDest.left = (int) ( stRect.right  * fPosNormX ),
   stRectDest.top  = (int) ( stRect.bottom * fPosNormY );
   m_oBmps.mTransformaCoordDest ( stRectDest );

   // Ajusta alinhamento do texto (direita ou esquerda,...) em relacao as
   // suas coordenadas.
   int
      nDireita = TA_LEFT,
      nSobre = TA_TOP;
   if ( bAlinharDireita )
      nDireita = TA_RIGHT;
   if ( bAlinharSobre )
      nSobre = TA_BOTTOM;
   SetTextAlign ( hDCont, nDireita | nSobre );

   // adiciona um espaco depois do texto, se houver mais texto, senao remove o espaco do inicio
   if ( szTexto [ 1 ] != 0 )
      strcat ( szTexto, " " );
   else
      szTexto [ 0 ] = 0;
   
   // escreve o texto
   TextOut ( hDCont, stRectDest.left, stRectDest.top, szTexto, strlen ( szTexto ) );
}



/* Desenha os bitmaps dos controles (parte inferior)
**********************************************************/
void CApl::mExibeControles ()
{
   // - 10 indica para nao desenhar bitmaps dos botoes pressionados

   for ( int ncB = 1; ncB < (int) m_oBmps.m_dwNumBmps - 10; ncB ++ )
      
      // se deve desenhar moldura (bmp 2) (jogo em rede)
      // ou nao (sem rede)
      if ( bUSANDO_REDEDP || ncB != 2 )
         // se deve desenhar botao do tutor (conexao com sockets)
         // somente se tem conexao com socket
         if ( bUSANDO_SOCKETS || ncB != 9 )
            m_oBmps.mExibe ( ncB );

   // trata do botao pressionado, se houver algum
   if ( m_nBotaoPressionado != -1 )
      // exibe o outro bitmap que eh do mesmo botao, mas pressionado
      m_oBmps.mExibe ( m_nBotaoPressionado + 10 );
}



/* Exibe o ecometro
**********************************************************/
void CApl::mExibeEcometro ()
{
   // nivel do ecometro
   float
      fTotalEnergia,
      fMaximoEnergia,
      fMaxAbsEnergia;
   DWORD
      dwNumAgentes;
   m_oAgencia.mInformaEnergia ( dwNumAgentes, fTotalEnergia, fMaximoEnergia, fMaxAbsEnergia );
   // nivel entre 0 e 1
   float
      fNivel = fTotalEnergia / fMaxAbsEnergia;

   // Indica qual dos bitmaps usar para exibir o nivel do ecometro,
   // usado para alterar a cor do nivel.
   DWORD
      dwIndic = 6;
   if ( fNivel < 0.666666 )
      dwIndic = 7;
   if ( fNivel < 0.333333 )
      dwIndic = 8;

   // define novo nivel para ecometro
   m_oBmps.m_astBmps [ dwIndic ].fPropYIni = 0.755 + 0.025 + ( 0.193 * ( 1.0 - fNivel ) );
   
   // define quais bitmaps (cor da ampola) exibir ou nao
   m_oJanPrincipal.m_bExibir [ 6 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 7 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 8 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ dwIndic ] = TRUE;

   // exibe o ecometro (apaga o indicador de energia)
   m_oBmps.mExibe ( 5 );
   // desenha o indicador num novo nivel
   m_oBmps.mExibe ( dwIndic );
   
   // verifica se deve enviar algum dado para o tutor
   if ( bUSANDO_SOCKETS ) {

      static DWORD
         dwIndicAnterior = dwIndic;
         
      // se mudou cor da ampola
      if ( dwIndicAnterior != dwIndic )
               
         // calcula total de energia entre 0 e 100, e envia valor
         mTutorEnviarInfoEcometro ( (int) ( fNivel * 100 ) );
         
      dwIndicAnterior = dwIndic;
   }
}

  

/* Exibe a abertura, bloqueia o jogo.
Usado no inicio da aplicacao.
**********************************************************/
void CApl::mExibeAbertura ()
{
   m_yEstadoExecucao = 0;

   // exibe abertura
   m_oJanPrincipal.m_bExibir [ 0 ] = TRUE;
   
   // nao exibe outros bmps
   m_oJanPrincipal.m_bExibir [ 1 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 2 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 3 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 4 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 5 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 6 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 7 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 8 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 9 ] = FALSE;
   m_oJanPrincipal.m_bExibir [10 ] = FALSE;
   m_oJanPrincipal.m_bExibir [11 ] = FALSE;
   m_oJanPrincipal.m_bExibir [12 ] = FALSE;
   m_oJanPrincipal.m_bExibir [13 ] = FALSE;
   m_oJanPrincipal.m_bExibir [14 ] = FALSE;
   m_oJanPrincipal.m_bExibir [15 ] = FALSE;
   m_oJanPrincipal.m_bExibir [16 ] = FALSE;
   m_oJanPrincipal.m_bExibir [17 ] = FALSE;
   m_oJanPrincipal.m_bExibir [18 ] = FALSE;
   m_oJanPrincipal.m_bExibir [19 ] = FALSE;
   m_oJanPrincipal.m_bExibir [20 ] = FALSE;
   m_oJanPrincipal.m_bExibir [21 ] = FALSE;
   m_oJanPrincipal.m_bExibir [22 ] = FALSE;
   m_oJanPrincipal.m_bExibir [23 ] = FALSE;
   m_oJanPrincipal.m_bExibir [24 ] = FALSE;
   m_oJanPrincipal.m_bExibir [25 ] = FALSE;
   m_oJanPrincipal.m_bExibir [26 ] = FALSE;
   m_oJanPrincipal.m_bExibir [27 ] = FALSE;
   m_oJanPrincipal.m_bExibir [28 ] = FALSE;
   
   // redesenha bitmaps e cenario
   m_oJanPrincipal.mRedesenha ();
}


  
/* Desabilita abertura, desenha
os bitmaps e permite processamento do cenario do jogo.
**********************************************************/
void CApl::mRemoveAbertura ()
{
   // nao exibe mais abertura
   m_oJanPrincipal.m_bExibir [ 0 ] = FALSE;
   
   // exibe outros bmps

   m_oJanPrincipal.m_bExibir [ 1 ] = TRUE;

   // sem moldura se nao joga em rede
   if ( bUSANDO_REDEDP )
      m_oJanPrincipal.m_bExibir [ 2 ] = TRUE;
   else
      m_oJanPrincipal.m_bExibir [ 2 ] = FALSE;

   m_oJanPrincipal.m_bExibir [ 3 ] = TRUE;
   m_oJanPrincipal.m_bExibir [ 4 ] = TRUE;
   m_oJanPrincipal.m_bExibir [ 5 ] = TRUE;
   m_oJanPrincipal.m_bExibir [ 6 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 7 ] = FALSE;
   m_oJanPrincipal.m_bExibir [ 8 ] = FALSE;
   
   // se esta usando sockets (tutor remoto)
   if ( bUSANDO_SOCKETS )      // exibe botao para evocar tutor
      m_oJanPrincipal.m_bExibir [ 9 ] = TRUE;
   else
      m_oJanPrincipal.m_bExibir [ 9 ] = FALSE;

   m_oJanPrincipal.m_bExibir [10 ] = TRUE;
   m_oJanPrincipal.m_bExibir [11 ] = TRUE;
   m_oJanPrincipal.m_bExibir [12 ] = TRUE;
   m_oJanPrincipal.m_bExibir [13 ] = TRUE;
   m_oJanPrincipal.m_bExibir [14 ] = TRUE;
   m_oJanPrincipal.m_bExibir [15 ] = TRUE;
   m_oJanPrincipal.m_bExibir [16 ] = TRUE;
   m_oJanPrincipal.m_bExibir [17 ] = TRUE;
   m_oJanPrincipal.m_bExibir [18 ] = TRUE;
   m_oJanPrincipal.m_bExibir [19 ] = FALSE;
   m_oJanPrincipal.m_bExibir [20 ] = FALSE;
   m_oJanPrincipal.m_bExibir [21 ] = FALSE;
   m_oJanPrincipal.m_bExibir [22 ] = FALSE;
   m_oJanPrincipal.m_bExibir [23 ] = FALSE;
   m_oJanPrincipal.m_bExibir [24 ] = FALSE;
   m_oJanPrincipal.m_bExibir [25 ] = FALSE;
   m_oJanPrincipal.m_bExibir [26 ] = FALSE;
   m_oJanPrincipal.m_bExibir [27 ] = FALSE;
   m_oJanPrincipal.m_bExibir [28 ] = FALSE;
}



/* Altera os bmps dos botoes referentes aos personagens.
**********************************************************/
void CApl::mAlteraBmpsPersonagens ( int nEsquerda, int nDireita )
{
   // trata personagem esquerda
   switch ( nEsquerda ) {

      case ID_PERS_MAE_NATUREZA:
         m_oBmps.mAlteraNomeBmp (  3, "dp\\MAE.bmp" );
         m_oBmps.mAlteraNomeBmp ( 11, "dp\\INTENS16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 12, "dp\\PLANTA16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 13, "dp\\FUNDO16.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 14, "dp\\DEGRAD16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 21, "dp\\bintenap.bmp" );
         m_oBmps.mAlteraNomeBmp ( 22, "dp\\bplanape.bmp" );
         m_oBmps.mAlteraNomeBmp ( 23, "dp\\bfundape.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 24, "dp\\bdeapert.bmp" );
         break;

      case ID_PERS_PESCADOR:
         m_oBmps.mAlteraNomeBmp (  3, "dp\\PESCADOR.bmp" );
         m_oBmps.mAlteraNomeBmp ( 11, "dp\\EQUIP16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 12, "dp\\RELIXO16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 13, "dp\\DEVPEI16.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 14, "dp\\PESCA16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 21, "dp\\bequiape.bmp" );
         m_oBmps.mAlteraNomeBmp ( 22, "dp\\brelixoa.bmp" );
         m_oBmps.mAlteraNomeBmp ( 23, "dp\\bdevaper.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 24, "dp\\bpescape.bmp" );
         break;

      case ID_PERS_PREFEITO:
         m_oBmps.mAlteraNomeBmp (  3, "dp\\PREFEITO.bmp" );
         m_oBmps.mAlteraNomeBmp ( 11, "dp\\PROIBE16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 12, "dp\\MULTA16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 13, "dp\\LIXEIR16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 14, "dp\\LICENS16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 21, "dp\\bproibea.bmp" );
         m_oBmps.mAlteraNomeBmp ( 22, "dp\\bmulaper.bmp" );
         m_oBmps.mAlteraNomeBmp ( 23, "dp\\blixeiap.bmp" );
         m_oBmps.mAlteraNomeBmp ( 24, "dp\\blicenap.bmp" );
         break;

      case ID_PERS_TURISTA:
         m_oBmps.mAlteraNomeBmp (  3, "dp\\TURISTA.bmp" );
         m_oBmps.mAlteraNomeBmp ( 11, "dp\\NADA16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 12, "dp\\LIXOCH16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 13, "dp\\NAOLEV16.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 14, "dp\\FOTO16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 21, "dp\\bnadaape.bmp" );
         m_oBmps.mAlteraNomeBmp ( 22, "dp\\blixocha.bmp" );
         m_oBmps.mAlteraNomeBmp ( 23, "dp\\bnaoleva.bmp" );
         m_oBmps.mAlteraNomeBmp ( 24, "dp\\bfotoape.bmp" );
         break;
   }

   // trata personagem direita
   switch ( nDireita ) {

      case ID_PERS_MAE_NATUREZA:
         m_oBmps.mAlteraNomeBmp (  4,  "dp\\MAE.bmp" );
         m_oBmps.mAlteraNomeBmp ( 15, "dp\\INTENS16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 16, "dp\\PLANTA16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 17, "dp\\FUNDO16.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 18, "dp\\DEGRAD16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 25, "dp\\bintenap.bmp" );
         m_oBmps.mAlteraNomeBmp ( 26, "dp\\bplanape.bmp" );
         m_oBmps.mAlteraNomeBmp ( 27, "dp\\bfundape.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 28, "dp\\bdeapert.bmp" );
         break;

      case ID_PERS_PESCADOR:
         m_oBmps.mAlteraNomeBmp (  4,  "dp\\PESCADOR.bmp" );
         m_oBmps.mAlteraNomeBmp ( 15, "dp\\EQUIP16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 16, "dp\\RELIXO16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 17, "dp\\DEVPEI16.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 18, "dp\\PESCA16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 25, "dp\\bequiape.bmp" );
         m_oBmps.mAlteraNomeBmp ( 26, "dp\\brelixoa.bmp" );
         m_oBmps.mAlteraNomeBmp ( 27, "dp\\bdevaper.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 28, "dp\\bpescape.bmp" );
         break;

      case ID_PERS_PREFEITO:
         m_oBmps.mAlteraNomeBmp (  4,  "dp\\PREFEITO.bmp" );
         m_oBmps.mAlteraNomeBmp ( 15, "dp\\PROIBE16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 16, "dp\\MULTA16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 17, "dp\\LIXEIR16.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 18, "dp\\LICENS16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 25, "dp\\bproibea.bmp" );
         m_oBmps.mAlteraNomeBmp ( 26, "dp\\bmulaper.bmp" );
         m_oBmps.mAlteraNomeBmp ( 27, "dp\\blixeiap.bmp" );
         m_oBmps.mAlteraNomeBmp ( 28, "dp\\blicenap.bmp" );
         break;

      case ID_PERS_TURISTA:
         m_oBmps.mAlteraNomeBmp (  4,  "dp\\TURISTA.bmp" );
         m_oBmps.mAlteraNomeBmp ( 15, "dp\\NADA16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 16, "dp\\LIXOCH16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 17, "dp\\NAOLEV16.bmp"  );
         m_oBmps.mAlteraNomeBmp ( 18, "dp\\FOTO16.bmp" );
         m_oBmps.mAlteraNomeBmp ( 25, "dp\\bnadaape.bmp" );
         m_oBmps.mAlteraNomeBmp ( 26, "dp\\blixocha.bmp" );
         m_oBmps.mAlteraNomeBmp ( 27, "dp\\bnaoleva.bmp" );
         m_oBmps.mAlteraNomeBmp ( 28, "dp\\bfotoape.bmp" );
         break;
   }

   // recarrega bitmaps dos novos nomes
   m_oBmps.mReCria ();
}



/* Exibe informacoes sobre um objeto 3D que o 
usuario clicou com o mouse.
retorna - TRUE - encontrou pelo menos um objeto valido / FALSE - nao
**********************************************************/
BOOL CApl::mExibeInfoObjeto ( DWORD dwX, DWORD dwY )
{
   // seleciona agente do objeto
   CAgente
      *poSelecionado = m_oCen.mSelecionaObjetos ( dwX, dwY );

   // exibe informacoes sobre agente associado ao objeto
   if ( poSelecionado ) {
      
      // pega dados do agente
      CDados
         *poDadosAg = (CDados*) poSelecionado->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;

         // define energia
         float
            fE = poDadosFisicosAg->m_fFome;

         // texto
         char
            szTexto [ 300 ];

         // define nome do modelo
         switch ( poDadosFisicosAg->m_dwTipoCorpo ) {

            case NDX_MODELO_PEIXE_GORDO:
               strcpy ( szTexto, " Peixe Gordo" );
               break;
            case NDX_MODELO_PEIXE_AZUL:
               strcpy ( szTexto, " Peixe Azul" );
               break;
            case NDX_MODELO_PEIXE_LISTRADO:
               strcpy ( szTexto, " Peixe Listrado" );
               break;
            case NDX_MODELO_ALGA_VERDE:
               strcpy ( szTexto, " Alga" );
               break;
            case NDX_MODELO_MICROORGANISMO:
               strcpy ( szTexto, " Microorganismo" );
               break;

            case NDX_MODELO_DRAGA:
               strcpy ( szTexto, " Draga" );
               fE = -1;
               break;

            case NDX_MODELO_AGROTOXICO:
               strcpy ( szTexto, " Agrotóxico" );
               fE = -1;
               break;

            case NDX_MODELO_REDE:
               strcpy ( szTexto, " Rede de Arrastão" );
               fE = -1;
               break;

            case NDX_MODELO_LIXO:
               strcpy ( szTexto, " Lixo" );
               fE = -1;
               break;

            case NDX_MODELO_LANCHA:
               strcpy ( szTexto, " Lancha" );
               fE = -1;
               break;

            case NDX_MODELO_PESCA_PREDATORIA:
               strcpy ( szTexto, " Pesca Predatória" );
               fE = -1;
               break;

            case NDX_MODELO_GASOLINA:
               strcpy ( szTexto, " Vazamento de Gasolina" );
               fE = -1;
               break;

            // se nao eh um dos modelos acima nao escreve texto
            default:
               return FALSE;
               break;
         }
         
         // se a energia possui um valor valido (eh de um ser vivo)
         if ( fE != -1 ) {

            // escala valor para 0..100
            float
               fMaximoEnergia = TX_INICIAL_FOME;  // maximo de energia
            // maximo de energia dos microorganismos e plantas
            // eh diferente
            if ( poDadosFisicosAg->m_dwTipoCorpo == NDX_MODELO_MICROORGANISMO ||
                 poDadosFisicosAg->m_dwTipoCorpo == NDX_MODELO_ALGA_VERDE )
               fMaximoEnergia = TX_MAXIMO_ABSORVE_ALIMENTO;

            // recalcula escalando para 0..100
            fE = fE / fMaximoEnergia * 100;

            // evita problemas com limites
            if ( fE > 100 )
               fE = 100;
            if ( fE < 0 )
               fE = 0;

            sprintf ( szTexto, "%s, energia % 2.2f",szTexto, fE );
         }

         mExibeTextoJanela ( szTexto, 0.375, 1.0 - PROPMARGEMINFERIOR,
                             FALSE, FALSE );

         return TRUE;
      }
   }

   return FALSE;
}
