changeset 1292:24bc24b64ec2

Слияние
author Ritor1
date Fri, 14 Jun 2013 16:06:30 +0600
parents 1577d75db258 (current diff) 33e360a9b4bf (diff)
children 557c0c3cc314
files Events.cpp Indoor.cpp Indoor_stuff.h UIHouses.cpp UITransition.cpp mm7_1.cpp mm7_3.cpp mm7_4.cpp
diffstat 64 files changed, 1479 insertions(+), 2716 deletions(-) [+]
line wrap: on
line diff
--- a/Actor.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Actor.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -5,7 +5,7 @@
 #include <assert.h>
 
 
-#include "VideoPlayer.h"
+#include "mm7_data.h"
 #include "DecalBuilder.h"
 
 #include "Sprites.h"
--- a/Allocator.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Allocator.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -4,7 +4,6 @@
 
 #include <string.h>
 #include <stdio.h>
-#include "OSAPI.h"
 
 #include "Allocator.h"
 
--- a/Arcomage.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Arcomage.cpp	Fri Jun 14 16:06:30 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,39 +20,39 @@
 #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  ApplyDamageToBuildings(int player_num, int damage); // weak
 void GameResultsApply();
@@ -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 hand_full; // weak
+char need_to_discard_card; // weak
 
 signed int current_card_slot_index; 
 int played_card_id; // idb 4FABC0
@@ -182,6 +194,24 @@
 
 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()
@@ -189,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;
 }
 
@@ -213,7 +243,7 @@
     v2 = (stru272_stru0 *)malloc(0x5Cu);
     *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;
@@ -235,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;
@@ -254,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;
@@ -270,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;
@@ -287,7 +317,7 @@
     }
 
 //----- (0040E133) --------------------------------------------------------
-int stru272_stru0::_40E133()
+int stru272_stru0::DrawEffect()
     {
 
     stru272_stru0 *v1; // edi@1
@@ -315,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 )
@@ -331,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:
@@ -366,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;
@@ -390,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;
@@ -428,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();
@@ -758,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;
 
 
 
@@ -1569,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;
-        hand_full = 1;
+        need_to_discard_card = 1;
         if ( pArcomageGame->field_F4 )
           goto LABEL_8;
       }
-      hand_full = 0;
+      need_to_discard_card = 0;
     }
     pArcomageGame->GameOver = IsGameOver();
     if ( !pArcomageGame->GameOver )
-      am_40A383();
+      TurnChange();
     if ( pArcomageGame->field_F4 )
       pArcomageGame->GameOver = 1;
   }
@@ -1658,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)
@@ -1709,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);
@@ -1726,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;
                 }
             }
@@ -1741,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;
@@ -1802,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;
   }
@@ -1831,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
@@ -1863,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;
@@ -1888,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;
@@ -1948,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
@@ -1961,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;
@@ -1985,7 +1649,7 @@
     
     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 )
     {
@@ -1994,7 +1658,7 @@
         {
           pAudioPlayer->StopChannels(-1, -1);
           dword_4FAA68 = 0;
-          v16 = 1;
+          break_loop = true;
           pArcomageGame->field_F4 = 1;
         }
         break;
@@ -2004,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 )
@@ -2028,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 )
           {
@@ -2043,36 +1708,36 @@
           }
           else
           {
-            v16 = 1;
+            break_loop = true;
           }
           byte_4FAA2E = 0;
-          v13 = 20;
+          animation_stage = 20;
         }
       }
     }
     else
     {
-      if ( hand_full )
+      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;
-            hand_full = 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;
-            hand_full = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
+            need_to_discard_card = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
           }
           byte_4FAA2E = 1;
         }
@@ -2090,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 )
@@ -2135,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;
     }
@@ -2155,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);
@@ -2181,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);
                      }
                  }
             }
@@ -2243,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;
 
@@ -2258,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;
@@ -2271,8 +1923,8 @@
 
   //tower height rectangle
   pSrcRect.left   = 234;
+  pSrcRect.top    = 166;
   pSrcRect.right  = 283;
-  pSrcRect.top    = 166;
   pSrcRect.bottom = 190;
   pTargetXY.x = 100;
   pTargetXY.y = 296;
@@ -2283,9 +1935,9 @@
   Blt_Chroma(&pSrcRect, &pTargetXY, pArcomageGame->field_54, 2);
 
   //wall height rectangle
-  pSrcRect.left   = 192;
+  pSrcRect.left   = 192; 
+  pSrcRect.top    = 166;
   pSrcRect.right  = 234;
-  pSrcRect.top    = 166;
   pSrcRect.bottom = 190;
   pTargetXY.x = 168;
   pTargetXY.y = 296;
@@ -2304,7 +1956,7 @@
   char text_buff[32]; // [sp+Ch] [bp-28h]@2
   POINT text_position; // [sp+2Ch] [bp-8h]@2
 
-  if ( hand_full )
+  if ( need_to_discard_card )
   {
     strcpy(text_buff, pGlobalTXT_LocalizationStrings[266]);// DISCARD A CARD
     text_position.x = 320 - pArcomageGame->pfntArrus->GetLineWidth(text_buff) / 2;
@@ -2346,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;
@@ -2354,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;
@@ -2363,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;
@@ -2372,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;
@@ -2381,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;
@@ -2390,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;
@@ -2708,8 +2360,8 @@
     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 )
@@ -2743,8 +2395,8 @@
 LABEL_15:
     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;
     }
@@ -2853,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
             {
@@ -2966,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);
@@ -3140,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;
@@ -3157,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;
@@ -3193,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
@@ -3225,13 +2867,13 @@
     }
   }
 
-  if ( pCards[am_Players[player_num].cards_at_hand[i]].attack_or_defence) 
+  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 )
@@ -3245,21 +2887,15 @@
     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;
-    hand_full = 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 )
@@ -3268,25 +2904,25 @@
   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;
@@ -3294,28 +2930,29 @@
     }
   }
 
-  if (CanCardBePlayed(player_num, v6) )
+  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;
@@ -3471,76 +3108,87 @@
             v5 = player->quarry_level;
             v7 = __OFSUB__(v5, enemy->quarry_level);
             v6 = v5 - enemy->quarry_level < 0;
-            goto LABEL_18;
+            v18 = v6 ^ v7;
+            goto LABEL_25;
         case 3:
             v8 = player->magic_level;
             v7 = __OFSUB__(v8, enemy->magic_level);
             v6 = v8 - enemy->magic_level < 0;
-            goto LABEL_18;
+            v18 = v6 ^ v7;
+            goto LABEL_25;
         case 4:
             v9 = player->zoo_level;
             v7 = __OFSUB__(v9, enemy->zoo_level);
             v6 = v9 - enemy->zoo_level < 0;
-            goto LABEL_18;
+            v18 = v6 ^ v7;
+            goto LABEL_25;
         case 5:
             v10 = player->quarry_level == enemy->quarry_level;
-            goto LABEL_21;
+            v18 = v10;
+            goto LABEL_25;
         case 6:
             v10 = player->magic_level == enemy->magic_level;
-            goto LABEL_21;
+            v18 = v10;
+            goto LABEL_25;
         case 7:
             v10 = player->zoo_level == enemy->zoo_level;
-            goto LABEL_21;
+            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;
-            goto LABEL_24;
+            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;
-            goto LABEL_24;
+            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;
-            goto LABEL_24;
+            v18 = !((v13 ^ v14) | v12);
+            goto LABEL_25;
         case 11:
             v10 = player->wall_height == 0;
-            goto LABEL_21;
+            v18 = v10;
+            goto LABEL_25;
         case 12:
             v17 = player->wall_height == 0;
-            goto LABEL_15;
+            v18 = !v17;
+            goto LABEL_25;
         case 13:
             v10 = enemy->wall_height == 0;
-            goto LABEL_21;
+            v18 = v10;
+            goto LABEL_25;
         case 14:
             v17 = enemy->wall_height == 0;
-LABEL_15:
             v18 = !v17;
             goto LABEL_25;
         case 15:
             v19 = player->wall_height;
             v7 = __OFSUB__(v19, enemy->wall_height);
             v6 = v19 - enemy->wall_height < 0;
-            goto LABEL_18;
+            v18 = v6 ^ v7;
+            goto LABEL_25;
         case 16:
             v20 = player->tower_height;
             v7 = __OFSUB__(v20, enemy->tower_height);
             v6 = v20 - enemy->tower_height < 0;
-LABEL_18:
             v18 = v6 ^ v7;
             goto LABEL_25;
         case 17:
             v10 = player->wall_height == enemy->wall_height;
-            goto LABEL_21;
+            v18 = v10;
+            goto LABEL_25;
         case 18:
             v10 = player->tower_height == enemy->tower_height;
-LABEL_21:
             v18 = v10;
             goto LABEL_25;
         case 19:
@@ -3548,13 +3196,13 @@
             v14 = __OFSUB__(v21, enemy->wall_height);
             v12 = v21 == enemy->wall_height;
             v13 = v21 - enemy->wall_height < 0;
-            goto LABEL_24;
+            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;
-LABEL_24:
             v18 = !((v13 ^ v14) | v12);
 LABEL_25:
             if ( v18 )
@@ -3562,7 +3210,7 @@
             goto LABEL_231;
         default:
 LABEL_26:
-            v23 = pCard->can_draw_extra_card;
+            v23 = pCard->draw_extra_card_count;
             v24 = 0;
             dword_4FAA68 = v23 + (pCard->field_30 == 1);
             dword_4FAA64 = v23;
@@ -3573,10 +3221,10 @@
                     GetNextCardFromDeck(player_num);
                     ++v24;
                     }
-                    while ( v24 < pCard->can_draw_extra_card );
+                    while ( v24 < pCard->draw_extra_card_count );
                 }
 
-            hand_full = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
+            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);
@@ -3639,7 +3287,7 @@
                     while ( v104 < pCard->can_draw_extra_card2 );
                 }
 
-            hand_full = GetPlayerHandCardCount(player_num) > minimum_cards_at_hand;
+            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);
@@ -3978,7 +3626,7 @@
 
 
 //----- (0040D2B4) --------------------------------------------------------
-int am_40D2B4( POINT* a1, int a2 )
+int am_40D2B4( POINT* startXY, int effect_value )
     {
   int v2; // ebp@1
   POINT *v3; // edi@1
@@ -3989,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;
@@ -4004,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;
@@ -4028,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;
@@ -4046,7 +3694,7 @@
   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;
 }
 
@@ -4357,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;
@@ -4368,7 +4015,7 @@
   byte_4FAA2C = 0;
   byte_505880 = 0;
   dword_4FAA70 = 0;
-  hand_full = 0;
+  need_to_discard_card = 0;
   SetStartGameData();
   InitalHandsFill();
   //nullsub_1();
@@ -4389,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;
@@ -4411,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;
@@ -4423,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
 
@@ -4452,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 )
@@ -4471,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);
     }
 
 
--- a/Arcomage.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Arcomage.h	Fri Jun 14 16:06:30 2013 +0600
@@ -3,13 +3,6 @@
 
 #include "Texture.h"
 
-#pragma pack(push, 1)
-struct am_st1
-{
-  int field_0;
-  int field_4;
-};
-#pragma pack(pop)
 
 /*  401 */
 #pragma pack(push, 1)
@@ -38,10 +31,10 @@
   char needed_bricks;
   char needed_gems;
   char needed_beasts;
-  char attack_or_defence;
+  char can_be_discarded;
   int  compare_param;
   char field_30;
-  char can_draw_extra_card;
+  char draw_extra_card_count;
   char to_player_quarry_lvl;
   char to_player_magic_lvl;
   char to_player_zoo_lvl;
@@ -120,7 +113,7 @@
   int resource_gems;
   int resource_beasts;
   int cards_at_hand[10];
-  am_st1 arr_6C[10];
+  POINT card_shift[10];
 };
 #pragma pack(pop)
 
@@ -172,8 +165,7 @@
   struct GUIFont *pfntComic;//ptr_48;
   struct GUIFont *pfntArrus;//ptr_4C;
   int field_50;
-  __int16 field_54;
-  __int16 field_56;
+  int field_54;
   RGBTexture pGameBackground;
   RGBTexture pSprites;
   int event_timer_time;
@@ -184,8 +176,8 @@
   char field_F4;
   char GameOver;
   char field_F6;
-  char field_F7;
-  char field_F8;
+  char prev_mouse_left;
+  char prev_mouse_right;
   char field_F9;
   char bGameInProgress;
 };
@@ -202,8 +194,8 @@
 #pragma pack(push, 1)
 struct stru272_stru1
 {
-  int field_0;
-  POINT field_4;
+  int have_spark;
+  POINT spark_position;
   int field_C;
   int field_10;
   int field_14;
@@ -215,10 +207,11 @@
 #pragma pack(push, 1)
 struct stru272_stru2
 {
-  int field_0;
-  int field_4;
-  int field_8;
-  int field_C;
+/*int field_0;
+int field_4;
+int field_8;
+int field_C;*/
+  RECT effect_area;
   int field_10;
   int field_14;
   int field_18;
@@ -229,7 +222,7 @@
   float field_2Cf;
   int field_30;
   int field_34;
-  stru272_stru1* field_38;
+  stru272_stru1* sparks_array;
 };
 #pragma pack(pop)
 
@@ -240,14 +233,14 @@
 {
   static void Ctor(stru272_stru0 **a1);
   int Dtor();
-  int _40E01A(stru272_stru2* a2);
+  int StartFill(stru272_stru2* a2);
   int Empty(char a2, char a3);
-  int _40E133();
+  int DrawEffect();
   int _40E2A7();
 
   int signature;
   int field_4;
-  int field_8;
+  int position_in_sparks_arr;
   int field_C;
   int field_10;
   int field_14;
@@ -289,13 +282,13 @@
 #pragma pack(push, 1)
 struct stru272
 {
-  char field_0;
-  char field_1;
+  char have_effect;
+  char effect_sign;
   char _pad_2;
   char _pad_3;
   stru272_stru2 field_4;
   stru272_stru0 *field_40;
-  stru272_stru1 field_44[150];
+  stru272_stru1 effect_sparks[150];
 };
 #pragma pack(pop)
 
--- a/AudioPlayer.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/AudioPlayer.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -7,6 +7,7 @@
 
 #include "stru11.h"
 
+#include "mm7_data.h"
 #include "VideoPlayer.h"
 #include "AudioPlayer.h"
 #include "Allocator.h"
@@ -54,7 +55,7 @@
 std::array<float, 10> pSoundVolumeLevels = 
 {
   0.0000000f, 0.1099999f, 0.2199999f, 0.3300000f, 0.4399999f,
- 0.5500000f, 0.6600000f, 0.7699999f, 0.8799999f, 0.9900000f
+ 0.5500000f, 0.6600000f, 0.7699999f, 0.8799999f, 0.9700000f     //changed 0.9900000f to 0.9700000f. for some reason it only works for values below this
 };
 
 
@@ -2255,9 +2256,11 @@
             do
             {
               v11 = v14[v10];
-              v10++;
+              v12 = 16 * (v14[v10++] + 47);
               pMixerChannels[v11].uSourceTrackID = 0;
-               pMixerChannels[v11].hSample = NULL;
+              v13 = __OFSUB__(v10, num_same_sound_on_channels);
+              v6 = v10 - num_same_sound_on_channels < 0;
+              *(unsigned int *)((char *)&bEAXSupported + v12) = 0;
             }
             while (v10<num_same_sound_on_channels);
           }
--- a/BSPModel.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/BSPModel.h	Fri Jun 14 16:06:30 2013 +0600
@@ -34,7 +34,7 @@
   char pModelName2[32];
   int field_40;
   struct BSPVertexBuffer pVertices;
-  unsigned int uNumFaces;
+  int uNumFaces;
   unsigned int uNumConvexFaces;
   struct ODMFace *pFaces;
   unsigned __int16 *pFacesOrdering;
--- a/CShow.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/CShow.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -2,6 +2,7 @@
 
 #include "CShow.h"
 
+#include "mm7_data.h"
 #include "VideoPlayer.h"
 #include "Mouse.h"
 
--- a/Events.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Events.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -5,12 +5,14 @@
 #include <assert.h>
 #include <stdlib.h>
 
+#include "Texture.h"
+#include "mm7_data.h"
 #include "VideoPlayer.h"
 #include "Mouse.h"
 
 #include "MapInfo.h"
 #include "Game.h"
-#include "Outdoor.h"
+#include "Render.h"
 #include "GUIWindow.h"
 #include "GUIProgressBar.h"
 #include "Chest.h"
--- a/GUIButton.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/GUIButton.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -1,7 +1,6 @@
 #include "GUIWindow.h"
 #include "GUIFont.h"
 
-#include "mm7_data.h"
 
 
 
--- a/GUIFont.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/GUIFont.h	Fri Jun 14 16:06:30 2013 +0600
@@ -12,6 +12,8 @@
 #pragma pack(pop)
 
 /*  170 */
+#pragma warning( push )
+#pragma warning( disable : 4200 )
 #pragma pack(push, 1)
 struct GUIFont
 {
@@ -43,8 +45,10 @@
   GUICharMetric pMetrics[256];
   int font_pixels_offset[256];
   unsigned char pFontData[0]; //array of font pixels
+
 };
 #pragma pack(pop)
+#pragma warning( pop )
 
 GUIFont *LoadFont(const char *pFontFile, const char *pFontPalette, ...);
 char * FitTextInAWindow(const char *pInString, GUIFont *pFont, GUIWindow *pWindow, signed int uX, int a5);
--- a/GUIProgressBar.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/GUIProgressBar.h	Fri Jun 14 16:06:30 2013 +0600
@@ -41,9 +41,9 @@
   RGBTexture field_68;
   RGBTexture field_90;
   RGBTexture field_B8;
-  Texture field_E0;
-  Texture pBardata;
-  Texture pLoadingProgress;
+  struct Texture field_E0;
+  struct Texture pBardata;
+  struct Texture pLoadingProgress;
 };
 #pragma pack(pop)
 
--- a/GUIWindow.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/GUIWindow.h	Fri Jun 14 16:06:30 2013 +0600
@@ -5,6 +5,7 @@
 
 
 
+
 enum UIMessageType: unsigned __int32
 {
   UIMSG_0 = 0,
@@ -324,7 +325,7 @@
   }
 
   GUIButton *CreateButton(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight, int a6, int a7, 
-	                      UIMessageType msg, unsigned int msg_param, unsigned __int8 uHotkey, const char *pName, Texture *pTextures, ...);
+	                      UIMessageType msg, unsigned int msg_param, unsigned __int8 uHotkey, const char *pName, struct Texture *pTextures, ...);
   void DrawFlashingInputCursor(signed int a3, int a4, struct GUIFont *a2);
   int DrawTextInRect(GUIFont *a2, unsigned int uX, unsigned int uY, unsigned int uColor, const char *Str1, int Source, int a8);
   void DrawText(GUIFont *a2, signed int uX, int uY, unsigned int uFontColor, const char *Str, int a7, int a8, unsigned int uFontShadowColor);
--- a/Game.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Game.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -38,6 +38,8 @@
 #include "texts.h"
 #include "GUIFont.h"
 #include "Log.h"
+#include "Lights.h"
+#include "mm7_data.h"
 
 //#include "MM7.h"
 
--- a/Indoor.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Indoor.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -6,7 +6,6 @@
 
 #include "LightmapBuilder.h"
 #include "DecalBuilder.h"
-#include "ParticleEngine.h"
 #include "stru9.h"
 #include "stru10.h"
 #include "stru367.h"
@@ -34,6 +33,7 @@
 #include "PaletteManager.h"
 #include "MapInfo.h"
 #include "IndoorCamera.h"
+#include "Lights.h"
 
 #include "mm7_data.h"
 #include "MM7.h"
--- a/Indoor.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Indoor.h	Fri Jun 14 16:06:30 2013 +0600
@@ -1,6 +1,7 @@
 #pragma once
 #include "VectorTypes.h"
 #include "Weather.h"
+#include "Indoor_stuff.h"
 
 
 
@@ -128,17 +129,6 @@
 
 
 
-/*  291 */
-enum PolygonType : __int8
-{
-  POLYGON_Invalid = 0x0,
-  POLYGON_VerticalWall = 0x1,
-  POLYGON_unk = 0x2,
-  POLYGON_Floor = 0x3,
-  POLYGON_InBetweenFloorAndWall = 0x4,
-  POLYGON_Ceiling = 0x5,
-  POLYGON_InBetweenCeilingAndWall = 0x6,
-};
 
 /*   90 */
 #pragma pack(push, 1)
@@ -576,5 +566,3 @@
 
 
 
-
-#include "Indoor_stuff.h"
\ No newline at end of file
--- a/Indoor_stuff.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Indoor_stuff.h	Fri Jun 14 16:06:30 2013 +0600
@@ -370,6 +370,17 @@
 extern stru337 stru_F81018;
 
 
+/*  291 */
+enum PolygonType : __int8
+{
+  POLYGON_Invalid = 0x0,
+  POLYGON_VerticalWall = 0x1,
+  POLYGON_unk = 0x2,
+  POLYGON_Floor = 0x3,
+  POLYGON_InBetweenFloorAndWall = 0x4,
+  POLYGON_Ceiling = 0x5,
+  POLYGON_InBetweenCeilingAndWall = 0x6,
+};
 
 
 /*  147 */
--- a/Keyboard.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Keyboard.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -2,7 +2,6 @@
 #define _CRT_SECURE_NO_WARNINGS
 #endif
 
-#include "OSAPI.h"
 
 #include "Keyboard.h"
 #include "GUIWindow.h"
--- a/LOD.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/LOD.h	Fri Jun 14 16:06:30 2013 +0600
@@ -150,13 +150,13 @@
   bool LoadIconsOrEvents(const char *pLODFilename);
   void ReleaseAll();
   unsigned int LoadTexture(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT);
-  Texture *LoadTexturePtr(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT);
-  int LoadTextureFromLOD(Texture *pOutTex, const char *pContainer, enum TEXTURE_TYPE eTextureType);
-  int ReloadTexture(Texture *pDst, const char *pContainer, int mode);
+  struct Texture *LoadTexturePtr(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT);
+  int LoadTextureFromLOD(struct Texture *pOutTex, const char *pContainer, enum TEXTURE_TYPE eTextureType);
+  int ReloadTexture(struct Texture *pDst, const char *pContainer, int mode);
   void ReleaseHardwareTextures();
   void ReleaseLostHardwareTextures();
   void _410423_move_textures_to_device();
-  int _410522(Texture *pDst, const char *pContainer, unsigned int uTextureType);
+  int _410522(struct Texture *pDst, const char *pContainer, unsigned int uTextureType);
   void SetupPalettes(unsigned int uTargetRBits, unsigned int uTargetGBits, unsigned int uTargetBBits);
   void ReleaseAll2();
   void _4114F2();
@@ -165,7 +165,7 @@
   void _inlined_sub1();
   void _inlined_sub2();
 
-  inline Texture *GetTexture(int idx)
+  inline struct Texture *GetTexture(int idx)
   {
     assert(idx < 1000);
     if (idx == -1) return nullptr; // we need to return dummy texture here
--- a/LightmapBuilder.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/LightmapBuilder.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -5,6 +5,7 @@
 #include "Log.h"
 
 #include "OutdoorCamera.h"
+#include "Lights.h"
 
 #include "mm7_data.h"
 
--- a/LightmapBuilder.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/LightmapBuilder.h	Fri Jun 14 16:06:30 2013 +0600
@@ -1,8 +1,9 @@
 #pragma once
 #include <vector>
 #include "Render.h"
-#include "Lights.h"
 
+struct LightsStack_StationaryLight_;
+struct LightsStack_MobileLight_;
 
 /*  115 */
 #pragma pack(push, 1)
--- a/LightsStack.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/LightsStack.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -1,7 +1,6 @@
 #include <string>
 #include "Lights.h"
 
-#include "mm7_data.h"
 
 //----- (00467D88) --------------------------------------------------------
 bool LightsStack_MobileLight_::AddLight(__int16 x, __int16 y, __int16 z, __int16 uSectorID, int uRadius, unsigned __int8 r, unsigned __int8 g, unsigned __int8 b, char uLightType)
--- a/Math.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Math.h	Fri Jun 14 16:06:30 2013 +0600
@@ -2,6 +2,9 @@
 #include <cassert>
 #include <limits>
 #include <float.h>
+#include <cmath>
+#include <cstdlib>
+#include <ciso646>
 
 
 /*  186 */
@@ -35,9 +38,6 @@
 #define ROUNDING_EPSILON 0.0000001
 #endif
 
-#include <cmath>
-#include <cstdlib>
-#include <ciso646>
 
 template <typename FloatType>
 int bankersRounding(
--- a/Mouse.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Mouse.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -2,10 +2,10 @@
 #define _CRT_SECURE_NO_WARNINGS
 #endif
 
-#include "OSAPI.h"
 
-#include "VideoPlayer.h"
-#include "Vis.h"
+#include "Texture.h"
+#include "mm7_data.h"
+#include "Render.h"
 #include "Mouse.h"
 #include "Items.h"
 #include "Party.h"
--- a/Outdoor.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Outdoor.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -30,6 +30,7 @@
 
 #include "mm7_data.h"
 #include "MM7.h"
+#include "Lights.h"
 
 
 #include "MapInfo.h"
--- a/Outdoor.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Outdoor.h	Fri Jun 14 16:06:30 2013 +0600
@@ -2,8 +2,7 @@
 
 #include "Indoor.h"
 #include "TileFrameTable.h"
-#include "Weather.h"
-#include "BSPModel.h"
+#include "Outdoor_stuff.h"
 
 #define DAY_ATTRIB_FOG  1
 
@@ -193,7 +192,7 @@
   char pSkyTextureName[32];
   char pGroundTileset[32];
   OutdoorLocationTileType pTileTypes[4];    // [3]  road tileset
-  unsigned int uNumBModels;
+  int uNumBModels;
   struct OutdoorLocationTerrain pTerrain;
   void *pCmap;
   BSPModel *pBModels;
@@ -273,5 +272,3 @@
 
 
 
-
-#include "Outdoor_stuff.h"
\ No newline at end of file
--- a/Outdoor_stuff.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Outdoor_stuff.h	Fri Jun 14 16:06:30 2013 +0600
@@ -32,7 +32,7 @@
   __int16 field_32;
   int field_34;
   struct stru149 *ptr_38;
-  Texture *pTexture;
+  struct Texture *pTexture;
   struct Span *prolly_head;
   struct Span *prolly_tail;
   int **ptr_48;
--- a/Party.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Party.h	Fri Jun 14 16:06:30 2013 +0600
@@ -1,7 +1,6 @@
 #pragma once
 #include "Player.h"
 #include "NPC.h"
-#include "Spells.h"
 #include "VectorTypes.h"
 
 
--- a/Player.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Player.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -7,7 +7,6 @@
 #include "stru6.h"
 
 
-#include "OSAPI.h"
 #include "Player.h"
 #include "PlayerFrameTable.h"
 #include "AudioPlayer.h"
@@ -7871,15 +7870,15 @@
 void Player::SetVariable(enum VariableType var_type, signed int var_value)
 {
   signed int currPlayerId; // ebx@1
-  Player *v4; // esi@1
-  unsigned int v5; // edi@1
+  Player *v4_unused; // esi@1
+  unsigned int v5_unused; // edi@1
   unsigned int v6; // esi@13
   unsigned int v7; // esi@14
-  signed int v8; // eax@17
+  signed int v8_unused; // eax@17
   ItemGen *v9; // ecx@17
   int v10; // eax@21
   signed int v11; // eax@30
-  Player *v12; // ecx@44
+  Player *unused12; // ecx@44
   char *v13; // ecx@45
   Player *v14; // ecx@49
   int v15; // ecx@86
@@ -7894,23 +7893,22 @@
   DDM_DLV_Header *v24; // ecx@148
   signed int v25; // eax@172
   int v26; // [sp-8h] [bp-3Ch]@84
-  signed int v27; // [sp-4h] [bp-38h]@4
-  int v28; // [sp-4h] [bp-38h]@84
+  signed int unused27; // [sp-4h] [bp-38h]@4
+  int v28_unused; // [sp-4h] [bp-38h]@84
   ItemGen item; // [sp+Ch] [bp-28h]@52
-  char v30; // [sp+32h] [bp-2h]@1
-  char v31; // [sp+33h] [bp-1h]@1
-
-  currPlayerId = 0;
-  v30 = 0;
-  v31 = 0;
-  v4 = this;
-  v5 = 0;
-  if ( this == pPlayers[2] )
-    currPlayerId = 1;
-  else if ( this == pPlayers[3] )
-    currPlayerId = 2;
-  else if ( this == pPlayers[4] )
-     currPlayerId  = 3;
+  char v30_unused; // [sp+32h] [bp-2h]@1
+  char v31_unused; // [sp+33h] [bp-1h]@1
+  
+  currPlayerId = -1;
+  for (int i = 1; i <= 4; i++)  //TODO: add a member variable for playerid in the future
+  {
+    if ( this == pPlayers[i] )
+    {
+      currPlayerId = i - 1;
+      break;
+    }
+  }
+  assert(currPlayerId != -1);
   if ( var_type > VAR_AutoNotes )
   {
     if ( var_type <= VAR_GoldInBank )
@@ -7976,50 +7974,36 @@
           return;
         bFlashHistoryBook = 1;
       }
-LABEL_172:
       v25 = 8 * currPlayerId + 400;
       LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112);
-      pAudioPlayer->PlaySound(SOUND_20001, v25, v5, -1, v5, v5, v5, v5);
+      pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0);
       return;
     }
-    if ( var_type != 307 )
-    {
-      switch ( var_type )
-      {
-        case 308:
-          pParty->uNumBountiesCollected = var_value;
-          break;
-        case 309:
-          pParty->uNumPrisonTerms = var_value;
-          break;
-        case 310:
-          pParty->uNumArenaPageWins = var_value;
-          break;
-        case 311:
-          pParty->uNumArenaSquireWins = var_value;
-          break;
-        case 312:
-          pParty->uNumArenaKnightWins = var_value;
-          break;
-        case 313:
-          pParty->uNumArenaLordWins = var_value;
-          break;
-      }
-      return;
-    }
-    pParty->uNumDeaths = var_value;
-LABEL_168:
-    if ( v30 != 1 )
-    {
-LABEL_170:
-      if ( v31 != 1 )
-        return;
-      v5 = 0;
-      goto LABEL_172;
-    }
-LABEL_169:
-    pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId);
-    goto LABEL_170;
+    switch ( var_type )
+    {
+    case VAR_NumDeaths:
+      pParty->uNumDeaths = var_value;
+      break;
+    case VAR_NumBounties:
+      pParty->uNumBountiesCollected = var_value;
+      break;
+    case VAR_PrisonTerms:
+      pParty->uNumPrisonTerms = var_value;
+      break;
+    case VAR_ArenaWinsPage:
+      pParty->uNumArenaPageWins = var_value;
+      break;
+    case VAR_ArenaWinsSquire:
+      pParty->uNumArenaSquireWins = var_value;
+      break;
+    case VAR_ArenaWinsKnight:
+      pParty->uNumArenaKnightWins = var_value;
+      break;
+    case VAR_ArenaWinsLord:
+      pParty->uNumArenaLordWins = var_value;
+      break;
+    }
+    return;
   }
   if ( var_type == VAR_AutoNotes )
   {
@@ -8028,219 +8012,210 @@
 	  && pAutonoteTxt[var_value-1].pText )
     {
       v20 = pPlayers[currPlayerId + 1];
-      v30 = 1;
       v20->PlaySound(SPEECH_96, 0);
 	  v21 = pAutonoteTxt[var_value-1].eType;// dword_72371C[2 * a3];
       bFlashAutonotesBook = 1;
       _506568_autonote_type = v21;
+      DrawPlayerBuffAnimBasedOnCondition(currPlayerId);
     }
     _449B7E_toggle_bit(pParty->_autonote_bits, var_value, 1u);
-    v31 = 1;
-    goto LABEL_168;
-  }
-  if ( var_type <= VAR_ActualMight )
-  {
-    if ( var_type != VAR_ActualMight )
-    {
-      switch ( var_type )
-      {
-        case VAR_RandomGold:
-          v6 = rand() % var_value + 1;
-          Party::SetGold(v6);
-          sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[500], v6);// You have %lu gold
-          ShowStatusBarString(pTmpBuf.data(), 2u);
-          GameUI_DrawFoodAndGold();
-          return;
-        case VAR_RandomFood:
-          v7 = rand() % var_value + 1;
-          Party::SetFood(v7);
-          sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[501], v7);// You have %lu food
-          ShowStatusBarString(pTmpBuf.data(), 2u);
-          GameUI_DrawFoodAndGold();
-          goto LABEL_124;
-        case VAR_Sex:
-          this->uSex = (PLAYER_SEX)var_value;
-          goto LABEL_124;
-        case VAR_Class:
-          this->classType = (PLAYER_CLASS_TYPE)var_value;
-          if ( (char)var_value != 35 )
-            goto LABEL_124;
-          v8 = 0;
-          v9 = this->pInventoryItems;
-          break;
-        case VAR_CurrentHP:
-          this->sHealth = var_value;
-          goto LABEL_124;
-        case VAR_MaxHP:
-          this->sHealth = GetMaxHealth();
-          return;
-        case VAR_CurrentSP:
-          this->sMana = var_value;
-          goto LABEL_124;
-        case VAR_MaxSP:
-          this->sMana = GetMaxMana();
-          return;
-        case VAR_ACModifier:
-          this->sACModifier = (unsigned __int8)var_value;
-          goto LABEL_124;
-        case VAR_BaseLevel:
-          this->uLevel = (unsigned __int8)var_value;
-          goto LABEL_124;
-        case VAR_LevelModifier:
-          this->sLevelModifier = (unsigned __int8)var_value;
-          goto LABEL_124;
-        case VAR_Age:
-          this->sAgeModifier = var_value;
-          return;
-        case VAR_Award:
-          if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & 
-			  pPlayers[currPlayerId + 1]->_guilds_member_bits[((signed __int16)var_value - 1)/ 8])
-            //&& dword_723E80_award_related[2 * a3] )
-			&& pAwards[var_value].pText )
+    PlaySoundBasedOnCondition(currPlayerId);
+    return;
+  }
+  if ( var_type <= VAR_BaseLuck )
+  {
+    switch ( var_type )
+    {
+      case VAR_Sex:
+        this->uSex = (PLAYER_SEX)var_value;
+        goto LABEL_124;
+      case VAR_Class:
+        this->classType = (PLAYER_CLASS_TYPE)var_value;
+        if ( (char)var_value == PLAYER_CLASS_LICH )
+        {
+          v9 = NULL;
+          for (int i = 0; i < 138; i++)
+          {
+            v9 = &this->pInventoryItems[i];
+            if (v9->uItemID == 615)
+              break;
+          }
+          if (v9 != NULL || v9->uItemID != 615)
           {
-            v30 = 1;
-            v31 = 1;
-            pPlayers[currPlayerId + 1]->PlaySound(SPEECH_96, 0);
+            v10 = (int)((char *)this + 36 * 138);   //originally 36 * v8. the code got to this condition only if v8 was equal to 138
+            *(int *)(v10 + 532) = 601;
+            *(char *)(v10 + 558) = currPlayerId + 1;
           }
-		  _449B7E_toggle_bit((unsigned char *)v4->_guilds_member_bits, var_value, 1u);
-          goto LABEL_168;
-        case VAR_Experience:
-          this->uExperience = var_value;
-          goto LABEL_124;
-        case VAR_QBits_QuestsDone:
-          if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & pParty->_quest_bits[((signed __int16)var_value - 1) >> 3])
-           // && (&dword_722F10)[4 * a3] )
-		   && pQuestTable[var_value-1] )
+          if ( this->sResFireBase < 20 )
+            this->sResFireBase = 20;
+          if ( this->sResAirBase < 20 )
+            this->sResAirBase = 20;
+          if ( this->sResWaterBase < 20 )
+            this->sResWaterBase = 20;
+          if ( this->sResEarthBase < 20 )
+            this->sResEarthBase = 20;
+          this->sResMindBase = 200;
+          this->sResBodyBase = 200;
+          v11 = this->GetSexByVoice();
+          this->uPrevVoiceID = this->uVoiceID;
+          this->uPrevFace = this->uCurrentFace;
+          if ( v11 )
           {
-            v14 = pPlayers[currPlayerId + 1];
-            bFlashQuestBook = 1;
-            v30 = 1;
-            v31 = 1;
-            v14->PlaySound(SPEECH_93, 0);
+            this->uCurrentFace = 21;
+            this->uVoiceID = 21;
+          }
+          else
+          {
+            this->uCurrentFace = 20;
+            this->uVoiceID = 20;
           }
-          v13 = (char *)pParty->_quest_bits;
-LABEL_51:
-          _449B7E_toggle_bit((unsigned char *)v13, var_value, 1u);
-		  if (( v30 != 1 )&&( v31 != 1 ))
-				  return;
-		  else
-			  pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId);
-		  if ( v31 != 1 )
-			  return;
-		  v25 = 8 * currPlayerId + 400;
-		  LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112);
-		  pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0);
-		  return;
-        case VAR_PlayerItemInHands:
-          item.Reset();
-          item.Reset();
-          item.uItemID = var_value;
-          item.uAttributes = 1;
-          pParty->SetHoldingItem(&item);
-          if ( var_value >= ITEM_ARTIFACT_PUCK && var_value <= ITEM_RELIC_MEKORIGS_HAMMER )
-            pParty->pIsArtifactFound[var_value-500] = 1;
-          return;
-        case VAR_FixedGold:
-          Party::SetGold(var_value);
-          return;
-        case VAR_BaseMight:
-          this->uMight = (unsigned __int8)var_value;
-          goto LABEL_84;
-        case VAR_BaseIntellect:
-          this->uIntelligence = (unsigned __int8)var_value;
-          goto LABEL_84;
-        case VAR_BasePersonality:
-          this->uWillpower = (unsigned __int8)var_value;
-          goto LABEL_84;
-        case VAR_BaseEndurance:
-          this->uEndurance = (unsigned __int8)var_value;
-          goto LABEL_84;
-        case VAR_BaseSpeed:
-          this->uSpeed = (unsigned __int8)var_value;
-          goto LABEL_84;
-        case VAR_BaseAccuracy:
-          this->uAccuracy = (unsigned __int8)var_value;
-          goto LABEL_84;
-        case VAR_BaseLuck:
-          this->uLuck = (unsigned __int8)var_value;
-          goto LABEL_84;
-        case VAR_FixedFood:
-          Party::SetFood(var_value);
-          goto LABEL_124;
-        case VAR_MightBonus:
-          goto LABEL_64;
-        case VAR_IntellectBonus:
-          goto LABEL_68;
-        case VAR_PersonalityBonus:
-          goto LABEL_69;
-        case VAR_EnduranceBonus:
-          goto LABEL_70;
-        case VAR_SpeedBonus:
-          goto LABEL_71;
-        case VAR_AccuracyBonus:
-          goto LABEL_72;
-        case VAR_LuckBonus:
-          goto LABEL_73;
-        default:
-          return;
-      }
-      while ( v9->uItemID != 615 )
-      {
-        ++v8;
-        ++v9;
-        if ( v8 >= 138 )
-          goto LABEL_22;
-      }
-      v10 = (int)((char *)v4 + 36 * v8);
-      *(int *)(v10 + 532) = 601;
-      *(char *)(v10 + 558) = currPlayerId + 1;
-LABEL_22:
-      if ( v4->sResFireBase < 20 )
-        v4->sResFireBase = 20;
-      if ( v4->sResAirBase < 20 )
-        v4->sResAirBase = 20;
-      if ( v4->sResWaterBase < 20 )
-        v4->sResWaterBase = 20;
-      if ( v4->sResEarthBase < 20 )
-        v4->sResEarthBase = 20;
-      v4->sResMindBase = 200;
-      v4->sResBodyBase = 200;
-      v11 = v4->GetSexByVoice();
-      v4->uPrevVoiceID = v4->uVoiceID;
-      v4->uPrevFace = v4->uCurrentFace;
-      if ( v11 )
-      {
-        v4->uCurrentFace = 21;
-        v4->uVoiceID = 21;
-      }
-      else
-      {
-        v4->uCurrentFace = 20;
-        v4->uVoiceID = 20;
-      }
-      ReloadPlayerPortraits(currPlayerId, v4->uCurrentFace);
-      goto LABEL_124;
-    }
-LABEL_64:
-    this->uMightBonus = (unsigned __int8)var_value;
+          ReloadPlayerPortraits(currPlayerId, this->uCurrentFace);
+        }
+        goto LABEL_124;
+      case VAR_CurrentHP:
+        this->sHealth = var_value;
+        goto LABEL_124;
+      case VAR_MaxHP:
+        this->sHealth = GetMaxHealth();
+        return;
+      case VAR_CurrentSP:
+        this->sMana = var_value;
+        goto LABEL_124;
+      case VAR_MaxSP:
+        this->sMana = GetMaxMana();
+        return;
+      case VAR_ACModifier:
+        this->sACModifier = (unsigned __int8)var_value;
+        goto LABEL_124;
+      case VAR_BaseLevel:
+        this->uLevel = (unsigned __int8)var_value;
+        goto LABEL_124;
+      case VAR_LevelModifier:
+        this->sLevelModifier = (unsigned __int8)var_value;
+        goto LABEL_124;
+      case VAR_Age:
+        this->sAgeModifier = var_value;
+        return;
+      case VAR_Award:
+        if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & 
+			  pPlayers[currPlayerId + 1]->_guilds_member_bits[((signed __int16)var_value - 1)/ 8])
+              //&& dword_723E80_award_related[2 * a3] )
+		    && pAwards[var_value].pText )
+        {
+          pPlayers[currPlayerId + 1]->PlaySound(SPEECH_96, 0);
+          DrawPlayerBuffAnimBasedOnCondition(currPlayerId);
+          PlaySoundBasedOnCondition(currPlayerId);
+        }
+        _449B7E_toggle_bit((unsigned char *)this->_guilds_member_bits, var_value, 1u);
+        return;
+      case VAR_Experience:
+        this->uExperience = var_value;
+        goto LABEL_124;
+      case VAR_QBits_QuestsDone:
+        if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & pParty->_quest_bits[((signed __int16)var_value - 1) >> 3])
+          // && (&dword_722F10)[4 * a3] )
+		    && pQuestTable[var_value-1] )
+          {
+          v14 = pPlayers[currPlayerId + 1];
+          bFlashQuestBook = 1;
+          v14->PlaySound(SPEECH_93, 0);
+          DrawPlayerBuffAnimBasedOnCondition(currPlayerId);
+          PlaySoundBasedOnCondition(currPlayerId);
+        }
+        v13 = (char *)pParty->_quest_bits;
+        _449B7E_toggle_bit((unsigned char *)v13, var_value, 1u);
+        return;
+      case VAR_PlayerItemInHands:
+        item.Reset();
+        item.Reset();
+        item.uItemID = var_value;
+        item.uAttributes = 1;
+        pParty->SetHoldingItem(&item);
+        if ( var_value >= ITEM_ARTIFACT_PUCK && var_value <= ITEM_RELIC_MEKORIGS_HAMMER )
+          pParty->pIsArtifactFound[var_value-500] = 1;
+        return;
+      case VAR_FixedGold:
+        Party::SetGold(var_value);
+        return;
+      case VAR_RandomGold:
+        v6 = rand() % var_value + 1;
+        Party::SetGold(v6);
+        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[500], v6);// You have %lu gold
+        ShowStatusBarString(pTmpBuf.data(), 2u);
+        GameUI_DrawFoodAndGold();
+        return;
+      case VAR_FixedFood:
+        Party::SetFood(var_value);
+        goto LABEL_124;
+      case VAR_RandomFood:
+        v7 = rand() % var_value + 1;
+        Party::SetFood(v7);
+        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[501], v7);// You have %lu food
+        ShowStatusBarString(pTmpBuf.data(), 2u);
+        GameUI_DrawFoodAndGold();
+        goto LABEL_124;
+      case VAR_MightBonus:
+        goto LABEL_64;
+      case VAR_IntellectBonus:
+        goto LABEL_68;
+      case VAR_PersonalityBonus:
+        goto LABEL_69;
+      case VAR_EnduranceBonus:
+        goto LABEL_70;
+      case VAR_SpeedBonus:
+        goto LABEL_71;
+      case VAR_AccuracyBonus:
+        goto LABEL_72;
+      case VAR_LuckBonus:
+        goto LABEL_73;
+      case VAR_BaseMight:
+        this->uMight = (unsigned __int8)var_value;
+        v26 = 92;
+        goto LABEL_112;
+      case VAR_BaseIntellect:
+        this->uIntelligence = (unsigned __int8)var_value;
+        v26 = 92;
+        goto LABEL_112;
+      case VAR_BasePersonality:
+        this->uWillpower = (unsigned __int8)var_value;
+        v26 = 92;
+        goto LABEL_112;
+      case VAR_BaseEndurance:
+        this->uEndurance = (unsigned __int8)var_value;
+        v26 = 92;
+        goto LABEL_112;
+      case VAR_BaseSpeed:
+        this->uSpeed = (unsigned __int8)var_value;
+        v26 = 92;
+        goto LABEL_112;
+      case VAR_BaseAccuracy:
+        this->uAccuracy = (unsigned __int8)var_value;
+        v26 = 92;
+        goto LABEL_112;
+      case VAR_BaseLuck:
+        this->uLuck = (unsigned __int8)var_value;
+        v26 = 92;
+        goto LABEL_112;
+      default:
+        return;
+    }
 LABEL_111:
-    v28 = 0;
     v26 = SPEECH_91;
 LABEL_112:
     v19 = pPlayers[currPlayerId + 1];
-    v31 = 1;
-    v19->PlaySound((PlayerSpeech)v26, v28);
-    goto LABEL_169;
-  }
-  if ( var_type <= VAR_FireResistanceBonus )
-  {
-    if ( var_type == VAR_FireResistanceBonus )
-    {
-      this->sResFireBonus = (unsigned __int8)var_value;
-      goto LABEL_111;
-    }
+    v19->PlaySound((PlayerSpeech)v26, 0);
+    DrawPlayerBuffAnimBasedOnCondition(currPlayerId);
+    PlaySoundBasedOnCondition(currPlayerId);
+    return;
+  }
+  if ( var_type <= VAR_MagicResistance )
+  {
     switch ( var_type )
     {
+      case VAR_ActualMight:
+LABEL_64:
+        this->uMightBonus = (unsigned __int8)var_value;
+        goto LABEL_111;
       case VAR_ActualIntellect:
 LABEL_68:
         this->uIntelligenceBonus = (unsigned __int8)var_value;
@@ -8267,35 +8242,42 @@
         goto LABEL_111;
       case VAR_FireResistance:
         this->sResFireBase = (unsigned __int8)var_value;
-        goto LABEL_84;
+        v26 = 92;
+        goto LABEL_112;
       case VAR_AirResistance:
         this->sResAirBase = (unsigned __int8)var_value;
-        goto LABEL_84;
+        v26 = 92;
+        goto LABEL_112;
       case VAR_WaterResistance:
         this->sResWaterBase = (unsigned __int8)var_value;
-        goto LABEL_84;
+        v26 = 92;
+        goto LABEL_112;
       case VAR_EarthResistance:
         this->sResEarthBase = (unsigned __int8)var_value;
-        goto LABEL_84;
+        v26 = 92;
+        goto LABEL_112;
       case VAR_SpiritResistance:
         this->sResSpiritBase = (unsigned __int8)var_value;
-        goto LABEL_84;
+        v26 = 92;
+        goto LABEL_112;
       case VAR_MindResistance:
         this->sResMindBase = (unsigned __int8)var_value;
-        goto LABEL_84;
+        v26 = 92;
+        goto LABEL_112;
       case VAR_BodyResistance:
         this->sResBodyBase = (unsigned __int8)var_value;
-        goto LABEL_84;
+        v26 = 92;
+        goto LABEL_112;
       case VAR_LightResistance:
         this->sResLightBase = (unsigned __int8)var_value;
-        goto LABEL_84;
+        v26 = 92;
+        goto LABEL_112;
       case VAR_DarkResistance:
         this->sResDarkBase = (unsigned __int8)var_value;
-        goto LABEL_84;
+        v26 = 92;
+        goto LABEL_112;
       case VAR_MagicResistance:
         this->sResMagicBase = (unsigned __int8)var_value;
-LABEL_84:
-        v28 = 0;
         v26 = 92;
         goto LABEL_112;
       default:
@@ -8312,7 +8294,7 @@
         return;
       if ( var_type <= VAR_Eradicated )
       {
-        v4->SetCondition(var_type - 105, 1);
+        this->SetCondition(var_type - 105, 1);
       }
       else
       {
@@ -8322,94 +8304,94 @@
             byte_5E4C15[var_type] = var_value;
           return;
         }
-        memset(v4, 0, 0xA0u);
+        memset(this, 0, 0xA0u);
       }
-LABEL_124:
-      v31 = 1;
-      goto LABEL_169;
-    }
-LABEL_106:
-    v16 = (int)((char *)&v4->pConditions[16] + 2 * var_type);
-    v17 = *(char *)v16;
-    if ( var_value <= VAR_BodyResistanceBonus )
-    {
-      LOWORD(v15) = (unsigned __int8)var_value;
-      v18 = v15 | v17 & VAR_BodyResistanceBonus;
     }
     else
     {
-      LOWORD(v18) = (unsigned __int8)(var_value | v17 & 0xC0);
-    }
-    *(short *)v16 = v18;
-    goto LABEL_124;
-  }
-  if ( var_type == VAR_DisarmTrapSkill )
-	  if ( v30 != 1 )
-		  {
-		  if ( v31 != 1 )
-			  return;
-		  v5 = 0;
-		  goto LABEL_172;
-		  }
-	  pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId);
-	  goto LABEL_170;
-  if ( var_type <= VAR_BodyResistanceBonus )
+      v16 = (int)((char *)&this->pConditions[16] + 2 * var_type);
+      v17 = *(char *)v16;
+      if ( var_value <= VAR_BodyResistanceBonus )
+      {
+        LOWORD(v15) = (unsigned __int8)var_value;
+        v18 = v15 | v17 & VAR_BodyResistanceBonus;
+      }
+      else
+      {
+        LOWORD(v18) = (unsigned __int8)(var_value | v17 & 0xC0);
+      }
+      *(short *)v16 = v18;
+    }
+LABEL_124:
+    DrawPlayerBuffAnimBasedOnCondition(currPlayerId);
+    PlaySoundBasedOnCondition(currPlayerId);
+    return;
+  }
+  if ( var_type <= VAR_MagicResistanceBonus )
   {
     switch ( var_type )
     {
-      case VAR_BodyResistanceBonus:
-        v4->sResBodyBonus = (unsigned __int8)var_value;
+      case VAR_FireResistanceBonus:
+        this->sResFireBonus = (unsigned __int8)var_value;
         break;
       case VAR_AirResistanceBonus:
-        v4->sResAirBonus = (unsigned __int8)var_value;
+        this->sResAirBonus = (unsigned __int8)var_value;
         break;
       case VAR_WaterResistanceBonus:
-        v4->sResWaterBonus = (unsigned __int8)var_value;
+        this->sResWaterBonus = (unsigned __int8)var_value;
         break;
       case VAR_EarthResistanceBonus:
-        v4->sResEarthBonus = (unsigned __int8)var_value;
+        this->sResEarthBonus = (unsigned __int8)var_value;
         break;
       case VAR_SpiritResistanceBonus:
-        v4->sResSpiritBonus = (unsigned __int8)var_value;
+        this->sResSpiritBonus = (unsigned __int8)var_value;
+        break;
+      case VAR_MindResistanceBonus:
+        this->sResMindBonus = (unsigned __int8)var_value;
+        break;
+      case VAR_BodyResistanceBonus:
+        this->sResBodyBonus = (unsigned __int8)var_value;
+        break;
+      case VAR_LightResistanceBonus:
+        this->sResLightBonus = (unsigned __int8)var_value;
+        break;
+      case VAR_DarkResistanceBonus:
+        this->sResDarkBonus = (unsigned __int8)var_value;
+        break;
+      case VAR_PhysicalResistanceBonus:
+        assert("VAR_PhysicalResistanceBonus variable unsupported" && false);
+        return;
+        break;
+      case VAR_MagicResistanceBonus:
+        this->sResMagicBonus = (unsigned __int8)var_value;
         break;
       default:
-        if ( var_type != 62 )
+          assert("Unexpected var_type" && false);
           return;
-        v4->sResMindBonus = (unsigned __int8)var_value;
         break;
     }
     goto LABEL_111;
   }
-  if ( var_type == VAR_LightResistanceBonus )
-  {
-    v4->sResLightBonus = (unsigned __int8)var_value;
-    goto LABEL_111;
-  }
-  if ( var_type == VAR_DarkResistanceBonus )
-  {
-    v4->sResDarkBonus = (unsigned __int8)var_value;
-    goto LABEL_111;
-  }
-  if ( var_type == VAR_MagicResistanceBonus )
-  {
-    v4->sResMagicBonus = (unsigned __int8)var_value;
-    goto LABEL_111;
-  }
-  if ( var_type > VAR_MagicResistanceBonus && var_type <= VAR_DiplomacySkill )
-	  if ( v30 != 1 )
-		  {
-		  if ( v31 != 1 )
-			  return;
-		  v5 = 0;
-		  v25 = 8 * currPlayerId + 400;
-		  LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112);
-		  pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0);
-		  return;
-		  }
-	  pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId);
-	  goto LABEL_170;
-}
-
+  if ( var_type > VAR_MagicResistanceBonus && var_type <= VAR_DiplomacySkill || var_type == VAR_DisarmTrapSkill)  //VAR_ThieverySkill wasn't present in the original function
+  {
+    return;
+  }
+}
+
+
+//----- (new function) --------------------------------------------------------
+void Player::PlaySoundBasedOnCondition(int currPlayerId)
+{
+  signed int v25 = 8 * currPlayerId + 400;
+  LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112);
+  pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0);
+}
+
+//----- (new function) --------------------------------------------------------
+void Player::DrawPlayerBuffAnimBasedOnCondition(int currPlayerId)
+{
+  pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId);
+}
 
 //----- (0044AFFB) --------------------------------------------------------
 void Player::AddVariable(enum VariableType var_type, signed int val)
--- a/Player.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Player.h	Fri Jun 14 16:06:30 2013 +0600
@@ -590,6 +590,8 @@
   void SalesProcess(unsigned int inventory_idnx, int item_index, int _2devent_idx);//0x4BE2DD
   bool Recover(signed int a2);
   bool CanCastSpell(unsigned int uRequiredMana);
+  void PlaySoundBasedOnCondition(int currPlayerId);
+  void DrawPlayerBuffAnimBasedOnCondition(int currPlayerId);
 
   inline bool Weak()       {return pConditions[Condition_Weak] != 0;}
   inline bool Dead()       {return pConditions[Condition_Dead] != 0;}
@@ -619,7 +621,6 @@
 
 
 
-
   __int64 pConditions[20];
   unsigned __int64 uExperience;
   char pName[16];
--- a/PlayerFrameTable.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/PlayerFrameTable.h	Fri Jun 14 16:06:30 2013 +0600
@@ -1,5 +1,4 @@
 #pragma once
-#include "Player.h"
 
 
 /*   46 */
--- a/Random.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Random.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -1,8 +1,7 @@
 #include <math.h>
 
 #include "Random.h"
-
-#include "mm7_data.h"
+#include "Math.h"
 
 
 
@@ -50,13 +49,11 @@
   double v3; // ST04_8@1
   int floored_random; // ecx@1
 
-  v1 = this;
   v2 = GetRandom() * (double)this->range;
-  v3 = v2 + 6.7553994e15;
-  floored_random = LODWORD(v3);
-  if ( SLODWORD(v3) >= v1->range )
-    floored_random = v1->range;
-  return floored_random + v1->min;
+  floored_random = bankersRounding(v2);
+  if ( floored_random >= this->range )
+    floored_random = this->range;
+  return floored_random + this->min;
 }
 
 //----- (004BE65D) --------------------------------------------------------
--- a/Render.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Render.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -36,6 +36,7 @@
 #include "texts.h"
 #include "mm7_data.h"
 #include "MM7.h"
+#include "Lights.h"
 
 #pragma comment(lib, "lib\\legacy_dx\\lib\\ddraw.lib")
 #pragma comment(lib, "lib\\legacy_dx\\lib\\dxguid.lib")
--- a/Render.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Render.h	Fri Jun 14 16:06:30 2013 +0600
@@ -323,7 +323,7 @@
   void DrawTerrainPolygon(unsigned int uNumVertices, stru148 *a4, IDirect3DTexture2 *a5, bool transparent, bool clampAtTextureBorders);
   void DrawSkyPolygon(unsigned int uNumVertices, stru148 *a3, IDirect3DTexture2 *pTexture);
   void _4A2ED5(signed int a2, stru148 *a3, IDirect3DTexture2 *pHwTex);
-  void DrawIndoorPolygon(unsigned int uNumVertices, struct BLVFace *a3, IDirect3DTexture2 *pHwTex, Texture *pTex, int uPackedID, unsigned int uColor, int a8);
+  void DrawIndoorPolygon(unsigned int uNumVertices, struct BLVFace *a3, IDirect3DTexture2 *pHwTex, struct Texture *pTex, int uPackedID, unsigned int uColor, int a8);
   void MakeParticleBillboardAndPush_BLV(RenderBillboardTransform_local0 *a2, IDirect3DTexture2 *a3, unsigned int uDiffuse, int angle);
   void MakeParticleBillboardAndPush_ODM(RenderBillboardTransform_local0 *a2, IDirect3DTexture2 *a3, unsigned int uDiffuse, int angle);
   void TransformBillboard(RenderBillboardTransform_local0 *a2, Sprite *pSprite, int dimming_level, RenderBillboard *pBillboard);
@@ -340,20 +340,20 @@
   void ResetTextureClipRect();
   void DrawTextureRGB(unsigned int uOutX, unsigned int uOutY, RGBTexture *a4);
   void _4A5D33(unsigned int a2, unsigned int a3, int a4, int a5, RGBTexture *pTexture);
-  void DrawTextureIndexed(unsigned int uX, unsigned int uY, Texture *a4);
-  void ZBuffer_Fill_2(signed int a2, signed int a3, Texture *pTexture, int a5);
-  void DrawMaskToZBuffer(signed int uOutX, unsigned int uOutY, Texture *pTexture, int zVal);
-  void DrawTextureTransparent(unsigned int uX, unsigned int uY, Texture *pTexture);
-  void _4A63E6(unsigned int a2, unsigned int a3, Texture *a4, Texture *a5, int a6, int a7, int a8);
-  void _4A65CC(unsigned int x, unsigned int y, Texture *a4, Texture *a5, int a6, int a7, int a8);
-  void DrawTransparentRedShade(unsigned int a2, unsigned int a3, Texture *a4);
-  void DrawTransparentGreenShade(signed int a2, signed int a3, Texture *pTexture);
-  void _4A6A68(unsigned int a2, unsigned int a3, Texture *a4, __int16 height);
+  void DrawTextureIndexed(unsigned int uX, unsigned int uY, struct Texture *a4);
+  void ZBuffer_Fill_2(signed int a2, signed int a3, struct Texture *pTexture, int a5);
+  void DrawMaskToZBuffer(signed int uOutX, unsigned int uOutY, struct Texture *pTexture, int zVal);
+  void DrawTextureTransparent(unsigned int uX, unsigned int uY, struct Texture *pTexture);
+  void _4A63E6(unsigned int a2, unsigned int a3, struct Texture *a4, struct Texture *a5, int a6, int a7, int a8);
+  void _4A65CC(unsigned int x, unsigned int y, struct Texture *a4, struct Texture *a5, int a6, int a7, int a8);
+  void DrawTransparentRedShade(unsigned int a2, unsigned int a3, struct Texture *a4);
+  void DrawTransparentGreenShade(signed int a2, signed int a3, struct Texture *pTexture);
+  void _4A6A68(unsigned int a2, unsigned int a3, struct Texture *a4, __int16 height);
   void DrawTextPalette(int x, int y, int a4, int a5, unsigned int uFontHeight, unsigned __int16 *pPalette, int a8);
   void DrawText(signed int uOutX, signed int uOutY, unsigned __int8 *pFontPixels, unsigned int uCharWidth, unsigned int uCharHeight, unsigned __int16 *pFontPalette, unsigned __int16 uFaceColor, unsigned __int16 uShadowColor);
   void FillRectFast(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight, unsigned int uColor16);
   int _4A6DF5(unsigned __int16 *pBitmap, unsigned int uBitmapPitch, struct Vec2_int_ *pBitmapXY, unsigned __int16 *pTarget, unsigned int uTargetPitch, Vec4_int_ *a7);
-  void _4A6E7E(unsigned int a2, unsigned int a3, Texture *a4);
+  void _4A6E7E(unsigned int a2, unsigned int a3, struct Texture *a4);
   char DrawBuildingsD3D();
   struct BSPModel *DrawBuildingsSW();
   int OnOutdoorRedrawSW();
--- a/SpriteObject.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/SpriteObject.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -227,7 +227,7 @@
   int v33; // eax@62
   int v34; // ecx@62
   int v35; // eax@63
-  Actor *v36; // ecx@67
+  int v36; // ecx@67
   __int16 v37; // ax@67
   int v38; // eax@72
   int v39; // eax@72
@@ -250,8 +250,8 @@
   int v56; // [sp+94h] [bp-14h]@11
   int v57; // [sp+98h] [bp-10h]@1
   int v58; // [sp+9Ch] [bp-Ch]@1
-  int v59; // [sp+A0h] [bp-8h]@1
-  Actor *v60; // [sp+A4h] [bp-4h]@11
+  int on_water; // [sp+A0h] [bp-8h]@1
+  int v60; // [sp+A4h] [bp-4h]@11
 
   uLayingItemID_ = uLayingItemID;
   v1 = &pSpriteObjects[uLayingItemID];
@@ -262,20 +262,19 @@
   v4 = v1->vPosition.x;
   v5 = v2->uHeight;
   v55 = 0;
-  v6 = ODM_GetFloorLevel(v4, v3, v1->vPosition.z, v5, &v59, &v55, 0);
+  v6 = ODM_GetFloorLevel(v4, v3, v1->vPosition.z, v5, &on_water, &v55, 0);
   v7 = v6;
   v54 = v6;
   v8 = v6 + 1;
   if ( v1->vPosition.z <= v6 + 1 )
   {
-    if ( v59 )
+    if ( on_water )
     {
       v9 = v6 + 60;
       if ( v55 )
         v9 = v7 + 30;
       sub_42F960_create_object(v1->vPosition.x, v1->vPosition.y, v9);
       SpriteObject::OnInteraction(uLayingItemID_);
-      v7 = v54;
     }
   }
   else
@@ -283,7 +282,7 @@
     v58 = 1;
   }
   v10 = v2->uFlags;
-  if ( !(v10 & 0x20) )
+  if ( !(v2->uFlags & OBJECT_DESC_NO_GRAVITY) )
   {
     if ( v58 )
     {
@@ -298,11 +297,11 @@
       ODM_GetTerrainNormalAt(v12, v11, &v51);
       v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
       v56 = abs(v51.y * v1->vVelocity.y + v51.z * v1->vVelocity.z + v51.x * v1->vVelocity.x) >> 16;
-      v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.x) >> 16);
+      v60 = ((unsigned __int64)(v56 * (signed __int64)v51.x) >> 16);
       v1->vVelocity.x += (unsigned int)(v56 * v51.x) >> 16;
-      v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.y) >> 16);
+      v60 = ((unsigned __int64)(v56 * (signed __int64)v51.y) >> 16);
       v1->vVelocity.y += (unsigned int)(v56 * v51.y) >> 16;
-      v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.z) >> 16);
+      v60 = ((unsigned __int64)(v56 * (signed __int64)v51.z) >> 16);
       v1->vVelocity.z += (unsigned int)(v56 * v51.z) >> 16;
 LABEL_12:
       v7 = v54;
@@ -316,75 +315,64 @@
         return;
     }
     v1->vPosition.z = v8;
-    if ( !(v2->uFlags & 0x80) || (v21 = -v1->vVelocity.z >> 1, v1->vVelocity.z = v21, (signed __int16)v21 < 10) )
+    if ( !(v2->uFlags & OBJECT_DESC_BOUNCE) || (v21 = -v1->vVelocity.z >> 1, v1->vVelocity.z = v21, (signed __int16)v21 < 10) )
       v1->vVelocity.z = 0;
-    v60 = (Actor *)v1->vVelocity.x;
-    v55 = 58500;
-    v60 = (Actor *)((unsigned __int64)(58500i64 * (signed int)v60) >> 16);
-    v1->vVelocity.x = (signed __int16)v60;
-    v60 = (Actor *)v1->vVelocity.y;
-    v60 = (Actor *)((unsigned __int64)(v55 * (signed __int64)(signed int)v60) >> 16);
-    v55 = 58500;
-    v1->vVelocity.y = (signed __int16)v60;
-    v60 = (Actor *)v1->vVelocity.z;
-    v60 = (Actor *)((unsigned __int64)(v55 * (signed __int64)(signed int)v60) >> 16);
-    v22 = v1->vVelocity.x;
-    v1->vVelocity.z = (signed __int16)v60;
-    if ( v1->vVelocity.y * v1->vVelocity.y + v22 * v22 >= 400 )
-      goto LABEL_12;
+
+    v1->vVelocity.x = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.x) >> 16);
+    v1->vVelocity.y = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.y) >> 16);
+    v1->vVelocity.z = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.z) >> 16);
+
+    if ( (v1->vVelocity.y * v1->vVelocity.y + v1->vVelocity.x * v1->vVelocity.x) < 400 )
+        {
+
     v1->vVelocity.y = 0;
     v1->vVelocity.x = 0;
-    if ( !(HIBYTE(v2->uFlags) & 1) )
-      return;
     memset(&Dst, 0, 0x68u);
-    v23 = v2->uFlags;
     Dst.x = (double)v1->vPosition.x;
     Dst.y = (double)v1->vPosition.y;
     Dst.z = (double)v1->vPosition.z;
     Dst.flt_10 = 0.0;
     Dst.flt_14 = 0.0;
     Dst.flt_18 = 0.0;
-    if ( HIBYTE(v23) & 2 )
+    if (v2->uFlags & OBJECT_DESC_TRIAL_FIRE )
     {
       Dst.type = ParticleType_Bitmap | ParticleType_Rotating | ParticleType_8;
       Dst.uDiffuse = 0xFF3C1E;
-      v24 = rand();
-      v48 = (TEXTURE_TYPE)0;
-LABEL_83:
-      v47 = "effpar01";
+      Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
+      Dst.uTextureID = pBitmaps_LOD->LoadTexture("effpar01", TEXTURE_DEFAULT);
+      Dst.flt_28 = 1.0;
+      pGame->pParticleEngine->AddParticle(&Dst);
     }
-    else
+    else if ( v2->uFlags & OBJECT_DESC_TRIAL_LINE)
     {
-      if ( HIBYTE(v23) & 4 )
-      {
+
         Dst.type = ParticleType_Line;
         Dst.uDiffuse = rand();
         Dst.timeToLive = 64;
         Dst.uTextureID = 0;
-LABEL_89:
         Dst.flt_28 = 1.0;
         pGame->pParticleEngine->AddParticle(&Dst);
-        return;
       }
+    else if ( v2->uFlags & OBJECT_DESC_TRIAL_PARTICLE )
+        {
       Dst.type = ParticleType_Bitmap | ParticleType_8;
       Dst.uDiffuse = rand();
-      v24 = rand();
-      v48 = (TEXTURE_TYPE)0;
-LABEL_87:
-      v47 = "effpar03";
+      Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
+      Dst.uTextureID = pBitmaps_LOD->LoadTexture("effpar03", TEXTURE_DEFAULT);
+      Dst.flt_28 = 1.0;
+      pGame->pParticleEngine->AddParticle(&Dst);
     }
-    Dst.timeToLive = (unsigned __int8)(v24 & 0x80) + 128;
-    Dst.uTextureID = pBitmaps_LOD->LoadTexture(v47, v48);
-    goto LABEL_89;
+    return;
+        }
   }
 LABEL_13:
   if ( v1->vPosition.z > v7
-    && (v13 = v1->vPosition.x, v13 >= -32768)
-    && v13 <= 32768
-    && (v14 = v1->vPosition.y, v14 >= -32768)
-    && v14 <= 32768
+    && (v13 = v1->vPosition.x, v13 >= -0x8000)
+    && v13 <= 0x8000
+    && (v14 = v1->vPosition.y, v14 >= -0x8000)
+    && v14 <= 0x8000
     && v1->vPosition.z <= 13000
-    || !(v2->uFlags & 0x40) )
+    || !(v2->uFlags & OBJECT_DESC_INTERACTABLE) )
     goto LABEL_92;
   if ( v1->vPosition.z < v7 )
     v1->vPosition.z = v8;
@@ -414,34 +402,23 @@
         return;
       _46E889_collide_against_bmodels(0);
       v16 = WorldPosToGridCellZ(v1->vPosition.y);
-      v17 = v1->vPosition.x;
-      v58 = v16;
-      v18 = WorldPosToGridCellX(v17);
-      _46E26D_collide_against_sprites(v18, v58);
+      v18 = WorldPosToGridCellX(v1->vPosition.x);
+      _46E26D_collide_against_sprites(v18, v16);
       if (PID_TYPE(v1->spell_caster_pid) != OBJECT_Player)
         _46EF01_collision_chech_player(0);
       if (PID_TYPE(v1->spell_caster_pid) == OBJECT_Actor)
       {
         v19 = PID_ID(v1->spell_caster_pid);
-        if ( v19 >= 0 )
+        if (( v19 >= 0 )&&( v19 < (signed int)(uNumActors - 1) ))
         {
-          if ( v19 < (signed int)(uNumActors - 1) )
-          {
-            v56 = 0;
-            if ( (signed int)uNumActors > 0 )
-            {
-              v60 = pActors.data();
-              v20 = &pActors[v19];
-              do
+         
+            v20 = &pActors[v19];
+           for (v56 =0; v56 < uNumActors; ++v56)            
               {
-                if ( v20->GetActorsRelation(v60) )
+                if ( v20->GetActorsRelation(&pActors[v56]) )
                   _46DF1A_collide_against_actor(v56, 0);
-                ++v56;
-                ++v60;
+
               }
-              while ( v56 < (signed int)uNumActors );
-            }
-          }
         }
       }
       else
@@ -458,7 +435,7 @@
               &v49,
               &v50,
               0);
-      if ( v59 && v26 < v27 + 60 )
+      if ( on_water && v26 < v27 + 60 )
       {
         if ( v50 )
           v44 = v27 + 30;
@@ -474,50 +451,55 @@
         v1->vPosition.y = stru_721530.normal2.y;
         v1->vPosition.z = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
         v1->uSectorID = LOWORD(stru_721530.uSectorID);
-        if ( !(HIBYTE(v2->uFlags) & 1) )
-          return;
         memset(&Dst, 0, 0x68u);
-        v45 = v2->uFlags;
         Dst.x = (double)v1->vPosition.x;
         Dst.y = (double)v1->vPosition.y;
         Dst.z = (double)v1->vPosition.z;
         Dst.flt_10 = 0.0;
         Dst.flt_14 = 0.0;
         Dst.flt_18 = 0.0;
-        if ( HIBYTE(v45) & 2 )
+        if ( v2->uFlags & OBJECT_DESC_TRIAL_FIRE )
         {
           Dst.type = ParticleType_Bitmap | ParticleType_Rotating | ParticleType_8;
           Dst.uDiffuse = 0xFF3C1E;
-          v24 = rand();
-          v48 = (TEXTURE_TYPE)0;
-          goto LABEL_83;
+          Dst.timeToLive = (unsigned __int8)( rand() & 0x80) + 128;
+          Dst.uTextureID = pBitmaps_LOD->LoadTexture("effpar01", TEXTURE_DEFAULT);
+          Dst.flt_28 = 1.0;
+          pGame->pParticleEngine->AddParticle(&Dst);
+          return;
         }
-        if ( HIBYTE(v45) & 4 )
+        else if ( v2->uFlags & OBJECT_DESC_TRIAL_LINE )
         {
           Dst.type = ParticleType_Line;
-          v46 = rand();
           Dst.uTextureID = 0;
-          Dst.uDiffuse = v46;
+          Dst.uDiffuse = rand();
           Dst.timeToLive = 64;
-          goto LABEL_89;
+          Dst.flt_28 = 1.0;
+          pGame->pParticleEngine->AddParticle(&Dst);
+          return;
         }
-        Dst.type = ParticleType_Bitmap | ParticleType_8;
-        Dst.uDiffuse = rand();
-        v24 = rand();
-        v48 = (TEXTURE_TYPE)0;
-        goto LABEL_87;
+        else if ( v2->uFlags & OBJECT_DESC_TRIAL_PARTICLE)
+            { 
+            Dst.type = ParticleType_Bitmap | ParticleType_8;
+            Dst.uDiffuse = rand();         
+            Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
+            Dst.uTextureID = pBitmaps_LOD->LoadTexture("effpar03", TEXTURE_DEFAULT);
+            Dst.flt_28 = 1.0;
+            pGame->pParticleEngine->AddParticle(&Dst);
+            }
+        return;
       }
-      v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16);
+      v60 = ((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16);
       v1->vPosition.x += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16;
-      v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16);
+      v60 = ((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16);
       v1->vPosition.y += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16;
-      v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16);
+      v60 = ((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16);
       v28 = LOWORD(stru_721530.uSectorID);
       v1->vPosition.z += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
       v29 = v1->vPosition.z;
       v1->uSectorID = v28;
       stru_721530.field_70 += stru_721530.field_7C;
-      if ( v2->uFlags & 0x40 )
+      if ( v2->uFlags & OBJECT_DESC_INTERACTABLE )
       {
         if ( v29 < v54 )
           v1->vPosition.z = v54 + 1;
@@ -541,8 +523,8 @@
           v57 = (unsigned __int64)(v56 * (signed __int64)v57) >> 16;
           v58 = v32->pFacePlane.vNormal.y;
           v58 = (unsigned __int64)(v56 * (signed __int64)v58) >> 16;
-          v60 = (Actor *)v32->pFacePlane.vNormal.z;
-          v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)(signed int)v60) >> 16);
+          v60 = v32->pFacePlane.vNormal.z;
+          v60 = ((unsigned __int64)(v56 * (signed __int64)(signed int)v60) >> 16);
           v1->vVelocity.x += 2 * v57;
           v1->vVelocity.y += 2 * v58;
           if ( v32->pFacePlane.vNormal.z <= 32000 )
@@ -552,10 +534,9 @@
           else
           {
             v36 = v60;
-            v57 = 32000;
             v1->vVelocity.z += (signed __int16)v60;
-            v58 = (unsigned __int64)(v57 * (signed __int64)(signed int)v36) >> 16;
-            v37 = (unsigned int)(v57 * (int)v36) >> 16;
+            v58 = (unsigned __int64)(32000 * (signed __int64)(signed int)v36) >> 16;
+            v37 = (unsigned int)(32000 * v36) >> 16;
           }
           v1->vVelocity.z += v37;
 LABEL_70:
@@ -574,21 +555,14 @@
         goto LABEL_73;
       }
 LABEL_74:
-      v58 = v1->vVelocity.x;
-      v57 = 58500;
-      v58 = (unsigned __int64)(58500i64 * v58) >> 16;
-      v1->vVelocity.x = v58;
-      v58 = v1->vVelocity.y;
-      v58 = (unsigned __int64)(v57 * (signed __int64)v58) >> 16;
-      v57 = 58500;
-      v1->vVelocity.y = v58;
-      v58 = v1->vVelocity.z;
-      v58 = (unsigned __int64)(v57 * (signed __int64)v58) >> 16;
+      v1->vVelocity.x = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.x) >> 16);
+      v1->vVelocity.y = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.y) >> 16);
+      v1->vVelocity.z = (signed __int16)((unsigned __int64)(58500i64 * (signed __int64)(signed int)v1->vVelocity.z) >> 16);
+
       ++v55;
-      v43 = __OFSUB__(v55, 100);
-      v42 = v55 - 100 < 0;
-      v1->vVelocity.z = v58;
-      if ( !(v42 ^ v43) )
+      //v43 = __OFSUB__(v55, 100);
+   //   v42 = v55 - 100 < 0;
+      if (v55>=100 )//!(v42 ^ v43) 
         return;
     }
     v57 = integer_sqrt(v1->vVelocity.y * v1->vVelocity.y + v1->vVelocity.x * v1->vVelocity.x);
@@ -597,12 +571,12 @@
             v1->vPosition.y - pLevelDecorations[v30].vPosition.y);
     v56 = v38;
     v39 = stru_5C6E00->Cos(v38);
-    v60 = (Actor *)v39;
+   // v60 = v39;
     v40 = v39 * (signed __int64)v57;
     v58 = v40 >> 16;
     v1->vVelocity.x = WORD1(v40);
     v41 = stru_5C6E00->Sin(v56 - stru_5C6E00->uIntegerHalfPi);
-    v60 = (Actor *)v41;
+   // v60 = v41;
     v35 = (unsigned __int64)(v41 * (signed __int64)v57) >> 16;
     v58 = v35;
 LABEL_73:
--- a/SpriteObject.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/SpriteObject.h	Fri Jun 14 16:06:30 2013 +0600
@@ -1,5 +1,4 @@
 #pragma once
-#include "VectorTypes.h"
 #include "Items.h"
 
 enum
--- a/Texture.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Texture.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -192,6 +192,8 @@
 unsigned int uTextureID_BACKDOLL; // weak
 unsigned int uTextureID_BACKHAND; // weak
 
+stru355 stru_4E82A4 = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000};
+stru355 stru_4EFCBC = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000};
 
 Texture pTex_F7CE30;
 
--- a/Texture.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/Texture.h	Fri Jun 14 16:06:30 2013 +0600
@@ -125,51 +125,49 @@
 
 
 
-
-
 extern std::array<struct RGBTexture, 45> pSavegameThumbnails;
-extern std::array<Texture *, 2> pTexture_LloydBeacons;
-extern Texture *pTexture_50635C;
-extern Texture *pTexture_506368;
-extern Texture *pTexture_50636C;
-extern Texture *pTexture_506370;
-extern Texture *pTexture_506374;
-extern Texture *pTexture_506378;
-extern Texture *pTexture_50637C;
-extern Texture *pTexture_506380;
-extern Texture *pTexture_506384;
-extern Texture *pTexture_506388;
-extern Texture *pTexture_50638C;
-extern Texture *pTexture_506390;
-extern Texture *pTexture_506394;
-extern Texture *pTex_tab_an_7a__zoot_off;
-extern Texture *pTex_tab_an_6a__zoom_off;
-extern Texture *pTex_tab_an_7b__zoot_on;
-extern Texture *pTex_tab_an_6b__zoom_on;
-extern std::array<Texture *, 6> pTexture_TownPortalIcons; // [0]Harmonale, [1]Pierpont, [2]Nighon, [3]Evenmorn Island, [4]Celestia, [5]The Pit
+extern std::array<struct Texture *, 2> pTexture_LloydBeacons;
+extern struct Texture *pTexture_50635C;
+extern struct Texture *pTexture_506368;
+extern struct Texture *pTexture_50636C;
+extern struct Texture *pTexture_506370;
+extern struct Texture *pTexture_506374;
+extern struct Texture *pTexture_506378;
+extern struct Texture *pTexture_50637C;
+extern struct Texture *pTexture_506380;
+extern struct Texture *pTexture_506384;
+extern struct Texture *pTexture_506388;
+extern struct Texture *pTexture_50638C;
+extern struct Texture *pTexture_506390;
+extern struct Texture *pTexture_506394;
+extern struct Texture *pTex_tab_an_7a__zoot_off;
+extern struct Texture *pTex_tab_an_6a__zoom_off;
+extern struct Texture *pTex_tab_an_7b__zoot_on;
+extern struct Texture *pTex_tab_an_6b__zoom_on;
+extern std::array<struct Texture *, 6> pTexture_TownPortalIcons; // [0]Harmonale, [1]Pierpont, [2]Nighon, [3]Evenmorn Island, [4]Celestia, [5]The Pit
 
-extern std::array<Texture *, 12> dword_5063D8;
-extern std::array<Texture *, 12> dword_506408;
-extern Texture *pTexture_50643C; // idb
-extern Texture *ptr_506440;
-extern Texture *pTexture_506444;
-extern Texture *pTexture_506448; // idb
-extern std::array<std::array<Texture *, 2>, 9> pTextures_tabs;
-extern Texture *pTexture_mapbordr; // idb
-extern Texture *pTexture_pagemask; // idb
-extern std::array<Texture *, 9> pSpellBookPagesTextr;
-extern Texture *pSpellBookPagesTextr_9;
-extern Texture *pSpellBookPagesTextr_10;
-extern Texture *pSpellBookPagesTextr_11;
-extern Texture *pSpellBookPagesTextr_12;
-extern Texture *pSpellBookPagesTextr_13;
-extern Texture *pTexture_AutonotesBook;
-extern Texture *pTexture_CurrentBook;
-extern Texture *pTex_moon_new;
-extern Texture *pTex_moon_4;
-extern Texture *pTex_moon_2;
-extern Texture *pTex_moon_2_2;
-extern Texture *pTex_moon_ful;
+extern std::array<struct Texture *, 12> dword_5063D8;
+extern std::array<struct Texture *, 12> dword_506408;
+extern struct Texture *pTexture_50643C; // idb
+extern struct Texture *ptr_506440;
+extern struct Texture *pTexture_506444;
+extern struct Texture *pTexture_506448; // idb
+extern std::array<std::array<struct Texture *, 2>, 9> pTextures_tabs;
+extern struct Texture *pTexture_mapbordr; // idb
+extern struct Texture *pTexture_pagemask; // idb
+extern std::array<struct Texture *, 9> pSpellBookPagesTextr;
+extern struct Texture *pSpellBookPagesTextr_9;
+extern struct Texture *pSpellBookPagesTextr_10;
+extern struct Texture *pSpellBookPagesTextr_11;
+extern struct Texture *pSpellBookPagesTextr_12;
+extern struct Texture *pSpellBookPagesTextr_13;
+extern struct Texture *pTexture_AutonotesBook;
+extern struct Texture *pTexture_CurrentBook;
+extern struct Texture *pTex_moon_new;
+extern struct Texture *pTex_moon_4;
+extern struct Texture *pTex_moon_2;
+extern struct Texture *pTex_moon_2_2;
+extern struct Texture *pTex_moon_ful;
 
 
 
@@ -211,16 +209,16 @@
 extern unsigned int uTextureID_BUTTMAKE;
 extern unsigned int uTextureID_BUTTYES2;
 extern unsigned int uTextureID_x_ok_u;
-extern std::array<Texture *, 22> pPlayerPortraits;
-extern std::array<Texture *, 9> pTexture_IC_KNIGHT;
-extern Texture *pTexture_MAKESKY;
-extern Texture *pTexture_MAKETOP;
-extern std::array<Texture *, 20> pTextures_arrowr;
-extern std::array<Texture *, 20> pTextures_arrowl;
-extern Texture *pTexture_presleft;
-extern Texture *pTexture_pressrigh;
-extern Texture *pTexture_buttminu;
-extern Texture *pTexture_buttplus;
+extern std::array<struct Texture *, 22> pPlayerPortraits;
+extern std::array<struct Texture *, 9> pTexture_IC_KNIGHT;
+extern struct Texture *pTexture_MAKESKY;
+extern struct Texture *pTexture_MAKETOP;
+extern std::array<struct Texture *, 20> pTextures_arrowr;
+extern std::array<struct Texture *, 20> pTextures_arrowl;
+extern struct Texture *pTexture_presleft;
+extern struct Texture *pTexture_pressrigh;
+extern struct Texture *pTexture_buttminu;
+extern struct Texture *pTexture_buttplus;
 extern unsigned int uTextureID_Quit1;
 extern unsigned int uTextureID_Resume1;
 extern unsigned int uTextureID_Controls1;
@@ -269,9 +267,9 @@
 extern unsigned int uTextureID_right_panel_loop; // weak
 
 
-extern Texture *pTexture_Leather;
-extern Texture *pTexture_RestUI_CurrentSkyFrame; // idb
-extern Texture *pTexture_RestUI_CurrentHourglassFrame; // idb
+extern struct Texture *pTexture_Leather;
+extern struct Texture *pTexture_RestUI_CurrentSkyFrame; // idb
+extern struct Texture *pTexture_RestUI_CurrentHourglassFrame; // idb
 
 
 extern std::array<unsigned int, 5> uTextureID_Optkb;
@@ -315,12 +313,13 @@
 extern unsigned int uTextureID_BACKHAND; // weak
 
 
-extern Texture pTex_F7CE30;
+extern struct Texture pTex_F7CE30;
 
 
 extern RGBTexture stru_5773C4; // idb
 
-
+extern struct stru355 stru_4E82A4;// = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000};  moved to texture.h
+extern struct stru355 stru_4EFCBC;// = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000};  moved to texture.h
 
 
 
@@ -347,15 +346,15 @@
 struct stru350
 {
   stru350 *_450DDE();
-  bool _450DF1(const stru355 *p1, const stru355 *p2);
+  bool _450DF1(const struct stru355 *p1, const struct stru355 *p2);
   unsigned int _450F55(int a2);
   int _450FB1(int a2);
   int sub_451007_scale_image_bicubic(unsigned short *pSrc, int srcWidth, int srcHeight, int srcPitch,
                                      unsigned short *pDst, int dstWidth, int dstHeight, int dstPitch,
                                      int a9, int a10);
 
-  stru355 field_0;
-  stru355 field_20;
+  struct stru355 field_0;
+  struct stru355 field_20;
   int field_40;
   int field_44;
   int field_48;
--- a/Time.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Time.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -1,10 +1,9 @@
-#include "OSAPI.h"
 
 #include "Time.h"
 #include "Keyboard.h"
 #include "Log.h"
 
-#include "mm7_data.h"
+#include "OSAPI.h"
 
 
 
--- a/UICharacter.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UICharacter.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -15,7 +15,7 @@
 #include "GUIProgressBar.h"
 #include "Party.h"
 #include "AudioPlayer.h"
-#include "Outdoor.h"
+#include "Render.h"
 #include "IndoorCamera.h"
 #include "LOD.h"
 #include "Viewport.h"
--- a/UIHouses.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UIHouses.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -2,9 +2,10 @@
 #define _CRT_SECURE_NO_WARNINGS
 #endif
 
+#include "Texture.h"
+#include "mm7_data.h"
 #include "UIHouses.h"
 #include "Party.h"
-#include "Player.h"
 #include "texts.h"
 #include "Events.h"
 #include "Arcomage.h"
@@ -14,20 +15,15 @@
 #include "GUIFont.h"
 #include "Events2D.h"
 #include "Overlays.h"
-#include "Render.h"
-#include "Indoor.h"
 #include "Outdoor.h"
 #include "AudioPlayer.h"
 #include "VideoPlayer.h"
 #include "Monsters.h"
 #include "Viewport.h"
 #include "Keyboard.h"
-#include "NPC.h"
 #include "IndoorCamera.h"
 #include "MapInfo.h"
 #include "Log.h"
-#include "MM7.h"
-#include "mm7_data.h"
 #include "Game.h"
 
 #include "stru159.h"
--- a/UIMainMenu.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UIMainMenu.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -4,48 +4,18 @@
 
 #include <assert.h>
 
-#include "MM7.h"
 
 #include "Mouse.h"
 #include "Keyboard.h"
 
-#include "MapInfo.h"
-#include "Game.h"
 #include "GUIWindow.h"
 #include "GUIFont.h"
-#include "GUIProgressBar.h"
-#include "Party.h"
 #include "AudioPlayer.h"
-#include "Outdoor.h"
-#include "IndoorCamera.h"
-#include "Overlays.h"
-#include "Monsters.h"
-#include "Arcomage.h"
+#include "Render.h"
 #include "LOD.h"
-#include "Actor.h"
 #include "Allocator.h"
-#include "Events.h"
-#include "Viewport.h"
-#include "FrameTableInc.h"
-#include "Math.h"
-#include "SpriteObject.h"
-#include "ObjectList.h"
-#include "Chest.h"
 #include "PaletteManager.h"
-#include "DecorationList.h"
-#include "SaveLoad.h"
-#include "stru123.h"
-#include "Time.h"
 #include "IconFrameTable.h"
-#include "Awards.h"
-#include "Autonotes.h"
-#include "stru160.h"
-#include "TurnEngine.h"
-#include "CastSpellInfo.h"
-#include "Weather.h"
-#include "stru298.h"
-#include "StorylineTextTable.h"
-#include "Events2D.h"
 #include "texts.h"
 
 #include "mm7_data.h"
--- a/UIOptions.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UIOptions.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -6,46 +6,13 @@
 #include "IndoorCameraD3D.h"
 #include "CShow.h"
 #include "GammaControl.h"
-#include "stru6.h"
-#include "stru9.h"
+#include "Render.h"
 
-#include "MapInfo.h"
 #include "Game.h"
 #include "GUIWindow.h"
 #include "GUIFont.h"
-#include "GUIProgressBar.h"
-#include "Party.h"
 #include "AudioPlayer.h"
-#include "Outdoor.h"
-#include "IndoorCamera.h"
-#include "Overlays.h"
-#include "Monsters.h"
-#include "Arcomage.h"
 #include "LOD.h"
-#include "Actor.h"
-#include "Allocator.h"
-#include "Events.h"
-#include "Viewport.h"
-#include "FrameTableInc.h"
-#include "Math.h"
-#include "SpriteObject.h"
-#include "ObjectList.h"
-#include "Chest.h"
-#include "PaletteManager.h"
-#include "DecorationList.h"
-#include "SaveLoad.h"
-#include "stru123.h"
-#include "Time.h"
-#include "IconFrameTable.h"
-#include "Awards.h"
-#include "Autonotes.h"
-#include "stru160.h"
-#include "TurnEngine.h"
-#include "CastSpellInfo.h"
-#include "Weather.h"
-#include "stru298.h"
-#include "StorylineTextTable.h"
-#include "Events2D.h"
 #include "texts.h"
 
 #include "mm7_data.h"
--- a/UIPartyCreation.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UIPartyCreation.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -4,59 +4,20 @@
 
 #include <assert.h>
 
-#include "MM7.h"
 
-#include "LightmapBuilder.h"
-#include "DecalBuilder.h"
-#include "ParticleEngine.h"
 #include "Mouse.h"
 #include "Keyboard.h"
-#include "IndoorCameraD3D.h"
-#include "CShow.h"
-#include "GammaControl.h"
-#include "stru6.h"
-#include "stru9.h"
-#include "stru10.h"
-#include "stru11.h"
-#include "stru12.h"
 
-#include "MapInfo.h"
 #include "Game.h"
 #include "GUIWindow.h"
 #include "GUIFont.h"
-#include "GUIProgressBar.h"
 #include "Party.h"
 #include "AudioPlayer.h"
-#include "Outdoor.h"
-#include "IndoorCamera.h"
-#include "Overlays.h"
-#include "Monsters.h"
-#include "Arcomage.h"
+#include "Render.h"
 #include "LOD.h"
-#include "Actor.h"
 #include "Allocator.h"
-#include "Events.h"
-#include "Viewport.h"
-#include "FrameTableInc.h"
-#include "Math.h"
-#include "SpriteObject.h"
-#include "ObjectList.h"
-#include "Chest.h"
-#include "PaletteManager.h"
-#include "DecorationList.h"
-#include "SaveLoad.h"
-#include "stru123.h"
 #include "Time.h"
 #include "IconFrameTable.h"
-#include "Awards.h"
-#include "Autonotes.h"
-#include "stru160.h"
-#include "TurnEngine.h"
-#include "CastSpellInfo.h"
-#include "Weather.h"
-#include "stru298.h"
-#include "StorylineTextTable.h"
-#include "Events2D.h"
 #include "texts.h"
 
 #include "mm7_data.h"
--- a/UIPopup.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UIPopup.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -10,43 +10,19 @@
 
 #include "Sprites.h"
 #include "Vis.h"
-#include "MapInfo.h"
 #include "Game.h"
 #include "GUIWindow.h"
 #include "GUIFont.h"
-#include "GUIProgressBar.h"
 #include "Party.h"
 #include "AudioPlayer.h"
-#include "Outdoor.h"
-#include "IndoorCamera.h"
-#include "Overlays.h"
-#include "Monsters.h"
-#include "Arcomage.h"
 #include "LOD.h"
 #include "Actor.h"
-#include "Allocator.h"
-#include "Events.h"
 #include "Viewport.h"
-#include "FrameTableInc.h"
-#include "Math.h"
 #include "SpriteObject.h"
 #include "ObjectList.h"
 #include "Chest.h"
 #include "PaletteManager.h"
-#include "DecorationList.h"
-#include "SaveLoad.h"
-#include "stru123.h"
 #include "Time.h"
-#include "IconFrameTable.h"
-#include "Awards.h"
-#include "Autonotes.h"
-#include "stru160.h"
-#include "TurnEngine.h"
-#include "CastSpellInfo.h"
-#include "Weather.h"
-#include "stru298.h"
-#include "StorylineTextTable.h"
-#include "Events2D.h"
 #include "texts.h"
 
 #include "mm7_data.h"
--- a/UIRest.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UIRest.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -4,46 +4,15 @@
 
 #include <assert.h>
 
-#include "MM7.h"
 
-#include "MapInfo.h"
-#include "Game.h"
-#include "Player.h"
 #include "GUIWindow.h"
 #include "GUIFont.h"
-#include "GUIProgressBar.h"
 #include "Party.h"
 #include "AudioPlayer.h"
 #include "Outdoor.h"
-#include "IndoorCamera.h"
-#include "Overlays.h"
-#include "Monsters.h"
-#include "Arcomage.h"
 #include "LOD.h"
-#include "Actor.h"
-#include "Allocator.h"
-#include "Events.h"
 #include "Viewport.h"
-#include "FrameTableInc.h"
-#include "Math.h"
-#include "SpriteObject.h"
-#include "ObjectList.h"
-#include "Chest.h"
-#include "PaletteManager.h"
-#include "DecorationList.h"
-#include "SaveLoad.h"
-#include "stru123.h"
 #include "Time.h"
-#include "IconFrameTable.h"
-#include "Awards.h"
-#include "Autonotes.h"
-#include "stru160.h"
-#include "TurnEngine.h"
-#include "CastSpellInfo.h"
-#include "Weather.h"
-#include "stru298.h"
-#include "StorylineTextTable.h"
-#include "Events2D.h"
 #include "texts.h"
 
 #include "mm7_data.h"
--- a/UISaveLoad.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UISaveLoad.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -6,46 +6,16 @@
 #include <io.h>
 #include "MM7.h"
 
-#include "Mouse.h"
 #include "Keyboard.h"
 
 #include "MapInfo.h"
-#include "Game.h"
 #include "GUIWindow.h"
 #include "GUIFont.h"
-#include "GUIProgressBar.h"
-#include "Party.h"
-#include "AudioPlayer.h"
-#include "Outdoor.h"
+#include "Render.h"
 #include "IndoorCamera.h"
-#include "Overlays.h"
-#include "Monsters.h"
-#include "Arcomage.h"
 #include "LOD.h"
-#include "Actor.h"
 #include "Allocator.h"
-#include "Events.h"
-#include "Viewport.h"
-#include "FrameTableInc.h"
-#include "Math.h"
-#include "SpriteObject.h"
-#include "ObjectList.h"
-#include "Chest.h"
-#include "PaletteManager.h"
-#include "DecorationList.h"
 #include "SaveLoad.h"
-#include "stru123.h"
-#include "Time.h"
-#include "IconFrameTable.h"
-#include "Awards.h"
-#include "Autonotes.h"
-#include "stru160.h"
-#include "TurnEngine.h"
-#include "CastSpellInfo.h"
-#include "Weather.h"
-#include "stru298.h"
-#include "StorylineTextTable.h"
-#include "Events2D.h"
 #include "texts.h"
 
 #include "mm7_data.h"
--- a/UITransition.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UITransition.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -5,52 +5,22 @@
 #include <assert.h>
 #include <io.h>
 
-#include "Mouse.h"
-#include "Keyboard.h"
+#include "mm7_data.h"
 #include "VideoPlayer.h"
 #include "MapInfo.h"
-#include "Game.h"
 #include "GUIWindow.h"
 #include "GUIFont.h"
 #include "GUIProgressBar.h"
 #include "Party.h"
 #include "AudioPlayer.h"
 #include "Outdoor.h"
-#include "IndoorCamera.h"
-#include "Overlays.h"
-#include "Monsters.h"
-#include "Arcomage.h"
 #include "LOD.h"
-#include "Actor.h"
-#include "Allocator.h"
-#include "Events.h"
-#include "Viewport.h"
-#include "FrameTableInc.h"
-#include "Math.h"
-#include "SpriteObject.h"
-#include "ObjectList.h"
-#include "Chest.h"
-#include "PaletteManager.h"
-#include "DecorationList.h"
-#include "SaveLoad.h"
-#include "stru123.h"
 #include "Time.h"
-#include "IconFrameTable.h"
-#include "Awards.h"
-#include "Autonotes.h"
 #include "stru159.h"
-#include "stru160.h"
-#include "TurnEngine.h"
-#include "CastSpellInfo.h"
-#include "Weather.h"
-#include "stru298.h"
-#include "StorylineTextTable.h"
 #include "Events2D.h"
 #include "texts.h"
 #include "UIHouses.h"
 
-#include "mm7_data.h"
-
 
 
 
--- a/UiGame.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/UiGame.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -4,66 +4,36 @@
 
 #include <assert.h>
 
+#include "Texture.h"
 #include "MM7.h"
 
-#include "BSPModel.h"
-#include "LightmapBuilder.h"
-#include "DecalBuilder.h"
-#include "ParticleEngine.h"
 #include "Mouse.h"
 #include "Keyboard.h"
-#include "IndoorCameraD3D.h"
-#include "CShow.h"
-#include "GammaControl.h"
-#include "stru6.h"
-#include "stru9.h"
-#include "stru10.h"
-#include "stru11.h"
-#include "stru12.h"
+#include "mm7_data.h"
 
 #include "Vis.h"
 #include "MapInfo.h"
 #include "Game.h"
 #include "GUIWindow.h"
 #include "GUIFont.h"
-#include "GUIProgressBar.h"
 #include "Party.h"
 #include "AudioPlayer.h"
 #include "Outdoor.h"
-#include "IndoorCamera.h"
-#include "Overlays.h"
-#include "Monsters.h"
-#include "Arcomage.h"
 #include "LOD.h"
 #include "Actor.h"
-#include "Allocator.h"
-#include "Events.h"
 #include "Viewport.h"
-#include "FrameTableInc.h"
-#include "Math.h"
 #include "SpriteObject.h"
 #include "ObjectList.h"
-#include "Chest.h"
-#include "PaletteManager.h"
 #include "DecorationList.h"
 #include "PlayerFrameTable.h"
-#include "SaveLoad.h"
 #include "stru123.h"
 #include "Time.h"
 #include "IconFrameTable.h"
-#include "Awards.h"
-#include "Autonotes.h"
-#include "stru160.h"
 #include "TurnEngine.h"
-#include "CastSpellInfo.h"
-#include "Weather.h"
-#include "stru298.h"
-#include "StorylineTextTable.h"
-#include "Events2D.h"
 #include "texts.h"
 #include "UIHouses.h"
+#include "BSPModel.h"
 
-#include "mm7_data.h"
 
 
 
--- a/VideoPlayer.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/VideoPlayer.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -2,10 +2,10 @@
 #define _CRT_SECURE_NO_WARNINGS
 #endif
 
-#include "OSAPI.h"
 
 #include "Bink_Smacker.h"
 
+#include "mm7_data.h"
 #include "CShow.h"
 #include "Mouse.h"
 
@@ -19,10 +19,8 @@
 #include "Allocator.h"
 #include "Time.h"
 #include "Log.h"
+#include "texts.h"
 #include "UIHouses.h"
-#include "texts.h"
-#include "MM7.h"
-#include "mm7_data.h"
 
 
 VideoPlayer *pVideoPlayer = nullptr;
@@ -1173,4 +1171,17 @@
   bStopBeforeSchedule = 0;
   pResetflag = 0;
   pGame->pCShow->PlayMovie(MOVIE_Death, 1);
-}
\ No newline at end of file
+}
+
+//----- (004BE6F5) --------------------------------------------------------
+VideoPlayer::VideoPlayer() :
+  field_54(0),
+  pBinkMovie(nullptr), pBinkBuffer(nullptr),
+  pSmackerMovie(nullptr), pSmackerBuffer(nullptr), pSmackMovieBlit(nullptr)
+{
+  //RGBTexture::RGBTexture(&pVideoPlayer->pVideoFrame);
+  bStopBeforeSchedule = false;
+  pResetflag = 0;
+  byte_F8BC0C = 0;
+  //pBinkMovie = nullptr;
+}
--- a/VideoPlayer.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/VideoPlayer.h	Fri Jun 14 16:06:30 2013 +0600
@@ -1,8 +1,7 @@
 #pragma once
 #include "OSAPI.h"
+#include "Texture.h"
 
-#include "Texture.h"
-#include "mm7_data.h"
 
 
 
@@ -113,18 +112,7 @@
 #pragma pack(push, 1)
 struct VideoPlayer
 {
-  //----- (004BE6F5) --------------------------------------------------------
-  inline VideoPlayer():
-    field_54(0),
-    pBinkMovie(nullptr), pBinkBuffer(nullptr),
-    pSmackerMovie(nullptr), pSmackerBuffer(nullptr), pSmackMovieBlit(nullptr)
-  {
-    //RGBTexture::RGBTexture(&pVideoPlayer->pVideoFrame);
-    bStopBeforeSchedule = false;
-    pResetflag = 0;
-    byte_F8BC0C = 0;
-    //pBinkMovie = nullptr;
-  }
+  VideoPlayer();
   //----- (004BECBD) --------------------------------------------------------
   virtual ~VideoPlayer()
   {
--- a/Viewport.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Viewport.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -1,9 +1,7 @@
 #include "Viewport.h"
 
 #include "Party.h"
-#include "VectorTypes.h"
 #include "Indoor.h"
-#include "Render.h"
 #include "Math.h"
 #include "mm7_data.h"
 
--- a/Vis.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Vis.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -1,8 +1,8 @@
 #include <assert.h>
 
-#include "BSPModel.h"
 #include "Vis.h"
 #include "Outdoor.h"
+#include "BSPModel.h"
 #include "Game.h"
 #include "Actor.h"
 #include "IndoorCamera.h"
--- a/Weather.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/Weather.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -4,7 +4,7 @@
 #include "Viewport.h"
 #include "Render.h"
 
-#include "mm7_data.h"
+#include "mm7_data.h"   ////TODO: remove this once LOWORD/HIWRD stuff is refactored
 
 
 
--- a/mm7_1.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/mm7_1.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -11,6 +11,8 @@
 //#include <defs.h>
 #include <assert.h>
 
+#include "Texture.h"
+#include "mm7_data.h"
 #include "VideoPlayer.h"
 #include "BSPModel.h"
 #include "Mouse.h"
@@ -38,7 +40,6 @@
 #include "TurnEngine.h"
 #include "texts.h"
 #include "UIHouses.h"
-#include "mm7_data.h"
 #include "stru367.h"
 
 int __stdcall aWinProc(HWND hWnd, UINT Msg, WPARAM wParam, unsigned int lParam);
--- a/mm7_2.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/mm7_2.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -8,6 +8,8 @@
 #include <windows.h>
 
 
+#include "Texture.h"
+#include "mm7_data.h"
 #include "VideoPlayer.h"
 #include "Sprites.h"
 #include "BSPModel.h"
@@ -63,8 +65,8 @@
 #include "Log.h"
 #include "UIHouses.h"
 #include "texts.h"
-#include "mm7_data.h"
 #include "MM7.h"
+#include "Lights.h"
 
 //----- (004BB756) --------------------------------------------------------
 signed int __fastcall sub_4BB756(signed int a1)
@@ -5607,43 +5609,46 @@
   pIcons_LOD->_4114F2();
 }
 
+void set_stru1_field_8_InArcomage(int inValue)
+{
+  switch(inValue)
+  {
+  case 91:LOBYTE(pArcomageGame->stru1.field_8) = 123;break;
+  case 92:LOBYTE(pArcomageGame->stru1.field_8) = 124;break;
+  case 93:LOBYTE(pArcomageGame->stru1.field_8) = 125;break;
+  case 96:LOBYTE(pArcomageGame->stru1.field_8) = 126;break;
+  case 61:LOBYTE(pArcomageGame->stru1.field_8) = 43;break;
+  case 55:LOBYTE(pArcomageGame->stru1.field_8) = 38;break;
+  case 56:LOBYTE(pArcomageGame->stru1.field_8) = 42;break;
+  case 57:LOBYTE(pArcomageGame->stru1.field_8) = 40;break;
+  case 59:LOBYTE(pArcomageGame->stru1.field_8) = 58;break;
+  case 54:LOBYTE(pArcomageGame->stru1.field_8) = 94;break;
+  case 50:LOBYTE(pArcomageGame->stru1.field_8) = 64;break;
+  case 51:LOBYTE(pArcomageGame->stru1.field_8) = 35;break;
+  case 52:LOBYTE(pArcomageGame->stru1.field_8) = 36;break;
+  case 53:LOBYTE(pArcomageGame->stru1.field_8) = 37;break;
+  case 49:LOBYTE(pArcomageGame->stru1.field_8) = 33;break;
+  case 39:LOBYTE(pArcomageGame->stru1.field_8) = 34;break;
+  case 44:LOBYTE(pArcomageGame->stru1.field_8) = 60;break;
+  case 46:LOBYTE(pArcomageGame->stru1.field_8) = 62;break;
+  case 47:LOBYTE(pArcomageGame->stru1.field_8) = 63;break;
+  case 48:LOBYTE(pArcomageGame->stru1.field_8) = 41;break;
+  default:LOBYTE(pArcomageGame->stru1.field_8) = inValue;break;
+  }
+}
+
+
 //----- (004637EB) --------------------------------------------------------
 int __stdcall aWinProc(HWND hWnd, UINT Msg, WPARAM wParam, unsigned int lParam)
 {
-  //unsigned int v4; // esi@1
-  Render *v5; // ecx@14
   HANDLE v6; // eax@32
-  Keyboard *v7; // eax@33
-  //HDC v9; // edi@41
   HDC v10; // edi@50
   int v11; // esi@50
-  //char v12; // zf@132
   signed int v13; // eax@135
-  int v14; // eax@139
-  int v15; // eax@140
-  int v16; // eax@141
-  int v17; // eax@142
-  int v18; // eax@150
-  int v19; // eax@151
-  int v20; // eax@152
-  int v21; // eax@161
-  int v22; // eax@162
-  int v23; // eax@163
-  int v24; // eax@170
-  int v25; // eax@171
-  int v26; // eax@172
-  char v27; // al@174
-  //bool v28; // ebx@201
   char v29; // dl@209
-  char v30; // cl@210
   bool v31; // ebx@211
-  void *v32; // ebx@214
   float v33; // ST04_4@246
   float v34; // ST04_4@254
-  HWND v35; // [sp+8h] [bp-64h]@103
-  UINT v36; // [sp+Ch] [bp-60h]@103
-  WPARAM v37; // [sp+10h] [bp-5Ch]@103
-  LPARAM v38; // [sp+14h] [bp-58h]@103
   struct tagPAINTSTRUCT Paint; // [sp+24h] [bp-48h]@13
   int pXY[2]; // [sp+64h] [bp-8h]@261
   int a2; // [sp+7Ch] [bp+10h]@50
@@ -5881,7 +5886,6 @@
         ArcomageGame::OnMouseClick(1, 1);
         return DefWindowProcA(hWnd, Msg, wParam, lParam);
       case WM_LBUTTONUP:
-        v32 = 0;
         if ( !pArcomageGame->bGameInProgress )
           //goto LABEL_218;
         {
@@ -5892,7 +5896,6 @@
         ArcomageGame::OnMouseClick(0, 0);
         return DefWindowProcA(hWnd, Msg, wParam, lParam);
       case WM_RBUTTONUP:
-        v32 = 0;
         if ( !pArcomageGame->bGameInProgress )
         {
 //LABEL_218:
@@ -5901,10 +5904,7 @@
           return DefWindowProcA(hWnd, Msg, wParam, lParam);
         }
         pArcomageGame->stru1.field_0 = 4;
-        v29 = 0;
-        //goto LABEL_262;
-        v30 = 1;
-        ArcomageGame::OnMouseClick(v30, v29 != 0);
+        ArcomageGame::OnMouseClick(1, false);
         return DefWindowProcA(hWnd, Msg, wParam, lParam);
 
       case WM_LBUTTONDBLCLK:
@@ -6003,30 +6003,19 @@
   {
     if ( Msg == WM_WINDOWPOSCHANGED )
     {
-      if (pVideoPlayer)
-      {
-        if (pVideoPlayer->AnyMovieLoaded() && pVideoPlayer->pBinkBuffer)
-        {
-          BinkBufferSetOffset(pVideoPlayer->pBinkBuffer, 0, 0);
-          return DefWindowProcA(hWnd, Msg, wParam, lParam);
-        }
-      }
-      //goto _def_wnd_proc;
+      if (pVideoPlayer && pVideoPlayer->AnyMovieLoaded() && pVideoPlayer->pBinkBuffer)
+      {
+        BinkBufferSetOffset(pVideoPlayer->pBinkBuffer, 0, 0);
+      }
       return DefWindowProcA(hWnd, Msg, wParam, lParam);
     }
     if ( Msg != WM_KEYFIRST )
     {
-      if ( Msg == WM_KEYUP )
-      {
-        if ( wParam == VK_CONTROL )
-        {
-          dword_507B98_ctrl_pressed = 0;
-          return DefWindowProcA(hWnd, Msg, wParam, lParam);
-        }
-        //goto _def_wnd_proc;
-        return DefWindowProcA(hWnd, Msg, wParam, lParam);
-      }
-        return DefWindowProcA(hWnd, Msg, wParam, lParam);
+      if ( Msg == WM_KEYUP && wParam == VK_CONTROL )
+      {
+        dword_507B98_ctrl_pressed = 0;
+      }
+      return DefWindowProcA(hWnd, Msg, wParam, lParam);
     }
     if ( uGameMenuUI_CurentlySelectedKeyIdx != -1 )
     {
@@ -6074,508 +6063,23 @@
       if ( pCurrentScreen != SCREEN_GAME && pCurrentScreen != SCREEN_PRESS_ESCAPE_MESSAGE )
         return 0;
     }
+
     pArcomageGame->stru1.field_0 = 1;
-    if ( (unsigned __int16)GetAsyncKeyState(VK_SHIFT) >> 8 >= 0 )
-      v27 = MapVirtualKeyA((unsigned __int16)wParam, 2u);
-    else
-    {
-      v13 = (unsigned __int16)MapVirtualKeyA((unsigned __int16)wParam, 2u);
-      if ( (signed int)(unsigned __int16)v13 > 54 )
-      {
-        if ( v13 > 61 )
-        {
-          if ( v13 == 91 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 123;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 92 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 124;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 93 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 125;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 96 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 126;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-        }
-        else
-        {
-          if ( v13 == 61 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 43;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 55 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 38;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 56 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 42;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 57 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 40;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 59 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 58;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-        }
-      }
-      else
-      {
-        if ( (unsigned __int16)v13 == 54 )
-        {
-          LOBYTE(pArcomageGame->stru1.field_8) = 94;
-          //goto LABEL_181;
-          if ( wParam == 27 )
-          {
-            pArcomageGame->GameOver = 1;
-            pArcomageGame->field_F4 = 1;
-            pArcomageGame->uGameResult = 2;
-            pArcomageGame->field_B0 = -2;
-            //goto _def_wnd_proc;
-            return DefWindowProcA(hWnd, Msg, wParam, lParam);
-          }
-          if ( wParam != 114 )
-          {
-            if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-              SendMessageA(hWnd, 0x111u, 0x68u, 0);
-            //goto _def_wnd_proc;
-            return DefWindowProcA(hWnd, Msg, wParam, lParam);
-          }
-          SendMessageA(hWnd, WM_COMMAND, 103, 0);
-          return 0;
-        }
-        if ( v13 > 49 )
-        {
-          if ( v13 == 50 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 64;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 51 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 35;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 52 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 36;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 53 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 37;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-        }
-        else
-        {
-          if ( v13 == 49 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 33;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 39 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 34;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 44 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 60;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 46 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 62;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 47 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 63;
-            //goto LABEL_181;
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-          if ( v13 == 48 )
-          {
-            LOBYTE(pArcomageGame->stru1.field_8) = 41;
-//LABEL_181:
-            if ( wParam == 27 )
-            {
-              pArcomageGame->GameOver = 1;
-              pArcomageGame->field_F4 = 1;
-              pArcomageGame->uGameResult = 2;
-              pArcomageGame->field_B0 = -2;
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            if ( wParam != 114 )
-            {
-              if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-                SendMessageA(hWnd, 0x111u, 0x68u, 0);
-              //goto _def_wnd_proc;
-              return DefWindowProcA(hWnd, Msg, wParam, lParam);
-            }
-            SendMessageA(hWnd, WM_COMMAND, 103, 0);
-            return 0;
-          }
-        }
-      }
-      v27 = MapVirtualKeyA((unsigned __int16)wParam, 2u);
-    }
-    LOBYTE(pArcomageGame->stru1.field_8) = v27;
-    //goto LABEL_181;
+
+    v13 = (unsigned __int16)MapVirtualKeyA((unsigned __int16)wParam, 2u);
+    set_stru1_field_8_InArcomage(v13);
     if ( wParam == 27 )
     {
       pArcomageGame->GameOver = 1;
       pArcomageGame->field_F4 = 1;
       pArcomageGame->uGameResult = 2;
       pArcomageGame->field_B0 = -2;
-      //goto _def_wnd_proc;
       return DefWindowProcA(hWnd, Msg, wParam, lParam);
     }
     if ( wParam != 114 )
     {
       if ( wParam == 115 && !pVideoPlayer->AnyMovieLoaded() )
-      SendMessageA(hWnd, 0x111u, 0x68u, 0);
-      //goto _def_wnd_proc;
+        SendMessageA(hWnd, 0x111u, 0x68u, 0);
       return DefWindowProcA(hWnd, Msg, wParam, lParam);
     }
     SendMessageA(hWnd, WM_COMMAND, 103, 0);
@@ -6704,7 +6208,6 @@
       if ( pArcomageGame->bGameInProgress )
       {
         pArcomageGame->field_F9 = 1;
-        v5 = pRenderer;
       }
       else
       {
@@ -6714,7 +6217,6 @@
           EndPaint(hWnd, &Paint);
           return 0;
         }
-        v5 = pRenderer;
       }
       pRenderer->Present();
 //LABEL_20:
@@ -7760,7 +7262,7 @@
   if (!bNoSound)
     pAudioPlayer->Initialize(hWnd);
 
-  pVideoPlayer = new VideoPlayer;
+  pVideoPlayer = new VideoPlayer();
   pVideoPlayer->Initialize();
 
   dword_6BE364_game_settings_1 |= 0x4000;
--- a/mm7_3.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/mm7_3.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -5,7 +5,8 @@
 #include <assert.h>
 
 
-#include "VideoPlayer.h"
+#include "Texture.h"
+#include "mm7_data.h"
 #include "Sprites.h"
 #include "BSPModel.h"
 #include "OutdoorCamera.h"
@@ -15,7 +16,7 @@
 #include "Mouse.h"
 #include "Keyboard.h"
 #include "stru6.h"
-
+#include "FactionTable.h"
 #include "MapInfo.h"
 #include "Game.h"
 #include "GUIWindow.h"
@@ -46,9 +47,9 @@
 #include "stru298.h"
 #include "texts.h"
 #include "Log.h"
+#include "Lights.h"
 
 #include "MM7.h"
-#include "mm7_data.h"
 
 //----- (0046E44E) --------------------------------------------------------
 int __thiscall _46E44E_collide_against_faces_and_portals(unsigned int b1)
@@ -14791,8 +14792,9 @@
 				if ( target_pid_type == OBJECT_Actor )
 				{
 					v36 = v75.uDistance;
-					v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (pActor->pMonsterInfo.uID - 1) / 3]
-						+ (pActors[PID_ID(target_pid)].pMonsterInfo.uID - 1) / 3);
+					//v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (pActor->pMonsterInfo.uID - 1) / 3]
+					//	+ (pActors[PID_ID(target_pid)].pMonsterInfo.uID - 1) / 3);
+                    v37 =pFactionTable->relations[(pActor->pMonsterInfo.uID-1) / 3 + 1][(pActors[PID_ID(target_pid)].pMonsterInfo.uID - 1) / 3 + 1];
 				}
 				else
 				{
--- a/mm7_4.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/mm7_4.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -4,6 +4,8 @@
 
 #include <assert.h>
 
+#include "Texture.h"
+#include "mm7_data.h"
 #include "VideoPlayer.h"
 #include "Sprites.h"
 #include "BSPModel.h"
@@ -43,7 +45,7 @@
 #include "texts.h"
 #include "Log.h"
 #include "UIHouses.h"
-#include "mm7_data.h"
+#include "Lights.h"
 
 //----- (0046CC4B) --------------------------------------------------------
 void __cdecl check_event_triggers()
@@ -473,30 +475,25 @@
   dword_721160[0] = -1;
   dword_721110[0] = -1;
   odm_floor_level[0] = GetTerrainHeightsAroundParty2(X, Y, pIsOnWater, bWaterWalk);
-  if ( (signed int)pOutdoor->uNumBModels <= 0 )
-  {
-    *a6 = 0;
-    return odm_floor_level[0];
-  }
-  v38 = 0;
-  for ( pBModelNum = 0; pBModelNum < (signed int)pOutdoor->uNumBModels; ++pBModelNum )
-  {
-    pBModel = &pOutdoor->pBModels[v38];
-    if ( X <= pBModel->sMaxX && X >= pBModel->sMinX && Y <= pBModel->sMaxY && Y >= pBModel->sMinY )
-    {
-      if ( (signed int)pBModel->uNumFaces > 0 )
+  
+  for ( pBModelNum = 0; pBModelNum < pOutdoor->uNumBModels; ++pBModelNum )
+  {
+    pBModel = &pOutdoor->pBModels[pBModelNum];
+    if ( X <= pBModel->sMaxX && X >= pBModel->sMinX &&
+         Y <= pBModel->sMaxY && Y >= pBModel->sMinY )
+    {
+      if ( pBModel->uNumFaces > 0 )
       {
         v39 = 0;
         for ( pFaceNum = 0; pFaceNum < pBModel->uNumFaces; ++pFaceNum )
         {
-          pFace = &pBModel->pFaces[v39];
+          pFace = &pBModel->pFaces[pFaceNum];
           if ( (pFace->uPolygonType == POLYGON_Floor || pFace->uPolygonType == POLYGON_InBetweenFloorAndWall)
             && !(pFace->uAttributes & 0x20000000)
             && X <= pFace->pBoundingBox.x2 && X >= pFace->pBoundingBox.x1
             && Y <= pFace->pBoundingBox.y2 && Y >= pFace->pBoundingBox.y1 )
           {
-            if ( pFace->uNumVertices )
-            {
+            
               for ( uint i = 0; i < pFace->uNumVertices; ++i)
               {
                 word_721040[2 * i] = pFace->pXInterceptDisplacements[i] + pBModel->pVertices.pVertices[pFace->pVertexIDs[i]].x;
@@ -504,7 +501,6 @@
                 word_721040[2 * i + 1] = pFace->pXInterceptDisplacements[i] + pBModel->pVertices.pVertices[pFace->pVertexIDs[i + 1]].x;
                 word_720F70[2 * i + 1] = pFace->pXInterceptDisplacements[i + 1] + pBModel->pVertices.pVertices[pFace->pVertexIDs[i + 1]].y;
               }
-            }
             word_721040[2 * pFace->uNumVertices] = word_721040[0];
             word_720F70[2 * pFace->uNumVertices] = word_720F70[0];
             v43 = word_720F70[0] >= Y;
@@ -553,11 +549,10 @@
               }
             }
           }
-          ++v39;
+
         }
       }
     }
-    ++v38;
   }
   if ( v46 == 1 )
   {
@@ -852,10 +847,10 @@
     side1_dy = (double)(x1z1_y - x1z2_y);
     side2_dy = (double)(x2z2_y - x1z2_y);
     side2_dx = (double)(grid_pos_x2 - grid_pos_x1);
-    side1_dx = (double)(grid_pos_x1 - grid_pos_x1);
-    side2_dz = (double)(grid_pos_z2 - grid_pos_z2);  // bug?  z2 - z2
-    side1_dz = (double)(grid_pos_z2 - grid_pos_z2);  //       z1 - z2
-    Log::Warning(L"%S %S %u\n", __FILE__, __FUNCTION__, __LINE__);
+    side1_dx = (double)(grid_pos_x1 - grid_pos_x2);
+    side2_dz = 0.0;//(double)(grid_pos_z2 - grid_pos_z2);  // bug?  z2 - z2 
+    side1_dz = (double)(grid_pos_z1 - grid_pos_z2);  //       z1 - z2 yes
+    //Log::Warning(L"%S %S %u\n", __FILE__, __FUNCTION__, __LINE__);
     /*       |\
        side1 |  \
              |____\
@@ -866,8 +861,8 @@
     side1_dy = (double)(x2z2_y - x2z1_y);
     side2_dy = (double)(x1z1_y - x2z1_y);
     side2_dx = (double)(grid_pos_x1 - grid_pos_x2);
-    side1_dx = (double)(grid_pos_x2 - grid_pos_x2);
-    side2_dz = (double)(grid_pos_z1 - grid_pos_z1);
+    side1_dx = (double)(grid_pos_x2 - grid_pos_x1);
+    side2_dz = 0.0;//(double)(grid_pos_z1 - grid_pos_z1); 
     side1_dz = (double)(grid_pos_z2 - grid_pos_z1);
 
     /*   side 2
--- a/mm7_5.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/mm7_5.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -4,6 +4,8 @@
 
 #include <assert.h>
 
+#include "Texture.h"
+#include "mm7_data.h"
 #include "VideoPlayer.h"
 #include "Sprites.h"
 #include "MapInfo.h"
@@ -15,7 +17,8 @@
 #include "Keyboard.h"
 #include "GammaControl.h"
 #include "stru11.h"
-
+#include "mm7_data.h"
+#include "FactionTable.h"
 #include "Vis.h"
 #include "mm7.h"
 #include "Game.h"
@@ -45,7 +48,8 @@
 #include "texts.h"
 #include "Log.h"
 #include "UIHouses.h"
-#include "mm7_data.h"
+#include "Lights.h"
+#include "Lights.h"
 
 //----- (004304E7) --------------------------------------------------------
 void __cdecl GameUI_MsgProc()
@@ -3625,6 +3629,50 @@
   this->z = (1.0 / sqrt(this->x * this->x + this->y * this->y + this->z * this->z)) * this->z;
 }
 
+//----- (00438526) --------------------------------------------------------
+stru11::stru11()
+{
+  stru11 *v1; // esi@1
+  signed int v2; // eax@1
+  char *v3; // edx@1
+
+  v1 = this;
+  v2 = 0;
+  this->cpuid_00000000_eax_numops = 0;
+  this->cpuid_00000001_eax = 0;
+  this->cpuid_00000001_edx = 0;
+  this->field_38 = 0;
+  this->field_3C = 0;
+  this->cpuid_80000000_edx = 0;
+  this->cpuid_80000001_eax = 0;
+  this->cpuid_80000001_edx = 0;
+  this->cpuid_80000005_ebx = 0;
+  this->cpuid_80000005_ecx = 0;
+  this->cpuid_80000005_edx = 0;
+  this->cpuid_80000006_ecx = 0;
+  this->field_AC = 0;
+  this->uProcessorManufacturer = 0;
+  LOBYTE(this->cpuid_80000002_registers2[0]) = 0;
+  v3 = (char *)&this->cpuid_00000002_eax;
+  do
+  {
+    if ( v2 < 3 )
+      *((int *)v3 - 9) = 0;
+    if ( v2 < 4 )
+      *(int *)v3 = 0;
+    if ( v2 < 12 )
+      *((int *)v3 + 17) = 0;
+    if ( v2 < 13 )
+      this->pCPUString[v2] = 0;
+    if ( v2 < 30 )
+      *((char *)this->field_40 + v2) = 0;
+    *((char *)&this->cpuid_80000002_registers2[0] + v2++ + 1) = 0;
+    v3 += 4;
+  }
+  while ( v2 < 48 );
+  CheckCPU();
+}
+
 //----- (004385B5) --------------------------------------------------------
 void stru11::CheckCPU()
 {
@@ -6886,7 +6934,8 @@
           v20 = 0;
         }
         if (PID_TYPE(v22) == OBJECT_Actor)
-          v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[PID_ID(v22)].pMonsterInfo.uID].uID - 1) / 3] + (v5->pMonsterInfo.uID - 1) / 3);
+          //v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[PID_ID(v22)].pMonsterInfo.uID].uID - 1) / 3] + (v5->pMonsterInfo.uID - 1) / 3);
+          v10 = pFactionTable->relations[(pMonsterStats->pInfos[pActors[PID_ID(v22)].pMonsterInfo.uID].uID) / 3 + 1][(v5->pMonsterInfo.uID - 1) / 3 + 1];
         else
           v10 = 4;
         if ( v10 == 1 )
--- a/mm7_data.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/mm7_data.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -61,8 +61,6 @@
 int num_achieved_awards;
 int num_achieved_awards_2;
 
-#include "stru159.h"
-
 #include "stru160.h"
 std::array<stru160, 66> array_4EB8B8 =
 {{
@@ -572,8 +570,6 @@
 int bWinNT4_0; // weak
 std::array<__int16, 11> word_4E8152 = {0, 0, 0, 90, 8, 2, 70, 20, 10, 50, 30};
 
-stru355 stru_4E82A4 = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000};
-stru355 stru_4EFCBC = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000};
 char byte_4E94D0 = 5; // weak
 char byte_4E94D1 = 9; // weak
 char _4E94D2_light_type = 6; // weak
@@ -892,65 +888,15 @@
 std::array<int, 500> ai_near_actors_distances;
 std::array<unsigned int, 500> ai_near_actors_ids;
 std::array<int, 121> dword_4F8580; // weak
-int dword_4FA9B0[777]; // weak
-int dword_4FA9B4[777]; // weak
-char byte_4FAA00; // weak
-std::array<__int16, 12> am_sounds;
+
+
+
 _UNKNOWN unk_4FAA20; // weak
 char byte_4FAA24; // weak
 HWND dword_4FAA28; // idb
 
 
-char byte_4FAA2E; // weak
-int amuint_4FAA34; // weak
-int amuint_4FAA38; // weak
 
-int amuint_4FAA4C; // weak
-
-
-
-
-int dword_4FAA70; // weak
-char byte_4FAA74; // weak
-char am_byte_4FAA75; // weak
-char am_byte_4FAA76; // weak
-
-
-char am_byte_4FAA7C[777]; // weak
-
-int amuint_4FAA88[777]; // weak
-int amuint_4FAA8C[777]; // weak
-int amuint_4FAA90[777][2];
-
-
-
-int amuint_4FABC4; // weak
-
-char byte_4FABD0[777]; // weak
-char byte_4FABD1[777]; // weak
-_UNKNOWN unk_4FABD4; // weak
-int dword_4FABD8[777]; // weak
-int dword_4FABDC[777]; // weak
-int dword_4FABE0[777]; // weak
-int dword_4FABE4[777]; // weak
-int dword_4FABE8[777]; // weak
-int dword_4FABEC[777]; // weak
-int dword_4FABF0[777]; // weak
-int dword_4FABF4[777]; // weak
-int dword_4FABF8[777]; // weak
-int dword_4FABFC[777]; // weak
-int dword_4FAC00[777]; // weak
-int dword_4FAC04[777]; // weak
-int dword_4FAC08[777]; // weak
-int dword_4FAC0C[777]; // weak
-_UNKNOWN unk_5052C8; // weak
-
-
-
-
-
-char byte_505880; // weak
-char byte_505881; // weak
 
 int dword_505890; // weak
 std::array<unsigned int, 480> pSRZBufferLineOffsets;
@@ -964,8 +910,8 @@
 __int64 qword_506350; // weak
 char byte_506360; // weak
 int dword_506364; // weak
-Texture *dword_506404[12]; // weak
-Texture *dword_50640C[12]; // weak
+//Texture *dword_506404[12]; // weak
+//Texture *dword_50640C[12]; // weak
 unsigned int uExitCancelTextureId;
 int dword_50651C; // weak
 int dword_506528; // weak
@@ -1191,7 +1137,7 @@
 char *pSkillDescTXT_Raw;
 
 struct FactionTable *pFactionTable;
-std::array<char, 777> byte_5C8D1A; // weak
+//std::array<char, 777> byte_5C8D1A; // weak
 
 std::array<char, 777> byte_5E4C15; // weak
 std::array<char *, 14> pSomeItemsNames;
--- a/mm7_data.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/mm7_data.h	Fri Jun 14 16:06:30 2013 +0600
@@ -3,9 +3,11 @@
 #include "VectorTypes.h"
 #include "OSAPI.h"
 #include <array>
+#include "Items.h"    //TODO: remove this once sub_467E7F_EquipBody if moved to a class or something
 typedef char _UNKNOWN;
 
 
+
 typedef unsigned int uint;
 
 
@@ -463,9 +465,8 @@
 extern int bWinNT4_0; // weak
 extern std::array<__int16, 11> word_4E8152;
 extern std::array< std::array<char, 14>, 7> byte_4E8168;
-#include "Texture.h"
-extern stru355 stru_4E82A4;// = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000};
-extern stru355 stru_4EFCBC;// = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000};
+//extern stru355 stru_4E82A4;// = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000};  moved to texture.h
+//extern stru355 stru_4EFCBC;// = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000};  moved to texture.h
 extern char byte_4E94D0; // weak
 extern char _4E94D2_light_type; // weak
 extern char byte_4E94D3; // weak
@@ -530,58 +531,12 @@
 extern std::array<int, 121> dword_4F8580; // weak
 extern int dword_4FA9B0[]; // weak
 extern int dword_4FA9B4[]; // weak
-extern char byte_4FAA00; // weak
-extern std::array<__int16, 12> am_sounds;
+
 extern _UNKNOWN unk_4FAA20; // weak
 extern char byte_4FAA24; // weak
 extern HWND dword_4FAA28; // idb
 
-extern char byte_4FAA2E; // weak
-extern int amuint_4FAA34; // weak
-extern int amuint_4FAA38; // weak
 
-extern int amuint_4FAA4C; // weak
-
-
-extern int dword_4FAA70; // weak
-extern char byte_4FAA74; // weak
-extern char am_byte_4FAA75; // weak
-extern char am_byte_4FAA76; // weak
-
-
-extern char am_byte_4FAA7C[777]; // weak
-
-extern int amuint_4FAA88[777]; // weak
-extern int amuint_4FAA8C[777]; // weak
-extern int amuint_4FAA90[777][2];
-
-
-
-extern int amuint_4FABC4; // weak
-
-extern char byte_4FABD0[]; // weak
-extern char byte_4FABD1[]; // weak
-extern _UNKNOWN unk_4FABD4; // weak
-extern int dword_4FABD8[]; // weak
-extern int dword_4FABDC[]; // weak
-extern int dword_4FABE0[]; // weak
-extern int dword_4FABE4[]; // weak
-extern int dword_4FABE8[]; // weak
-extern int dword_4FABEC[]; // weak
-extern int dword_4FABF0[]; // weak
-extern int dword_4FABF4[]; // weak
-extern int dword_4FABF8[]; // weak
-extern int dword_4FABFC[]; // weak
-extern int dword_4FAC00[]; // weak
-extern int dword_4FAC04[]; // weak
-extern int dword_4FAC08[]; // weak
-extern int dword_4FAC0C[]; // weak
-extern _UNKNOWN unk_5052C8; // weak
-
-extern char byte_5054C8[32]; // idb
-
-extern char byte_505880; // weak
-extern char byte_505881; // weak
 
 extern int dword_505890; // weak
 extern std::array<unsigned int, 480> pSRZBufferLineOffsets;
@@ -595,7 +550,7 @@
 extern __int64 qword_506350; // weak
 extern char byte_506360; // weak
 extern int dword_506364; // weak
-extern Texture *dword_50640C[]; // weak
+//extern Texture *dword_50640C[]; // weak
 extern unsigned int uExitCancelTextureId;
 extern int dword_50651C; // weak
 extern int dword_506528; // weak
@@ -823,7 +778,7 @@
 extern char *pStatsTXT_Raw;
 extern char *pSkillDescTXT_Raw;
 extern struct FactionTable *pFactionTable;
-extern std::array<char, 777> byte_5C8D1A; // weak
+//extern std::array<char, 777> byte_5C8D1A; // weak
 
 extern std::array<char, 777> byte_5E4C15; // weak
 extern std::array<char *, 14> pSomeItemsNames;
@@ -1154,7 +1109,7 @@
 int loc_40E4FC(); // weak
 void __fastcall ZBuffer_Fill(int *pZBuffer, int uTextureId, int iZValue);
 
-void __fastcall ZBuffer_DoFill(int *pZBuffer, Texture *pTex, int uZValue);
+void __fastcall ZBuffer_DoFill(int *pZBuffer, struct Texture *pTex, int uZValue);
 void __fastcall sub_40F92A(int *pZBuffer, struct Texture *a2, int a3); // idb
 void __cdecl SetMoonPhaseNames();
 signed int __fastcall sub_410D99_get_map_index(int a1);
@@ -1389,7 +1344,6 @@
 enum MENU_STATE GetCurrentMenuID();
 void *__thiscall output_debug_string(void *_this, std::string a2, const char *a3, int a4);
 std::string *__fastcall _4678E2_make_error_string(std::string *a1, int line, std::string file);
-#include "Items.h"
 void sub_467E7F_EquipBody(ITEM_EQUIP_TYPE uEquipType); // idb
 void  CreateMsgScrollWindow(signed int mscroll_id);
 void __cdecl free_book_subwindow();
--- a/stru11.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/stru11.h	Fri Jun 14 16:06:30 2013 +0600
@@ -1,54 +1,12 @@
 #pragma once
 
 
-#include "mm7_data.h"
 /*  128 */
 #pragma pack(push, 1)
 struct stru11
 {
-  //----- (00438526) --------------------------------------------------------
-  stru11()
-  {
-  stru11 *v1; // esi@1
-  signed int v2; // eax@1
-  char *v3; // edx@1
 
-  v1 = this;
-  v2 = 0;
-  this->cpuid_00000000_eax_numops = 0;
-  this->cpuid_00000001_eax = 0;
-  this->cpuid_00000001_edx = 0;
-  this->field_38 = 0;
-  this->field_3C = 0;
-  this->cpuid_80000000_edx = 0;
-  this->cpuid_80000001_eax = 0;
-  this->cpuid_80000001_edx = 0;
-  this->cpuid_80000005_ebx = 0;
-  this->cpuid_80000005_ecx = 0;
-  this->cpuid_80000005_edx = 0;
-  this->cpuid_80000006_ecx = 0;
-  this->field_AC = 0;
-  this->uProcessorManufacturer = 0;
-  LOBYTE(this->cpuid_80000002_registers2[0]) = 0;
-  v3 = (char *)&this->cpuid_00000002_eax;
-  do
-  {
-    if ( v2 < 3 )
-      *((int *)v3 - 9) = 0;
-    if ( v2 < 4 )
-      *(int *)v3 = 0;
-    if ( v2 < 12 )
-      *((int *)v3 + 17) = 0;
-    if ( v2 < 13 )
-      this->pCPUString[v2] = 0;
-    if ( v2 < 30 )
-      *((char *)this->field_40 + v2) = 0;
-    *((char *)&this->cpuid_80000002_registers2[0] + v2++ + 1) = 0;
-    v3 += 4;
-  }
-  while ( v2 < 48 );
-  CheckCPU();
-  }
+  stru11();
 
   void CheckCPU();
   void RunCPUID();
--- a/stru298.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/stru298.h	Fri Jun 14 16:06:30 2013 +0600
@@ -1,5 +1,4 @@
 #pragma once
-#include "VectorTypes.h"
 
 /*  303 */
 #pragma pack(push, 1)
--- a/stru6.cpp	Fri Jun 14 16:06:20 2013 +0600
+++ b/stru6.cpp	Fri Jun 14 16:06:30 2013 +0600
@@ -20,6 +20,7 @@
 #include "Overlays.h"
 #include "stru160.h"
 #include "Math.h"
+#include "Lights.h"
 
 #include "MM7.h"
 
--- a/stru6.h	Fri Jun 14 16:06:20 2013 +0600
+++ b/stru6.h	Fri Jun 14 16:06:30 2013 +0600
@@ -1,5 +1,4 @@
 #pragma once
-#include "Render.h"
 
 
 /*  120 */