DEADSOFTWARE

game: remove d_player (unused command)
[d2df-sdl.git] / src / game / g_saveload.pas
index 9ab49931944e1b9e8a2051d68083ba1699a8642e..5bf8974ae6aca186ffcc7e71f4bf078c7f1443ba 100644 (file)
@@ -18,8 +18,7 @@ unit g_saveload;
 interface
 
 uses
-  SysUtils, Classes,
-  e_graphics, g_phys, g_textures;
+  SysUtils, Classes, g_phys;
 
 
 function g_GetSaveName (n: Integer; out valid: Boolean): AnsiString;
@@ -37,11 +36,20 @@ procedure Obj_LoadState (o: PObj; st: TStream);
 implementation
 
 uses
+  {$IFDEF ENABLE_GIBS}
+    g_gibs,
+  {$ENDIF}
+  {$IFDEF ENABLE_CORPSES}
+    g_corpses,
+  {$ENDIF}
+  {$IFDEF ENABLE_SHELLS}
+    g_shells,
+  {$ENDIF}
   MAPDEF, utils, xstreams,
   g_game, g_items, g_map, g_monsters, g_triggers,
-  g_basic, g_main, Math, wadreader,
-  g_weapons, g_player, g_console,
-  e_log, e_res, g_language;
+  g_basic, Math, wadreader,
+  g_weapons, g_player, g_console, g_window,
+  e_log, e_res, g_language, g_options;
 
 const
   SAVE_SIGNATURE = $56534644; // 'DFSV'
@@ -161,6 +169,70 @@ begin
   end;
 end;
 
+procedure g_Player_Corpses_SaveState (st: TStream);
+  {$IFDEF ENABLE_CORPSES}
+    var i: Integer;
+  {$ENDIF}
+  var count: Integer;
+begin
+  count := 0;
+  {$IFDEF ENABLE_CORPSES}
+    for i := 0 to High(gCorpses) do
+      if (gCorpses[i] <> nil) then
+        Inc(count);
+  {$ENDIF}
+  utils.writeInt(st, LongInt(count));
+  {$IFDEF ENABLE_CORPSES}
+    if count > 0 then
+    begin
+      for i := 0 to High(gCorpses) do
+      begin
+        if gCorpses[i] <> nil then
+        begin
+          utils.writeStr(st, gCorpses[i].Model.GetName());
+          utils.writeBool(st, gCorpses[i].Mess);
+          gCorpses[i].SaveState(st);
+        end;
+      end;
+    end;
+  {$ENDIF}
+end;
+
+procedure g_Player_Corpses_LoadState (st: TStream);
+  {$IFDEF ENABLE_CORPSES}
+    var str: String; b: Boolean; i: Integer;
+  {$ENDIF}
+  var count: Integer;
+begin
+  assert(st <> nil);
+
+  {$IFDEF ENABLE_GIBS}
+    g_Gibs_RemoveAll;
+  {$ENDIF}
+  {$IFDEF ENABLE_SHELLS}
+    g_Shells_RemoveAll; // ???
+  {$ENDIF}
+  {$IFDEF ENABLE_CORPSES}
+    g_Corpses_RemoveAll;
+  {$ENDIF}
+
+  count := utils.readLongInt(st);
+
+  {$IFDEF ENABLE_CORPSES}
+    if (count < 0) or (count > Length(gCorpses)) then
+      raise XStreamError.Create('invalid number of corpses');
+    for i := 0 to count - 1 do
+    begin
+      str := utils.readStr(st);
+      b := utils.readBool(st);
+      gCorpses[i] := TCorpse.Create(0, 0, str, b);
+      gCorpses[i].LoadState(st);
+    end;
+  {$ELSE}
+    if count <> 0 then
+      raise XStreamError.Create('corpses not supported in this version');
+  {$ENDIF}
+end;
 
 function g_SaveGameTo (const filename: AnsiString; const aname: AnsiString; deleteOnError: Boolean=true): Boolean;
 var
@@ -194,7 +266,7 @@ begin
       // Ëèìèò âðåìåíè
       utils.writeInt(st, Word(gGameSettings.TimeLimit));
       // Ëèìèò î÷êîâ
-      utils.writeInt(st, Word(gGameSettings.GoalLimit));
+      utils.writeInt(st, Word(gGameSettings.ScoreLimit));
       // Ëèìèò æèçíåé
       utils.writeInt(st, Byte(gGameSettings.MaxLives));
       // Èãðîâûå îïöèè
@@ -291,7 +363,7 @@ var
   WAD_Path, Map_Name: AnsiString;
   nPlayers: Integer;
   Game_Type, Game_Mode, Game_MaxLives: Byte;
-  Game_TimeLimit, Game_GoalLimit: Word;
+  Game_TimeLimit, Game_ScoreLimit: Word;
   Game_Time, Game_Options: Cardinal;
   Game_CoopMonstersKilled,
   Game_CoopSecretsFound,
@@ -353,7 +425,7 @@ begin
         // Ëèìèò âðåìåíè
         Game_TimeLimit := utils.readWord(st);
         // Ëèìèò î÷êîâ
-        Game_GoalLimit := utils.readWord(st);
+        Game_ScoreLimit := utils.readWord(st);
         // Ëèìèò æèçíåé
         Game_MaxLives := utils.readByte(st);
         // Èãðîâûå îïöèè
@@ -395,15 +467,12 @@ begin
           gGameSettings.GameMode := Game_Mode;
           gSwitchGameMode := Game_Mode;
           gGameSettings.TimeLimit := Game_TimeLimit;
-          gGameSettings.GoalLimit := Game_GoalLimit;
+          gGameSettings.ScoreLimit := Game_ScoreLimit;
           gGameSettings.MaxLives := IfThen(Game_Mode = GM_CTF, 0, Game_MaxLives);
           gGameSettings.Options := Game_Options;
         end;
         g_Game_ExecuteEvent('ongamestart');
 
-        // Óñòàíîâêà ðàçìåðîâ îêîí èãðîêîâ
-        g_Game_SetupScreenSize();
-
         // Çàãðóçêà è çàïóñê êàðòû
         //FIXME: save/load `asMegawad`
         if not g_Game_StartMap(false{asMegawad}, WAD_Path+':\'+Map_Name, True, curmapfile) then