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);
}