changeset 2374:802460e60eee

add UIArena.cpp and UIArena.h and other
author Ritor1
date Sun, 01 Jun 2014 18:37:09 +0600
parents b4a79e3ef2f0
children 6eb63623cbe8
files Build/Visual Studio 2012/World of Might and Magic.vcxproj Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters NPC.cpp UI/UIArena.cpp UI/UIArena.h UI/UIHouses.cpp mm7_2.cpp mm7_4.cpp mm7_data.cpp mm7_data.h mm7_unsorted_subs.h
diffstat 11 files changed, 568 insertions(+), 530 deletions(-) [+]
line wrap: on
line diff
--- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj	Sun Jun 01 17:20:22 2014 +0600
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj	Sun Jun 01 18:37:09 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	Sun Jun 01 17:20:22 2014 +0600
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters	Sun Jun 01 18:37:09 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/NPC.cpp	Sun Jun 01 17:20:22 2014 +0600
+++ b/NPC.cpp	Sun Jun 01 18:37:09 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	Sun Jun 01 18:37:09 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	Sun Jun 01 18:37:09 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	Sun Jun 01 17:20:22 2014 +0600
+++ b/UI/UIHouses.cpp	Sun Jun 01 18:37:09 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	Sun Jun 01 17:20:22 2014 +0600
+++ b/mm7_2.cpp	Sun Jun 01 18:37:09 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)
-      {
-        __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();
-        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;
-}
-
 //----- (004BBA85) --------------------------------------------------------
 void CheckBountyRespawnAndAward()
 {
@@ -277,359 +128,6 @@
   }
 }
 
-//----- (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);
-}
-
-//----- (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)
 {
--- a/mm7_4.cpp	Sun Jun 01 17:20:22 2014 +0600
+++ b/mm7_4.cpp	Sun Jun 01 18:37:09 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()
--- a/mm7_data.cpp	Sun Jun 01 17:20:22 2014 +0600
+++ b/mm7_data.cpp	Sun Jun 01 18:37:09 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	Sun Jun 01 17:20:22 2014 +0600
+++ b/mm7_data.h	Sun Jun 01 18:37:09 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	Sun Jun 01 17:20:22 2014 +0600
+++ b/mm7_unsorted_subs.h	Sun Jun 01 18:37:09 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);