void __thiscall A0_AI_VirtualBattle_Finish_sub_426EE0(_AICalcBattleSide_ *this, _AICalcBattleSide_ *looser, _Town_ *town)
{
_Hero_ *winner_hero_v3; // eax@1
_Hero_ *looser_hero_v4; // ebx@1
_AICalcBattleSide_ *looser_v5; // edi@1
_AICalcBattleSide_ *this_v6; // esi@1
float exp_v7; // ST20_4@11
double result_exp_v8; // st7@11
_Hero_ *winner_hero_v9; // ecx@18
_Hero_ *hero_v10; // ecx@21
_Hero_ *hero_v11; // edi@23
int curr_spell_v12; // edx@25
_Spell_ *spell_v13; // eax@28
int spell_level_v14; // ecx@28
_Hero_ *hero_v15; // ecx@35
_Army_ *looser_army_v14; // [sp-8h] [bp-20h]@9
_Hero_ *looser_hero_v15; // [sp-4h] [bp-1Ch]@9
_Hero_ *looser_hero_v16; // [sp+Ch] [bp-Ch]@1
char looser_escaped_v17; // [sp+17h] [bp-1h]@1
_Army_ *looser_army_v18; // [sp+20h] [bp+8h]@1
looser_v5 = looser;
this_v6 = this;
looser_escaped_v17 = 0;
looser_hero_v4 = looser->hero_dword24;
looser_army_v18 = looser->army_dword28;
winner_hero_v3 = this->hero_dword24;
looser_hero_v16 = looser_hero_v4;
if ( winner_hero_v3 )
winner_hero_v3->spell_points = LOWORD(this->spell_points_dword14);// Уменьшаем очки заклинаний
if ( looser_hero_v4 )
looser_hero_v4->spell_points = LOWORD(looser_v5->spell_points_dword14);// Уменьшаем очки заклинаний
if ( this->army_value_dword1C <= 0 ) // Победитель тоже проиграл
{
winner_hero_v9 = this->hero_dword24;
if ( winner_hero_v9 )
A0_Hero_DeleteArt_sub_4E3040(winner_hero_v9, 2);// Удаляем у победителя (защищающегося) грааль
}
else // Победитель на самом деле победил
{
if ( this->hero_dword24 ) // У победителя есть герой
{
if ( looser_hero_v4 && A0_Rand_Int_sub_50C7C0(0, 100) < 60 )
{
looser_hero_v15 = 0; // Враг "бежал"
looser_escaped_v17 = 1;
looser_army_v14 = looser_army_v18;
}
else
{
looser_hero_v15 = looser_hero_v4; // Враг проиграл
looser_army_v14 = looser_army_v18;
}
exp_v7 = A0_AI_VirtualBattle_GetArmyExp_sub_4CA070(looser_army_v14, looser_hero_v15);
result_exp_v8 = A0_Hero_Get_LearningSecSkill_Modif_sub_4E4AB0(this_v6->hero_dword24) * exp_v7;
A0_Hero_Give_Experience_sub_4E3620(this_v6->hero_dword24, result_exp_v8, 1, 1);// Даём опыт герою-победителю
if ( looser_hero_v4 )
A0_Hero_DeleteArt_sub_4E3040(looser_hero_v4, 2);// Удаляем у проигравшего грааль
if ( !looser_escaped_v17 )
{
if ( looser_hero_v4 ) // Баг: проигравший берёт арты победителя
A0_AI_Hero_TakeAllArts_sub_4E2640(looser_hero_v4, this_v6->hero_dword24);
}
if ( town ) // Захватываем город
A0_Capture_Town_sub_4C5EA0(A0_GameMgr_dword_699538, town->id, this_v6->hero_dword24->owner_id, 0, 1);
}
}
A0_AI_AICalcBattleSide_Hero_AfterBattle_ReturnArmyOrDefeat_sub_424880(this_v6, 1);
A0_AI_AICalcBattleSide_Hero_AfterBattle_ReturnArmyOrDefeat_sub_424880(looser_v5, 1);
if ( this_v6->army_value_dword1C > 0 ) // Победитель победил
{
hero_v10 = this_v6->hero_dword24;
if ( hero_v10 )
{
A0_AI_VirtualBattle_Necromacy_AddCreatures_sub_426DF0(hero_v10, looser_army_v18, this_v6->army_dword28);
if ( looser_hero_v4 )
{
hero_v11 = this_v6->hero_dword24;
if ( hero_v11->second_skill[11] > 0 ) // Есть орлиный глаз
{
if ( A0_Hero_Check_Has_Artifact_Weared_sub_4D9460(hero_v11, 0) )// Есть книга
{
curr_spell_v12 = 0;
do
{
if ( looser_hero_v4->spell_level[curr_spell_v12] && !hero_v11->spell_level[curr_spell_v12] )// Закл есть у врага, но его нет у победившего
{
spell_v13 = &A0_Spells_off_687FA8[curr_spell_v12];
spell_level_v14 = spell_v13->level;// Изучаем все возможные заклы глазом орла
if ( hero_v11->second_skill[11] + 1 >= spell_level_v14
&& spell_v13->flags & 1
&& spell_level_v14 <= hero_v11->second_skill[7] + 2 )
{
A0_Hero_Learn_Spell_sub_4D95A0(hero_v11, curr_spell_v12);
looser_hero_v4 = looser_hero_v16;
break;
}
looser_hero_v4 = looser_hero_v16;
}
++curr_spell_v12;
}
while ( curr_spell_v12 < 70 );
}
}
}
}
}
hero_v15 = this_v6->hero_dword24;
if ( hero_v15 )
A0_Hero_Reset_TempModifs_AfterBattle_sub_4DA780(hero_v15);
if ( looser_hero_v4 )
A0_Hero_Reset_TempModifs_AfterBattleLoose_sub_4DA780(looser_hero_v4);
}