index 4e5697465bfc8b8c42ede7cc174ebc3e2dc07742..6c101a66d0fc65c148d18e7289dbd956a3718b46 100644 (file)
--- a/src/game/g_saveload.pas
+++ b/src/game/g_saveload.pas
interface
uses
interface
uses
- SysUtils, Classes,
- e_graphics, g_phys, g_textures;
+ SysUtils, Classes, g_phys, g_textures;
function g_GetSaveName (n: Integer; out valid: Boolean): AnsiString;
function g_GetSaveName (n: Integer; out valid: Boolean): AnsiString;
implementation
uses
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,
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,
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'
const
SAVE_SIGNATURE = $56534644; // 'DFSV'
end;
end;
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
function g_SaveGameTo (const filename: AnsiString; const aname: AnsiString; deleteOnError: Boolean=true): Boolean;
var
//if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('SAVE: current map is ''%s''...', [gCurrentMapFileName]);
utils.writeStr(st, gCurrentMapFileName);
// Ïóòü ê êàðòå
//if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('SAVE: current map is ''%s''...', [gCurrentMapFileName]);
utils.writeStr(st, gCurrentMapFileName);
// Ïóòü ê êàðòå
- utils.writeStr(st, gGameSettings.WAD);
+ utils.writeStr(st, ExtractFileName(gGameSettings.WAD));
// Èìÿ êàðòû
utils.writeStr(st, g_ExtractFileName(gMapInfo.Map));
// Êîëè÷åñòâî èãðîêîâ
// Èìÿ êàðòû
utils.writeStr(st, g_ExtractFileName(gMapInfo.Map));
// Êîëè÷åñòâî èãðîêîâ
// Ëèìèò âðåìåíè
utils.writeInt(st, Word(gGameSettings.TimeLimit));
// Ëèìèò î÷êîâ
// Ëèìèò âðåìåíè
utils.writeInt(st, Word(gGameSettings.TimeLimit));
// Ëèìèò î÷êîâ
- utils.writeInt(st, Word(gGameSettings.GoalLimit));
+ utils.writeInt(st, Word(gGameSettings.ScoreLimit));
// Ëèìèò æèçíåé
utils.writeInt(st, Byte(gGameSettings.MaxLives));
// Èãðîâûå îïöèè
// Ëèìèò æèçíåé
utils.writeInt(st, Byte(gGameSettings.MaxLives));
// Èãðîâûå îïöèè
WAD_Path, Map_Name: AnsiString;
nPlayers: Integer;
Game_Type, Game_Mode, Game_MaxLives: Byte;
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,
Game_Time, Game_Options: Cardinal;
Game_CoopMonstersKilled,
Game_CoopSecretsFound,
e_WriteLog('Loading saved game...', TMsgType.Notify);
e_WriteLog('Loading saved game...', TMsgType.Notify);
- {$IF DEFINED(D2F_DEBUG)}try{$ENDIF}
+{$IF DEFINED(D2F_DEBUG)}
+ try
+{$ENDIF}
//g_Game_Free(false); // don't free textures for the same map
g_Game_ClearLoading();
g_Game_SetLoadingText(_lc[I_LOAD_SAVE_FILE], 0, False);
//g_Game_Free(false); // don't free textures for the same map
g_Game_ClearLoading();
g_Game_SetLoadingText(_lc[I_LOAD_SAVE_FILE], 0, False);
// Ëèìèò âðåìåíè
Game_TimeLimit := utils.readWord(st);
// Ëèìèò î÷êîâ
// Ëèìèò âðåìåíè
Game_TimeLimit := utils.readWord(st);
// Ëèìèò î÷êîâ
- Game_GoalLimit := utils.readWord(st);
+ Game_ScoreLimit := utils.readWord(st);
// Ëèìèò æèçíåé
Game_MaxLives := utils.readByte(st);
// Èãðîâûå îïöèè
// Ëèìèò æèçíåé
Game_MaxLives := utils.readByte(st);
// Èãðîâûå îïöèè
gGameSettings.GameMode := Game_Mode;
gSwitchGameMode := Game_Mode;
gGameSettings.TimeLimit := Game_TimeLimit;
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');
gGameSettings.MaxLives := IfThen(Game_Mode = GM_CTF, 0, Game_MaxLives);
gGameSettings.Options := Game_Options;
end;
g_Game_ExecuteEvent('ongamestart');
- // Óñòàíîâêà ðàçìåðîâ îêîí èãðîêîâ
- g_Game_SetupScreenSize();
-
// Çàãðóçêà è çàïóñê êàðòû
// Çàãðóçêà è çàïóñê êàðòû
- if not g_Game_StartMap(WAD_Path+':\'+Map_Name, True, curmapfile) then
- begin
- g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [WAD_Path + ':\' + Map_Name]));
- exit;
- end;
+ //FIXME: save/load `asMegawad`
+ if not g_Game_StartMap(false{asMegawad}, WAD_Path+':\'+Map_Name, True, curmapfile) then
+ raise Exception.Create(Format(_lc[I_GAME_ERROR_MAP_LOAD], [WAD_Path + ':\' + Map_Name]));
// Íàñòðîéêè èãðîêîâ è áîòîâ
g_Player_Init();
// Íàñòðîéêè èãðîêîâ è áîòîâ
g_Player_Init();
// done
gLoadGameMode := false;
result := true;
// done
gLoadGameMode := false;
result := true;
- {$IF DEFINED(D2F_DEBUG)}
+{$IF DEFINED(D2F_DEBUG)}
except
begin
errpos := LongWord(st.position);
raise;
end;
end;
except
begin
errpos := LongWord(st.position);
raise;
end;
end;
- {$ENDIF}
+{$ENDIF}
finally
st.Free();
end;
finally
st.Free();
end;