diff --git a/artifacts/scripting/headers/sfall.h b/artifacts/scripting/headers/sfall.h index a8aa6862..dec58d77 100644 --- a/artifacts/scripting/headers/sfall.h +++ b/artifacts/scripting/headers/sfall.h @@ -238,6 +238,12 @@ #define ADD_PERK_MODE_PERK (2) // add to the player's perks #define ADD_PERK_MODE_REMOVE (4) // remove from the list of selectable perks (after added to the player) +// instantly apply the item to dude_obj (w/o animation) +#define use_item_on_dude(item) set_self(dude_obj); \ + set_self(dude_obj); \ + use_obj_on_obj(item, dude_obj); \ + set_self(0) + // sfall_funcX macros #define add_global_timer_event(time, fixedParam) sfall_func2("add_g_timer_event", time, fixedParam) #define add_iface_tag sfall_func0("add_iface_tag") diff --git a/sfall/Animations.cpp b/sfall/Animations.cpp index 9a63d925..e8db4879 100644 --- a/sfall/Animations.cpp +++ b/sfall/Animations.cpp @@ -188,9 +188,9 @@ static DWORD __fastcall CheckSetSad(BYTE openFlag, DWORD valueMul) { return result; } -static const DWORD object_move_back0 = 0x417611; -static const DWORD object_move_back1 = 0x417616; static void __declspec(naked) object_move_hack() { + static const DWORD object_move_back0 = 0x417611; + static const DWORD object_move_back1 = 0x417616; __asm { mov ecx, ds:[ecx + 0x3C]; // openFlag mov edx, [esp + 0x4C - 0x20]; // valueMul diff --git a/sfall/BarBoxes.cpp b/sfall/BarBoxes.cpp index f3f33f2b..1716e558 100644 --- a/sfall/BarBoxes.cpp +++ b/sfall/BarBoxes.cpp @@ -55,9 +55,9 @@ static const DWORD bboxSlotAddr[] = { 0x4616F7, 0x46170F, 0x461736, 0x4616B1, 0x46151D, 0x4615B3 }; -static const DWORD DisplayBoxesRet1 = 0x4615A8; -static const DWORD DisplayBoxesRet2 = 0x4615BE; static void __declspec(naked) DisplayBoxesHack() { + static const DWORD DisplayBoxesRet1 = 0x4615A8; + static const DWORD DisplayBoxesRet2 = 0x4615BE; __asm { mov edx, [boxText]; xor ebx, ebx; @@ -109,8 +109,8 @@ skip: } } -static const DWORD SetIndexBoxRet = 0x4612E8; static void __declspec(naked) BarBoxesIndexHack() { + static const DWORD SetIndexBoxRet = 0x4612E8; __asm { mov eax, ds:[0x4612E2]; // fontnum mov ecx, setBoxIndex; // start index @@ -119,9 +119,9 @@ static void __declspec(naked) BarBoxesIndexHack() { } } -static const DWORD SizeLoopBoxRet = 0x461477; -static const DWORD ExitLoopBoxRet = 0x461498; static void __declspec(naked) BarBoxesSizeHack() { + static const DWORD SizeLoopBoxRet = 0x461477; + static const DWORD ExitLoopBoxRet = 0x461498; __asm { cmp edx, sizeBox; jz exitLoop; diff --git a/sfall/Books.cpp b/sfall/Books.cpp index 387618d1..b0f163f3 100644 --- a/sfall/Books.cpp +++ b/sfall/Books.cpp @@ -42,8 +42,8 @@ static sBook* __fastcall FindBook(DWORD pid) { return 0; } -static const DWORD obj_use_book_hook_back = 0x49BA5A; static void __declspec(naked) obj_use_book_hook() { + static const DWORD obj_use_book_hook_back = 0x49BA5A; __asm { mov edi, -1; mov ecx, eax; diff --git a/sfall/BurstMods.cpp b/sfall/BurstMods.cpp index cd30ee9d..21c43b1e 100644 --- a/sfall/BurstMods.cpp +++ b/sfall/BurstMods.cpp @@ -45,8 +45,8 @@ static long __fastcall ComputeSpray(DWORD* roundsLeftOut, DWORD* roundsRightOut, return (result % compute_spray_target_div) ? ++roundsMainTarget : roundsMainTarget; // if remainder then round up } -static const DWORD compute_spray_rounds_back = 0x42353A; static void __declspec(naked) compute_spray_rounds_distribution() { + static const DWORD compute_spray_rounds_back = 0x42353A; __asm { push ecx; lea ecx, [esp + 8 + 4]; // roundsLeft - out diff --git a/sfall/Combat.cpp b/sfall/Combat.cpp index 068ed8c8..7b10d096 100644 --- a/sfall/Combat.cpp +++ b/sfall/Combat.cpp @@ -85,9 +85,9 @@ static void _stdcall CombatBlocked() { DisplayConsoleMessage(combatBlockedMessage); } -static const DWORD BlockCombatHook1Ret1 = 0x45F6AF; -static const DWORD BlockCombatHook1Ret2 = 0x45F6D7; static void __declspec(naked) intface_use_item_hook() { + static const DWORD BlockCombatHook1Ret1 = 0x45F6AF; + static const DWORD BlockCombatHook1Ret2 = 0x45F6D7; __asm { cmp combatDisabled, 0; jne block; @@ -162,9 +162,9 @@ static void __declspec(naked) ai_search_inven_weap_hook() { } // switch weapon mode from secondary to primary if there is not enough ammo to shoot -static const DWORD ai_try_attack_search_ammo = 0x42AA1E; -static const DWORD ai_try_attack_continue = 0x42A929; static void __declspec(naked) ai_try_attack_hook() { + static const DWORD ai_try_attack_search_ammo = 0x42AA1E; + static const DWORD ai_try_attack_continue = 0x42A929; __asm { mov ebx, [esp + 0x364 - 0x38]; // hit mode cmp ebx, 3; // ATKTYPE_RWEAPON_SECONDARY @@ -247,8 +247,8 @@ static void __declspec(naked) compute_damage_hack() { } } -static const DWORD KnockbackRetAddr = 0x4136E1; static void __declspec(naked) compute_dmg_damage_hack() { + static const DWORD KnockbackRetAddr = 0x4136E1; __asm { push ecx push esi; // Target @@ -418,9 +418,9 @@ static int __fastcall AimedShotTest(DWORD pid) { return 0; } -static const DWORD aimedShotRet1 = 0x478EE4; -static const DWORD aimedShotRet2 = 0x478EEA; static void __declspec(naked) item_w_called_shot_hook() { + static const DWORD aimedShotRet1 = 0x478EE4; + static const DWORD aimedShotRet2 = 0x478EEA; __asm { push edx; mov ecx, edx; // item diff --git a/sfall/Console.cpp b/sfall/Console.cpp index eefa5df8..47d7b652 100644 --- a/sfall/Console.cpp +++ b/sfall/Console.cpp @@ -28,8 +28,8 @@ static void __stdcall ConsoleFilePrint(const char* msg) { consoleFile << msg << std::endl; } -static const DWORD ConsoleHookRet = 0x431871; static void __declspec(naked) ConsoleHook() { + static const DWORD ConsoleHookRet = 0x431871; __asm { pushadc; push eax; diff --git a/sfall/DebugEditor.cpp b/sfall/DebugEditor.cpp index f2431e60..540f9b23 100644 --- a/sfall/DebugEditor.cpp +++ b/sfall/DebugEditor.cpp @@ -287,8 +287,8 @@ void RunDebugEditor() { WSACleanup(); } -static const DWORD dbg_error_ret = 0x453FD8; static void __declspec(naked) dbg_error_hack() { + static const DWORD dbg_error_ret = 0x453FD8; __asm { cmp ebx, 1; je hide; diff --git a/sfall/Elevators.cpp b/sfall/Elevators.cpp index 59979277..62cc34ac 100644 --- a/sfall/Elevators.cpp +++ b/sfall/Elevators.cpp @@ -164,19 +164,18 @@ void ElevatorsInit() { //HookCall(0x43F2D2, UnknownHook2); // unused SafeWrite8(0x43EF76, (BYTE)elevatorCount); - SafeWrite32(0x43EFA4, (DWORD)elevators); - SafeWrite32(0x43EFB9, (DWORD)elevators); - SafeWrite32(0x43F2FC, (DWORD)elevators); - SafeWrite32(0x43EFEA, (DWORD)&elevators[0].Tile1); - SafeWrite32(0x43F315, (DWORD)&elevators[0].Tile1); + const DWORD elevatorsAddr[] = {0x43EFA4, 0x43EFB9, 0x43F2FC}; + SafeWriteBatch((DWORD)elevators, elevatorsAddr); + const DWORD elevatorsTileAddr[] = {0x43EFEA, 0x43F315}; + SafeWriteBatch((DWORD)&elevators[0].Tile1, elevatorsTileAddr); SafeWrite32(0x43F309, (DWORD)&elevators[0].Elevation1); SafeWrite32(0x43F438, (DWORD)&elevatorsFrms[0].main); SafeWrite32(0x43F475, (DWORD)&elevatorsFrms[0].buttons); // _btncnt - SafeWrite32(0x43F65E, (DWORD)elevatorsBtnCount); - SafeWrite32(0x43F6BB, (DWORD)elevatorsBtnCount); + const DWORD elevsBtnCountAddr[] = {0x43F65E, 0x43F6BB}; + SafeWriteBatch((DWORD)elevatorsBtnCount, elevsBtnCountAddr); MakeCall(0x43F05D, GetNumButtonsHook1, 2); MakeCall(0x43F184, GetNumButtonsHook2, 2); MakeCall(0x43F1E4, GetNumButtonsHook3, 2); diff --git a/sfall/HeroAppearance.cpp b/sfall/HeroAppearance.cpp index 46ffd8cf..01762074 100644 --- a/sfall/HeroAppearance.cpp +++ b/sfall/HeroAppearance.cpp @@ -1510,8 +1510,8 @@ endFunc: } } -static const DWORD op_obj_art_fid_Ret = 0x45C5D9; static void __declspec(naked) op_obj_art_fid_hack() { + static const DWORD op_obj_art_fid_Ret = 0x45C5D9; __asm { mov esi, [edi + 0x20]; // artFid mov eax, [edi + 0x64]; // protoId diff --git a/sfall/HookScripts.cpp b/sfall/HookScripts.cpp index 8393fe3b..d9195721 100644 --- a/sfall/HookScripts.cpp +++ b/sfall/HookScripts.cpp @@ -552,8 +552,8 @@ end: } } -static const DWORD RemoveObjHookRet = 0x477497; static void __declspec(naked) RemoveObjHook() { + static const DWORD RemoveObjHookRet = 0x477497; __asm { mov ecx, [esp + 8]; // call addr HookBegin; @@ -688,8 +688,8 @@ end: } } -static const DWORD _obj_blocking_at = 0x48B84E; static void __declspec(naked) HexMBlockingHook() { + static const DWORD _obj_blocking_at = 0x48B84E; __asm { HookBeginArgs(4); mov args[0], eax; @@ -1055,10 +1055,10 @@ static int __fastcall InventoryMoveHook_Script(DWORD itemReplace, DWORD item, in return result; } -static const DWORD UseArmorHack_back = 0x4713AF; // normal operation (old 0x4713A9) -static const DWORD UseArmorHack_skip = 0x471481; // skip code, prevent wearing armor // This hack is called when an armor is dropped into the armor slot at inventory screen static void __declspec(naked) UseArmorHack() { + static const DWORD UseArmorHack_back = 0x4713AF; // normal operation (old 0x4713A9) + static const DWORD UseArmorHack_skip = 0x471481; // skip code, prevent wearing armor __asm { mov ecx, ds:[_i_worn]; // replacement item (override code) mov edx, [esp + 0x58 - 0x40]; // item @@ -1165,9 +1165,9 @@ static int __fastcall DropIntoContainer(DWORD ptrCont, DWORD item, DWORD addrCal return InventoryMoveHook_Script(ptrCont, item, type); } -static const DWORD DropIntoContainer_back = 0x47649D; // normal operation -static const DWORD DropIntoContainer_skip = 0x476503; static void __declspec(naked) DropIntoContainerHack() { + static const DWORD DropIntoContainer_back = 0x47649D; // normal operation + static const DWORD DropIntoContainer_skip = 0x476503; __asm { pushadc; mov ecx, ebp; // contaner ptr @@ -1185,17 +1185,17 @@ skipdrop: } } -static const DWORD DropIntoContainerRet = 0x471481; static void __declspec(naked) DropIntoContainerHandSlotHack() { + static const DWORD DropIntoContainerRet = 0x471481; __asm { call drop_into_container_; jmp DropIntoContainerRet; } } -//static const DWORD DropAmmoIntoWeaponHack_back = 0x47658D; // proceed with reloading -static const DWORD DropAmmoIntoWeaponHack_return = 0x476643; static void __declspec(naked) DropAmmoIntoWeaponHook() { + //static const DWORD DropAmmoIntoWeaponHack_back = 0x47658D; // proceed with reloading + static const DWORD DropAmmoIntoWeaponHack_return = 0x476643; __asm { pushadc; mov ecx, ebp; // weapon ptr diff --git a/sfall/Inventory.cpp b/sfall/Inventory.cpp index 6af3781f..06c70cb3 100644 --- a/sfall/Inventory.cpp +++ b/sfall/Inventory.cpp @@ -182,9 +182,9 @@ static int __fastcall BarterAttemptTransaction(TGameObj* critter, TGameObj* tabl return (sizeTable <= size) ? 1 : 0; } -static const DWORD BarterAttemptTransactionPCFail = 0x474C81; -static const DWORD BarterAttemptTransactionPCRet = 0x474CA8; static __declspec(naked) void barter_attempt_transaction_hack_pc() { + static const DWORD BarterAttemptTransactionPCFail = 0x474C81; + static const DWORD BarterAttemptTransactionPCRet = 0x474CA8; __asm { /* cmp eax, edx */ jg fail; // if there's no available weight @@ -201,9 +201,9 @@ fail: } } -static const DWORD BarterAttemptTransactionPMFail = 0x474CD8; -static const DWORD BarterAttemptTransactionPMRet = 0x474D01; static __declspec(naked) void barter_attempt_transaction_hack_pm() { + static const DWORD BarterAttemptTransactionPMFail = 0x474CD8; + static const DWORD BarterAttemptTransactionPMRet = 0x474D01; __asm { /* cmp eax, edx */ jg fail; // if there's no available weight @@ -261,8 +261,8 @@ static void __cdecl DisplaySizeStats(TGameObj* critter, const char* &message, DW strcpy(InvenFmt, InvenFmt1); } -static const DWORD DisplayStatsRet = 0x4725E5; static __declspec(naked) void display_stats_hack() { + static const DWORD DisplayStatsRet = 0x4725E5; __asm { mov ecx, esp; sub ecx, 4; @@ -311,8 +311,8 @@ static __declspec(naked) void inven_obj_examine_func_hook() { } } -static const DWORD ControlUpdateInfoRet = 0x44912A; static void __declspec(naked) gdControlUpdateInfo_hack() { + static const DWORD ControlUpdateInfoRet = 0x44912A; __asm { mov ebx, eax; push eax; // critter @@ -342,8 +342,8 @@ static int __fastcall SuperStimFix(TGameObj* item, TGameObj* target) { return -1; } -static const DWORD protinst_use_item_on_Ret = 0x49C5F4; static void __declspec(naked) protinst_use_item_on_hack() { + static const DWORD protinst_use_item_on_Ret = 0x49C5F4; __asm { push ecx; mov ecx, ebx; // ecx - item @@ -568,8 +568,8 @@ skip: } } -static const DWORD DoMoveTimer_Ret = 0x476920; static void __declspec(naked) do_move_timer_hook() { + static const DWORD DoMoveTimer_Ret = 0x476920; __asm { cmp eax, 4; jnz end; @@ -608,8 +608,9 @@ static void __declspec(naked) do_move_timer_hack() { static int invenApCost, invenApCostDef; static char invenApQPReduction; -static const DWORD inven_ap_cost_Ret = 0x46E812; + static void __declspec(naked) inven_ap_cost_hack() { + static const DWORD inven_ap_cost_Ret = 0x46E812; _asm { mul byte ptr invenApQPReduction; mov edx, invenApCost; diff --git a/sfall/MainMenu.cpp b/sfall/MainMenu.cpp index 6760c43b..534f4ee2 100644 --- a/sfall/MainMenu.cpp +++ b/sfall/MainMenu.cpp @@ -32,8 +32,8 @@ static DWORD MainMenuTextOffset; static long OverrideColour, OverrideColour2; -static const DWORD MainMenuButtonYHookRet = 0x48184A; static void __declspec(naked) MainMenuButtonYHook() { + static const DWORD MainMenuButtonYHookRet = 0x48184A; __asm { xor edi, edi; xor esi, esi; @@ -62,8 +62,8 @@ override: } } -static const DWORD MainMenuTextRet = 0x4817B0; static void __declspec(naked) MainMenuTextHook() { + static const DWORD MainMenuTextRet = 0x4817B0; __asm { mov esi, eax; // winptr mov ebp, ecx; // keep xpos diff --git a/sfall/Perks.cpp b/sfall/Perks.cpp index 5279fae7..aec15e9a 100644 --- a/sfall/Perks.cpp +++ b/sfall/Perks.cpp @@ -706,8 +706,8 @@ static void PerkSetup() { // _perk_data const DWORD perkDataAddr[] = {0x496669, 0x496837, 0x496BAD, 0x496C41, 0x496D25}; SafeWriteBatch((DWORD)Perks, perkDataAddr); - SafeWrite32(0x496696, (DWORD)&Perks[0].Desc); - SafeWrite32(0x496BD1, (DWORD)&Perks[0].Desc); + const DWORD perkDataDescAddr[] = {0x496696, 0x496BD1}; + SafeWriteBatch((DWORD)&Perks[0].Desc, perkDataDescAddr); SafeWrite32(0x496BF5, (DWORD)&Perks[0].Image); SafeWrite32(0x496AD4, (DWORD)&Perks[0].Ranks); } @@ -916,10 +916,10 @@ static void TraitSetup() { memcpy(Traits, (void*)_trait_data, sizeof(TraitStruct) * TRAIT_count); // _trait_data - SafeWrite32(0x4B3A81, (DWORD)Traits); - SafeWrite32(0x4B3B80, (DWORD)Traits); - SafeWrite32(0x4B3AAE, (DWORD)&Traits[0].Desc); - SafeWrite32(0x4B3BA0, (DWORD)&Traits[0].Desc); + const DWORD traitDataAddr[] = {0x4B3A81, 0x4B3B80}; + SafeWriteBatch((DWORD)Traits, traitDataAddr); + const DWORD traitDataDescAddr[] = {0x4B3AAE, 0x4B3BA0}; + SafeWriteBatch((DWORD)&Traits[0].Desc, traitDataDescAddr); SafeWrite32(0x4B3BC0, (DWORD)&Traits[0].Image); char buf[512], num[5] = {'t'}; diff --git a/sfall/QuestList.cpp b/sfall/QuestList.cpp index bbf408a5..6968738c 100644 --- a/sfall/QuestList.cpp +++ b/sfall/QuestList.cpp @@ -212,10 +212,10 @@ static long __fastcall QuestsPrint(const char* text, int width, DWORD* buf, BYTE return EXITCODE_Normal; } -static const DWORD PipStatus_NormalRet = 0x49818B; -static const DWORD PipStatus_NextRet = 0x498237; -static const DWORD PipStatus_BreakRet = 0x4982A4; static void __declspec(naked) PipStatus_hack_print() { + static const DWORD PipStatus_NormalRet = 0x49818B; + static const DWORD PipStatus_NextRet = 0x498237; + static const DWORD PipStatus_BreakRet = 0x4982A4; __asm { push ecx; push ebx; diff --git a/sfall/ScriptExtender.cpp b/sfall/ScriptExtender.cpp index 93e86424..cee99cc2 100644 --- a/sfall/ScriptExtender.cpp +++ b/sfall/ScriptExtender.cpp @@ -1732,7 +1732,7 @@ void ScriptExtenderInit() { 0x4A3E1C, // script_chk_timed_events_ 0x499AFA, 0x499CD7, 0x499E2B // TimedRest_ }; - MakeCalls(TimedEventNextTime, queueNextTimeAddr); + HookCalls(TimedEventNextTime, queueNextTimeAddr); HookCall(0x4A3E08, script_chk_timed_events_hook); // this patch makes it possible to export variables from sfall global scripts diff --git a/sfall/Skills.cpp b/sfall/Skills.cpp index f92af62f..155ed9a4 100644 --- a/sfall/Skills.cpp +++ b/sfall/Skills.cpp @@ -342,8 +342,8 @@ void SkillsInit() { HookCall(0x4AA574, skill_level_hook); // change the lower limit for negative skill points MakeCall(0x4AAA84, skill_dec_point_hack_limit); - SafeWrite8(0x4AA91B, SKILL_MIN_LIMIT); - SafeWrite8(0x4AAA1A, SKILL_MIN_LIMIT); + const DWORD skillMinLimitAddr[] = {0x4AA91B, 0x4AAA1A}; + SafeWriteBatch(SKILL_MIN_LIMIT, skillMinLimitAddr); SafeWrite32(0x4AAA23, SKILL_MIN_LIMIT); MakeCall(0x4ABC62, skill_check_stealing_hack); // PickpocketMod diff --git a/sfall/SpeedPatch.cpp b/sfall/SpeedPatch.cpp index c91141f8..ae440b4e 100644 --- a/sfall/SpeedPatch.cpp +++ b/sfall/SpeedPatch.cpp @@ -166,9 +166,7 @@ void SpeedPatchInit() { int size = sizeof(offsets) / 4; if (GetConfigInt("Speed", "AffectPlayback", 0) == 0) size -= 4; - for (int i = 0; i < size; i++) { - SafeWrite32(offsets[i], (DWORD)&sf_GetTickCount); - } + SafeWriteBatch((DWORD)&sf_GetTickCount, offsets); SafeWrite32(0x4FDF58, (DWORD)&sf_GetLocalTime); HookCall(0x4A433E, scripts_check_state_hook);