index aaf01b5efd86bcac97a56a56f64787127644bc6d..e6a1ca293344ca1b603ff026a4fbc514c0ee7f54 100644 (file)
--- a/src/game/g_saveload.pas
+++ b/src/game/g_saveload.pas
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);
// Çàêðûâàåì ôàéë çàãðóçêè:
bFile.Close();
gLoadGameMode := False;
+ g_CallPostLoadHooks();
Result := True;
except