changeset 2377:6eb63623cbe8

Слияние
author Ritor1
date Mon, 02 Jun 2014 12:31:28 +0600
parents 802460e60eee (diff) bcd7fadbf7d2 (current diff)
children 48dbf99c0f7f
files MediaPlayer.cpp
diffstat 15 files changed, 598 insertions(+), 630 deletions(-) [+]
line wrap: on
line diff
--- a/AudioPlayer.h	Mon May 12 12:28:06 2014 +0600
+++ b/AudioPlayer.h	Mon Jun 02 12:31:28 2014 +0600
@@ -121,6 +121,7 @@
   SOUND_CloseBook = 231,
   SOUND_11090 = 11090,
   SOUND_12040 = 12040,
+  SOUND_Arena_Welcome = 14060,
   SOUND_20001 = 0x4E21,
 };
 
--- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj	Mon May 12 12:28:06 2014 +0600
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj	Mon Jun 02 12:31:28 2014 +0600
@@ -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	Mon May 12 12:28:06 2014 +0600
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters	Mon Jun 02 12:31:28 2014 +0600
@@ -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	Mon May 12 12:28:06 2014 +0600
+++ b/GUIWindow.h	Mon Jun 02 12:31:28 2014 +0600
@@ -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/MediaPlayer.cpp	Mon May 12 12:28:06 2014 +0600
+++ b/MediaPlayer.cpp	Mon Jun 02 12:31:28 2014 +0600
@@ -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	Mon May 12 12:28:06 2014 +0600
+++ b/NPC.cpp	Mon Jun 02 12:31:28 2014 +0600
@@ -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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UI/UIArena.cpp	Mon Jun 02 12:31:28 2014 +0600
@@ -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	Mon Jun 02 12:31:28 2014 +0600
@@ -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/UIHouses.cpp	Mon May 12 12:28:06 2014 +0600
+++ b/UI/UIHouses.cpp	Mon Jun 02 12:31:28 2014 +0600
@@ -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/mm7_2.cpp	Mon May 12 12:28:06 2014 +0600
+++ b/mm7_2.cpp	Mon Jun 02 12:31:28 2014 +0600
@@ -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	Mon May 12 12:28:06 2014 +0600
+++ b/mm7_3.cpp	Mon Jun 02 12:31:28 2014 +0600
@@ -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	Mon May 12 12:28:06 2014 +0600
+++ b/mm7_4.cpp	Mon Jun 02 12:31:28 2014 +0600
@@ -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	Mon May 12 12:28:06 2014 +0600
+++ b/mm7_data.cpp	Mon Jun 02 12:31:28 2014 +0600
@@ -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	Mon May 12 12:28:06 2014 +0600
+++ b/mm7_data.h	Mon Jun 02 12:31:28 2014 +0600
@@ -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	Mon May 12 12:28:06 2014 +0600
+++ b/mm7_unsorted_subs.h	Mon Jun 02 12:31:28 2014 +0600
@@ -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);