// 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"