X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_saveload.pas;h=93c392ce8804dc298ccdbc9b9a5fa9be42037392;hb=dd969f579db2bf70f6ddfcb5d377b2b95b994a6e;hp=e6a1ca293344ca1b603ff026a4fbc514c0ee7f54;hpb=fb2545cc618f2ffe256ab3bc0173b063382c8887;p=d2df-sdl.git diff --git a/src/game/g_saveload.pas b/src/game/g_saveload.pas index e6a1ca2..93c392c 100644 --- a/src/game/g_saveload.pas +++ b/src/game/g_saveload.pas @@ -21,75 +21,30 @@ 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 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' -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;