From fdfb4c3a17987319c70c94ed660a1df8f249a579 Mon Sep 17 00:00:00 2001 From: NovaRain Date: Wed, 19 May 2021 10:18:50 +0800 Subject: [PATCH] Corrected code for initializing attached script (create_object_sid, #378) --- sfall/BugFixes.cpp | 3 +++ sfall/FalloutFuncOffs_def.h | 1 + sfall/LoadGameHook.cpp | 19 +++++++++++++++++++ sfall/LoadGameHook.h | 2 ++ 4 files changed, 25 insertions(+) diff --git a/sfall/BugFixes.cpp b/sfall/BugFixes.cpp index f7b69434..bc9e4e71 100644 --- a/sfall/BugFixes.cpp +++ b/sfall/BugFixes.cpp @@ -2980,6 +2980,9 @@ static void __declspec(naked) op_create_object_sid_hack() { mov eax, esi; retn; init: + call IsMapLoading; + test al, al; + jnz end; // yes - initialization will be performed by engine functions cmp createObjectSidStartFix, 0; jne runStart; call InitScript; diff --git a/sfall/FalloutFuncOffs_def.h b/sfall/FalloutFuncOffs_def.h index 8ba4e4a3..a686d623 100644 --- a/sfall/FalloutFuncOffs_def.h +++ b/sfall/FalloutFuncOffs_def.h @@ -370,6 +370,7 @@ FUNC(map_enable_bk_processes_, 0x4820C0) FUNC(map_exit_, 0x482084) FUNC(map_get_short_name_, 0x48261C) FUNC(map_load_, 0x482A68) +FUNC(map_load_file_, 0x482B74) FUNC(map_load_idx_, 0x482B34) FUNC(map_set_elevation_, 0x482158) FUNC(mem_free_, 0x4C5C24) diff --git a/sfall/LoadGameHook.cpp b/sfall/LoadGameHook.cpp index 4efce2b9..de444327 100644 --- a/sfall/LoadGameHook.cpp +++ b/sfall/LoadGameHook.cpp @@ -71,9 +71,14 @@ static DWORD saveInCombatFix; static bool disableHorrigan = false; static bool pipBoyAvailableAtGameStart = false; static bool gameLoaded = false; +static bool onLoadingMap = false; long gameInterfaceWID = -1; +bool IsMapLoading() { + return onLoadingMap; +} + // True if game was started, false when on the main menu bool IsGameLoaded() { return gameLoaded; @@ -451,6 +456,16 @@ static void __declspec(naked) game_close_hook() { } } + +static void __declspec(naked) map_load_hook() { + __asm { + mov onLoadingMap, 1; + call map_load_file_; + mov onLoadingMap, 0; + retn; + } +} + static void __declspec(naked) WorldMapHook_Start() { __asm { call wmInterfaceInit_; @@ -775,14 +790,17 @@ void LoadGameHook_Init() { disableHorrigan = true; } + HookCall(0x482AEC, map_load_hook); HookCall(0x4809BA, main_init_system_hook); HookCall(0x4426A6, game_init_hook); HookCall(0x480AAE, main_load_new_hook); + const DWORD loadGameAddr[] = {0x443AE4, 0x443B89, 0x480B77, 0x48FD35}; HookCalls(LoadGame_hook, loadGameAddr); SafeWrite32(0x5194C0, (DWORD)&EndLoadHook); const DWORD saveGameAddr[] = {0x443AAC, 0x443B1C, 0x48FCFF}; HookCalls(SaveGame_hook, saveGameAddr); + const DWORD gameResetAddr[] = { 0x47DD6B, // LoadSlot_ (on load error) 0x47DDF3, // LoadSlot_ (on load error) @@ -797,6 +815,7 @@ void LoadGameHook_Init() { }; HookCalls(game_reset_hook, gameResetAddr); HookCall(0x47F491, game_reset_on_load_hook); // PrepLoad_ (the very first step during save game loading) + const DWORD beforeGameExitAddr[] = {0x480ACE, 0x480BC7}; // gnw_main_ HookCalls(before_game_exit_hook, beforeGameExitAddr); const DWORD afterGameExitAddr[] = {0x480AEB, 0x480BE4}; // gnw_main_ diff --git a/sfall/LoadGameHook.h b/sfall/LoadGameHook.h index 7cf67f1f..9101e1bd 100644 --- a/sfall/LoadGameHook.h +++ b/sfall/LoadGameHook.h @@ -22,6 +22,8 @@ extern long gameInterfaceWID; void LoadGameHook_Init(); +bool IsMapLoading(); + // True if game was started, false when on the main menu bool IsGameLoaded();