diff --git a/artifacts/scripting/headers/sfall.h b/artifacts/scripting/headers/sfall.h index 058f449e..999c1b57 100644 --- a/artifacts/scripting/headers/sfall.h +++ b/artifacts/scripting/headers/sfall.h @@ -260,8 +260,8 @@ #define dialog_message(text) sfall_func1("dialog_message", text) #define dialog_obj sfall_func0("dialog_obj") #define display_stats sfall_func0("display_stats") -#define draw_image(frmFile, frame, x, y, noTransparent) sfall_func5("draw_image", frmFile, frame, x, y, noTransparent) -#define draw_image_scaled(frmFile, frame, x, y, w, h) sfall_func6("draw_image_scaled", frmFile, frame, x, y, w, h) +#define draw_image(pathFile, frame, x, y, noTrans) sfall_func5("draw_image", pathFile, frame, x, y, noTrans) +#define draw_image_scaled(pathFile, frame, x, y, w, h) sfall_func6("draw_image_scaled", pathFile, frame, x, y, w, h) #define exec_map_update_scripts sfall_func0("exec_map_update_scripts") #define floor2(value) sfall_func1("floor2", value) #define get_can_rest_on_map(map, elev) sfall_func2("get_can_rest_on_map", map, elev) @@ -297,8 +297,6 @@ #define set_cursor_mode(mode) sfall_func1("set_cursor_mode", mode) #define set_drugs_data(type, pid, value) sfall_func3("set_drugs_data", type, pid, value) #define set_dude_obj(critter) sfall_func1("set_dude_obj", critter) -#define set_fake_perk_npc(npc, perk, level, image, desc) sfall_func5("set_fake_perk_npc", npc, perk, level, image, desc) -#define set_fake_trait_npc(npc, trait, active, image, desc) sfall_func5("set_fake_trait_npc", npc, trait, active, image, desc) #define set_flags(obj, flags) sfall_func2("set_flags", obj, flags) #define set_iface_tag_text(tag, text, color) sfall_func3("set_iface_tag_text", tag, text, color) #define set_ini_setting(setting, value) sfall_func2("set_ini_setting", setting, value) @@ -307,7 +305,6 @@ #define set_outline(obj, color) sfall_func2("set_outline", obj, color) #define set_rest_heal_time(time) sfall_func1("set_rest_heal_time", time) #define set_rest_mode(mode) sfall_func1("set_rest_mode", mode) -#define set_selectable_perk_npc(npc, perk, active, image, desc) sfall_func5("set_selectable_perk_npc", npc, perk, active, image, desc) #define set_unique_id(obj) sfall_func1("set_unique_id", obj) #define unset_unique_id(obj) sfall_func2("set_unique_id", obj, -1) #define set_unjam_locks_time(time) sfall_func1("set_unjam_locks_time", time) @@ -315,3 +312,7 @@ #define tile_refresh_display sfall_func0("tile_refresh_display") #define unjam_lock(obj) sfall_func1("unjam_lock", obj) #define unwield_slot(critter, slot) sfall_func2("unwield_slot", critter, slot) + +#define set_fake_perk_npc(npc, perk, level, image, desc) sfall_func5("set_fake_perk_npc", npc, perk, level, image, desc) +#define set_fake_trait_npc(npc, trait, active, image, desc) sfall_func5("set_fake_trait_npc", npc, trait, active, image, desc) +#define set_selectable_perk_npc(npc, perk, active, image, desc) sfall_func5("set_selectable_perk_npc", npc, perk, active, image, desc) diff --git a/sfall/Modules/DebugEditor.cpp b/sfall/Modules/DebugEditor.cpp index 8b93b6e0..8715e3b5 100644 --- a/sfall/Modules/DebugEditor.cpp +++ b/sfall/Modules/DebugEditor.cpp @@ -310,6 +310,23 @@ hide: } } +static char* artDbgMsg = "Error: file not found: %s\n"; +static void __declspec(naked) art_data_size_hook() { + __asm { + test edi, edi; + jz artNotExist; + retn; +artNotExist: + mov eax, [esp + 0x124 - 0x1C + 4]; // filename + push eax; + push artDbgMsg; + call fo::funcoffs::debug_printf_; + add esp, 8; + BREAKPOINT; // break program + retn; + } +} + static void __declspec(naked) win_debug_hook() { __asm { call fo::funcoffs::debug_log_; @@ -345,6 +362,9 @@ void DebugModePatch() { if (iniGetInt("Debugging", "HideObjIsNullMsg", 0, ::sfall::ddrawIni)) { MakeJump(0x453FD2, dbg_error_hack); } + // prints a debug message about missing art file for critters and interrupts game execution + HookCall(0x419B65, art_data_size_hook); + dlogr(" Done", DL_INIT); } } diff --git a/sfall/main.cpp b/sfall/main.cpp index 5028d3e4..107862fc 100644 --- a/sfall/main.cpp +++ b/sfall/main.cpp @@ -219,7 +219,7 @@ static void InitModules() { static const DWORD loadFunc = 0x4FE1D0; static void LoadHRPModule() { HMODULE dll; - __asm call loadFunc; // load HRP dll + __asm call loadFunc; // get HRP loading address __asm mov dll, eax; if (dll != NULL) hrpDLLBaseAddr = (DWORD)dll; dlog_f("Loaded f2_res.dll library at the memory address: 0x%x\n", DL_MAIN, dll); @@ -322,7 +322,6 @@ defaultIni: hrpIsEnabled = (*(DWORD*)0x4E4480 != 0x278805C7); // check if HRP is enabled if (hrpIsEnabled) { - BlockCall(0x4E4480); LoadHRPModule(); if (strncmp((const char*)HRPAddressOffset(0x39940), "4.1.8", 5) == 0) hrpVersionValid = true; } diff --git a/sfall/main.h b/sfall/main.h index 82d82441..43ca9509 100644 --- a/sfall/main.h +++ b/sfall/main.h @@ -69,7 +69,10 @@ namespace sfall #define isDebug false #endif -// Macros for quick replacement of pushad/popad assembler opcodes +// Trap for Debugger +#define BREAKPOINT __asm int 3 + +// Macros for quick replacement of assembler opcodes pushad/popad #define pushadc __asm push eax __asm push edx __asm push ecx #define popadc __asm pop ecx __asm pop edx __asm pop eax