游戏修改-ZERO.Sievert.v0.26.0.CHS
游戏使用 GameMaker引擎 数据文件data.win
/*
.text:00588584 8B 2D 80 28 8B 00 mov ebp, dword_8B2880
.text:0058858A 56 push esi
.text:0058858B 8B 43 54 mov eax, [ebx+54h]
*/
BOOL WINAPIV Hook_ScriptStart(VOID *pParam, AsmHook::PUSHAD_DAT Reg)
{
byte *p;
p = (BYTE *)Reg.Ebx;
g_pCurScriptObj = p;
g_pCurScriptName = *(CHAR **)(g_pCurScriptObj + 0x5C);
g_pCurScriptCodeObj = *(BYTE **)(g_pCurScriptObj + 0x50);
g_pCurScriptCode = *(BYTE **)(g_pCurScriptCodeObj + 0x10);
return TRUE;
}
/*
.text:00588DD0 8B 4E 44 mov ecx, [esi+44h]
.text:00588DD3 85 C9 test ecx, ecx
.text:00588DD5 79 03 jns short loc_588DDA
.text:00588DD7 83 C1 03 add ecx, 3
*/
BOOL WINAPIV Hook_ScriptNext(VOID *pParam, AsmHook::PUSHAD_DAT Reg)
{
byte *p;
p = (BYTE *)Reg.Esi;
g_pCurScriptDat = p;
g_pCurByteCode = g_pCurScriptDat + 0x44;
return TRUE;
}
/*
.text:00463040 SetIndexValue
.text:00463040 FF 35 80 27 8B 00 push dword_8B2780
.text:00463046 E8 25 A0 12 00 call sub_58D070
.text:0046304B 8B 0D 80 27 8B 00 mov ecx, dword_8B2780
*/
BOOL WINAPIV Hook_SetIndexValue(VOID *pParam, AsmHook::PUSHAD_DAT Reg)
{
static BOOL s_bShowVal = 0;
void *v1, *v2;
byte *p;
double *dVal;
int nIndex;
DWORD dwCode;
p = (byte *)Reg.Esp;
nIndex = *(int *)(p+0x04);
v1 = *(void **)(p+0x08);
v2 = *(void **)(p+0x0c);
if(s_bShowVal && v2)
{
dVal = (double *)v2;
NLog::OutputDbgStr("SetIndexValue: %d-%g\r\n", nIndex, *dVal);
}
if(v2 == NULL || g_pCurByteCode == NULL || g_pCurScriptName == NULL)
return FALSE;
dwCode = *(DWORD *)g_pCurByteCode;
dVal = (double *)v2;
if(nIndex == 100131)
{
switch(dwCode)
{
case 0x0424:
case 0x073C:
NLog::OutputDbgStr("SetIndexValue %d %08X %5g %s\r\n", nIndex, dwCode, *dVal, g_pCurScriptName);
*dVal *= 4;
break;
default:
break;
}
}
if(nIndex == 100300)
{
if(*dVal < 100000)
{
NLog::OutputDbgStr("SetIndexValue %d %08X %5g %s\r\n", nIndex, dwCode, *dVal, g_pCurScriptName);
*dVal *= 4;
}
}
return TRUE;
}
BOOL CZEROSievert::Init(HMODULE hModule, DWORD dwSize)
{
CHAR *pHexFun;
BOOL bRetVal;
m_hModule = hModule;
m_dwModSize = dwSize;
pHexFun = "8B5DF8F20F1007F20F5C03F20F1101E9E2000000";
bRetVal = HookHex(pHexFun, OnDoSub_DD);
pHexFun = "FF3580278B00E825A012008B0D80278B00";
bRetVal = HookHex(pHexFun, Hook_SetIndexValue);
pHexFun = "8B4E4485C9790383C103";
bRetVal = HookHex(pHexFun, Hook_ScriptNext);
pHexFun = "8B2D80288B00568B4354";
bRetVal = HookHex(pHexFun, Hook_ScriptStart);
return TRUE;
}