diff GUI/UI/UIShops.cpp @ 2501:0ff6a9e9bf7f

GUI folger
author Ritor1
date Fri, 19 Sep 2014 04:21:12 +0600
parents
children a77c34acdbc9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/UIShops.cpp	Fri Sep 19 04:21:12 2014 +0600
@@ -0,0 +1,1978 @@
+#define _CRTDBG_MAP_ALLOC
+#include <stdlib.h>
+#include <crtdbg.h>
+
+#define _CRT_SECURE_NO_WARNINGS
+#include "UIShops.h"
+#include "..\../Engine/Objects/Items.h"
+#include "..\../GUIWindow.h"
+#include "..\../Engine/mm7_data.h"
+#include "..\../Engine/texts.h"
+#include "UIHouses.h"
+#include "..\../GUIFont.h"
+#include "..\../Engine/Graphics/Render.h"
+#include "..\../Engine/Party.h"
+#include "..\../Engine/Graphics/Texture.h"
+#include "..\../Mouse.h"
+#include "..\../Engine/Events2D.h"
+#include "..\../AudioPlayer.h"
+#include "..\../Engine/MapInfo.h"
+#include "..\../Engine/Graphics/Viewport.h"
+#include "..\../Engine/Graphics/Outdoor.h"
+#include "..\../Engine/Graphics/Indoor.h"
+
+
+
+//----- (004B910F) --------------------------------------------------------
+void  WeaponShopDialog()
+{
+  int phrases_id; // eax@16
+  int v19; // edi@25
+  GUIButton *pButton; // esi@27
+  unsigned int pColorText; // ax@27
+  signed int v32; // esi@41
+  const char *pText; // ecx@84
+  int all_text_height; // esi@96
+  ItemGen *item; 
+  int pItemID;
+  POINT mouse; // [sp+64h] [bp-94h]@8
+  GUIWindow dialog_window; // [sp+7Ch] [bp-7Ch]@1
+  __int32 v103; // [sp+D4h] [bp-24h]@25
+  int pPrice; // [sp+ECh] [bp-Ch]@26
+  unsigned int v109;
+  int pNumString;
+  int item_X;
+
+  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
+  dialog_window.uFrameX = 483;
+  dialog_window.uFrameWidth = 148;
+  dialog_window.uFrameZ = 334;
+
+  switch(dialog_menu_id)
+  {
+    case HOUSE_DIALOGUE_MAIN:
+    {
+      if ( HouseUI_CheckIfPlayerCanInteract() )
+      {
+        pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[134]);
+        pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[152]);
+        pShopOptions[2] = const_cast<char *>(pGlobalTXT_LocalizationStrings[159]);
+        pShopOptions[3] = const_cast<char *>(pGlobalTXT_LocalizationStrings[160]);
+        all_text_height = 0;
+        for ( int i = 0; i < 4; ++i )
+          all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
+        v103 = (174 - all_text_height) / 4;
+        v19 = (174 - 4 * (174 - all_text_height) / 4 - all_text_height) / 2 - (174 - all_text_height) / 4 / 2 + 138;
+        pNumString = 0;
+        for ( int i = pDialogueWindow->pStartingPosActiveItem; i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+        {
+          pButton = pDialogueWindow->GetControl(i);
+          pButton->uY = v103 + v19;
+          pButton->uHeight = pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0);
+          v19 = pButton->uY + pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0) - 1;
+          pButton->uW = v19;
+          pColorText = Color16(0xE1u, 0xCDu, 0x23u);
+          if ( pDialogueWindow->pCurrentPosActiveItem != i )
+            pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
+          dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pShopOptions[pNumString], 3);
+          ++pNumString;
+        }
+      }
+      break;
+    }
+    case HOUSE_DIALOGUE_SHOP_BUY_STANDARD:
+    {
+      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
+      item_X = 0;
+      for ( uint i = 0; i < 6; ++i )
+      {
+        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID)
+        {
+          pRenderer->DrawTextureTransparent((60 - ((signed int)ItemsInShopTexture[i]->uTextureWidth / 2)) + item_X, weapons_Ypos[i] + 30, ItemsInShopTexture[i]);
+          ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[(60 - ((signed int)ItemsInShopTexture[i]->uTextureWidth / 2)) + item_X + window->GetWidth() * (weapons_Ypos[i] + 30)], ItemsInShopTexture[i], i + 1);
+        }
+        item_X += 70;
+      }
+      if ( HouseUI_CheckIfPlayerCanInteract() )
+      {
+        uint item_num = 0;
+        for ( uint i = 0; i < 6; ++i )
+        {
+          if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID)
+            ++item_num;
+        }
+        if ( GetAsyncKeyState(VK_CONTROL) && pPlayers[uActiveCharacter]->CanSteal() )
+          pText = pGlobalTXT_LocalizationStrings[185];//Украсть предмет
+        else
+          pText = pGlobalTXT_LocalizationStrings[195];//Выберите предмет для покупки
+        DrawTextAtStatusBar(pText, 0);
+        if ( item_num )
+        {
+          pMouse->GetCursorPos(&mouse);
+          if ( pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF )
+          {
+            item = &pParty->StandartItemsInShops[(int)window_SpeakInHouse->ptr_1C][(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1];
+            if ( !GetAsyncKeyState(VK_CONTROL) || !pPlayers[uActiveCharacter]->CanSteal() )
+            {
+              pText = BuildDialogueString(pMerchantsBuyPhrases[pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_WeaponShop, (int)window_SpeakInHouse->ptr_1C, 2)],
+                                       uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+              dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+            }
+            else
+            {
+              pText = BuildDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+              dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+            }
+          }
+        }
+        else
+          dialog_window.DrawShops_next_generation_time_string(pParty->PartyTimes.Shops_next_generation_time[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed);//Приходите через 7 дней
+      }
+      break;
+    }
+
+    case HOUSE_DIALOGUE_SHOP_BUY_SPECIAL:
+    {
+      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
+      item_X = 0;
+      for ( uint i = 0; i < 6; ++i )
+      {
+        if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID)
+        {
+          pRenderer->DrawTextureTransparent((60 - ((signed int)ItemsInShopTexture[i]->uTextureWidth / 2)) + item_X, weapons_Ypos[i] + 30, ItemsInShopTexture[i]);
+          ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[(60 - ((signed int)ItemsInShopTexture[i]->uTextureWidth / 2)) + item_X + window->GetWidth() * (weapons_Ypos[i] + 30)], ItemsInShopTexture[i], i + 1);
+        }
+        item_X += 70;
+      }
+      if ( HouseUI_CheckIfPlayerCanInteract() )
+      {
+        uint item_num = 0;
+        for ( uint i = 0; i < 6; ++i )
+        {
+          if ( pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID )
+            ++item_num;
+        }
+        if ( GetAsyncKeyState(VK_CONTROL) && pPlayers[uActiveCharacter]->CanSteal() )
+          pText = pGlobalTXT_LocalizationStrings[185];
+        else
+            pText = pGlobalTXT_LocalizationStrings[196];
+        DrawTextAtStatusBar(pText, 0);
+        if ( item_num )
+        {
+          pMouse->GetCursorPos(&mouse);
+          if ( pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF )
+          {
+            item = &pParty->SpecialItemsInShops[(int)window_SpeakInHouse->ptr_1C][(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1];
+            if ( !GetAsyncKeyState(VK_CONTROL) || !pPlayers[uActiveCharacter]->CanSteal() )
+            {
+              pText = BuildDialogueString(pMerchantsBuyPhrases[pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_WeaponShop, (int)window_SpeakInHouse->ptr_1C, 2)],
+                                       uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+              dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+            }
+            else
+            {
+              pText = BuildDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+              dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+            }
+          }
+        }
+        else
+          dialog_window.DrawShops_next_generation_time_string(pParty->PartyTimes.Shops_next_generation_time[(unsigned int)window_SpeakInHouse->ptr_1C]  - pParty->uTimePlayed);
+      }
+      break;
+    }
+
+    case HOUSE_DIALOGUE_SHOP_SELL:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[199], 0);
+      if ( !HouseUI_CheckIfPlayerCanInteract() )
+        return;
+      pMouse->GetCursorPos(&mouse);
+      v109 = ((mouse.x + 14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+      if( mouse.x <= 13 || mouse.x >= 462 )
+        return;
+      pItemID = pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v109);
+      if ( !pItemID )
+        return;
+      item = &pPlayers[uActiveCharacter]->pInventoryItemList[pItemID - 1];
+      phrases_id = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_WeaponShop, (int)window_SpeakInHouse->ptr_1C, 3);
+      pText = BuildDialogueString(pMerchantsSellPhrases[phrases_id], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 3, 0);
+      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+      break;
+    }
+    case HOUSE_DIALOGUE_SHOP_IDENTIFY:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[197], 0);
+      if ( !HouseUI_CheckIfPlayerCanInteract() )
+        return;
+      pMouse->GetCursorPos(&mouse);
+      v109 = ((mouse.x - 14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+      if( mouse.x <= 13 || mouse.x >= 462 )
+        return;
+      pItemID = pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v109);
+      if ( !pItemID )
+        return;
+      item = &pPlayers[uActiveCharacter]->pInventoryItemList[pItemID - 1];
+      if (!item->IsIdentified())
+      {
+        phrases_id = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_WeaponShop, (int)window_SpeakInHouse->ptr_1C, 4);
+        pText = BuildDialogueString(pMerchantsIdentifyPhrases[phrases_id], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
+        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+      }
+      else
+      {
+        pText = BuildDialogueString("%24", uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
+        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+      }
+      break;
+    }
+
+    case HOUSE_DIALOGUE_SHOP_REPAIR:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[198], 0);
+      if ( !HouseUI_CheckIfPlayerCanInteract())
+        return;
+      pMouse->GetCursorPos(&mouse);
+      v109 = ((mouse.x - 14) >> 5) + 14 * (mouse.y - 17) >> 5;
+      if( ( mouse.x <= 13) || mouse.x >= 462 )
+        return;
+      pItemID = pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v109);
+      if ( !pItemID || (!(pPlayers[uActiveCharacter]->pOwnItems[pItemID - 1].uAttributes & 2)) )
+        return;
+      item = &pPlayers[uActiveCharacter]->pInventoryItemList[pItemID - 1];
+      phrases_id = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_ArmorShop, (int)window_SpeakInHouse->ptr_1C, 5);
+      pText = BuildDialogueString(pMerchantsRepairPhrases[phrases_id], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 5, 0);
+      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+      return;
+    }
+    break;
+
+    case HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[200]);//sell
+      pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[113]);//identify
+      pShopOptions[2] = const_cast<char *>(pGlobalTXT_LocalizationStrings[179]);//repair
+      all_text_height = 0;
+      for ( int i = 0; i < 3; ++i )
+        all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
+      v103 = (174 - all_text_height) / 3;
+      v19 = (3 * (58 - (signed int)v103) - all_text_height) / 2 - ((174 - all_text_height) / 3) / 2 + 138;
+      pNumString = 0;
+      for ( int i = pDialogueWindow->pStartingPosActiveItem; i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+      {
+        pButton = pDialogueWindow->GetControl(i);
+        pButton->uY = v103 + v19;
+        pButton->uHeight = pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0);
+        v19 = pButton->uY + pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0) - 1;
+        pButton->uW = v19;
+        pColorText = Color16(0xE1u, 0xCDu, 0x23u);
+        if ( pDialogueWindow->pCurrentPosActiveItem != i )
+          pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
+        dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pShopOptions[pNumString], 3);
+        ++pNumString;
+        }
+      break;
+    }
+
+    case HOUSE_DIALOGUE_LEARN_SKILLS:
+    {
+      if (!HouseUI_CheckIfPlayerCanInteract())
+        return;
+      uint item_num = 0;
+      all_text_height = 0;
+      v32 = (signed __int64)(p2DEvents[(signed int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
+      pPrice = v32 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
+      if ( pPrice < v32 / 3 )
+        pPrice = v32 / 3;
+      for ( int i = pDialogueWindow->pStartingPosActiveItem;
+            i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+      {
+        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pDialogueWindow->GetControl(i)->msg_param - 36]
+          && !pPlayers[uActiveCharacter]->pActiveSkills[pDialogueWindow->GetControl(i)->msg_param - 36] )
+        {
+          all_text_height += pFontArrus->CalcTextHeight(pSkillNames[pDialogueWindow->GetControl(i)->msg_param - 36], &dialog_window, 0, 0);
+          item_num++;
+        }
+      }
+      if ( item_num )
+      {
+        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[401], pPrice);//Стоимость навыка: %lu
+        dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf.data(), 3);
+        v103 = (149 - all_text_height) / item_num;
+        if ( (149 - all_text_height) / item_num > 32 )
+          v103 = 32;
+        v19 = (149 - item_num * v103 - all_text_height) / 2 - v103 / 2 + 162;
+        for ( uint i = pDialogueWindow->pStartingPosActiveItem;
+                   i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+        {
+          pButton = pDialogueWindow->GetControl(i);
+          if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pButton->msg_param - 36] || pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param - 36] )
+          {
+            pButton->uW = 0;
+            pButton->uHeight = 0;
+            pButton->uY = 0;
+          }
+          else
+          {
+            pButton->uY = v103 + v19;
+            pButton->uHeight = pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &dialog_window, 0, 0);
+            v19 = pButton->uY + pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &dialog_window, 0, 0) - 1;
+            pButton->uW = v19;
+            pColorText = Color16(0xE1u, 0xCDu, 0x23u);
+            if ( pDialogueWindow->pCurrentPosActiveItem != i )
+              pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
+            dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pSkillNames[pButton->msg_param - 36], 3);
+          }
+        }
+        break;
+      }
+      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[544], pPlayers[uActiveCharacter]->pName, pClassNames[pPlayers[uActiveCharacter]->classType]);
+      strcat(pTmpBuf.data(), "\n \n");
+      strcat(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[528]);//Больше ничего не могу предложить.
+      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pTmpBuf.data(), &dialog_window, 0, 0)) / 2 + 138, Color16(0xE1u, 0xCDu, 0x23u), pTmpBuf.data(), 3);
+      return;
+    }
+    default:
+    {
+      __debugbreak();
+      break;
+    }
+  }
+}
+
+//----- (004BA928) --------------------------------------------------------
+void  ArmorShopDialog()
+{
+  int phrases_id; // eax@20
+  int all_text_height; // ebx@22
+  int v146; // [sp+E4h] [bp-20h]@24
+  int v23; // ebx@24
+  GUIButton *pButton; // eax@26
+  signed int v38; // esi@42
+  int v59; // eax@68
+  const char *pText; // ecx@91
+  ItemGen *selected_item; // ecx@99
+  int pNumString; // edx@109
+  unsigned __int16 pTextColor; // ax@109
+  POINT mouse; // [sp+4Ch] [bp-B8h]@97
+  GUIWindow dialog_window; // [sp+8Ch] [bp-78h]@1
+  __int32 pItemCount; // [sp+F0h] [bp-14h]@8
+  int item_x; // [sp+100h] [bp-4h]@44
+  int pPrice;
+  unsigned int v153;
+
+  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
+  dialog_window.uFrameX = 483;
+  dialog_window.uFrameWidth = 148;
+  dialog_window.uFrameZ = 334;
+  switch (dialog_menu_id)
+  {
+    case HOUSE_DIALOGUE_MAIN:
+    {
+      if ( !HouseUI_CheckIfPlayerCanInteract() )
+        return;
+      pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[134]); //"Buy Standard"
+      pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[152]); //"Buy Special"
+      pShopOptions[2] = const_cast<char *>(pGlobalTXT_LocalizationStrings[159]); //"Display Inventory"
+      pShopOptions[3] = const_cast<char *>(pGlobalTXT_LocalizationStrings[160]);
+      all_text_height = 0;
+      for( int i = 0; i < 4; ++i )
+        all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
+      v146 = ( 174 - all_text_height ) / 4;
+      v23 = ( 174 - 4 * ( 174 - all_text_height ) / 4 - all_text_height ) / 2 - ( 174 - all_text_height ) / 4 / 2 + 138;
+      pNumString = 0;
+      for (int i = pDialogueWindow->pStartingPosActiveItem;
+               i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i)
+      {
+        pButton = pDialogueWindow->GetControl(i);
+        pButton->uY = v146 + v23;
+        pButton->uHeight = pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0);
+        v23 = pButton->uY + pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0) - 1;
+        pButton->uW = v23;
+        pTextColor = Color16(0xE1u, 0xCDu, 0x23u);
+        if ( pDialogueWindow->pCurrentPosActiveItem != i )
+          pTextColor = Color16(0xFFu, 0xFFu, 0xFFu);
+        dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pShopOptions[pNumString], 3);
+        ++pNumString;
+      }
+    }
+    break;
+
+    case HOUSE_DIALOGUE_SHOP_BUY_STANDARD:
+    {
+      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);// подложка
+      item_x = 0;
+      for ( int i = 0; i < 8; ++i )// разместить вещи
+      {
+        if ( pParty->StandartItemsInShops[window_SpeakInHouse->par1C][i].uItemID)
+        {
+          if ( i >= 4 )  //low row
+          {
+            pRenderer->DrawTextureTransparent((90 - (ItemsInShopTexture[i]->uTextureWidth / 2)) + item_x - 420, 126, ItemsInShopTexture[i]);
+            v59 = (90 - (ItemsInShopTexture[i]->uTextureWidth / 2)) + item_x + 80220;
+          }
+          else
+          {
+            pRenderer->DrawTextureTransparent(( 86 - (ItemsInShopTexture[i]->uTextureWidth / 2)) + item_x, 98 -  ItemsInShopTexture[i]->uTextureHeight, ItemsInShopTexture[i]);
+            v59 = item_x + (86 - (ItemsInShopTexture[i]->uTextureWidth / 2)) + window->GetWidth() * (98 -  ItemsInShopTexture[i]->uTextureHeight);
+          }
+          ZBuffer_DoFill(&pRenderer->pActiveZBuffer[v59], ItemsInShopTexture[i], i + 1);
+        }
+        item_x += 105;
+      }
+      if ( !HouseUI_CheckIfPlayerCanInteract() )
+        return;
+      pItemCount = 0;
+      for ( int i = 0; i < 8; ++i )
+      {
+        if ( pParty->StandartItemsInShops[window_SpeakInHouse->par1C][i].uItemID )
+          ++pItemCount;
+      }
+      if ( GetAsyncKeyState(VK_CONTROL) == 0 || pPlayers[uActiveCharacter]->CanSteal() == 0 )
+        pText = pGlobalTXT_LocalizationStrings[195]; //"Select the Item to Buy"
+      else
+        pText = pGlobalTXT_LocalizationStrings[185];//"Steal item"
+      DrawTextAtStatusBar(pText, 0);
+      if ( pItemCount )
+      {
+        pMouse->GetCursorPos(&mouse);
+        if ( !(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) )
+          return;
+        selected_item = &pParty->StandartItemsInShops[window_SpeakInHouse->par1C][(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1];
+        if ( !GetAsyncKeyState(VK_CONTROL) || !pPlayers[uActiveCharacter]->CanSteal())
+        {
+          pText = BuildDialogueString(pMerchantsBuyPhrases[pPlayers[uActiveCharacter]->SelectPhrasesTransaction(selected_item, BuildingType_ArmorShop, window_SpeakInHouse->par1C, 2)],
+                                 uActiveCharacter - 1, selected_item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+          dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+        }
+        else
+        {
+          pText = BuildDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, selected_item, (char *)window_SpeakInHouse->ptr_1C, 2, 0); //"Steal %24"
+          dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+        }
+        return;
+      }
+      dialog_window.DrawShops_next_generation_time_string(pParty->PartyTimes.Shops_next_generation_time[window_SpeakInHouse->par1C]- pParty->uTimePlayed);
+      return;
+    }
+    break;
+
+    case HOUSE_DIALOGUE_SHOP_BUY_SPECIAL:
+    {
+      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
+      item_x = 0;
+      for ( int i = 0; i < 8; ++i )
+      {
+        if ( pParty->SpecialItemsInShops[window_SpeakInHouse->par1C][i].uItemID )
+        {
+          if ( i >= 4 )
+          {
+            pRenderer->DrawTextureTransparent(item_x + (90 - ((signed int)ItemsInShopTexture[i]->uTextureWidth / 2)) - 420, 126, ItemsInShopTexture[i]);
+            v59 = item_x + (90 - ((signed int)ItemsInShopTexture[i]->uTextureWidth / 2)) + 80220;
+          }
+          else
+          {
+            pRenderer->DrawTextureTransparent(86 - ((signed int)ItemsInShopTexture[i]->uTextureWidth / 2) + item_x, 98 - ItemsInShopTexture[i]->uTextureHeight, ItemsInShopTexture[i]);
+            v59 = (86 - ((signed int)ItemsInShopTexture[i]->uTextureWidth / 2)) + item_x + window->GetWidth() * (98 - ItemsInShopTexture[i]->uTextureHeight);
+          }
+          ZBuffer_DoFill(&pRenderer->pActiveZBuffer[v59], ItemsInShopTexture[i], i + 1);
+        }
+        item_x += 105;
+      }
+      if ( !HouseUI_CheckIfPlayerCanInteract() )
+        return;
+      pItemCount = 0;
+      for ( uint i = 0; i < 6; ++i )
+      {
+        if (pParty->SpecialItemsInShops[window_SpeakInHouse->par1C][i].uItemID)
+          ++pItemCount;
+      }
+      if ( !GetAsyncKeyState(VK_CONTROL) || !pPlayers[uActiveCharacter]->CanSteal() )
+        pText = pGlobalTXT_LocalizationStrings[196]; //Select the Special Item to Buy"
+      else
+        pText = pGlobalTXT_LocalizationStrings[185];
+      DrawTextAtStatusBar(pText, 0);
+      if ( pItemCount )
+      {
+        pMouse->GetCursorPos(&mouse);
+        if ( !(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) )
+          return;
+        pItemCount = (pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1;
+        if ( dialog_menu_id == 2 )
+          selected_item = &pParty->StandartItemsInShops[window_SpeakInHouse->par1C][(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1];
+        else
+          selected_item = &pParty->SpecialItemsInShops[window_SpeakInHouse->par1C][(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1];
+        if ( !GetAsyncKeyState(VK_CONTROL) || !pPlayers[uActiveCharacter]->CanSteal() )
+        {
+          pText = BuildDialogueString(pMerchantsBuyPhrases[pPlayers[uActiveCharacter]->SelectPhrasesTransaction(selected_item, BuildingType_ArmorShop, window_SpeakInHouse->par1C, 2)],
+                 uActiveCharacter - 1, selected_item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+          dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+        }
+        else
+        {
+          pText = BuildDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, selected_item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);//"Steal %24"
+          dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+        }
+        return;
+      }
+      dialog_window.DrawShops_next_generation_time_string(pParty->PartyTimes.Shops_next_generation_time[window_SpeakInHouse->par1C]- pParty->uTimePlayed);
+      return;
+    }
+    break;
+
+    case HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[200]); //"Sell"
+      pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[113]); //"Identify"
+      pShopOptions[2] = const_cast<char *>(pGlobalTXT_LocalizationStrings[179]); //"Repair"
+      all_text_height = 0;
+      for ( int i = 0; i < 3; ++i )
+        all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
+      v146 = (174 - all_text_height) / 3;
+      v23 = (3 * (58 - v146) - all_text_height) / 2 - v146 / 2 + 138;
+      pNumString = 0;
+      for ( int i = pDialogueWindow->pStartingPosActiveItem;
+                i  < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+      {
+        pButton = pDialogueWindow->GetControl(i);
+        pButton->uY = v146 + v23;
+        pButton->uHeight = pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0);
+        v23 = pButton->uY + pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0) - 1;
+        pButton->uW = v23;
+        pTextColor = Color16(0xE1u, 0xCDu, 0x23u);
+        if ( pDialogueWindow->pCurrentPosActiveItem != i )
+          pTextColor = Color16(0xFFu, 0xFFu, 0xFFu);
+        dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pShopOptions[pNumString], 3);
+        ++pNumString;
+      }
+      return;
+    }
+    break;
+
+    case HOUSE_DIALOGUE_SHOP_SELL:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[199], 0);//"Select the Item to Sell"
+      if ( !HouseUI_CheckIfPlayerCanInteract())
+        return;
+      pMouse->GetCursorPos(&mouse);
+      v153 = ((mouse.x - 14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+      if ( mouse.x <= 13 || mouse.x >= 462 )
+        return;
+      if ( !pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v153) )
+           return;
+      selected_item = &pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v153) - 1];
+      pText = BuildDialogueString(pMerchantsSellPhrases[pPlayers[uActiveCharacter]->SelectPhrasesTransaction(selected_item, BuildingType_ArmorShop, window_SpeakInHouse->par1C, 3)],
+              uActiveCharacter - 1, selected_item, (char *) window_SpeakInHouse->par1C, 3, 0);
+      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+      return;
+    }
+    break;
+    case HOUSE_DIALOGUE_SHOP_IDENTIFY:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[197], 0); //"Select the Item to Identify"	
+      if ( HouseUI_CheckIfPlayerCanInteract() )
+      {
+        pMouse->GetCursorPos(&mouse);
+        v153 = ((mouse.x - 14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+        if ( mouse.x > 13 && mouse.x < 462 )
+        {
+          if ( pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v153) )
+          {
+            selected_item = &pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v153)-1];
+            if (selected_item->IsIdentified())
+              pText = BuildDialogueString("%24", uActiveCharacter - 1, selected_item, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
+            else
+              pText = BuildDialogueString(pMerchantsIdentifyPhrases[pPlayers[uActiveCharacter]->SelectPhrasesTransaction(selected_item, BuildingType_ArmorShop,
+                    (int)window_SpeakInHouse->ptr_1C, 4)], uActiveCharacter - 1, selected_item, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
+            dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+            return;
+          }
+        }
+      }
+    }
+    break;
+    case HOUSE_DIALOGUE_SHOP_REPAIR:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[198], 0);
+      if ( !HouseUI_CheckIfPlayerCanInteract())
+        return;
+      pMouse->GetCursorPos(&mouse);
+      v153 = ((mouse.x -14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+      if( mouse.x <= 13 || mouse.x >= 462 )
+        return;
+      if ( !pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v153)
+       || (!(pPlayers[uActiveCharacter]->pOwnItems[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v153) - 1].uAttributes& 2)) )
+        return;
+      selected_item = &pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v153) - 1];
+      phrases_id = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(&pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v153) - 1],
+             BuildingType_ArmorShop, window_SpeakInHouse->par1C, 5);
+      pText = BuildDialogueString(pMerchantsRepairPhrases[phrases_id], uActiveCharacter - 1, selected_item, (char *)window_SpeakInHouse->ptr_1C, 5, 0);
+      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+      return;
+    }
+    break;
+
+    case HOUSE_DIALOGUE_LEARN_SKILLS:
+    {
+      if (!HouseUI_CheckIfPlayerCanInteract() )
+        return;
+      uint item_num = 0;
+      v38 = (signed __int64)(p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
+      pPrice = v38 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
+      if ( (signed int)pPrice < v38 / 3 )
+        pPrice = v38 / 3;
+      all_text_height = 0;
+      for ( int i = pDialogueWindow->pStartingPosActiveItem;
+                  i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+      {
+        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pDialogueWindow->GetControl(i)->msg_param - 36]
+             && !pPlayers[uActiveCharacter]->pActiveSkills[pDialogueWindow->GetControl(i)->msg_param - 36] )
+        {
+          all_text_height += pFontArrus->CalcTextHeight(pSkillNames[pDialogueWindow->GetControl(i)->msg_param - 36], &dialog_window, 0, 0);
+          item_num ++;
+        }
+      }
+      if ( item_num )
+      {
+        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[401], pPrice);
+        dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf.data(), 3);
+        v146 = (149 - all_text_height) / item_num;
+        if ( (149 - all_text_height) / item_num > 32 )
+          v146 = 32;
+        v23 = (149 - v146 * item_num - all_text_height) / 2 - v146 / 2 + 162;
+        for ( int i = pDialogueWindow->pStartingPosActiveItem;
+                  i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+        {
+          pButton = pDialogueWindow->GetControl(i);
+          if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pButton->msg_param - 36]
+            || pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param - 36] )
+          {
+            pButton->uW = 0;
+            pButton->uHeight = 0;
+            pButton->uY = 0;
+          }
+          else
+          {
+            pButton->uY = v146 + v23;
+            pButton->uHeight = pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &dialog_window, 0, 0);
+            v23 = pButton->uY + pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &dialog_window, 0, 0) - 1;
+            pButton->uW = v23;
+            pTextColor = Color16(0xE1u, 0xCDu, 0x23u);
+            if ( pDialogueWindow->pCurrentPosActiveItem != i )
+              pTextColor = Color16(0xFFu, 0xFFu, 0xFFu);
+            dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pSkillNames[pButton->msg_param - 36], 3);
+          }
+        }
+        return;
+      }
+      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[544], pPlayers[uActiveCharacter]->pName, pClassNames[pPlayers[uActiveCharacter]->classType]); //"Seek knowledge elsewhere %s the %s"
+      strcat(pTmpBuf.data(), "\n \n");
+      strcat(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[528]); //"I can offer you nothing further."
+      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pTmpBuf.data(), &dialog_window, 0, 0)) / 2 + 138, Color16(0xE1u, 0xCDu, 0x23u), pTmpBuf.data(), 3);
+      return;
+    }
+    break;
+    default:
+      __debugbreak();
+  }
+}
+//----- (004B9CC6) --------------------------------------------------------
+void  AlchemistDialog()
+{
+  int index; // eax@7
+  signed int v5; // esi@9
+  int v18; // eax@23
+  const char *pText; // edx@29
+  unsigned int product_height_1row; // edi@55
+  unsigned int product_width_1row; // esi@57
+  unsigned int product_height_2row; // edi@67
+  unsigned int product_width_2row; // esi@69
+  ItemGen *item; // esi@118
+  int v71; // eax@123
+  int all_text_height; // edi@125
+  GUIButton *pButton; // esi@129
+  unsigned int pColorText; // ax@129
+  POINT mouse; // [sp+2Ch] [bp-ACh]@117
+  GUIWindow dialog_window; // [sp+5Ch] [bp-7Ch]@1
+  int v105; // [sp+B0h] [bp-28h]@19
+  int pNumString; // [sp+C8h] [bp-10h]@9
+  int item_num; // [sp+D4h] [bp-4h]@11
+  int pPrice;
+
+  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
+  dialog_window.uFrameX = 483;
+  dialog_window.uFrameWidth = 148;
+  dialog_window.uFrameZ = 334;
+  switch(dialog_menu_id)
+  {
+    case HOUSE_DIALOGUE_MAIN:
+    {
+      if ( HouseUI_CheckIfPlayerCanInteract() )
+      {
+        pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[134]);
+        pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[152]);
+        pShopOptions[2] = const_cast<char *>(pGlobalTXT_LocalizationStrings[159]);
+        pShopOptions[3] = const_cast<char *>(pGlobalTXT_LocalizationStrings[160]);
+        all_text_height = 0;
+        for ( int i = 0; i < 4; ++i )
+          all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
+        v18 = (174 - all_text_height) / 4;
+        v105 = (174 - 4 * (174 - all_text_height) / 4 - all_text_height) / 2 - (174 - all_text_height) / 4 / 2 + 138;
+        pNumString = 0;
+        for ( int i = pDialogueWindow->pStartingPosActiveItem;
+                  i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+        {
+          pButton = pDialogueWindow->GetControl(i);
+          pButton->uY = v18 + v105;
+          pButton->uHeight = pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0);
+          v105 = pButton->uY + pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0) - 1;
+          pButton->uW = v105;
+          pColorText = Color16(0xE1u, 0xCDu, 0x23u);
+          if ( pDialogueWindow->pCurrentPosActiveItem != i )
+            pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
+          dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pShopOptions[pNumString], 3);
+          ++pNumString;
+        }
+      }
+      return;
+    }
+
+    case HOUSE_DIALOGUE_SHOP_BUY_STANDARD:
+    {
+      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
+      for ( uint i = 0; i < 6; ++i )
+      {
+        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID )
+        {
+          product_height_1row = 152 - ItemsInShopTexture[i]->uTextureHeight;
+          if ( (signed int)product_height_1row < 1 )
+            product_height_1row = 0;
+          product_width_1row = 75 * i - ItemsInShopTexture[i]->uTextureWidth / 2 + 40;
+          if ( i )
+          {
+            if ( i == 5 )
+            {
+              if ( (signed int)product_width_1row > 457 - ItemsInShopTexture[5]->uTextureWidth )
+                product_width_1row = 457 - ItemsInShopTexture[5]->uTextureWidth;
+            }
+          }
+          else if ( (signed int)product_width_1row < 18 )
+            product_width_1row = 18;
+          pRenderer->DrawTextureTransparent(product_width_1row, product_height_1row, ItemsInShopTexture[i]);
+          ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[product_width_1row + window->GetWidth() * product_height_1row], ItemsInShopTexture[i], i + 1);
+        }
+      }
+      for ( uint i = 0; i < 6; ++i )
+      {
+        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i + 6].uItemID )
+        {
+          product_height_2row = 308 - ItemsInShopTexture[i + 6]->uTextureHeight;
+          if ( (signed int)product_height_2row < 1 )
+            product_height_2row = 0;
+          product_width_2row = 75 * i - ItemsInShopTexture[i + 6]->uTextureWidth / 2 + 40;
+          if ( i )
+          {
+            if ( i == 5 )
+            {
+              if ( (signed int)product_width_2row > 457 - ItemsInShopTexture[11]->uTextureWidth )
+                product_width_2row = 457 - ItemsInShopTexture[11]->uTextureWidth;
+            }
+          }
+          else
+          {
+            if ( (signed int)product_width_2row < 18 )
+              product_width_2row = 18;
+          }
+          pRenderer->DrawTextureTransparent(product_width_2row, product_height_2row, ItemsInShopTexture[i + 6]);
+          ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[product_width_2row + window->GetWidth() * product_height_2row], ItemsInShopTexture[i + 6], i + 7);
+        }
+      }
+      if ( HouseUI_CheckIfPlayerCanInteract() )
+      {
+        item_num = 0;
+        for ( uint i = 0; i < 12; ++i )
+        {
+          if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID)
+            ++item_num;
+        }
+        if ( GetAsyncKeyState(VK_CONTROL) && pPlayers[uActiveCharacter]->CanSteal() )
+          DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[185], 0);
+        else
+          DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[195], 0);
+        if ( !item_num )
+        {
+          dialog_window.DrawShops_next_generation_time_string(pParty->PartyTimes.Shops_next_generation_time[ (unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed);
+          return;
+        }
+        pMouse->GetCursorPos(&mouse);
+        if ( pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF )
+        {
+          item = &pParty->StandartItemsInShops[(int)window_SpeakInHouse->ptr_1C][(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1];
+          if ( !GetAsyncKeyState(VK_CONTROL) || !pPlayers[uActiveCharacter]->CanSteal() )
+          {
+            v71 = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_AlchemistShop, (int)window_SpeakInHouse->ptr_1C, 2);
+            pText = BuildDialogueString(pMerchantsBuyPhrases[v71], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+          }
+          else
+            pText = BuildDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+          dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+          return ;
+        }
+      }
+      return;
+    }
+
+    case HOUSE_DIALOGUE_SHOP_BUY_SPECIAL:
+    {
+      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
+      for ( uint i = 0; i < 6; ++i )
+      {
+        if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID)
+        {
+          product_height_1row = 152 - ItemsInShopTexture[i]->uTextureHeight;
+          if ( (signed int)product_height_1row < 1 )
+            product_height_1row = 0;
+          product_width_1row = 75 * i - ItemsInShopTexture[i]->uTextureWidth / 2 + 40;
+          if ( i )
+          {
+            if ( i == 5 )
+            {
+              if ( (signed int)product_width_1row > 457 - ItemsInShopTexture[5]->uTextureWidth )
+                product_width_1row = 457 - ItemsInShopTexture[5]->uTextureWidth;
+            }
+          }
+          else
+          {
+            if ( (signed int)product_width_1row < 18 )
+              product_width_1row = 18;
+          }
+          pRenderer->DrawTextureTransparent(product_width_1row, product_height_1row, ItemsInShopTexture[i]);
+          ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[product_width_1row + window->GetWidth() * product_height_1row], ItemsInShopTexture[i], i + 1);
+        }
+      }
+      for ( uint i = 0; i < 6; ++i )
+      {
+        if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][(signed int)i + 6].uItemID) //not itemid
+        {
+          product_height_2row = 308 - ItemsInShopTexture[i + 6]->uTextureHeight;
+          if ( (signed int)product_height_2row < 1 )
+            product_height_2row = 0;
+          product_width_2row = 75 * i - ItemsInShopTexture[i + 6]->uTextureWidth / 2 + 40;
+          if ( i )
+          {
+            if ( i == 5 )
+            {
+              if ( (signed int)product_width_2row > 457 - ItemsInShopTexture[11]->uTextureWidth )
+                product_width_2row = 457 - ItemsInShopTexture[11]->uTextureWidth;
+            }
+          }
+          else
+          {
+            if ( (signed int)product_width_2row < 18 )
+              product_width_2row = 18;
+          }
+          pRenderer->DrawTextureTransparent(product_width_2row, product_height_2row, ItemsInShopTexture[i + 6]);
+          ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[product_width_2row + window->GetWidth() * product_height_2row], ItemsInShopTexture[i + 6], i + 7);
+        }
+      }
+      if ( HouseUI_CheckIfPlayerCanInteract() )
+      {
+        item_num = 0;
+        for ( uint i = 0; i < 12; ++i )
+        {
+          if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID)
+            ++item_num;
+        }
+        if ( GetAsyncKeyState(VK_CONTROL) && pPlayers[uActiveCharacter]->CanSteal() )
+          DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[185], 0);
+        else
+          DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[196], 0);
+        if ( !item_num )
+        {
+          dialog_window.DrawShops_next_generation_time_string(pParty->PartyTimes.Shops_next_generation_time[ (unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed);
+          return;
+        }
+        pMouse->GetCursorPos(&mouse);
+        if ( pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF )
+        {
+          item = &pParty->SpecialItemsInShops[(int)window_SpeakInHouse->ptr_1C][(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1];
+          if ( !GetAsyncKeyState(VK_CONTROL) || !pPlayers[uActiveCharacter]->CanSteal() )
+          {
+            v71 = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_AlchemistShop, (int)window_SpeakInHouse->ptr_1C, 2);
+            pText = BuildDialogueString(pMerchantsBuyPhrases[v71], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+          }
+          else
+            pText = BuildDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+          dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+          return;
+        }
+      }
+      return;
+    }
+
+    case HOUSE_DIALOGUE_SHOP_SELL:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[199], 0);
+      if ( !HouseUI_CheckIfPlayerCanInteract() )
+        return;
+      pMouse->GetCursorPos(&mouse);
+      index = ((mouse.x - 14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+      if ( mouse.x <= 13 || mouse.x >= 462 )
+        return;
+      if ( !pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&index) )
+          return;
+      v71 = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(&pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&index) - 1],
+             BuildingType_AlchemistShop, (int)window_SpeakInHouse->ptr_1C, 3);
+      pText = BuildDialogueString(pMerchantsSellPhrases[v71], uActiveCharacter - 1, &pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&index) - 1],
+             (char *)window_SpeakInHouse->ptr_1C, 3, 0);
+      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+      return; 
+    }
+
+    case HOUSE_DIALOGUE_SHOP_IDENTIFY:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[197], 0);
+      if ( HouseUI_CheckIfPlayerCanInteract() )
+        return;
+      pMouse->GetCursorPos(&mouse);
+      index = ((mouse.x - 14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+      if ( mouse.x <= 13 || mouse.x >= 462 )
+        return;
+      if ( !pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&index) )
+        return;
+      item = &pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&index) - 1];
+      if (!item->IsIdentified())
+      {
+        v71 = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_AlchemistShop, (int)window_SpeakInHouse->ptr_1C, 4);
+        pText = BuildDialogueString(pMerchantsIdentifyPhrases[v71], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
+      }
+      else
+        pText = BuildDialogueString("%24", uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
+      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pText, &dialog_window, 0, 0)) / 2 + 138, Color16(0xFFu, 0xFFu, 0xFFu), pText, 3);
+      return;
+    }
+
+    case HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT:
+    {
+      draw_leather();
+      CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+      pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[200]);
+      pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[113]);
+      all_text_height = 0;
+      for ( int i = 0; i < 2; ++i )
+        all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
+      v18 = (174 - all_text_height) / 2;
+      v105 = (2 * (87 - (174 - all_text_height) / 2) - all_text_height) / 2 - (174 - all_text_height) / 2 / 2 + 138;
+      pNumString = 0;
+      for ( int i = pDialogueWindow->pStartingPosActiveItem;
+                i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+      {
+        pButton = pDialogueWindow->GetControl(i);
+        pButton->uY = v18 + v105;
+        pButton->uHeight = pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0);
+        v105 = pButton->uY + pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0) - 1;
+        pButton->uW = v105;
+        pColorText = Color16(0xE1u, 0xCDu, 0x23u);
+        if ( pDialogueWindow->pCurrentPosActiveItem != i )
+          pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
+        dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pShopOptions[pNumString], 3);
+        ++pNumString;
+      }
+      return;
+    }
+
+    case HOUSE_DIALOGUE_LEARN_SKILLS:
+    {
+      if (!HouseUI_CheckIfPlayerCanInteract())
+        return;
+      all_text_height = 0;
+      v5 = (signed __int64)(p2DEvents[(signed int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
+      pPrice = v5 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
+      if ( pPrice < v5 / 3 )
+        pPrice = v5 / 3;
+      item_num = 0;
+      for ( int i = pDialogueWindow->pStartingPosActiveItem;
+                i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+      {
+        pButton = pDialogueWindow->GetControl(i);
+        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pButton->msg_param - 36]
+         && !pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param - 36] )
+        {
+          all_text_height = pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &dialog_window, 0, 0);
+          ++item_num;
+        }
+      }
+      if ( !item_num )
+      {
+        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[544], pPlayers[uActiveCharacter]->pName, pClassNames[pPlayers[uActiveCharacter]->classType]);
+        strcat(pTmpBuf.data(), "\n \n");
+        strcat(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[528]);
+        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pTmpBuf.data(), &dialog_window, 0, 0)) / 2 + 138, Color16(0xE1u, 0xCDu, 0x23u), pTmpBuf.data(), 3);
+        return;
+      }
+      if ( item_num )
+      {
+        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[401], pPrice);
+        dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf.data(), 3);
+        v18 = (149 - all_text_height) / item_num;
+        if ( (149 - all_text_height) / item_num > 32 )
+          v18 = 32;
+        v105 = (149 - item_num * v18 - all_text_height) / 2 - v18 / 2 + 162;
+        for ( int i = pDialogueWindow->pStartingPosActiveItem;
+                  i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; i++ )
+        {
+          pButton = pDialogueWindow->GetControl(i);
+          if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pButton->msg_param - 36]
+             || pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param - 36] )
+          {
+            pButton->uW = 0;
+            pButton->uHeight = 0;
+            pButton->uY = 0;
+          }
+          else
+          {
+            pButton->uY = v18 + v105;
+            pButton->uHeight = pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &dialog_window, 0, 0);
+            v105 = pButton->uY + pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &dialog_window, 0, 0) - 1;
+            pButton->uW = v105;
+            pColorText = Color16(0xE1u, 0xCDu, 0x23u);
+            if ( pDialogueWindow->pCurrentPosActiveItem != i )
+              pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
+            dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pSkillNames[pButton->msg_param - 36], 3);
+          }
+        }
+        return;
+      }
+    }
+    default:
+      __debugbreak();
+  }
+}
+
+//----- (004B4FCF) --------------------------------------------------------
+void MagicShopDialog()
+{
+  int all_text_height; // edi@21
+  GUIButton *control_button; // esi@25
+  int v23; // eax@25
+  unsigned __int16 text_color; // ax@25
+  char *v30; // edx@35
+  signed int v33; // esi@40
+  unsigned int product_height_1row; // edi@64
+  unsigned int product_width_1row; // esi@66
+  unsigned int product_height_2row; // edi@76
+  unsigned int product_width_2row; // esi@76
+  int v75; // eax@130
+  POINT mouse; // [sp+6Ch] [bp-8Ch]@30
+  GUIWindow dialog_window; // [sp+7Ch] [bp-7Ch]@1
+  int item_num; // [sp+E0h] [bp-18h]@8
+  int v117; // [sp+E4h] [bp-14h]@40
+  int pPrice; // [sp+E8h] [bp-10h]@24
+  int one_string; // [sp+ECh] [bp-Ch]@1
+  int pSrtingNum;
+  ItemGen *item;
+
+  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
+  dialog_window.uFrameX = 483;
+  dialog_window.uFrameWidth = 148;
+  dialog_window.uFrameZ = 334;
+  if ( dialog_menu_id == HOUSE_DIALOGUE_MAIN)
+  {
+    if ( !HouseUI_CheckIfPlayerCanInteract() )
+        return;
+    pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[134]); //"Buy Standard"
+    pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[152]); //"Buy Special"
+    pShopOptions[2] = const_cast<char *>(pGlobalTXT_LocalizationStrings[159]); //"Display Inventory"
+    pShopOptions[3] = const_cast<char *>(pGlobalTXT_LocalizationStrings[160]);
+    all_text_height = 0;
+    for ( int i = 0; i < 4; ++i )
+      all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
+    one_string = (174 - all_text_height) / 4;
+    v23 = (174 - 4 * one_string - all_text_height) / 2 - one_string / 2 + 138;
+    int pNumString = 0;
+    for (int i = pDialogueWindow->pStartingPosActiveItem;
+             i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;  ++i)
+    {
+      control_button = pDialogueWindow->GetControl(i);
+      control_button->uY = one_string + v23;
+      control_button->uHeight = pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0);
+      v23 = control_button->uY + control_button->uHeight - 1;
+      control_button->uW = v23;
+      text_color = Color16(225, 205, 35);
+      if ( pDialogueWindow->pCurrentPosActiveItem != i )
+        text_color = Color16(255, 255, 255);
+      dialog_window.DrawTitleText(pFontArrus, 0, control_button->uY, text_color, pShopOptions[pNumString], 3);
+      ++pNumString;
+    }
+    return;
+  }
+
+  if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_STANDARD)
+  {
+    pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
+    for ( uint i = 0; i < 6; ++i )
+    {
+      if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID)
+      {
+        product_height_1row = 152 - ItemsInShopTexture[i]->uTextureHeight;
+        if ( (signed int)product_height_1row < 1 )
+          product_height_1row = 0;
+        product_width_1row = 75 * i - ItemsInShopTexture[i]->uTextureWidth / 2 + 40;
+        if ( i )
+        {
+          if ( i == 5 )
+          {
+            if ( (signed int)product_width_1row > 457 - ItemsInShopTexture[5]->uTextureWidth )
+              product_width_1row = 457 - ItemsInShopTexture[5]->uTextureWidth;
+          }
+        }
+        else
+        {
+          if ( (signed int)product_width_1row < 18 )
+            product_width_1row = 18;
+        }
+        pRenderer->DrawTextureTransparent(product_width_1row, product_height_1row, ItemsInShopTexture[i]);
+        ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[product_width_1row + window->GetWidth() * product_height_1row], ItemsInShopTexture[i], i + 1);
+      }
+    }
+    for ( uint i = 0; i < 6; ++i )
+    {
+      if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i + 6].uItemID)
+      {
+        product_height_2row = 306 - ItemsInShopTexture[i + 6]->uTextureHeight;
+        product_width_2row = 75 * i - ItemsInShopTexture[i + 6]->uTextureWidth / 2 + 40;
+        if ( i )
+        {
+          if ( i == 5 )
+          {
+            if ( (signed int)product_width_2row > 457 - ItemsInShopTexture[11]->uTextureWidth )
+              product_width_2row = 457 - ItemsInShopTexture[11]->uTextureWidth;
+          }
+        }
+        else
+        {
+          if ( (signed int)product_width_2row < 18 )
+            product_width_2row = 18;
+        }
+        pRenderer->DrawTextureTransparent(product_width_2row, product_height_2row, ItemsInShopTexture[i + 6]);
+        ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[product_width_2row + window->GetWidth() * product_height_2row], ItemsInShopTexture[i + 6], i + 7);
+      }
+    }
+    if ( HouseUI_CheckIfPlayerCanInteract() )
+    {
+      item_num = 0;
+      for ( uint i = 0; i < 12; ++i )
+      {
+        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID )
+          ++item_num;
+      }
+      if ( GetAsyncKeyState(VK_CONTROL) && pPlayers[uActiveCharacter]->CanSteal() )
+        DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[185], 0);// "Steal item"
+      else
+        DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[195], 0);// "Select the Item to Buy"
+      if ( !item_num )
+      {
+        dialog_window.DrawShops_next_generation_time_string(pParty->PartyTimes.Shops_next_generation_time[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed);
+        return;
+      }
+      pMouse->GetCursorPos(&mouse);
+      if ( pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF )
+      {
+        item = &pParty->StandartItemsInShops[(int)window_SpeakInHouse->ptr_1C][(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1];
+        if ( GetAsyncKeyState(VK_CONTROL) && pPlayers[uActiveCharacter]->CanSteal() )
+          v30 = BuildDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);// "Steal %24"
+        else
+        {
+          v75 = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_MagicShop, (int)window_SpeakInHouse->ptr_1C, 2);
+          v30 = BuildDialogueString(pMerchantsBuyPhrases[v75], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+        }
+        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(v30, &dialog_window, 0, 0)) / 2 + 138, Color16(255, 255, 255), v30, 3);
+        return;
+      }
+    }
+    return;
+  }
+
+  if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_SPECIAL)
+  {
+    pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
+    for ( uint i = 0; i < 6; ++i )
+    {
+      if ( pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID )
+      {
+        product_height_1row = 152 - ItemsInShopTexture[i]->uTextureHeight;
+        if ( (signed int)product_height_1row < 1 )
+          product_height_1row = 0;
+        product_width_1row = 75 * i - ItemsInShopTexture[i]->uTextureWidth / 2 + 40;
+        if ( i )
+        {
+          if ( i == 5 )
+          {
+            if ( (signed int)product_width_1row > 457 - ItemsInShopTexture[5]->uTextureWidth )
+              product_width_1row = 457 - ItemsInShopTexture[5]->uTextureWidth;
+          }
+        }
+        else
+        {
+          if ( (signed int)product_width_1row < 18 )
+            product_width_1row = 18;
+        }
+        pRenderer->DrawTextureTransparent(product_width_1row, product_height_1row, ItemsInShopTexture[i]);
+        ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[product_width_1row + window->GetWidth() * product_height_1row], ItemsInShopTexture[i], i + 1);
+      }
+    }
+    for ( uint i = 0; i < 6; ++i )
+    {
+      if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i + 6].uItemID)
+      {
+        product_height_2row = 306 - ItemsInShopTexture[i + 6]->uTextureHeight;
+        if ( (signed int)product_height_2row < 1 )
+          product_height_2row = 0;
+        product_width_2row = 75 * i - ItemsInShopTexture[i + 6]->uTextureWidth / 2 + 40;
+        if ( i )
+        {
+          if ( i == 5 )
+          {
+            if ( (signed int)product_width_2row > 457 - ItemsInShopTexture[11]->uTextureWidth )
+              product_width_2row = 457 - ItemsInShopTexture[11]->uTextureWidth;
+          }
+        }
+        else
+        {
+          if ( (signed int)product_width_2row < 18 )
+            product_width_2row = 18;
+        }
+        pRenderer->DrawTextureTransparent(product_width_2row, product_height_2row, ItemsInShopTexture[i + 6]);
+        ZBuffer_DoFill2(&pRenderer->pActiveZBuffer[product_width_2row + window->GetWidth() * product_height_2row], ItemsInShopTexture[i + 6], i + 7);
+      }
+    }
+    if ( HouseUI_CheckIfPlayerCanInteract() )
+    {
+      item_num = 0;
+      for ( uint i = 0; i < 12; ++i )
+      {
+        if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID)
+          ++item_num;
+      }
+      if ( GetAsyncKeyState(VK_CONTROL) && pPlayers[uActiveCharacter]->CanSteal() )
+        DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[185], 0);// "Steal item"
+      else
+        DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[196], 0);// "Select the Special Item to Buy"
+      if ( !item_num )
+      {
+        dialog_window.DrawShops_next_generation_time_string( pParty->PartyTimes.Shops_next_generation_time[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed);
+        return;
+      }
+      pMouse->GetCursorPos(&mouse);
+      if ( pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF )
+      {
+        item = &pParty->SpecialItemsInShops[(int)window_SpeakInHouse->ptr_1C][(pRenderer->pActiveZBuffer[mouse.x + pSRZBufferLineOffsets[mouse.y]] & 0xFFFF) - 1];
+        if ( GetAsyncKeyState(VK_CONTROL) && pPlayers[uActiveCharacter]->CanSteal() )
+          v30 = BuildDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);// "Steal %24"
+        else
+        {
+          v75 = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_MagicShop, (int)window_SpeakInHouse->ptr_1C, 2);
+          v30 = BuildDialogueString(pMerchantsBuyPhrases[v75], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
+        }
+        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(v30, &dialog_window, 0, 0)) / 2 + 138, Color16(255, 255, 255), v30, 3);
+        return;
+      }
+    }
+    return;
+  }
+
+  if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT )
+  {
+    draw_leather();
+    CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+    pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[200]);// "Sell"
+    pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[113]);// "Identify"
+    pShopOptions[2] = const_cast<char *>(pGlobalTXT_LocalizationStrings[179]);// "Repair"
+    all_text_height = 0;
+    for ( uint i = 0; i < 3; ++i )
+      all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
+    one_string = ((174 - all_text_height) / 3);
+    v23 = (3 * (58 - (signed int)one_string) - all_text_height) / 2 - (174 - all_text_height) / 3 / 2 + 138;
+    pSrtingNum = 0;
+    for ( int i = pDialogueWindow->pStartingPosActiveItem;
+              i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+    {
+      control_button = pDialogueWindow->GetControl(i);
+      control_button->uY = one_string + v23;
+      control_button->uHeight = pFontArrus->CalcTextHeight(pShopOptions[pSrtingNum], &dialog_window, 0, 0);
+      v23 = control_button->uHeight + control_button->uY - 1;
+      control_button->uW = v23;
+      text_color = Color16(225, 205, 35);
+      if ( pDialogueWindow->pCurrentPosActiveItem != i )
+        text_color = Color16(255, 255, 255);
+      dialog_window.DrawTitleText(pFontArrus, 0, control_button->uY, text_color, pShopOptions[pSrtingNum], 3);
+      ++pSrtingNum;
+    }
+    return;
+  }
+
+  if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_SELL)
+  {
+    draw_leather();
+    CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+    DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[199], 0);// "Select the Item to Sell"
+    if ( !HouseUI_CheckIfPlayerCanInteract() )
+      return;
+    pMouse->GetCursorPos(&mouse);
+    v117 = ((mouse.x - 14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+    if ( mouse.x <= 13 || mouse.x >= 462 )
+      return;
+    if ( !pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v117) )
+      return;
+    item = &pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v117) - 1];
+    v75 = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_MagicShop, (int)window_SpeakInHouse->ptr_1C, 3);
+    v30 = BuildDialogueString(pMerchantsSellPhrases[v75], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 3, 0);
+    dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(v30, &dialog_window, 0, 0)) / 2 + 138, Color16(255, 255, 255), v30, 3);
+    return;
+  }
+
+  if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_IDENTIFY)
+  {
+    draw_leather();
+    CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+    DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[197], 0);// "Select the Item to Identify"
+    if ( HouseUI_CheckIfPlayerCanInteract() )
+    {
+      pMouse->GetCursorPos(&mouse);
+      v117 = ((mouse.x -14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+      if ( mouse.x > 13 && mouse.x < 462 )
+      {
+        if ( pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v117) )
+        {
+          item = &pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v117) - 1];
+          if ( item->uAttributes & ITEM_IDENTIFIED )
+          {
+            dialog_window.DrawTitleText(pFontArrus, 0, (212 - pFontArrus->CalcTextHeight(BuildDialogueString("%24", uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 4, 0), &dialog_window, 0, 0)) / 2 + 101,
+               Color16(255, 255, 255), BuildDialogueString("%24", uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 4, 0), 3); 
+            return;
+          }
+          v75 = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(item, BuildingType_MagicShop, (int)window_SpeakInHouse->ptr_1C, 4);
+          v30 = BuildDialogueString(pMerchantsIdentifyPhrases[v75], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
+          dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(v30, &dialog_window, 0, 0)) / 2 + 138, Color16(255, 255, 255), v30, 3);
+          return;
+        }
+      }
+    }
+    return;
+  }
+
+  if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_REPAIR)
+  {
+    draw_leather();
+    CharacterUI_InventoryTab_Draw(pPlayers[uActiveCharacter], true);
+    DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[198], 0);// "Select the Item to Repair"
+    if ( !HouseUI_CheckIfPlayerCanInteract() )
+      return;
+    pMouse->GetCursorPos(&mouse);
+    v117 = ((mouse.x - 14) >> 5) + 14 * ((mouse.y - 17) >> 5);
+    if ( mouse.x <= 13 || mouse.x >= 462 )
+      return;
+    if ( !pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v117)
+      || !(pPlayers[uActiveCharacter]->pOwnItems[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v117)-1].uAttributes& 2) )
+      return;
+    item = &pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v117) - 1];
+    v75 = pPlayers[uActiveCharacter]->SelectPhrasesTransaction(&pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v117) - 1],
+             BuildingType_MagicShop, (int)window_SpeakInHouse->ptr_1C, 5);
+    v30 = BuildDialogueString(pMerchantsRepairPhrases[v75], uActiveCharacter - 1, item, (char *)window_SpeakInHouse->ptr_1C, 5, 0);
+    dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(v30, &dialog_window, 0, 0)) / 2 + 138, Color16(255, 255, 255), v30, 3);
+    return;
+  }
+
+  if ( dialog_menu_id == HOUSE_DIALOGUE_LEARN_SKILLS )
+  {
+    if ( HouseUI_CheckIfPlayerCanInteract() )
+    {
+      all_text_height = 0;
+      v33 = (signed __int64)(p2DEvents[(signed int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
+      pPrice = v33 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
+      if ( pPrice < v33 / 3 )
+        pPrice = v33 / 3;
+      item_num = 0;
+      for ( int i = pDialogueWindow->pStartingPosActiveItem;
+                i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
+      {
+        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pDialogueWindow->GetControl(i)->msg_param - 36]
+          && !pPlayers[uActiveCharacter]->pActiveSkills[pDialogueWindow->GetControl(i)->msg_param - 36] )
+        {
+          all_text_height += pFontArrus->CalcTextHeight(pSkillNames[pDialogueWindow->GetControl(i)->msg_param - 36], &dialog_window, 0, 0);
+          ++item_num;
+        }
+      }
+      if ( !item_num )
+      {
+        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[544], pPlayers[uActiveCharacter]->pName, pClassNames[pPlayers[uActiveCharacter]->classType]);// 
+                                            // "Seek knowledge elsewhere %s the %s"
+        strcat(pTmpBuf.data(), "\n \n");
+        strcat(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[528]);// "I can offer you nothing further."
+        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pTmpBuf.data(), &dialog_window, 0, 0)) / 2 + 138, Color16(225, 205, 35), pTmpBuf.data(), 3);
+        return;
+      }
+      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[401], pPrice);// "Skill Cost: %lu"
+      dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf.data(), 3);
+      one_string = (149 - all_text_height) / item_num;
+      if ( one_string > 32 )
+        one_string = 32;
+      v23 = (149 - item_num * one_string - all_text_height) / 2 - one_string / 2 + 162;
+      for ( int i = pDialogueWindow->pStartingPosActiveItem;
+                i < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton; ++i)
+      {
+        control_button = pDialogueWindow->GetControl(i);
+        if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][control_button->msg_param - 36]
+           || pPlayers[uActiveCharacter]->pActiveSkills[control_button->msg_param - 36] )
+        {
+          control_button->uW = 0;
+          control_button->uHeight = 0;
+          control_button->uY = 0;
+        }
+        else
+        {
+          control_button->uY = one_string + v23;
+          control_button->uHeight = pFontArrus->CalcTextHeight(pSkillNames[control_button->msg_param - 36], &dialog_window, 0, 0);
+          v23 = control_button->uY + control_button->uHeight - 1;
+          control_button->uW = v23;
+          text_color = Color16(225, 205, 35);
+          if ( pDialogueWindow->pCurrentPosActiveItem != i )
+            text_color = Color16(255, 255, 255);
+          dialog_window.DrawTitleText(pFontArrus, 0, control_button->uY, text_color, pSkillNames[control_button->msg_param - 36], 3);
+        }
+      }
+    }
+    return;
+  }
+  return;
+}
+//----- (004BDB56) --------------------------------------------------------
+void  UIShop_Buy_Identify_Repair()
+{
+  int v8; // eax@15
+  unsigned int pItemID; // esi@20
+  ItemGen *item; // esi@21
+  unsigned int v15; // eax@33
+  POINT *pCursorPos; // esi@37
+  int v18; // ecx@37
+  float pPriceMultiplier; // ST1C_4@38
+  int taken_item; // eax@40
+  ItemGen *bought_item; // esi@51
+  int party_reputation; // eax@55
+  int v39; // eax@63
+  int v42; // esi@74
+  signed int v43; // ebx@74
+  unsigned __int16 *pSkill; // esi@77
+  int v55; // [sp+0h] [bp-B4h]@26
+  POINT cursor; // [sp+40h] [bp-74h]@37
+  int a6; // [sp+98h] [bp-1Ch]@57
+  int a3; // [sp+9Ch] [bp-18h]@53
+  unsigned int uNumSeconds; // [sp+A4h] [bp-10h]@53
+  unsigned int v79; // [sp+A8h] [bp-Ch]@9
+  int uPriceItemService; // [sp+ACh] [bp-8h]@12
+
+  if ( pCurrentScreen == SCREEN_E )
+  {
+    pPlayers[uActiveCharacter]->OnInventoryLeftClick();
+    return;
+  }
+  if ( !HouseUI_CheckIfPlayerCanInteract() )
+  {
+    pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
+    return;
+  }
+
+  switch(dialog_menu_id)
+  {
+    case HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT:
+    {
+      pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103;
+      pPlayers[uActiveCharacter]->OnInventoryLeftClick();
+      break;
+    }
+    case HOUSE_DIALOGUE_GUILD_BUY_BOOKS:
+    {
+      pMouse->GetCursorPos(&cursor);
+      v18 = pRenderer->pActiveZBuffer[cursor.x + pSRZBufferLineOffsets[cursor.y]] & 0xFFFF;
+      if ( !v18 )
+        return;
+      bought_item = (ItemGen *)(&pParty->pPlayers[1].uExpressionTimeLength + 18 * (v18 + 12 * (int)window_SpeakInHouse->ptr_1C));
+      pPriceMultiplier = p2DEvents[(signed int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier;
+      uPriceItemService = pPlayers[uActiveCharacter]->GetBuyingPrice(bought_item->GetValue(), pPriceMultiplier);
+      GetAsyncKeyState(VK_CONTROL);
+      if ( pParty->uNumGold < uPriceItemService )
+      {
+        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, (HouseSoundID)2);
+        ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);
+        return;
+      }
+      taken_item = pPlayers[uActiveCharacter]->AddItem(-1, bought_item->uItemID);
+      if ( taken_item )
+      {
+        bought_item->SetIdentified();
+        memcpy(&pPlayers[uActiveCharacter]->pInventoryItemList[taken_item - 1], bought_item, 0x24u);
+        dword_F8B1E4 = 1;
+        Party::TakeGold(uPriceItemService);
+        viewparams->bRedrawGameUI = 1;
+        bought_item->Reset();
+        pRenderer->ClearZBuffer(0, 479);
+        pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)SPEECH_75, 0);
+        return;
+      }
+      pPlayers[uActiveCharacter]->PlaySound(SPEECH_NoRoom, 0);
+      ShowStatusBarString(pGlobalTXT_LocalizationStrings[563], 5);  // "Pack is Full!"
+      break;
+    }
+    case HOUSE_DIALOGUE_SHOP_SELL:
+    {
+      v79 = ((pMouse->GetCursorPos(&cursor)->x - 14) >> 5) + 14 * ((pMouse->GetCursorPos(&cursor)->y - 17) >> 5);
+      if ( pMouse->GetCursorPos(&cursor)->x <= 13
+        || pMouse->GetCursorPos(&cursor)->x >= 462
+        || (v15 = pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v79), !v15) )
+          return;
+      if ( pPlayers[uActiveCharacter]->pInventoryItemList[v15 - 1].MerchandiseTest((int)window_SpeakInHouse->ptr_1C) )
+      {
+        dword_F8B1E4 = 1;
+        pPlayers[uActiveCharacter]->SalesProcess(v79, v15 - 1, (int)window_SpeakInHouse->ptr_1C);
+        viewparams->bRedrawGameUI = 1;
+        pRenderer->ClearZBuffer(0, 479);
+        pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)77, 0);
+        return;
+      }
+      pPlayers[uActiveCharacter]->PlaySound(SPEECH_79, 0);
+      pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
+      break;
+    }
+    case HOUSE_DIALOGUE_SHOP_IDENTIFY:
+    {
+      pMouse->GetCursorPos(&cursor);
+      v79 = ((cursor.x - 14) >> 5) + 14 * ((cursor.y - 17) >> 5);
+      if (cursor.x > 13  && cursor.x < 462)
+      {
+        pItemID = pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v79);
+        if ( pItemID )
+        {
+          uPriceItemService = pPlayers[uActiveCharacter]->GetPriceIdentification(p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier);
+          item = &pPlayers[uActiveCharacter]->pInventoryItemList[pItemID - 1];
+          if ( !(item->uAttributes & ITEM_IDENTIFIED) )
+          {
+            if ( item->MerchandiseTest((int)window_SpeakInHouse->ptr_1C) )
+            {
+              if ( pParty->uNumGold >= uPriceItemService )
+              {
+                dword_F8B1E4 = 1;
+                Party::TakeGold(uPriceItemService);
+                item->uAttributes |= ITEM_IDENTIFIED;
+                pPlayers[uActiveCharacter]->PlaySound(SPEECH_73, 0);
+                ShowStatusBarString(pGlobalTXT_LocalizationStrings[569], 2);
+                return;
+              }
+              PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, (HouseSoundID)2);
+              return;
+            }
+            pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
+            pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)79, 0);
+            return;
+          }
+          pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)76, 0);
+          return;
+        }
+      }
+      break;
+    }
+    case HOUSE_DIALOGUE_SHOP_REPAIR:
+    {
+      v79 = ((pMouse->GetCursorPos(&cursor)->x - 14) >> 5) + 14 * ((pMouse->GetCursorPos(&cursor)->y - 17) >> 5);
+      if ( pMouse->GetCursorPos(&cursor)->x > 13 )
+      {
+        if ( pMouse->GetCursorPos(&cursor)->x < 462 )
+        {
+          pItemID = pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex((int *)&v79);
+          if ( pItemID )
+          {
+            item = &pPlayers[uActiveCharacter]->pInventoryItemList[pItemID - 1];
+            pPriceMultiplier = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier;
+            ItemGen* _v = &pPlayers[uActiveCharacter]->pInventoryItemList[pItemID - 1];
+            uPriceItemService = pPlayers[uActiveCharacter]->GetPriceRepair(_v->GetValue(), pPriceMultiplier);
+            if ( item->uAttributes & ITEM_BROKEN )
+            {
+              if ( item->MerchandiseTest((int)window_SpeakInHouse->ptr_1C) )
+              {
+                if ( pParty->uNumGold >= uPriceItemService )
+                {
+                  dword_F8B1E4 = 1;
+                  Party::TakeGold(uPriceItemService);
+                  v8 = item->uAttributes;
+                  LOBYTE(v8) = item->uAttributes & 0xFD;
+                  item->uAttributes = v8 | 1;
+                  pPlayers[uActiveCharacter]->PlaySound(SPEECH_74, 0);
+                  ShowStatusBarString(pGlobalTXT_LocalizationStrings[570], 2);
+                  return;
+                }
+                PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, (HouseSoundID)2);
+                return;
+              }
+              pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
+              pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)79, 0);
+              return;
+            }
+            pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)76, 0);
+            return;
+          }
+        }
+      }
+      break;
+    }
+    case HOUSE_DIALOGUE_SHOP_BUY_STANDARD:
+    case HOUSE_DIALOGUE_SHOP_BUY_SPECIAL:
+    {
+      pCursorPos = pMouse->GetCursorPos(&cursor);
+      v18 = pRenderer->pActiveZBuffer[pCursorPos->x + pSRZBufferLineOffsets[pCursorPos->y]] & 0xFFFF;
+      if ( !v18 )
+        return;
+      if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_STANDARD)
+        bought_item = (ItemGen *)&pParty->StandartItemsInShops[(int)window_SpeakInHouse->ptr_1C][v18 - 1];
+      else
+        bought_item = &pParty->SpecialItemsInShops[(int)window_SpeakInHouse->ptr_1C][v18 - 1];
+      uPriceItemService = pPlayers[uActiveCharacter]->GetBuyingPrice(bought_item->GetValue(), p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier);
+      uNumSeconds = 0;
+      a3 = 0;
+      if ( pMapStats->GetMapInfo(pCurrentMapName) )
+        a3 = pMapStats->pInfos[pMapStats->GetMapInfo(pCurrentMapName)]._steal_perm;
+      party_reputation = pParty->GetPartyReputation();
+      if (pPlayers[uActiveCharacter]->CanSteal() && GetAsyncKeyState(VK_CONTROL))
+      {
+          uNumSeconds = pPlayers[uActiveCharacter]->StealFromShop(bought_item, a3, party_reputation, 0, &a6);
+          if ( !uNumSeconds )
+          {
+            sub_4B1447_party_fine((int)window_SpeakInHouse->ptr_1C, 0, a6);
+            return;
+          }
+      }
+      else if (pParty->uNumGold < uPriceItemService)
+      {
+        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, (HouseSoundID)2);
+        ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);// "You don't have enough gold"
+        return;
+      }
+      v39 = pPlayers[uActiveCharacter]->AddItem(-1, bought_item->uItemID);
+      if ( v39 )
+      {
+        bought_item->SetIdentified();
+        memcpy(&pPlayers[uActiveCharacter]->pInventoryItemList[v39 - 1], bought_item, sizeof(ItemGen));
+        if (uNumSeconds != 0)
+        {
+          pPlayers[uActiveCharacter]->pInventoryItemList[v39 - 1].SetStolen();
+          sub_4B1447_party_fine((int)window_SpeakInHouse->ptr_1C, uNumSeconds, a6);
+        }
+        else
+        {
+          dword_F8B1E4 = 1;
+          Party::TakeGold(uPriceItemService);
+        }
+        viewparams->bRedrawGameUI = 1;
+        bought_item->Reset();
+        pRenderer->ClearZBuffer(0, 479);
+        pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)SPEECH_75, 0);
+        return;
+      }
+      else
+      {
+        pPlayers[uActiveCharacter]->PlaySound(SPEECH_NoRoom, 0);
+        ShowStatusBarString(pGlobalTXT_LocalizationStrings[563], 2); // "Pack is Full!"
+        return;
+      }
+      break;
+    }
+    default:// if click video screen in shop
+    {
+      __debugbreak(); // please do record these dialogue ids to the HOUSE_DIALOGUE_MENU  enum
+      if( dialog_menu_id >= 36 && dialog_menu_id <= 72 )
+      {
+        v42 = dialog_menu_id - 36;
+        //v43 = (signed __int64)(*(float *)&p2DEvents_minus1__24[13 * (unsigned int)ptr_507BC0->ptr_1C] * 500.0);
+        v43 = (signed __int64)(p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
+        uPriceItemService = v43 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
+        if ( uPriceItemService < v43 / 3 )
+          uPriceItemService = v43 / 3;
+        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][v42] )
+        {
+          pSkill = &pPlayers[uActiveCharacter]->pActiveSkills[v42];
+          if ( !*pSkill )
+          {
+            if ( pParty->uNumGold < uPriceItemService )
+            {
+              ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);// "You don't have enough gold"
+              if ( in_current_building_type == BuildingType_Training )
+                v55 = 4;
+              else
+                v55 = 2;
+              PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, (HouseSoundID)v55);
+              return;
+            }
+            Party::TakeGold(uPriceItemService);
+            dword_F8B1E4 = 1;
+           *pSkill = 1;
+            pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)78, 0);
+            return;
+          }
+        }
+      }
+      break;
+    }
+  }
+}
+//----- (004B1A2D) --------------------------------------------------------
+void  ShowPopupShopItem()
+{
+  int v3; // ecx@5
+//  unsigned int v6; // eax@13
+  ItemGen *v7; // ecx@13
+  POINT  cursor; // [sp+30h] [bp-1Ch]@17
+
+  if ( in_current_building_type <= 0 )
+    return;
+  if ( dialog_menu_id < HOUSE_DIALOGUE_SHOP_BUY_STANDARD)
+    return;
+  if ( in_current_building_type <= BuildingType_AlchemistShop )
+  {
+    if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_STANDARD || dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_SPECIAL )
+    {
+      pMouse->GetCursorPos(&cursor);
+      v3 = pRenderer->pActiveZBuffer[cursor.x + pSRZBufferLineOffsets[cursor.y]] & 0xFFFF;
+      if ( !v3 )
+        return;
+      v7 = &pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v3 - 1];
+      if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_SPECIAL)
+        v7 = &pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v3 - 1];
+      GameUI_DrawItemInfo(v7);
+      return;
+    }
+
+    if ( dialog_menu_id >= HOUSE_DIALOGUE_SHOP_SELL && dialog_menu_id <= HOUSE_DIALOGUE_SHOP_REPAIR
+      || dialog_menu_id == HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT )
+    {
+      pMouse->GetCursorPos(&cursor);
+      v3 = ((cursor.x - 14) >> 5) + 14 * ((cursor.y - 17) >> 5);
+      if ( cursor.x <= 13 || cursor.x >= 462
+        || !pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex(&v3) )
+        return;
+      GameUI_DrawItemInfo(&pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->GetItemIDAtInventoryIndex(&v3) - 1]);
+      return;
+    }
+  }
+  if ( in_current_building_type <= BuildingType_16 && dialog_menu_id == HOUSE_DIALOGUE_GUILD_BUY_BOOKS )
+  {
+    pMouse->GetCursorPos(&cursor);
+    v3 = pRenderer->pActiveZBuffer[cursor.x + pSRZBufferLineOffsets[cursor.y]] & 0xFFFF;
+    if ( v3 )
+    {
+      unsigned int guildId = (unsigned int)window_SpeakInHouse->ptr_1C - 139;
+      sub_4B1523_showSpellbookInfo(pParty->SpellBooksInGuilds[guildId][v3].uItemID);
+    }
+  }
+}
+
+//----- (004B1523) --------------------------------------------------------
+void sub_4B1523_showSpellbookInfo(int spellItemId)
+{
+  int spellId; // esi@1
+  int spellLevel; // edx@1
+  unsigned int v3; // eax@2
+  int v4; // eax@4
+  LONG v5; // ecx@4
+  int v6; // eax@10
+  char *v7; // ST44_4@12
+  unsigned __int16 v8; // ax@12
+  GUIWindow a1; // [sp+Ch] [bp-68h]@4
+  unsigned int spellSchool; // [sp+60h] [bp-14h]@1
+  POINT a2; // [sp+64h] [bp-10h]@1
+  int v13; // [sp+6Ch] [bp-8h]@4
+  int v14; // [sp+70h] [bp-4h]@4
+
+  spellId = spellItemId - 399;
+  spellLevel = (spellItemId - 400) % 11 + 1;
+  spellSchool = 4 * (spellItemId - 400) / 11;
+  // sprintf(pTmpBuf.data(), "%s%03d", spellbook_texture_filename_suffices[v11 / 4], v2); not used
+  if ( pMouse->GetCursorPos(&a2)->y <= 320 )
+    v3 = pMouse->GetCursorPos(&a2)->y + 30;
+  else
+    v3 = 30;
+  a1.Hint = nullptr;
+  a1.uFrameY = v3;
+  a1.uFrameWidth = 328;
+  a1.uFrameHeight = 68;
+  a1.uFrameX = 90;
+  a1.uFrameZ = 417;
+  a1.uFrameW = v3 + 67;
+  a2.y = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[431]);
+  v14 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[433]);
+  v13 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[432]);
+  v4 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[96]);
+  v5 = a2.y;
+  if ( v14 > a2.y )
+    v5 = v14;
+  if ( v13 > v5 )
+    v5 = v13;
+  if ( v4 > v5 )
+    v5 = v4;
+  sprintf(pTmpBuf2.data(), "%s\n\n%s\t%03d:\t%03d%s\t000\n%s\t%03d:\t%03d%s\t000\n%s\t%03d:\t%03d%s\t000\n%s\t%03d:\t%03d%s",
+    pSpellStats->pInfos[spellId].pDescription, pGlobalTXT_LocalizationStrings[431],        // "Normal"
+    v5 + 3, v5 + 10, pSpellStats->pInfos[spellId].pBasicSkillDesc, pGlobalTXT_LocalizationStrings[433],        // "Expert"
+    v5 + 3, v5 + 10, pSpellStats->pInfos[spellId].pExpertSkillDesc, pGlobalTXT_LocalizationStrings[432],        // "Master"
+    v5 + 3, v5 + 10, pSpellStats->pInfos[spellId].pMasterSkillDesc, pGlobalTXT_LocalizationStrings[96],         // "Grand"
+    v5 + 3, v5 + 10, pSpellStats->pInfos[spellId].pGrandmasterSkillDesc);
+  v6 = pFontSmallnum->CalcTextHeight(pTmpBuf2.data(), &a1, 0, 0);
+  a1.uFrameHeight += v6;
+  if ( (signed int)a1.uFrameHeight < 150 )
+    a1.uFrameHeight = 150;
+  a1.uFrameWidth = game_viewport_width;
+  a1.DrawMessageBox(0);
+  a1.uFrameWidth -= 12;
+  a1.uFrameHeight -= 12;
+  v7 = pSpellStats->pInfos[spellId].pName;
+  a1.uFrameZ = a1.uFrameX + a1.uFrameWidth - 1;
+  a1.uFrameW = a1.uFrameHeight + a1.uFrameY - 1;
+  v8 = Color16(0xFFu, 0xFFu, 0x9Bu);
+  a1.DrawTitleText(pFontArrus, 0x78u, 0xCu, v8, v7, 3u);
+  a1.DrawText(pFontSmallnum, 120, 44, 0, pTmpBuf2.data(), 0, 0, 0);
+  a1.uFrameZ = a1.uFrameX + 107;
+  a1.uFrameWidth = 108;
+  a1.DrawTitleText(pFontComic, 0xCu, 0x4Bu, 0, pSkillNames[spellSchool / 4 + 12], 3u);
+  sprintfex(pTmpBuf.data(), "%s\n%d", pGlobalTXT_LocalizationStrings[522], *(&pSpellDatas[0].uNormalLevelMana + 10 * spellId));
+  a1.DrawTitleText(pFontComic, 0xCu, a1.uFrameHeight - LOBYTE(pFontComic->uFontHeight) - 16, 0, pTmpBuf.data(), 3);
+}
+//----- (004B1D27) --------------------------------------------------------
+void  GetHouseGoodbyeSpeech()
+{
+  signed int v2; // edi@10
+  signed int v5; // edi@20
+  int v7[4]; // [sp+Ch] [bp-10h]@12
+
+  if ( in_current_building_type > 0 )
+  {
+    if ( in_current_building_type > BuildingType_MagicShop )
+    {
+      if ( in_current_building_type == BuildingType_Bank )
+      {
+        if ( !dword_F8B1E4 )
+          return;
+      }
+      else
+      {
+        if ( in_current_building_type != BuildingType_Temple )
+          return;
+      }
+      PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_Greeting_2);
+      return;
+    }
+    if ( (signed __int64)pParty->PartyTimes._shop_ban_times[(unsigned int)window_SpeakInHouse->ptr_1C]<= (signed __int64)pParty->uTimePlayed )
+    {
+      if ( pParty->uNumGold <= 10000 )
+      {
+        if ( !dword_F8B1E4 )
+          return;
+        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_Goodbye);
+        return;
+      }
+      PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, (HouseSoundID)(dword_F8B1E4 + 3));
+      if ( !dword_F8B1E4 && !_A750D8_player_speech_timer )
+      {
+        v5 = 0;
+        for ( uint i = 1; i <= 4; ++i )
+        {
+          if ( pPlayers[i]->CanAct() )
+            v7[v5++] = i;
+        }
+        if ( v5 )
+        {
+          _A750D8_player_speech_timer = 256i64;
+          PlayerSpeechID = SPEECH_80;
+          uSpeakingCharacter = v7[rand() % v5];
+          return;
+        }
+      }
+    }
+    else
+    {
+      if ( !_A750D8_player_speech_timer )
+      {
+        v2 = 0;
+        for ( uint i = 1; i <= 4; ++i )
+        {
+          if ( pPlayers[i]->CanAct() )
+            v7[v2++] = i;
+        }
+        if ( v2 )
+        {
+          _A750D8_player_speech_timer = 256i64;
+          PlayerSpeechID = SPEECH_80;
+          uSpeakingCharacter = v7[rand() % v2];
+          return;
+        }
+      }
+    }
+  }
+}
+
+//----- (004B1447) --------------------------------------------------------
+void sub_4B1447_party_fine(int shopId, int stealingResult, int fineToAdd)
+{
+	signed int v3; // esi@1
+	DDM_DLV_Header *v7; // eax@14
+
+	if (stealingResult == 0 || stealingResult == 1)
+	{
+		if (pParty->uFine < 4000000)
+		{
+			if (fineToAdd + pParty->uFine < 0)
+				pParty->uFine = 0;
+			else if (fineToAdd + pParty->uFine > 4000000)
+				pParty->uFine = 4000000;
+			else
+				pParty->uFine += fineToAdd;
+		}
+		if (pParty->uFine)
+		{
+			for (uint i = 1; i <= 4; ++i)
+			{
+				if (!_449B57_test_bit(pPlayers[i]->_achieved_awards_bits, 1))
+					_449B7E_toggle_bit(pPlayers[i]->_achieved_awards_bits, 1, 1);
+			}
+		}
+		if (stealingResult == 1)
+			v3 = 2;
+		else
+			v3 = 1;
+	}
+	else
+		v3 = 2;
+	pParty->PartyTimes._shop_ban_times[shopId] = pParty->uTimePlayed + 368640;
+	pParty->InTheShopFlags[shopId] = 1;
+	v7 = &pOutdoor->ddm;
+	if (uCurrentlyLoadedLevelType != LEVEL_Outdoor)
+		v7 = &pIndoor->dlv;
+	v7->uReputation += v3;
+	if (v7->uReputation > 10000)
+		v7->uReputation = 10000;
+}