X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_saveload.pas;h=f513f3af436b32fa27482cd5ab9eb6d00e783c36;hb=bfaf1009ecc9e4f60b693e692abd3ea458fb6571;hp=9ab49931944e1b9e8a2051d68083ba1699a8642e;hpb=99a57df78284d22ac1f888471a63e730a8a157d4;p=d2df-sdl.git diff --git a/src/game/g_saveload.pas b/src/game/g_saveload.pas index 9ab4993..f513f3a 100644 --- a/src/game/g_saveload.pas +++ b/src/game/g_saveload.pas @@ -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,17 @@ procedure Obj_LoadState (o: PObj; st: TStream); implementation uses + {$IFDEF ENABLE_GIBS} + g_gibs, + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + g_corpses, + {$ENDIF} MAPDEF, utils, xstreams, g_game, g_items, g_map, g_monsters, g_triggers, - g_basic, g_main, Math, wadreader, + g_basic, Math, wadreader, g_weapons, g_player, g_console, - e_log, e_res, g_language; + e_log, e_res, g_language, g_options; const SAVE_SIGNATURE = $56534644; // 'DFSV' @@ -161,6 +166,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 ENALBE_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 +263,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 +360,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 +422,7 @@ begin // Ëèìèò âðåìåíè Game_TimeLimit := utils.readWord(st); // Ëèìèò î÷êîâ - Game_GoalLimit := utils.readWord(st); + Game_ScoreLimit := utils.readWord(st); // Ëèìèò æèçíåé Game_MaxLives := utils.readByte(st); // Èãðîâûå îïöèè @@ -395,15 +464,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