/* Autor: Leandro Bernsmuller
Testa se sistema operacional tem condicoes de rodar o programa,
cria a aplicacao e direciona as mensagens do Windows */



#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\dxver.h"
#include "..\cenario\gr.h"
#include "..\cenario\cenario.h"
#include "..\cenario\cenfis.h"
#include "..\som\sons.h"
#include "..\ia\dados\dados.h"
#include "..\ia\acoes\acao.h"
#include "..\ia\agente.h"
#include "..\ia\agencia.h"
#include "..\interf\janela.h"
#include "..\interf\jancen.h"
#include "apl.h"



long FAR PASCAL WindowProc ( HWND hWnd, UINT uMsg, 
                             WPARAM wParam, LPARAM lParam );

  

CApl
   oJOGO;    // o jogo



/* Direciona eventos: teclado, menu, ... para objeto aplicacao
**********************************************************/
long FAR PASCAL WindowProc ( HWND hWnd, UINT uMsg, 
                             WPARAM wParam, LPARAM lParam )
{
   oJOGO.mTrataMensagensWindows ( hWnd, uMsg, wParam, lParam );
   return ::DefWindowProc ( hWnd, uMsg, wParam, lParam );
}



/* Inicia janela do aplicativo e loop de mensagens
**********************************************************/
int PASCAL WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow)
{

   // testa resolucao, se for muito baixa pergunta se deve continuar
   // resolucao de video
   int
      nVidX = ::GetSystemMetrics ( SM_CXSCREEN ),
      nVidY = ::GetSystemMetrics ( SM_CYSCREEN );
   // menor que 800x600
   if ( nVidX < 800 || nVidY < 600 ) {

      int
         nResp = MessageBox ( NULL, STR_RESOLUCAO_BAIXA, STR_NOMEPEQ, MB_YESNO | MB_ICONQUESTION );
      // analisa resposta
      if ( nResp == IDNO )       // sair
         return FALSE;
   }
   
   // testa versao do DirectX
   DWORD
      dwDXVer,
      dwDXPlat;
   GetDXVersion ( &dwDXVer, &dwDXPlat );
   if ( dwDXVer < VERSAO_NECESSARIA_DIRECTX ) {
      MSGSTR ( STR_ERRO_VERSAO_INSTALACAO );
      return FALSE;
   }

   // tenta criar janela da aplicacao e iniciar dados
   if( ! oJOGO.mCria ( hInstance, nCmdShow ) )
      return FALSE;

   // executa o loop de mensagens
   MSG
      stMsg;    // mensagem recebida
   for ( ; ; ) {
      
      // se tem mensagem na fila faz tratamento, senao continua
      if ( PeekMessage( &stMsg, NULL, 0, 0, PM_NOREMOVE ) ) {
      
         // tenta pegar mensagem, se falhou retorna erro
         if( ! GetMessage( &stMsg, NULL, 0, 0 ) )
            return stMsg.wParam;
       
         // trata mensagem
         TranslateMessage ( &stMsg ); 
         DispatchMessage ( &stMsg );
      }
      //else
         // roda o loop principal do programa
         //oJOGO.mExecInteracao ();
   }
}
