Code:
// При подсчёте бонуса к урону стрелковой башни...
int __stdcall HookOn_ArrowTowerCalcDamageBonuses(LoHook* h, HookContext* c)
{
// Вызываем общую функцию подсчёта урона.
c->eax = (*(_BattleStack_**)(c->ebp - 36))->Calc_Damage_Bonuses((_BattleStack_*)(c->ebx), *(_int32_*)(c->ebp + 8), TRUE, FALSE, 0, 0);
c->return_address = 0x46594B;
return NO_EXEC_DEFAULT;
}
// При подсчёте бонуса к урону стрелковой башни ИИ (1)...
int __stdcall HookOn_ArrowTowerCalcDamageBonusesAI1(LoHook* h, HookContext* c)
{
// Выполняем затёртую команду.
c->edi = c->esi - 688;
// Вызываем общую функцию подсчёта урона.
c->eax = ((*(_BattleMgr_**)(c->ebp - 16))->stack[(*(_BattleMgr_**)(c->ebp - 16))->current_side][(*(_BattleMgr_**)(c->ebp - 16))->current_stack_ix]).Calc_Damage_Bonuses((_BattleStack_*)(c->edi), *(_int32_*)(c->ebp + 16), TRUE, TRUE, 0, 0);
c->return_address = 0x41E3AB;
return NO_EXEC_DEFAULT;
}
// При подсчёте бонуса к урону стрелковой башни ИИ (2)...
int __stdcall HookOn_ArrowTowerCalcDamageBonusesAI2(LoHook* h, HookContext* c)
{
// Выполняем затёртую команду.
c->edi = c->esi - 688;
// Вызываем общую функцию подсчёта урона.
c->eax = ((*(_BattleMgr_**)(c->ebp - 16))->stack[(*(_BattleMgr_**)(c->ebp - 16))->current_side][(*(_BattleMgr_**)(c->ebp - 16))->current_stack_ix]).Calc_Damage_Bonuses((_BattleStack_*)(c->edi), *(_int32_*)(c->ebp + 16), TRUE, TRUE, 0, 0);
c->return_address = 0x41E4E7;
return NO_EXEC_DEFAULT;
}
Code:
Patcher* _P = GetPatcher();
PatcherInstance* _PI = _P->CreateInstance("Choose_Name");
Code:
// При подсчёте бонуса к урону стрелковой башни...
_PI->WriteLoHook(0x465934, HookOn_ArrowTowerCalcDamageBonuses);
// При подсчёте бонуса к урону стрелковой башни ИИ (1)...
_PI->WriteLoHook(0x41E38E, HookOn_ArrowTowerCalcDamageBonusesAI1);
// При подсчёте бонуса к урону стрелковой башни ИИ (2)...
_PI->WriteLoHook(0x41E4CA, HookOn_ArrowTowerCalcDamageBonusesAI2);
Не хочу менять сам код (наделаю синтаксических ошибок ещё), поэтому поясню отдельно: _int32_ = int; TRUE = 1; FALSE = 0.
Code:
struct _BattleStack_
{
...
// Подсчёт добавок к наносимому урону (возвращается новый урон).
// Enemy - указатель на атакуемый стек.
// BaseDamage - начальный урон.
// IsShot - является ли атака выстрелом (TRUE - является).
// Virtual - является ли подсчёт производимым ИИ (TRUE - является).
// WayLength - пройденный путь до цели (для расчёта кавалерийского бонуса).
// out_FireshieldDamage - указатель на переменную, в которую в результате работы функции запишется урон от огненного щита (0 - не подсчитывать).
inline _int32_ Calc_Damage_Bonuses(_BattleStack_* Enemy, _int32_ BaseDamage, _bool8_ IsShot, _bool8_ Virtual, _int32_ WayLength, _int32_* out_FireshieldDamage)
{
return CALL_7(_int32_, __thiscall, 0x443C60, this, Enemy, BaseDamage, IsShot, Virtual, WayLength, out_FireshieldDamage);
}
...
}
_BattleMgr_.stack = +21708, массив 2 на 21 стеков (каждый - по 1352 байта).
_BattleMgr_.curr_stack_ix = +78524
_BattleMgr_.current_side = +78528
Так же, как видно, для получения стека башни ИИ приходится брать текущий стек. Но если эта ИИ-функцкци вызывается только стандартно из геройского кода, то это заведомо правильный способ.
etoprostoya Wrote:А там точно double, а не float? Раньше думал, что в игре используется только float32.
64 тоже используется, в основном в промежуточных вычислениях. Хотя конкретно в этом случае не знаю, но, думаю, Ида правильно определила, тем более в такой маленькой функции.