Added a debug message about missing art file for critters

Minor edit to sfall.h.
This commit is contained in:
NovaRain
2019-10-25 10:21:01 +08:00
parent 20119daf3d
commit a6c09d4d5c
4 changed files with 31 additions and 8 deletions
+6 -5
View File
@@ -260,8 +260,8 @@
#define dialog_message(text) sfall_func1("dialog_message", text) #define dialog_message(text) sfall_func1("dialog_message", text)
#define dialog_obj sfall_func0("dialog_obj") #define dialog_obj sfall_func0("dialog_obj")
#define display_stats sfall_func0("display_stats") #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(pathFile, frame, x, y, noTrans) sfall_func5("draw_image", pathFile, frame, x, y, noTrans)
#define draw_image_scaled(frmFile, frame, x, y, w, h) sfall_func6("draw_image_scaled", frmFile, frame, x, y, w, h) #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 exec_map_update_scripts sfall_func0("exec_map_update_scripts")
#define floor2(value) sfall_func1("floor2", value) #define floor2(value) sfall_func1("floor2", value)
#define get_can_rest_on_map(map, elev) sfall_func2("get_can_rest_on_map", map, elev) #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_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_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_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_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_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) #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_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_heal_time(time) sfall_func1("set_rest_heal_time", time)
#define set_rest_mode(mode) sfall_func1("set_rest_mode", mode) #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 set_unique_id(obj) sfall_func1("set_unique_id", obj)
#define unset_unique_id(obj) sfall_func2("set_unique_id", obj, -1) #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) #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 tile_refresh_display sfall_func0("tile_refresh_display")
#define unjam_lock(obj) sfall_func1("unjam_lock", obj) #define unjam_lock(obj) sfall_func1("unjam_lock", obj)
#define unwield_slot(critter, slot) sfall_func2("unwield_slot", critter, slot) #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)
+20
View File
@@ -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() { static void __declspec(naked) win_debug_hook() {
__asm { __asm {
call fo::funcoffs::debug_log_; call fo::funcoffs::debug_log_;
@@ -345,6 +362,9 @@ void DebugModePatch() {
if (iniGetInt("Debugging", "HideObjIsNullMsg", 0, ::sfall::ddrawIni)) { if (iniGetInt("Debugging", "HideObjIsNullMsg", 0, ::sfall::ddrawIni)) {
MakeJump(0x453FD2, dbg_error_hack); 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); dlogr(" Done", DL_INIT);
} }
} }
+1 -2
View File
@@ -219,7 +219,7 @@ static void InitModules() {
static const DWORD loadFunc = 0x4FE1D0; static const DWORD loadFunc = 0x4FE1D0;
static void LoadHRPModule() { static void LoadHRPModule() {
HMODULE dll; HMODULE dll;
__asm call loadFunc; // load HRP dll __asm call loadFunc; // get HRP loading address
__asm mov dll, eax; __asm mov dll, eax;
if (dll != NULL) hrpDLLBaseAddr = (DWORD)dll; if (dll != NULL) hrpDLLBaseAddr = (DWORD)dll;
dlog_f("Loaded f2_res.dll library at the memory address: 0x%x\n", DL_MAIN, 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 hrpIsEnabled = (*(DWORD*)0x4E4480 != 0x278805C7); // check if HRP is enabled
if (hrpIsEnabled) { if (hrpIsEnabled) {
BlockCall(0x4E4480);
LoadHRPModule(); LoadHRPModule();
if (strncmp((const char*)HRPAddressOffset(0x39940), "4.1.8", 5) == 0) hrpVersionValid = true; if (strncmp((const char*)HRPAddressOffset(0x39940), "4.1.8", 5) == 0) hrpVersionValid = true;
} }
+4 -1
View File
@@ -69,7 +69,10 @@ namespace sfall
#define isDebug false #define isDebug false
#endif #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 pushadc __asm push eax __asm push edx __asm push ecx
#define popadc __asm pop ecx __asm pop edx __asm pop eax #define popadc __asm pop ecx __asm pop edx __asm pop eax