index f020b9bb69bc77aba28390dd431c50d1c3695550..e6a1ca293344ca1b603ff026a4fbc514c0ee7f54 100644 (file)
--- a/src/game/g_saveload.pas
+++ b/src/game/g_saveload.pas
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*)
-{$MODE DELPHI}
+{$INCLUDE ../shared/a_modes.inc}
unit g_saveload;
interface
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
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;
g_Game_SetLoadingText(_lc[I_LOAD_SAVE_FILE], 0, False);
gLoadGameMode := True;
+ g_CallPreLoadHooks();
+
///// Çàãðóæàåì ñîñòîÿíèå èãðû: /////
bMem := TBinMemoryReader.Create();
bFile.ReadMemory(bMem);
///// /////
// Èùåì òðèããåðû ñ óñëîâèåì ñìåðòè ìîíñòðîâ:
- 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