20.03.2012, 23:18
Функция, рассчитывающая бонус к урону для башни.
Забавно, что получаемый бонус явно рассчитан на то, чтобы на него урон умножали, но урон на него во всех случаях использования этой функции делится. Отсюда и баг с воздушным щитом, окаменением и (не помню, известен ли он) вторичным навыком Защиты.
Так же несложно заметить, что в функции рассчитывается всего 3 вещи - воздушный щит (IsShot во всех стандартных вызовах = 1), окаменение и вторичный навык Защита (со специализацией) героя-хозяина цели. Ни атака (а ведь у башни заявлено 10 атаки) с защитой, ни вторичные навыки героя-хозяина башни не учитываются.
Для Хоты я заменил все 3 вызова этой функции на нормальную A0_Battle_Stack_CalcDamageModifs_sub_443C60 (пришлось искать недостающие параметры, но это несложно). Это и исправит баги, и несколько усилит башни (учитывающиеся 10 атаки - не так мало + учёт атаки обороняющегося героя).
Code:
double __thiscall A0_Battle_Stack_Get_ArrowTower_DamageBonus_To_sub_443AB0(struct_BattleStack *this, char IsShot)
{
double Shild_Spells_Mult_v2; // st7@3
int Controller_v3; // eax@10
int Hero_v4; // eax@12
double Base_mult_v6; // [sp+0h] [bp-8h]@1
*(_QWORD *)&Base_mult_v6 = 0x3FF0000000000000ui64;// double 1.0
if ( IsShot )
{
if ( !this->Spells_Lengths_adword198[28] ) // Воздушный щит
goto CHECK_STONE_SPELL_L7;
Shild_Spells_Mult_v2 = this->AirShieldSpell_Modif_dword4BC;
}
else
{
if ( !this->Spells_Lengths_adword198[27] ) // Щит
goto CHECK_STONE_SPELL_L7;
Shild_Spells_Mult_v2 = this->ShieldSpell_Modif_dword4B8;
}
Base_mult_v6 = Shild_Spells_Mult_v2;
CHECK_STONE_SPELL_L7:
if ( this->Spells_Lengths_adword198[70] ) // Окаменение
Base_mult_v6 = Base_mult_v6 * 0.5;
if ( this->Spells_Lengths_adword198[60] ) // Гипноз
Controller_v3 = 1 - this->Owner_dwordF4;
else
Controller_v3 = this->Owner_dwordF4;
Hero_v4 = *(_DWORD *)(A0_BattleMgr_dword_699420 + 4 * Controller_v3 + 21452);
if ( Hero_v4 )
Base_mult_v6 = A0_Hero_GetDefense_SecSkill_sub_4E4580(Hero_v4) * Base_mult_v6;
return Base_mult_v6;
}
Забавно, что получаемый бонус явно рассчитан на то, чтобы на него урон умножали, но урон на него во всех случаях использования этой функции делится. Отсюда и баг с воздушным щитом, окаменением и (не помню, известен ли он) вторичным навыком Защиты.
Так же несложно заметить, что в функции рассчитывается всего 3 вещи - воздушный щит (IsShot во всех стандартных вызовах = 1), окаменение и вторичный навык Защита (со специализацией) героя-хозяина цели. Ни атака (а ведь у башни заявлено 10 атаки) с защитой, ни вторичные навыки героя-хозяина башни не учитываются.
Для Хоты я заменил все 3 вызова этой функции на нормальную A0_Battle_Stack_CalcDamageModifs_sub_443C60 (пришлось искать недостающие параметры, но это несложно). Это и исправит баги, и несколько усилит башни (учитывающиеся 10 атаки - не так мало + учёт атаки обороняющегося героя).