hedgewars/hwengine.pas
changeset 7628 bc7b1d228a2c
parent 7615 b39beffcf05e
child 7687 c73fd8cfa7c0
child 7837 3e031b3b33e6
equal deleted inserted replaced
7533:7ee319134713 7628:bc7b1d228a2c
    28 {$ELSE}
    28 {$ELSE}
    29 program hwengine;
    29 program hwengine;
    30 {$ENDIF}
    30 {$ENDIF}
    31 
    31 
    32 uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uInputHandler, uSound,
    32 uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uInputHandler, uSound,
    33      uScript, uTeams, uStats, uIO, uLocale, uChat, uAI, uAIMisc, uRandom, uLandTexture, uCollisions,
    33      uScript, uTeams, uStats, uIO, uLocale, uChat, uAI, uAIMisc, uLandTexture, uCollisions,
    34      SysUtils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted
    34      SysUtils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted
    35      {$IFDEF SDL13}, uTouch{$ENDIF}{$IFDEF ANDROID}, GLUnit{$ENDIF};
    35      {$IFDEF USE_VIDEO_RECORDING}, uVideoRec {$ENDIF}
       
    36      {$IFDEF SDL13}, uTouch{$ENDIF}{$IFDEF ANDROID}, GLUnit{$ENDIF}, uAILandMarks;
       
    37 
    36 
    38 
    37 {$IFDEF HWLIBRARY}
    39 {$IFDEF HWLIBRARY}
    38 procedure initEverything(complete:boolean);
    40 procedure initEverything(complete:boolean);
    39 procedure freeEverything(complete:boolean);
    41 procedure freeEverything(complete:boolean);
    40 procedure Game(gameArgs: PPChar); cdecl; export;
    42 procedure Game(gameArgs: PPChar); cdecl; export;
    55 
    57 
    56     case GameState of
    58     case GameState of
    57         gsLandGen:
    59         gsLandGen:
    58             begin
    60             begin
    59             GenMap;
    61             GenMap;
       
    62             uLandTexture.initModule;
       
    63             UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT, false); 
       
    64             uAILandMarks.initModule;
    60             ParseCommand('sendlanddigest', true);
    65             ParseCommand('sendlanddigest', true);
    61             GameState:= gsStart;
    66             GameState:= gsStart;
    62             end;
    67             end;
    63         gsStart:
    68         gsStart:
    64             begin
    69             begin
    79             ScriptCall('onGameStart');
    84             ScriptCall('onGameStart');
    80             GameState:= gsGame;
    85             GameState:= gsGame;
    81             end;
    86             end;
    82         gsConfirm, gsGame:
    87         gsConfirm, gsGame:
    83             begin
    88             begin
    84             DrawWorld(Lag); // never place between ProcessKbd and DoGameTick - bugs due to /put cmd and isCursorVisible
    89             DrawWorld(Lag);
    85             DoGameTick(Lag);
    90             DoGameTick(Lag);
    86             ProcessVisualGears(Lag);
    91             ProcessVisualGears(Lag);
    87             end;
    92             end;
    88         gsChat:
    93         gsChat:
    89             begin
    94             begin
    99             exit(false);
   104             exit(false);
   100             end;
   105             end;
   101 
   106 
   102     SwapBuffers;
   107     SwapBuffers;
   103 
   108 
       
   109 {$IFDEF USE_VIDEO_RECORDING}
       
   110     if flagPrerecording then
       
   111         SaveCameraPosition;
       
   112 {$ENDIF}
       
   113 
   104     if flagMakeCapture then
   114     if flagMakeCapture then
   105         begin
   115         begin
   106         flagMakeCapture:= false;
   116         flagMakeCapture:= false;
   107         {$IFDEF PAS2C}
   117         {$IFDEF PAS2C}
   108         s:= 'hw';
   118         s:= '/Screenshots/hw';
   109         {$ELSE}
   119         {$ELSE}
   110         s:= 'hw_' + FormatDateTime('YYYY-MM-DD_HH-mm-ss', Now()) + inttostr(GameTicks);
   120         s:= '/Screenshots/hw_' + FormatDateTime('YYYY-MM-DD_HH-mm-ss', Now()) + inttostr(GameTicks);
   111         {$ENDIF}
   121         {$ENDIF}
   112 
   122 
       
   123         // flash
   113         playSound(sndShutter);
   124         playSound(sndShutter);
   114         
   125         ScreenFade:= sfFromWhite;
   115         if MakeScreenshot(s) then
   126         ScreenFadeValue:= sfMax;
       
   127         ScreenFadeSpeed:= 5;
       
   128 
       
   129         if MakeScreenshot(s, 1) then
   116             WriteLnToConsole('Screenshot saved: ' + s)
   130             WriteLnToConsole('Screenshot saved: ' + s)
   117         else
   131         else
   118             begin
   132             begin
   119             WriteLnToConsole('Screenshot failed.');
   133             WriteLnToConsole('Screenshot failed.');
   120             AddChatString(#5 + 'screen capture failed (lack of memory or write permissions)');
   134             AddChatString(#5 + 'screen capture failed (lack of memory or write permissions)');
   259         else SDL_Delay(1);
   273         else SDL_Delay(1);
   260         IPCCheckSock();
   274         IPCCheckSock();
   261     end;
   275     end;
   262 end;
   276 end;
   263 
   277 
       
   278 {$IFDEF USE_VIDEO_RECORDING}
       
   279 procedure RecorderMainLoop;
       
   280 var oldGameTicks, oldRealTicks, newGameTicks, newRealTicks: LongInt;
       
   281 begin
       
   282     if not BeginVideoRecording() then
       
   283         exit;
       
   284     DoTimer(0); // gsLandGen -> gsStart
       
   285     DoTimer(0); // gsStart -> gsGame
       
   286 
       
   287     if not LoadNextCameraPosition(newRealTicks, newGameTicks) then
       
   288         exit;
       
   289     fastScrolling:= true;
       
   290     DoGameTick(newGameTicks);
       
   291     fastScrolling:= false;
       
   292     oldRealTicks:= 0;
       
   293     oldGameTicks:= newGameTicks;
       
   294 
       
   295     while LoadNextCameraPosition(newRealTicks, newGameTicks) do
       
   296     begin
       
   297         IPCCheckSock();
       
   298         DoGameTick(newGameTicks - oldGameTicks);
       
   299         if GameState = gsExit then
       
   300             break;
       
   301         ProcessVisualGears(newRealTicks - oldRealTicks);
       
   302         DrawWorld(newRealTicks - oldRealTicks);
       
   303         EncodeFrame();
       
   304         oldRealTicks:= newRealTicks;
       
   305         oldGameTicks:= newGameTicks;
       
   306     end;
       
   307     StopVideoRecording();
       
   308 end;
       
   309 {$ENDIF}
       
   310 
   264 ///////////////
   311 ///////////////
   265 procedure Game{$IFDEF HWLIBRARY}(gameArgs: PPChar); cdecl; export{$ENDIF};
   312 procedure Game{$IFDEF HWLIBRARY}(gameArgs: PPChar); cdecl; export{$ENDIF};
   266 var p: TPathType;
   313 var p: TPathType;
   267     s: shortstring;
   314     s: shortstring;
   268     i: LongInt;
   315     i: LongInt;
   325 
   372 
   326     WriteToConsole('Init SDL_ttf... ');
   373     WriteToConsole('Init SDL_ttf... ');
   327     SDLTry(TTF_Init() <> -1, true);
   374     SDLTry(TTF_Init() <> -1, true);
   328     WriteLnToConsole(msgOK);
   375     WriteLnToConsole(msgOK);
   329 
   376 
   330     // show main window
   377 {$IFDEF USE_VIDEO_RECORDING}
   331     if cFullScreen then
   378     if GameType = gmtRecord then
   332         ParseCommand('fullscr 1', true)
   379         InitOffscreenOpenGL()
   333     else
   380     else
   334         ParseCommand('fullscr 0', true);
   381 {$ENDIF}
       
   382         begin            
       
   383         // show main window
       
   384         if cFullScreen then
       
   385             ParseCommand('fullscr 1', true)
       
   386         else
       
   387             ParseCommand('fullscr 0', true);
       
   388         end;
   335 
   389 
   336     ControllerInit(); // has to happen before InitKbdKeyTable to map keys
   390     ControllerInit(); // has to happen before InitKbdKeyTable to map keys
   337     InitKbdKeyTable();
   391     InitKbdKeyTable();
   338     AddProgress();
   392     AddProgress();
   339 
   393 
   366     s:= 'eproto ' + inttostr(cNetProtoVersion);
   420     s:= 'eproto ' + inttostr(cNetProtoVersion);
   367     SendIPCRaw(@s[0], Length(s) + 1); // send proto version
   421     SendIPCRaw(@s[0], Length(s) + 1); // send proto version
   368 
   422 
   369     InitTeams();
   423     InitTeams();
   370     AssignStores();
   424     AssignStores();
       
   425 
       
   426     if GameType = gmtRecord then
       
   427         SetSound(false);
       
   428 
   371     InitSound();
   429     InitSound();
   372 
   430 
   373     isDeveloperMode:= false;
   431     isDeveloperMode:= false;
   374     TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true);
   432     TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true);
   375     ParseCommand('rotmask', true);
   433     ParseCommand('rotmask', true);
   376     MainLoop();
   434 
       
   435 {$IFDEF USE_VIDEO_RECORDING}
       
   436     if GameType = gmtRecord then
       
   437         RecorderMainLoop()
       
   438     else
       
   439 {$ENDIF}
       
   440         MainLoop();
   377 
   441 
   378     // clean up all the memory allocated
   442     // clean up all the memory allocated
   379     freeEverything(true);
   443     freeEverything(true);
   380 end;
   444 end;
   381 
   445 
   410         uGears.initModule;
   474         uGears.initModule;
   411         uInputHandler.initModule;
   475         uInputHandler.initModule;
   412         //uLandGraphics does not need initialization
   476         //uLandGraphics does not need initialization
   413         //uLandObjects does not need initialization
   477         //uLandObjects does not need initialization
   414         //uLandTemplates does not need initialization
   478         //uLandTemplates does not need initialization
   415         uLandTexture.initModule;
       
   416         //uLocale does not need initialization
   479         //uLocale does not need initialization
   417         uRandom.initModule;
       
   418         uScript.initModule;
   480         uScript.initModule;
   419         uSound.initModule;
   481         uSound.initModule;
   420         uStats.initModule;
   482         uStats.initModule;
   421         uStore.initModule;
   483         uStore.initModule;
   422         uTeams.initModule;
   484         uTeams.initModule;
   430 begin
   492 begin
   431     if complete then
   493     if complete then
   432     begin
   494     begin
   433         WriteLnToConsole('Freeing resources...');
   495         WriteLnToConsole('Freeing resources...');
   434         uAI.freeModule;
   496         uAI.freeModule;
       
   497         uAILandMarks.freeModule;
   435         uAIMisc.freeModule;         //stub
   498         uAIMisc.freeModule;         //stub
   436         uCaptions.freeModule;
   499         uCaptions.freeModule;
   437         uWorld.freeModule;
   500         uWorld.freeModule;
   438         uVisualGears.freeModule;
   501         uVisualGears.freeModule;
   439         uTeams.freeModule;
   502         uTeams.freeModule;
   440         uInputHandler.freeModule;
   503         uInputHandler.freeModule;
   441         uStats.freeModule;          //stub
   504         uStats.freeModule;          //stub
   442         uSound.freeModule;
   505         uSound.freeModule;
   443         uScript.freeModule;
   506         uScript.freeModule;
   444         uRandom.freeModule;         //stub
   507         //uRandom does not need to be freed
   445         //uLocale does not need to be freed
   508         //uLocale does not need to be freed
   446         //uLandTemplates does not need to be freed
   509         //uLandTemplates does not need to be freed
   447         uLandTexture.freeModule;
   510         uLandTexture.freeModule;
   448         //uLandObjects does not need to be freed
   511         //uLandObjects does not need to be freed
   449         //uLandGraphics does not need to be freed
   512         //uLandGraphics does not need to be freed
   454         uChat.freeModule;
   517         uChat.freeModule;
   455         uAmmos.freeModule;
   518         uAmmos.freeModule;
   456         //uAIAmmoTests does not need to be freed
   519         //uAIAmmoTests does not need to be freed
   457         //uAIActions does not need to be freed
   520         //uAIActions does not need to be freed
   458         uStore.freeModule;
   521         uStore.freeModule;
       
   522 {$IFDEF USE_VIDEO_RECORDING}uVideoRec.freeModule;{$ENDIF}
   459     end;
   523     end;
   460 
   524 
   461     uIO.freeModule;
   525     uIO.freeModule;
   462     uLand.freeModule;
   526     uLand.freeModule;
   463     uLandPainted.freeModule;
   527     uLandPainted.freeModule;
   527     if (ParamCount < 3) then
   591     if (ParamCount < 3) then
   528         GameType:= gmtSyntax
   592         GameType:= gmtSyntax
   529     else
   593     else
   530         if (ParamCount = 3) and ((ParamStr(3) = '--stats-only') or (ParamStr(3) = 'landpreview')) then
   594         if (ParamCount = 3) and ((ParamStr(3) = '--stats-only') or (ParamStr(3) = 'landpreview')) then
   531             internalSetGameTypeLandPreviewFromParameters()
   595             internalSetGameTypeLandPreviewFromParameters()
       
   596         else if ParamCount = cDefaultParamNum then
       
   597             internalStartGameWithParameters()
       
   598 {$IFDEF USE_VIDEO_RECORDING}
       
   599         else if ParamCount = cVideorecParamNum then
       
   600             internalStartVideoRecordingWithParameters()
       
   601 {$ENDIF}
   532         else
   602         else
   533             if (ParamCount = cDefaultParamNum) then
   603             playReplayFileWithParameters();
   534                 internalStartGameWithParameters()
       
   535             else
       
   536                 playReplayFileWithParameters();
       
   537 end;
   604 end;
   538 
   605 
   539 ////////////////////////////////////////////////////////////////////////////////
   606 ////////////////////////////////////////////////////////////////////////////////
   540 /////////////////////////////// m a i n ////////////////////////////////////////
   607 /////////////////////////////// m a i n ////////////////////////////////////////
   541 ////////////////////////////////////////////////////////////////////////////////
   608 ////////////////////////////////////////////////////////////////////////////////