changeset 2380:56f87a5c402b

Merge
author Grumpy7
date Sat, 21 Jun 2014 00:42:34 +0200
parents e07e297f292d (current diff) 48dbf99c0f7f (diff)
children cb84b457527c eff78dab2142
files Vis.cpp
diffstat 27 files changed, 761 insertions(+), 895 deletions(-) [+]
line wrap: on
line diff
--- a/Actor.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/Actor.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -240,18 +240,13 @@
   int v48; // ecx@110
   int v51; // ecx@130
   int v54; // ecx@138
-  //Player *v57; // esi@145
-  //int v58; // eax@146
   int v59; // edi@146
-  //int v60; // eax@146
   int v61; // edi@146
-  //int v62; // eax@146
   signed int v63; // edi@146
   int v68; // edi@168
   signed int v70; // ecx@172
   int v79; // edx@185
   int v80; // eax@185
-  //signed int v89; // ecx@192
   signed int v91; // eax@200
   int v94; // ecx@208
   int v96; // ecx@217
@@ -706,11 +701,13 @@
   unsigned int v3; // edi@1
 
   v2 = a1->uAlly;
-  v3 = a2->uAlly;
-  if ( !v2 )
+  if ( !a1->uAlly )
     v2 = (a1->pMonsterInfo.uID - 1) / 3 + 1;
-  if ( !v3 )
+
+  v3 = a2->uAlly;
+  if ( !a2->uAlly )
     v3 = (a2->pMonsterInfo.uID - 1) / 3 + 1;
+
   if ( v2 >= 39 && v2 <= 44 && v3 >= 39 && v3 <= 44
     || v2 >= 45 && v2 <= 50 && v3 >= 45 && v3 <= 50
     || v2 >= 51 && v2 <= 62 && v3 >= 51 && v3 <= 62
@@ -760,12 +757,9 @@
 //----- (00404874) --------------------------------------------------------
 void Actor::AI_RangedAttack( unsigned int uActorID, struct AIDirection *pDir, int type, char a4 )
 {
-  //Actor *actPtr; // esi@1
   char specAb; // al@1
   int v13; // edx@28
 
-  //actPtr = &pActors[uActorID];
-
   SpriteObject a1; // [sp+Ch] [bp-74h]@1
 
   switch ( type )
@@ -825,12 +819,12 @@
     return;
   }
   a1.stru_24.Reset();
+  a1.spell_id = 0;
   a1.vPosition.x = pActors[uActorID].vPosition.x;
-  a1.spell_id = 0;
   a1.vPosition.y = pActors[uActorID].vPosition.y;
+  a1.vPosition.z = pActors[uActorID].vPosition.z - (unsigned int)(pActors[uActorID].uActorHeight * -0.75);
   a1.spell_level = 0;
   a1.spell_skill = 0;
-  a1.vPosition.z = pActors[uActorID].vPosition.z - (unsigned int)(pActors[uActorID].uActorHeight * -0.75);
   a1.uFacing = pDir->uYawAngle;
   a1.uSoundID = 0;
   a1.uAttributes = 0;
@@ -1103,7 +1097,6 @@
 {
   AIDirection *v7; // eax@3
   AIDirection v1; // eax@3
-  //Actor *v9; // ebx@3
   AIDirection a3; // [sp+8h] [bp-38h]@4
 
   if ( rand() % 100 >= 5 )
@@ -1133,7 +1126,8 @@
 //----- (00403F58) --------------------------------------------------------
 void Actor::AI_StandOrBored(unsigned int uActorID, signed int uObjID, int uActionLength, AIDirection *a4)
 {
-  if (rand() % 2)
+  //движется или стоит определяется случайно(1 - движется, 0 - стоит)
+  if (rand() % 2)//0 or 1
     AI_Bored(uActorID, uObjID, a4);
   else
     AI_Stand(uActorID, uObjID, uActionLength, a4);
@@ -1154,7 +1148,7 @@
 
   pActors[uActorID].uAIState = Standing;
   if (!uActionLength)
-    pActors[uActorID].uCurrentActionLength = rand() % 256 + 256;
+    pActors[uActorID].uCurrentActionLength = rand() % 256 + 256;// от 256 до 256 + 256 
   else
     pActors[uActorID].uCurrentActionLength = uActionLength;
   pActors[uActorID].uCurrentActionTime = 0;
@@ -1181,7 +1175,7 @@
 //----- (00403C6C) --------------------------------------------------------
 void Actor::AI_MeleeAttack(unsigned int uActorID, signed int sTargetPid, struct AIDirection *arg0)
 {
-  Actor *v3; // ebx@1
+  //Actor *v3; // ebx@1
   int16_t v6; // esi@6
   int16_t v7; // edi@6
   signed int v8; // eax@7
@@ -1192,8 +1186,10 @@
   int v23; // [sp+4Ch] [bp-8h]@6
   unsigned int v25; // [sp+5Ch] [bp+8h]@13
 
-  v3 = &pActors[uActorID];
-  if ( v3->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY && v3->pMonsterInfo.uAIType == 1 )
+  assert(uActorID < uNumActors);
+
+  //v3 = &pActors[uActorID];
+  if ( pActors[uActorID].pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY && pActors[uActorID].pMonsterInfo.uAIType == 1 )
   {
     Actor::AI_Stand(uActorID, sTargetPid, 0, arg0);
     return;
@@ -1217,9 +1213,10 @@
     Error("Should not get here");
     return;
   }
-  v10.z = (int32_t)(v3->uActorHeight * 0.75 + v3->vPosition.z);
-  v10.y = v3->vPosition.y;
-  v10.x = v3->vPosition.x;
+
+  v10.x = pActors[uActorID].vPosition.x;
+  v10.y = pActors[uActorID].vPosition.y;
+  v10.z = (int32_t)(pActors[uActorID].uActorHeight * 0.75 + pActors[uActorID].vPosition.z);
 
   if ( sub_407A1C((int)v6, (int)v7, v23, v10) )
   {
@@ -1230,22 +1227,22 @@
       Actor::GetDirectionInfo(PID(OBJECT_Actor, uActorID), sTargetPid, &a3, 0);
       v12 = &a3;
     }
-    v3->uYawAngle = LOWORD(v12->uYawAngle);
-    v3->uCurrentActionLength = pSpriteFrameTable->pSpriteSFrames[v3->pSpriteIDs[ANIM_AtkMelee]].uAnimLength * 8;
-    v3->uCurrentActionTime = 0;
-    v3->uAIState = AttackingMelee;
+    pActors[uActorID].uYawAngle = LOWORD(v12->uYawAngle);
+    pActors[uActorID].uCurrentActionLength = pSpriteFrameTable->pSpriteSFrames[pActors[uActorID].pSpriteIDs[ANIM_AtkMelee]].uAnimLength * 8;
+    pActors[uActorID].uCurrentActionTime = 0;
+    pActors[uActorID].uAIState = AttackingMelee;
     Actor::PlaySound(uActorID, 0);
-    v25 = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uRecoveryTime;
-    if ( v3->pActorBuffs[ACTOR_BUFF_SLOWED].uExpireTime > 0 )
+    v25 = pMonsterStats->pInfos[pActors[uActorID].pMonsterInfo.uID].uRecoveryTime;
+    if ( pActors[uActorID].pActorBuffs[ACTOR_BUFF_SLOWED].uExpireTime > 0 )
       v25 *= 2;
     if ( pParty->bTurnBasedModeOn != 1 )
-      v3->pMonsterInfo.uRecoveryTime = (int)(flt_6BE3A8_debug_recmod2 * v25 * 2.133333333333333);
+      pActors[uActorID].pMonsterInfo.uRecoveryTime = (int)(flt_6BE3A8_debug_recmod2 * v25 * 2.133333333333333);
     else
-      v3->pMonsterInfo.uRecoveryTime = v25;
-    v3->vVelocity.z = 0;
-    v3->vVelocity.y = 0;
-    v3->vVelocity.x = 0;
-    v3->UpdateAnimation();
+      pActors[uActorID].pMonsterInfo.uRecoveryTime = v25;
+    pActors[uActorID].vVelocity.z = 0;
+    pActors[uActorID].vVelocity.y = 0;
+    pActors[uActorID].vVelocity.x = 0;
+    pActors[uActorID].UpdateAnimation();
   }
   else
 	Actor::AI_Pursue1(uActorID, sTargetPid, rand() % 2, 64, arg0);
@@ -4541,51 +4538,19 @@
 //----- (004016FA) --------------------------------------------------------
 int  Actor::MakeActorAIList_BLV()
 {
-  //Actor *v0; // esi@2
   int v1; // eax@4
-  //  int v2; // ebx@4
-  //  unsigned int v3; // ecx@4
-  //  int v4; // edx@5
-  //  int v5; // edx@7
-  //  unsigned int v6; // edx@9
-  unsigned int v7; // ST24_4@10
-  //  int v8; // eax@10
   int v9; // edi@10
-  //  int v10; // ebx@14
-  //  char v11; // zf@16
-  int v12; // eax@22
   int v13; // edx@24
-  //  int v14; // ecx@25
-  int v15; // ebx@26
-  //  unsigned int *v16; // ecx@27
-  unsigned int v17; // esi@27
   int v18; // ecx@31
   signed int v19; // edi@31
-  //  Actor *v20; // esi@32
-  //  bool v21; // eax@33
-  //  int v22; // eax@34
-  //  signed int v23; // ebx@36
-  //  Actor *v24; // esi@37
   signed int v25; // eax@40
-  //  int v26; // eax@43
-  int v27; // ebx@45
   int j; // edi@45
-  //  unsigned int v29; // eax@46
   int v30; // eax@48
-  //  int v31; // ecx@51
-  //  int v32; // eax@51
-  //  signed int v33; // eax@53
-  //  __int64 v34; // qax@55
-  //  char *v35; // ecx@56
   int v37; // [sp+Ch] [bp-18h]@1
   int v38; // [sp+10h] [bp-14h]@4
   int v39; // [sp+14h] [bp-10h]@4
-  //int v40; // [sp+18h] [bp-Ch]@10
-  //  int v41; // [sp+18h] [bp-Ch]@29
   int i; // [sp+18h] [bp-Ch]@31
-  //signed int v43; // [sp+1Ch] [bp-8h]@1
-  //  signed int v44; // [sp+1Ch] [bp-8h]@25
-  int v45; // [sp+20h] [bp-4h]@1
+  uint v45; // [sp+20h] [bp-4h]@1
 
   //  __debugbreak(); // refactor for blv ai
   pParty->uFlags &= 0xFFFFFFCFu;
@@ -4599,11 +4564,11 @@
       pActors[i].uAttributes &= 0xBF00;
       continue;
     }
-    v39 = abs(pParty->vPosition.z - pActors[i].vPosition.z);
+    v1 = abs(pParty->vPosition.x - pActors[i].vPosition.x);
     v38 = abs(pParty->vPosition.y - pActors[i].vPosition.y);
-    v1 = abs(pParty->vPosition.x - pActors[i].vPosition.x);
-    v7 = int_get_vector_length(v39, v38, v1);
-    v9 = v7 - pActors[i].uActorRadius;
+    v39 = abs(pParty->vPosition.z - pActors[i].vPosition.z);
+
+    v9 = int_get_vector_length(v39, v38, v1) - pActors[i].uActorRadius;
     if ( v9 < 0 )
       v9 = 0;
     if ( v9 < 10240 )
@@ -4617,9 +4582,9 @@
         if ( !(pParty->uFlags & 0x20) && v9 < 5120 )
           pParty->uFlags |= 0x20;
       }
-      v12 = v45++;
-      ai_near_actors_distances[v12] = v9;
-      ai_near_actors_ids[v12] = i;
+      ai_near_actors_distances[v45] = v9;
+      ai_near_actors_ids[v45] = i;
+	  v45++;
     }
     else
       pActors[i].uAttributes &= 0xBF00;
@@ -4631,14 +4596,12 @@
     {
       for ( uint j = 1; j < v45; ++j )
       {
-        v15 = ai_near_actors_distances[v13];
         if ( ai_near_actors_distances[v13] > ai_near_actors_distances[j] )
         {
-          v17 = ai_near_actors_ids[v13];
           ai_near_actors_ids[v13] = ai_near_actors_ids[j];
-          ai_near_actors_ids[j] = v17;
+          ai_near_actors_ids[j] = ai_near_actors_ids[v13];
           ai_near_actors_distances[v13] = ai_near_actors_distances[j];
-          ai_near_actors_distances[j] = v15;
+          ai_near_actors_distances[j] = ai_near_actors_distances[v13];
         }
       }
       ++v13;
@@ -4687,21 +4650,19 @@
       }
     }
   }
-  v27 = ai_arrays_size;
   for ( j = 0; j < v45; ++j )
   {
-    //v29 = ai_near_actors_ids[j];
     if ( pActors[ai_near_actors_ids[j]].uAttributes & 0xC000 && pActors[ai_near_actors_ids[j]].CanAct() )
     {
       v30 = 0;
-      if ( v27 <= 0 )
+      if ( ai_arrays_size <= 0 )
         ai_array_4F6638_actor_ids[ai_arrays_size++] = ai_near_actors_ids[j];
       else
       {
         while ( ai_array_4F6638_actor_ids[v30] != ai_near_actors_ids[j] )
         {
           ++v30;
-          if ( v30 >= v27 )
+          if ( v30 >= ai_arrays_size )
           {
             ai_array_4F6638_actor_ids[ai_arrays_size++] = ai_near_actors_ids[j];
             break;
@@ -4724,20 +4685,13 @@
 bool __fastcall sub_4070EF_prolly_detect_player(unsigned int uObjID, unsigned int uObj2ID)
 {
   signed int v2; // eax@1
-//  int v5; // ecx@2
   int obj1_sector; // eax@4
   float v8; // ST24_4@5
-//  double v9; // ST18_8@5
-//  int v11; // ecx@6
   signed int v12; // eax@7
-//  int v13; // esi@7
-//  int v14; // esi@8
-//  int v15; // esi@9
   int obj2_z; // edi@11
   int obj2_x; // esi@11
   int obj2_sector; // eax@13
   float v20; // ST24_4@14
-//  double v21; // ST18_8@14
   int dist_x; // ebx@16
   signed int dist_3d; // ecx@16
   int v25; // eax@18
@@ -4748,10 +4702,7 @@
   int v33; // ST54_4@44
   int v34; // eax@44
   signed int v38; // esi@45
-//  signed __int64 v40; // qtt@50
   __int16 next_sector; // bx@58
-//  int v43; // [sp-8h] [bp-70h]@11
-//  int v44; // [sp-4h] [bp-6Ch]@11
   int v47; // [sp+18h] [bp-50h]@20
   int v48; // [sp+1Ch] [bp-4Ch]@20
   int v49; // [sp+20h] [bp-48h]@20
@@ -4909,8 +4860,9 @@
 	}
 	  
 	v32 = fixpoint_mul(v29->pFacePlane_old.vNormal.x,v49);
+	v34 = fixpoint_mul(v29->pFacePlane_old.vNormal.y,v48);
 	v33 = fixpoint_mul(v29->pFacePlane_old.vNormal.z,v47);
-	v34 = fixpoint_mul(v29->pFacePlane_old.vNormal.y,v48);
+
 	v59 = v32 + v33 + v34;
 	if ( v59 )
 	{
@@ -4989,35 +4941,27 @@
 {
   unsigned int v1; // ebx@1
   bool result; // eax@2
-  MonsterDesc *v3; // esi@5
-  MonsterInfo *v4; // edi@5
-  Vec3_int_ v5; // ST08_12@5
   unsigned int v6; // ecx@5
-  Actor *v7; // eax@7
   Actor actor; // [sp+4h] [bp-350h]@5
   Vec3_int_ pOut; // [sp+348h] [bp-Ch]@5
 
   v1 = uMonsterID;
   if ( uNumActors == 499 )
-  {
     result = 0;
-  }
   else
   {
     if ( (signed int)uMonsterID >= (signed int)pMonsterList->uNumMonsters )
       v1 = 0;
-    v3 = &pMonsterList->pMonsters[v1];
-    v4 = &pMonsterStats->pInfos[v1 + 1];
-    memset(&actor, 0, 0x344u);
-    strcpy(actor.pActorName, v4->pName);
-    actor.sCurrentHP = LOWORD(v4->uHP);
-    memcpy(&actor.pMonsterInfo, &pMonsterStats->pInfos[v1 + 1], 0x58u);
+    memset(&actor, 0, sizeof(Actor));
+    strcpy(actor.pActorName, pMonsterStats->pInfos[v1 + 1].pName);
+    actor.sCurrentHP = LOWORD(pMonsterStats->pInfos[v1 + 1].uHP);
+    memcpy(&actor.pMonsterInfo, &pMonsterStats->pInfos[v1 + 1], sizeof(MonsterInfo));
     actor.word_000086_some_monster_id = v1 + 1;
-    actor.uActorRadius = v3->uMonsterRadius;
-    actor.uActorHeight = v3->uMonsterHeight;
-    actor.uMovementSpeed = v3->uMovementSpeed;
-    v5 = pParty->vPosition;
-    Vec3_int_::Rotate(200, pParty->sRotationY, 0, v5, &pOut.x, &pOut.z, &pOut.y);
+    actor.uActorRadius = pMonsterList->pMonsters[v1].uMonsterRadius;
+    actor.uActorHeight = pMonsterList->pMonsters[v1].uMonsterHeight;
+    actor.uMovementSpeed = pMonsterList->pMonsters[v1].uMovementSpeed;
+
+    Vec3_int_::Rotate(200, pParty->sRotationY, 0, pParty->vPosition, &pOut.x, &pOut.z, &pOut.y);
     actor.vInitialPosition.x = pOut.x;
     actor.vPosition.x = pOut.x;
     actor.uTetherDistance = 256;
@@ -5033,9 +4977,8 @@
       dword_5C6DF8 = 0;
       v6 = uNumActors++;
     }
-    v7 = &pActors[v6];
-    memcpy(v7, &actor, 0x344u);
-    v7->PrepareSprites(1);
+    memcpy(&pActors[v6], &actor, sizeof(Actor));
+    pActors[v6].PrepareSprites(1);
     result = 1;
   }
   return result;
@@ -5046,163 +4989,99 @@
 //----- (0044FA4C) --------------------------------------------------------
 signed int __fastcall sub_44FA4C_spawn_light_elemental(int a1, int a2, int a3)
 {
-  signed int v3; // ecx@6
-  Actor *v4; // edx@7
   signed int result; // eax@13
-  Actor *v6; // esi@16
-  char *v7; // ebx@16
-  MonsterDesc *v8; // edi@16
-  unsigned __int16 v9; // ax@16
   int v10; // ebx@16
-  //int v11; // edi@16
-  //int v12; // eax@16
-  //int v13; // ecx@16
-  //int v14; // ebx@16
   const char *v15; // [sp-4h] [bp-24h]@2
-  //unsigned __int16 v16; // [sp+0h] [bp-20h]@1
-  //int v17; // [sp+4h] [bp-1Ch]@1
   unsigned int uFaceID; // [sp+8h] [bp-18h]@16
   int v19; // [sp+Ch] [bp-14h]@16
   size_t v20; // [sp+10h] [bp-10h]@6
   int v21; // [sp+14h] [bp-Ch]@14
-  //int v22; // [sp+18h] [bp-8h]@14
   unsigned int v23; // [sp+1Ch] [bp-4h]@6
 
-  //v16 = a2;
-  //v17 = a1;
   if ( a2 == 4 )
-  {
     v15 = "Elemental Light C";
-  }
   else if ( a2 == 3 )
     v15 = "Elemental Light B";
   else
     v15 = "Elemental Light A";
 
   v23 = pMonsterList->GetMonsterIDByName(v15);
-  v3 = 0;
-  v20 = uNumActors;
-  if ( (signed int)uNumActors > 0 )
+  v20 = 0;
+  for ( v20; v20 < uNumActors; v20++ )
   {
-    v4 = pActors.data();//[0].uAIState;
-    while ( v4->uAIState != Removed )
-    {
-      ++v3; 
-      ++v4;
-      if ( v3 >= (signed int)uNumActors )
-        break;
-    }
-    if( v3 < (signed int)uNumActors )
-      v20 = v3;
+    if ( pActors[v20].uAIState == Removed )
+      break;
   }
-  if ( v20 != uNumActors || (result = uNumActors + 1, (signed int)(uNumActors + 1) < 500) )
+
+  result = uNumActors + 1;
+  if ( v20 != uNumActors ||  result < 500 )
   {
     v21 = 0;
-    //v22 = pParty->vPosition.z;
     if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
       v21 = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z);
-    v6 = &pActors[v20];
-    v7 = (char *)&pMonsterStats->pInfos[v23 + 1];
     v19 = (((uCurrentlyLoadedLevelType != LEVEL_Outdoor) - 1) & 0x40) + 64;
-    v6->Reset();
-    v8 = &pMonsterList->pMonsters[v23];
-    strcpy(v6->pActorName, *(const char **)v7);
-    v6->sCurrentHP = *((short *)v7 + 32);
-    memcpy(&v6->pMonsterInfo, v7, 0x58u);
-    v6->word_000086_some_monster_id = v23 + 1;
-    v6->uActorRadius = v8->uMonsterRadius;
-    v6->uActorHeight = v8->uMonsterHeight;
-    v9 = v8->uMovementSpeed;
-    v6->pMonsterInfo.uTreasureDiceRolls = 0;
-    v6->pMonsterInfo.uTreasureType = 0;
-    v6->pMonsterInfo.uExp = 0;
-    v6->uMovementSpeed = v9;
+    pActors[v20].Reset();
+    strcpy(pActors[v20].pActorName, pMonsterStats->pInfos[v23 + 1].pName);
+    pActors[v20].sCurrentHP = pMonsterStats->pInfos[v23 + 1].uHP;
+    memcpy(&pActors[v20].pMonsterInfo, &pMonsterStats->pInfos[v23 + 1], sizeof(MonsterInfo));
+    pActors[v20].word_000086_some_monster_id = v23 + 1;
+    pActors[v20].uActorRadius = pMonsterList->pMonsters[v23].uMonsterRadius;
+    pActors[v20].uActorHeight = pMonsterList->pMonsters[v23].uMonsterHeight;
+    pActors[v20].pMonsterInfo.uTreasureDiceRolls = 0;
+    pActors[v20].pMonsterInfo.uTreasureType = 0;
+    pActors[v20].pMonsterInfo.uExp = 0;
+    pActors[v20].uMovementSpeed = pMonsterList->pMonsters[v23].uMovementSpeed;
     v10 = rand() % 2048;
-    //v11 = pParty->vPosition.x + fixpoint_mul(stru_5C6E00->Cos(v10), v19);
-    uFaceID = stru_5C6E00->Sin(v10);
-    //v12 = pParty->vPosition.y;
-    //v13 = fixpoint_mul(uFaceID, v19);
-    //v14 = pParty->vPosition.y + fixpoint_mul(uFaceID, v19);
-    //LOWORD(v12) = v22;
-    v6->vInitialPosition.x = pParty->vPosition.x + fixpoint_mul(stru_5C6E00->Cos(v10), v19);
-    v6->vPosition.x = v6->vInitialPosition.x;
-    v6->vInitialPosition.y = pParty->vPosition.y + fixpoint_mul(uFaceID, v19);
-    v6->vPosition.y = v6->vInitialPosition.y;
-    v6->vInitialPosition.z = pParty->vPosition.z;
-    v6->vPosition.z = v6->vInitialPosition.z;
-    //LOWORD(v12) = v21;
-    v6->uTetherDistance = 256;
-    v6->uSectorID = v21;
-    v6->PrepareSprites(0);
-    v6->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
-    v6->uAlly = 9999;
-    v6->uGroup = 0;
-    v6->uCurrentActionTime = 0;
-    v6->uAIState = Summoned;
-    v6->uCurrentActionLength = 256;
-    v6->UpdateAnimation();
+    pActors[v20].vInitialPosition.x = pParty->vPosition.x + fixpoint_mul(stru_5C6E00->Cos(v10), v19);
+    pActors[v20].vPosition.x = pActors[v20].vInitialPosition.x;
+    pActors[v20].vInitialPosition.y = pParty->vPosition.y + fixpoint_mul(stru_5C6E00->Sin(v10), v19);
+    pActors[v20].vPosition.y = pActors[v20].vInitialPosition.y;
+    pActors[v20].vInitialPosition.z = pParty->vPosition.z;
+    pActors[v20].vPosition.z = pActors[v20].vInitialPosition.z;
+    pActors[v20].uTetherDistance = 256;
+    pActors[v20].uSectorID = v21;
+    pActors[v20].PrepareSprites(0);
+    pActors[v20].pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
+    pActors[v20].uAlly = 9999;
+    pActors[v20].uGroup = 0;
+    pActors[v20].uCurrentActionTime = 0;
+    pActors[v20].uAIState = Summoned;
+    pActors[v20].uCurrentActionLength = 256;
+    pActors[v20].UpdateAnimation();
+
+    result = pIndoor->GetSector(pActors[v20].vPosition.x, pActors[v20].vPosition.y, pActors[v20].vPosition.z);
     if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor
-      || (result = pIndoor->GetSector(v6->vPosition.x, v6->vPosition.y, v6->vPosition.z),
-      result == v21)
-      && (result = BLV_GetFloorLevel(v6->vPosition.x, v6->vPosition.y, v6->vPosition.z, result, &uFaceID), result != -30000)
+      || result == v21
+	  && (result = BLV_GetFloorLevel(pActors[v20].vPosition.x, pActors[v20].vPosition.y, pActors[v20].vPosition.z, result, &uFaceID), result != -30000)
       && (result = abs(result - pParty->vPosition.z), result <= 1024) )
     {
       if ( v20 == uNumActors )
         ++uNumActors;
-      v6->uSummonerID = PID(OBJECT_Player, a1);
-      result = v6->pActorBuffs[ACTOR_BUFF_SUMMONED].Apply(pParty->uTimePlayed + (a3 * 128) / 30.0f,
-        a2,
-        a1,
-        0,
-        0);
+      pActors[v20].uSummonerID = PID(OBJECT_Player, a1);
+      result = pActors[v20].pActorBuffs[ACTOR_BUFF_SUMMONED].Apply(pParty->uTimePlayed + (a3 * 128) / 30.0f, a2, a1, 0, 0);
     }
   }
   return result;
 }
 
-
 //----- (0044F57C) --------------------------------------------------------
 void SpawnEncounter(MapInfo *pMapInfo, SpawnPointMM7 *spawn, int a3, int a4, int a5)
 {
-  //MapInfo *v5; // esi@1
-  //SpawnPointMM7 *v6; // ebx@1
   int v7; // eax@2
   char v8; // zf@5
-  //  int v9; // edi@9
-  //  int v10; // eax@9
-  //  int v11; // ecx@9
   int v12; // edx@9
-  //  int v13; // eax@9
-  //  int v14; // eax@14
-  //  int v15; // ecx@14
-  //  int v16; // eax@19
-  //  int v17; // ecx@19
   int v18; // esi@31
-  //int pPosX; // ecx@32
-  //int v20; // edx@32
-  //int v21; // eax@32
   Actor *pMonster; // esi@35
   int v23; // edx@36
   signed int v24; // edi@36
   int v25; // ecx@36
-  //  unsigned __int16 v26; // ax@47
   MonsterDesc *v27; // edi@48
   signed int v28; // eax@48
-  //  __int16 v29; // cx@50
-  //  __int16 v30; // ax@50
-  //  __int16 v31; // ax@50
   int v32; // eax@50
-  //  int v33; // edi@50
-  //  int v34; // eax@50
-  //  int v35; // eax@50
-  //  int v36; // eax@50
   int v37; // eax@51
   int v38; // eax@52
   int v39; // edi@52
   std::string v40; // [sp-18h] [bp-100h]@60
-  //  void *v41; // [sp-14h] [bp-FCh]@50
-  //void *v42; // [sp-10h] [bp-F8h]@50
-  //size_t v43; // [sp-Ch] [bp-F4h]@50
   const char *v44; // [sp-8h] [bp-F0h]@13
   char *pTexture; // [sp-4h] [bp-ECh]@9
   char Str[32]; // [sp+Ch] [bp-DCh]@60
@@ -5355,9 +5234,7 @@
           v24 = 2;
       }
       else
-      {
         v24 = 1;
-      }
       if ( v24 == 1 )
       {
         pTexture = Source;
--- a/AudioPlayer.h	Sat Jun 21 00:41:20 2014 +0200
+++ b/AudioPlayer.h	Sat Jun 21 00:42:34 2014 +0200
@@ -121,6 +121,7 @@
   SOUND_CloseBook = 231,
   SOUND_11090 = 11090,
   SOUND_12040 = 12040,
+  SOUND_Arena_Welcome = 14060,
   SOUND_20001 = 0x4E21,
 };
 
--- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj	Sat Jun 21 00:41:20 2014 +0200
+++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj	Sat Jun 21 00:42:34 2014 +0200
@@ -198,6 +198,7 @@
     <ClCompile Include="..\..\ObjectList.cpp" />
     <ClCompile Include="..\..\OSAPI.cpp" />
     <ClCompile Include="..\..\OSWindow.cpp" />
+    <ClCompile Include="..\..\OurMath.cpp" />
     <ClCompile Include="..\..\Outdoor.cpp" />
     <ClCompile Include="..\..\Overlays.cpp" />
     <ClCompile Include="..\..\PaletteManager.cpp" />
@@ -208,6 +209,7 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
     </ClCompile>
     <ClCompile Include="..\..\Random.cpp" />
+    <ClCompile Include="..\..\Registry.cpp" />
     <ClCompile Include="..\..\Render.cpp" />
     <ClCompile Include="..\..\SaveLoad.cpp" />
     <ClCompile Include="..\..\Spells.cpp" />
@@ -225,6 +227,7 @@
     <ClCompile Include="..\..\UI\Books\UIMapBook.cpp" />
     <ClCompile Include="..\..\UI\Books\UINotesBooks.cpp" />
     <ClCompile Include="..\..\UI\Books\UISpellBook.cpp" />
+    <ClCompile Include="..\..\UI\UIArena.cpp" />
     <ClCompile Include="..\..\UI\UIBooks.cpp" />
     <ClCompile Include="..\..\UI\UICharacter.cpp" />
     <ClCompile Include="..\..\UI\UiGame.cpp" />
@@ -244,6 +247,7 @@
     <ClCompile Include="..\..\Viewport.cpp" />
     <ClCompile Include="..\..\Vis.cpp" />
     <ClCompile Include="..\..\Weather.cpp" />
+    <ClCompile Include="..\..\ZlibWrapper.cpp" />
     <ClCompile Include="..\..\_deleted.cpp" />
   </ItemGroup>
   <ItemGroup>
@@ -268,6 +272,7 @@
     <ClInclude Include="..\..\FrameTableInc.h" />
     <ClInclude Include="..\..\Game.h" />
     <ClInclude Include="..\..\GammaControl.h" />
+    <ClInclude Include="..\..\GUIButton.h" />
     <ClInclude Include="..\..\GUIFont.h" />
     <ClInclude Include="..\..\GUIProgressBar.h" />
     <ClInclude Include="..\..\GUIWindow.h" />
@@ -451,6 +456,7 @@
     <ClInclude Include="..\..\Player.h" />
     <ClInclude Include="..\..\PlayerFrameTable.h" />
     <ClInclude Include="..\..\Random.h" />
+    <ClInclude Include="..\..\Registry.h" />
     <ClInclude Include="..\..\Render.h" />
     <ClInclude Include="..\..\resource.h" />
     <ClInclude Include="..\..\SaveLoad.h" />
@@ -474,6 +480,7 @@
     <ClInclude Include="..\..\TileFrameTable.h" />
     <ClInclude Include="..\..\Timer.h" />
     <ClInclude Include="..\..\TurnEngine.h" />
+    <ClInclude Include="..\..\UI\UIArena.h" />
     <ClInclude Include="..\..\UI\UIBooks.h" />
     <ClInclude Include="..\..\UI\UIHouses.h" />
     <ClInclude Include="..\..\VectorTypes.h" />
@@ -481,6 +488,7 @@
     <ClInclude Include="..\..\Viewport.h" />
     <ClInclude Include="..\..\Vis.h" />
     <ClInclude Include="..\..\Weather.h" />
+    <ClInclude Include="..\..\ZlibWrapper.h" />
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\lib\legacy_dx\d3dvec.inl" />
@@ -500,6 +508,7 @@
     </CustomBuild>
     <None Include="..\..\lib\swig\swigwin-2.0.11\UIControlModule.swig" />
     <None Include="..\..\Player.swig" />
+    <None Include="..\..\README.md" />
   </ItemGroup>
   <ItemGroup>
     <Library Include="..\..\lib\OpenAL\lib\OpenAL\OpenAL32.lib" />
--- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters	Sat Jun 21 00:41:20 2014 +0200
+++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters	Sat Jun 21 00:42:34 2014 +0200
@@ -527,6 +527,12 @@
     <ClInclude Include="..\..\MediaPlayer.h" />
     <ClInclude Include="..\..\stuff.h" />
     <ClInclude Include="..\..\OpenALSoundProvider.h" />
+    <ClInclude Include="..\..\ZlibWrapper.h" />
+    <ClInclude Include="..\..\GUIButton.h" />
+    <ClInclude Include="..\..\Registry.h" />
+    <ClInclude Include="..\..\UI\UIArena.h">
+      <Filter>UI</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Filter Include="lib">
@@ -631,6 +637,7 @@
     <None Include="..\..\lib\OpenAL\lib\x86\swscale-2.def">
       <Filter>lib\OpenAL\lib\x86</Filter>
     </None>
+    <None Include="..\..\README.md" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\Actor.cpp" />
@@ -952,6 +959,12 @@
     </ClCompile>
     <ClCompile Include="..\..\MMT.cpp" />
     <ClCompile Include="..\..\MediaPlayer.cpp" />
+    <ClCompile Include="..\..\ZlibWrapper.cpp" />
+    <ClCompile Include="..\..\OurMath.cpp" />
+    <ClCompile Include="..\..\Registry.cpp" />
+    <ClCompile Include="..\..\UI\UIArena.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="..\..\NewUI\Core\UIControlModule.swig">
--- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj.user	Sat Jun 21 00:41:20 2014 +0200
+++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj.user	Sat Jun 21 00:42:34 2014 +0200
@@ -1,9 +1,9 @@
 п»ї<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
+    <LocalDebuggerWorkingDirectory>..\..\..\MM_VII</LocalDebuggerWorkingDirectory>
     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
-    <LocalDebuggerCommandArguments>-novideo, -nomarg</LocalDebuggerCommandArguments>
+    <LocalDebuggerCommandArguments>-nomarg</LocalDebuggerCommandArguments>
     <LocalDebuggerCommand>$(OutDir)$(TargetName)$(TargetExt)</LocalDebuggerCommand>
   </PropertyGroup>
 </Project>
\ No newline at end of file
--- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj	Sat Jun 21 00:41:20 2014 +0200
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj	Sat Jun 21 00:42:34 2014 +0200
@@ -228,6 +228,7 @@
     <ClCompile Include="..\..\UI\Books\UIMapBook.cpp" />
     <ClCompile Include="..\..\UI\Books\UINotesBooks.cpp" />
     <ClCompile Include="..\..\UI\Books\UISpellBook.cpp" />
+    <ClCompile Include="..\..\UI\UIArena.cpp" />
     <ClCompile Include="..\..\UI\UIBooks.cpp" />
     <ClCompile Include="..\..\UI\UICharacter.cpp" />
     <ClCompile Include="..\..\UI\UiGame.cpp" />
@@ -483,6 +484,7 @@
     <ClInclude Include="..\..\UI\Books\UIMapBook.h" />
     <ClInclude Include="..\..\UI\Books\UINotesBooks.h" />
     <ClInclude Include="..\..\UI\Books\UISpellBook.h" />
+    <ClInclude Include="..\..\UI\UIArena.h" />
     <ClInclude Include="..\..\UI\UIBooks.h" />
     <ClInclude Include="..\..\UI\UICharacter.h" />
     <ClInclude Include="..\..\UI\UIGame.h" />
--- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters	Sat Jun 21 00:41:20 2014 +0200
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters	Sat Jun 21 00:42:34 2014 +0200
@@ -388,6 +388,9 @@
     <ClCompile Include="..\..\OurMath.cpp" />
     <ClCompile Include="..\..\Registry.cpp" />
     <ClCompile Include="..\..\ZlibWrapper.cpp" />
+    <ClCompile Include="..\..\UI\UIArena.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\Level\Decoration.h" />
@@ -962,6 +965,9 @@
     </ClInclude>
     <ClInclude Include="..\..\GUIButton.h" />
     <ClInclude Include="..\..\ZlibWrapper.h" />
+    <ClInclude Include="..\..\UI\UIArena.h">
+      <Filter>UI</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\Player.swig" />
--- a/GUIWindow.h	Sat Jun 21 00:41:20 2014 +0200
+++ b/GUIWindow.h	Sat Jun 21 00:42:34 2014 +0200
@@ -237,7 +237,7 @@
 {
   DIALOGUE_USE_NPC_ABILITY = 9,
   DIALOGUE_13 = 0xD,
-  DIALOGUE_18 = 0x12,
+  DIALOGUE_18 = 18,
   DIALOGUE_EVT_A = 19,
   DIALOGUE_EVT_B = 20,
   DIALOGUE_EVT_C = 21,
@@ -254,8 +254,8 @@
   DIALOGUE_ARENA_SELECT_CHAMPION = 88,
   DIALOGUE_ARENA_WELCOME = 89,
   DIALOGUE_ARENA_FIGHT_NOT_OVER_YET = 90,
-  DIALOGUE_ARENA_REWARD = 0x5B,
-  DIALOGUE_ARENA_ALREADY_WON = 0x5C,
+  DIALOGUE_ARENA_REWARD = 91,
+  DIALOGUE_ARENA_ALREADY_WON = 92,
 };
 
 
--- a/Items.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/Items.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -1199,7 +1199,7 @@
       }
     }
 
-    v46 = rand()%spc_sum+1;
+    v46 = rand()%spc_sum+1;//случайные значения от 1 до spc_sum
     j=0;
     v45 = 0;
     while (v45<v46)
--- a/MMT.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/MMT.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -44,7 +44,7 @@
   free(tex.pPixels);
   tex.pPixels = 0;
   MainMenuUI_LoadFontsAndSomeStuff();
-  DrawMMTCopyrightWindow();
+  DrawMMTCopyrightWindow();//Текстовое сообщение ММТ меню
 
   pRenderer->EndScene();
   pRenderer->Present();
@@ -187,10 +187,14 @@
 
   pIcons_LOD->_inlined_sub2();
 
+  //Создание нового окна
+  //WINDOW_MainMenu добавлено в GUIWindow.h
   pWindow_MMT_MainMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_MainMenu, 0, 0);
+
+  //Загрузка кнопок
   //Texture* MMT_MM6      = pIcons_LOD->LoadTexturePtr("title_new", TEXTURE_16BIT_PALETTE);
 
-  sprintf(pContainerName, "data\\New_Icons/%s", "mm6_button_oval.png");
+  sprintf(pContainerName, "data\\New_Icons/%s", "mm6_button_oval.png");//загружаем png из папки
   Texture* MMT_MM6 = LoadPNG(pContainerName);
 								
   Texture* MMT_MM7      = pIcons_LOD->LoadTexturePtr("title_load", TEXTURE_16BIT_PALETTE);
@@ -206,9 +210,9 @@
 
   pTexture_PCX.Release();
 
-  sprintf(pContainerName, "data\\New_Icons/%s", "MMTTITLE.pcx");
+  sprintf(pContainerName, "data\\New_Icons/%s", "MMTTITLE.pcx");//загружаем pcx из папки
   pTexture_PCX.LoadPCXFile(pContainerName, 0);
-  SetCurrentMenuID(MENU_MMT_MAIN_MENU);
+  SetCurrentMenuID(MENU_MMT_MAIN_MENU);//Добавлено в enum MENU_STATE в GUIWindows.h
   SetForegroundWindow(window->GetApiHandle());
   SendMessageW(window->GetApiHandle(), WM_ACTIVATEAPP, 1, 0);
   while (GetCurrentMenuID() == MENU_MMT_MAIN_MENU )
@@ -233,7 +237,7 @@
       pRenderer->BeginScene();
       pRenderer->DrawTextureRGB(0, 0, &pTexture_PCX);
 
-      MMT_MenuMessageProc();
+      MMT_MenuMessageProc();//отдельный для ММТ меню обработчик сообщений
       GUI_UpdateWindows();
 
       if ( !pModalWindow )// ???
@@ -286,6 +290,8 @@
   GUI_UpdateWindows();
   pRenderer->EndScene();
   pRenderer->Present();
+
+  //освобождаем ресурсы
   pTexture_PCX.Release();
   if ( pGUIWindow2 )
   {
--- a/MediaPlayer.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/MediaPlayer.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -489,9 +489,9 @@
 	  // любой, для которых критические частоты в два раза меньше частота дискретизации
       sample_rate_half = (sample_rate + 1) / 2;	                    //22050
       if (dec_ctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
-         root = 2.0 / (sqrt(frame_len) * 32768.0);
+         root = 2.0 / (sqrt(float(frame_len)) * 32768.0);
       else
-         root = frame_len / (sqrt(frame_len) * 32768.0);
+         root = frame_len / (sqrt(float(frame_len)) * 32768.0);
       for (i = 0; i < 96; i++) 
 	  {
          /* constant is result of 0.066399999/log10(M_E) */
@@ -727,7 +727,7 @@
 
             device_buffer = provider->CreateTrack16(audio.dec_ctx->channels, audio.dec_ctx->sample_rate, 2, num_audio_samples, audio_plain_data.Ptr());
 
-            ReleaseAvcodec();
+            Release();
             return true;
           }
         }
@@ -813,6 +813,7 @@
 	  delete decoding_frame;
       if (last_resampled_frame_data[0])
         av_freep(&last_resampled_frame_data[0]);
+
     }
 
     bool Load(const wchar_t *filename, int dst_width, int dst_height, int cache_ms)	//Загрузка
@@ -990,7 +991,7 @@
           last_resampled_frame_num = desired_frame_number;
           memcpy(last_resampled_frame_data, rescaled_data, sizeof(rescaled_data));
           memcpy(last_resampled_frame_linesize, rescaled_linesize, sizeof(rescaled_linesize));
-          //вроде должен быть av_freep(&rescaled_data[0]);
+          //av_freep(&rescaled_data[0]);//вроде должен быть 
         }
       }
       else
--- a/NPC.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/NPC.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -16,6 +16,9 @@
 #include "MapInfo.h"
 #include "Level/Decoration.h"
 #include "Actor.h"
+#include "AudioPlayer.h"
+#include "CastSpellInfo.h"
+#include "Overlays.h"
 
 int pDialogueNPCCount;
 std::array<struct Texture *, 6> pDialogueNPCPortraits;
@@ -1890,3 +1893,152 @@
   else
     return pNPCTopics[407].pTopic;
 }
+
+//----- (004BB756) --------------------------------------------------------
+int UseNPCSkill(NPCProf profession)
+{
+  switch (profession)
+  {
+    case Healer:
+    {
+      for (int i = 0; i < 4; ++i)
+        pParty->pPlayers[i].sHealth = pParty->pPlayers[i].GetMaxHealth();
+    }
+    break;
+
+    case ExpertHealer:
+    {
+      for (int i = 0; i < 4; ++i)
+      {
+        __debugbreak();
+        pParty->pPlayers[i].sHealth = pParty->pPlayers[i].GetMaxHealth();
+
+        for (int j = 0; j < 14; ++j)
+          pParty->pPlayers[i].pConditions[j] = 0;
+        pParty->pPlayers[i].pConditions[Condition_Good] = 0;
+      }
+    }
+    break;
+
+    case MasterHealer:
+    {
+      for (int i = 0; i < 4; ++i)
+      {
+        __debugbreak();	//Ritor1:needed cleaned(Необходимо почистить)
+        Player* player = &pParty->pPlayers[i];
+        pParty->pPlayers[i].sHealth = pParty->pPlayers[i].GetMaxHealth();
+
+        int v5 = LODWORD(player->pConditions[19]);//*((int *)v4 - 32);
+        int v6 = HIDWORD(player->pConditions[19]);//*((int *)v4 - 31);
+        memset(&pParty->pPlayers[i].pConditions, 0, sizeof(pParty->pPlayers[i].pConditions));
+
+        *(int *)&player->pActiveSkills[PLAYER_SKILL_SHIELD] = v5;
+        *(int *)&player->pActiveSkills[PLAYER_SKILL_CHAIN] = v6;
+      }
+    }
+    break;
+
+    case Cook://Повар
+    {
+      if (pParty->uNumFoodRations >= 13)
+        return 1;
+
+      Party::GiveFood(1);
+    }
+    break;
+
+    case Chef:
+    {
+      if (pParty->uNumFoodRations >= 13)
+        return 1;
+
+      if (pParty->uNumFoodRations == 13)
+        Party::GiveFood(1);
+      else
+        Party::GiveFood(2);
+    }
+    break;
+
+    case WindMaster:
+    {
+      if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
+      {
+        ShowStatusBarString(pGlobalTXT_LocalizationStrings[494], 2);//Нельзя применить знание Полет в помещении!
+        pAudioPlayer->PlaySound(SOUND_203, 0, 0, -1, 0, 0, 0, 0);
+      }
+      else
+      {
+        int v19 = pOtherOverlayList->_4418B1(10008, 203, 0, 65536);
+        pParty->pPartyBuffs[PARTY_BUFF_FLY].Apply(pParty->uTimePlayed + 60 * (256 * 2), 3, 1, v19, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_FLY].uFlags |= 1;
+        pAudioPlayer->PlaySound(SOUND_11090, 0, 0, -1, 0, 0, 0, 0);
+      }
+    }
+    break;
+
+    case WaterMaster:
+    {
+      int v20 = pOtherOverlayList->_4418B1(10005, 201, 0, 65536);
+      pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].Apply(pParty->uTimePlayed + 60 * (256 * (2 + 1)), 3, 0, v20, 0);
+      pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uFlags |= 1;
+      pAudioPlayer->PlaySound(SOUND_12040, 0, 0, -1, 0, 0, 0, 0);
+    }
+    break;
+
+    case GateMaster:
+    {
+      pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0);
+      dword_50C9DC = 195;
+      ptr_50C9E0 = GetNPCData(sDialogue_SpeakingActorNPC_ID);
+    }
+    break;
+
+    case Acolyte:      _42777D_CastSpell_UseWand_ShootArrow(46, 0, 133, 0, 0); break;
+    case Piper:        _42777D_CastSpell_UseWand_ShootArrow(51, 0, 133, 0, 0); break;
+    case FallenWizard: _42777D_CastSpell_UseWand_ShootArrow(86, 0, 133, 0, 0); break;
+      
+    case Teacher:
+    case Instructor:
+    case Armsmaster:
+    case Weaponsmaster:
+    case Apprentice:
+    case Mystic:
+    case Spellmaster:
+    case Trader:
+    case Merchant:
+    case Scout:
+    case Herbalist:
+    case Apothecary:
+    case Tinker:
+    case Locksmith:
+    case Fool:
+    case ChimneySweep:
+    case Porter:
+    case QuarterMaster:
+    case Factor:
+    case Banker:
+    case Horseman:
+    case Bard:
+    case Enchanter:
+    case Cartographer:
+    case Explorer:
+    case Pirate:
+    case Squire:
+    case Psychic:
+    case Gypsy:
+    case Diplomat:
+    case Duper:
+    case Burglar:
+    case Acolyte2:
+    case Initiate:
+    case Prelate:
+    case Monk:
+    case Sage:
+    case Hunter:
+      break;
+
+    default:
+      assert(false && "Invalid enum value");
+  }
+  return 0;
+}
\ No newline at end of file
--- a/OurMath.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/OurMath.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -204,10 +204,13 @@
 //----- (00452A9E) --------------------------------------------------------
 int integer_sqrt(int val)
 {
+///////////////////////////////
+//Получение квадратного корня//
+///////////////////////////////
+
   signed int result; // eax@2
   unsigned int v2; // edx@3
   unsigned int v3; // edi@3
-  //signed int v4; // ebx@3
   int v5; // esi@4
 
   if (val < 1)
@@ -216,7 +219,6 @@
   v2 = 0;
   v3 = val;
   result = 0;
-  //v4 = 16;
   for (uint i = 0; i < 16; ++i)
   {
     result *= 2;
@@ -228,9 +230,7 @@
       ++result;
       v2 -= v5;
     }
-    //--v4;
   }
-  //while ( v4 );
   if ( val - result * result >= (unsigned int)(result - 1) )
     ++result;
   return result;
--- a/Spells.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/Spells.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -399,7 +399,7 @@
     v11 = pParty->vPosition.y - fromy;
     v12 = (pParty->vPosition.z + pParty->sEyelevel) - fromz;
   }
-  v13 = sqrt(v10 * v10 + v11 * v11 + v12 * v12);
+  v13 = sqrt(long double(v10 * v10 + v11 * v11 + v12 * v12));
   if ( v13 <= 1.0 )
   {
     v55 = 1;
@@ -411,7 +411,7 @@
     v55 = (int)v13;
     ySquared = v11 * v11;
     xSquared = v10 * v10;
-    v14 = (int)sqrt(xSquared + ySquared);
+    v14 = (int)sqrt(long double(xSquared + ySquared));
     yaw = stru_5C6E00->Atan2((int)v10, (int)v11);
     pitch = stru_5C6E00->Atan2(v14, (int)v12);
   }
--- a/Texture.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/Texture.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -283,22 +283,22 @@
 
 //----- (0044E0ED) --------------------------------------------------------
 void TextureFrameTable::LoadAnimationSequenceAndPalettes( signed int uIconID )
-    {
-  TextureFrameTable *v3; // ebx@1
+{
+  //TextureFrameTable *v3; // ebx@1
   unsigned int i; // edi@3
 
-  v3 = this;
+  //v3 = this;
   if ( (uIconID <= this->sNumTextures) && uIconID >= 0 )
   {
     for ( i = uIconID; ; ++i )
     {
-      v3->pTextures[i].uTextureID = pBitmaps_LOD->LoadTexture(v3->pTextures[i].pTextureName, TEXTURE_DEFAULT);
+      this->pTextures[i].uTextureID = pBitmaps_LOD->LoadTexture(this->pTextures[i].pTextureName, TEXTURE_DEFAULT);
 
-      if (v3->pTextures[i].uTextureID != -1)
-        pBitmaps_LOD->pTextures[v3->pTextures[i].uTextureID].palette_id2 = pPaletteManager->LoadPalette(pBitmaps_LOD->pTextures[v3->pTextures[i].uTextureID].palette_id1);
+      if (this->pTextures[i].uTextureID != -1)
+        pBitmaps_LOD->pTextures[this->pTextures[i].uTextureID].palette_id2 = pPaletteManager->LoadPalette(pBitmaps_LOD->pTextures[this->pTextures[i].uTextureID].palette_id1);
       //result = (unsigned int)v3->pTextures;
       //if ( !(*(char *)(result + i * 20 + 18) & 1) )
-      if( v3->pTextures[i].uFlags & 1)
+      if( this->pTextures[i].uFlags & 1)
         break;
     }
   }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UI/UIArena.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -0,0 +1,310 @@
+#define _CRT_SECURE_NO_WARNINGS
+
+#include "mm7_data.h"
+#include "Sprites.h"
+
+#include "GUIWindow.h"
+#include "GUIFont.h"
+#include "Party.h"
+#include "AudioPlayer.h"
+#include "Outdoor.h"
+#include "LOD.h"
+#include "Actor.h"
+#include "Events.h"
+#include "Viewport.h"
+#include "texts.h"
+#include "MM7.h"
+
+std::array<Vec2_int_, 20> pMonsterArenaPlacements = 
+  {{
+    Vec2_int_(1524, 8332),
+    Vec2_int_(2186, 8844),
+    Vec2_int_(3219, 9339),
+    Vec2_int_(4500, 9339),
+    Vec2_int_(5323, 9004),
+    Vec2_int_(0x177D, 0x2098),
+    Vec2_int_(0x50B, 0x1E15),
+    Vec2_int_(0x18FF, 0x1E15),
+    Vec2_int_(0x50B, 0xD69),
+    Vec2_int_(0x18FF, 0x1B15),
+    Vec2_int_(0x50B, 0x1021),
+    Vec2_int_(0x18FF, 0x1848),
+    Vec2_int_(0x50B, 0x12D7),
+    Vec2_int_(0x18FF, 0x15A3),
+    Vec2_int_(0x50B, 0x14DB),
+    Vec2_int_(0x18FF, 0x12D7),
+    Vec2_int_(0x50B, 0x1848),
+    Vec2_int_(0x18FF, 0x1021),
+    Vec2_int_(0x50B, 0x1B15),
+    Vec2_int_(0x18FF, 0xD69),
+  }}
+;
+
+//----- (004BBCDD) --------------------------------------------------------
+void  Arena_SelectionFightLevel()
+{
+  signed int v0; // ebp@3
+  GUIButton *v5; // eax@18
+  GUIButton *v6; // esi@19
+
+  if ( pParty->field_7B5_in_arena_quest )
+  {
+    if ( pParty->field_7B5_in_arena_quest == -1 )
+    {
+      uDialogueType = DIALOGUE_ARENA_ALREADY_WON;
+    }
+    else
+    {
+      v0 = 0;
+      for (size_t i = 0; i < uNumActors; i++ )
+      {
+        if ( pActors[i].uAIState == Dead
+          || pActors[i].uAIState == Removed
+          || pActors[i].uAIState == Disabled
+          || pActors[i].uSummonerID != 0 && PID_TYPE(pActors[i].uSummonerID) == OBJECT_Player)
+          ++v0;
+      }
+      if ( v0 >= (signed int)uNumActors || (signed int)uNumActors <= 0)
+      {
+        uDialogueType = DIALOGUE_ARENA_REWARD;
+        ++*((char *)&pParty->monster_for_hunting_killed[3] + (unsigned __int8)pParty->field_7B5_in_arena_quest + 1);//Ritor1:I dont know
+        for ( uint i= 0; i < 4; i++ )
+          pParty->pPlayers[i].SetVariable(VAR_Award, (unsigned __int8)pParty->field_7B5_in_arena_quest + 3);
+        pParty->PartyFindsGold(gold_transaction_amount, 0);
+        pAudioPlayer->PlaySound(SOUND_Arena_Welcome, 0, 0, -1, 0, 0, 0, 0);
+        pParty->field_7B5_in_arena_quest = -1;
+      }
+      else
+      {
+        uDialogueType = DIALOGUE_ARENA_WELCOME;
+        pParty->vPosition.x = 3849;
+        pParty->vPosition.y = 5770;
+        pParty->vPosition.z = 1;
+        pParty->uFallStartY = 1;
+        pParty->sRotationY = 512;
+        pParty->sRotationX = 0;
+        pParty->uFallSpeed = 0;
+        pAudioPlayer->PlaySound(SOUND_Arena_Welcome, 0, 0, -1, 0, 0, 0, 0);
+      }
+    }
+  }
+  else
+  {
+    uDialogueType = DIALOGUE_ARENA_WELCOME;
+    v5 = pDialogueWindow->pControlsHead;
+    if ( v5 )
+    {
+      do
+      {
+        v6 = v5->pNext;
+        free(v5);
+        v5 = v6;
+      }
+      while ( v6 );
+    }
+    pDialogueWindow->pControlsHead = 0;
+    pDialogueWindow->pControlsTail = 0;
+    pDialogueWindow->uNumControls = 0;
+    pBtn_ExitCancel = pDialogueWindow->CreateButton(471, 445, 0xA9u, 0x23u, 1, 0, UIMSG_Escape, 0, 0,
+                   pGlobalTXT_LocalizationStrings[79], //Close, Закрыть
+                   pIcons_LOD->GetTexture(uExitCancelTextureId), 0);
+    pDialogueWindow->CreateButton(480, 160, 0x8Cu, 0x1Eu, 1, 0, UIMSG_SelectNPCDialogueOption, 85, 0, "", 0);
+    pDialogueWindow->CreateButton(480, 190, 0x8Cu, 0x1Eu, 1, 0, UIMSG_SelectNPCDialogueOption, 86, 0, "", 0);
+    pDialogueWindow->CreateButton(480, 220, 0x8Cu, 0x1Eu, 1, 0, UIMSG_SelectNPCDialogueOption, 87, 0, "", 0);
+    pDialogueWindow->CreateButton(480, 250, 0x8Cu, 0x1Eu, 1, 0, UIMSG_SelectNPCDialogueOption, 88, 0, "", 0);
+    pDialogueWindow->_41D08F_set_keyboard_control_group(4, 1, 0, 1);
+  }
+}
+
+
+//----- (004BC109) --------------------------------------------------------
+void ArenaFight()
+{
+  int v0; // edi@1
+  char *v1; // eax@7
+  int v3; // eax@10
+  signed int v4; // esi@10
+  signed int v6; // ebx@34
+  signed int v13; // eax@49
+  int v14; // esi@49
+  int v15; // edx@50
+  int v16; // eax@51
+  signed int v17; // ecx@51
+  int v18; // edx@53
+  int i; // edi@55
+  signed int v22; // [sp-4h] [bp-144h]@51
+  __int16 v23[100]; // [sp+Ch] [bp-134h]@39
+  GUIWindow window; // [sp+D4h] [bp-6Ch]@1
+  __int16 monster_ids[6]; // [sp+128h] [bp-18h]@56
+  int v26; // [sp+134h] [bp-Ch]@1
+  int num_monsters; // [sp+13Ch] [bp-4h]@17
+
+  v26 = 0;
+  pParty->field_7B5_in_arena_quest = uDialogueType;
+  memcpy(&window, pDialogueWindow, sizeof(window));
+  window.uFrameWidth = game_viewport_width;
+  window.uFrameZ = 452;
+  v0 = pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[575], &window, 13, 0) + 7;// Пожалуйста, подождите пока я вызываю существ. Удачи.
+  pRenderer->BeginSceneD3D();
+
+  if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
+    pIndoor->Draw();
+  else if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor )
+    pOutdoor->Draw();
+
+  pRenderer->DrawBillboards_And_MaybeRenderSpecialEffects_And_EndScene();
+  pRenderer->BeginScene();
+  //if ( pRenderer->pRenderD3D )
+    pRenderer->FillRectFast(pViewport->uViewportTL_X, pViewport->uViewportTL_Y,
+                            pViewport->uViewportBR_X - pViewport->uViewportTL_X,
+                            pViewport->uViewportBR_Y - pViewport->uViewportTL_Y + 1,
+                            0x7FF);
+
+  Texture* pTex = pIcons_LOD->GetTexture(uTextureID_Leather);
+  pRenderer->GetLeather(8, 352 - v0, pTex, pTex->uTextureHeight - v0);
+
+  pRenderer->DrawTextureIndexed(8, 347 - v0, pTexture_591428);
+  v1 = FitTextInAWindow(pGlobalTXT_LocalizationStrings[575], pFontArrus, &window, 0xDu, 0);//Пожалуйста, подождите пока я вызываю существ. Удачи.
+  pDialogueWindow->DrawText(pFontArrus, 13, 354 - v0, 0, v1, 0, 0, 0);
+  pRenderer->EndScene();
+  pRenderer->Present();
+  pParty->vPosition.x = 3849;
+  pParty->vPosition.y = 5770;
+  pParty->vPosition.z = 1;
+  pParty->uFallStartY = 1;
+  pParty->sRotationY = 512;
+  pParty->sRotationX = 0;
+  pParty->uFallSpeed = 0;
+  /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
+  {
+    pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape;
+    pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1;
+    *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
+    ++pMessageQueue_50CBD0->uNumMessages;
+  }*/
+  pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
+  //v2 = pParty->pPlayers.data();
+  for ( uint i = 0; i < 4; i++ )
+  {
+    v3 = pParty->pPlayers[i].GetActualLevel();
+    v4 = v26;
+    if ( v3 > v26 )
+    {
+      v26 = pParty->pPlayers[i].GetActualLevel();
+      v4 = pParty->pPlayers[i].GetActualLevel();
+    }
+    //++v2;
+  }
+  //while ( (signed int)v2 < (signed int)pParty->pHirelings.data() );
+  if ( uDialogueType == DIALOGUE_ARENA_SELECT_PAGE )
+  {
+    num_monsters = v4;
+    v4 /= 2;
+  }
+  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_SQUIRE )
+  {
+    //v5 = (signed __int64)((double)v26 * 1.5);
+    num_monsters = (int)((double)v26 * 1.5);
+    v4 /= 2;
+  }
+  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_KNIGHT )
+  {
+    //LODWORD(v5) = 2 * v4;
+    num_monsters = 2 * v4;
+    v4 /= 2;
+  }
+  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_CHAMPION )
+  {
+    num_monsters = 2 * v4;
+    v4 /= 2;
+  }
+  if ( v4 < 1 )
+    v4 = 1;
+  if ( v4 > 100 )
+    v4 = 100;
+  if ( num_monsters > 100 )
+    num_monsters = 100;
+  if ( v4 < 2 )
+    v4 = 2;
+  if ( num_monsters < 2 )
+    num_monsters = 2;
+  v6 = 0;
+  //v27 = 1;
+  //v7 = (char *)&pMonsterStats->pInfos[1].uLevel;
+  for ( uint i = 1; i <= 258; i++ )
+  {
+    if ( pMonsterStats->pInfos[i].uAIType != 1 )//if ( v7[8] != 1 )
+    {
+      if ( !MonsterStats::BelongsToSupertype(pMonsterStats->pInfos[i].uID, MONSTER_SUPERTYPE_8) ) //!MonsterStats::BelongsToSupertype(*((short *)v7 + 22), MONSTER_SUPERTYPE_8)
+      {
+        //v8 = (unsigned __int8)pMonsterStats->pInfos[i].uLevel;
+        if ( pMonsterStats->pInfos[i].uLevel >= v4 )
+        {
+          if ( pMonsterStats->pInfos[i].uLevel <= num_monsters )
+            v23[v6++] = i;
+        }
+      }
+    }
+   // ++v27;
+    //v7 += 88;
+  }
+  //while ( (signed int)v7 <= (signed int)&pMonsterStats->pInfos[258].uLevel );
+  num_monsters = 6;
+  if ( v6 < 6 )
+    num_monsters = v6;
+  //v9 = 0;
+  if ( num_monsters > 0 )
+  {
+    for ( uint i = 0; i < num_monsters; i++ )
+    {
+      //v10 = rand();
+      //++v9;
+      //v12 = __OFSUB__(v9, num_monsters);
+      //v11 = v9 - num_monsters < 0;
+      //*((short *)&window.pControlsTail + v9 + 1) = v23[rand() % v6];
+      monster_ids[i] = v23[rand() % v6];
+    }
+    //while ( v11 ^ v12 );
+  }
+  if ( uDialogueType == DIALOGUE_ARENA_SELECT_PAGE )
+  {
+    v16 = rand();
+    v17 = 3;
+    v22 = 50;
+    v18 = v16 % v17;
+    v13 = v22;
+    v14 = v18 + 6;
+  }
+  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_SQUIRE )
+  {
+    v16 = rand();
+    v17 = 7;
+    v22 = 100;
+    v18 = v16 % v17;
+    v13 = v22;
+    v14 = v18 + 6;
+  }
+  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_KNIGHT )
+  {
+    v15 = rand() % 11;
+    v13 = 200;
+    v14 = v15 + 10;
+  }
+  else
+  {
+    if ( uDialogueType == DIALOGUE_ARENA_SELECT_CHAMPION )
+    {
+      v13 = 500;
+      v14 = 20;
+    }
+    //else
+    //{
+      //v14 = v27;
+      //v13 = gold_transaction_amount;
+    //}
+  }
+  gold_transaction_amount = v26 * v13;
+  for ( i = 0; i < v14; ++i )
+    Actor::Arena_summon_actor(monster_ids[rand() % num_monsters], pMonsterArenaPlacements[i].x, pMonsterArenaPlacements[i].y, 1);
+  pAudioPlayer->PlaySound(SOUND_Arena_Welcome, 0, 0, -1, 0, 0, 0, 0);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UI/UIArena.h	Sat Jun 21 00:42:34 2014 +0200
@@ -0,0 +1,9 @@
+#pragma once
+#include "VectorTypes.h"
+#include <array>
+
+
+extern std::array<Vec2_int_, 20> pMonsterArenaPlacements;
+
+void Arena_SelectionFightLevel();
+void ArenaFight();
\ No newline at end of file
--- a/UI/UICharacter.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/UI/UICharacter.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -2235,7 +2235,7 @@
   if (full_num_items_in_book>0)
   {
     for (int i = 0; i< full_num_items_in_book; ++i)
-      achieved_awards[full_num_items_in_book+i] = (AwardType)(rand()%16);
+      achieved_awards[full_num_items_in_book+i] = (AwardType)(rand()%16);//случайные значения от 0 до 15
     for (int i = 1; i< full_num_items_in_book; ++i)
     {
       for (int j = i; j< full_num_items_in_book; ++j)
--- a/UI/UIHouses.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/UI/UIHouses.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -30,6 +30,8 @@
 #include "..\Game.h"
 #include "..\CastSpellInfo.h"
 
+#include "../Level/Decoration.h"
+
 #include "..\stru159.h"
 int uHouse_ExitPic; // weak
 
@@ -3299,4 +3301,89 @@
     } while ((decode_step<24)&&!break_loop);
   }
 
-}
\ No newline at end of file
+}
+
+//----- (004BD8B5) --------------------------------------------------------
+int HouseDialogPressCloseBtn()
+{
+  if ( pMessageQueue_50CBD0->uNumMessages )
+    pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
+  pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_CANCELLED);
+  pKeyActionMap->ResetKeys();
+  activeLevelDecoration = nullptr;
+  current_npc_text = 0;
+  if ( pDialogueNPCCount == 0)
+    return 0;
+
+  if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_SPECIAL && ShopTexture )
+  {
+    ShopTexture->Release();
+    ShopTexture = 0;
+  }
+
+  switch(dialog_menu_id)
+  {
+    case -1:
+      _4B4224_UpdateNPCTopics((int)((char *)pDialogueNPCCount - 1));
+      pVideoPlayer->_4BF5B2();
+      break;
+
+    case HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT:
+    case HOUSE_DIALOGUE_LEARN_SKILLS:
+    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN:
+      pVideoPlayer->_4BF5B2();
+      UI_CreateEndConversationButton();
+      dialog_menu_id = HOUSE_DIALOGUE_MAIN;
+      InitializaDialogueOptions(in_current_building_type);
+      break;
+
+    case HOUSE_DIALOGUE_SHOP_SELL:
+    case HOUSE_DIALOGUE_SHOP_IDENTIFY:
+    case HOUSE_DIALOGUE_SHOP_REPAIR:
+      UI_CreateEndConversationButton();
+      dialog_menu_id = HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT;
+      InitializaDialogueOptions_Shops(in_current_building_type);
+      break;
+
+    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RULES:
+    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_VICTORY_CONDITIONS:
+    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RESULT:
+      pVideoPlayer->_4BF5B2();
+      UI_CreateEndConversationButton();
+      dialog_menu_id = HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN;
+      InitializaDialogueOptions_Tavern(in_current_building_type);
+      break;
+
+    case HOUSE_DIALOGUE_NULL:
+    case HOUSE_DIALOGUE_MAIN:
+      pDialogueNPCCount = 0;
+      pDialogueWindow->Release();
+      dialog_menu_id = HOUSE_DIALOGUE_NULL;
+      pDialogueWindow = 0;
+      pIcons_LOD->SyncLoadedFilesCount();
+
+      if ( uNumDialogueNPCPortraits == 1 )
+        return 0;
+
+      pBtn_ExitCancel = window_SpeakInHouse->pControlsHead;
+      if ( uNumDialogueNPCPortraits > 0 )
+      {
+        for ( uint i = 0; i < (unsigned int)uNumDialogueNPCPortraits; ++i )
+        {
+          HouseNPCPortraitsButtonsList[i] = window_SpeakInHouse->CreateButton(pNPCPortraits_x[uNumDialogueNPCPortraits - 1][i],
+                                            pNPCPortraits_y[uNumDialogueNPCPortraits - 1][i],
+                                            63, 73, 1, 0, UIMSG_ClickHouseNPCPortrait, i, 0, byte_591180[i].data(), 0, 0, 0);
+        }
+      }
+
+      pVideoPlayer->_4BF5B2();
+      break;
+
+    default:
+      pVideoPlayer->_4BF5B2();
+      dialog_menu_id = HOUSE_DIALOGUE_MAIN;
+      InitializaDialogueOptions(in_current_building_type);
+      break;
+  }
+  return 1;
+}
--- a/UI/UIPopup.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/UI/UIPopup.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -2032,4 +2032,6 @@
     return Color16(255, 255, 155);
   if ( a1 < 100 )
     return Color16(192, 192, 240);
+  else
+    __debugbreak();
 }
\ No newline at end of file
--- a/Vis.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/Vis.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -399,13 +399,7 @@
 //----- (004C1944) --------------------------------------------------------
 int Vis::PickClosestActor(int object_id, unsigned int pick_depth, int a4, int a5, int a6)
 {
-  //float v6; // ST00_4@3
-  //int result; // eax@4
   Vis_SelectionFilter v8; // [sp+18h] [bp-20h]@3
-  //__int64 v9; // [sp+2Ch] [bp-Ch]@3
-  //Vis *v14; // [sp+34h] [bp-4h]@1
-
-  //v14 = this;
 
   static Vis_SelectionList Vis_static_sub_4C1944_stru_F8BDE8;
   
@@ -417,10 +411,7 @@
   Vis_static_sub_4C1944_stru_F8BDE8.uNumPointers = 0;
   PickBillboards_Keyboard(pick_depth, &Vis_static_sub_4C1944_stru_F8BDE8, &v8);
   Vis_static_sub_4C1944_stru_F8BDE8.create_object_pointers(Vis_SelectionList::Unique);
-  sort_object_pointers(
-    Vis_static_sub_4C1944_stru_F8BDE8.object_pointers,
-    0,
-    Vis_static_sub_4C1944_stru_F8BDE8.uNumPointers - 1);
+  sort_object_pointers(Vis_static_sub_4C1944_stru_F8BDE8.object_pointers, 0, Vis_static_sub_4C1944_stru_F8BDE8.uNumPointers - 1);
 
   if (!Vis_static_sub_4C1944_stru_F8BDE8.uNumPointers)
     return -1;
@@ -1278,12 +1269,12 @@
 {
   //stru157 *v3; // esi@1
   //int result; // eax@1
-  int v5; // edx@2
+  //int v5; // edx@2
   //int v6; // ecx@2
   //char v7; // zf@3
-  int v8; // esi@5
+  //int v8; // esi@5
 //  std::string *v9; // ecx@7
-  Actor *v10; // edi@18
+  //Actor *v10; // edi@18
   //const char *v12; // [sp-20h] [bp-2Ch]@7
 //  int v13; // [sp-1Ch] [bp-28h]@7
   //std::string v14; // [sp-18h] [bp-24h]@7
@@ -1297,21 +1288,21 @@
 
     case VisObjectType_Sprite:
     {
-      v5 = filter->select_flags;
+      //v5 = filter->select_flags;
       int object_idx = PID_ID(pBillboardRenderList[pRenderer->pBillboardRenderListD3D[(int)uD3DBillboardIdx_or_pBLVFace_or_pODMFace].sParentBillboardID].object_pid);
       int object_type = PID_TYPE(pBillboardRenderList[pRenderer->pBillboardRenderListD3D[(int)uD3DBillboardIdx_or_pBLVFace_or_pODMFace].sParentBillboardID].object_pid);
-      if ( v5 & 2 )
+      if ( filter->select_flags & 2 )
       {
         if (object_type == filter->object_id)
           return false;
         return true;
       }
-      if ( v5 & 4 )
+      if ( filter->select_flags & 4 )
       {
-        v8 = filter->object_id;
+        //v8 = filter->object_id;
         if ( object_type != filter->object_id)
           return true;
-        if (v8 != OBJECT_Decoration)
+        if (filter->object_id != OBJECT_Decoration)
         {
           MessageBoxA(nullptr, "Unsupported \"exclusion if no event\" type in CVis::is_part_of_selection", "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Vis.cpp:207", 0);
           return true;
@@ -1328,16 +1319,16 @@
           return true;
         }
 
-        v10 = &pActors[object_idx];
-        int result = 1 << LOBYTE(v10->uAIState);
+        //v10 = &pActors[object_idx];
+        int result = 1 << LOBYTE(pActors[object_idx].uAIState);
         if ( result & filter->no_at_ai_state
             || !(result & filter->at_ai_state)
-            || v5 & 8 && (result = MonsterStats::BelongsToSupertype(v10->pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD)) == 0 )
+            || filter->select_flags & 8 && (result = MonsterStats::BelongsToSupertype(pActors[object_idx].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD)) == 0 )
           return false;
         if ( !(filter->select_flags & 1) )
           return true;
 
-        result = v10->GetActorsRelation(nullptr);
+        result = pActors[object_idx].GetActorsRelation(nullptr);
         if (result == 0)
           return false;
         return true;
--- a/mm7_2.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/mm7_2.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -72,155 +72,6 @@
 bool __fastcall Initialize(HINSTANCE hInst, char *pCmdLine);
 
 
-//----- (004BB756) --------------------------------------------------------
-int UseNPCSkill(NPCProf profession)
-{
-  switch (profession)
-  {
-    case Healer:
-    {
-      for (int i = 0; i < 4; ++i)
-        pParty->pPlayers[i].sHealth = pParty->pPlayers[i].GetMaxHealth();
-    }
-    break;
-
-    case ExpertHealer:
-    {
-      for (int i = 0; i < 4; ++i)
-      {
-        Player* player = &pParty->pPlayers[i];
-        player->sHealth = player->GetMaxHealth();
-
-        for (int j = 0; j < 14; ++j)
-          player->pConditions[i] = 0;
-        player->pConditions[18] = 0;
-      }
-    }
-    break;
-
-    case MasterHealer:
-    {
-      for (int i = 0; i < 4; ++i)
-      {
-        Player* player = &pParty->pPlayers[i];
-        player->sHealth = player->GetMaxHealth();
-
-        int v5 = LODWORD(player->pConditions[19]);//*((int *)v4 - 32);
-        int v6 = HIDWORD(player->pConditions[19]);//*((int *)v4 - 31);
-        memset(player->pConditions.data(), 0, 0xA0u);
-
-        __debugbreak();
-        *(int *)&player->pActiveSkills[PLAYER_SKILL_SHIELD] = v5;
-        *(int *)&player->pActiveSkills[PLAYER_SKILL_CHAIN] = v6;
-      }
-    }
-    break;
-
-    case Cook://Повар
-    {
-      if (pParty->uNumFoodRations >= 13)
-        return 1;
-
-      Party::GiveFood(1);
-    }
-    break;
-
-    case Chef:
-    {
-      if (pParty->uNumFoodRations >= 13)
-        return 1;
-
-      if (pParty->uNumFoodRations == 13)
-        Party::GiveFood(1);
-      else
-        Party::GiveFood(2);
-    }
-    break;
-
-    case WindMaster:
-    {
-      if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
-      {
-        ShowStatusBarString(pGlobalTXT_LocalizationStrings[494], 2);
-        pAudioPlayer->PlaySound(SOUND_203, 0, 0, -1, 0, 0, 0, 0);
-      }
-      else
-      {
-        int v19 = pOtherOverlayList->_4418B1(10008, 203, 0, 65536);
-        pParty->pPartyBuffs[PARTY_BUFF_FLY].Apply(pParty->uTimePlayed + 60 * (256 * 2), 3, 1, v19, 0);
-        pParty->pPartyBuffs[PARTY_BUFF_FLY].uFlags |= 1u;
-        pAudioPlayer->PlaySound(SOUND_11090, 0, 0, -1, 0, 0, 0, 0);
-      }
-    }
-    break;
-
-    case WaterMaster:
-    {
-      int v20 = pOtherOverlayList->_4418B1(10005, 201, 0, 65536);
-      pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].Apply(pParty->uTimePlayed + 60 * (256 * (2 + 1)), 3, 0, v20, 0);
-      pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uFlags |= 1u;
-      pAudioPlayer->PlaySound(SOUND_12040, 0, 0, -1, 0, 0, 0, 0);
-    }
-    break;
-
-    case GateMaster:
-    {
-      pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0);
-      dword_50C9DC = 195;
-      ptr_50C9E0 = GetNPCData(sDialogue_SpeakingActorNPC_ID);
-    }
-    break;
-
-    case Acolyte:      _42777D_CastSpell_UseWand_ShootArrow(46, 0, 133, 0, 0); break;
-    case Piper:        _42777D_CastSpell_UseWand_ShootArrow(51, 0, 133, 0, 0); break;
-    case FallenWizard: _42777D_CastSpell_UseWand_ShootArrow(86, 0, 133, 0, 0); break;
-      
-    case Teacher:
-    case Instructor:
-    case Armsmaster:
-    case Weaponsmaster:
-    case Apprentice:
-    case Mystic:
-    case Spellmaster:
-    case Trader:
-    case Merchant:
-    case Scout:
-    case Herbalist:
-    case Apothecary:
-    case Tinker:
-    case Locksmith:
-    case Fool:
-    case ChimneySweep:
-    case Porter:
-    case QuarterMaster:
-    case Factor:
-    case Banker:
-    case Horseman:
-    case Bard:
-    case Enchanter:
-    case Cartographer:
-    case Explorer:
-    case Pirate:
-    case Squire:
-    case Psychic:
-    case Gypsy:
-    case Diplomat:
-    case Duper:
-    case Burglar:
-    case Acolyte2:
-    case Initiate:
-    case Prelate:
-    case Monk:
-    case Sage:
-    case Hunter:
-      break;
-
-    default:
-      assert(false && "Invalid enum value");
-  }
-  return 0;
-}
-
 //----- (004BBA85) --------------------------------------------------------
 void CheckBountyRespawnAndAward()
 {
@@ -277,400 +128,17 @@
   }
 }
 
-//----- (004BBCDD) --------------------------------------------------------
-void  Arena_SelectionFightLevel()
-{
-  signed int v0; // ebp@3
-  Actor *v1; // eax@4
-  __int16 v2; // cx@5
-  int v3; // esi@8
-  Player *v4; // esi@14
-  GUIButton *v5; // eax@18
-  GUIButton *v6; // esi@19
-  size_t v7; // [sp+10h] [bp-4h]@4
-
-  if ( pParty->field_7B5_in_arena_quest )
-  {
-    if ( pParty->field_7B5_in_arena_quest == -1 )
-    {
-      uDialogueType = 92;
-    }
-    else
-    {
-      v0 = 0;
-      if ( (signed int)uNumActors > 0 )
-	  {
-      v1 = pActors.data();//[0].uAIState;
-		  v7 = uNumActors;
-		  do
-		  {
-			v2 = v1->uAIState;
-			if ( v1->uAIState == Dead || v2 == Removed || v2 == Disabled || (v3 = v1->uSummonerID) != 0 && PID_TYPE(v3) == OBJECT_Player)
-			  ++v0;
-			++v1;
-			--v7;
-		  }
-		  while ( v7 );
-	  }
-      if ( v0 >= (signed int)uNumActors || (signed int)uNumActors <= 0)
-      {
-        uDialogueType = 91;
-        v4 = pParty->pPlayers.data();
-        ++*((char *)&pParty->monster_for_hunting_killed[3] + (unsigned __int8)pParty->field_7B5_in_arena_quest + 1);
-        do
-        {
-          v4->SetVariable(VAR_Award, (unsigned __int8)pParty->field_7B5_in_arena_quest + 3);
-          ++v4;
-        }
-        while ( (signed int)v4 < (signed int)pParty->pHirelings.data() );
-        pParty->PartyFindsGold(gold_transaction_amount, 0);
-        pAudioPlayer->PlaySound((SoundID)14060, 0, 0, -1, 0, 0, 0, 0);
-        pParty->field_7B5_in_arena_quest = -1;
-      }
-      else
-      {
-        uDialogueType = 90;
-        pParty->vPosition.x = 3849;
-        pParty->vPosition.y = 5770;
-        pParty->vPosition.z = 1;
-        pParty->uFallStartY = 1;
-        pParty->sRotationY = 512;
-        pParty->sRotationX = 0;
-        pParty->uFallSpeed = 0;
-        pAudioPlayer->PlaySound((SoundID)14060, 0, 0, -1, 0, 0, 0, 0);
-      }
-    }
-  }
-  else
-  {
-    uDialogueType = 89;
-    v5 = pDialogueWindow->pControlsHead;
-    if ( v5 )
-    {
-      do
-      {
-        v6 = v5->pNext;
-        free(v5);
-        v5 = v6;
-      }
-      while ( v6 );
-    }
-    pDialogueWindow->pControlsHead = 0;
-    pDialogueWindow->pControlsTail = 0;
-    pDialogueWindow->uNumControls = 0;
-    pBtn_ExitCancel = pDialogueWindow->CreateButton(0x1D7u, 0x1BDu, 0xA9u, 0x23u, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[79],
-                   pIcons_LOD->GetTexture(uExitCancelTextureId), 0);
-    pDialogueWindow->CreateButton(0x1E0u, 0xA0u, 0x8Cu, 0x1Eu, 1, 0, UIMSG_SelectNPCDialogueOption, 0x55u, 0, "", 0);
-    pDialogueWindow->CreateButton(0x1E0u, 0xBEu, 0x8Cu, 0x1Eu, 1, 0, UIMSG_SelectNPCDialogueOption, 0x56u, 0, "", 0);
-    pDialogueWindow->CreateButton(0x1E0u, 0xDCu, 0x8Cu, 0x1Eu, 1, 0, UIMSG_SelectNPCDialogueOption, 0x57u, 0, "", 0);
-    pDialogueWindow->CreateButton(0x1E0u, 0xFAu, 0x8Cu, 0x1Eu, 1, 0, UIMSG_SelectNPCDialogueOption, 0x58u, 0, "", 0);
-    pDialogueWindow->_41D08F_set_keyboard_control_group(4, 1, 0, 1);
-  }
-}
-
-//----- (004BC109) --------------------------------------------------------
-void ArenaFight()
-{
-  int v0; // edi@1
-  char *v1; // eax@7
-//  Player *v2; // edi@9
-  int v3; // eax@10
-  signed int v4; // esi@10
-  //signed __int64 v5; // qax@18
-  signed int v6; // ebx@34
-  //char *v7; // edi@34
-//  int v8; // eax@37
-  //int v9; // esi@43
-  //int v10; // eax@44
-//  unsigned __int8 v11; // sf@44
-//  unsigned __int8 v12; // of@44
-  signed int v13; // eax@49
-  int v14; // esi@49
-  int v15; // edx@50
-  int v16; // eax@51
-  signed int v17; // ecx@51
-  int v18; // edx@53
-  int i; // edi@55
-//  int monster_y; // ST18_4@56
-//  int v21; // eax@56
-  signed int v22; // [sp-4h] [bp-144h]@51
-  __int16 v23[100]; // [sp+Ch] [bp-134h]@39
-  GUIWindow window; // [sp+D4h] [bp-6Ch]@1
-  __int16 monster_ids[6]; // [sp+128h] [bp-18h]@56
-  int v26; // [sp+134h] [bp-Ch]@1
-  //int v27; // [sp+138h] [bp-8h]@23
-  int num_monsters; // [sp+13Ch] [bp-4h]@17
-
-  v26 = 0;
-  pParty->field_7B5_in_arena_quest = uDialogueType;
-  memcpy(&window, pDialogueWindow, sizeof(window));
-  window.uFrameWidth = game_viewport_width;
-  window.uFrameZ = 452;
-  v0 = pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[575], &window, 13, 0) + 7;
-  pRenderer->BeginSceneD3D();
-
-  if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
-    pIndoor->Draw();
-  else if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor )
-    pOutdoor->Draw();
-
-  pRenderer->DrawBillboards_And_MaybeRenderSpecialEffects_And_EndScene();
-  pRenderer->BeginScene();
-  //if ( pRenderer->pRenderD3D )
-    pRenderer->FillRectFast(pViewport->uViewportTL_X, pViewport->uViewportTL_Y,
-                            pViewport->uViewportBR_X - pViewport->uViewportTL_X,
-                            pViewport->uViewportBR_Y - pViewport->uViewportTL_Y + 1,
-                            0x7FF);
-
-  Texture* pTex = pIcons_LOD->GetTexture(uTextureID_Leather);
-  pRenderer->GetLeather(8, 352 - v0, pTex, pTex->uTextureHeight - v0);
-
-  pRenderer->DrawTextureIndexed(8, 347 - v0, pTexture_591428);
-  v1 = FitTextInAWindow(pGlobalTXT_LocalizationStrings[575], pFontArrus, &window, 0xDu, 0);//Пожалуйста, подождите пока я вызываю существ. Удачи.
-  pDialogueWindow->DrawText(pFontArrus, 13, 354 - v0, 0, v1, 0, 0, 0);
-  pRenderer->EndScene();
-  pRenderer->Present();
-  pParty->vPosition.x = 3849;
-  pParty->vPosition.y = 5770;
-  pParty->vPosition.z = 1;
-  pParty->uFallStartY = 1;
-  pParty->sRotationY = 512;
-  pParty->sRotationX = 0;
-  pParty->uFallSpeed = 0;
-  /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
-  {
-    pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape;
-    pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1;
-    *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
-    ++pMessageQueue_50CBD0->uNumMessages;
-  }*/
-  pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
-  //v2 = pParty->pPlayers.data();
-  for ( uint i = 0; i < 4; i++ )
-  {
-    v3 = pParty->pPlayers[i].GetActualLevel();
-    v4 = v26;
-    if ( v3 > v26 )
-    {
-      v26 = pParty->pPlayers[i].GetActualLevel();
-      v4 = pParty->pPlayers[i].GetActualLevel();
-    }
-    //++v2;
-  }
-  //while ( (signed int)v2 < (signed int)pParty->pHirelings.data() );
-  if ( uDialogueType == DIALOGUE_ARENA_SELECT_PAGE )
-  {
-    num_monsters = v4;
-    v4 /= 2;
-  }
-  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_SQUIRE )
-  {
-    //v5 = (signed __int64)((double)v26 * 1.5);
-    num_monsters = (int)((double)v26 * 1.5);
-    v4 /= 2;
-  }
-  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_KNIGHT )
-  {
-    //LODWORD(v5) = 2 * v4;
-    num_monsters = 2 * v4;
-    v4 /= 2;
-  }
-  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_CHAMPION )
-  {
-    num_monsters = 2 * v4;
-    v4 /= 2;
-  }
-  if ( v4 < 1 )
-    v4 = 1;
-  if ( v4 > 100 )
-    v4 = 100;
-  if ( num_monsters > 100 )
-    num_monsters = 100;
-  if ( v4 < 2 )
-    v4 = 2;
-  if ( num_monsters < 2 )
-    num_monsters = 2;
-  v6 = 0;
-  //v27 = 1;
-  //v7 = (char *)&pMonsterStats->pInfos[1].uLevel;
-  for ( uint i = 1; i <= 258; i++ )
-  {
-    if ( pMonsterStats->pInfos[i].uAIType != 1 )//if ( v7[8] != 1 )
-    {
-      if ( !MonsterStats::BelongsToSupertype(pMonsterStats->pInfos[i].uID, MONSTER_SUPERTYPE_8) ) //!MonsterStats::BelongsToSupertype(*((short *)v7 + 22), MONSTER_SUPERTYPE_8)
-      {
-        //v8 = (unsigned __int8)pMonsterStats->pInfos[i].uLevel;
-        if ( pMonsterStats->pInfos[i].uLevel >= v4 )
-        {
-          if ( pMonsterStats->pInfos[i].uLevel <= num_monsters )
-            v23[v6++] = i;
-        }
-      }
-    }
-   // ++v27;
-    //v7 += 88;
-  }
-  //while ( (signed int)v7 <= (signed int)&pMonsterStats->pInfos[258].uLevel );
-  num_monsters = 6;
-  if ( v6 < 6 )
-    num_monsters = v6;
-  //v9 = 0;
-  if ( num_monsters > 0 )
-  {
-    for ( uint i = 0; i < num_monsters; i++ )
-    {
-      //v10 = rand();
-      //++v9;
-      //v12 = __OFSUB__(v9, num_monsters);
-      //v11 = v9 - num_monsters < 0;
-      //*((short *)&window.pControlsTail + v9 + 1) = v23[rand() % v6];
-      monster_ids[i] = v23[rand() % v6];
-    }
-    //while ( v11 ^ v12 );
-  }
-  if ( uDialogueType == DIALOGUE_ARENA_SELECT_PAGE )
-  {
-    v16 = rand();
-    v17 = 3;
-    v22 = 50;
-    v18 = v16 % v17;
-    v13 = v22;
-    v14 = v18 + 6;
-  }
-  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_SQUIRE )
-  {
-    v16 = rand();
-    v17 = 7;
-    v22 = 100;
-    v18 = v16 % v17;
-    v13 = v22;
-    v14 = v18 + 6;
-  }
-  else if ( uDialogueType == DIALOGUE_ARENA_SELECT_KNIGHT )
-  {
-    v15 = rand() % 11;
-    v13 = 200;
-    v14 = v15 + 10;
-  }
-  else
-  {
-    if ( uDialogueType == DIALOGUE_ARENA_SELECT_CHAMPION )
-    {
-      v13 = 500;
-      v14 = 20;
-    }
-    //else
-    //{
-      //v14 = v27;
-      //v13 = gold_transaction_amount;
-    //}
-  }
-  gold_transaction_amount = v26 * v13;
-  for ( i = 0; i < v14; ++i )
-    Actor::Arena_summon_actor(monster_ids[rand() % num_monsters], pMonsterArenaPlacements[i].x, pMonsterArenaPlacements[i].y, 1);
-  pAudioPlayer->PlaySound((SoundID)14060, 0, 0, -1, 0, 0, 0, 0);
-}
-
-//----- (004BD8B5) --------------------------------------------------------
-int HouseDialogPressCloseBtn()
-{
-  if ( pMessageQueue_50CBD0->uNumMessages )
-    pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
-  pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_CANCELLED);
-  pKeyActionMap->ResetKeys();
-  activeLevelDecoration = nullptr;
-  current_npc_text = 0;
-  if ( pDialogueNPCCount == 0)
-    return 0;
-
-  if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_SPECIAL && ShopTexture )
-  {
-    ShopTexture->Release();
-    ShopTexture = 0;
-  }
-
-  switch(dialog_menu_id)
-  {
-    case -1:
-      _4B4224_UpdateNPCTopics((int)((char *)pDialogueNPCCount - 1));
-      pVideoPlayer->_4BF5B2();
-      break;
-
-    case HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT:
-    case HOUSE_DIALOGUE_LEARN_SKILLS:
-    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN:
-      pVideoPlayer->_4BF5B2();
-      UI_CreateEndConversationButton();
-      dialog_menu_id = HOUSE_DIALOGUE_MAIN;
-      InitializaDialogueOptions(in_current_building_type);
-      break;
-
-    case HOUSE_DIALOGUE_SHOP_SELL:
-    case HOUSE_DIALOGUE_SHOP_IDENTIFY:
-    case HOUSE_DIALOGUE_SHOP_REPAIR:
-      UI_CreateEndConversationButton();
-      dialog_menu_id = HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT;
-      InitializaDialogueOptions_Shops(in_current_building_type);
-      break;
-
-    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RULES:
-    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_VICTORY_CONDITIONS:
-    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RESULT:
-      pVideoPlayer->_4BF5B2();
-      UI_CreateEndConversationButton();
-      dialog_menu_id = HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN;
-      InitializaDialogueOptions_Tavern(in_current_building_type);
-      break;
-
-    case HOUSE_DIALOGUE_NULL:
-    case HOUSE_DIALOGUE_MAIN:
-      pDialogueNPCCount = 0;
-      pDialogueWindow->Release();
-      dialog_menu_id = HOUSE_DIALOGUE_NULL;
-      pDialogueWindow = 0;
-      pIcons_LOD->SyncLoadedFilesCount();
-
-      if ( uNumDialogueNPCPortraits == 1 )
-        return 0;
-
-      pBtn_ExitCancel = window_SpeakInHouse->pControlsHead;
-      if ( uNumDialogueNPCPortraits > 0 )
-      {
-        for ( uint i = 0; i < (unsigned int)uNumDialogueNPCPortraits; ++i )
-        {
-          HouseNPCPortraitsButtonsList[i] = window_SpeakInHouse->CreateButton(pNPCPortraits_x[uNumDialogueNPCPortraits - 1][i],
-                                            pNPCPortraits_y[uNumDialogueNPCPortraits - 1][i],
-                                            63, 73, 1, 0, UIMSG_ClickHouseNPCPortrait, i, 0, byte_591180[i].data(), 0, 0, 0);
-        }
-      }
-
-      pVideoPlayer->_4BF5B2();
-      break;
-
-    default:
-      pVideoPlayer->_4BF5B2();
-      dialog_menu_id = HOUSE_DIALOGUE_MAIN;
-      InitializaDialogueOptions(in_current_building_type);
-      break;
-  }
-  return 1;
-}
-
 //----- (004BF91E) --------------------------------------------------------
 unsigned int GameOverMenu(void *ecx0)
 {
   const char *v1; // eax@2
   unsigned int result; // eax@3
-//  Player *v3; // eax@7
-//  const char *v4; // ST24_4@9
-//  int v5; // eax@9
   const char *v6; // eax@10
   const char *v7; // edx@10
   const char *v8; // ecx@12
   const char *v9; // eax@14
   unsigned int v10; // eax@25
   GUIWindow pWindow; // [sp+34h] [bp-9Ch]@1
-  //MSG Msg; // [sp+88h] [bp-48h]@22
   unsigned int v14; // [sp+A4h] [bp-2Ch]@5
   void *v15; // [sp+A8h] [bp-28h]@1
   const char *pInString; // [sp+ACh] [bp-24h]@5
@@ -678,7 +146,6 @@
   unsigned int v18; // [sp+B4h] [bp-1Ch]@5
   unsigned int v19; // [sp+B8h] [bp-18h]@5
   int v20; // [sp+BCh] [bp-14h]@7
-//  Player *i; // [sp+C0h] [bp-10h]@7
   GUIFont *pFont; // [sp+C4h] [bp-Ch]@1
   unsigned __int64 v23; // [sp+C8h] [bp-8h]@5
 
@@ -722,9 +189,9 @@
   }
   pInString = v1;
   v23 = pParty->uTimePlayed - 138240;
-  v19 = (unsigned int)((signed __int64)((double)(pParty->uTimePlayed - 138240) * 0.234375) / 60 / 60) / 0x18;
-  v14 = (unsigned int)((signed __int64)((double)(pParty->uTimePlayed - 138240) * 0.234375) / 60 / 60) / 0x18 / 0x1C / 0xC;
-  v18 = (unsigned int)((signed __int64)((double)(pParty->uTimePlayed - 138240) * 0.234375) / 60 / 60) / 0x18 / 0x1C % 0xC;
+  v19 = (unsigned int)((signed __int64)((double)(pParty->uTimePlayed - 138240) * 0.234375) / 60 / 60) / 24;
+  v14 = (unsigned int)((signed __int64)((double)(pParty->uTimePlayed - 138240) * 0.234375) / 60 / 60) / 24 / 0x1C / 0xC;
+  v18 = (unsigned int)((signed __int64)((double)(pParty->uTimePlayed - 138240) * 0.234375) / 60 / 60) / 24 / 0x1C % 0xC;
   v17 = v19 % 0x1C;
   if ( !v19 )
     v19 = 1;
@@ -742,15 +209,19 @@
   v6 = FitTextInAWindow(pInString, pFont, &pWindow, 0xC, 0);
   pWindow.DrawTitleText(pFont, 1, 5 * (LOBYTE(pFont->uFontHeight) + 11), 1, v6, 0);
   strcpy(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[37]);//Total Time:
+
   v7 = pGlobalTXT_LocalizationStrings[56];
   if ( v17 != 1 )
     v7 = pGlobalTXT_LocalizationStrings[57];
-  v8 = pGlobalTXT_LocalizationStrings[146];
+
+  v8 = pGlobalTXT_LocalizationStrings[146];//Month, Месяц
   if ( v18 != 1 )
-    v8 = pGlobalTXT_LocalizationStrings[148];
+    v8 = pGlobalTXT_LocalizationStrings[148];//Months,Месяцев
+
   v9 = pGlobalTXT_LocalizationStrings[245];
   if ( v14 != 1 )
     v9 = pGlobalTXT_LocalizationStrings[132];
+
   sprintf(pTmpBuf2.data(), " %lu %s, %lu %s, %lu %s ", v14, v9, v18, v8, v17, v7);
   strcat(pTmpBuf.data(), pTmpBuf2.data());
   pWindow.DrawTitleText(pFont, 1u, pWindow.uFrameHeight - 2 * LOBYTE(pFont->uFontHeight) - 5, 1u, pTmpBuf.data(), 3u);
@@ -830,9 +301,6 @@
   return result;
 }
 
-
-
-
 //----- (00451007) --------------------------------------------------------
 int stru350::sub_451007_scale_image_bicubic(unsigned short *pSrc, int srcWidth, int srcHeight, int srcPitch,          //changing this to some library function might be a good idea
                                             unsigned short *pDst, int dstWidth, int dstHeight, int dstPitch,
@@ -1225,8 +693,6 @@
                                                                     + (__PAIR__(v10, (unsigned __int16)a4 >> 2) & 0x1C00));
 }
 
-
-
 //----- (004547E4) --------------------------------------------------------
 void FactionTable::Initialize()
 {
@@ -1276,8 +742,6 @@
   pHostileTXT_Raw = nullptr;
 }
 
-
-
 //----- (004610AA) --------------------------------------------------------
 void __fastcall PrepareToLoadODM(unsigned int bLoading, ODMRenderParams *a2)
 {
@@ -1295,23 +759,12 @@
 //----- (00461103) --------------------------------------------------------
 void _461103_load_level_sub()
 {
-  //GUIProgressBar *v0; // ebx@1
-  //signed int v1; // ebp@1
-  //char *v2; // esi@2
-  //__int16 v3; // cx@3
   int v4; // edx@8
-  //size_t v5; // edi@14
   signed int v6; // esi@14
-  //char *v7; // edx@15
   signed int v8; // ecx@16
-//  int v9; // ecx@23
-//  MonsterInfo *v10; // ebx@23
-  //int *v11; // esi@23
   int v12; // esi@25
   int v13; // eax@26
   __int16 v14; // ax@41
-  //signed int v15; // [sp+10h] [bp-4Ch]@1
-  //signed int v16; // [sp+10h] [bp-4Ch]@14
   signed int v17; // [sp+14h] [bp-48h]@3
   signed int v18; // [sp+14h] [bp-48h]@23
   int v19; // [sp+18h] [bp-44h]@1
@@ -1590,7 +1043,6 @@
   pIcons_LOD->RemoveTexturesPackFromTextureList();
 }
 
-
 //----- (00464479) --------------------------------------------------------
 void ResetCursor_Palettes_LODs_Level_Audio_SFT_Windows()
 {
@@ -1688,7 +1140,6 @@
   pIconsFrameTable->InitializeAnimation(uIconID_CharacterFrame);
 }
 
-
 //----- (00464866) --------------------------------------------------------
 void DoPrepareWorld(unsigned int bLoading, int _1_fullscreen_loading_2_box)
 {
@@ -1946,8 +1397,6 @@
   }
 }
 
-
-
 //----- (004651F4) --------------------------------------------------------
 bool MM7_Initialize(int game_width, int game_height)
 {
--- a/mm7_3.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/mm7_3.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -524,9 +524,7 @@
     result = 0;
   }
   else
-  {
     result = 1;
-  }
   return result;
 }
 
@@ -610,9 +608,7 @@
     result = 0;
   }
   else
-  {
     result = 1;
-  }
   return result;
 }
 
@@ -621,7 +617,7 @@
 {
   int v3; // ebx@6
   int v5; // eax@10
-  int v6; // ecx@10
+  //int v6; // ecx@10
   signed int v8; // ebx@17
 //  unsigned __int8 v10; // sf@17
 //  unsigned __int16 v11; // ax@21
@@ -663,8 +659,10 @@
 
   for (v75 = 0; v75 < uNumActors; ++v75)
   {
-    if ( pActors[v75].uAIState == Removed || pActors[v75].uAIState == Disabled || pActors[v75].uAIState == Summoned
-     || !pActors[v75].uMovementSpeed )
+    if ( pActors[v75].uAIState == Removed
+      || pActors[v75].uAIState == Disabled
+      || pActors[v75].uAIState == Summoned
+      || !pActors[v75].uMovementSpeed )
       continue;
     v3 = 0;
     v69 = 0;
@@ -677,10 +675,10 @@
     v70 = IsTerrainSlopeTooHigh(pActors[v75].vPosition.x, pActors[v75].vPosition.y);
     v5 = ODM_GetFloorLevel(pActors[v75].vPosition.x, pActors[v75].vPosition.y, pActors[v75].vPosition.z,
            pActors[v75].uActorHeight, &uIsOnWater, (int *)&v69, v3);
-    v6 = pActors[v75].vPosition.z;
+    //v6 = pActors[v75].vPosition.z;
     uIsAboveFloor = 0;
     v67 = v69 == 0;
-    if ( v6 > v5 + 1 )
+    if ( pActors[v75].vPosition.z > v5 + 1 )
       uIsAboveFloor = 1;
     if ( pActors[v75].uAIState == Dead && uIsOnWater && !uIsAboveFloor )
     {
@@ -967,18 +965,11 @@
 //----- (0047253E) --------------------------------------------------------
 void UpdateObjects()
 {
-//  unsigned int v0; // ebx@0
   ObjectDesc *object; // eax@5
   int v5; // ecx@6
-//  __int16 v6; // cx@7
   signed int v7; // eax@9
   signed int v11; // eax@17
   int v12; // edi@27
-//  int v13; // eax@27
-//  int v14; // ebx@27
-//  unsigned int v15; // ecx@27
-//  unsigned int v16; // edx@30
-//  unsigned int v17; // edx@32
   int v18; // [sp+4h] [bp-10h]@27
   int v19; // [sp+8h] [bp-Ch]@27
 
@@ -2677,9 +2668,7 @@
     v3 = v4->uRespawnIntervalDays;
   }
   else
-  {
     v4 = (MapInfo *)thisa;
-  }
   day_attrib &= ~DAY_ATTRIB_FOG;
   dword_6BE13C_uCurrentlyLoadedLocationID = v2;
   pOutdoor->Initialize(
--- a/mm7_4.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/mm7_4.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -29,6 +29,7 @@
 #include "Lights.h"
 #include "Level/Decoration.h"
 #include "mm7_data.h"
+#include "UI\UIArena.h"
 
 //----- (0046CC4B) --------------------------------------------------------
 void check_event_triggers()
@@ -142,8 +143,6 @@
     array_77EC08[i].field_108 = 0;
 }
 
-
-
 //----- (00491E3A) --------------------------------------------------------
 void sub_491E3A()
 {
@@ -1282,23 +1281,23 @@
         case 12:
           pReputation = npc->rep;
           if ( pReputation >= 25 )
-            pText = pGlobalTXT_LocalizationStrings[379];
+            pText = pGlobalTXT_LocalizationStrings[379];//Ненавистный
           else
           {
             if ( pReputation < 6 )
             {
               if ( pReputation >= -5 )
-                pText = pGlobalTXT_LocalizationStrings[399];
+                pText = pGlobalTXT_LocalizationStrings[399];//Нейтральная
               else
               {
                 if ( pReputation < -24 )
-                  pText = pGlobalTXT_LocalizationStrings[434];
+                  pText = pGlobalTXT_LocalizationStrings[434];//Почтенная
                 else
-                  pText = pGlobalTXT_LocalizationStrings[402];
+                  pText = pGlobalTXT_LocalizationStrings[402];//Дружелюбный
               }
             }
             else
-              pText = pGlobalTXT_LocalizationStrings[392];
+              pText = pGlobalTXT_LocalizationStrings[392];//Недружелюбный
           }
           strcat(pTmpBuf2.data(), pText);
           dst = strlen(pTmpBuf2.data());
@@ -1501,10 +1500,6 @@
 //----- (0049B04D) --------------------------------------------------------
 void stru154::GetFacePlaneAndClassify(ODMFace *a2, BSPVertexBuffer *a3)
 {
-  //stru154 *v3; // edi@1
-  //signed int v4; // eax@1
-  //signed int result; // eax@9
-  //signed int v6; // [sp-8h] [bp-18h]@8
   Vec3_float_ v; // [sp+4h] [bp-Ch]@1
   float v7;
 
@@ -1660,18 +1655,12 @@
 void OracleDialogue()
 {
   __int16 *v0; // edi@1
-//  int v1; // ebx@3
-//  Player *v2; // esi@3
-//  int v3; // eax@4
   signed int v4; // eax@9
   int v5; // ebx@11
-//  Player *v6; // esi@13
-//  ItemGen *v7; // eax@14
   signed int v8; // edi@14
   ItemGen *v9; // [sp+Ch] [bp-Ch]@11
   signed int v10; // [sp+10h] [bp-8h]@13
   int v11; // [sp+14h] [bp-4h]@1
-//  Player *v12; // [sp+14h] [bp-4h]@11
 
   contract_approved = 0;
   v11 = 0;
@@ -1688,7 +1677,7 @@
       for ( uint pl = 0; pl < 4; pl++ )
       {
         //LOBYTE(v3) = pParty->pPlayers[pl].CompareVariable(VAR_PlayerItemInHands, *(v0+1));
-        if ( pParty->pPlayers[pl].CompareVariable(VAR_PlayerItemInHands, *(v0+1)) )
+        if ( pParty->pPlayers[pl].CompareVariable(VAR_PlayerItemInHands, *(v0 + 1)) )
           break;
         //++v2;
         //++v1;
@@ -2055,7 +2044,7 @@
   pDialogueWindow = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Dialogue, 1, 0);
   if ( pNPCStats->pProfessions[v0->uProfession].pBenefits)//*(&pNPCStats->field_13A5C + 5 * v0->uProfession) )
   {
-    pDialogueWindow->CreateButton(480, 160, 140, 28, 1, 0, UIMSG_SelectNPCDialogueOption, 77, 0, pGlobalTXT_LocalizationStrings[407], 0);
+    pDialogueWindow->CreateButton(480, 160, 140, 28, 1, 0, UIMSG_SelectNPCDialogueOption, 77, 0, pGlobalTXT_LocalizationStrings[407], 0);//Подробнее
     v1 = 1;
   }
   pDialogueWindow->CreateButton(480, 30 * v1 + 160, 140, 30, 1, 0, UIMSG_SelectNPCDialogueOption, 76, 0, pGlobalTXT_LocalizationStrings[406], 0);//Нанять
--- a/mm7_data.cpp	Sat Jun 21 00:41:20 2014 +0200
+++ b/mm7_data.cpp	Sat Jun 21 00:42:34 2014 +0200
@@ -707,30 +707,6 @@
 std::array<int, 11> price_for_membership={100, 100, 50, 50, 50, 50, 50, 50, 50, 1000, 1000}; // weak
 
 
-std::array<Vec2_int_, 20> pMonsterArenaPlacements = 
-  {{
-    Vec2_int_(1524, 8332),
-    Vec2_int_(2186, 8844),
-    Vec2_int_(3219, 9339),
-    Vec2_int_(4500, 9339),
-    Vec2_int_(5323, 9004),
-    Vec2_int_(0x177D, 0x2098),
-    Vec2_int_(0x50B, 0x1E15),
-    Vec2_int_(0x18FF, 0x1E15),
-    Vec2_int_(0x50B, 0xD69),
-    Vec2_int_(0x18FF, 0x1B15),
-    Vec2_int_(0x50B, 0x1021),
-    Vec2_int_(0x18FF, 0x1848),
-    Vec2_int_(0x50B, 0x12D7),
-    Vec2_int_(0x18FF, 0x15A3),
-    Vec2_int_(0x50B, 0x14DB),
-    Vec2_int_(0x18FF, 0x12D7),
-    Vec2_int_(0x50B, 0x1848),
-    Vec2_int_(0x18FF, 0x1021),
-    Vec2_int_(0x50B, 0x1B15),
-    Vec2_int_(0x18FF, 0xD69),
-  }}
-;
 std::array<__int16, 32> word_4F0F30 ={{ 4, 7, 10, 11,                                              
 						   4, 7, 10, 11,
 					       4, 7, 10, 11,
--- a/mm7_data.h	Sat Jun 21 00:41:20 2014 +0200
+++ b/mm7_data.h	Sat Jun 21 00:42:34 2014 +0200
@@ -373,7 +373,6 @@
 extern std::array<__int16, 54> _4F0882_evt_VAR_PlayerItemInHands_vals;
 extern std::array<unsigned short, 6> pMaxLevelPerTrainingHallType;
 extern std::array<int, 11> price_for_membership; // weak
-extern std::array<Vec2_int_, 20> pMonsterArenaPlacements;
 extern std::array<__int16, 32> word_4F0F30; // weak
 extern std::array<int, 500> ai_array_4F5E68;
 extern std::array<int, 500> ai_array_4F6638_actor_ids;
--- a/mm7_unsorted_subs.h	Sat Jun 21 00:41:20 2014 +0200
+++ b/mm7_unsorted_subs.h	Sat Jun 21 00:42:34 2014 +0200
@@ -57,8 +57,6 @@
 void __fastcall DrawTextAtStatusBar(const char *Str, int a5);
 __int64 GetExperienceRequiredForLevel(int a1);
 void CheckBountyRespawnAndAward();
-void Arena_SelectionFightLevel();
-void ArenaFight();
 int HouseDialogPressCloseBtn();
 bool __fastcall IsBModelVisible(unsigned int uModelID, int *unused);
 void ODM_LoadAndInitialize(const char *pLevelFilename, struct ODMRenderParams *thisa);