diff Arcomage.cpp @ 1282:8a196c858180

Слияние
author Ritor1
date Sat, 15 Jun 2013 09:55:27 +0600
parents 6bc88137a019
children dcc52e17b517
line wrap: on
line diff
--- a/Arcomage.cpp	Sat Jun 15 09:55:07 2013 +0600
+++ b/Arcomage.cpp	Sat Jun 15 09:55:27 2013 +0600
@@ -5,7 +5,7 @@
 #include <string>
 #include <assert.h>
 
-#include "LightmapBuilder.h"
+#include "Render.h"
 #include "Arcomage.h"
 #include "VideoPlayer.h"
 #include "AudioPlayer.h"
@@ -20,41 +20,41 @@
 #include "VectorTypes.h"
 #include "texts.h"
 #include <windef.h>
+#include "mm7_data.h"
 
 
 
 void SetStartConditions();
-
-
 void SetStartGameData();
 void FillPlayerDeck();
 void InitalHandsFill();
 void GetNextCardFromDeck(int player_num);
 int  GetEmptyCardSlotIndex(int player_num);
 void IncreaseResourcesInTurn(int player_num);
-void __cdecl am_40A383();
-bool  IsGameOver();
-char __thiscall am_40A560(unsigned int _this);
-void DrawGameUI(int a1); // idb
-void am_40AA4E();
+void TurnChange();
+bool IsGameOver();
+int  CalculateCardPower(ArcomagePlayer* player, ArcomagePlayer* enemy, ArcomageCard* pCard, int mastery);
+char PlayerTurn(int player_num);
+void DrawGameUI(int  animation_stage); 
+void DrawSparks();
 void DrawRectanglesForText();
 void DrawPlayersText();
-void DrawPlayerLevels(int a1, char *text, POINT *pXY); // idb
-void DrawBricksCount(int a1, char* text, POINT *pXY); // idb
+void DrawPlayerLevels(int a1, char *text, POINT *pXY); 
+void DrawBricksCount(int a1, char* text, POINT *pXY); 
 void DrawGemsCount(int a1, char* text, POINT* pXY);
-void DrawBeastsCount(int a1, char *text, POINT *pXY); // idb
+void DrawBeastsCount(int a1, char *text, POINT *pXY);
 void DrawPlayersTowers();
 void DrawPlayersWall();
 void DrawCards();
 void DrawCardAnimation(int a1);
 int GetPlayerHandCardCount(int player_num);
 signed int  DrawCardsRectangles(int player_num);
-bool  am_40BCFB(int player_num, signed int card_slot_index);
+bool DiscardCard(int player_num, signed int card_slot_index);
 bool PlayCard(int player_num, signed int card_slot_num);
 bool CanCardBePlayed(int player_num, int hand_card_indx);
-void ApplyCardToPlayer(int player_num, unsigned int uCardID); // idb
+void ApplyCardToPlayer(int player_num, unsigned int uCardID); 
 int  am_40D2B4(POINT* a1, int a2); // weak
-int  am_40D402(int player_num, int damage); // weak
+int  ApplyDamageToBuildings(int player_num, int damage); // weak
 void GameResultsApply();
 
 void pPrimaryWindow_draws_text(int a1, const char *pText, POINT *pXY);
@@ -62,9 +62,10 @@
 void __fastcall Blt_Chroma(RECT  *pSrcXYZW, POINT *pTargetXY, int a3, int a4);
 void  Blt_Copy(RECT *pSrcRect, POINT *pTargetXY, int a3);
 void __cdecl am_EndScene();
-void __fastcall DrawRect(RECT *pXYZW, unsigned __int16 uColor, char bSolidFill); // idb
-void  SetPixel(POINT *pTargetXY, unsigned __int16 uColor);
-int __fastcall rand_interval(int a, int b); // idb
+void DrawRect(RECT *pXYZW, unsigned __int16 uColor, char bSolidFill);
+void SetPixel2sq( POINT *pTargetXY, unsigned __int16 uColor );
+void SetPixel(POINT *pTargetXY, unsigned __int16 uColor);
+int  rand_interval(int min, int max); // idb
 void __fastcall intToString(int val, char *pOut);
 
 /*  388 */
@@ -81,10 +82,10 @@
   __int16 bricks_amount;
   __int16 gems_amount;
   __int16 beasts_amount;
-  int field_14;
+  int mastery_lvl;
 };
 #pragma pack(pop)
-ArcomageStartConditions start_conditions[13] =
+const ArcomageStartConditions start_conditions[13] =
 {
   { 30, 100, 15,  5,  2,  2,  2, 10, 10, 10,  0},
   { 50, 150, 20,  5,  2,  2,  2,  5,  5,  5,  1},
@@ -127,17 +128,28 @@
 
   int x;
   int y;
-  char field_8;
-  char field_9;
-  char field_A;
-  char field_B;
+  char curr_mouse_left;
+  char mouse_left_state_changed;
+  char curr_mouse_right;
+  char mouse_right_state_changed;
 };
 #pragma pack(pop)
 
 
+#pragma pack(push, 1)
+struct am_2
+    {  
+    int slot_index;
+    int card_power;
+    };
+#pragma pack(pop)
+
+am_2  cards_power[10];
+std::array<__int16, 12> am_sounds;
+
 char byte_4E185C  = 1; // weak
 char am_byte_4E185D = 1; // weak
-char byte_4E185E = 1; // weak
+char use_start_bonus = 1; // weak
 
 int start_tower_height;
 int start_wall_height; 
@@ -154,13 +166,13 @@
 int max_tower_height       = 50; 
 int max_resources_amount   = 100 ; 
 
-int dword_4DF3A4; // weak
+int opponent_mastery = 1 ; // weak
 
 char byte_4FAA2C; // weak
 char byte_4FAA2D; // weak
 
 int current_player_num; // idb
-char am_byte_4FAA77; // weak
+char need_to_discard_card; // weak
 
 signed int current_card_slot_index; 
 int played_card_id; // idb 4FABC0
@@ -177,10 +189,29 @@
 POINT amuint_4FAA54_blt_xy;
 POINT amuint_4FAA5C_blt_xy;
 
-
+int dword_4FAA64; // weak
+int dword_4FAA68; // weak
 
 int dword_4FABB8; // weak
 
+char byte_4FAA00; // weak
+
+int amuint_4FAA34; // weak
+int amuint_4FAA38; // weak
+int amuint_4FAA4C; // weak
+
+char byte_4FAA2E; // weak
+
+int dword_4FAA70; // weak
+char byte_4FAA74; // weak
+char am_byte_4FAA75; // weak
+char am_byte_4FAA76; // weak
+
+int amuint_4FABC4; // weak
+
+
+char byte_505880; // weak
+char byte_505881; // weak
 
 //----- (0040DD2F) --------------------------------------------------------
 bool stru273::_40DD2F()
@@ -188,12 +219,12 @@
 
   this->x = pArcomageGame->mouse_x;
   this->y = pArcomageGame->mouse_y;
-  this->field_8 = pArcomageGame->mouse_left;
-  this->field_9 = pArcomageGame->mouse_left == pArcomageGame->field_F7;
-  this->field_A = pArcomageGame->mouse_right;
-  this->field_B = pArcomageGame->mouse_right == pArcomageGame->field_F8;
-  pArcomageGame->field_F7 = pArcomageGame->mouse_left;
-  pArcomageGame->field_F8 = pArcomageGame->mouse_right;
+  this->curr_mouse_left = pArcomageGame->mouse_left;
+  this->mouse_left_state_changed = pArcomageGame->mouse_left == pArcomageGame->prev_mouse_left;
+  this->curr_mouse_right = pArcomageGame->mouse_right;
+  this->mouse_right_state_changed = pArcomageGame->mouse_right == pArcomageGame->prev_mouse_right;
+  pArcomageGame->prev_mouse_left = pArcomageGame->mouse_left;
+  pArcomageGame->prev_mouse_right = pArcomageGame->mouse_right;
   return true;
 }
 
@@ -206,13 +237,13 @@
 }
 
 //----- (0040DFD1) --------------------------------------------------------
-void stru272_stru0::Ctor(stru272_stru0 *a1)
+void stru272_stru0::Ctor(stru272_stru0 **a1)
     {
     stru272_stru0 *v2; // eax@1
     v2 = (stru272_stru0 *)malloc(0x5Cu);
-    a1 = v2;
+    *a1 = v2;
     v2->signature = SIG_trpg;
-    v2->field_8 = 0;
+    v2->position_in_sparks_arr = 0;
     v2->field_30 = 0.0;
     v2->field_58 = 0;
     v2->field_59 = 0;
@@ -234,16 +265,16 @@
     }
 
 //----- (0040E01A) --------------------------------------------------------
-int stru272_stru0::_40E01A( stru272_stru2* a2 )
+int stru272_stru0::StartFill( stru272_stru2* a2 )
     {
     auto a1 = this;
     if ( a1->signature == SIG_trpg )
         {
         a1->field_4 = a2->field_20;
-        a1->field_C = a2->field_0 << 16;
-        a1->field_10 = a2->field_4 << 16;
-        a1->field_14 = a2->field_8 << 16;
-        a1->field_18 = a2->field_C << 16;
+        a1->field_C = a2->effect_area.left << 16;
+        a1->field_10 = a2->effect_area.top << 16;
+        a1->field_14 = a2->effect_area.right << 16;
+        a1->field_18 = a2->effect_area.bottom << 16;
         a1->field_1C = a2->field_10;
         a1->field_20 = a2->field_14;
         a1->field_24 = a2->field_18;
@@ -253,7 +284,7 @@
         a1->field_38 = (int)(a2->field_2Cf * 65536.0);
         a1->field_3C = a2->field_30;
         a1->field_40 = a2->field_34;
-        a1->field_54 = a2->field_38;
+        a1->field_54 = a2->sparks_array;
         a1->field_59 = 1;
 
         return 0;
@@ -269,14 +300,14 @@
         {
         if ( a2 )
             {
-            field_8 = 0;
+            position_in_sparks_arr = 0;
             field_30 = 0.0;
             }
         if ( field_59 && a3 )
             {
 
             for (int i=0; i<field_4; ++i)
-                field_54[i].field_0 = 0;
+                field_54[i].have_spark = 0;
              field_58 = 0;
             }
         return 0;
@@ -286,7 +317,7 @@
     }
 
 //----- (0040E133) --------------------------------------------------------
-int stru272_stru0::_40E133()
+int stru272_stru0::DrawEffect()
     {
 
     stru272_stru0 *v1; // edi@1
@@ -314,7 +345,7 @@
     v1 = this;
     if ( this->signature != SIG_trpg )
         return 2;
-    v3 = this->field_8;
+    v3 = this->position_in_sparks_arr;
     v22 = this->field_30;
     v4 = v3;
     if ( v3 > 0 )
@@ -330,28 +361,29 @@
         v7 = this->field_54;
         v20 = this->field_28;
         v21 = this->field_4;
-        while ( v7->field_0 <= 0 )
+        while ( v7->have_spark <= 0 )
             {
             if ( v22 >= 1.0 )
                 {
                 v12 = v1->field_40;
                 v13 = v1->field_3C;
-                v7->field_0 = v13 + rand() % (v12 - v13 + 1);
+                v7->have_spark = rand_interval(v13,v12);
                 v7->field_14 = (rand() % 17 - 8) << 16;
                 v7->field_18 = (rand() % 17 - 8) << 16;
+
                 v14 = v1->field_14 - 1;
                 v15 = v1->field_C;
-                v16 = v15 + rand() % (v14 - v15 + 1);
+                v16 = rand_interval(v15,v14);
                 v7->field_C = v16;
-                v7->field_4.x = v16 >> 16;
+                v7->spark_position.x = v16 >> 16;
 
                 v17 = v1->field_18 - 1;
                 v18 = v1->field_10;
-                v22 = v22 - 1.0;
-                v19 = v18 + rand() % (v17 - v18 + 1);
+                v19 = rand_interval(v17, v18);
                 v7->field_10 = v19;
-                v7->field_4.y = v19 >> 16;
-                --v1->field_8;
+                v7->spark_position.y = v19 >> 16;
+                --v1->position_in_sparks_arr;
+                v22 = v22 - 1.0;
                 goto LABEL_13;
                 }
 LABEL_14:
@@ -365,17 +397,17 @@
                 }
             }
         v8 = v7->field_14;
-        --v7->field_0;
+        --v7->have_spark;
         v9 = v8 + v7->field_C;
 
         v10 = v20 + v7->field_18;
         v7->field_C = v9;
-        v7->field_4.x = v9 >> 16;
+        v7->spark_position.x = v9 >> 16;
 
         v11 = v10 + v7->field_10;
         v7->field_18 = v10;
         v7->field_10 = v11;
-        v7->field_4.y = v11 >> 16;
+        v7->spark_position.y = v11 >> 16;
 LABEL_13:
         v6 = 1;
         goto LABEL_14;
@@ -389,7 +421,7 @@
 
     if (signature == SIG_trpg )
         {
-        if ( field_8 <= 0 )
+        if ( position_in_sparks_arr <= 0 )
             return field_58 != 0 ? 2 : 0;
         else
             return 1;
@@ -427,9 +459,9 @@
   pTargetPoint.x = 0;
   pTargetPoint.y = 0;
 
-  pSrcRect.left = 0;
-  pSrcRect.right = 640;
-  pSrcRect.top = 0;
+  pSrcRect.left   = 0;
+  pSrcRect.top    = 0;
+  pSrcRect.right  = 640;
   pSrcRect.bottom = 480;
 
   pRenderer->BeginScene();
@@ -757,793 +789,441 @@
   return true;
 }
 
+int CalculateCardPower(ArcomagePlayer* player, ArcomagePlayer* enemy, ArcomageCard* pCard, int mastery)
+    {
+    enum V_INDX{
+        P_TOWER_M10,
+        P_WALL_M10,
+        E_TOWER,
+        E_WALL,
+        E_BUILDINGS,
+        E_QUARRY,
+        E_MAGIC,
+        E_ZOO,
+        E_RES,
+        V_INDEX_MAX
+        };
+
+    const int mastery_coeff[V_INDEX_MAX][2]= {{10, 5}, //P_TOWER_M10
+                                              {2, 1},  //P_WALL_M10
+                                              {1, 10}, //E_TOWER
+                                              {1, 3},  //E_WALL
+                                              {1, 7},  //E_BUILDINGS
+                                              {1, 5},  //E_QUARRY
+                                              {1, 40},  //E_MAGIC
+                                              {1, 40},  //E_ZOO
+                                              {1, 2}   //E_RES
+        };
+    int card_power= 0;
+    int element_power;
+
+   
+    if ( pCard->to_player_tower  == 99 || pCard->to_pl_enm_tower  == 99|| 
+            pCard->to_player_tower2 == 99 || pCard->to_pl_enm_tower2 == 99 )
+        element_power = enemy->tower_height - player->tower_height; 
+    else
+        element_power = pCard->to_player_tower + pCard->to_pl_enm_tower + pCard->to_player_tower2 + pCard->to_pl_enm_tower2;
+        
+    if ( player->tower_height >= 10 )
+      card_power += mastery_coeff[P_TOWER_M10][mastery]*element_power; 
+    else
+      card_power += 20*element_power; 
+
+
+    if ( pCard->to_player_wall  == 99 || pCard->to_pl_enm_wall  == 99 || 
+         pCard->to_player_wall2 == 99 || pCard->to_pl_enm_wall2 == 99 )
+        element_power = enemy->wall_height - player->wall_height;
+    else
+        element_power = pCard->to_player_wall  + pCard->to_pl_enm_wall + 
+                        pCard->to_player_wall2 + pCard->to_pl_enm_wall2;
+    if ( player->wall_height >= 10 )
+        card_power += mastery_coeff[P_WALL_M10][mastery]*element_power; //1
+    else
+        card_power += 5*element_power; 
+
+
+    card_power += 7 * (pCard->to_player_buildings  + pCard->to_pl_enm_buildings + 
+                       pCard->to_player_buildings2 + pCard->to_pl_enm_buildings2);
+
+    if ( pCard->to_player_quarry_lvl  == 99 || pCard->to_pl_enm_quarry_lvl  == 99 || 
+         pCard->to_player_quarry_lvl2 == 99 || pCard->to_pl_enm_quarry_lvl2 == 99 )
+        element_power = enemy->quarry_level - player->quarry_level;
+    else
+        element_power = pCard->to_player_quarry_lvl  + pCard->to_pl_enm_quarry_lvl + 
+                        pCard->to_player_quarry_lvl2 + pCard->to_pl_enm_quarry_lvl;
+
+    card_power += 40 * element_power;
+
+    if ( pCard->to_player_magic_lvl  == 99 || pCard->to_pl_enm_magic_lvl  == 99 || 
+         pCard->to_player_magic_lvl2 == 99 || pCard->to_pl_enm_magic_lvl2 == 99 )
+        element_power = enemy->magic_level - player->magic_level;
+    else
+        element_power = pCard->to_player_magic_lvl  + pCard->to_pl_enm_magic_lvl + 
+                        pCard->to_player_magic_lvl2 + pCard->to_pl_enm_magic_lvl2;
+    card_power += 40 *element_power;
+
+    if ( pCard->to_player_zoo_lvl  == 99 || pCard->to_pl_enm_zoo_lvl  == 99 || 
+         pCard->to_player_zoo_lvl2 == 99 || pCard->to_pl_enm_zoo_lvl2 == 99 )
+        element_power = enemy->zoo_level - player->zoo_level;
+    else
+        element_power =  pCard->to_player_zoo_lvl  + pCard->to_pl_enm_zoo_lvl + 
+                         pCard->to_player_zoo_lvl2 + pCard->to_pl_enm_zoo_lvl2;
+    card_power += 40 *element_power;
+
+    if ( pCard->to_player_bricks  == 99 || pCard->to_pl_enm_bricks  == 99 || 
+         pCard->to_player_bricks2 == 99 || pCard->to_pl_enm_bricks2 == 99 )
+        element_power = enemy->resource_bricks - player->resource_bricks;
+    else
+        element_power = pCard->to_player_bricks  + pCard->to_pl_enm_bricks + 
+                        pCard->to_player_bricks2 + pCard->to_pl_enm_bricks2;
+    card_power += 2 *element_power;
+
+
+    if ( pCard->to_player_gems  == 99 || pCard->to_pl_enm_gems  == 99 || 
+         pCard->to_player_gems2 == 99 || pCard->to_pl_enm_gems2 == 99 )
+         element_power = enemy->resource_gems - player->resource_gems;
+    else
+        element_power = pCard->to_player_gems  + pCard->to_pl_enm_gems + 
+                        pCard->to_player_gems2 + pCard->to_pl_enm_gems2;
+    card_power += 2 *element_power;
+
+    if ( pCard->to_player_beasts  == 99 || pCard->to_pl_enm_beasts  == 99 || 
+        pCard->to_player_beasts2 == 99 || pCard->to_pl_enm_beasts2 == 99 )
+        element_power = enemy->resource_beasts - player->resource_beasts;
+    else
+        element_power = pCard->to_player_beasts  + pCard->to_pl_enm_beasts + 
+                        pCard->to_player_beasts2 + pCard->to_pl_enm_beasts2;
+    card_power += 2 *element_power;
+
+    if ( pCard->to_enemy_tower == 99 || pCard->to_enemy_tower2 == 99 )
+        element_power = player->tower_height - enemy->tower_height;  
+    else
+        element_power = -(pCard->to_enemy_tower + pCard->to_enemy_tower2);
+    card_power += mastery_coeff[E_TOWER][mastery]*element_power;
+
+    if ( pCard->to_enemy_wall == 99 || pCard->to_enemy_wall2 == 99 )
+        element_power = player->wall_height - enemy->wall_height;  
+    else
+        element_power = -(pCard->to_enemy_wall + pCard->to_enemy_wall2);
+    card_power += mastery_coeff[E_WALL][mastery]*element_power;
+
+     card_power -= mastery_coeff[E_BUILDINGS][mastery]*(pCard->to_enemy_buildings + pCard->to_enemy_buildings2); 
+ 
+    if ( pCard->to_enemy_quarry_lvl == 99 || pCard->to_enemy_quarry_lvl2 == 99 )
+        element_power = player->quarry_level - enemy->quarry_level;  //5
+    else
+        element_power = -(pCard->to_enemy_quarry_lvl + pCard->to_enemy_quarry_lvl2); //5
+    card_power += mastery_coeff[E_QUARRY][mastery]*element_power;
+
+    if ( pCard->to_enemy_magic_lvl == 99 || pCard->to_enemy_magic_lvl2 == 99 )
+        element_power = player->magic_level - enemy->magic_level;  //40
+    else
+        element_power = -(pCard->to_enemy_magic_lvl + pCard->to_enemy_magic_lvl2);
+    card_power += mastery_coeff[E_MAGIC][mastery]*element_power;
+
+    if ( pCard->to_enemy_zoo_lvl == 99 || pCard->to_enemy_zoo_lvl2 == 99 )
+        element_power = player->zoo_level - enemy->zoo_level; //40
+    else
+        element_power = -(pCard->to_enemy_zoo_lvl + pCard->to_enemy_zoo_lvl2);
+    card_power += mastery_coeff[E_ZOO][mastery]*element_power;
+
+    if ( pCard->to_enemy_bricks == 99 || pCard->to_enemy_bricks2 == 99 )
+        element_power = player->resource_bricks - enemy->resource_bricks;  //2
+    else
+        element_power = -(pCard->to_enemy_bricks + pCard->to_enemy_bricks2);
+    card_power += mastery_coeff[E_RES][mastery]*element_power;
+
+    if ( pCard->to_enemy_gems == 99 || pCard->to_enemy_gems2 == 99 )
+        element_power = player->resource_gems - enemy->resource_gems; //2
+    else
+        element_power = -(pCard->to_enemy_gems + pCard->to_enemy_gems2);
+    card_power += mastery_coeff[E_RES][mastery]*element_power;
+
+    if ( pCard->to_enemy_beasts == 99 || pCard->to_enemy_beasts2 == 99 )
+        element_power = player->resource_beasts - enemy->resource_beasts;  //2
+    else
+        element_power = -(pCard->to_enemy_beasts + pCard->to_enemy_beasts2);
+    card_power += mastery_coeff[E_RES][mastery]*element_power;
+
+    if ( pCard->field_30 || pCard->field_4D )
+         card_power *= 10;
+
+    if ( pCard->field_24 == 1 )
+        element_power = player->resource_bricks - pCard->needed_bricks;
+    else if ( pCard->field_24 == 2 )
+        element_power = player->resource_gems   - pCard->needed_gems;
+    else if (pCard->field_24 == 3)
+        element_power = player->resource_beasts - pCard->needed_beasts;
+    if ( element_power > 3 )
+        element_power = 3;
+    card_power += 5 * element_power;
+
+    if ( enemy->tower_height <= pCard->to_enemy_tower2 + pCard->to_enemy_tower )
+        card_power += 9999;
+  
+    if (pCard->to_enemy_tower2    + pCard->to_enemy_tower + 
+        pCard->to_enemy_wall      + pCard->to_enemy_wall2 + 
+        pCard->to_enemy_buildings + pCard->to_enemy_buildings2 >= enemy->wall_height + enemy->tower_height) 
+        card_power += 9999;
+
+    if ( (pCard->to_player_tower2 + pCard->to_pl_enm_tower2 + 
+          pCard->to_player_tower  + pCard->to_pl_enm_tower  + player->tower_height) >= max_tower_height )
+        card_power += 9999;
+
+    return card_power;
+    }
+
+
 //----- (00408BB4) --------------------------------------------------------
-bool __fastcall am_408BB4(int a1)
+bool OpponentsAITurn(int player_num)
 {
-//  char result; // al@3
-//  signed int v3; // ebx@8
-//  int v4; // esi@8
-//  int v5; // eax@9
-//  int v6; // edi@9
-//  int v7; // eax@11
-//  signed int v8; // eax@11
-//  int v9; // ebx@5
-//  int v10; // eax@5
-//  int v11; // ecx@18
-//  char v12; // bl@20
-//  int v13; // eax@20
-//  ArcomageCard *v14; // ecx@20
-//  char v15; // dl@20
-//  char v16; // dl@24
-//  int v17; // edx@25
-//  int v18; // edx@27
-//  char v19; // dl@31
-//  int v20; // edx@32
-//  char v21; // dl@35
-//  char v22; // dl@39
-//  int v23; // edx@40
-//  char v24; // dl@45
-//  int v25; // edx@46
-//  char v26; // dl@52
-//  int v27; // edx@53
-//  char v28; // dl@58
-//  int v29; // edx@59
-//  char v30; // dl@64
-//  int v31; // edx@65
-//  char v32; // dl@70
-//  int v33; // edx@71
-//  char v34; // dl@76
-//  int v35; // edx@77
-//  char v36; // dl@82
-//  int v37; // edx@83
-//  char v38; // dl@86
-//  char v39; // dl@90
-//  int v40; // edi@93
-//  char v41; // dl@93
-//  int v42; // esi@93
-//  char v43; // bl@94
-//  int v44; // esi@95
-//  char v45; // dl@99
-//  char v46; // dl@103
-//  char v47; // dl@107
-//  char v48; // dl@111
-//  char v49; // dl@115
-//  ArcomagePlayer *v50; // ebx@116
-//  ArcomagePlayer *v51; // edx@116
-//  int v52; // esi@124
-//  int v53; // edx@124
-//  int v54; // edx@127
-//  int v55; // esi@130
-//  int v56; // edi@138
-//  int l; // esi@138
-//  int v58; // eax@140
-//  int v59; // ecx@142
-//  int v60; // edx@142
-//  int v61; // ebx@142
-//  int v62; // eax@145
-//  int v63; // esi@146
-//  int v64; // ebx@4
-//  int v65; // eax@4
-//  int v66; // ecx@168
-//  char v67; // bl@170
-//  int v68; // eax@170
-//  ArcomageCard *v69; // ecx@170
-//  char v70; // dl@170
-//  char v71; // dl@174
-//  int v72; // edx@175
-//  int v73; // edx@177
-//  char v74; // dl@181
-//  char v75; // dl@184
-//  char v76; // dl@188
-//  int v77; // edx@189
-//  char v78; // dl@194
-//  char v79; // dl@200
-//  int v80; // edx@201
-//  char v81; // dl@206
-//  int v82; // edx@207
-//  char v83; // dl@212
-//  int v84; // edx@213
-//  char v85; // dl@218
-//  int v86; // edx@219
-//  char v87; // dl@224
-//  int v88; // edx@225
-//  char v89; // dl@230
-//  int v90; // edx@231
-//  char v91; // dl@234
-//  int v92; // edx@235
-//  char v93; // dl@238
-//  int v94; // edx@239
-//  int v95; // esi@241
-//  char v96; // dl@241
-//  int v97; // esi@241
-//  char v98; // bl@242
-//  int v99; // edi@243
-//  int v100; // edx@245
-//  int v101; // edi@246
-//  char v102; // dl@247
-//  int v103; // edx@248
-//  char v104; // dl@251
-//  int v105; // edx@252
-//  char v106; // dl@255
-//  int v107; // edx@256
-//  char v108; // dl@259
-//  int v109; // edx@260
-//  char v110; // dl@263
-//  ArcomagePlayer *v111; // ebx@264
-//  ArcomagePlayer *v112; // edx@264
-//  int v113; // esi@272
-//  int v114; // edx@272
-//  int v115; // edx@275
-//  int v116; // esi@278
-//  int v117; // edi@286
-//  int j; // esi@286
-//  int v119; // eax@288
-//  int v120; // ecx@290
-//  int v121; // edx@290
-//  int v122; // ebx@290
-//  int v123; // eax@293
-//  int v124; // esi@294
-//  int v125; // [sp-28h] [bp-28h]@130
-//  int v126; // [sp-28h] [bp-28h]@278
-//  int k; // [sp-24h] [bp-24h]@18
-//  int i; // [sp-24h] [bp-24h]@168
-//  int v129; // [sp-20h] [bp-20h]@5
-//  int v130; // [sp-20h] [bp-20h]@4
-//  int v131; // [sp-1Ch] [bp-1Ch]@17
-//  int v132; // [sp-1Ch] [bp-1Ch]@140
-//  int v133; // [sp-1Ch] [bp-1Ch]@167
-//  int v134; // [sp-1Ch] [bp-1Ch]@288
-//  int v135; // [sp-18h] [bp-18h]@5
-//  int v136; // [sp-18h] [bp-18h]@4
-//  signed int v137; // [sp-14h] [bp-14h]@0
-//  int v138; // [sp-14h] [bp-14h]@93
-//  int v139; // [sp-14h] [bp-14h]@130
-//  int v140; // [sp-14h] [bp-14h]@241
-//  int v141; // [sp-14h] [bp-14h]@278
-//  ArcomagePlayer *v142; // [sp-10h] [bp-10h]@5
-//  ArcomagePlayer *v143; // [sp-10h] [bp-10h]@4
-//  ArcomagePlayer *v144; // [sp-Ch] [bp-Ch]@5
-//  ArcomagePlayer *v145; // [sp-Ch] [bp-Ch]@4
-//  char v146; // [sp-8h] [bp-8h]@35
-//  char v147; // [sp-8h] [bp-8h]@184
-//  char v148; // [sp-5h] [bp-5h]@20
-//  char v149; // [sp-5h] [bp-5h]@170
-//
-//  byte_4FAA00 = 1;
-//  if ( dword_4DF3A4 )
-//  {
-//    if ( dword_4DF3A4 != 1 )
-//    {
-//      result = dword_4DF3A4 - 2;
-//      if ( dword_4DF3A4 != 2 )
-//        return result != 0;
-//      v64 = a1;
-//      v145 = &stru_505708[a1];
-//      v130 = a1;
-//      v143 = &stru_505708[(a1 + 1) % 2];
-//      v136 = GetPlayerHandCardCount(a1);
-//      v65 = 0;
-//      do
-//      {
-//        if ( v65 >= v136 )
-//        {
-//          dword_4FA9B0[2 * v65] = -1;
-//          dword_4FA9B4[2 * v65] = -9999;
-//        }
-//        else
-//        {
-//          dword_4FA9B0[2 * v65] = v65;
-//          dword_4FA9B4[2 * v65] = 0;
-//        }
-//        ++v65;
-//      }
-//      while ( v65 < 10 );
-//      v133 = 0;
-//      if ( v136 > 0 )
-//      {
-//        v66 = 47 * v64;
-//        for ( i = 47 * v64; ; v66 = i )
-//        {
-//          v67 = 99;
-//          v68 = 2 * v133;
-//          v69 = &pCards[stru_505708[0].cards_at_hand[v66 + dword_4FA9B0[2 * v133]]];
-//          v70 = v69->field_38[2];
-//          v149 = v69->field_38[2];
-//          if ( v145->field_24 >= 10 )
-//          {
-//            if ( v70 == 99
-//              || v69->field_48[4] == 99
-//              || v69->field_48[15] == 99
-//              || (v74 = BYTE1(v69->field_68), v74 == 99) )
-//              v73 = 5 * (v143->field_24 - v145->field_24);
-//            else
-//              v73 = 5 * (v149 + v69->field_48[4] + v69->field_48[15] + v74);
-//          }
-//          else
-//          {
-//            if ( v70 == 99
-//              || v69->field_48[4] == 99
-//              || v69->field_48[15] == 99
-//              || (v71 = BYTE1(v69->field_68), v71 == 99) )
-//              v72 = 5 * (v143->field_24 - v145->field_24);
-//            else
-//              v72 = 5 * (v149 + v69->field_48[4] + v69->field_48[15] + v71);
-//            v73 = 4 * v72;
-//          }
-//          dword_4FA9B4[v68] += v73;
-//          v75 = v69->field_38[1];
-//          v147 = v69->field_38[1];
-//          if ( v145->field_28 >= 10 )
-//          {
-//            if ( v75 == 99
-//              || v69->field_48[3] == 99
-//              || v69->field_48[14] == 99
-//              || (v78 = LOBYTE(v69->field_68), v78 == 99) )
-//              v77 = v143->field_28 - v145->field_28;
-//            else
-//              v77 = v147 + v69->field_48[3] + v69->field_48[14] + v78;
-//          }
-//          else
-//          {
-//            if ( v75 == 99
-//              || v69->field_48[3] == 99
-//              || v69->field_48[14] == 99
-//              || (v76 = LOBYTE(v69->field_68), v76 == 99) )
-//              v77 = 5 * (v143->field_28 - v145->field_28);
-//            else
-//              v77 = 5 * (v147 + v69->field_48[3] + v69->field_48[14] + v76);
-//          }
-//          dword_4FA9B4[v68] += v77;
-//          dword_4FA9B4[v68] += 7 * (v69->field_38[0] + v69->field_48[2] + v69->field_48[13] + v69->field_58[15]);
-//          if ( BYTE2(v69->field_30) == 99
-//            || v69->field_38[12] == 99
-//            || v69->field_48[7] == 99
-//            || (v79 = v69->field_58[9], v79 == 99) )
-//            v80 = 5 * (v143->field_2C - v145->field_2C);
-//          else
-//            v80 = 5 * (BYTE2(v69->field_30) + v69->field_38[12] + v69->field_48[7] + v79);
-//          dword_4FA9B4[v68] += 8 * v80;
-//          if ( BYTE3(v69->field_30) == 99
-//            || v69->field_38[13] == 99
-//            || v69->field_48[8] == 99
-//            || (v81 = v69->field_58[10], v81 == 99) )
-//            v82 = 5 * (v143->field_30 - v145->field_30);
-//          else
-//            v82 = 5 * (BYTE3(v69->field_30) + v69->field_38[13] + v69->field_48[8] + v81);
-//          dword_4FA9B4[v68] += 8 * v82;
-//          if ( LOBYTE(v69->field_34) == 99
-//            || v69->field_38[14] == 99
-//            || v69->field_48[9] == 99
-//            || (v83 = v69->field_58[11], v83 == 99) )
-//            v84 = 5 * (v143->field_34 - v145->field_34);
-//          else
-//            v84 = 5 * (LOBYTE(v69->field_34) + v69->field_38[14] + v69->field_48[9] + v83);
-//          dword_4FA9B4[v68] += 8 * v84;
-//          if ( BYTE1(v69->field_34) == 99
-//            || v69->field_38[15] == 99
-//            || v69->field_48[10] == 99
-//            || (v85 = v69->field_58[12], v85 == 99) )
-//            v86 = v143->field_38 - v145->field_38;
-//          else
-//            v86 = BYTE1(v69->field_34) + v69->field_38[15] + v69->field_48[10] + v85;
-//          dword_4FA9B4[v68] += 2 * v86;
-//          if ( BYTE2(v69->field_34) == 99
-//            || v69->field_48[0] == 99
-//            || v69->field_48[11] == 99
-//            || (v87 = v69->field_58[13], v87 == 99) )
-//            v88 = v143->field_3C - v145->field_3C;
-//          else
-//            v88 = BYTE2(v69->field_34) + v69->field_48[0] + v69->field_48[11] + v87;
-//          dword_4FA9B4[v68] += 2 * v88;
-//          if ( BYTE3(v69->field_34) == 99
-//            || v69->field_48[1] == 99
-//            || v69->field_48[12] == 99
-//            || (v89 = v69->field_58[14], v89 == 99) )
-//            v90 = v143->field_40 - v145->field_40;
-//          else
-//            v90 = BYTE3(v69->field_34) + v69->field_48[1] + v69->field_48[12] + v89;
-//          dword_4FA9B4[v68] += 2 * v90;
-//          if ( v69->field_38[11] == 99 || (v91 = v69->field_58[8], v91 == 99) )
-//            v92 = 10 * (v145->field_24 - v143->field_24);
-//          else
-//            v92 = -10 * (v69->field_38[11] + v91);
-//          dword_4FA9B4[v68] += v92;
-//          if ( v69->field_38[10] == 99 || (v93 = v69->field_58[7], v93 == 99) )
-//            v94 = 3 * (v145->field_28 - v143->field_28);
-//          else
-//            v94 = -3 * (v69->field_38[10] + v93);
-//          dword_4FA9B4[v68] += v94;
-//          v95 = v69->field_38[9];
-//          v140 = v95;
-//          v96 = v69->field_38[3];
-//          dword_4FA9B4[v68] += -7 * (v69->field_58[6] + v95);
-//          v97 = dword_4FA9B4[v68];
-//          if ( v96 == 99 )
-//            goto LABEL_245;
-//          v98 = v69->field_58[0];
-//          if ( v98 == 99 )
-//            break;
-//          v99 = v96 + v98;
-//          v67 = 99;
-//          dword_4FA9B4[v68] = v97 - 5 * v99;
-//LABEL_246:
-//          v101 = v140;
-//          if ( v69->field_38[4] == v67 || (v102 = v69->field_58[1], v102 == v67) )
-//            v103 = 5 * (v145->field_30 - v143->field_30);
-//          else
-//            v103 = -5 * (v69->field_38[4] + v102);
-//          dword_4FA9B4[v68] += v103;
-//          if ( v69->field_38[5] == v67 || (v104 = v69->field_58[2], v104 == v67) )
-//            v105 = 5 * (v145->field_34 - v143->field_34);
-//          else
-//            v105 = -5 * (v69->field_38[5] + v104);
-//          dword_4FA9B4[v68] += v105;
-//          if ( v69->field_38[6] == v67 || (v106 = v69->field_58[3], v106 == v67) )
-//            v107 = v145->field_38 - v143->field_38;
-//          else
-//            v107 = -(v69->field_38[6] + v106);
-//          dword_4FA9B4[v68] += 2 * v107;
-//          if ( v69->field_38[7] == v67 || (v108 = v69->field_58[4], v108 == v67) )
-//            v109 = v145->field_3C - v143->field_3C;
-//          else
-//            v109 = -(v69->field_38[7] + v108);
-//          dword_4FA9B4[v68] += 2 * v109;
-//          if ( v69->field_38[8] == v67 || (v110 = v69->field_58[5], v110 == v67) )
-//          {
-//            v112 = v145;
-//            v111 = v143;
-//            dword_4FA9B4[v68] += 2 * (v145->field_40 - v143->field_40);
-//          }
-//          else
-//          {
-//            v111 = v143;
-//            dword_4FA9B4[v68] += -2 * (v69->field_38[8] + v110);
-//            v112 = v145;
-//          }
-//          if ( LOBYTE(v69->field_30) || v69->field_48[5] )
-//            dword_4FA9B4[v68] *= 10;
-//          if ( LOBYTE(v69->field_24) == 1 )
-//          {
-//            v113 = LOBYTE(v69->field_28);
-//            v114 = v112->field_38;
-//          }
-//          else
-//          {
-//            if ( LOBYTE(v69->field_24) == 2 )
-//            {
-//              v113 = BYTE1(v69->field_28);
-//              v114 = v112->field_3C;
-//            }
-//            else
-//            {
-//              if ( LOBYTE(v69->field_24) != 3 )
-//                goto LABEL_278;
-//              v113 = BYTE2(v69->field_28);
-//              v114 = v112->field_40;
-//            }
-//          }
-//          v115 = v114 - v113;
-//          if ( v115 > 3 )
-//            v115 = 3;
-//          dword_4FA9B4[v68] += 5 * v115;
-//LABEL_278:
-//          v116 = v69->field_58[8];
-//          v141 = v111->field_24;
-//          v126 = v69->field_38[11];
-//          if ( v141 <= v116 + v126 )
-//            dword_4FA9B4[v68] += 9999;
-//          v137 = v111->field_28 + v141;
-//          if ( v137 <= v116 + v126 + v69->field_58[6] + v69->field_58[7] + v101 + v69->field_38[10] )
-//            dword_4FA9B4[v68] += 9999;
-//          if ( v69->field_48[15] + (signed int)BYTE1(v69->field_68) + v145->field_24 + v69->field_48[4] + v149 >= dword_4E1884 )
-//            dword_4FA9B4[v68] += 9999;
-//          ++v133;
-//          if ( v133 >= v136 )
-//          {
-//            v64 = v130;
-//            goto LABEL_286;
-//          }
-//        }
-//        v67 = 99;
-//LABEL_245:
-//        v100 = v145->field_2C - v143->field_2C;
-//        dword_4FA9B4[v68] = v97 + 4 * v100 + v100;
-//        goto LABEL_246;
-//      }
-//LABEL_286:
-//      v117 = v136 - 1;
-//      for ( j = v136 - 1; j >= 0; --j )
-//      {
-//        v137 = 0;
-//        if ( j > 0 )
-//        {
-//          v119 = (int)dword_4FA9B0;
-//          v134 = j;
-//          v137 = j;
-//          do
-//          {
-//            if ( *(unsigned int *)(v119 + 4) < *(unsigned int *)(v119 + 12) )
-//            {
-//              v120 = *(unsigned int *)v119;
-//              v121 = *(unsigned int *)(v119 + 4);
-//              *(unsigned int *)v119 = *(unsigned int *)(v119 + 8);
-//              v122 = *(unsigned int *)(v119 + 12);
-//              *(unsigned int *)(v119 + 8) = v120;
-//              *(unsigned int *)(v119 + 4) = v122;
-//              v64 = v130;
-//              *(unsigned int *)(v119 + 12) = v121;
-//            }
-//            v119 += 8;
-//            --v134;
-//          }
-//          while ( v134 );
-//        }
-//      }
-//      v123 = v136 - 1;
-//      if ( am_byte_4FAA77 )
-//      {
-//        if ( v117 >= 0 )
-//        {
-//          while ( !BYTE3(pCards[stru_505708[0].cards_at_hand[47 * v64 + dword_4FA9B0[2 * v123]]].field_28) )
-//          {
-//            --v123;
-//            if ( v123 < 0 )
-//              return am_40BCFB(v64, v137) != 0;
-//          }
-//          v137 = dword_4FA9B0[2 * v123];
-//        }
-//      }
-//      else
-//      {
-//        v124 = 0;
-//        if ( v117 >= 0 )
-//        {
-//          while ( !BYTE3(pCards[stru_505708[0].cards_at_hand[47 * v64 + dword_4FA9B0[2 * v123]]].field_28) )
-//          {
-//            --v123;
-//            if ( v123 < 0 )
-//              goto LABEL_299;
-//          }
-//          v137 = dword_4FA9B0[2 * v123];
-//        }
-//LABEL_299:
-//        if ( v136 > 0 )
-//        {
-//          while ( !am_40BF15(v64, dword_4FA9B0[2 * v124]) || dword_4FA9B4[2 * v124] < 0 )
-//          {
-//            ++v124;
-//            if ( v124 >= v136 )
-//              return am_40BCFB(v64, v137) != 0;
-//          }
-//          return am_40BE0E(v64, dword_4FA9B0[2 * v124]) != 0;
-//        }
-//      }
-//      return am_40BCFB(v64, v137) != 0;
-//    }
-//    v9 = a1;
-//    v144 = &stru_505708[a1];
-//    v129 = a1;
-//    v142 = &stru_505708[(a1 + 1) % 2];
-//    v135 = GetPlayerHandCardCount(a1);
-//    v10 = 0;
-//    do
-//    {
-//      if ( v10 >= v135 )
-//      {
-//        dword_4FA9B0[2 * v10] = -1;
-//        dword_4FA9B4[2 * v10] = -9999;
-//      }
-//      else
-//      {
-//        dword_4FA9B0[2 * v10] = v10;
-//        dword_4FA9B4[2 * v10] = 0;
-//      }
-//      ++v10;
-//    }
-//    while ( v10 < 10 );
-//    v131 = 0;
-//    if ( v135 > 0 )
-//    {
-//      v11 = 47 * v9;
-//      for ( k = 47 * v9; ; v11 = k )
-//      {
-//        v12 = 99;
-//        v13 = 2 * v131;
-//        v14 = &pCards[stru_505708[0].cards_at_hand[v11 + dword_4FA9B0[2 * v131]]];
-//        v15 = v14->field_38[2];
-//        v148 = v14->field_38[2];
-//        if ( v144->field_24 >= 10 )
-//        {
-//          if ( v15 == 99 || v14->field_48[4] == 99 || v14->field_48[15] == 99 || (v19 = BYTE1(v14->field_68), v19 == 99) )
-//            v20 = 5 * (v142->field_24 - v144->field_24);
-//          else
-//            v20 = 5 * (v148 + v14->field_48[4] + v14->field_48[15] + v19);
-//          v18 = 2 * v20;
-//        }
-//        else
-//        {
-//          if ( v15 == 99 || v14->field_48[4] == 99 || v14->field_48[15] == 99 || (v16 = BYTE1(v14->field_68), v16 == 99) )
-//            v17 = 5 * (v142->field_24 - v144->field_24);
-//          else
-//            v17 = 5 * (v148 + v14->field_48[4] + v14->field_48[15] + v16);
-//          v18 = 4 * v17;
-//        }
-//        dword_4FA9B4[v13] += v18;
-//        v21 = v14->field_38[1];
-//        v146 = v14->field_38[1];
-//        if ( v144->field_28 >= 10 )
-//        {
-//          if ( v21 == 99
-//            || v14->field_48[3] == 99
-//            || v14->field_48[14] == 99
-//            || (v24 = LOBYTE(v14->field_68), v24 == 99) )
-//            v25 = v142->field_28 - v144->field_28;
-//          else
-//            v25 = v146 + v14->field_48[3] + v14->field_48[14] + v24;
-//          v23 = 2 * v25;
-//        }
-//        else
-//        {
-//          if ( v21 == 99
-//            || v14->field_48[3] == 99
-//            || v14->field_48[14] == 99
-//            || (v22 = LOBYTE(v14->field_68), v22 == 99) )
-//            v23 = 5 * (v142->field_28 - v144->field_28);
-//          else
-//            v23 = 5 * (v146 + v14->field_48[3] + v14->field_48[14] + v22);
-//        }
-//        dword_4FA9B4[v13] += v23;
-//        dword_4FA9B4[v13] += 7 * (v14->field_38[0] + v14->field_48[2] + v14->field_48[13] + v14->field_58[15]);
-//        if ( BYTE2(v14->field_30) == 99
-//          || v14->field_38[12] == 99
-//          || v14->field_48[7] == 99
-//          || (v26 = v14->field_58[9], v26 == 99) )
-//          v27 = 5 * (v142->field_2C - v144->field_2C);
-//        else
-//          v27 = 5 * (BYTE2(v14->field_30) + v14->field_38[12] + v14->field_48[7] + v26);
-//        dword_4FA9B4[v13] += 8 * v27;
-//        if ( BYTE3(v14->field_30) == 99
-//          || v14->field_38[13] == 99
-//          || v14->field_48[8] == 99
-//          || (v28 = v14->field_58[10], v28 == 99) )
-//          v29 = 5 * (v142->field_30 - v144->field_30);
-//        else
-//          v29 = 5 * (BYTE3(v14->field_30) + v14->field_38[13] + v14->field_48[8] + v28);
-//        dword_4FA9B4[v13] += 8 * v29;
-//        if ( LOBYTE(v14->field_34) == 99
-//          || v14->field_38[14] == 99
-//          || v14->field_48[9] == 99
-//          || (v30 = v14->field_58[11], v30 == 99) )
-//          v31 = 5 * (v142->field_34 - v144->field_34);
-//        else
-//          v31 = 5 * (LOBYTE(v14->field_34) + v14->field_38[14] + v14->field_48[9] + v30);
-//        dword_4FA9B4[v13] += 8 * v31;
-//        if ( BYTE1(v14->field_34) == 99
-//          || v14->field_38[15] == 99
-//          || v14->field_48[10] == 99
-//          || (v32 = v14->field_58[12], v32 == 99) )
-//          v33 = v142->field_38 - v144->field_38;
-//        else
-//          v33 = BYTE1(v14->field_34) + v14->field_38[15] + v14->field_48[10] + v32;
-//        dword_4FA9B4[v13] += 2 * v33;
-//        if ( BYTE2(v14->field_34) == 99
-//          || v14->field_48[0] == 99
-//          || v14->field_48[11] == 99
-//          || (v34 = v14->field_58[13], v34 == 99) )
-//          v35 = v142->field_3C - v144->field_3C;
-//        else
-//          v35 = BYTE2(v14->field_34) + v14->field_48[0] + v14->field_48[11] + v34;
-//        dword_4FA9B4[v13] += 2 * v35;
-//        if ( BYTE3(v14->field_34) == 99
-//          || v14->field_48[1] == 99
-//          || v14->field_48[12] == 99
-//          || (v36 = v14->field_58[14], v36 == 99) )
-//          v37 = v142->field_40 - v144->field_40;
-//        else
-//          v37 = BYTE3(v14->field_34) + v14->field_48[1] + v14->field_48[12] + v36;
-//        dword_4FA9B4[v13] += 2 * v37;
-//        if ( v14->field_38[11] == 99 || (v38 = v14->field_58[8], v38 == 99) )
-//          dword_4FA9B4[v13] += v144->field_24 - v142->field_24;
-//        else
-//          dword_4FA9B4[v13] -= v14->field_38[11] + v38;
-//        if ( v14->field_38[10] == 99 || (v39 = v14->field_58[7], v39 == 99) )
-//          dword_4FA9B4[v13] += v144->field_28 - v142->field_28;
-//        else
-//          dword_4FA9B4[v13] -= v14->field_38[10] + v39;
-//        v40 = v14->field_38[9];
-//        v138 = v14->field_38[9];
-//        dword_4FA9B4[v13] -= v40 + v14->field_58[6];
-//        v41 = v14->field_38[3];
-//        v42 = dword_4FA9B4[v13];
-//        if ( v41 == 99 )
-//          goto LABEL_97;
-//        v43 = v14->field_58[0];
-//        if ( v43 == 99 )
-//          break;
-//        v44 = v42 - v43;
-//        v12 = 99;
-//        dword_4FA9B4[v13] = v44 - v41;
-//LABEL_98:
-//        if ( v14->field_38[4] == v12 || (v45 = v14->field_58[1], v45 == v12) )
-//          dword_4FA9B4[v13] += v144->field_30 - v142->field_30;
-//        else
-//          dword_4FA9B4[v13] -= v14->field_38[4] + v45;
-//        if ( v14->field_38[5] == v12 || (v46 = v14->field_58[2], v46 == v12) )
-//          dword_4FA9B4[v13] += v144->field_34 - v142->field_34;
-//        else
-//          dword_4FA9B4[v13] -= v14->field_38[5] + v46;
-//        if ( v14->field_38[6] == v12 || (v47 = v14->field_58[3], v47 == v12) )
-//          dword_4FA9B4[v13] += v144->field_38 - v142->field_38;
-//        else
-//          dword_4FA9B4[v13] -= v14->field_38[6] + v47;
-//        if ( v14->field_38[7] == v12 || (v48 = v14->field_58[4], v48 == v12) )
-//          dword_4FA9B4[v13] += v144->field_3C - v142->field_3C;
-//        else
-//          dword_4FA9B4[v13] -= v14->field_38[7] + v48;
-//        if ( v14->field_38[8] == v12 || (v49 = v14->field_58[5], v49 == v12) )
-//        {
-//          v51 = v144;
-//          v50 = v142;
-//          dword_4FA9B4[v13] += v144->field_40 - v142->field_40;
-//        }
-//        else
-//        {
-//          v50 = v142;
-//          dword_4FA9B4[v13] -= v14->field_38[8] + v49;
-//          v51 = v144;
-//        }
-//        if ( LOBYTE(v14->field_30) || v14->field_48[5] )
-//          dword_4FA9B4[v13] *= 10;
-//        if ( LOBYTE(v14->field_24) == 1 )
-//        {
-//          v52 = LOBYTE(v14->field_28);
-//          v53 = v51->field_38;
-//        }
-//        else
-//        {
-//          if ( LOBYTE(v14->field_24) == 2 )
-//          {
-//            v52 = BYTE1(v14->field_28);
-//            v53 = v51->field_3C;
-//          }
-//          else
-//          {
-//            if ( LOBYTE(v14->field_24) != 3 )
-//              goto LABEL_130;
-//            v52 = BYTE2(v14->field_28);
-//            v53 = v51->field_40;
-//          }
-//        }
-//        v54 = v53 - v52;
-//        if ( v54 > 3 )
-//          v54 = 3;
-//        dword_4FA9B4[v13] += 5 * v54;
-//LABEL_130:
-//        v55 = v14->field_58[8];
-//        v139 = v50->field_24;
-//        v125 = v14->field_38[11];
-//        if ( v139 <= v55 + v125 )
-//          dword_4FA9B4[v13] += 9999;
-//        v137 = v50->field_28 + v139;
-//        if ( v137 <= v55 + v125 + v14->field_58[6] + v14->field_58[7] + v40 + v14->field_38[10] )
-//          dword_4FA9B4[v13] += 9999;
-//        if ( v14->field_48[15] + (signed int)BYTE1(v14->field_68) + v144->field_24 + v14->field_48[4] + v148 >= dword_4E1884 )
-//          dword_4FA9B4[v13] += 9999;
-//        ++v131;
-//        if ( v131 >= v135 )
-//        {
-//          v9 = v129;
-//          goto LABEL_138;
-//        }
-//      }
-//      v12 = 99;
-//LABEL_97:
-//      v40 = v138;
-//      dword_4FA9B4[v13] = v42 + v144->field_2C - v142->field_2C;
-//      goto LABEL_98;
-//    }
-//LABEL_138:
-//    v56 = v135 - 1;
-//    for ( l = v135 - 1; l >= 0; --l )
-//    {
-//      v137 = 0;
-//      if ( l > 0 )
-//      {
-//        v58 = (int)dword_4FA9B0;
-//        v132 = l;
-//        v137 = l;
-//        do
-//        {
-//          if ( *(unsigned int *)(v58 + 4) < *(unsigned int *)(v58 + 12) )
-//          {
-//            v59 = *(unsigned int *)v58;
-//            v60 = *(unsigned int *)(v58 + 4);
-//            *(unsigned int *)v58 = *(unsigned int *)(v58 + 8);
-//            v61 = *(unsigned int *)(v58 + 12);
-//            *(unsigned int *)(v58 + 8) = v59;
-//            *(unsigned int *)(v58 + 4) = v61;
-//            v9 = v129;
-//            *(unsigned int *)(v58 + 12) = v60;
-//          }
-//          v58 += 8;
-//          --v132;
-//        }
-//        while ( v132 );
-//      }
-//    }
-//    v62 = v135 - 1;
-//    if ( am_byte_4FAA77 )
-//    {
-//      if ( v56 >= 0 )
-//      {
-//        while ( !BYTE3(pCards[stru_505708[0].cards_at_hand[47 * v9 + dword_4FA9B0[2 * v62]]].field_28) )
-//        {
-//          --v62;
-//          if ( v62 < 0 )
-//            return am_40BCFB(v9, v137) != 0;
-//        }
-//        v137 = dword_4FA9B0[2 * v62];
-//      }
-//    }
-//    else
-//    {
-//      v63 = 0;
-//      if ( v56 >= 0 )
-//      {
-//        while ( !BYTE3(pCards[stru_505708[0].cards_at_hand[47 * v9 + dword_4FA9B0[2 * v62]]].field_28) )
-//        {
-//          --v62;
-//          if ( v62 < 0 )
-//            goto LABEL_151;
-//        }
-//        v137 = dword_4FA9B0[2 * v62];
-//      }
-//LABEL_151:
-//      if ( v135 > 0 )
-//      {
-//        while ( !am_40BF15(v9, dword_4FA9B0[2 * v63]) || dword_4FA9B4[2 * v63] < 0 )
-//        {
-//          ++v63;
-//          if ( v63 >= v135 )
-//            return am_40BCFB(v9, v137) != 0;
-//        }
-//        return am_40BE0E(v9, dword_4FA9B0[2 * v63]) != 0;
-//      }
-//    }
-//    return am_40BCFB(v9, v137) != 0;
-//  }
-//  v3 = 0;
-//  v4 = a1;
-//  if ( am_byte_4FAA77 )
-//  {
-//LABEL_11:
-//    v7 = GetPlayerHandCardCount(v4);
-//    v8 = rand_interval(0, v7 - 1);
-//    result = am_40BCFB(v4, v8);
-//  }
-//  else
-//  {
-//    while ( 1 )
-//    {
-//      v5 = GetPlayerHandCardCount(v4);
-//      v6 = rand_interval(0, v5 - 1);
-//      if ( am_40BF15(v4, v6) )
-//        break;
-//      ++v3;
-//      if ( v3 >= 10 )
-//        goto LABEL_11;
-//    }
-//    result = am_40BE0E(v4, v6);
-//  }
+
+    char result; // al@3
+    signed int v2; // ebx@8
+    int v3; // esi@8
+    int all_player_cards_count; // eax@9
+    int random_card_slot; // edi@9
+    int v6; // eax@11
+    signed int v7; // eax@11
+    int v8; // ebx@5
+    int v9; // eax@5
+    int v10; // ecx@18
+    int v11; // eax@20
+    ArcomageCard *v12; // ecx@20
+    char v13; // dl@20
+    char v14; // dl@24
+    int v15; // edx@25
+    int v16; // edx@27
+    char v17; // dl@31
+    int v18; // edx@32
+    char v19; // dl@35
+    char v20; // dl@39
+    int v21; // edx@40
+    char v22; // dl@45
+    int v23; // edx@46
+    char v24; // dl@52
+    int v25; // edx@53
+    char v26; // dl@58
+    int v27; // edx@59
+    char v28; // dl@64
+    int v29; // edx@65
+    char v30; // dl@70
+    int v31; // edx@71
+    char v32; // dl@76
+    int v33; // edx@77
+    char v34; // dl@82
+    int v35; // edx@83
+    char v36; // dl@86
+    char v37; // dl@90
+    int v38; // edi@93
+    char v39; // dl@93
+    int v40; // esi@93
+    char v41; // bl@94
+    char v42; // dl@98
+    char v43; // dl@102
+    char v44; // dl@106
+    char v45; // dl@110
+    char v46; // dl@114
+    ArcomagePlayer *v47; // ebx@115
+    ArcomagePlayer *v48; // edx@115
+    int v49; // esi@123
+    int v50; // edx@123
+    int v51; // edx@126
+    int v52; // esi@129
+    int v53; // edi@137
+    int j; // esi@137
+    am_2 *v55; // eax@139
+    int v56; // ecx@141
+    int v57; // edx@141
+    int v58; // ebx@141
+    int v59; // eax@144
+    int v60; // esi@145
+    int v61; // ebx@4
+    int v62; // eax@4
+    int v63; // ecx@167
+    int v64; // eax@169
+    ArcomageCard *pCard; // ecx@169
+    char v66; // dl@169
+    char v67; // dl@173
+    int v68; // edx@174
+    int v69; // edx@176
+    char v70; // dl@180
+    char v71; // dl@183
+    char v72; // dl@187
+    int v73; // edx@188
+    char v74; // dl@193
+    char v75; // dl@199
+    int v76; // edx@200
+    char v77; // dl@205
+    int v78; // edx@206
+    char v79; // dl@211
+    int v80; // edx@212
+    char v81; // dl@217
+    int v82; // edx@218
+    char v83; // dl@223
+    int v84; // edx@224
+    char v85; // dl@229
+    int v86; // edx@230
+    char v87; // dl@233
+    int v88; // edx@234
+    char v89; // dl@237
+    int v90; // edx@238
+    int v91; // esi@240
+    char v92; // dl@240
+    int v93; // esi@240
+    char v94; // bl@241
+    int v95; // edx@243
+    int v96; // edi@244
+    char v97; // dl@245
+    int v98; // edx@246
+    char v99; // dl@249
+    int v100; // edx@250
+    char v101; // dl@253
+    int v102; // edx@254
+    char v103; // dl@257
+    int v104; // edx@258
+    char v105; // dl@261
+    ArcomagePlayer *v106; // ebx@262
+    ArcomagePlayer *v107; // edx@262
+    int v108; // esi@270
+    int v109; // edx@270
+    int v110; // edx@273
+    int v111; // esi@276
+    int v112; // edi@284
+   // int j; // esi@284
+    am_2 *v114; // eax@286
+    int v115; // ecx@288
+    int v116; // edx@288
+    int v117; // ebx@288
+    int v118; // eax@291
+    int v119; // esi@292
+    int v120; // [sp-28h] [bp-28h]@129
+    int v121; // [sp-28h] [bp-28h]@276
+    int k; // [sp-24h] [bp-24h]@18
+    int i; // [sp-24h] [bp-24h]@167
+    int v124; // [sp-20h] [bp-20h]@5
+    int v125; // [sp-20h] [bp-20h]@4
+    int v126; // [sp-1Ch] [bp-1Ch]@17
+    int v127; // [sp-1Ch] [bp-1Ch]@139
+    int v128; // [sp-1Ch] [bp-1Ch]@166
+    int v129; // [sp-1Ch] [bp-1Ch]@286
+    int v130; // [sp-18h] [bp-18h]@5
+    int cards_count; // [sp-18h] [bp-18h]@4
+    int v132; // [sp-14h] [bp-14h]@0
+    int v133; // [sp-14h] [bp-14h]@93
+    int v134; // [sp-14h] [bp-14h]@129
+    int v135; // [sp-14h] [bp-14h]@240
+    int v136; // [sp-14h] [bp-14h]@276
+    ArcomagePlayer *enemy; // [sp-10h] [bp-10h]@5
+    ArcomagePlayer *enemy1; // [sp-10h] [bp-10h]@4
+    ArcomagePlayer *player; // [sp-Ch] [bp-Ch]@5
+    ArcomagePlayer *player1; // [sp-Ch] [bp-Ch]@4
+    char v141; // [sp-8h] [bp-8h]@35
+    char v142; // [sp-8h] [bp-8h]@183
+    char v143; // [sp-5h] [bp-5h]@20
+    char v144; // [sp-5h] [bp-5h]@169
+
+     byte_4FAA00 = 1;
+    if ( opponent_mastery == 0)
+        {
+        if ( need_to_discard_card==0 )  //am_byte_4FAA77
+            {
+           for(int i = 0; i<10 ; ++i )
+                {
+                all_player_cards_count = GetPlayerHandCardCount(player_num);
+                random_card_slot = rand_interval(0, all_player_cards_count - 1);
+                if ( CanCardBePlayed(player_num, random_card_slot) )
+                    return PlayCard(player_num, random_card_slot);
+                 }
+            }
+            all_player_cards_count = GetPlayerHandCardCount(player_num);
+            random_card_slot= rand_interval(0, all_player_cards_count - 1);
+            return DiscardCard(player_num, random_card_slot);
+        }
+    else if (( opponent_mastery == 1 )|| ( opponent_mastery == 2 ))
+        {
+        player = &am_Players[player_num];
+        enemy = &am_Players[(player_num + 1) % 2];
+        all_player_cards_count = GetPlayerHandCardCount(player_num);
+        for(int i = 0; i<10 ; ++i )
+            {
+            if ( i >= all_player_cards_count )
+                {
+                cards_power[i].slot_index = -1;
+                cards_power[i].card_power = -9999;
+                }
+            else
+                {
+                cards_power[i].slot_index = i;
+                cards_power[i].card_power = 0;
+                }
+            }
+        for(int i = 0; i< all_player_cards_count ; ++i )
+            {   
+               v12 = &pCards[am_Players[player_num].cards_at_hand[cards_power[i].slot_index]];          
+               cards_power[i].card_power = CalculateCardPower(player, enemy, v12, opponent_mastery-1);
+            }
+
+            for (int j = all_player_cards_count - 1; j >= 0; --j )
+                {
+                    for (int m=0; m<j; ++m )
+                        {
+                        if ( cards_power[m].card_power < cards_power[m+1].card_power )
+                            {
+                            v56 = cards_power[m].slot_index;
+                            v57 = cards_power[m].card_power;
+                            cards_power[m].slot_index = cards_power[m+1].slot_index;
+                            cards_power[m].card_power = cards_power[m+1].card_power;
+                            cards_power[m+1].slot_index = v56;
+                            cards_power[m+1].card_power = v57;
+                            }
+                        }
+                }                           
+            v59 = all_player_cards_count - 1;
+            if ( need_to_discard_card )
+                {
+                if ( all_player_cards_count - 1 >= 0 )
+                    {
+                    while ( !pCards[am_Players[player_num].cards_at_hand[cards_power[v59].slot_index]].can_be_discarded )
+                        {
+                        --v59;
+                        if ( v59 < 0 )
+                            return DiscardCard(player_num, v132);
+                        }
+                    v132 = cards_power[v59].slot_index;
+                    }
+                }
+            else
+                {
+                v60 = 0;
+                if ( all_player_cards_count - 1 >= 0 )
+                    {
+                    while ( !pCards[am_Players[player_num].cards_at_hand[cards_power[v59].slot_index]].can_be_discarded )
+                        {
+                        --v59;
+                        if ( v59 < 0 )
+                            goto LABEL_150;
+                        }
+                    v132 = cards_power[v59].slot_index;
+                    }
+LABEL_150:
+                if ( (all_player_cards_count - 1)> 0 )
+                    {
+                    while ( !CanCardBePlayed(player_num, cards_power[v60].slot_index) || cards_power[v60].card_power < 0 )
+                        {
+                        ++v60;
+                        if ( v60 >= all_player_cards_count - 1 )
+                            return DiscardCard(player_num, v132);
+                        }
+                    return PlayCard(player_num, cards_power[v60].slot_index);
+                    }
+                }
+            return DiscardCard(player_num, v132);
+        }
+   
+
   return true;//result != 0;
 }
-// 408BB4: could not find valid save-restore pair for ebp
-// 4DF3A4: using guessed type int dword_4DF3A4;
-// 4E1884: using guessed type int dword_4E1884;
-// 4FA9B0: using guessed type int dword_4FA9B0[];
-// 4FA9B4: using guessed type int dword_4FA9B4[];
-// 4FAA00: using guessed type char byte_4FAA00;
-// 4FAA77: using guessed type char am_byte_4FAA77;
 
 
 
@@ -1568,18 +1248,18 @@
       GetNextCardFromDeck(current_player_num);
       while ( 1 )
       {
-        byte_4FAA24 = am_40A560(current_player_num);
+        byte_4FAA24 = PlayerTurn(current_player_num);
         if ( GetPlayerHandCardCount(current_player_num) <= minimum_cards_at_hand )
           break;
-        am_byte_4FAA77 = 1;
+        need_to_discard_card = 1;
         if ( pArcomageGame->field_F4 )
           goto LABEL_8;
       }
-      am_byte_4FAA77 = 0;
+      need_to_discard_card = 0;
     }
     pArcomageGame->GameOver = IsGameOver();
     if ( !pArcomageGame->GameOver )
-      am_40A383();
+      TurnChange();
     if ( pArcomageGame->field_F4 )
       pArcomageGame->GameOver = 1;
   }
@@ -1657,16 +1337,15 @@
       am_Players[i].cards_at_hand[j] = -1;
       if ( am_byte_4E185D )
       {
-        am_Players[i].arr_6C[j].field_0 = -1;
-        am_Players[i].arr_6C[j].field_4 = -1;
+        am_Players[i].card_shift[j].x = -1;
+        am_Players[i].card_shift[j].y = -1;
       }
       else
       {
-      am_Players[i].arr_6C[j].field_0 = 0;
-      am_Players[i].arr_6C[j].field_4 = 0;
+      am_Players[i].card_shift[j].x = 0;
+      am_Players[i].card_shift[j].y = 0;
       }
-    }
-   
+    }  
   }
   strcpy(deckMaster.name, pDeckMaster);
   for (i=0, card_dispenser_counter=-2, card_id_counter=0; i<DECK_SIZE; ++i, ++card_dispenser_counter)
@@ -1708,11 +1387,9 @@
 //----- (0040A198) --------------------------------------------------------
 void FillPlayerDeck()
     {
- 
-  signed int v3; // eax@4
-  int v6; // edx@13
-  char v7; // eax@13
-  char card_taken_flags[DECK_SIZE]; // [sp+8h] [bp-6Ch]@1
+  signed int m;
+  int rand_deck_pos; 
+  char card_taken_flags[DECK_SIZE]; 
   int i,j;
 
   ArcomageGame::PlaySound(20);
@@ -1725,11 +1402,11 @@
     {
       if ( am_Players[i].cards_at_hand[j] > -1 )
       {
-        for (v3 = 0; v3<DECK_SIZE; ++v3)
+        for (m = 0; m<DECK_SIZE; ++m)
             {
-            if (deckMaster.cards_IDs[v3] == am_Players[i].cards_at_hand[j] && deckMaster.cardsInUse[v3] == 0)
+            if (deckMaster.cards_IDs[m] == am_Players[i].cards_at_hand[j] && deckMaster.cardsInUse[m] == 0)
                 {
-                    deckMaster.cardsInUse[v3] = 1;
+                    deckMaster.cardsInUse[m] = 1;
                     break;
                 }
             }
@@ -1740,14 +1417,12 @@
   for (i=0; i<DECK_SIZE; ++i)
   {
     do
-    {
-      v6 = rand() % DECK_SIZE;
-      v7 = card_taken_flags[v6];
-    }
-    while ( v7 == 1 );
-    card_taken_flags[v6]=1;
-    playDeck.cards_IDs[i]  = deckMaster.cards_IDs[v6];
-    playDeck.cardsInUse[i] = deckMaster.cardsInUse[v6];
+      rand_deck_pos = rand() % DECK_SIZE;
+    while (card_taken_flags[rand_deck_pos] == 1 );
+
+    card_taken_flags[rand_deck_pos]=1;
+    playDeck.cards_IDs[i]  = deckMaster.cards_IDs[rand_deck_pos];
+    playDeck.cardsInUse[i] = deckMaster.cardsInUse[rand_deck_pos];
   }
 
   deck_walk_index = 0;
@@ -1801,8 +1476,8 @@
   {
     amuint_4FAA4C = card_slot_indx;
     am_Players[player_num].cards_at_hand[card_slot_indx] = new_card_id;
-    am_Players[player_num].arr_6C[card_slot_indx].field_0 = rand_interval(-4, 4);
-    am_Players[player_num].arr_6C[card_slot_indx].field_4 = rand_interval(-4, 4);
+    am_Players[player_num].card_shift[card_slot_indx].x = rand_interval(-4, 4);
+    am_Players[player_num].card_shift[card_slot_indx].y = rand_interval(-4, 4);
     pArcomageGame->field_F6 = 1;
     byte_4FAA2D = 1;
   }
@@ -1830,20 +1505,16 @@
 {
   am_Players[player_num].resource_bricks += quarry_bonus + am_Players[player_num].quarry_level;
   am_Players[player_num].resource_gems   += magic_bonus  + am_Players[player_num].magic_level;
-  am_Players[player_num].resource_beasts += zoo_bonus  + am_Players[player_num].zoo_level;
+  am_Players[player_num].resource_beasts += zoo_bonus    + am_Players[player_num].zoo_level;
 }
 
 
 //----- (0040A383) --------------------------------------------------------
-void __cdecl am_40A383()
-{
-  int v0; // eax@4
-  int v1; // ecx@4
-  unsigned __int8 v2; // sf@4
-  unsigned __int8 v3; // of@4
-  int v4; // eax@6
-  char Dest[64]; // [sp+4h] [bp-64h]@4
-  RECT v6; // [sp+44h] [bp-24h]@6
+void TurnChange()
+    {
+
+  char player_name[64]; // [sp+4h] [bp-64h]@4
+ // RECT v6; // [sp+44h] [bp-24h]@6
  
   ArcomageGame_stru1 v10; // [sp+54h] [bp-14h]@7
   POINT v11; // [sp+60h] [bp-8h]@4
@@ -1862,23 +1533,20 @@
       //nullsub_1();
    //   v11.x = 0;
    //   v11.y = 0;
-      strcpy(Dest,"The Next Player is: ");//""
+      strcpy(player_name,"The Next Player is: ");//""
      // v0 = 0;
       v11.y = 200;
       v11.x = 320; // - 12 * v0 / 2;
-      pPrimaryWindow_draws_text(-1, Dest, &v11);
+      pPrimaryWindow_draws_text(-1, player_name, &v11);
       am_byte_4FAA75 = 1;
-      v1 = ++current_player_num;
-      if ( v1 >= 2  )
-      {
-        v1 = 0;
+      ++current_player_num;
+      if ( current_player_num >= 2  )
         current_player_num = 0;
-      }
-      strcpy(Dest, am_Players[v1].pPlayerName);
+      strcpy(player_name, am_Players[current_player_num].pPlayerName);
      // v4 = 0;
       v11.y = 260;
       v11.x = 320;// - 12 * v4 / 2;
-      pPrimaryWindow_draws_text(-1, Dest, &v11);
+      pPrimaryWindow_draws_text(-1, player_name, &v11);
      /* v6.left = 0;
       v6.right = 640;
       v6.top = 0;
@@ -1887,28 +1555,25 @@
       CallRenderPresent();
       //nullsub_1();
       while ( 1 )
-      {
-        while ( 1 )
-        {
+      {  
           while ( !ArcomageGame::MsgLoop(20, &v10) )
             ;
-          if ( v10.field_0 != 1 )
-            break;
-          if ( v10.field_4 )
-            goto LABEL_13;
-          //nullsub_1();
-        }
-        if ( v10.field_0 > 4 )
-        {
-          if ( v10.field_0 <= 8 )
-            goto LABEL_13;
-          if ( v10.field_0 == 10 )
-            break;
-        }
+          if ( v10.field_0 == 1 )
+              {
+              if ( v10.field_4 )
+                  break;
+              //nullsub_1();
+              continue;
+              }
+           if (( v10.field_0 > 4 )&& ( v10.field_0 <= 8 )) 
+               break;
+           if ( v10.field_0 == 10 )
+               {
+               pArcomageGame->field_F4 = 1;
+               byte_4FAA74 = 1;
+               break;
+               }
       }
-      pArcomageGame->field_F4 = 1;
-      byte_4FAA74 = 1;
-LABEL_13:
       /*  v11.x = 0;
       v11.y = 0;
       v6.left = 0;
@@ -1947,8 +1612,8 @@
 
 
 //----- (0040A560) --------------------------------------------------------
-char am_40A560(unsigned int player_num)
-{
+char PlayerTurn( int player_num )
+    {
   int v1; // ebp@0
   unsigned __int64 v2; // qax@3
   unsigned __int64 v3; // kr00_8@3
@@ -1960,13 +1625,13 @@
   int v10[4]; // [sp+80h] [bp-30h]@69
   POINT pTargetXY; // [sp+90h] [bp-20h]@75
   ArcomageGame_stru1 a2; // [sp+98h] [bp-18h]@8
-  int v13; // [sp+A4h] [bp-Ch]@1
+  int animation_stage; // [sp+A4h] [bp-Ch]@1
   char v15; // [sp+AEh] [bp-2h]@63
-  char v16; // [sp+AFh] [bp-1h]@1
+  bool break_loop; // [sp+AFh] [bp-1h]@1
 
   uCardID = -1;
-  v16 = 0;
-  v13 = 20;
+  break_loop = false;
+  animation_stage = 20;
   byte_4FAA00 = 0;
   dword_4FAA68 = 0;
   amuint_4FAA38 = 10;
@@ -1982,9 +1647,9 @@
       }
       while (v3 < 6);
     
-    pArcomageGame->event_timer_time = pEventTimer->Time();
+    pArcomageGame->event_timer_time = (unsigned int )pEventTimer->Time();
     if ( pArcomageGame->field_F4 )
-      v16 = 1;
+      break_loop = 1;
     ArcomageGame::MsgLoop(0, &a2);
     switch ( a2.field_0 )
     {
@@ -1993,7 +1658,7 @@
         {
           pAudioPlayer->StopChannels(-1, -1);
           dword_4FAA68 = 0;
-          v16 = 1;
+          break_loop = true;
           pArcomageGame->field_F4 = 1;
         }
         break;
@@ -2003,16 +1668,17 @@
       case 10:
         pAudioPlayer->StopChannels(-1, -1);
         byte_4FAA74 = 1;
-        v16 = 1;
+        break_loop = true;
         pArcomageGame->field_F4 = 1;
         break;
     }
 
-    if (am_Players[current_player_num].IsHisTurn != 1 && !byte_4FAA00 && !byte_4FAA2E && !byte_4FAA2D )
+    if (am_Players[current_player_num].IsHisTurn != 1 && 
+        !byte_4FAA00 && !byte_4FAA2E && !byte_4FAA2D )
     {
       if ( am_byte_4FAA75 )
         am_byte_4FAA76 = 1;
-      am_408BB4(current_player_num);
+      OpponentsAITurn(current_player_num);
       byte_4FAA2E = 1;
     }
     if ( amuint_4FAA4C != -1 && amuint_4FAA38 > 10 )
@@ -2027,13 +1693,13 @@
         {
           byte_4FAA2D = 0;
           amuint_4FAA38 = 10;
-          v16 = 0;
+          break_loop = false;
         }
       }
       if ( byte_4FAA2E )
       {
-        --v13;
-        if ( v13 < 0 )
+        --animation_stage;
+        if ( animation_stage < 0 )
         {
           if ( dword_4FAA68 > 1 )
           {
@@ -2042,36 +1708,36 @@
           }
           else
           {
-            v16 = 1;
+            break_loop = true;
           }
           byte_4FAA2E = 0;
-          v13 = 20;
+          animation_stage = 20;
         }
       }
     }
     else
     {
-      if ( am_byte_4FAA77 )
+      if ( need_to_discard_card )
       {
-        if ( a2.field_0 == 7 && am_40BCFB(player_num, current_card_slot_index) )
+        if ( a2.field_0 == 7 && DiscardCard(player_num, current_card_slot_index) )
         {
           if ( am_byte_4FAA75 )
             am_byte_4FAA76 = 1;
           if ( dword_4FAA64 > 0 )
           {
             --dword_4FAA64;
-            am_byte_4FAA77 = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
+            need_to_discard_card = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
           }
           byte_4FAA2E = 1;
         }
-        if ( a2.field_0 == 8 && am_40BCFB(player_num, current_card_slot_index) )
+        if ( a2.field_0 == 8 && DiscardCard(player_num, current_card_slot_index) )
         {
           if ( am_byte_4FAA75 )
             am_byte_4FAA76 = 1;
           if ( dword_4FAA64 > 0 )
           {
             --dword_4FAA64;
-            am_byte_4FAA77 = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
+            need_to_discard_card = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
           }
           byte_4FAA2E = 1;
         }
@@ -2089,7 +1755,7 @@
         }
         if ( a2.field_0 == 8 )
         {
-          if ( am_40BCFB(player_num, current_card_slot_index) )
+          if ( DiscardCard(player_num, current_card_slot_index) )
           {
             byte_4FAA2E = 1;
             if ( am_byte_4FAA75 )
@@ -2134,12 +1800,12 @@
     //}
     if ( dword_4FABB8 != DrawCardsRectangles(player_num) )
     {
-    dword_4FABB8 = DrawCardsRectangles(player_num);
-    pArcomageGame->field_F6 = 1;
+        dword_4FABB8 = DrawCardsRectangles(player_num);
+        pArcomageGame->field_F6 = 1;
     }
     if ( pArcomageGame->field_F6 )
     {
-      DrawGameUI(v13);
+      DrawGameUI(animation_stage);
       DoBlt_Copy(pArcomageGame->pBackgroundPixels);
       pArcomageGame->field_F6 = 0;
     }
@@ -2154,18 +1820,18 @@
       am_BeginScene(pArcomageGame->pBackgroundPixels, -1, 1);
       Blt_Copy(&pSrcXYZW, &pTargetXY, 2);
       am_EndScene();
-      DrawGameUI(v13);
+      DrawGameUI(animation_stage);
       pRenderer->Present();
       pArcomageGame->field_F9 = 0;
     }
   }
-  while ( !v16 );
+  while ( !break_loop );
   return dword_4FAA68 > 0;
 }
 
 
 //----- (0040A9AF) --------------------------------------------------------
-void DrawGameUI( int a1 )
+void DrawGameUI( int animation_stage )
     {
 
   am_BeginScene(pArcomageGame->pSpritesPixels, -1, 1);
@@ -2180,54 +1846,41 @@
   am_EndScene();
 
   am_BeginScene(pArcomageGame->pSpritesPixels, -1, 1);
-  DrawCardAnimation(a1);
+  DrawCardAnimation(animation_stage);
 
   for( int i=0; i<10; ++i)
       {
-      if (array_4FABD0[i].field_0)
-          array_4FABD0[i].field_40->_40E133();
+      if (array_4FABD0[i].have_effect)
+          array_4FABD0[i].field_40->DrawEffect();
       }
   current_card_slot_index = DrawCardsRectangles(current_player_num);
-  am_40AA4E();
+  DrawSparks();
   am_EndScene();
 }
 
 //----- (0040AA4E) --------------------------------------------------------
-void am_40AA4E()
+void DrawSparks()
     {
-  int v5; // [sp-4h] [bp-2Ch]@4
-  unsigned int v7;
-  int v8; // [sp+14h] [bp-14h]@10
-  int v9; // [sp+18h] [bp-10h]@10
-  RECT pXYZW;
-
-  v9 = 0x0000FF00;
-  v8 = 0x000000FF;
+  int rgb_pixel_color; // [sp-4h] [bp-2Ch]@4
+  unsigned int pixel_color;
 
   for (int i=0; i<10; ++i)
       {
-        if(array_4FABD0[i].field_0 && (array_4FABD0[i].field_40->_40E2A7()==2))
+        if(array_4FABD0[i].have_effect && (array_4FABD0[i].field_40->_40E2A7()==2))
             {
-
-            v5 = v9;
-            if ( !array_4FABD0[i].field_1 )
-                v5 = v8;
-
-             v7 = R8G8B8_to_TargetFormat(v5);
+            rgb_pixel_color = 0x0000FF00;
+            if ( !array_4FABD0[i].effect_sign )
+                rgb_pixel_color =  0x000000FF;
+
+             pixel_color = R8G8B8_to_TargetFormat(rgb_pixel_color);
              for(int j=0; j<150; ++j )
                  {
-                 if (array_4FABD0[i].field_44[j].field_0 > 0)
+                 if (array_4FABD0[i].effect_sparks[j].have_spark > 0)
                      {
                       if (j%2)
-                           SetPixel(&array_4FABD0[i].field_44[j].field_4, v7);
+                           SetPixel(&array_4FABD0[i].effect_sparks[j].spark_position, pixel_color);
                       else
-                          {
-                          pXYZW.left = array_4FABD0[i].field_44[j].field_4.x;
-                          pXYZW.right = pXYZW.left + 2;
-                          pXYZW.top = array_4FABD0[i].field_44[j].field_4.y;
-                          pXYZW.bottom = pXYZW.top + 2;
-                          DrawRect(&pXYZW, v7, 1);
-                          }
+                          SetPixel2sq(&array_4FABD0[i].effect_sparks[j].spark_position, pixel_color);
                      }
                  }
             }
@@ -2242,8 +1895,8 @@
   RECT pSrcRect; // [sp+Ch] [bp-18h]@1
   POINT pTargetXY; // [sp+1Ch] [bp-8h]@1
 //resources rectangles
+  pSrcRect.left    = 765;
   pSrcRect.top     = 0;
-  pSrcRect.left    = 765;
   pSrcRect.right   = 843;
   pSrcRect.bottom  = 216;
 
@@ -2257,8 +1910,8 @@
 
   //players name rectangle
   pSrcRect.left   = 283;
+  pSrcRect.top    = 166;
   pSrcRect.right  = 361;
-  pSrcRect.top    = 166;
   pSrcRect.bottom = 190;
   pTargetXY.x = 8;
   pTargetXY.y = 13;
@@ -2268,10 +1921,10 @@
   pTargetXY.y = 13;
   Blt_Chroma(&pSrcRect, &pTargetXY, pArcomageGame->field_54, 2);
 
-  //tower heigth rectangle
+  //tower height rectangle
   pSrcRect.left   = 234;
+  pSrcRect.top    = 166;
   pSrcRect.right  = 283;
-  pSrcRect.top    = 166;
   pSrcRect.bottom = 190;
   pTargetXY.x = 100;
   pTargetXY.y = 296;
@@ -2281,10 +1934,10 @@
   pTargetXY.y = 296;
   Blt_Chroma(&pSrcRect, &pTargetXY, pArcomageGame->field_54, 2);
 
-  //wall heigth rectangle
-  pSrcRect.left   = 192;
+  //wall height rectangle
+  pSrcRect.left   = 192; 
+  pSrcRect.top    = 166;
   pSrcRect.right  = 234;
-  pSrcRect.top    = 166;
   pSrcRect.bottom = 190;
   pTargetXY.x = 168;
   pTargetXY.y = 296;
@@ -2303,7 +1956,7 @@
   char text_buff[32]; // [sp+Ch] [bp-28h]@2
   POINT text_position; // [sp+2Ch] [bp-8h]@2
 
-  if ( am_byte_4FAA77 )
+  if ( need_to_discard_card )
   {
     strcpy(text_buff, pGlobalTXT_LocalizationStrings[266]);// DISCARD A CARD
     text_position.x = 320 - pArcomageGame->pfntArrus->GetLineWidth(text_buff) / 2;
@@ -2345,7 +1998,7 @@
   pPrimaryWindow_draws_text(-1, text_buff, &text_position);
 
   res_value = am_Players[0].quarry_level;
-  if ( byte_4E185E )
+  if ( use_start_bonus )
     res_value =am_Players[0].quarry_level + quarry_bonus;
   intToString(res_value, text_buff);
   text_position.x = 14;// - 6 * 0 / 2;
@@ -2353,7 +2006,7 @@
   DrawPlayerLevels(-1, text_buff, &text_position);
 
   res_value = am_Players[1].quarry_level;
-  if ( byte_4E185E )
+  if ( use_start_bonus )
     res_value = am_Players[1].quarry_level + quarry_bonus;
   intToString(res_value, text_buff);
 //  v2 = 0;
@@ -2362,7 +2015,7 @@
   DrawPlayerLevels(-1, text_buff, &text_position);
 
   res_value = am_Players[0].magic_level;
-  if ( byte_4E185E )
+  if ( use_start_bonus )
     res_value = am_Players[0].magic_level + magic_bonus;    
   intToString(res_value, text_buff);
  // v4 = 0;
@@ -2371,8 +2024,8 @@
   DrawPlayerLevels(-1, text_buff, &text_position);
 
   res_value = am_Players[1].magic_level;
-  if ( byte_4E185E )
-    res_value = am_Players[1].magic_level+magic_bonus;
+  if ( use_start_bonus )
+    res_value = am_Players[1].magic_level + magic_bonus;
   intToString(res_value, text_buff);
  // v6 = 0;
   text_position.y = 164;
@@ -2380,7 +2033,7 @@
   DrawPlayerLevels(-1, text_buff, &text_position);
 
   res_value = am_Players[0].zoo_level;
-  if ( byte_4E185E )
+  if ( use_start_bonus )
     res_value = am_Players[0].zoo_level + zoo_bonus;
   intToString(res_value, text_buff);
  // v8 = 0;
@@ -2389,7 +2042,7 @@
   DrawPlayerLevels(-1, text_buff, &text_position);
 
   res_value = am_Players[1].zoo_level;
-  if ( byte_4E185E )
+  if ( use_start_bonus )
     res_value =  am_Players[1].zoo_level + zoo_bonus;
   intToString(res_value, text_buff);
  // v10 = 0;
@@ -2652,7 +2305,7 @@
  v3 = 100;
 
     
-    if ( am_Players[1].wall_height <= 0 )
+    if ( am_Players[1].wall_height > 0 )
         {
  
 pSrcXYZW.top = 0;
@@ -2704,11 +2357,11 @@
 while ( v2 < v0 )
     {
     v3 = current_player_num;
-    if ( am_byte_4E185D != 0 )
+    if ( am_byte_4E185D)
         {
 
-        pTargetXY.x += am_Players[current_player_num].arr_6C[v2].field_0 ;
-        pTargetXY.y += am_Players[current_player_num].arr_6C[v2].field_4;
+        pTargetXY.x += am_Players[current_player_num].card_shift[v2].x ;
+        pTargetXY.y += am_Players[current_player_num].card_shift[v2].y;
         }
     v7 = am_Players[current_player_num].cards_at_hand[v2];
     if ( v7 == -1 )
@@ -2740,10 +2393,10 @@
     v3 = current_player_num;
     pTargetXY.x += v24 + 96;
 LABEL_15:
-    if ( am_byte_4E185D != 0 )
+    if ( am_byte_4E185D )
         {
-        pTargetXY.x -= am_Players[current_player_num].arr_6C[v2].field_0 ;
-        pTargetXY.y -= am_Players[current_player_num].arr_6C[v2].field_4 ;
+        pTargetXY.x -= am_Players[current_player_num].card_shift[v2].x ;
+        pTargetXY.y -= am_Players[current_player_num].card_shift[v2].y ;
         }
     ++v2;
     }
@@ -2852,8 +2505,8 @@
             {
            // v3 = 188 * current_player_num + 8 * amuint_4FAA4C;
            // amuint_4FAA3C_blt_xy.x = (amuint_4FAA4C * v2 + *(am_Players[0].arr_6C[0] + v3) - 120) / 10;
-            amuint_4FAA3C_blt_xy.x=(amuint_4FAA4C * v2 + am_Players[current_player_num].arr_6C[amuint_4FAA4C].field_0-120)/10;
-            v4 = (am_Players[current_player_num].arr_6C[amuint_4FAA4C].field_4+309) /10;//(*(&am_Players[0].arr_6C[0][1] + v3) + 309) / 10;
+            amuint_4FAA3C_blt_xy.x=(amuint_4FAA4C * v2 + am_Players[current_player_num].card_shift[amuint_4FAA4C].x-120)/10;
+            v4 = (am_Players[current_player_num].card_shift[amuint_4FAA4C].y+309) /10;//(*(&am_Players[0].arr_6C[0][1] + v3) + 309) / 10;
             }
         else
             {
@@ -2965,17 +2618,7 @@
             if (shown_cards[v17].uCardId==-1)
                 break;
             }
-        /* v17 = 0;
-        do
-        {
-        if ( v7->uCardId == -1 )
-        break;
-        ++v7;
-        ++v17;
-        }
-        while ( v7 < &dword_4FABB8 );*/
-           // v26 = 32 * v17;
-
+        
             amuint_4FAA54_blt_xy.x = (shown_cards[v17].field_8.x - 272) / 5;
             amuint_4FAA54_blt_xy.y = (shown_cards[v17].field_8.y - 173) / 5;
             pArcomageGame->GetCardRect(played_card_id, &pSrcXYZW);
@@ -3058,7 +2701,7 @@
 //----- (0040BB67) --------------------------------------------------------
 signed int DrawCardsRectangles( int player_num )
     {
-
+//need do fix rectangle not fit to card
 
 //int v1; // esi@1
 signed int result; // eax@1
@@ -3139,8 +2782,8 @@
                 if ( am_byte_4E185D )
                     {
                  //   v9 = v3 + 8 * v7;
-                    v10 = am_Players[player_num].arr_6C[v7].field_0;//*(am_player[0].arr_6C[0] + v9);
-                    v11 = am_Players[player_num].arr_6C[v7].field_4;//*(&am_player[0].arr_6C[0][1] + v9);
+                    v10 = am_Players[player_num].card_shift[v7].x;//*(am_player[0].arr_6C[0] + v9);
+                    v11 = am_Players[player_num].card_shift[v7].y;//*(&am_player[0].arr_6C[0][1] + v9);
                     pXYZW.left += v10;
                     pXYZW.right += v10;
                     pXYZW.top += v11;
@@ -3156,8 +2799,8 @@
                 pXYZW.right += var18;
                 if ( am_byte_4E185D )
                     {
-                    v16 = am_Players[player_num].arr_6C[v30].field_0;//*(am_player[0].arr_6C[0] + v15);
-                    v17 = am_Players[player_num].arr_6C[v30].field_4;//*(&am_player[0].arr_6C[0][1] + v15);
+                    v16 = am_Players[player_num].card_shift[v30].x;//*(am_player[0].arr_6C[0] + v15);
+                    v17 = am_Players[player_num].card_shift[v30].y;//*(&am_player[0].arr_6C[0][1] + v15);
                     pXYZW.left -= v16;
                     pXYZW.right -= v16;
                     pXYZW.top -= v17;
@@ -3192,7 +2835,7 @@
 // 4E185D: using guessed type char am_byte_4E185D;
 
 //----- (0040BCFB) --------------------------------------------------------
-bool am_40BCFB( int player_num, signed int card_slot_index )
+bool DiscardCard( int player_num, signed int card_slot_index )
     {
   int v2; // esi@2
   signed int v3; // edi@2
@@ -3224,13 +2867,13 @@
     }
   }
 
-  if ( pCards[am_Players[player_num].cards_at_hand[i]].field_2B) 
+  if ( pCards[am_Players[player_num].cards_at_hand[i]].can_be_discarded) 
   {
     ArcomageGame::PlaySound(22);
     v8 = GetPlayerHandCardCount(current_player_num);
-    v10=am_Players[player_num].arr_6C[i].field_0 + (640 - 96 * v8) / (v8 + 1);
+    v10=am_Players[player_num].card_shift[i].x + (640 - 96 * v8) / (v8 + 1);
     amuint_4FAA5C_blt_xy.x = v10;
-    amuint_4FAA5C_blt_xy.y = am_Players[player_num].arr_6C[i].field_4 + 327;//v11;
+    amuint_4FAA5C_blt_xy.y = am_Players[player_num].card_shift[i].y + 327;//v11;
     v12 = 0;
 
     if ( !am_byte_4FAA75 )
@@ -3244,48 +2887,42 @@
     pArcomageGame->field_F6 = 1;
     amuint_4FAA54_blt_xy.x = (shown_cards[v12].field_8.x - v10) / 10;
     amuint_4FAA54_blt_xy.y = (shown_cards[v12].field_8.y - 327) / 10;
-
     uCardID = am_Players[player_num].cards_at_hand[i];
     am_Players[player_num].cards_at_hand[i] = -1;
-    am_byte_4FAA77 = 0;
+    need_to_discard_card = 0;
     return true;
   }
   else
     return false;
 }
-// 4FAA75: using guessed type char am_byte_4FAA75;
-// 4FAA77: using guessed type char am_byte_4FAA77;
-// 4FAA78: using guessed type int amuint_4FAA78[];
-// 4FAA80: using guessed type int amuint_4FAA80[];
-// 4FAA84: using guessed type int amuint_4FAA84[];
-// 4FABB8: using guessed type int dword_4FABB8;
+
 
 //----- (0040BE0E) --------------------------------------------------------
 bool PlayCard( int player_num, signed int card_slot_num )
     {
-  bool result; // eax@0
+
   int v3; // ebp@1
   int v4; // ecx@2
   ArcomagePlayer *v5; // esi@2
-  int v6; // edi@2
+  int card_index; // edi@2
   int v7; // eax@2
   int v8; // ebx@8
-  int v9; // eax@8
+  int cards_at_hand; // eax@8
   int v10; // ebx@8
   int v11; // ebp@8
   int v12; // ecx@8
   int v13; // eax@8
-  ArcomageCard *v14; // eax@8
+  ArcomageCard *pCard; // eax@8
   int v15; // ecx@8
   int v16; // ecx@8
 
   if ( card_slot_num <= -1 )
     return false;
+
   v4 = 0;
-
-  for (v6=0; v6<10; ++v6)
+  for (card_index=0; card_index<10; ++card_index)
   {
-    if ( am_Players[player_num].cards_at_hand[v6] != -1 )
+    if ( am_Players[player_num].cards_at_hand[card_index] != -1 )
     {
       if ( card_slot_num == v4 )
         break;
@@ -3293,29 +2930,29 @@
     }
   }
 
-  result = CanCardBePlayed(player_num, v6);
-  if ( result )
+  if (CanCardBePlayed(player_num, card_index) )
   {
     ArcomageGame::PlaySound(23);
-    v9 = GetPlayerHandCardCount(current_player_num);
-  //  v10 = 188 * v8 + 8 * v6;
-  //  v11 = v6 + 47 * v3;
+    cards_at_hand = GetPlayerHandCardCount(current_player_num);
     pArcomageGame->field_F6 = 1;
-    v12 =  am_Players[player_num].arr_6C[v6].field_0 + (640 - 96 * v9) / (v9 + 1)+ 96 * v6 +(640 - 96 * v9) / (v9 + 1);
+    v12 =  am_Players[player_num].card_shift[card_index].x + 
+         (640 - 96 * cards_at_hand) / (cards_at_hand + 1)+ 
+         96 * card_index ;
+        
   //  v13 = *(int *)((char *)&am_Players[0].arr_6C[0][1] + v10) + 327;
     amuint_4FAA5C_blt_xy.x = v12;//v12;
-    amuint_4FAA5C_blt_xy.y = am_Players[player_num].arr_6C[v6].field_4 + 327;//v13;
+    amuint_4FAA5C_blt_xy.y = am_Players[player_num].card_shift[card_index].y + 327;//v13;
 
     amuint_4FAA54_blt_xy.x = (272 - v12) / 5;
     amuint_4FAA54_blt_xy.y = -30;
 
-    v14 = &pCards[am_Players[player_num].cards_at_hand[v6]];
-    am_Players[player_num].resource_bricks -= v14->needed_bricks;
-    am_Players[player_num].resource_beasts -= v14->needed_beasts;
-    am_Players[player_num].resource_gems   -= v14->needed_gems;
-    played_card_id = am_Players[player_num].cards_at_hand[v6];
-    am_Players[player_num].cards_at_hand[v6] = -1;
-    return true;;
+    pCard = &pCards[am_Players[player_num].cards_at_hand[card_index]];
+    am_Players[player_num].resource_bricks -= pCard->needed_bricks;
+    am_Players[player_num].resource_beasts -= pCard->needed_beasts;
+    am_Players[player_num].resource_gems   -= pCard->needed_gems;
+    played_card_id = am_Players[player_num].cards_at_hand[card_index];
+    am_Players[player_num].cards_at_hand[card_index] = -1;
+    return true;
   }
   else
    return false;
@@ -3353,1962 +2990,643 @@
 //----- (0040BF77) --------------------------------------------------------
 void ApplyCardToPlayer( int player_num, unsigned int uCardID )
     {
-//  ArcomagePlayer *v2; // esi@1
-//  int v3; // eax@1
-//  ArcomagePlayer *v4; // edi@1
-//  int v5; // eax@2
-//  char v6; // sf@2
-//  unsigned __int8 v7; // of@2
-//  int v8; // eax@3
-//  int v9; // eax@4
-//  char v10; // zf@5
-//  int v11; // eax@8
-//  unsigned __int8 v12; // zf@8
-//  char v13; // sf@8
-//  unsigned __int8 v14; // of@8
-//  int v15; // eax@9
-//  int v16; // eax@10
-//  char v17; // zf@12
-//  char v18; // al@15
-//  int v19; // eax@16
-//  int v20; // eax@17
-//  int v21; // eax@22
-//  int v22; // eax@23
-//  int v23; // eax@26
-//  int v24; // edx@26
-//  signed int v25; // ebx@26
-//  ArcomageCard *v26; // ebx@28
-//  int v27; // eax@28
-//  int v28; // edx@33
-//  int v29; // eax@33
-//  int v30; // eax@35
-//  int v31; // edx@40
-//  int v32; // eax@40
-//  int v33; // eax@42
-//  int v34; // edx@47
-//  int v35; // eax@47
-//  int v36; // eax@49
-//  int v37; // edx@54
-//  int v38; // eax@54
-//  bool v39; // eax@56
-//  int v40; // edx@61
-//  int v41; // eax@61
-//  int v42; // eax@63
-//  int v43; // edx@68
-//  int v44; // eax@68
-//  char v45; // al@70
-//  int v46; // eax@72
-//  int v47; // edx@77
-//  int v48; // eax@77
-//  int v49; // eax@79
-//  int v50; // edx@84
-//  int v51; // eax@84
-//  int v52; // eax@86
-//  int v53; // eax@91
-//  int v54; // edx@91
-//  int v55; // eax@93
-//  int v56; // eax@98
-//  int v57; // edx@98
-//  int v58; // eax@100
-//  int v59; // eax@105
-//  int v60; // edx@105
-//  int v61; // eax@107
-//  int v62; // eax@112
-//  int v63; // edx@112
-//  int v64; // eax@114
-//  int v65; // eax@119
-//  int v66; // edx@119
-//  int v67; // eax@121
-//  int v68; // eax@126
-//  int v69; // edx@126
-//  char v70; // al@128
-//  int v71; // eax@130
-//  int v72; // eax@135
-//  int v73; // edx@135
-//  int v74; // eax@137
-//  int v75; // eax@142
-//  int v76; // edx@142
-//  int v77; // eax@144
-//  int v78; // eax@151
-//  int v79; // ecx@151
-//  int v80; // eax@155
-//  int v81; // eax@162
-//  int v82; // ecx@162
-//  int v83; // eax@166
-//  int v84; // eax@173
-//  int v85; // ecx@173
-//  int v86; // eax@177
-//  int v87; // eax@184
-//  int v88; // ecx@184
-//  bool v89; // eax@188
-//  int v90; // eax@195
-//  int v91; // ecx@195
-//  int v92; // eax@199
-//  int v93; // eax@206
-//  int v94; // ecx@206
-//  char v95; // al@210
-//  int v96; // eax@211
-//  int v97; // edx@211
-//  int v98; // eax@211
-//  int v99; // eax@211
-//  int v100; // eax@212
-//  int v101; // eax@219
-//  int v102; // ecx@219
-//  int v103; // eax@223
-//  int v104; // eax@231
-//  int v105; // edx@231
-//  signed int v106; // ebx@231
-//  ArcomageCard *v107; // ebx@233
-//  int v108; // eax@233
-//  int v109; // edx@238
-//  int v110; // eax@238
-//  int v111; // eax@240
-//  int v112; // edx@245
-//  int v113; // eax@245
-//  int v114; // eax@247
-//  int v115; // edx@252
-//  int v116; // eax@252
-//  int v117; // eax@254
-//  int v118; // edx@259
-//  int v119; // eax@259
-//  bool v120; // eax@261
-//  int v121; // edx@266
-//  int v122; // eax@266
-//  int v123; // eax@268
-//  int v124; // edx@273
-//  int v125; // eax@273
-//  char v126; // al@275
-//  int v127; // eax@277
-//  int v128; // edx@282
-//  int v129; // eax@282
-//  int v130; // eax@284
-//  int v131; // edx@289
-//  int v132; // eax@289
-//  int v133; // eax@291
-//  int v134; // eax@296
-//  int v135; // edx@296
-//  int v136; // eax@298
-//  int v137; // eax@303
-//  int v138; // edx@303
-//  int v139; // eax@305
-//  int v140; // eax@310
-//  int v141; // edx@310
-//  int v142; // eax@312
-//  int v143; // eax@317
-//  int v144; // edx@317
-//  int v145; // eax@319
-//  int v146; // eax@324
-//  int v147; // edx@324
-//  int v148; // eax@326
-//  int v149; // eax@331
-//  int v150; // edx@331
-//  char v151; // al@333
-//  int v152; // eax@335
-//  int v153; // eax@340
-//  int v154; // edx@340
-//  int v155; // eax@342
-//  int v156; // eax@347
-//  int v157; // edx@347
-//  int v158; // eax@349
-//  int v159; // eax@356
-//  int v160; // ecx@356
-//  int v161; // eax@360
-//  int v162; // eax@367
-//  int v163; // ecx@367
-//  int v164; // eax@371
-//  int v165; // eax@378
-//  int v166; // ecx@378
-//  int v167; // eax@382
-//  int v168; // eax@389
-//  int v169; // ecx@389
-//  bool v170; // eax@393
-//  int v171; // eax@400
-//  int v172; // ecx@400
-//  int v173; // eax@404
-//  int v174; // eax@411
-//  int v175; // ecx@411
-//  char v176; // al@415
-//  int v177; // eax@416
-//  int v178; // edx@416
-//  int v179; // eax@416
-//  int v180; // eax@416
-//  int v181; // eax@417
-//  int v182; // eax@424
-//  int v183; // ecx@424
-//  int v184; // eax@429
-//  int v185; // ecx@429
-//  signed int v186; // esi@511
-//  Vec2_int_ v187; // [sp+Ch] [bp-64h]@488
-//  //int v188; // [sp+10h] [bp-60h]@488
-//  int v189; // [sp+14h] [bp-5Ch]@1
-//  ArcomageCard *pCard; // [sp+18h] [bp-58h]@1
-//  int v191; // [sp+1Ch] [bp-54h]@1
-//  int v192; // [sp+20h] [bp-50h]@1
-//  int v193; // [sp+24h] [bp-4Ch]@1
-//  int v194; // [sp+28h] [bp-48h]@1
-//  int v195; // [sp+2Ch] [bp-44h]@1
-//  int v196; // [sp+30h] [bp-40h]@1
-//  int v197; // [sp+34h] [bp-3Ch]@1
-//  int v198; // [sp+38h] [bp-38h]@1
-//  int v199; // [sp+3Ch] [bp-34h]@1
-//  int v200; // [sp+40h] [bp-30h]@1
-//  int v201; // [sp+44h] [bp-2Ch]@1
-//  int v202; // [sp+48h] [bp-28h]@1
-//  int v203; // [sp+4Ch] [bp-24h]@1
-//  int v204; // [sp+50h] [bp-20h]@1
-//  bool v205; // [sp+54h] [bp-1Ch]@1
-//  int v206; // [sp+58h] [bp-18h]@1
-//  int v207; // [sp+5Ch] [bp-14h]@1
-//  int v208; // [sp+60h] [bp-10h]@1
-//  int v209; // [sp+64h] [bp-Ch]@1
-//  int v210; // [sp+68h] [bp-8h]@1
-//  int v211; // [sp+6Ch] [bp-4h]@1
-//
-//  v194 = 0;
-//  v210 = 0;
-//  v208 = 0;
-//  v197 = 0;
-//  v205 = 0;
-//  v203 = 0;
-//  v201 = 0;
-//  v199 = 0;
-//  v192 = 0;
-//  v196 = 0;
-//  v211 = 0;
-//  v209 = 0;
-//  v207 = 0;
-//  v206 = 0;
-//  v204 = 0;
-//  v202 = 0;
-//  v200 = 0;
-//  v198 = 0;
-//  v191 = 0;
-//  v195 = 0;
-//  v193 = a1;
-//  v2 = &stru_505708[a1];
-//  pCard = &pCards[uCardID];
-//  v3 = pCard->field_2C;
-//  v189 = (a1 + 1) % 2;
-//  v4 = &stru_505708[v189];
-//  switch ( v3 )
-//  {
-//    case 2:
-//      v5 = v2->field_2C;
-//      v7 = __OFSUB__(v5, v4->field_2C);
-//      v6 = v5 - v4->field_2C < 0;
-//      goto LABEL_18;
-//    case 3:
-//      v8 = v2->field_30;
-//      v7 = __OFSUB__(v8, v4->field_30);
-//      v6 = v8 - v4->field_30 < 0;
-//      goto LABEL_18;
-//    case 4:
-//      v9 = v2->field_34;
-//      v7 = __OFSUB__(v9, v4->field_34);
-//      v6 = v9 - v4->field_34 < 0;
-//      goto LABEL_18;
-//    case 5:
-//      v10 = v2->field_2C == v4->field_2C;
-//      goto LABEL_21;
-//    case 6:
-//      v10 = v2->field_30 == v4->field_30;
-//      goto LABEL_21;
-//    case 7:
-//      v10 = v2->field_34 == v4->field_34;
-//      goto LABEL_21;
-//    case 8:
-//      v11 = v2->field_2C;
-//      v14 = __OFSUB__(v11, v4->field_2C);
-//      v12 = v11 == v4->field_2C;
-//      v13 = v11 - v4->field_2C < 0;
-//      goto LABEL_24;
-//    case 9:
-//      v15 = v2->field_30;
-//      v14 = __OFSUB__(v15, v4->field_30);
-//      v12 = v15 == v4->field_30;
-//      v13 = v15 - v4->field_30 < 0;
-//      goto LABEL_24;
-//    case 10:
-//      v16 = v2->field_34;
-//      v14 = __OFSUB__(v16, v4->field_34);
-//      v12 = v16 == v4->field_34;
-//      v13 = v16 - v4->field_34 < 0;
-//      goto LABEL_24;
-//    case 11:
-//      v10 = v2->field_28 == 0;
-//      goto LABEL_21;
-//    case 12:
-//      v17 = v2->field_28 == 0;
-//      goto LABEL_15;
-//    case 13:
-//      v10 = v4->field_28 == 0;
-//      goto LABEL_21;
-//    case 14:
-//      v17 = v4->field_28 == 0;
-//LABEL_15:
-//      v18 = !v17;
-//      goto LABEL_25;
-//    case 15:
-//      v19 = v2->field_28;
-//      v7 = __OFSUB__(v19, v4->field_28);
-//      v6 = v19 - v4->field_28 < 0;
-//      goto LABEL_18;
-//    case 16:
-//      v20 = v2->field_24;
-//      v7 = __OFSUB__(v20, v4->field_24);
-//      v6 = v20 - v4->field_24 < 0;
-//LABEL_18:
-//      v18 = v6 ^ v7;
-//      goto LABEL_25;
-//    case 17:
-//      v10 = v2->field_28 == v4->field_28;
-//      goto LABEL_21;
-//    case 18:
-//      v10 = v2->field_24 == v4->field_24;
-//LABEL_21:
-//      v18 = v10;
-//      goto LABEL_25;
-//    case 19:
-//      v21 = v2->field_28;
-//      v14 = __OFSUB__(v21, v4->field_28);
-//      v12 = v21 == v4->field_28;
-//      v13 = v21 - v4->field_28 < 0;
-//      goto LABEL_24;
-//    case 20:
-//      v22 = v2->field_24;
-//      v14 = __OFSUB__(v22, v4->field_24);
-//      v12 = v22 == v4->field_24;
-//      v13 = v22 - v4->field_24 < 0;
-//LABEL_24:
-//      v18 = !((unsigned __int8)(v13 ^ v14) | v12);
-//LABEL_25:
-//      if ( v18 )
-//        goto LABEL_26;
-//      goto LABEL_231;
-//    default:
-//LABEL_26:
-//      v23 = BYTE1(pCard->field_30);
-//      v24 = v23 + (LOBYTE(pCard->field_30) == 1);
-//      v25 = 0;
-//      dword_4FAA68 = v23 + (LOBYTE(pCard->field_30) == 1);
-//      dword_4FAA64 = v23;
-//      if ( v23 > 0 )
-//      {
-//        do
-//        {
-//          am_40A283(v193, v24);
-//          ++v25;
-//        }
-//        while ( v25 < SBYTE1(pCard->field_30) );
-//      }
-//      v26 = pCard;
-//      am_byte_4FAA77 = GetPlayerHandCardCount(v193) > dword_4E1874;
-//      LOBYTE(v27) = BYTE2(pCard->field_30);
-//      if ( (_BYTE)v27 )
-//      {
-//        if ( (_BYTE)v27 == 99 )
-//        {
-//          v28 = v2->field_2C;
-//          v29 = v4->field_2C;
-//          if ( v28 < v29 )
-//          {
-//            v2->field_2C = v29;
-//            v194 = v29 - v28;
-//          }
-//        }
-//        else
-//        {
-//          v27 = (char)v27;
-//          v6 = (char)v27 + v2->field_2C < 0;
-//          v2->field_2C += (char)v27;
-//          if ( v6 )
-//            v2->field_2C = 0;
-//          v194 = v27;
-//        }
-//      }
-//      LOBYTE(v30) = BYTE3(v26->field_30);
-//      if ( (_BYTE)v30 )
-//      {
-//        if ( (_BYTE)v30 == 99 )
-//        {
-//          v31 = v2->field_30;
-//          v32 = v4->field_30;
-//          if ( v31 < v32 )
-//          {
-//            v2->field_30 = v32;
-//            v210 = v32 - v31;
-//          }
-//        }
-//        else
-//        {
-//          v30 = (char)v30;
-//          v6 = (char)v30 + v2->field_30 < 0;
-//          v2->field_30 += (char)v30;
-//          if ( v6 )
-//            v2->field_30 = 0;
-//          v210 = v30;
-//        }
-//      }
-//      LOBYTE(v33) = LOBYTE(v26->field_34);
-//      if ( (_BYTE)v33 )
-//      {
-//        if ( (_BYTE)v33 == 99 )
-//        {
-//          v34 = v2->field_34;
-//          v35 = v4->field_34;
-//          if ( v34 < v35 )
-//          {
-//            v2->field_34 = v35;
-//            v208 = v35 - v34;
-//          }
-//        }
-//        else
-//        {
-//          v33 = (char)v33;
-//          v6 = (char)v33 + v2->field_34 < 0;
-//          v2->field_34 += (char)v33;
-//          if ( v6 )
-//            v2->field_34 = 0;
-//          v208 = v33;
-//        }
-//      }
-//      LOBYTE(v36) = BYTE1(v26->field_34);
-//      if ( (_BYTE)v36 )
-//      {
-//        if ( (_BYTE)v36 == 99 )
-//        {
-//          v37 = v2->field_38;
-//          v38 = v4->field_38;
-//          if ( v37 < v38 )
-//          {
-//            v2->field_38 = v38;
-//            v197 = v38 - v37;
-//          }
-//        }
-//        else
-//        {
-//          v36 = (char)v36;
-//          v6 = (char)v36 + v2->field_38 < 0;
-//          v2->field_38 += (char)v36;
-//          if ( v6 )
-//            v2->field_38 = 0;
-//          v197 = v36;
-//        }
-//      }
-//      LOBYTE(v39) = BYTE2(v26->field_34);
-//      if ( v39 )
-//      {
-//        if ( v39 == 99 )
-//        {
-//          v40 = v2->field_3C;
-//          v41 = v4->field_3C;
-//          if ( v40 < v41 )
-//          {
-//            v2->field_3C = v41;
-//            v205 = v41 - v40;
-//          }
-//        }
-//        else
-//        {
-//          v39 = v39;
-//          v6 = v39 + v2->field_3C < 0;
-//          v2->field_3C += v39;
-//          if ( v6 )
-//            v2->field_3C = 0;
-//          v205 = v39;
-//        }
-//      }
-//      LOBYTE(v42) = BYTE3(v26->field_34);
-//      if ( (_BYTE)v42 )
-//      {
-//        if ( (_BYTE)v42 == 99 )
-//        {
-//          v43 = v2->field_40;
-//          v44 = v4->field_40;
-//          if ( v43 < v44 )
-//          {
-//            v2->field_40 = v44;
-//            v203 = v44 - v43;
-//          }
-//        }
-//        else
-//        {
-//          v42 = (char)v42;
-//          v6 = (char)v42 + v2->field_40 < 0;
-//          v2->field_40 += (char)v42;
-//          if ( v6 )
-//            v2->field_40 = 0;
-//          v203 = v42;
-//        }
-//      }
-//      v45 = v26->field_38[0];
-//      if ( v45 )
-//      {
-//        v196 = am_40D402(v193, v45);
-//        v192 = v26->field_38[0] - v196;
-//      }
-//      LOBYTE(v46) = v26->field_38[1];
-//      if ( (_BYTE)v46 )
-//      {
-//        if ( (_BYTE)v46 == 99 )
-//        {
-//          v47 = v2->field_28;
-//          v48 = v4->field_28;
-//          if ( v47 < v48 )
-//          {
-//            v2->field_28 = v48;
-//            v201 = v48 - v47;
-//          }
-//        }
-//        else
-//        {
-//          v46 = (char)v46;
-//          v6 = (char)v46 + v2->field_28 < 0;
-//          v2->field_28 += (char)v46;
-//          if ( v6 )
-//            v2->field_28 = 0;
-//          v201 = v46;
-//        }
-//      }
-//      LOBYTE(v49) = v26->field_38[2];
-//      if ( (_BYTE)v49 )
-//      {
-//        if ( (_BYTE)v49 == 99 )
-//        {
-//          v50 = v2->field_24;
-//          v51 = v4->field_24;
-//          if ( v50 < v51 )
-//          {
-//            v2->field_24 = v51;
-//            v199 = v51 - v50;
-//          }
-//        }
-//        else
-//        {
-//          v49 = (char)v49;
-//          v6 = (char)v49 + v2->field_24 < 0;
-//          v2->field_24 += (char)v49;
-//          if ( v6 )
-//            v2->field_24 = 0;
-//          v199 = v49;
-//        }
-//      }
-//      LOBYTE(v52) = v26->field_38[3];
-//      if ( (_BYTE)v52 )
-//      {
-//        if ( (_BYTE)v52 == 99 )
-//        {
-//          v53 = v2->field_2C;
-//          v54 = v4->field_2C;
-//          if ( v53 > v54 )
-//          {
-//            v4->field_2C = v53;
-//            v211 = v53 - v54;
-//          }
-//        }
-//        else
-//        {
-//          v52 = (char)v52;
-//          v6 = (char)v52 + v4->field_2C < 0;
-//          v4->field_2C += (char)v52;
-//          if ( v6 )
-//            v4->field_2C = 0;
-//          v211 = v52;
-//        }
-//      }
-//      LOBYTE(v55) = v26->field_38[4];
-//      if ( (_BYTE)v55 )
-//      {
-//        if ( (_BYTE)v55 == 99 )
-//        {
-//          v56 = v2->field_30;
-//          v57 = v4->field_30;
-//          if ( v56 > v57 )
-//          {
-//            v4->field_30 = v56;
-//            v209 = v56 - v57;
-//          }
-//        }
-//        else
-//        {
-//          v55 = (char)v55;
-//          v6 = (char)v55 + v4->field_30 < 0;
-//          v4->field_30 += (char)v55;
-//          if ( v6 )
-//            v4->field_30 = 0;
-//          v209 = v55;
-//        }
-//      }
-//      LOBYTE(v58) = v26->field_38[5];
-//      if ( (_BYTE)v58 )
-//      {
-//        if ( (_BYTE)v58 == 99 )
-//        {
-//          v59 = v2->field_34;
-//          v60 = v4->field_34;
-//          if ( v59 > v60 )
-//          {
-//            v4->field_34 = v59;
-//            v207 = v59 - v60;
-//          }
-//        }
-//        else
-//        {
-//          v58 = (char)v58;
-//          v6 = (char)v58 + v4->field_34 < 0;
-//          v4->field_34 += (char)v58;
-//          if ( v6 )
-//            v4->field_34 = 0;
-//          v207 = v58;
-//        }
-//      }
-//      LOBYTE(v61) = v26->field_38[6];
-//      if ( (_BYTE)v61 )
-//      {
-//        if ( (_BYTE)v61 == 99 )
-//        {
-//          v62 = v2->field_38;
-//          v63 = v4->field_38;
-//          if ( v62 > v63 )
-//          {
-//            v4->field_38 = v62;
-//            v206 = v62 - v63;
-//          }
-//        }
-//        else
-//        {
-//          v61 = (char)v61;
-//          v6 = (char)v61 + v4->field_38 < 0;
-//          v4->field_38 += (char)v61;
-//          if ( v6 )
-//            v4->field_38 = 0;
-//          v206 = v61;
-//        }
-//      }
-//      LOBYTE(v64) = v26->field_38[7];
-//      if ( (_BYTE)v64 )
-//      {
-//        if ( (_BYTE)v64 == 99 )
-//        {
-//          v65 = v2->field_3C;
-//          v66 = v4->field_3C;
-//          if ( v65 > v66 )
-//          {
-//            v4->field_3C = v65;
-//            v204 = v65 - v66;
-//          }
-//        }
-//        else
-//        {
-//          v64 = (char)v64;
-//          v6 = (char)v64 + v4->field_3C < 0;
-//          v4->field_3C += (char)v64;
-//          if ( v6 )
-//            v4->field_3C = 0;
-//          v204 = v64;
-//        }
-//      }
-//      LOBYTE(v67) = v26->field_38[8];
-//      if ( (_BYTE)v67 )
-//      {
-//        if ( (_BYTE)v67 == 99 )
-//        {
-//          v68 = v2->field_40;
-//          v69 = v4->field_40;
-//          if ( v68 > v69 )
-//          {
-//            v4->field_40 = v68;
-//            v202 = v68 - v69;
-//          }
-//        }
-//        else
-//        {
-//          v67 = (char)v67;
-//          v6 = (char)v67 + v4->field_40 < 0;
-//          v4->field_40 += (char)v67;
-//          if ( v6 )
-//            v4->field_40 = 0;
-//          v202 = v67;
-//        }
-//      }
-//      v70 = v26->field_38[9];
-//      if ( v70 )
-//      {
-//        v195 = am_40D402(v189, v70);
-//        v191 = v26->field_38[9] - v195;
-//      }
-//      LOBYTE(v71) = v26->field_38[10];
-//      if ( (_BYTE)v71 )
-//      {
-//        if ( (_BYTE)v71 == 99 )
-//        {
-//          v72 = v2->field_28;
-//          v73 = v4->field_28;
-//          if ( v72 > v73 )
-//          {
-//            v4->field_28 = v72;
-//            v200 = v72 - v73;
-//          }
-//        }
-//        else
-//        {
-//          v71 = (char)v71;
-//          v6 = (char)v71 + v4->field_28 < 0;
-//          v4->field_28 += (char)v71;
-//          if ( v6 )
-//            v4->field_28 = 0;
-//          v200 = v71;
-//        }
-//      }
-//      LOBYTE(v74) = v26->field_38[11];
-//      if ( (_BYTE)v74 )
-//      {
-//        if ( (_BYTE)v74 == 99 )
-//        {
-//          v75 = v2->field_24;
-//          v76 = v4->field_24;
-//          if ( v75 > v76 )
-//          {
-//            v4->field_24 = v75;
-//            v198 = v75 - v76;
-//          }
-//        }
-//        else
-//        {
-//          v74 = (char)v74;
-//          v6 = (char)v74 + v4->field_24 < 0;
-//          v4->field_24 += (char)v74;
-//          if ( v6 )
-//            v4->field_24 = 0;
-//          v198 = v74;
-//        }
-//      }
-//      LOBYTE(v77) = v26->field_38[12];
-//      if ( (_BYTE)v77 )
-//      {
-//        if ( (_BYTE)v77 == 99 )
-//        {
-//          v78 = v2->field_2C;
-//          v79 = v4->field_2C;
-//          if ( v78 != v79 )
-//          {
-//            if ( v78 <= v79 )
-//            {
-//              v2->field_2C = v79;
-//              v194 = v79 - v78;
-//            }
-//            else
-//            {
-//              v4->field_2C = v78;
-//              v211 = v78 - v79;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v77 = (char)v77;
-//          v2->field_2C += (char)v77;
-//          v4->field_2C += (char)v77;
-//          if ( v2->field_2C < 0 )
-//            v2->field_2C = 0;
-//          if ( v4->field_2C < 0 )
-//            v4->field_2C = 0;
-//          v194 = v77;
-//          v211 = v77;
-//        }
-//      }
-//      LOBYTE(v80) = v26->field_38[13];
-//      if ( (_BYTE)v80 )
-//      {
-//        if ( (_BYTE)v80 == 99 )
-//        {
-//          v81 = v2->field_30;
-//          v82 = v4->field_30;
-//          if ( v81 != v82 )
-//          {
-//            if ( v81 <= v82 )
-//            {
-//              v2->field_30 = v82;
-//              v210 = v82 - v81;
-//            }
-//            else
-//            {
-//              v4->field_30 = v81;
-//              v209 = v81 - v82;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v80 = (char)v80;
-//          v2->field_30 += (char)v80;
-//          v4->field_30 += (char)v80;
-//          if ( v2->field_30 < 0 )
-//            v2->field_30 = 0;
-//          if ( v4->field_30 < 0 )
-//            v4->field_30 = 0;
-//          v209 = v80;
-//          v210 = v80;
-//        }
-//      }
-//      LOBYTE(v83) = v26->field_38[14];
-//      if ( (_BYTE)v83 )
-//      {
-//        if ( (_BYTE)v83 == 99 )
-//        {
-//          v84 = v2->field_34;
-//          v85 = v4->field_34;
-//          if ( v84 != v85 )
-//          {
-//            if ( v84 <= v85 )
-//            {
-//              v2->field_34 = v85;
-//              v208 = v85 - v84;
-//            }
-//            else
-//            {
-//              v4->field_34 = v84;
-//              v207 = v84 - v85;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v83 = (char)v83;
-//          v2->field_34 += (char)v83;
-//          v4->field_34 += (char)v83;
-//          if ( v2->field_34 < 0 )
-//            v2->field_34 = 0;
-//          if ( v4->field_34 < 0 )
-//            v4->field_34 = 0;
-//          v208 = v83;
-//          v207 = v83;
-//        }
-//      }
-//      LOBYTE(v86) = v26->field_38[15];
-//      if ( (_BYTE)v86 )
-//      {
-//        if ( (_BYTE)v86 == 99 )
-//        {
-//          v87 = v2->field_38;
-//          v88 = v4->field_38;
-//          if ( v87 != v88 )
-//          {
-//            if ( v87 <= v88 )
-//            {
-//              v2->field_38 = v88;
-//              v197 = v88 - v87;
-//            }
-//            else
-//            {
-//              v4->field_38 = v87;
-//              v206 = v87 - v88;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v86 = (char)v86;
-//          v2->field_38 += (char)v86;
-//          v4->field_38 += (char)v86;
-//          if ( v2->field_38 < 0 )
-//            v2->field_38 = 0;
-//          if ( v4->field_38 < 0 )
-//            v4->field_38 = 0;
-//          v197 = v86;
-//          v206 = v86;
-//        }
-//      }
-//      LOBYTE(v89) = v26->field_48[0];
-//      if ( v89 )
-//      {
-//        if ( v89 == 99 )
-//        {
-//          v90 = v2->field_3C;
-//          v91 = v4->field_3C;
-//          if ( v90 != v91 )
-//          {
-//            if ( v90 <= v91 )
-//            {
-//              v205 = v91 > v90;
-//              v2->field_3C = v91;
-//            }
-//            else
-//            {
-//              v204 = 1;
-//              v4->field_3C = v90;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v89 = v89;
-//          v2->field_3C += v89;
-//          v4->field_3C += v89;
-//          if ( v2->field_3C < 0 )
-//            v2->field_3C = 0;
-//          if ( v4->field_3C < 0 )
-//            v4->field_3C = 0;
-//          v205 = v89;
-//          v204 = v89;
-//        }
-//      }
-//      LOBYTE(v92) = v26->field_48[1];
-//      if ( (_BYTE)v92 )
-//      {
-//        if ( (_BYTE)v92 == 99 )
-//        {
-//          v93 = v2->field_40;
-//          v94 = v4->field_40;
-//          if ( v93 != v94 )
-//          {
-//            if ( v93 <= v94 )
-//            {
-//              v2->field_40 = v94;
-//              v203 = v94 - v93;
-//            }
-//            else
-//            {
-//              v4->field_40 = v93;
-//              v202 = v93 - v94;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v92 = (char)v92;
-//          v2->field_40 += (char)v92;
-//          v4->field_40 += (char)v92;
-//          if ( v2->field_40 < 0 )
-//            v2->field_40 = 0;
-//          if ( v4->field_40 < 0 )
-//            v4->field_40 = 0;
-//          v203 = v92;
-//          v202 = v92;
-//        }
-//      }
-//      v95 = v26->field_48[2];
-//      if ( v95 )
-//      {
-//        v96 = am_40D402(v193, v95);
-//        v97 = v26->field_48[2];
-//        v196 = v96;
-//        v98 = am_40D402(v189, v97);
-//        v195 = v98;
-//        v99 = v26->field_48[2] - v98;
-//        v192 = v26->field_48[2] - v196;
-//        v191 = v99;
-//      }
-//      LOBYTE(v100) = v26->field_48[3];
-//      if ( (_BYTE)v100 )
-//      {
-//        if ( (_BYTE)v100 == 99 )
-//        {
-//          v101 = v2->field_28;
-//          v102 = v4->field_28;
-//          if ( v101 != v102 )
-//          {
-//            if ( v101 <= v102 )
-//            {
-//              v2->field_28 = v102;
-//              v201 = v102 - v101;
-//            }
-//            else
-//            {
-//              v4->field_28 = v101;
-//              v200 = v101 - v102;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v100 = (char)v100;
-//          v2->field_28 += (char)v100;
-//          v4->field_28 += (char)v100;
-//          if ( v2->field_28 < 0 )
-//            v2->field_28 = 0;
-//          if ( v4->field_28 < 0 )
-//            v4->field_28 = 0;
-//          v201 = v100;
-//          v200 = v100;
-//        }
-//      }
-//      LOBYTE(v103) = v26->field_48[4];
-//      break;
-//    case 0:
-//LABEL_231:
-//      v104 = pCard->field_48[6];
-//      v105 = v104 + (pCard->field_48[5] == 1);
-//      v106 = 0;
-//      dword_4FAA68 = v104 + (pCard->field_48[5] == 1);
-//      dword_4FAA64 = v104;
-//      if ( v104 > 0 )
-//      {
-//        do
-//        {
-//          am_40A283(v193, v105);
-//          ++v106;
-//        }
-//        while ( v106 < pCard->field_48[6] );
-//      }
-//      v107 = pCard;
-//      am_byte_4FAA77 = GetPlayerHandCardCount(v193) > dword_4E1874;
-//      LOBYTE(v108) = pCard->field_48[7];
-//      if ( (_BYTE)v108 )
-//      {
-//        if ( (_BYTE)v108 == 99 )
-//        {
-//          v109 = v2->field_2C;
-//          v110 = v4->field_2C;
-//          if ( v109 < v110 )
-//          {
-//            v2->field_2C = v110;
-//            v194 = v110 - v109;
-//          }
-//        }
-//        else
-//        {
-//          v108 = (char)v108;
-//          v6 = (char)v108 + v2->field_2C < 0;
-//          v2->field_2C += (char)v108;
-//          if ( v6 )
-//            v2->field_2C = 0;
-//          v194 = v108;
-//        }
-//      }
-//      LOBYTE(v111) = v107->field_48[8];
-//      if ( (_BYTE)v111 )
-//      {
-//        if ( (_BYTE)v111 == 99 )
-//        {
-//          v112 = v2->field_30;
-//          v113 = v4->field_30;
-//          if ( v112 < v113 )
-//          {
-//            v2->field_30 = v113;
-//            v210 = v113 - v112;
-//          }
-//        }
-//        else
-//        {
-//          v111 = (char)v111;
-//          v6 = (char)v111 + v2->field_30 < 0;
-//          v2->field_30 += (char)v111;
-//          if ( v6 )
-//            v2->field_30 = 0;
-//          v210 = v111;
-//        }
-//      }
-//      LOBYTE(v114) = v107->field_48[9];
-//      if ( (_BYTE)v114 )
-//      {
-//        if ( (_BYTE)v114 == 99 )
-//        {
-//          v115 = v2->field_34;
-//          v116 = v4->field_34;
-//          if ( v115 < v116 )
-//          {
-//            v2->field_34 = v116;
-//            v208 = v116 - v115;
-//          }
-//        }
-//        else
-//        {
-//          v114 = (char)v114;
-//          v6 = (char)v114 + v2->field_34 < 0;
-//          v2->field_34 += (char)v114;
-//          if ( v6 )
-//            v2->field_34 = 0;
-//          v208 = v114;
-//        }
-//      }
-//      LOBYTE(v117) = v107->field_48[10];
-//      if ( (_BYTE)v117 )
-//      {
-//        if ( (_BYTE)v117 == 99 )
-//        {
-//          v118 = v2->field_38;
-//          v119 = v4->field_38;
-//          if ( v118 < v119 )
-//          {
-//            v2->field_38 = v119;
-//            v197 = v119 - v118;
-//          }
-//        }
-//        else
-//        {
-//          v117 = (char)v117;
-//          v6 = (char)v117 + v2->field_38 < 0;
-//          v2->field_38 += (char)v117;
-//          if ( v6 )
-//            v2->field_38 = 0;
-//          v197 = v117;
-//        }
-//      }
-//      LOBYTE(v120) = v107->field_48[11];
-//      if ( v120 )
-//      {
-//        if ( v120 == 99 )
-//        {
-//          v121 = v2->field_3C;
-//          v122 = v4->field_3C;
-//          if ( v121 < v122 )
-//          {
-//            v2->field_3C = v122;
-//            v205 = v122 - v121;
-//          }
-//        }
-//        else
-//        {
-//          v120 = v120;
-//          v6 = v120 + v2->field_3C < 0;
-//          v2->field_3C += v120;
-//          if ( v6 )
-//            v2->field_3C = 0;
-//          v205 = v120;
-//        }
-//      }
-//      LOBYTE(v123) = v107->field_48[12];
-//      if ( (_BYTE)v123 )
-//      {
-//        if ( (_BYTE)v123 == 99 )
-//        {
-//          v124 = v2->field_40;
-//          v125 = v4->field_40;
-//          if ( v124 < v125 )
-//          {
-//            v2->field_40 = v125;
-//            v203 = v125 - v124;
-//          }
-//        }
-//        else
-//        {
-//          v123 = (char)v123;
-//          v6 = (char)v123 + v2->field_40 < 0;
-//          v2->field_40 += (char)v123;
-//          if ( v6 )
-//            v2->field_40 = 0;
-//          v203 = v123;
-//        }
-//      }
-//      v126 = v107->field_48[13];
-//      if ( v126 )
-//      {
-//        v196 = am_40D402(v193, v126);
-//        v192 = v107->field_48[13] - v196;
-//      }
-//      LOBYTE(v127) = v107->field_48[14];
-//      if ( (_BYTE)v127 )
-//      {
-//        if ( (_BYTE)v127 == 99 )
-//        {
-//          v128 = v2->field_28;
-//          v129 = v4->field_28;
-//          if ( v128 < v129 )
-//          {
-//            v2->field_28 = v129;
-//            v201 = v129 - v128;
-//          }
-//        }
-//        else
-//        {
-//          v127 = (char)v127;
-//          v6 = (char)v127 + v2->field_28 < 0;
-//          v2->field_28 += (char)v127;
-//          if ( v6 )
-//            v2->field_28 = 0;
-//          v201 = v127;
-//        }
-//      }
-//      LOBYTE(v130) = v107->field_48[15];
-//      if ( (_BYTE)v130 )
-//      {
-//        if ( (_BYTE)v130 == 99 )
-//        {
-//          v131 = v2->field_24;
-//          v132 = v4->field_24;
-//          if ( v131 < v132 )
-//          {
-//            v2->field_24 = v132;
-//            v199 = v132 - v131;
-//          }
-//        }
-//        else
-//        {
-//          v130 = (char)v130;
-//          v6 = (char)v130 + v2->field_24 < 0;
-//          v2->field_24 += (char)v130;
-//          if ( v6 )
-//            v2->field_24 = 0;
-//          v199 = v130;
-//        }
-//      }
-//      LOBYTE(v133) = v107->field_58[0];
-//      if ( (_BYTE)v133 )
-//      {
-//        if ( (_BYTE)v133 == 99 )
-//        {
-//          v134 = v2->field_2C;
-//          v135 = v4->field_2C;
-//          if ( v134 > v135 )
-//          {
-//            v4->field_2C = v134;
-//            v211 = v134 - v135;
-//          }
-//        }
-//        else
-//        {
-//          v133 = (char)v133;
-//          v6 = (char)v133 + v4->field_2C < 0;
-//          v4->field_2C += (char)v133;
-//          if ( v6 )
-//            v4->field_2C = 0;
-//          v211 = v133;
-//        }
-//      }
-//      LOBYTE(v136) = v107->field_58[1];
-//      if ( (_BYTE)v136 )
-//      {
-//        if ( (_BYTE)v136 == 99 )
-//        {
-//          v137 = v2->field_30;
-//          v138 = v4->field_30;
-//          if ( v137 > v138 )
-//          {
-//            v4->field_30 = v137;
-//            v209 = v137 - v138;
-//          }
-//        }
-//        else
-//        {
-//          v136 = (char)v136;
-//          v6 = (char)v136 + v4->field_30 < 0;
-//          v4->field_30 += (char)v136;
-//          if ( v6 )
-//            v4->field_30 = 0;
-//          v209 = v136;
-//        }
-//      }
-//      LOBYTE(v139) = v107->field_58[2];
-//      if ( (_BYTE)v139 )
-//      {
-//        if ( (_BYTE)v139 == 99 )
-//        {
-//          v140 = v2->field_34;
-//          v141 = v4->field_34;
-//          if ( v140 > v141 )
-//          {
-//            v4->field_34 = v140;
-//            v207 = v140 - v141;
-//          }
-//        }
-//        else
-//        {
-//          v139 = (char)v139;
-//          v6 = (char)v139 + v4->field_34 < 0;
-//          v4->field_34 += (char)v139;
-//          if ( v6 )
-//            v4->field_34 = 0;
-//          v207 = v139;
-//        }
-//      }
-//      LOBYTE(v142) = v107->field_58[3];
-//      if ( (_BYTE)v142 )
-//      {
-//        if ( (_BYTE)v142 == 99 )
-//        {
-//          v143 = v2->field_38;
-//          v144 = v4->field_38;
-//          if ( v143 > v144 )
-//          {
-//            v4->field_38 = v143;
-//            v206 = v143 - v144;
-//          }
-//        }
-//        else
-//        {
-//          v142 = (char)v142;
-//          v6 = (char)v142 + v4->field_38 < 0;
-//          v4->field_38 += (char)v142;
-//          if ( v6 )
-//            v4->field_38 = 0;
-//          v206 = v142;
-//        }
-//      }
-//      LOBYTE(v145) = v107->field_58[4];
-//      if ( (_BYTE)v145 )
-//      {
-//        if ( (_BYTE)v145 == 99 )
-//        {
-//          v146 = v2->field_3C;
-//          v147 = v4->field_3C;
-//          if ( v146 > v147 )
-//          {
-//            v4->field_3C = v146;
-//            v204 = v146 - v147;
-//          }
-//        }
-//        else
-//        {
-//          v145 = (char)v145;
-//          v6 = (char)v145 + v4->field_3C < 0;
-//          v4->field_3C += (char)v145;
-//          if ( v6 )
-//            v4->field_3C = 0;
-//          v204 = v145;
-//        }
-//      }
-//      LOBYTE(v148) = v107->field_58[5];
-//      if ( (_BYTE)v148 )
-//      {
-//        if ( (_BYTE)v148 == 99 )
-//        {
-//          v149 = v2->field_40;
-//          v150 = v4->field_40;
-//          if ( v149 > v150 )
-//          {
-//            v4->field_40 = v149;
-//            v202 = v149 - v150;
-//          }
-//        }
-//        else
-//        {
-//          v148 = (char)v148;
-//          v6 = (char)v148 + v4->field_40 < 0;
-//          v4->field_40 += (char)v148;
-//          if ( v6 )
-//            v4->field_40 = 0;
-//          v202 = v148;
-//        }
-//      }
-//      v151 = v107->field_58[6];
-//      if ( v151 )
-//      {
-//        v195 = am_40D402(v189, v151);
-//        v191 = v107->field_58[6] - v195;
-//      }
-//      LOBYTE(v152) = v107->field_58[7];
-//      if ( (_BYTE)v152 )
-//      {
-//        if ( (_BYTE)v152 == 99 )
-//        {
-//          v153 = v2->field_28;
-//          v154 = v4->field_28;
-//          if ( v153 > v154 )
-//          {
-//            v4->field_28 = v153;
-//            v200 = v153 - v154;
-//          }
-//        }
-//        else
-//        {
-//          v152 = (char)v152;
-//          v6 = (char)v152 + v4->field_28 < 0;
-//          v4->field_28 += (char)v152;
-//          if ( v6 )
-//            v4->field_28 = 0;
-//          v200 = v152;
-//        }
-//      }
-//      LOBYTE(v155) = v107->field_58[8];
-//      if ( (_BYTE)v155 )
-//      {
-//        if ( (_BYTE)v155 == 99 )
-//        {
-//          v156 = v2->field_24;
-//          v157 = v4->field_24;
-//          if ( v156 > v157 )
-//          {
-//            v4->field_24 = v156;
-//            v198 = v156 - v157;
-//          }
-//        }
-//        else
-//        {
-//          v155 = (char)v155;
-//          v6 = (char)v155 + v4->field_24 < 0;
-//          v4->field_24 += (char)v155;
-//          if ( v6 )
-//            v4->field_24 = 0;
-//          v198 = v155;
-//        }
-//      }
-//      LOBYTE(v158) = v107->field_58[9];
-//      if ( (_BYTE)v158 )
-//      {
-//        if ( (_BYTE)v158 == 99 )
-//        {
-//          v159 = v2->field_2C;
-//          v160 = v4->field_2C;
-//          if ( v159 != v160 )
-//          {
-//            if ( v159 <= v160 )
-//            {
-//              v2->field_2C = v160;
-//              v194 = v160 - v159;
-//            }
-//            else
-//            {
-//              v4->field_2C = v159;
-//              v211 = v159 - v160;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v158 = (char)v158;
-//          v2->field_2C += (char)v158;
-//          v4->field_2C += (char)v158;
-//          if ( v2->field_2C < 0 )
-//            v2->field_2C = 0;
-//          if ( v4->field_2C < 0 )
-//            v4->field_2C = 0;
-//          v194 = v158;
-//          v211 = v158;
-//        }
-//      }
-//      LOBYTE(v161) = v107->field_58[10];
-//      if ( (_BYTE)v161 )
-//      {
-//        if ( (_BYTE)v161 == 99 )
-//        {
-//          v162 = v2->field_30;
-//          v163 = v4->field_30;
-//          if ( v162 != v163 )
-//          {
-//            if ( v162 <= v163 )
-//            {
-//              v2->field_30 = v163;
-//              v210 = v163 - v162;
-//            }
-//            else
-//            {
-//              v4->field_30 = v162;
-//              v209 = v162 - v163;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v161 = (char)v161;
-//          v2->field_30 += (char)v161;
-//          v4->field_30 += (char)v161;
-//          if ( v2->field_30 < 0 )
-//            v2->field_30 = 0;
-//          if ( v4->field_30 < 0 )
-//            v4->field_30 = 0;
-//          v209 = v161;
-//          v210 = v161;
-//        }
-//      }
-//      LOBYTE(v164) = v107->field_58[11];
-//      if ( (_BYTE)v164 )
-//      {
-//        if ( (_BYTE)v164 == 99 )
-//        {
-//          v165 = v2->field_34;
-//          v166 = v4->field_34;
-//          if ( v165 != v166 )
-//          {
-//            if ( v165 <= v166 )
-//            {
-//              v2->field_34 = v166;
-//              v208 = v166 - v165;
-//            }
-//            else
-//            {
-//              v4->field_34 = v165;
-//              v207 = v165 - v166;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v164 = (char)v164;
-//          v2->field_34 += (char)v164;
-//          v4->field_34 += (char)v164;
-//          if ( v2->field_34 < 0 )
-//            v2->field_34 = 0;
-//          if ( v4->field_34 < 0 )
-//            v4->field_34 = 0;
-//          v208 = v164;
-//          v207 = v164;
-//        }
-//      }
-//      LOBYTE(v167) = v107->field_58[12];
-//      if ( (_BYTE)v167 )
-//      {
-//        if ( (_BYTE)v167 == 99 )
-//        {
-//          v168 = v2->field_38;
-//          v169 = v4->field_38;
-//          if ( v168 != v169 )
-//          {
-//            if ( v168 <= v169 )
-//            {
-//              v2->field_38 = v169;
-//              v197 = v169 - v168;
-//            }
-//            else
-//            {
-//              v4->field_38 = v168;
-//              v206 = v168 - v169;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v167 = (char)v167;
-//          v2->field_38 += (char)v167;
-//          v4->field_38 += (char)v167;
-//          if ( v2->field_38 < 0 )
-//            v2->field_38 = 0;
-//          if ( v4->field_38 < 0 )
-//            v4->field_38 = 0;
-//          v197 = v167;
-//          v206 = v167;
-//        }
-//      }
-//      LOBYTE(v170) = v107->field_58[13];
-//      if ( v170 )
-//      {
-//        if ( v170 == 99 )
-//        {
-//          v171 = v2->field_3C;
-//          v172 = v4->field_3C;
-//          if ( v171 != v172 )
-//          {
-//            if ( v171 <= v172 )
-//            {
-//              v205 = v172 > v171;
-//              v2->field_3C = v172;
-//            }
-//            else
-//            {
-//              v204 = 1;
-//              v4->field_3C = v171;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v170 = v170;
-//          v2->field_3C += v170;
-//          v4->field_3C += v170;
-//          if ( v2->field_3C < 0 )
-//            v2->field_3C = 0;
-//          if ( v4->field_3C < 0 )
-//            v4->field_3C = 0;
-//          v205 = v170;
-//          v204 = v170;
-//        }
-//      }
-//      LOBYTE(v173) = v107->field_58[14];
-//      if ( (_BYTE)v173 )
-//      {
-//        if ( (_BYTE)v173 == 99 )
-//        {
-//          v174 = v2->field_40;
-//          v175 = v4->field_40;
-//          if ( v174 != v175 )
-//          {
-//            if ( v174 <= v175 )
-//            {
-//              v2->field_40 = v175;
-//              v203 = v175 - v174;
-//            }
-//            else
-//            {
-//              v4->field_40 = v174;
-//              v202 = v174 - v175;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v173 = (char)v173;
-//          v2->field_40 += (char)v173;
-//          v4->field_40 += (char)v173;
-//          if ( v2->field_40 < 0 )
-//            v2->field_40 = 0;
-//          if ( v4->field_40 < 0 )
-//            v4->field_40 = 0;
-//          v203 = v173;
-//          v202 = v173;
-//        }
-//      }
-//      v176 = v107->field_58[15];
-//      if ( v176 )
-//      {
-//        v177 = am_40D402(v193, v176);
-//        v178 = v107->field_58[15];
-//        v196 = v177;
-//        v179 = am_40D402(v189, v178);
-//        v195 = v179;
-//        v180 = v107->field_58[15] - v179;
-//        v192 = v107->field_58[15] - v196;
-//        v191 = v180;
-//      }
-//      LOBYTE(v181) = LOBYTE(v107->field_68);
-//      if ( (_BYTE)v181 )
-//      {
-//        if ( (_BYTE)v181 == 99 )
-//        {
-//          v182 = v2->field_28;
-//          v183 = v4->field_28;
-//          if ( v182 != v183 )
-//          {
-//            if ( v182 <= v183 )
-//            {
-//              v2->field_28 = v183;
-//              v201 = v183 - v182;
-//            }
-//            else
-//            {
-//              v4->field_28 = v182;
-//              v200 = v182 - v183;
-//            }
-//          }
-//        }
-//        else
-//        {
-//          v181 = (char)v181;
-//          v2->field_28 += (char)v181;
-//          v4->field_28 += (char)v181;
-//          if ( v2->field_28 < 0 )
-//            v2->field_28 = 0;
-//          if ( v4->field_28 < 0 )
-//            v4->field_28 = 0;
-//          v201 = v181;
-//          v200 = v181;
-//        }
-//      }
-//      LOBYTE(v103) = BYTE1(v107->field_68);
-//      break;
-//  }
-//  if ( (_BYTE)v103 )
-//  {
-//    if ( (_BYTE)v103 == 99 )
-//    {
-//      v184 = v2->field_24;
-//      v185 = v4->field_24;
-//      if ( v184 != v185 )
-//      {
-//        if ( v184 <= v185 )
-//        {
-//          v2->field_24 = v185;
-//          v199 = v185 - v184;
-//        }
-//        else
-//        {
-//          v4->field_24 = v184;
-//          v198 = v184 - v185;
-//        }
-//      }
-//    }
-//    else
-//    {
-//      v103 = (char)v103;
-//      v2->field_24 += (char)v103;
-//      v4->field_24 += (char)v103;
-//      if ( v2->field_24 < 0 )
-//        v2->field_24 = 0;
-//      if ( v4->field_24 < 0 )
-//        v4->field_24 = 0;
-//      v199 = v103;
-//      v198 = v103;
-//    }
-//  }
-//  if ( v194 > 0 || v211 > 0 )
-//    ArcomageGame::PlaySound(0x1Eu);
-//  if ( v194 < 0 || v211 < 0 )
-//    ArcomageGame::PlaySound(0x1Fu);
-//  if ( v210 > 0 || v209 > 0 )
-//    ArcomageGame::PlaySound(0x21u);
-//  if ( v210 < 0 || v209 < 0 )
-//    ArcomageGame::PlaySound(0x22u);
-//  if ( v208 > 0 || v207 > 0 )
-//    ArcomageGame::PlaySound(0x24u);
-//  if ( v208 < 0 || v207 < 0 )
-//    ArcomageGame::PlaySound(0x25u);
-//  if ( v197 > 0 || v206 > 0 )
-//    ArcomageGame::PlaySound(0x27u);
-//  if ( v197 < 0 || v206 < 0 )
-//    ArcomageGame::PlaySound(0x28u);
-//  if ( v205 > 0 || v204 > 0 )
-//    ArcomageGame::PlaySound(0x2Au);
-//  if ( v205 < 0 || v204 < 0 )
-//    ArcomageGame::PlaySound(0x2Bu);
-//  if ( v203 > 0 || v202 > 0 )
-//    ArcomageGame::PlaySound(0x2Du);
-//  if ( v203 < 0 || v202 < 0 )
-//    ArcomageGame::PlaySound(0x2Eu);
-//  if ( v192 || v191 || v196 || v195 )
-//    ArcomageGame::PlaySound(0x30u);
-//  if ( v201 > 0 || v200 > 0 )
-//    ArcomageGame::PlaySound(0x31u);
-//  if ( v201 < 0 || v200 < 0 )
-//    ArcomageGame::PlaySound(0x32u);
-//  if ( v199 > 0 || v198 > 0 )
-//    ArcomageGame::PlaySound(0x34u);
-//  if ( v199 < 0 || v198 < 0 )
-//    ArcomageGame::PlaySound(0x35u);
-//  if ( v193 )
-//  {
-//    if ( v194 )
-//    {
-//      v187.x = 573;
-//      v187.y = 92;
-//      am_40D2B4(&v187, v194);
-//    }
-//    if ( v211 )
-//    {
-//      v187.x = 26;
-//      v187.y = 92;
-//      am_40D2B4(&v187, v211);
-//    }
-//    if ( v210 )
-//    {
-//      v187.x = 573;
-//      v187.y = 164;
-//      am_40D2B4(&v187, v210);
-//    }
-//    if ( v209 )
-//    {
-//      v187.x = 26;
-//      v187.y = 164;
-//      am_40D2B4(&v187, v209);
-//    }
-//    if ( v208 )
-//    {
-//      v187.x = 573;
-//      v187.y = 236;
-//      am_40D2B4(&v187, v208);
-//    }
-//    if ( v207 )
-//    {
-//      v187.x = 26;
-//      v187.y = 236;
-//      am_40D2B4(&v187, v207);
-//    }
-//    if ( v197 )
-//    {
-//      v187.x = 563;
-//      v187.y = 114;
-//      am_40D2B4(&v187, v197);
-//    }
-//    if ( v206 )
-//    {
-//      v187.x = 16;
-//      v187.y = 114;
-//      am_40D2B4(&v187, v206);
-//    }
-//    if ( v205 )
-//    {
-//      v187.x = 563;
-//      v187.y = 186;
-//      am_40D2B4(&v187, v205);
-//    }
-//    if ( v204 )
-//    {
-//      v187.x = 16;
-//      v187.y = 186;
-//      am_40D2B4(&v187, v204);
-//    }
-//    if ( v203 )
-//    {
-//      v187.x = 563;
-//      v187.y = 258;
-//      am_40D2B4(&v187, v203);
-//    }
-//    if ( v202 )
-//    {
-//      v187.x = 16;
-//      v187.y = 258;
-//      am_40D2B4(&v187, v202);
-//    }
-//    v186 = 296;
-//    if ( v201 )
-//    {
-//      v187.x = 442;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v201);
-//    }
-//    if ( v200 )
-//    {
-//      v187.x = 180;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v200);
-//    }
-//    if ( v199 )
-//    {
-//      v187.x = 514;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v199);
-//    }
-//    if ( v198 )
-//    {
-//      v187.x = 122;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v198);
-//    }
-//    if ( v196 )
-//    {
-//      v187.x = 442;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v196);
-//    }
-//    if ( v192 )
-//    {
-//      v187.x = 514;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v192);
-//    }
-//    if ( v195 )
-//    {
-//      v187.x = 180;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v195);
-//    }
-//    if ( v191 )
-//    {
-//      v187.x = 122;
-//      goto LABEL_567;
-//    }
-//  }
-//  else
-//  {
-//    if ( v194 )
-//    {
-//      v187.x = 26;
-//      v187.y = 92;
-//      am_40D2B4(&v187, v194);
-//    }
-//    if ( v211 )
-//    {
-//      v187.x = 573;
-//      v187.y = 92;
-//      am_40D2B4(&v187, v211);
-//    }
-//    if ( v210 )
-//    {
-//      v187.x = 26;
-//      v187.y = 164;
-//      am_40D2B4(&v187, v210);
-//    }
-//    if ( v209 )
-//    {
-//      v187.x = 573;
-//      v187.y = 164;
-//      am_40D2B4(&v187, v209);
-//    }
-//    if ( v208 )
-//    {
-//      v187.x = 26;
-//      v187.y = 236;
-//      am_40D2B4(&v187, v208);
-//    }
-//    if ( v207 )
-//    {
-//      v187.x = 573;
-//      v187.y = 236;
-//      am_40D2B4(&v187, v207);
-//    }
-//    if ( v197 )
-//    {
-//      v187.x = 16;
-//      v187.y = 114;
-//      am_40D2B4(&v187, v197);
-//    }
-//    if ( v206 )
-//    {
-//      v187.x = 563;
-//      v187.y = 114;
-//      am_40D2B4(&v187, v206);
-//    }
-//    if ( v205 )
-//    {
-//      v187.x = 16;
-//      v187.y = 186;
-//      am_40D2B4(&v187, v205);
-//    }
-//    if ( v204 )
-//    {
-//      v187.x = 563;
-//      v187.y = 186;
-//      am_40D2B4(&v187, v204);
-//    }
-//    if ( v203 )
-//    {
-//      v187.x = 16;
-//      v187.y = 258;
-//      am_40D2B4(&v187, v203);
-//    }
-//    if ( v202 )
-//    {
-//      v187.x = 563;
-//      v187.y = 258;
-//      am_40D2B4(&v187, v202);
-//    }
-//    v186 = 296;
-//    if ( v201 )
-//    {
-//      v187.x = 180;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v201);
-//    }
-//    if ( v200 )
-//    {
-//      v187.x = 442;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v200);
-//    }
-//    if ( v199 )
-//    {
-//      v187.x = 122;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v199);
-//    }
-//    if ( v198 )
-//    {
-//      v187.x = 514;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v198);
-//    }
-//    if ( v196 )
-//    {
-//      v187.x = 180;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v196);
-//    }
-//    if ( v192 )
-//    {
-//      v187.x = 122;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v192);
-//    }
-//    if ( v195 )
-//    {
-//      v187.x = 442;
-//      v187.y = 296;
-//      am_40D2B4(&v187, v195);
-//    }
-//    if ( v191 )
-//    {
-//      v187.x = 514;
-//LABEL_567:
-//      v187.y = v186;
-//      am_40D2B4(&v187, v191);
-//      return;
-//    }
-//  }
+
+  
+#define APPLY_TO_PLAYER( PLAYER, ENEMY,FIELD, VAL, RES )\
+   if (VAL != 0) {\
+        if (VAL == 99) {\
+          if ( PLAYER->##FIELD < ENEMY->##FIELD ) {\
+            PLAYER->##FIELD = ENEMY->##FIELD;\
+            RES = ENEMY->##FIELD - PLAYER->##FIELD;\
+          }\
+        } else {\
+        PLAYER->##FIELD += (signed int)(VAL);\
+        if ( PLAYER->##FIELD<0 ) PLAYER->##FIELD= 0;\
+        RES = (signed int)(VAL);\
+        }\
+   }
+
+#define APPLY_TO_ENEMY( PLAYER, ENEMY,FIELD, VAL, RES ) APPLY_TO_PLAYER(ENEMY, PLAYER, FIELD, VAL, RES)
+
+#define APPLY_TO_BOTH( PLAYER, ENEMY, FIELD, VAL, RES_P, RES_E ) \
+       if ( VAL != 0) {\
+          if ( VAL == 99 )  { \
+            if ( PLAYER->##FIELD != ENEMY->##FIELD )  { \
+                if ( PLAYER->##FIELD <= ENEMY->##FIELD )  { \
+                    PLAYER->##FIELD = ENEMY->##FIELD; \
+                    RES_P = ENEMY->##FIELD - PLAYER->##FIELD; \
+                }  else { \
+                    ENEMY->##FIELD = PLAYER->##FIELD; \
+                    RES_E = PLAYER->##FIELD - ENEMY->##FIELD; \
+                    } \
+                }\
+            }  else { \
+            PLAYER->##FIELD += (signed int)(VAL);\
+            ENEMY->##FIELD  += (signed int)(VAL); if (PLAYER->##FIELD < 0 ) {PLAYER->##FIELD = 0;} \
+            if ( ENEMY->##FIELD < 0 ) {ENEMY->##FIELD = 0;} \
+            RES_P = (signed int)(VAL);  RES_E = (signed int)(VAL); \
+            }\
+       }
+        ArcomagePlayer *player; // esi@1
+        int v3; // eax@1
+        ArcomagePlayer *enemy; // edi@1
+        int v5; // eax@2
+        char v6; // sf@2
+        unsigned __int8 v7; // of@2
+        int v8; // eax@3
+        int v9; // eax@4
+        char v10; // zf@5
+        int v11; // eax@8
+        unsigned __int8 v12; // zf@8
+        char v13; // sf@8
+        unsigned __int8 v14; // of@8
+        int v15; // eax@9
+        int v16; // eax@10
+        char v17; // zf@12
+        char v18; // al@15
+        int v19; // eax@16
+        int v20; // eax@17
+        int v21; // eax@22
+        int v22; // eax@23
+        int v23; // eax@26
+        signed int v24; // ebx@26
+        int v103;
+        int v104;
+
+        POINT v184; // [sp+Ch] [bp-64h]@488
+        int enemy_num; // [sp+14h] [bp-5Ch]@1
+        ArcomageCard *pCard; // [sp+18h] [bp-58h]@1
+        int buildings_e; // [sp+1Ch] [bp-54h]@1
+        int buildings_p; // [sp+20h] [bp-50h]@1
+        int quarry_p; // [sp+28h] [bp-48h]@1
+        int dmg_e; // [sp+2Ch] [bp-44h]@1
+        int dmg_p; // [sp+30h] [bp-40h]@1
+        int bricks_p; // [sp+34h] [bp-3Ch]@1
+        int tower_e; // [sp+38h] [bp-38h]@1
+        int tower_p; // [sp+3Ch] [bp-34h]@1
+        int wall_e; // [sp+40h] [bp-30h]@1
+        int wall_p; // [sp+44h] [bp-2Ch]@1
+        int beasts_e; // [sp+48h] [bp-28h]@1
+        int beasts_p; // [sp+4Ch] [bp-24h]@1
+        int gems_e; // [sp+50h] [bp-20h]@1
+        int gems_p; // [sp+54h] [bp-1Ch]@1
+        int bricks_e; // [sp+58h] [bp-18h]@1
+        int zoo_e; // [sp+5Ch] [bp-14h]@1
+        int zoo_p; // [sp+60h] [bp-10h]@1
+        int magic_e; // [sp+64h] [bp-Ch]@1
+        int magic_p; // [sp+68h] [bp-8h]@1
+        int quarry_e; // [sp+6Ch] [bp-4h]@1
+
+        quarry_p  = 0;
+        magic_p   = 0;
+        zoo_p     = 0;
+        bricks_p  = 0;
+        gems_p    = 0;
+        beasts_p  = 0;
+        wall_p    = 0;
+        tower_p   = 0;
+        buildings_p = 0;
+        dmg_p     = 0;
+        quarry_e  = 0;
+        magic_e   = 0;
+        zoo_e     = 0;
+        bricks_e  = 0;
+        gems_e    = 0;
+        beasts_e  = 0;
+        wall_e    = 0;
+        tower_e   = 0;
+        buildings_e = 0;
+        dmg_e      = 0;
+
+        player = &am_Players[player_num];
+        pCard = &pCards[uCardID];
+        enemy_num = (player_num + 1) % 2;
+        enemy = &am_Players[enemy_num];
+        switch ( pCard->compare_param )
+            {
+        case 2:
+            v5 = player->quarry_level;
+            v7 = __OFSUB__(v5, enemy->quarry_level);
+            v6 = v5 - enemy->quarry_level < 0;
+            v18 = v6 ^ v7;
+            goto LABEL_25;
+        case 3:
+            v8 = player->magic_level;
+            v7 = __OFSUB__(v8, enemy->magic_level);
+            v6 = v8 - enemy->magic_level < 0;
+            v18 = v6 ^ v7;
+            goto LABEL_25;
+        case 4:
+            v9 = player->zoo_level;
+            v7 = __OFSUB__(v9, enemy->zoo_level);
+            v6 = v9 - enemy->zoo_level < 0;
+            v18 = v6 ^ v7;
+            goto LABEL_25;
+        case 5:
+            v10 = player->quarry_level == enemy->quarry_level;
+            v18 = v10;
+            goto LABEL_25;
+        case 6:
+            v10 = player->magic_level == enemy->magic_level;
+            v18 = v10;
+            goto LABEL_25;
+        case 7:
+            v10 = player->zoo_level == enemy->zoo_level;
+            v18 = v10;
+            goto LABEL_25;
+        case 8:
+            v11 = player->quarry_level;
+            v14 = __OFSUB__(v11, enemy->quarry_level);
+            v12 = v11 == enemy->quarry_level;
+            v13 = v11 - enemy->quarry_level < 0;
+            v18 = !((v13 ^ v14) | v12);
+            goto LABEL_25;
+        case 9:
+            v15 = player->magic_level;
+            v14 = __OFSUB__(v15, enemy->magic_level);
+            v12 = v15 == enemy->magic_level;
+            v13 = v15 - enemy->magic_level < 0;
+            v18 = !((v13 ^ v14) | v12);
+            goto LABEL_25;
+        case 10:
+            v16 = player->zoo_level;
+            v14 = __OFSUB__(v16, enemy->zoo_level);
+            v12 = v16 == enemy->zoo_level;
+            v13 = v16 - enemy->zoo_level < 0;
+            v18 = !((v13 ^ v14) | v12);
+            goto LABEL_25;
+        case 11:
+            v10 = player->wall_height == 0;
+            v18 = v10;
+            goto LABEL_25;
+        case 12:
+            v17 = player->wall_height == 0;
+            v18 = !v17;
+            goto LABEL_25;
+        case 13:
+            v10 = enemy->wall_height == 0;
+            v18 = v10;
+            goto LABEL_25;
+        case 14:
+            v17 = enemy->wall_height == 0;
+            v18 = !v17;
+            goto LABEL_25;
+        case 15:
+            v19 = player->wall_height;
+            v7 = __OFSUB__(v19, enemy->wall_height);
+            v6 = v19 - enemy->wall_height < 0;
+            v18 = v6 ^ v7;
+            goto LABEL_25;
+        case 16:
+            v20 = player->tower_height;
+            v7 = __OFSUB__(v20, enemy->tower_height);
+            v6 = v20 - enemy->tower_height < 0;
+            v18 = v6 ^ v7;
+            goto LABEL_25;
+        case 17:
+            v10 = player->wall_height == enemy->wall_height;
+            v18 = v10;
+            goto LABEL_25;
+        case 18:
+            v10 = player->tower_height == enemy->tower_height;
+            v18 = v10;
+            goto LABEL_25;
+        case 19:
+            v21 = player->wall_height;
+            v14 = __OFSUB__(v21, enemy->wall_height);
+            v12 = v21 == enemy->wall_height;
+            v13 = v21 - enemy->wall_height < 0;
+            v18 = !((v13 ^ v14) | v12);
+            goto LABEL_25;
+        case 20:
+            v22 = player->tower_height;
+            v14 = __OFSUB__(v22, enemy->tower_height);
+            v12 = v22 == enemy->tower_height;
+            v13 = v22 - enemy->tower_height < 0;
+            v18 = !((v13 ^ v14) | v12);
+LABEL_25:
+            if ( v18 )
+                goto LABEL_26;
+            goto LABEL_231;
+        default:
+LABEL_26:
+            v23 = pCard->draw_extra_card_count;
+            v24 = 0;
+            dword_4FAA68 = v23 + (pCard->field_30 == 1);
+            dword_4FAA64 = v23;
+            if ( v23 > 0 )
+                {
+                do
+                    {
+                    GetNextCardFromDeck(player_num);
+                    ++v24;
+                    }
+                    while ( v24 < pCard->draw_extra_card_count );
+                }
+
+            need_to_discard_card = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
+
+
+            APPLY_TO_PLAYER(player, enemy, quarry_level,    pCard->to_player_quarry_lvl, quarry_p);
+            APPLY_TO_PLAYER(player, enemy, magic_level,     pCard->to_player_magic_lvl,  magic_p);
+            APPLY_TO_PLAYER(player, enemy, zoo_level,       pCard->to_player_zoo_lvl,    zoo_p);
+            APPLY_TO_PLAYER(player, enemy, resource_bricks, pCard->to_player_bricks,     bricks_p);
+            APPLY_TO_PLAYER(player, enemy, resource_gems,   pCard->to_player_gems,       gems_p);
+            APPLY_TO_PLAYER(player, enemy, resource_beasts, pCard->to_player_beasts,     beasts_p);
+            if ( pCard->to_player_buildings )
+                {
+                dmg_p = ApplyDamageToBuildings(player_num, (signed int)pCard->to_player_buildings);
+                buildings_p = (signed int)pCard->to_player_buildings - dmg_p;
+                }
+           APPLY_TO_PLAYER(player, enemy, wall_height,  pCard->to_player_wall, wall_p);
+           APPLY_TO_PLAYER(player, enemy, tower_height, pCard->to_player_tower, tower_p);
+
+           APPLY_TO_ENEMY(player, enemy, quarry_level,    pCard->to_enemy_quarry_lvl, quarry_e);
+           APPLY_TO_ENEMY(player, enemy, magic_level,     pCard->to_enemy_magic_lvl,  magic_e);
+           APPLY_TO_ENEMY(player, enemy, zoo_level,       pCard->to_enemy_zoo_lvl,    zoo_e);
+           APPLY_TO_ENEMY(player, enemy, resource_bricks, pCard->to_enemy_bricks,     bricks_e);
+           APPLY_TO_ENEMY(player, enemy, resource_gems,   pCard->to_enemy_gems,       gems_e);
+           APPLY_TO_ENEMY(player, enemy, resource_beasts, pCard->to_enemy_beasts,     beasts_e);
+            if ( pCard->to_enemy_buildings )
+                {
+                dmg_e = ApplyDamageToBuildings(enemy_num, (signed int)pCard->to_enemy_buildings);
+                buildings_e = (signed int)pCard->to_enemy_buildings - dmg_e;
+                }
+            APPLY_TO_ENEMY(player, enemy, wall_height,  pCard->to_enemy_wall,  wall_e);
+            APPLY_TO_ENEMY(player, enemy, tower_height, pCard->to_enemy_tower, tower_e);
+            
+            APPLY_TO_BOTH(player, enemy, quarry_level,    pCard->to_pl_enm_quarry_lvl, quarry_p, quarry_e);
+            APPLY_TO_BOTH(player, enemy, magic_level,     pCard->to_pl_enm_magic_lvl,  magic_p,  magic_e);
+            APPLY_TO_BOTH(player, enemy, zoo_level,       pCard->to_pl_enm_zoo_lvl,    zoo_p,    zoo_e);
+            APPLY_TO_BOTH(player, enemy, resource_bricks, pCard->to_pl_enm_bricks,     bricks_p, bricks_e);
+            APPLY_TO_BOTH(player, enemy, resource_gems,   pCard->to_pl_enm_gems,       gems_p,   gems_e);
+            APPLY_TO_BOTH(player, enemy, resource_beasts, pCard->to_pl_enm_beasts,     beasts_p, beasts_e);
+            if ( pCard->to_pl_enm_buildings )
+                {
+                dmg_p = ApplyDamageToBuildings(player_num, (signed int)pCard->to_pl_enm_buildings);
+                dmg_e = ApplyDamageToBuildings(enemy_num,  (signed int)pCard->to_pl_enm_buildings);
+                buildings_p = (signed int)pCard->to_pl_enm_buildings - dmg_p;
+                buildings_e = (signed int)pCard->to_pl_enm_buildings - dmg_e;
+                }
+            APPLY_TO_BOTH(player, enemy, wall_height, pCard->to_pl_enm_wall, wall_p, wall_e);
+            APPLY_TO_BOTH(player, enemy, tower_height, pCard->to_pl_enm_tower, tower_p, tower_e);
+            break;
+        case 0:
+LABEL_231:
+            v103 = pCard->can_draw_extra_card2;
+            v104 = 0;
+            dword_4FAA68 = v103 + (pCard->field_4D == 1);
+            dword_4FAA64 = v103;
+            if ( v103 > 0 )
+                {
+                do
+                    {
+                    GetNextCardFromDeck(player_num);
+                    ++v104;
+                    }
+                    while ( v104 < pCard->can_draw_extra_card2 );
+                }
+
+            need_to_discard_card = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
+
+            APPLY_TO_PLAYER(player, enemy, quarry_level,    pCard->to_player_quarry_lvl2, quarry_p);
+            APPLY_TO_PLAYER(player, enemy, magic_level,     pCard->to_player_magic_lvl2,  magic_p);
+            APPLY_TO_PLAYER(player, enemy, zoo_level,       pCard->to_player_zoo_lvl2,    zoo_p);
+            APPLY_TO_PLAYER(player, enemy, resource_bricks, pCard->to_player_bricks2,     bricks_p);
+            APPLY_TO_PLAYER(player, enemy, resource_gems,   pCard->to_player_gems2,       gems_p);
+            APPLY_TO_PLAYER(player, enemy, resource_beasts, pCard->to_player_beasts2,     beasts_p);
+            if ( pCard->to_player_buildings2 )
+                {
+                dmg_p = ApplyDamageToBuildings(player_num, (signed int)pCard->to_player_buildings2);
+                buildings_p = (signed int)pCard->to_player_buildings2 - dmg_p;
+                }
+            APPLY_TO_PLAYER(player, enemy, wall_height,  pCard->to_player_wall2,  wall_p);
+            APPLY_TO_PLAYER(player, enemy, tower_height, pCard->to_player_tower2, tower_p);
+
+            APPLY_TO_ENEMY(player, enemy, quarry_level,    pCard->to_enemy_quarry_lvl2, quarry_e);
+            APPLY_TO_ENEMY(player, enemy, magic_level,     pCard->to_enemy_magic_lvl2,  magic_e);
+            APPLY_TO_ENEMY(player, enemy, zoo_level,       pCard->to_enemy_zoo_lvl2,    zoo_e);
+            APPLY_TO_ENEMY(player, enemy, resource_bricks, pCard->to_enemy_bricks2,     bricks_e);
+            APPLY_TO_ENEMY(player, enemy, resource_gems,   pCard->to_enemy_gems2,       gems_e);
+            APPLY_TO_ENEMY(player, enemy, resource_beasts, pCard->to_enemy_beasts2,     beasts_e);
+            if ( pCard->to_enemy_buildings2 )
+                {
+                dmg_e = ApplyDamageToBuildings(enemy_num, (signed int)pCard->to_enemy_buildings2);
+                buildings_e = (signed int)pCard->to_enemy_buildings2 - dmg_e;
+                }
+            APPLY_TO_ENEMY(player, enemy, wall_height,  pCard->to_enemy_wall2,  wall_e);
+            APPLY_TO_ENEMY(player, enemy, tower_height, pCard->to_enemy_tower2, tower_e);
+
+            APPLY_TO_BOTH(player, enemy, quarry_level,    pCard->to_pl_enm_quarry_lvl2, quarry_p, quarry_e);
+            APPLY_TO_BOTH(player, enemy, magic_level,     pCard->to_pl_enm_magic_lvl2,  magic_p,  magic_e);
+            APPLY_TO_BOTH(player, enemy, zoo_level,       pCard->to_pl_enm_zoo_lvl2,    zoo_p,    zoo_e);
+            APPLY_TO_BOTH(player, enemy, resource_bricks, pCard->to_pl_enm_bricks2,     bricks_p, bricks_e);
+            APPLY_TO_BOTH(player, enemy, resource_gems,   pCard->to_pl_enm_gems2,       gems_p,   gems_e);
+            APPLY_TO_BOTH(player, enemy, resource_beasts, pCard->to_pl_enm_beasts2,     beasts_p, beasts_e);
+
+            if ( pCard->to_pl_enm_buildings2 )
+                {
+                dmg_p = ApplyDamageToBuildings(player_num, (signed int)pCard->to_pl_enm_buildings2);
+                dmg_e = ApplyDamageToBuildings(enemy_num,  (signed int)pCard->to_pl_enm_buildings2);
+                buildings_p = (signed int)pCard->to_pl_enm_buildings2 - dmg_p;
+                buildings_e = (signed int)pCard->to_pl_enm_buildings2 - dmg_e;
+                }
+            APPLY_TO_BOTH(player, enemy, wall_height, pCard->to_pl_enm_wall2, wall_p, wall_e);
+            APPLY_TO_BOTH(player, enemy, tower_height, pCard->to_pl_enm_tower2, tower_p, tower_e);    
+            break;
+            }
+          //  }
+        if ( quarry_p > 0 || quarry_e > 0 )
+            pArcomageGame->PlaySound(30);
+        if ( quarry_p < 0 || quarry_e < 0 )
+            pArcomageGame->PlaySound(31);
+        if ( magic_p > 0 || magic_e > 0 )
+            pArcomageGame->PlaySound(33);
+        if ( magic_p < 0 || magic_e < 0 )
+            pArcomageGame->PlaySound(34);
+        if ( zoo_p > 0 || zoo_e > 0 )
+            pArcomageGame->PlaySound(36);
+        if ( zoo_p < 0 || zoo_e < 0 )
+            pArcomageGame->PlaySound(37);
+        if ( bricks_p > 0 || bricks_e > 0 )
+            pArcomageGame->PlaySound(39);
+        if ( bricks_p < 0 || bricks_e < 0 )
+            pArcomageGame->PlaySound(40);
+        if ( gems_p > 0 || gems_e > 0 )
+            pArcomageGame->PlaySound(42);
+        if ( gems_p < 0 || gems_e < 0 )
+            pArcomageGame->PlaySound(43);
+        if ( beasts_p > 0 || beasts_e > 0 )
+            pArcomageGame->PlaySound(45u);
+        if ( beasts_p < 0 || beasts_e < 0 )
+            pArcomageGame->PlaySound(46);
+        if ( buildings_p || buildings_e || dmg_p || dmg_e )
+            pArcomageGame->PlaySound(48);
+        if ( wall_p > 0 || wall_e > 0 )
+            pArcomageGame->PlaySound(49);
+        if ( wall_p < 0 || wall_e < 0 )
+            pArcomageGame->PlaySound(50);
+        if ( tower_p > 0 || tower_e > 0 )
+            pArcomageGame->PlaySound(52);
+        if ( tower_p < 0 || tower_e < 0 )
+            pArcomageGame->PlaySound(53);
+        if ( player_num )
+            {
+            if ( quarry_p )
+                {
+                v184.x = 573;
+                v184.y = 92;
+                am_40D2B4(&v184, quarry_p);
+                }
+            if ( quarry_e )
+                {
+                v184.x = 26;
+                v184.y = 92;
+                am_40D2B4(&v184, quarry_e);
+                }
+            if ( magic_p )
+                {
+                v184.x = 573;
+                v184.y = 164;
+                am_40D2B4(&v184, magic_p);
+                }
+            if ( magic_e )
+                {
+                v184.x = 26;
+                v184.y = 164;
+                am_40D2B4(&v184, magic_e);
+                }
+            if ( zoo_p )
+                {
+                v184.x = 573;
+                v184.y = 236;
+                am_40D2B4(&v184, zoo_p);
+                }
+            if ( zoo_e )
+                {
+                v184.x = 26;
+                v184.y = 236;
+                am_40D2B4(&v184, zoo_e);
+                }
+            if ( bricks_p )
+                {
+                v184.x = 563;
+                v184.y = 114;
+                am_40D2B4(&v184, bricks_p);
+                }
+            if ( bricks_e )
+                {
+                v184.x = 16;
+                v184.y = 114;
+                am_40D2B4(&v184, bricks_e);
+                }
+            if ( gems_p )
+                {
+                v184.x = 563;
+                v184.y = 186;
+                am_40D2B4(&v184, gems_p);
+                }
+            if ( gems_e )
+                {
+                v184.x = 16;
+                v184.y = 186;
+                am_40D2B4(&v184, gems_e);
+                }
+            if ( beasts_p )
+                {
+                v184.x = 563;
+                v184.y = 258;
+                am_40D2B4(&v184, beasts_p);
+                }
+            if ( beasts_e )
+                {
+                v184.x = 16;
+                v184.y = 258;
+                am_40D2B4(&v184, beasts_e);
+                }
+            if ( wall_p )
+                {
+                v184.x = 442;
+                v184.y = 296;
+                am_40D2B4(&v184, wall_p);
+                }
+            if ( wall_e )
+                {
+                v184.x = 180;
+                v184.y = 296;
+                am_40D2B4(&v184, wall_e);
+                }
+            if ( tower_p )
+                {
+                v184.x = 514;
+                v184.y = 296;
+                am_40D2B4(&v184, tower_p);
+                }
+            if ( tower_e )
+                {
+                v184.x = 122;
+                v184.y = 296;
+                am_40D2B4(&v184, tower_e);
+                }
+            if ( dmg_p )
+                {
+                v184.x = 442;
+                v184.y = 296;
+                am_40D2B4(&v184, dmg_p);
+                }
+            if ( buildings_p )
+                {
+                v184.x = 514;
+                v184.y = 296;
+                am_40D2B4(&v184, buildings_p);
+                }
+            if ( dmg_e )
+                {
+                v184.x = 180;
+                v184.y = 296;
+                am_40D2B4(&v184, dmg_e);
+                }
+            if ( buildings_e )
+                {
+                v184.x = 122;
+                v184.y = 296;
+                am_40D2B4(&v184, buildings_e);
+                }
+            }
+        else
+            {
+            if ( quarry_p )
+                {
+                v184.x = 26;
+                v184.y = 92;
+                am_40D2B4(&v184, quarry_p);
+                }
+            if ( quarry_e )
+                {
+                v184.x = 573;
+                v184.y = 92;
+                am_40D2B4(&v184, quarry_e);
+                }
+            if ( magic_p )
+                {
+                v184.x = 26;
+                v184.y = 164;
+                am_40D2B4(&v184, magic_p);
+                }
+            if ( magic_e )
+                {
+                v184.x = 573;
+                v184.y = 164;
+                am_40D2B4(&v184, magic_e);
+                }
+            if ( zoo_p )
+                {
+                v184.x = 26;
+                v184.y = 236;
+                am_40D2B4(&v184, zoo_p);
+                }
+            if ( zoo_e )
+                {
+                v184.x = 573;
+                v184.y = 236;
+                am_40D2B4(&v184, zoo_e);
+                }
+            if ( bricks_p )
+                {
+                v184.x = 16;
+                v184.y = 114;
+                am_40D2B4(&v184, bricks_p);
+                }
+            if ( bricks_e )
+                {
+                v184.x = 563;
+                v184.y = 114;
+                am_40D2B4(&v184, bricks_e);
+                }
+            if ( gems_p )
+                {
+                v184.x = 16;
+                v184.y = 186;
+                am_40D2B4(&v184, gems_p);
+                }
+            if ( gems_e )
+                {
+                v184.x = 563;
+                v184.y = 186;
+                am_40D2B4(&v184, gems_e);
+                }
+            if ( beasts_p )
+                {
+                v184.x = 16;
+                v184.y = 258;
+                am_40D2B4(&v184, beasts_p);
+                }
+            if ( beasts_e )
+                {
+                v184.x = 563;
+                v184.y = 258;
+                am_40D2B4(&v184, beasts_e);
+                }
+            if ( wall_p )
+                {
+                v184.x = 180;
+                v184.y = 296;
+                am_40D2B4(&v184, wall_p);
+                }
+            if ( wall_e )
+                {
+                v184.x = 442;
+                v184.y = 296;
+                am_40D2B4(&v184, wall_e);
+                }
+            if ( tower_p )
+                {
+                v184.x = 122;
+                v184.y = 296;
+                am_40D2B4(&v184, tower_p);
+                }
+            if ( tower_e )
+                {
+                v184.x = 514;
+                v184.y = 296;
+                am_40D2B4(&v184, tower_e);
+                }
+            if ( dmg_p )
+                {
+                v184.x = 180;
+                v184.y = 296;
+                am_40D2B4(&v184, dmg_p);
+                }
+            if ( buildings_p )
+                {
+                v184.x = 122;
+                v184.y = 296;
+                am_40D2B4(&v184, buildings_p);
+                }
+            if ( dmg_e )
+                {
+                v184.x = 442;
+                v184.y = 296;
+                am_40D2B4(&v184, dmg_e);
+                }
+            if ( buildings_e )
+                {
+                v184.x = 514;
+                v184.y = 296;
+                am_40D2B4(&v184, buildings_e);
+                }
+            }
+#undef APPLY_TO_BOTH
+#undef APPLY_TO_ENEMY        
+#undef APPLY_TO_PLAYER
+
 }
 
 
 
 
 //----- (0040D2B4) --------------------------------------------------------
-int am_40D2B4( POINT* a1, int a2 )
+int am_40D2B4( POINT* startXY, int effect_value )
     {
   int v2; // ebp@1
   POINT *v3; // edi@1
@@ -5319,14 +3637,14 @@
  
 
   v11 = 0;
-  v2 = a2;
-  v3 = a1;
-  while ( array_4FABD0[v11].field_0 )
+  v2 = effect_value;
+
+  while ( array_4FABD0[v11].have_effect )
       {
       result = array_4FABD0[v11].field_40->_40E2A7();
       if ( !result )
           {
-          array_4FABD0[v11].field_0 = 0;
+          array_4FABD0[v11].have_effect = 0;
           --v11;
           }
       ++v11;
@@ -5334,20 +3652,20 @@
           return result;
       }
   v6 = v11;
-  array_4FABD0[v11].field_0 = 1;
-  if ( v2 <= 0 )
+  array_4FABD0[v11].have_effect = 1;
+  if ( effect_value <= 0 )
       {
-      array_4FABD0[v6].field_1 = 0;
-      v2 = -v2;
+      array_4FABD0[v6].effect_sign = 0;
+      effect_value = -effect_value;
       }
   else
       {
-      array_4FABD0[v6].field_1 = 1;
+      array_4FABD0[v6].effect_sign = 1;
       }
-  array_4FABD0[v6].field_4.field_0 = v3->x - 20;
-  array_4FABD0[v6].field_4.field_8 = v3->x + 20;
-  array_4FABD0[v6].field_4.field_4 = v3->y - 20;
-  array_4FABD0[v6].field_4.field_C = v3->y + 20;
+  array_4FABD0[v6].field_4.effect_area.left = startXY->x - 20;
+  array_4FABD0[v6].field_4.effect_area.right = startXY->x + 20;
+  array_4FABD0[v6].field_4.effect_area.top = startXY->y - 20;
+  array_4FABD0[v6].field_4.effect_area.bottom = startXY->y + 20;
   array_4FABD0[v6].field_4.field_10 = -60;
   array_4FABD0[v6].field_4.field_14 = 60;
   array_4FABD0[v6].field_4.field_18 = 180;
@@ -5358,17 +3676,17 @@
   array_4FABD0[v6].field_4.field_2Cf = 8.0;
   array_4FABD0[v6].field_4.field_30 = 5;
   array_4FABD0[v6].field_4.field_34 = 15;
-  array_4FABD0[v6].field_4.field_38 = &array_4FABD0[v6].field_44[0];
+  array_4FABD0[v6].field_4.sparks_array = &array_4FABD0[v6].effect_sparks[0];
   v8 = array_4FABD0[v6].field_40;
-  v8->_40E01A(&array_4FABD0[v6].field_4);
-  if ( 10 * v2 > 150 )
-      v2 = 15;
+  v8->StartFill(&array_4FABD0[v6].field_4);
+  if ( 10 * effect_value > 150 )
+      effect_value = 15;
 
   if ( v8->signature != SIG_trpg )
     return 2;
   if ( !v8->field_59 )
     return 3;
-  v8->field_8 = 10 * v2;
+  v8->position_in_sparks_arr = 10 * effect_value;
   v8->field_30 = 0.0;
   v8->field_58 = 0;
   v8->field_44 = 0;
@@ -5376,13 +3694,13 @@
   v8->field_48 = 0;
   v8->field_50 = 0;
   for (int i=0; i<v8->field_4; ++i)
-      v8->field_54[i].field_0=0;
+      v8->field_54[i].have_spark=0;
   return 0;
 }
 
 
 //----- (0040D402) --------------------------------------------------------
-int am_40D402( int player_num, int damage )
+int ApplyDamageToBuildings( int player_num, int damage )
     {
   ArcomagePlayer *v2; // ecx@1
   int v3; // esi@1
@@ -5687,9 +4005,8 @@
   for (int i=0; i<12; ++i)
     am_sounds[i] = pSoundList->LoadSound(v4++, 0);
 
-
   for (int i=0; i<10; ++i)
-     array_4FABD0[i].field_40->Ctor(array_4FABD0[i].field_40);
+     stru272_stru0::Ctor(&array_4FABD0[i].field_40);
   
   current_card_slot_index = -1;
   amuint_4FAA4C = -1;
@@ -5698,7 +4015,7 @@
   byte_4FAA2C = 0;
   byte_505880 = 0;
   dword_4FAA70 = 0;
-  am_byte_4FAA77 = 0;
+  need_to_discard_card = 0;
   SetStartGameData();
   InitalHandsFill();
   //nullsub_1();
@@ -5719,14 +4036,10 @@
 }
 
 
-
-
-
-
 //----- (00409BE8) --------------------------------------------------------
 void SetStartConditions()
 {
-  ArcomageStartConditions *st_cond; // eax@1
+  const ArcomageStartConditions *st_cond; // eax@1
     
   st_cond = &start_conditions[window_SpeakInHouse->par1C - 108];
   start_tower_height = st_cond->tower_height;
@@ -5741,7 +4054,7 @@
   max_tower_height = st_cond->max_tower;
   max_resources_amount = st_cond->max_resources;
 
-  dword_4DF3A4 = st_cond->field_14;
+  opponent_mastery = st_cond->mastery_lvl;
 
   start_bricks_amount = st_cond->bricks_amount;
   start_gems_amount   = st_cond->gems_amount;
@@ -5753,14 +4066,12 @@
 //----- (0040D75D) --------------------------------------------------------
 void pPrimaryWindow_draws_text( int a1, const char *pText, POINT *pXY )
     {
-    int v4; // qax@1
-    v4 = pFontComic->uFontHeight - 3;
-    pPrimaryWindow->DrawText( pFontComic, pXY->x, pXY->y - (v4 >> 1) + 3, 0, pText, 0, 0, 0);
+    pPrimaryWindow->DrawText( pFontComic, pXY->x, pXY->y - ((pFontComic->uFontHeight - 3) >> 1) + 3, 0, pText, 0, 0, 0);
     }
 
 
 //----- (0040DB27) --------------------------------------------------------
-void __fastcall DrawRect(RECT *pXYZW, unsigned __int16 uColor, char bSolidFill)
+void DrawRect( RECT *pXYZW, unsigned __int16 uColor, char bSolidFill )
     {
     RECT *v3; // esi@1
 
@@ -5782,6 +4093,23 @@
     pRenderer->EndScene();
     }
 
+void SetPixel2sq( POINT *pTargetXY, unsigned __int16 uColor )
+    {
+    pRenderer->BeginScene();
+    if ( pRenderer->uNumSceneBegins )
+        {
+        int xVal = pTargetXY->x;
+        int yVal = pTargetXY->y;
+        if ( xVal >= 0 && xVal <= 639 && yVal >= 0 && yVal <= 479)
+            {
+            pRenderer->pTargetSurface[xVal + pRenderer->uTargetSurfacePitch * yVal] = uColor;
+            pRenderer->pTargetSurface[xVal+1 + pRenderer->uTargetSurfacePitch * yVal] = uColor;
+            pRenderer->pTargetSurface[xVal + pRenderer->uTargetSurfacePitch * (yVal+1)] = uColor;
+            pRenderer->pTargetSurface[xVal+1 + pRenderer->uTargetSurfacePitch * (yVal+1)] = uColor;
+            }
+        pRenderer->EndScene();
+        }
+    }
 
 //----- (0040DBD3) --------------------------------------------------------
 void SetPixel( POINT *pTargetXY, unsigned __int16 uColor )
@@ -5801,9 +4129,9 @@
 
 
 //----- (0040DDB1) --------------------------------------------------------
-int __fastcall rand_interval(int a, int b)
+int rand_interval( int min, int max )
     {
-    return a + rand() % (b - a + 1);
+    return min + rand() % (max - min + 1);
     }