DEADSOFTWARE

"holmes pause" mode
[d2df-sdl.git] / src / game / g_game.pas
index 05b824ac9f1f9814b59f80fd244e7436b037c116..b0f64563e8cfd2ecb1a3ad1ef39aaebde48a7469 100644 (file)
@@ -19,8 +19,10 @@ unit g_game;
 interface
 
 uses
-  g_basic, g_player, e_graphics, Classes, g_res_downloader,
-  SysUtils, g_sound, g_gui, MAPDEF, wadreader, md5, xprofiler;
+  SysUtils, Classes,
+  MAPDEF,
+  g_basic, g_player, e_graphics, g_res_downloader,
+  g_sound, g_gui, wadreader, md5, xprofiler;
 
 type
   TGameSettings = record
@@ -102,6 +104,7 @@ function  g_Game_GetFirstMap(WAD: String): String;
 function  g_Game_GetNextMap(): String;
 procedure g_Game_NextLevel();
 procedure g_Game_Pause(Enable: Boolean);
+procedure g_Game_HolmesPause(Enable: Boolean);
 procedure g_Game_InGameMenu(Show: Boolean);
 function  g_Game_IsWatchedPlayer(UID: Word): Boolean;
 function  g_Game_IsWatchedTeam(Team: Byte): Boolean;
@@ -229,7 +232,8 @@ var
   gServInterTime: Byte = 0;
   gGameStartTime: LongWord = 0;
   gTotalMonsters: Integer = 0;
-  gPause: Boolean;
+  gPauseMain: Boolean = false;
+  gPauseHolmes: Boolean = false;
   gShowTime: Boolean = True;
   gShowFPS: Boolean = False;
   gShowGoals: Boolean = True;
@@ -329,7 +333,8 @@ procedure g_ResetDynlights ();
 procedure g_AddDynLight (x, y, radius: Integer; r, g, b, a: Single);
 procedure g_DynLightExplosion (x, y, radius: Integer; r, g, b: Single);
 
-function conIsCheatsEnabled (): Boolean;
+function conIsCheatsEnabled (): Boolean; inline;
+function gPause (): Boolean; inline;
 
 
 implementation
@@ -339,17 +344,26 @@ uses
   e_input, e_log, g_console, g_items, g_map, g_panel,
   g_playermodel, g_gfx, g_options, g_weapons, Math,
   g_triggers, g_monsters, e_sound, CONFIG,
-  BinEditor, g_language, g_net, SDL,
+  g_language, g_net, SDL,
   ENet, e_msg, g_netmsg, g_netmaster, GL, GLExt,
   utils, sfs, g_holmes;
 
 
 // ////////////////////////////////////////////////////////////////////////// //
-function conIsCheatsEnabled (): Boolean;
+function gPause (): Boolean; inline; begin result := gPauseMain or gPauseHolmes; end;
+
+
+// ////////////////////////////////////////////////////////////////////////// //
+function conIsCheatsEnabled (): Boolean; inline;
 begin
   result := false;
-  if (not gGameOn) or (not gCheats) or ((gGameSettings.GameType <> GT_SINGLE) and
-     (gGameSettings.GameMode <> GM_COOP) and (not gDebugMode)) or g_Game_IsNet then exit;
+  if g_Game_IsNet then exit;
+  if not gDebugMode then
+  begin
+    if not gCheats then exit;
+    if not (gGameSettings.GameType in [GT_SINGLE, GT_CUSTOM]) then exit;
+    if (gGameSettings.GameMode <> GM_COOP) then exit;
+  end;
   result := true;
 end;
 
@@ -850,8 +864,9 @@ begin
     MH_SEND_GameEvent(NET_EV_MAPEND, Byte(gMissionFailed));
 
 // Ñòîï èãðà:
-  gPause := False;
-  gGameOn := False;
+  gPauseMain := false;
+  gPauseHolmes := false;
+  gGameOn := false;
 
   g_Game_StopAllSounds(False);
 
@@ -1258,8 +1273,9 @@ begin
       until FindNext(SR) <> 0;
     FindClose(SR);
 
-    gGameOn := False;
-    gPause := False;
+    gGameOn := false;
+    gPauseMain := false;
+    gPauseHolmes := false;
     gTime := 0;
     LastScreenShot := 0;
 
@@ -2939,6 +2955,7 @@ begin
   drawOther('corpses', @g_Player_DrawCorpses);
   drawPanelType('*wall', PANEL_WALL, g_rlayer_wall);
   drawOther('monsters', @g_Monsters_Draw);
+  drawOther('itemdrop', @g_Items_DrawDrop);
   drawPanelType('*door', PANEL_CLOSEDOOR, g_rlayer_door);
   drawOther('gfx', @g_GFX_Draw);
   drawOther('flags', @g_Map_DrawFlags);
@@ -3340,7 +3357,7 @@ begin
     end;
   end;
 
-  if gPause and gGameOn and (g_ActiveWindow = nil) then
+  if gPauseMain and gGameOn and (g_ActiveWindow = nil) then
   begin
     //e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 48, 48, 48, 180);
     e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
@@ -4250,7 +4267,8 @@ begin
     end;
 
   gExit := 0;
-  gPause := False;
+  gPauseMain := false;
+  gPauseHolmes := false;
   gTime := 0;
   NetTimeToUpdate := 1;
   NetTimeToReliable := 0;
@@ -5165,6 +5183,19 @@ begin
   end;
 end;
 
+procedure PrintHeapStats();
+var
+  hs: TFPCHeapStatus;
+begin
+  hs := GetFPCHeapStatus();
+  e_LogWriteLn ('v===== heap status =====v');
+  e_LogWriteFln('max heap size = %d k', [hs.MaxHeapSize div 1024]);
+  e_LogWriteFln('max heap used = %d k', [hs.MaxHeapUsed div 1024]);
+  e_LogWriteFln('cur heap size = %d k', [hs.CurrHeapSize div 1024]);
+  e_LogWriteFln('cur heap used = %d k', [hs.CurrHeapUsed div 1024]);
+  e_LogWriteFln('cur heap free = %d k', [hs.CurrHeapFree div 1024]);
+  e_LogWriteLn ('^=======================^');
+end;
 
 procedure DebugCommands(P: SArray);
 var
@@ -5238,6 +5269,7 @@ begin
           g_Console_Add('ID | Name');
           for b := MONSTER_DEMON to MONSTER_MAN do
             g_Console_Add(Format('%2d | %s', [b, g_Mons_NameByTypeId(b)]));
+          conwriteln('behav.   num'#10'normal    0'#10'killer    1'#10'maniac    2'#10'insane    3'#10'cannibal  4'#10'good      5');
         end else
         begin
           a := StrToIntDef(P[1], 0);
@@ -5256,7 +5288,17 @@ begin
                      gPlayer1.Direction, True);
               end;
               if (Length(P) > 2) and (mon <> nil) then
-                mon.MonsterBehaviour := Min(Max(StrToIntDef(P[2], BH_NORMAL), BH_NORMAL), BH_GOOD);
+              begin
+                     if (CompareText(P[2], 'normal') = 0) then mon.MonsterBehaviour := BH_NORMAL
+                else if (CompareText(P[2], 'killer') = 0) then mon.MonsterBehaviour := BH_KILLER
+                else if (CompareText(P[2], 'maniac') = 0) then mon.MonsterBehaviour := BH_MANIAC
+                else if (CompareText(P[2], 'insane') = 0) then mon.MonsterBehaviour := BH_INSANE
+                else if (CompareText(P[2], 'cannibal') = 0) then mon.MonsterBehaviour := BH_CANNIBAL
+                else if (CompareText(P[2], 'good') = 0) then mon.MonsterBehaviour := BH_GOOD
+                else if (CompareText(P[2], 'friend') = 0) then mon.MonsterBehaviour := BH_GOOD
+                else if (CompareText(P[2], 'friendly') = 0) then mon.MonsterBehaviour := BH_GOOD
+                else mon.MonsterBehaviour := Min(Max(StrToIntDef(P[2], BH_NORMAL), BH_NORMAL), BH_GOOD);
+              end;
             end;
         end;
     end
@@ -5280,6 +5322,10 @@ begin
     begin
       for a := 1 to 8 do
         g_Console_Add(e_JoystickStateToString(a));
+    end
+    else if (cmd = 'd_mem') then
+    begin
+      PrintHeapStats();
     end;
   end
     else
@@ -5528,7 +5574,7 @@ begin
   else if cmd = 'pause' then
   begin
     if (g_ActiveWindow = nil) then
-      g_Game_Pause(not gPause);
+      g_Game_Pause(not gPauseMain);
   end
   else if cmd = 'endgame' then
     gExit := EXIT_SIMPLE
@@ -6526,19 +6572,31 @@ begin
     end;
 end;
 
-procedure g_Game_Pause(Enable: Boolean);
+procedure g_Game_Pause (Enable: Boolean);
+var
+  oldPause: Boolean;
 begin
-  if not gGameOn then
-    Exit;
+  if not gGameOn then exit;
 
-  if gPause = Enable then
-    Exit;
+  if not (gGameSettings.GameType in [GT_SINGLE, GT_CUSTOM]) then exit;
 
-  if not (gGameSettings.GameType in [GT_SINGLE, GT_CUSTOM]) then
-    Exit;
+  oldPause := gPause;
+  gPauseMain := Enable;
+
+  if (gPause <> oldPause) then g_Game_PauseAllSounds(gPause);
+end;
+
+procedure g_Game_HolmesPause (Enable: Boolean);
+var
+  oldPause: Boolean;
+begin
+  if not gGameOn then exit;
+  if not (gGameSettings.GameType in [GT_SINGLE, GT_CUSTOM]) then exit;
+
+  oldPause := gPause;
+  gPauseHolmes := Enable;
 
-  gPause := Enable;
-  g_Game_PauseAllSounds(Enable);
+  if (gPause <> oldPause) then g_Game_PauseAllSounds(gPause);
 end;
 
 procedure g_Game_PauseAllSounds(Enable: Boolean);