DEADSOFTWARE

gl: draw spectator interface
[d2df-sdl.git] / src / game / g_game.pas
index bb914b69a94f862ae651197d616bdd88733fbebd..acb2a76373fb576c878e081c77be75b60b4b98b5 100644 (file)
@@ -132,7 +132,7 @@ procedure g_Game_Announce_KillCombo(Param: Integer);
 procedure g_Game_Announce_BodyKill(SpawnerUID: Word);
 procedure g_Game_StartVote(Command, Initiator: string);
 procedure g_Game_CheckVote;
-{$IFNDEF HEADLESS}
+{$IFDEF ENABLE_RENDER}
   procedure g_TakeScreenShot(Filename: string = '');
 {$ENDIF}
 procedure g_FatalError(Text: String);
@@ -159,9 +159,10 @@ procedure SortGameStat(var stat: TPlayerStatArray);
 {$IFDEF ENABLE_MENU}
   procedure g_Game_InGameMenu(Show: Boolean);
 {$ENDIF}
-{$IFNDEF HEADLESS}
+{$IFDEF ENABLE_SYSTEM}
   procedure CharPress (C: AnsiChar);
 {$ENDIF}
+
   procedure KeyPress (K: Word);
 
 { procedure SetWinPause(Enable: Boolean); }
@@ -466,8 +467,14 @@ uses
   {$IFDEF ENABLE_SHELLS}
     g_shells,
   {$ENDIF}
-  {$IFNDEF HEADLESS}
-    r_render, g_system,
+  {$IFDEF ENABLE_CORPSES}
+    g_corpses,
+  {$ENDIF}
+  {$IFDEF ENABLE_RENDER}
+    r_render,
+  {$ENDIF}
+  {$IFDEF ENABLE_SYSTEM}
+    g_system,
   {$ENDIF}
   e_res, g_window,
   e_input, e_log, g_console, g_items, g_map, g_panel,
@@ -805,7 +812,7 @@ end;
   end;
 {$ENDIF}
 
-{$IFNDEF HEADLESS}
+{$IFDEF ENABLE_SYSTEM}
   procedure CharPress (C: AnsiChar);
     {$IFDEF ENABLE_MENU}
       var Msg: g_gui.TMessage;
@@ -1498,7 +1505,16 @@ begin
 
   g_Map_Free(freeTextures);
   g_Player_Free();
-  g_Player_RemoveAllCorpses();
+
+  {$IFDEF ENABLE_GIBS}
+    g_Gibs_RemoveAll;
+  {$ENDIF}
+  {$IFDEF ENALBE_SHELLS}
+    g_Shells_RemoveAll;
+  {$ENDIF}
+  {$IFDEF ENABLE_CORPSES}
+    g_Corpses_RemoveAll;
+  {$ENDIF}
 
   gGameSettings.GameType := GT_NONE;
   if gGameSettings.GameMode = GM_SINGLE then
@@ -1956,7 +1972,22 @@ begin
 
 // Статистика по Tab:
   if gGameOn then
+  begin
     IsDrawStat := (not gConsoleShow) and (not gChatShow) and (gGameSettings.GameType <> GT_SINGLE) and g_Console_Action(ACTION_SCORES);
+  end
+  else
+  begin
+    if g_Console_Action(ACTION_SCORES) then
+    begin
+      if not gStatsPressed then
+      begin
+        gStatsOff := not gStatsOff;
+        gStatsPressed := True;
+      end;
+    end
+    else
+      gStatsPressed := False;
+  end;
 
 // Игра идет:
   if gGameOn and not gPause and (gState <> STATE_FOLD) then
@@ -2206,6 +2237,17 @@ begin
       end;
     end;
 
+    (* spectator state check from render *)
+
+    if (gPlayer1 = nil) and (gPlayer2 = nil) and (gSpectMode = SPECT_NONE) then
+      gSpectMode := SPECT_STATS;
+
+    if IsActivePlayer(g_Player_Get(gSpectPID1)) = false then
+      gSpectPID1 := GetActivePlayerID_Next();
+
+    if IsActivePlayer(g_Player_Get(gSpectPID2)) = false then
+      gSpectPID2 := GetActivePlayerID_Next();
+
   // Обновляем все остальное:
     g_Map_Update();
     g_Items_Update();
@@ -2219,7 +2261,9 @@ begin
     {$IFDEF ENABLE_GIBS}
       g_Gibs_Update;
     {$ENDIF}
-    g_Player_UpdatePhysicalObjects();
+    {$IFDEF ENABLE_CORPSES}
+      g_Corpses_Update;
+    {$ENDIF}
     {$IFDEF ENABLE_SHELLS}
       g_Shells_Update;
     {$ENDIF}
@@ -2332,7 +2376,7 @@ begin
   // Нужно сменить разрешение:
     if gResolutionChange then
     begin
-      {$IFNDEF HEADLESS}
+      {$IFDEF ENABLE_RENDER}
         e_WriteLog('Changing resolution', TMsgType.Notify);
         r_Render_Apply;
       {$ENDIF}
@@ -2569,9 +2613,9 @@ begin
   gMusic.Free();
   g_Game_FreeData();
   g_PlayerModel_FreeData();
-{$IFNDEF HEADLESS}
-  //g_Menu_Free(); //k8: this segfaults after resolution change; who cares?
-{$ENDIF}
+  {$IFDEF ENABLE_MENU}
+    // g_Menu_Free(); //k8: this segfaults after resolution change; who cares?
+  {$ENDIF}
 
   if NetInitDone then g_Net_Free;
 
@@ -2581,7 +2625,7 @@ begin
 
   gExit := EXIT_QUIT;
 
-  {$IFNDEF HEADLESS}
+  {$IFDEF ENABLE_SYSTEM}
     sys_RequestQuit;
   {$ENDIF}
 end;
@@ -3361,7 +3405,16 @@ var
   nws: AnsiString;
 begin
   g_Map_Free((Map <> gCurrentMapFileName) and (oldMapPath <> gCurrentMapFileName));
-  g_Player_RemoveAllCorpses();
+
+  {$IFDEF ENABLE_GIBS}
+    g_Gibs_RemoveAll;
+  {$ENDIF}
+  {$IFDEF ENALBE_SHELLS}
+    g_Shells_RemoveAll;
+  {$ENDIF}
+  {$IFDEF ENABLE_CORPSES}
+    g_Corpses_RemoveAll;
+  {$ENDIF}
 
   if (not g_Game_IsClient) and
      (gSwitchGameMode <> gGameSettings.GameMode) and
@@ -3430,7 +3483,7 @@ begin
   begin
     //result := g_Map_Load(gGameSettings.WAD + ':\' + ResName);
     result := g_Map_Load(NewWAD+':\'+ResName);
-    {$IFNDEF HEADLESS}
+    {$IFDEF ENABLE_RENDER}
       r_Render_LoadTextures;
     {$ENDIF}
   end;
@@ -3691,7 +3744,16 @@ begin
     Exit;
   end;
 
-  g_Player_RemoveAllCorpses;
+  {$IFDEF ENABLE_GIBS}
+    g_Gibs_RemoveAll;
+  {$ENDIF}
+  {$IFDEF ENALBE_SHELLS}
+    g_Shells_RemoveAll;
+  {$ENDIF}
+  {$IFDEF ENABLE_CORPSES}
+    g_Corpses_RemoveAll;
+  {$ENDIF}
+
   g_Game_Message(_lc[I_MESSAGE_LMS_START], 144);
   if g_Game_IsNet then
     MH_SEND_GameEvent(NET_EV_LMS_START);
@@ -4116,12 +4178,18 @@ begin
   begin
     if Length(p) = 2 then
     begin
-      a := Max(0, StrToIntDef(p[1], 0));
-      g_Corpses_SetMax(a)
+      {$IFDEF ENABLE_CORPSES}
+        a := Max(0, StrToIntDef(p[1], 0));
+        g_Corpses_SetMax(a)
+      {$ENDIF}
     end
     else if Length(p) = 1 then
     begin
-      e_LogWritefln('%s', [g_Corpses_GetMax()])
+      {$IFDEF ENABLE_CORPSES}
+        e_LogWritefln('%s', [g_Corpses_GetMax()])
+      {$ELSE}
+        e_LogWritefln('%s', [0])
+      {$ENDIF}
     end
     else
     begin
@@ -5881,8 +5949,8 @@ begin
   end
   else if cmd = 'screenshot' then
   begin
-    {$IFNDEF HEADLESS}
-      g_TakeScreenShot()
+    {$IFDEF ENABLE_RENDER}
+      g_TakeScreenShot;
     {$ENDIF}
   end
   else if (cmd = 'weapnext') or (cmd = 'weapprev') then
@@ -6167,7 +6235,7 @@ begin
         g_Game_Free();
         g_Game_Quit();
       end;
-{$IFNDEF HEADLESS}
+{$IFDEF ENABLE_RENDER}
     'r_reset':
          r_Render_Apply;
 {$ENDIF}
@@ -6216,7 +6284,7 @@ begin
   end;
 end;
 
-{$IFNDEF HEADLESS}
+{$IFDEF ENABLE_RENDER}
 procedure g_TakeScreenShot(Filename: string = '');
   var t: TDateTime; dir, date, name: String;
 begin