Насчёт ответного удара.
Вот (в декомпилированном и чуток разобранном виде) функция, о которой я говорю. Это функция ближней атаки. Несложно заметить, что, если, конечно, не требуется чудес интеллектуальности ИИ, кроме неё править ничего не надо.
Code:
void __thiscall A0_Battle_Stack_Hit_sub_4419D0(struct_BattleStack *this, signed int Enemy_Gex_Around_Stack)
{
signed int TargetGex_v2; // eax@1
struct_BattleStack *this_v3; // edi@1
int Stack_Pos_v4; // ecx@1
struct_BattleStack *TargetStack_v5; // eax@3
struct_BattleStack *TargetStack_v6; // esi@3
signed int CurrStackGex_AroundEnemyStack_v7; // eax@4
int CurrStackGex_AroundEnemyStack_v8; // ebx@4
int v9; // ebx@6
int v10; // edx@6
int v11; // ST1C_4@6
char Target_Become_UnabkeToAttack_v12; // al@11
DWORD WaitingTime_v13; // eax@16
DWORD WaitingTime_v14; // eax@24
int v15; // ebx@27
int TargetStack_Default_Orient_v16; // [sp+8h] [bp-Ch]@4
int CurrStackGex_AroundEnemyStack_v17; // [sp+Ch] [bp-8h]@4
int v18; // [sp+1Ch] [bp+8h]@27
this_v3 = this;
Stack_Pos_v4 = this->GexNum_dword38;
this_v3->MappingOrderNum_dword8 = 6;
TargetGex_v2 = A0_Battle_Stack_Get_AroungGexNum_sub_5242E0(this_v3, Stack_Pos_v4, Enemy_Gex_Around_Stack);
if ( TargetGex_v2 >= 0 )
{
if ( TargetGex_v2 < 187 )
{
TargetStack_v5 = A0_Battle_get_StackByGex_sub_4E7230(112 * TargetGex_v2 + A0_BattleMgr_dword_699420 + 452);
TargetStack_v6 = TargetStack_v5;
if ( TargetStack_v5 )
{
TargetStack_Default_Orient_v16 = TargetStack_v5->Orientation_dword44;
CurrStackGex_AroundEnemyStack_v7 = sub_4455D0(TargetStack_v5, TargetStack_v5->GexNum_dword38, this_v3);
CurrStackGex_AroundEnemyStack_v8 = CurrStackGex_AroundEnemyStack_v7;
CurrStackGex_AroundEnemyStack_v17 = CurrStackGex_AroundEnemyStack_v7;
if ( CurrStackGex_AroundEnemyStack_v7 < 6 )
{
if ( (TargetStack_v6->Orientation_dword44 == 0) != CurrStackGex_AroundEnemyStack_v7 >= 3 )// Поворачиваем изображение целевого стека, если надо
{
v9 = *(A0_BattleMgr_dword_699420 + 78520);
v10 = *(A0_BattleMgr_dword_699420 + 78524);
*(A0_BattleMgr_dword_699420 + 78520) = TargetStack_v6->Owner_dwordF4;
v11 = v10;
*(A0_BattleMgr_dword_699420 + 78524) = TargetStack_v6->StackNum_dwordF8;
sub_446550(TargetStack_v6, this_v3);
sub_446440(TargetStack_v6, 1);
*(A0_BattleMgr_dword_699420 + 78520) = v9;
CurrStackGex_AroundEnemyStack_v8 = CurrStackGex_AroundEnemyStack_v17;
*(A0_BattleMgr_dword_699420 + 78524) = v11;
}
}
// *** Атака ***
if ( TargetStack_v6->Spells_Lengths_adword198[62] )// Слепота
TargetStack_v6->CurrHit_IsBlinded_byte4C0 = 1;
if ( TargetStack_v6->Spells_Lengths_adword198[74] )// Паралич
TargetStack_v6->CurrHit_IsParalysed_byte4C1 = 1;
Target_Become_UnabkeToAttack_v12 = A0_Battle_Stack_MakeHit_sub_441330(
this_v3,
TargetStack_v6,
Enemy_Gex_Around_Stack);
this_v3->GexesWay_Length_dword490 = 0;
// *** Атака - закончили ***
// *** Ответный удар ***
if ( TargetStack_v6->Count_dword4C > 0 )
{
if ( !((this_v3->Creature_29dword74.Flags_dword10 >> 16) & 1) )// Враг может отвечать на атаку
{
if ( !TargetStack_v6->Spells_Lengths_adword198[70] )// Враг не окаменён
{
if ( TargetStack_v6->CounterStrikes_Count_dword454 > 0 )// У целевого стека остались ответные удары
{
if ( !Target_Become_UnabkeToAttack_v12 )// Целевой стек может атаковать
{
WaitingTime_v13 = A0_to_signed_int_sub_617F94(A0_BattleAnimsFastSetPeriodsMults_flt_63CF7C[*&A0_Setting_BattleFast_dword_69883C] * 150.0);
A0_Wait_For_Time_sub_4F8A50(WaitingTime_v13);
*(A0_BattleMgr_dword_699420 + 78528) = 1 - *(A0_BattleMgr_dword_699420 + 78528);
A0_Battle_Stack_MakeHit_sub_441330(TargetStack_v6, this_v3, CurrStackGex_AroundEnemyStack_v8);
*(A0_BattleMgr_dword_699420 + 78528) = 1 - *(A0_BattleMgr_dword_699420 + 78528);
--TargetStack_v6->CounterStrikes_Count_dword454;
}
}
}
}
}
TargetStack_v6->CurrHit_IsBlinded_byte4C0 = 0;
TargetStack_v6->CurrHit_IsParalysed_byte4C1 = 0;
// *** Ответный удар - закночили ***
// *** Второй удар ***
if ( (this_v3->Creature_29dword74.Flags_dword10 >> 15) & 1 )// Текущий стек атакует дважды
{
if ( TargetStack_v6->Count_dword4C > 0 )// В целевом стеке есть существа
{
if ( !((this_v3->Creature_29dword74.Flags_dword10 >> 2) & 1) )// Текущий стек - не стрелок
{
if ( !this_v3->Spells_Lengths_adword198[62] )// Не ослеплён
{
if ( !this_v3->Spells_Lengths_adword198[70] )// Не окаменён
{
if ( !this_v3->Spells_Lengths_adword198[74] )// Не парализован
{
if ( this_v3->Count_dword4C > 0 )// В тееущем стеке остались существа
{
WaitingTime_v14 = A0_to_signed_int_sub_617F94(A0_BattleAnimsFastSetPeriodsMults_flt_63CF7C[*&A0_Setting_BattleFast_dword_69883C] * 150.0);
A0_Wait_For_Time_sub_4F8A50(WaitingTime_v14);
A0_Battle_Stack_MakeHit_sub_441330(this_v3, TargetStack_v6, Enemy_Gex_Around_Stack);
}
}
}
}
}
}
}
// *** Второй удар - закончили ***
if ( !((TargetStack_v6->Creature_29dword74.Flags_dword10 >> 21) & 1) )// Целевой стек жив
{
if ( TargetStack_Default_Orient_v16 != TargetStack_v6->Orientation_dword44 )// Если стек направлен в другую сторону, чем раньше, поворачиваем его изображение обратно
{
v15 = *(A0_BattleMgr_dword_699420 + 78520);
v18 = *(A0_BattleMgr_dword_699420 + 78524);
*(A0_BattleMgr_dword_699420 + 78520) = TargetStack_v6->Owner_dwordF4;
*(A0_BattleMgr_dword_699420 + 78524) = TargetStack_v6->StackNum_dwordF8;
sub_446550(TargetStack_v6, this_v3);
sub_446440(TargetStack_v6, 1);
*(A0_BattleMgr_dword_699420 + 78520) = v15;
*(A0_BattleMgr_dword_699420 + 78524) = v18;
}
}
A0_Battle_Stack_RemoveSpell_sub_444230(this_v3, 59);// Берсерк
this_v3->Attacked_Enemy_Owner_dword10 = -1;
}
}
}
}
(This post was last modified: 17.03.2012 21:35 by Sav.)
|