X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_saveload.pas;h=5a130981eae9232f2e22269e20275397098f1829;hb=6d6df4e3427cd01e03e172984c9d0d391ff38032;hp=f020b9bb69bc77aba28390dd431c50d1c3695550;hpb=0a0eae3ded9e0155ed17dc6990edf8fa836300c0;p=d2df-sdl.git diff --git a/src/game/g_saveload.pas b/src/game/g_saveload.pas index f020b9b..5a13098 100644 --- a/src/game/g_saveload.pas +++ b/src/game/g_saveload.pas @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *) -{$MODE DELPHI} +{$INCLUDE ../shared/a_modes.inc} unit g_saveload; interface @@ -27,12 +27,22 @@ 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 @@ -42,6 +52,44 @@ const 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; @@ -359,6 +407,8 @@ begin g_Game_SetLoadingText(_lc[I_LOAD_SAVE_FILE], 0, False); gLoadGameMode := True; + g_CallPreLoadHooks(); + ///// Çàãðóæàåì ñîñòîÿíèå èãðû: ///// bMem := TBinMemoryReader.Create(); bFile.ReadMemory(bMem); @@ -565,12 +615,13 @@ begin ///// ///// // Èùåì òðèããåðû ñ óñëîâèåì ñìåðòè ìîíñòðîâ: - if (gMonsters <> nil) and (gTriggers <> nil) then + if {(gMonsters <> nil) and} (gTriggers <> nil) then g_Map_ReAdd_DieTriggers(); // Çàêðûâàåì ôàéë çàãðóçêè: bFile.Close(); gLoadGameMode := False; + g_CallPostLoadHooks(); Result := True; except