/* Autor: Leandro Bernsmuller
Declara apl.cpp, exibe.cpp, partida.cpp */



class CApl {

public:

   // dados da aplicacao
   HINSTANCE m_hInstancia;       // handler da instancia

   // estado do jogo

   // andamento
   char m_szNomeArqFaseDefault [ 300 ];// nome do arquivo de fase default
   char m_szNomeArqFase [ 300 ];       // nome do arquivo de fase default
   DWORD m_dwVeloc;   // velocidade de execucao (quanto maior mais lento)
   DWORD m_dwNumInteracoes;      // quantos loops foram executados na
                                 // partida ateh o momento (util para tutor)
   tagEventoTempo m_astEventosFase [ MAX_EVENTOS_FASE ];  // eventos temporais

   // execucao
   BYTE m_yEstadoExecucao;       // oque estah em execucao:
                                 // 0 - exibindo abertura
                                 // 1 - jogo em andamento
                                 // 2 - jogo suspendido temporariamente
                                 // 3 - jogo terminado

   // jogadores
   DWORD m_dwQuemJogador1;       // quem os jogadores 1 (esquerda) e
   DWORD m_dwQuemJogador2;       // 2 (direita) sao (personagens)
   DWORD m_adwNumFerramentas1 [ 4 ]; // quantidade de cada ferramenta 
                                     // disponivel para jogador 1
   DWORD m_adwNumFerramentas2 [ 4 ]; // quantidade de cada ferramenta 
                                     // disponivel para jogador 2
   
   // janelas e interface
   CJanelaCenario m_oJanPrincipal;  // a aplicacao foi projetada para
                                    // ter apenas uma janela
   int m_nPorcentagemUsoJanela;     // porcentagem ocupada pela janela
                                    // (do total horizontal e vertical)
   int m_nBotaoPressionado;         // numero do botao pressionado
                                    // (-1 nenhum)

   int m_nNdxObjetoMensagem;     // indice do objeto que exibe uma 
                                 // mensagem 3D na janela de
                                 // visualizacao. Se -1, nao tem valor.
   
   // bitmaps
   CGr m_oBmps;
   
   // cenarios
   CCenarioFisico m_oCen;   // cenario para a janela, uso D3DRM
                            // (cada janela pode ter um cenario, e
                            //  um cenario soh pode estar em uma janela)

   // sons
   CSons m_oSons;

   // IA
   CAgencia m_oAgencia;     // os agentes para o cenario, um por cenario

   // execucao de outros processos
   PROCESS_INFORMATION m_stAjuda;     // informacao sobre ajuda
   PROCESS_INFORMATION m_stEditor;    // informacao sobre editor
   PROCESS_INFORMATION m_stConfigAv;  // configuracao avancada

   // funcoes membro
   
   // aplicacao
   BOOL mCria ( HINSTANCE hInstance, int nCmdShow );
   void mDestroi ();

   // configuracao
   void mAlteraBmpsPersonagens ( int nEsquerda, int nDireita );
   void mDefineNumFerramentas ( DWORD dwPers, DWORD* padwNumFerramentas );
   BOOL mCarregaValores ();

   // inicia jogo
   BOOL mCriaModelosELuzes ();
   void mIniciaPartidaCliente ( DWORD dwSemente, DWORD dwIDPersonagem, tagEventoTempo* pstEventos );
   BOOL mIniciaDadosPartida ();
   BOOL mIniciaAgentes ();
   
   // executa jogo
   void mExecInteracao ();
   BOOL mIniciaPartida ();
   BOOL mTerminaPartida ();
   BOOL mSuspendePartida ();

   // efeitos durante a execucao do jogo
   void mCongelaTempo ( DWORD dwTempo );
   void mOndulaLuzes ();

   // apresentacao, ajuda
   void mExibeTips ( HWND& hWnd, DWORD dwX, DWORD dwY );
   void mExibeAbertura ();
   void mRemoveAbertura ();
   void mExibeControles ();
   void mExibeEcometro ();  
   BOOL mExibeInfoObjeto ( DWORD dwX, DWORD dwY );
   void mExibeTextoJanela ( char* szTexto,
                            float fPosNormX, float fPosNormY,
                            BOOL bAlinharDireita, BOOL bAlinharSobre );


   // execucao de mensagens
   void mExecEventosFase ( int nExecutar );
   void mExecutaAcaoBotao ( DWORD dwBotao, DWORD dwPers, DWORD* padwNumFerramentas );
   BOOL mTrataMensagensWindows ( HWND& hWnd, UINT& uMsg, WPARAM& wParam,
                                 LPARAM& lParam );
   void mTrataEventosMouse ( HWND& hWnd, DWORD dwBotoes, DWORD dwX, DWORD dwY );
   
   void mAlteraEnergiaSeres ( float* pafQuanto );
   
   // tutor
   void mTutorEnviarInfoEcometro ( DWORD nPorcentagem ); 
   void mTutorEnviarTempo (); 
   void mTutorEnviarAcaoUsuario ( char* szEvento ); 
   void mTutorRecebeuMensagemSocket ();
};
