X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_saveload.pas;h=a54e26be05338c02430c418a9954762f1091a213;hb=2fa77a7c9667395ef6d4141cde69ff6349bf301e;hp=5a130981eae9232f2e22269e20275397098f1829;hpb=464487c1d25e23004bbd30a1246f54561f584943;p=d2df-sdl.git diff --git a/src/game/g_saveload.pas b/src/game/g_saveload.pas index 5a13098..a54e26b 100644 --- a/src/game/g_saveload.pas +++ b/src/game/g_saveload.pas @@ -21,21 +21,13 @@ interface 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); -type - TLoadSaveHook = procedure (); - -procedure g_SetPreLoadHook (ahook: TLoadSaveHook); -procedure g_SetPostLoadHook (ahook: TLoadSaveHook); - -procedure g_CallPreLoadHooks (); -procedure g_CallPostLoadHooks (); - implementation @@ -47,49 +39,12 @@ uses const SAVE_SIGNATURE = $56534644; // 'DFSV' - SAVE_VERSION = $03; + SAVE_VERSION = $04; END_MARKER_STRING = 'END'; PLAYER_VIEW_SIGNATURE = $57564C50; // 'PLVW' OBJ_SIGNATURE = $4A424F5F; // '_OBJ' -var - preloadHooks: array of TLoadSaveHook = nil; - postloadHooks: array of TLoadSaveHook = nil; - - -procedure g_SetPreLoadHook (ahook: TLoadSaveHook); -begin - if not assigned(ahook) then exit; - SetLength(preloadHooks, Length(preloadHooks)+1); - preloadHooks[High(preloadHooks)] := ahook; -end; - - -procedure g_SetPostLoadHook (ahook: TLoadSaveHook); -begin - if not assigned(ahook) then exit; - SetLength(postloadHooks, Length(postloadHooks)+1); - postloadHooks[High(postloadHooks)] := ahook; -end; - - -procedure g_CallPreLoadHooks (); -var - f: Integer; -begin - for f := 0 to High(preloadHooks) do preloadHooks[f](); -end; - - -procedure g_CallPostLoadHooks (); -var - f: Integer; -begin - for f := 0 to High(postloadHooks) do postloadHooks[f](); -end; - - procedure Obj_SaveState(o: PObj; var Mem: TBinMemoryWriter); var sig: DWORD; @@ -211,6 +166,9 @@ begin 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); @@ -385,6 +343,8 @@ var Game_CoopTotalSecrets, PID1, PID2: Word; i: Integer; + gameCleared: Boolean = false; + curmapfile: AnsiString = ''; begin Result := False; bMem := nil; @@ -401,19 +361,27 @@ begin 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); gLoadGameMode := True; - g_CallPreLoadHooks(); - ///// Çàãðóæàåì ñîñòîÿíèå èãðû: ///// bMem := TBinMemoryReader.Create(); 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); // Èìÿ êàðòû: @@ -491,7 +459,7 @@ begin 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; @@ -621,7 +589,6 @@ begin // Çàêðûâàåì ôàéë çàãðóçêè: bFile.Close(); gLoadGameMode := False; - g_CallPostLoadHooks(); Result := True; except @@ -629,11 +596,13 @@ begin 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;