// Copyright (c) 2026 StackAndPointer // SPDX-License-Identifier: MIT // // Plants vs. Zombies x86 target: // Board::Update at 0x415D40 receives Board* this in ECX. #include "SigilHook.ash"
uint64 result = 0; const uint8 status = shCallUsercall( 0x41B960, "void", "int,void*", "usercall:ret=none;arg0=ecx;arg1=eax", args, result); if (status != SH_OK) { shLog("Board::AddSunMoney call failed: " + shStatusString(status)); }
// Call the relocated original Update after inserting the AddSunMoney call. const uint64 original = shTrampoline(g_boardUpdateHook); if (original == 0) { shLog("Board::Update trampoline is unavailable"); shSkipOriginal(); return; }
void unload() { if (shIsValidHook(g_boardUpdateHook)) { shDestroyHook(g_boardUpdateHook); g_boardUpdateHook = SH_INVALID_HANDLE; } uninstallAddSunMoneyHook(); } // Copyright (c) 2026 StackAndPointer // SPDX-License-Identifier: MIT // // Plants vs. Zombies x86 target: // Board::AddSunMoney at 0x41B960 receives theAmount in ECX and this in EAX. #include "SigilHook.ash"