index aaf01b5efd86bcac97a56a56f64787127644bc6d..93c392ce8804dc298ccdbc9b9a5fa9be42037392 100644 (file)
--- a/src/game/g_saveload.pas
+++ b/src/game/g_saveload.pas
uses
e_graphics, g_phys, g_textures, BinEditor;
+
function g_GetSaveName(n: Integer): String;
function g_SaveGame(n: Integer; Name: String): Boolean;
function g_LoadGame(n: Integer): Boolean;
procedure Obj_SaveState(o: PObj; var Mem: TBinMemoryWriter);
procedure Obj_LoadState(o: PObj; var Mem: TBinMemoryReader);
+
implementation
uses
g_game, g_items, g_map, g_monsters, g_triggers,
g_basic, g_main, SysUtils, Math, wadreader,
- MAPSTRUCT, MAPDEF, g_weapons, g_player, g_console,
+ MAPDEF, g_weapons, g_player, g_console,
e_log, g_language;
const
SAVE_SIGNATURE = $56534644; // 'DFSV'
- SAVE_VERSION = $03;
+ SAVE_VERSION = $06;
END_MARKER_STRING = 'END';
PLAYER_VIEW_SIGNATURE = $57564C50; // 'PLVW'
OBJ_SIGNATURE = $4A424F5F; // '_OBJ'
+
procedure Obj_SaveState(o: PObj; var Mem: TBinMemoryWriter);
var
sig: DWORD;
bMem := TBinMemoryWriter.Create(256);
// Èìÿ èãðû:
bMem.WriteString(Name, 32);
+ // Ïîëíûé ïóòü ê âàäó è êàðòà
+ if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('SAVE: current map is ''%s''...', [gCurrentMapFileName]);
+ bMem.WriteString(gCurrentMapFileName);
// Ïóòü ê êàðòå:
str := gGameSettings.WAD;
bMem.WriteString(str, 128);
Game_CoopTotalSecrets,
PID1, PID2: Word;
i: Integer;
+ gameCleared: Boolean = false;
+ curmapfile: AnsiString = '';
begin
Result := False;
bMem := nil;
end;
e_WriteLog('Loading saved game...', MSG_NOTIFY);
- g_Game_Free();
+ //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);
bFile.ReadMemory(bMem);
// Èìÿ èãðû:
bMem.ReadString(str);
+
+ // Ïîëíûé ïóòü ê âàäó è êàðòà
+ bMem.ReadString(curmapfile);
+
+ if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('LOAD: previous map was ''%s''...', [gCurrentMapFileName]);
+ if (Length(curmapfile) <> 0) then e_LogWritefln('LOAD: new map is ''%s''...', [curmapfile]);
+ // À âîò òóò, íàêîíåö, ÷èñòèì ðåñóðñû
+ g_Game_Free(curmapfile <> gCurrentMapFileName); // don't free textures for the same map
+ gameCleared := true;
+
// Ïóòü ê êàðòå:
bMem.ReadString(WAD_Path);
// Èìÿ êàðòû:
g_Game_SetupScreenSize();
// Çàãðóçêà è çàïóñê êàðòû:
- if not g_Game_StartMap(WAD_Path + ':\' + Map_Name, True) then
+ 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;
begin
g_Console_Add(_lc[I_GAME_ERROR_LOAD]);
e_WriteLog('LoadState I/O Error: '+E1.Message, MSG_WARNING);
+ if not gameCleared then g_Game_Free();
end;
on E2: EBinSizeError do
begin
g_Console_Add(_lc[I_GAME_ERROR_LOAD]);
e_WriteLog('LoadState Size Error: '+E2.Message, MSG_WARNING);
+ if not gameCleared then g_Game_Free();
end;
end;