view UIHouses.cpp @ 687:687b4365ee84

Indoor Portal
author Ritor1
date Sat, 16 Mar 2013 01:44:38 +0600
parents 08b6d89d6a10
children 26dfde53decd
line wrap: on
line source

#include "UIHouses.h"

#include "Party.h"
#include "Player.h"
#include "texts.h"
#include "Events.h"
#include "Arcomage.h"
#include "LOD.h"
#include "Mouse.h"
#include "GUIWindow.h"
#include "GUIButton.h"
#include "GUIFont.h"
#include "Events2D.h"
#include "Overlays.h"
#include "Render.h"
#include "Indoor.h"
#include "Outdoor.h"
#include "AudioPlayer.h"
#include "VideoPlayer.h"
#include "Monsters.h"
#include "Viewport.h"
#include "Keyboard.h"
#include "NPC.h"

#include "mm7_data.h"


int uHouse_ExitPic; // weak

int dword_591080; // weak

const stru159 pAnimatedRooms[196] = //0x4E5F70
    {
        {"",                            0x4, 0x1F4, 0, 0, 0},
        {"Human Armor01",               0x20, 0x2C0, 2, 58, 0},
        {"Necromancer Armor01",         0x20, 0x2D7, 2, 70, 0 },
        {"Dwarven Armor01",             0x20, 0x2EE, 2,  5, 0 },
        {"Wizard Armor",                0x20, 0x3BD, 2, 19, 0 },
        {"Warlock Armor",               0x20, 0x2D6, 2, 35, 0 },
        {"Elf Armor",                   0x20, 0x2BC, 2, 79, 0 },
        {"Human Alchemisht01",          0xE,  0x2BE, 4, 95, 0 },
        {"Necromancer Alchemist01",     0xE,  0x2D6, 4, 69, 0 },
        {"Dwarven Achemist01",          0xE,  0x387, 4,  4, 0 },
        {"Wizard Alchemist",            0xE,  0x232, 4, 25, 0 },
        {"Warlock Alchemist",           0xE,  0x2BE, 4, 42, 0 },
        {"Elf Alchemist",               0xE,  0x38A, 4, 84, 0 },
        {"Human Bank01",                0x6, 0x384, 22, 52, 0 },
        {"Necromancer Bank01",          0x6, 0x2D8, 22, 71, 0 },
        {"Dwarven Bank",                0x6, 0x2F3, 22,  6, 0 },
        {"Wizard Bank",                 0x6, 0x3BA, 22, 20, 0 },
        {"Warlock Bank",                0x6, 0x39F, 22, 36, 0 },
        {"Elf Bank",                    0x6, 0x2BC, 22, 71, 0 },
        {"Boat01",                      0xF,  0x4C, 28, 53, 3 },
        {"Boat01d",                     0xF,  0x4C, 28, 53, 3 },
        {"Human Magic Shop01",          0xA, 0x2C8,  3, 54, 0 },
        {"Necromancer Magic Shop01",    0xE, 0x2DC,  3, 66, 0 },
        {"Dwarven Magic Shop01",        0x2A, 0x2EF, 3, 91, 0 },
        {"Wizard Magic Shop",           0x1E, 0x2DF, 3, 15, 0 },
        {"Warlock Magic Shop",          0x7,  0x3B9, 3, 15, 0 },
        {"Elf Magic Shop",              0x24, 0x2CC, 3, 82, 0 },
        {"Human Stables01",             0x21, 0x31,  27, 48, 3 },
        {"Necromancer Stables",         0x21, 0x2DD, 27, 67, 3 },
        {"",                            0x21, 0x2F0, 27, 91, 3 },
        {"Wizard Stables",              0x21, 0x3BA, 27, 16, 3 },
        {"Warlock Stables",             0x21, 0x181, 27, 77, 3 },
        {"Elf Stables",                 0x21, 0x195, 27, 77, 3 },
        {"Human Tavern01",              0xD, 0x2C2,  21, 49, 0 },
        {"Necromancer Tavern01",        0xD, 0x3B0,  21, 57, 0 },
        {"Dwarven Tavern01",            0xD, 0x2FE,  21, 94, 0 },
        {"Wizard Tavern",               0xD, 0x3BB,  21, 17, 0 },
        {"Warlock Tavern",              0xD, 0x3A8,  21, 33, 0 },
        {"Elf Tavern",                  0xD, 0x2CD,  21, 78, 0 },
        {"Human Temple01",              0x24, 0x2DB, 23, 50, 3 },
        {"Necromancer Temple",          0x24, 0x2DF, 23, 60, 3 },
        {"Dwarven Temple01",            0x24, 0x2F1, 23, 86, 3 },
        {"Wizard Temple",               0x24, 0x2E0, 23, 10, 3 },
        {"Warlock Temple",              0x24, 0x3A4, 23, 27, 3 },
        {"Elf Temple",                  0x24, 0x2CE, 23, 72, 3 },
        {"Human Town Hall",             0x10, 0x39C, 17, 14, 0 },
        {"Necromancer Town Hall01",     0x10, 0x3A4, 17, 61, 0 },
        {"Dwarven Town Hall",           0x10, 0x2DB, 17, 88, 0 },
        {"Wizard Town Hall",            0x10, 0x3BD, 17, 11, 0 },
        {"Warlock Town Hall",           0x10, 0x2DB, 17, 28, 0 },
        {"Elf Town Hall",               0x10, 0x27A, 17, 73, 0 },
        {"Human Training Ground01",     0x18, 0x2C7, 30, 44, 0 },
        {"Necromancer Training Ground", 0x18, 0x3AD, 30, 62, 0 },
        {"Dwarven Training Ground",     0x18, 0x2F2, 30, 89, 0 },
        {"Wizard Training Ground",      0x18, 0x3A3, 30, 12, 0 },
        {"Warlock Training Ground",     0x18, 0x3A6, 30, 29, 0 },
        {"Elf Training Ground",         0x18, 0x19F, 30, 74, 0 },
        {"Human Weapon Smith01",        0x16, 0x2C1, 1, 45, 4 },
        {"Necromancer Weapon Smith01",  0x16, 0x2D9, 1, 63, 4 },
        {"Dwarven Weapon Smith01",      0x16, 0x2EE, 1, 82, 4 },
        {"Wizard Weapon Smith",         0x16, 0x2D5, 1, 13, 4 },
        {"Warlock Weapon Smith",        0x16, 0x2D7, 1, 23, 4 },
        {"Elf Weapon Smith",            0x16, 0x2CA, 1, 75, 4 },
        {"Air Guild",                   0x1D, 0xA4,   6, 1, 3 },
        {"Body Guild",                  0x19, 0x3BF, 11, 2, 0 },
        {"DarkGuild",                   0x19, 0x2D1, 13, 3, 0 },
        {"EarthGuild",                  0x19, 0x2CB, 8, 83, 0 },
        {"Fire Guild",                  0x1C, 0x2BF, 5, 56, 0 },
        {"Light Guild",                 0x1C, 0x2D5, 12, 46, 0 },
        {"Mind Guild",                  0x1C, 0xE5,  10, 40, 0 },
        {"Spirit Guild",                0x1C, 0x2D2,  9, 41, 0 },
        {"Water Guild",                 0x1B, 0x2D3,  7, 24, 0 },
        {"Lord And Judge Out01",        1, 0,        29, 39, 0 },
        {"Human Poor House 1",          8, 0,        29,  0, 0 },
        {"Human Poor House 2",          8, 0,        29,  0, 0 },
        {"Human Poor House 3",          8, 0,        29,  0, 0 },
        {"Human Medium House 1",        8, 0,        29,  0, 0 },
        {"Human Medium House 2",        8, 0,        29,  0, 0 },
        {"Human Medium House 3",        8, 0,        29,  0, 0 },
        {"Human Rich House 1",          8, 0,        29,  0, 0 },
        {"Human Rich House 2",          8, 0,        29,  0, 0 },
        {"Human Rich House 3",          8, 0,        29,  0, 0 },
        {"Elven Poor House 1",          8, 0,        29,  0, 0 },
        {"Elven Poor House 2",          8, 0,        29,  0, 0 },
        {"Elven Poor House 3",          8, 0,        29,  0, 0 },
        {"Elven Medium House 1",        8, 0,        29,  0, 0 },
        {"Elven Medium House 2",        8, 0,        29,  0, 0 },
        {"Elven Medium House 3",        8, 0,        29,  0, 0 },
        {"Elven Rich House 1",          8, 0,        29,  0, 0 },
        {"Elven Rich House 2",          8, 0,        29,  0, 0 },
        {"Elven Rich House 3",          8, 0,        29,  0, 0 },
        {"Dwarven Poor House 1",        8, 0,        29,  0, 0 },
        {"Dwarven Poor House 2",        8, 0,        29,  0, 0 },
        {"Dwarven Poor House 3",        8, 0,        29,  0, 0 },
        {"Dwarven Medium House 1",      8, 0,        29,  0, 0 },
        {"Dwarven Medium house 2",      8, 0,        29,  0, 0 },
        {"Dwarven Medium House 3",      8, 0,        29,  0, 0 },
        {"Dwarven Rich House 1",        8, 0,        29,  0, 0 },
        {"Dwarven Rich House 2",        8, 0,        29,  0, 0 },
        {"Dwarven Rich House 3",        8, 0,        29,  0, 0 },
        {"Wizard Poor House 1",         8, 0,        29,  0, 0 },
        {"Wizard Poor House 2",         8, 0,        29,  0, 0 },
        {"Wizard Poor House 3",         8, 0,        29,  0, 0 },
        {"Wizard Medium House 1",       8, 0,        29,  0, 0 },
        {"Wizard Medium House 2",       8, 0,        29,  0, 0 },
        {"Wizard Mdeium House 3",       8, 0,        29,  0, 0 },
        {"Wizard Rich House 1",         8, 0,        29,  0, 0 },
        {"Wizard Rich House 2",         8, 0,        29,  0, 0 },
        {"Wizard Rich House 3",         8, 0,        29,  0, 0 },
        {"Necromancer Poor House 1",    8, 0,        29,  0, 0 },
        {"Necromancer Poor House 2",    8, 0,        29,  0, 0 },
        {"Necromancer Poor House 3",    8, 0,        29,  0, 0 },
        {"Necromancer Medium House 1",  8, 0,        29,  0, 0 },
        {"Necromancer Medium House 2",  8, 0,        29,  0, 0 },
        {"Necromancer Mdeium House 3",  8, 0,        29,  0, 0 },
        {"Necromancer Rich House 1",    8, 0,        29,  0, 0 },
        {"Necromancer Rich House 2",    8, 0,        29,  0, 0 },
        {"Necromancer Rich House 3",    8, 0,        29,  0, 0 },
        {"Warlock Poor House 1",        8, 0,        29,  0, 0 },
        {"Warlock Poor House 2",        8, 0,        29,  0, 0 },
        {"Warlock Poor House 3",        8, 0,        29,  0, 0 },
        {"Warlock Medium House 1",      8, 0,        29,  0, 0 },
        {"Warlock Medium House 2",      8, 0,        29,  0, 0 },
        {"Warlock Mdeium House 3",      8, 0,        29,  0, 0 },
        {"Warlock Rich House 1",        8, 0,        29,  0, 0 },
        {"Warlock Rich House 2",        8, 0,        29,  0, 0 },
        {"Warlock Rich House 3",        8, 0,        29,  0, 0 },
        {"Out01 Temple of the Moon",    0x24, 0,     25,  0, 0 },
        {"Out01 Dragon Cave",           0x24, 0,     25,  0, 0 },
        {"Out02 Castle Harmondy",       0x24, 0,     25,  0, 0 },
        {"Out02 White Cliff Cave",      0x24, 0,     25,  0, 0 },
        {"Out03 Erathian Sewer",        0x24, 0,     25,  0, 0 },
        {"Out03 Fort Riverstride",      0x24, 0,     25,  0, 0 },
        {"Out03 Castle Gryphonheart",   0x24, 0,     25,  0, 0 },
        {"Out04 Elf Castle",            0x24, 0,     25,  0, 0 },
        {"Out04 Tularean Caves",        0x24, 0,     25,  0, 0 },
        {"Out04 Clanker's Laboratory",  0x24, 0,     25,  0, 0 },
        {"Out05 Hall of the Pit",       0x24, 0,     25,  0, 0 },
        {"Out05 Watchtower 6",          0x24, 0,     25,  0, 0 },
        {"Out06 School of Sorcery",     0x24, 0,     25,  0, 0 },
        {"Out06 Red Dwarf Mines",       0x24, 0,     25,  0, 0 },
        {"Out07 Castle Lambert",        0x24, 0,     25,  0, 0 },
        {"Out07 Walls of Mist",         0x24, 0,     25,  0, 0 },
        {"Out07 Temple of the Light",   0x24, 0,     25,  0, 0 },
        {"Out08 Evil Entrance",         0x24, 0,     25,  0, 0 },
        {"Out08 Breeding Zone",         0x24, 0,     25,  0, 0 },
        {"Out08 Temple of the Dark",    0x24, 0,     25,  0, 0 },
        {"Out09 Grand Temple of the Moon", 0x24, 0,     25,  0, 0 },
        {"Out09 Grand Tempple of the Sun", 0x24, 0,     25,  0, 0 },
        {"Out10 Thunderfist Mountain",  0x24, 0,     25,  0, 0 },
        {"Out10 The Maze",              0x24, 0,     25,  0, 0 },
        {"Out10 Connecting Tunnel Cave #1", 0x24, 0,     25,  0, 0 },
        {"",                            0x24, 0,     25,  0, 0 },
        {"",                            0x24, 0,     25,  0, 0 },
        {"Out11 Stone City",            0x24, 0,     25,  0, 0 },
        {"",                            0x24, 0,     25,  0, 0 },
        {"Out12 Colony Zod",            0x24, 0,     25,  0, 0 },
        {"Out12 Connecting Tunnel Cave #1", 0x24, 0,     25,  0, 0 },
        {"",                            0x24, 0,     25,  0, 0 },
        {"",                            0x24, 0,     25,  0, 0 },
        {"Out13 Mercenary Guild",       0x24, 0,     25,  0, 0 },
        {"Out13 Tidewater Caverns",     0x24, 0,     25,  0, 0 },
        {"Out13 Wine Cellar",           0x24, 0,     25,  0, 0 },
        {"Out14 Titan's Stronghold",    0x24, 0,     25,  0, 0 },
        {"Out14 Temple Of Baa",         0x24, 0,     25,  0, 0 },
        {"Out14 Hall under the Hill",   0x24, 0,     25,  0, 0 },
        {"Out15 The Linclon",           0x24, 0,     25,  0, 0 },
        {"Jail",                        0x24, 0, 31, 0, 0 },
        {"Harmondale Throne Room",      0x24, 0, 29, 0, 0 },
        {"Gryphonheart Throne Room",    0x24, 0, 20, 0, 0 },
        {"Elf Castle Throne Room",      0x24, 0, 20, 0, 0 },
        {"Wizard Castle Throne Room",   0x24, 0, 20, 0, 0 },
        {"Necromancer Casstle Trone Room", 0x24, 0, 20, 0, 0 },
        {"Master Thief",                0x24, 0, 29, 0, 0 },
        {"Dwarven King",                0x24, 0, 20, 0, 0 },
        {"Arms Master",                 0x24, 0, 29, 0, 0 },
        {"Warlock",                     0x24, 0, 29, 0, 0 },
        {"Lord Markam",                 0x24, 0, 20, 0, 0 },
        {"Arbiter Neutral Town",        0x24, 0, 29, 0, 0 },
        {"Arbiter Good Town",           0x24, 0, 29, 0, 0 },
        {"Arbiter Evil Town",           0x24, 0, 29, 0, 0 },
        {"Necromancer Throne Room Empty", 0x24, 0, 20, 0, 0 },
        {"",                            0x24, 0, 29, 0, 0 },
        {"",                            0x24, 0, 29, 0, 0 },
        {"",                            0x24, 0, 29, 0, 0 },
        {"",                            0x24, 0, 29, 0, 0 },
        {"Boat01",                      0xF, 0, 29, 53, 3 },
        {"",                            0x24, 0, 28, 0, 0 },
        {"",                            0x24, 0, 28, 0, 0 },
        {"",                            0x24, 0, 28, 0, 0 },
        {"",                            0x24, 0, 29, 0, 0 },
        {"Arbiter Room Neutral",        0x24, 0, 29, 0, 0 },
        {"Out02 Castle Harmondy Abandoned", 0x24, 0, 25, 0, 0 },
        {"Human Temple02",              0x24, 0x3AB, 23, 27, 0 },
        {"Player Castle Good",          0x24, 0, 25, 0, 0 },
        {"Player Castle Bad",           0x24, 0, 25, 0, 0}
    };




//----- (0044606A) --------------------------------------------------------
void PrepareHouse(HOUSE_ID house)
{
  //unsigned int v1; // ebx@1
  //signed int v2; // esi@1
  //int uExitPic; // edi@1
  __int16 uExitMapID; // ax@2
  //int result; // eax@5
  //unsigned int *v6; // ecx@8
  int v7; // ebx@11
  //int v8; // esi@16
  //unsigned int v9; // eax@16
  //unsigned int v10; // eax@19
  //int v11; // ecx@19
  //char pContainer[36]; // [sp+Ch] [bp-54h]@16
  int v13; // [sp+30h] [bp-30h]@11
  int Dst[6]; // [sp+34h] [bp-2Ch]@1
  //unsigned int v15; // [sp+4Ch] [bp-14h]@1
  int uAnimationID; // [sp+50h] [bp-10h]@1
  //unsigned int *v17; // [sp+54h] [bp-Ch]@3
  //unsigned int v18; // [sp+58h] [bp-8h]@1
  //int v19; // [sp+5Ch] [bp-4h]@7

  //v15 = uHouseID;
  //v1 = 52 * uHouseID;
  //uAnimationID = p2DEvents_minus1___02[26 * uHouseID];
  uAnimationID = p2DEvents[house - 1].uAnimationID;
  //v18 = 52 * uHouseID;
  memset(Dst, 0, 0x18u);
  //uExitPic = *(__int16 *)((char *)p2DEvents_minus1_::2C + v1);
  //uExitPic = p2DEvents[uHouseID - 1].uExitPicID;
  uNumDialogueNPCPortraits = 0;
  uHouse_ExitPic = p2DEvents[house - 1].uExitPicID;
  if ( uHouse_ExitPic )
  {
    //uExitMapID = *(__int16 *)((char *)p2DEvents_minus1_::30 + v1);
    uExitMapID = p2DEvents[house - 1]._quest_related;
    if ( uExitMapID > 0 )
    {
      //v17 = (unsigned int *)(uExitMapID - 1);
	  if(_449B57_test_bit(pParty->_quest_bits,uExitMapID))
     // if ( !((unsigned __int8)(0x80u >> (uExitMapID - 1) % 8) & pParty->_quest_bits[(uExitMapID - 1) >> 3]) )
      {
        //uExitPic = 0;
        uHouse_ExitPic = 0;
      }
    }
  }

  dword_591080 = pAnimatedRooms[uAnimationID].field_8;
  //result = dword_591080;

  //v2 = 0;
  uNumDialogueNPCPortraits = 0;
  if ( dword_591080 )
  {
    //v2 = 1;
    Dst[0] = dword_591080;
    uNumDialogueNPCPortraits = 1;
  }

  //v19 = 1;
  for (uint i = 0; i < pNPCStats->uNumNewNPCs; ++i)
  {
    auto npc = pNPCStats->pNewNPCData + i;
    //v6 = &pNPCStats->pNewNPCData[1].uFlags;
    //v17 = &pNPCStats->pNewNPCData[1].uFlags;
    //do
    //{
    if (npc->Location2D == house )
    {
      if (~npc->uFlags & 0x80)
        //if ( !(*(char *)v6 & 0x80) )
      {
        v7 = uNumDialogueNPCPortraits++ - dword_591080 ? 1 : 0;
        HouseNPCData[v7] = npc;
        //v6 = v17;
        //*(&v13 + v2) = *(v17 - 1);
        Dst[uNumDialogueNPCPortraits - 1] = npc->uPortraitID;
          //v1 = v18;
        if ((npc->uFlags & 3) != 2)
          ++npc->uFlags;
      }
    }
      //++v19;
      //v6 += 19;
      //v17 = v6;
    //}
    //while ( v19 < (signed int)pNPCStats->uNumNewNPCs );
  }
  //uNumDialogueNPCPortraits = v2;

  //v19 = 0;
  for (uint i = 0; i < uNumDialogueNPCPortraits; ++i)
  //if ( v2 > 0 )
  {
    //do
    //{
      //v8 = v19;
    char icon_name[128];
    sprintfex(icon_name, "npc%03u", Dst[i]);
    //v9 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
    //++v19;
    pDialogueNPCPortraits[i] = pIcons_LOD->LoadTexturePtr(icon_name, TEXTURE_16BIT_PALETTE);
    //result = v19;
    //}
    //while ( v19 < uNumDialogueNPCPortraits );
    //uExitPic = uHouse_ExitPic;
  }

  if (uHouse_ExitPic)
  {
    //v10 = pIcons_LOD->LoadTexture(pHouse_ExitPictures[uHouse_ExitPic], TEXTURE_16BIT_PALETTE);
    //v11 = uNumDialogueNPCPortraits++;
    pDialogueNPCPortraits[uNumDialogueNPCPortraits++] = pIcons_LOD->LoadTexturePtr(pHouse_ExitPictures[uHouse_ExitPic], TEXTURE_16BIT_PALETTE);
    //result = *(__int16 *)((char *)p2DEvents_minus1_::2E + v1);
    //result = p2DEvents[house - 1].uExitMapID;
    uHouse_ExitPic = p2DEvents[house - 1].uExitMapID;
  }
  //return result;
}


//----- (0044622E) --------------------------------------------------------
bool  EnterHouse(enum HOUSE_ID uHouseID)
	{
	//enum HOUSE_ID v1; // edi@1
	//int v2; // edi@5
	signed int uOpenTime; // eax@5
	signed int uCloseTime; // esi@5
	unsigned int v5; // esi@5
	int v6; // edx@5
	signed int am_pm_flag_open; // ecx@10
	signed int am_pm_flag_close; // eax@10
	int v9; // esi@10
	//unsigned int v10; // esi@16
	int v11; // ecx@17
	unsigned int v12; // kr00_4@25
	//Player *v13; // esi@25
	int v14; // eax@25
	//Player *v15; // esi@27
	//signed int v16; // eax@32
	unsigned int v17; // eax@37
	signed int v18; // edi@37
	signed int v19; // edi@41
	//unsigned int v20; // ecx@41
	//const char *v22; // [sp-4h] [bp-40h]@33
	char pContainer[40]; // [sp+Ch] [bp-30h]@32
	unsigned int v24; // [sp+34h] [bp-8h]@5
	//enum HOUSE_ID v25; // [sp+38h] [bp-4h]@1

	//v1 = uHouseID;
	//v25 = uHouseID;
	GameUI_StatusBar_TimedString[0] = 0;
	pStatusBarString[0] = 0;
	ShowStatusBarString("", 2u);
	if ( pMessageQueue_50CBD0->uNumMessages )
		pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
	viewparams->bRedrawGameUI = 1;
	uDialogueType = 0;
	pKeyActionMap->_459ED1(3);
	pKeyActionMap->ResetKeys();
	if (uHouseID == HOUSE_600 || uHouseID == HOUSE_601)
		{
		GameOverMenu(0);
		return 0;
		}
	uOpenTime = p2DEvents[uHouseID - 1].uOpenTime;
	uCloseTime = p2DEvents[uHouseID - 1].uCloseTime;
	ptr_F8B1E8 = 0;
	dword_F8B1E4 = 0;
	dword_F8B1F4 = 0;
	memset(byte_F8B1F0, 0, 4);
	memset(byte_F8B148, 0, 16);
	pRenderer->ClearZBuffer(0, 479);

	if (((uCloseTime - 1 <= uOpenTime)&&((pParty->uCurrentHour <uOpenTime)&&(pParty->uCurrentHour >(uCloseTime - 1))))||
		((uCloseTime - 1 >  uOpenTime)&&((pParty->uCurrentHour < uOpenTime)||(pParty->uCurrentHour > (uCloseTime - 1))))) 

		{
		am_pm_flag_open = 0;
		am_pm_flag_close = 0;
		if (uOpenTime > 12 )
			{
			uOpenTime -= 12;
			am_pm_flag_open = 1;
			}
		if ( uCloseTime > 12 )
			{
			uCloseTime -= 12;
			am_pm_flag_close = 1;
			}
		sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[414], uOpenTime, aAMPMNames[am_pm_flag_open], 
			uCloseTime, aAMPMNames[am_pm_flag_close]); //"This place is open from %d%s to %d%s"
		ShowStatusBarString(pTmpBuf, 2u);
		if ( uActiveCharacter )
			pPlayers[uActiveCharacter]->PlaySound(SPEECH_3, 0);
		return 0;
		}
	else
		{
		//v10 = uHouseID;
		if ( (signed int)uHouseID < 53 ) //entering shops and guilds
			{
			if ( !(pParty->field_3C._shop_ban_times[uHouseID])
				||  (pParty->field_3C._shop_ban_times[uHouseID] <= pParty->uTimePlayed) )
				{
				pParty->field_3C._shop_ban_times[uHouseID] = 0;
				}
			else
				{
				ShowStatusBarString(pGlobalTXT_LocalizationStrings[191], 2u);// "You've been banned from this shop!"
				return 0;
				}
			}
		if ( !start_event_seq_number )
			pAudioPlayer->StopChannels(-1, -1);

		uCurrentHouse_Animation = p2DEvents[uHouseID - 1].uAnimationID;
		in_current_building_type = pAnimatedRooms[uCurrentHouse_Animation].uBuildingType;
		if ( in_current_building_type == BildingType_Throne_Room && pParty->uFine )   // going 2 jail
			{
			uCurrentHouse_Animation = (signed __int16)p2DEvents[186].uAnimationID;
			uHouseID = HOUSE_JAIL;
			pParty->uTimePlayed = pParty->uTimePlayed+ 0x7620000;
			in_current_building_type = pAnimatedRooms[p2DEvents[HOUSE_LORD_AND_JUDGE].uAnimationID].uBuildingType;
			++pParty->uNumPrisonTerms;
			pParty->uFine = 0;
			for (uint i = 0; i < 4; ++i)
				{
				pParty->pPlayers[i].uTimeToRecovery = 0;
				pParty->pPlayers[i].uNumDivineInterventionCastsThisDay = 0;
				pParty->pPlayers[i].SetVariable(VAR_Award, 87);
				}
			}
		++pIcons_LOD->uTexturePacksCount;
		if ( !pIcons_LOD->uNumPrevLoadedFiles )
			pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
		switch (pParty->alignment)
			{
		case PartyAlignment_Good:    sprintf(pContainer, "evt%02d-b", const_2()); break;
		case PartyAlignment_Neutral: sprintf(pContainer, "evt%02d", const_2()); break;
		case PartyAlignment_Evil:    sprintf(pContainer, "evt%02d-c", const_2()); break;
		default: assert(false);
			}

		v17 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
		pDialogueNPCCount = 0;
		pTexture_Dialogue_Background = &pIcons_LOD->pTextures[v17];
		uTextureID_507B04 = uTextureID_right_panel;
		PrepareHouse(uHouseID);
		v18 = 1;
		uTextureID_507B04 = uTextureID_right_panel;
		if ( uNumDialogueNPCPortraits == 1 )
			pDialogueNPCCount = 1;
		pVideoPlayer->_4BF28F(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);  
		dword_5C35D4 = 1;
		if ( (signed int)uHouseID < 139 || (signed int)uHouseID > 172 )
			{
			if ( (signed int)uHouseID >= 54 && (signed int)uHouseID <= 73 && !sub_4B68EA(uHouseID - 54) )
				{
				return 1;
				}
			}
		else
			{ //guilds
			v19 = guild_mambership_flags[uHouseID-139]; //guilds flags 
			//v20 = uHouseID;
			//if ( !((unsigned __int8)(0x80u >> v19 % 8) & pPlayers[uActiveCharacter]->_guilds_member_bits[v19 /8]) )
			if(_449B57_test_bit((unsigned char*)pPlayers[uActiveCharacter]->_guilds_member_bits,v19))
				{
				HousePlaySomeSound(uHouseID, 3);
				return 1;
				}
			}
		HousePlaySomeSound(uHouseID, 1);
		dword_5C35D4 = 1;
		return 1;
		}
	}

//----- (004B1E92) --------------------------------------------------------
void __fastcall HousePlaySomeSound(unsigned int uHouseID, int a2)
    {
    //if ( BYTE1(pAnimatedRooms[p2DEvents_minus1___02[26 * uHouseID]].field_C) )
    if ( pAnimatedRooms[p2DEvents[uHouseID - 1].uAnimationID].uRoomSoundId )
        pAudioPlayer->PlaySound(
        //(SoundID)(a2 + 100 * (BYTE1(pAnimatedRooms[p2DEvents_minus1___02[26 * uHouseID]].field_C) + 300)),
        (SoundID)(a2 + 100 * (pAnimatedRooms[p2DEvents[uHouseID - 1].uAnimationID].uRoomSoundId) + 300),
        806, 0, -1, 0, 0, 0, 0);
    }

    //----- (004B4F4F) --------------------------------------------------------
char *__cdecl JailDialog()
{
  const char *v0; // esi@1
  const char *v1; // ST10_4@1
  unsigned __int16 v2; // ST0C_2@1
  int v3; // eax@1
  GUIWindow v5; // [sp+8h] [bp-54h]@1

  memcpy(&v5, window_SpeakInHouse, sizeof(v5));
  v0 = pGlobalTXT_LocalizationStrings[672];
  v1 = pGlobalTXT_LocalizationStrings[672];
  v5.uFrameX = 483;
  v5.uFrameWidth = 148;
  v5.uFrameZ = 334;
  v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
  v3 = pFontArrus->CalcTextHeight(v0, &v5, 0, 0);
  return v5.DrawTitleText(pFontArrus, 0, (310 - v3) / 2 + 18, v2, v1, 3u);
}



//----- (004B68EA) --------------------------------------------------------
bool __fastcall sub_4B68EA(int a1)
{
  signed int v1; // edi@1
  int *v2; // esi@1
  int v3; // ecx@2

  v1 = 0;
  v2 = &dword_4F0E10[a1];
  while ( 1 )
  {
    v3 = 8 * *((char *)v2 + v1);
    if ( *(&byte_4F09B1[pParty->uDaysPlayed % 7] + v3 * 4) )
    {
      if ( !dword_4F09CC[v3] || (unsigned __int16)_449B57_test_bit(pParty->_quest_bits, LOWORD(dword_4F09CC[v3])) )
        break;
    }
    ++v1;
    if ( v1 >= 4 )
      return 0;
  }
  return 1;
}



//----- (004B7911) --------------------------------------------------------
void __cdecl TownHallDialog()
{
  GUIWindow *v0; // eax@4
  int v1; // eax@10
  int v2; // esi@10
  GUIFont *v3; // ST20_4@20
  int v4; // eax@20
  MonsterInfo *v5; // edi@21
  unsigned int v6; // ST20_4@21
  char *v7; // ST1C_4@21
  unsigned int v8; // eax@21
  int v9; // esi@21
  char *v10; // eax@23
  signed int v11; // ebx@24
  signed int i; // esi@26
  int v13; // eax@27
  GUIWindow *v14; // ecx@28
  __int64 v15; // qax@28
  signed int v16; // ebx@28
  int v17; // ebx@28
  unsigned __int8 v18; // sf@28
  char **v19; // edi@29
  GUIButton *v20; // eax@30
  GUIButton *v21; // esi@30
  int v22; // eax@30
  unsigned int v23; // ecx@30
  unsigned __int16 v24; // ax@30
  GUIWindow a1; // [sp+Ch] [bp-110h]@21
  GUIWindow w; // [sp+60h] [bp-BCh]@21
  GUIWindow _this; // [sp+B4h] [bp-68h]@1
  int v28; // [sp+108h] [bp-14h]@1
  int v29; // [sp+10Ch] [bp-10h]@28
  int v30; // [sp+110h] [bp-Ch]@1
  int v31; // [sp+114h] [bp-8h]@29
  GUIFont *pOutString; // [sp+118h] [bp-4h]@21

  memcpy(&_this, window_SpeakInHouse, sizeof(_this));
  _this.uFrameX = 483;
  _this.uFrameWidth = 148;
  _this.uFrameZ = 334;
  v28 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
  v30 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
  sprintf(pTmpBuf, "%s: %d", pGlobalTXT_LocalizationStrings[605], pParty->uFine);
  _this.DrawTitleText(pFontArrus, 0, 0x104u, v30, pTmpBuf, 3u);
  switch(dialog_menu_id)
  {
	case 1:
		{
		v11 = 1;
		pOutString = 0;
		pShopOptions[0] = pGlobalTXT_LocalizationStrings[604];
		if ( pParty->uFine )
		{
			pShopOptions[1] = pGlobalTXT_LocalizationStrings[603];
			v11 = 2;
		}
		for ( i = 0; i < v11; ++i )
		{
			v13 = pFontArrus->CalcTextHeight(pShopOptions[i], &_this, 0, 0);
			pOutString = (GUIFont *)((char *)pOutString + v13);
		}
		v29 = (100 - (signed int)pOutString) / v11;
		v14 = pDialogueWindow;
		v15 = 80 - v11 * (100 - (signed int)pOutString) / v11 - (signed int)pOutString;
		v16 = v15 - HIDWORD(v15);
		LODWORD(v15) = pDialogueWindow->pStartingPosActiveItem;
		HIDWORD(v15) = v15 + pDialogueWindow->pNumPresenceButton;
		v17 = (v16 >> 1) - v29 / 2 + 158;
		v18 = -pDialogueWindow->pNumPresenceButton < 0;
		pOutString = (GUIFont *)pDialogueWindow->pStartingPosActiveItem;
		if ( v18 ^ __OFSUB__((int)v15, HIDWORD(v15)) )
		{
			v31 = 2;
			v19 = pShopOptions;
			do
			{
				v20 = v14->GetControl((unsigned int)pOutString);
				v21 = v20;
				v20->uY = v29 + v17;
				v22 = pFontArrus->CalcTextHeight(*v19, &_this, 0, 0);
				v23 = v21->uY;
				v21->uHeight = v22;
				v17 = v23 + v22 - 1;
				v21->uW = v17;
				v24 = v30;
				if ( pDialogueWindow->pCurrentPosActiveItem != v31 )
					v24 = v28;
				_this.DrawTitleText(pFontArrus, 0, v23, v24, *v19, 3u);
				v14 = pDialogueWindow;
				++v31;
				++v19;
				pOutString = (GUIFont *)((char *)pOutString + 1);
			}
			while ( (signed int)pOutString < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem );
		}
		break;
		}
	case 99:
		{
		v5 = &pMonsterStats->pInfos[word_F8B1A0];
		v6 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
		v7 = v5->pName;
		v8 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
		sprintf(pTmpBuf, &byte_4F0F98, v8, v7, v6);
		sprintf(pTmpBuf2, dword_F8B1A4, pTmpBuf, 100 * v5->uLevel);
		ptr_F8B1E8 = pTmpBuf2;
		memcpy(&a1, pDialogueWindow, sizeof(a1));
		w.uFrameWidth = 458;
		w.uFrameZ = 457;
		pOutString = pFontArrus;
		v9 = pFontArrus->CalcTextHeight(pTmpBuf2, &w, 13, 0) + 7;
		if ( 352 - v9 < 8 )
		{
			pOutString = pFontCreate;
			v9 = pFontCreate->CalcTextHeight(ptr_F8B1E8, &w, 13, 0) + 7;
		}

		auto pTex = (uTextureID_Leather != -1 ? &pIcons_LOD->pTextures[uTextureID_Leather] : 0);
		pRenderer->_4A6A68(8u, 352 - v9, pTex, (pTex ? pTex->uTextureHeight : 26) - v9);
		pRenderer->DrawTextureIndexed(8u, 347 - v9, pTexture_591428);
		v10 = FitTextInAWindow(ptr_F8B1E8, pOutString, &w, 0xDu, 0);
		a1.DrawText(pOutString, 13, 354 - v9, 0, v10, 0, 0, 0);
		break;
		}
	case 100:
		{
		v0 = window_SpeakInHouse;
		if ( window_SpeakInHouse->field_40 == 1 )
		{
			sprintf(pTmpBuf, "%s\n%s", pGlobalTXT_LocalizationStrings[606], pGlobalTXT_LocalizationStrings[112]);
			_this.DrawTitleText(pFontArrus, 0, 0x92u, v30, pTmpBuf, 3u);
			_this.DrawTitleText(pFontArrus, 0, 0xBAu, v28, (const char *)pKeyActionMap->pPressedKeysBuffer, 3u);
			v3 = pFontArrus;
			v4 = pFontArrus->GetLineWidth((const char *)pKeyActionMap->pPressedKeysBuffer);
			_this.DrawFlashingInputCursor(v4 / 2 + 80, 185, v3);
			return;
		}
		if ( window_SpeakInHouse->field_40 == 2 )
		{
			v1 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer);
			v2 = v1;
			if ( v1 <= 0 )
			{
			//LABEL_8:
				pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
				/*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
				{
				pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113;
				pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1;
				*(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
				++pMessageQueue_50CBD0->uNumMessages;
				}*/
				return;
			}
			if ( v1 > pParty->uNumGold )
			{
				HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 2);
				v2 = pParty->uNumGold;
			}
			if ( v2 > pParty->uFine )
				v2 = pParty->uFine;
			Party::TakeGold(v2);
			pParty->uFine -= v2;
			if ( pParty->uFine < 0 )
				pParty->uFine = 0;
			if ( uActiveCharacter )
				pPlayers[uActiveCharacter]->PlaySound(SPEECH_81, 0);
			v0 = window_SpeakInHouse;
		}
		if ( window_SpeakInHouse->field_40 == 3 )
		{
			v0->field_40 = 0;
			pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
		}
		break;
		}
	default:
		{
		break;
		}
  }
  return;
}
// F8B19C: using guessed type int dword_F8B19C;
// F8B1A0: using guessed type __int16 word_F8B1A0;

//----- (004B7D7E) --------------------------------------------------------
void __cdecl BankDialog()
{
  GUIWindow *v0; // eax@4
  int v1; // ecx@5
  int v2; // eax@6
  unsigned int v3; // esi@6
  GUIFont *v4; // ST10_4@12
  int v5; // eax@12
  int v6; // eax@19
  unsigned int v7; // esi@19
  unsigned __int16 v8; // ax@27
  unsigned __int16 v9; // ax@29
  char *v10; // [sp-8h] [bp-70h]@11
  char *v11; // [sp-4h] [bp-6Ch]@11
  GUIWindow _this; // [sp+Ch] [bp-5Ch]@1
  __int16 v13[2]; // [sp+60h] [bp-8h]@1
  __int16 v14[2]; // [sp+64h] [bp-4h]@1

  memcpy(&_this, window_SpeakInHouse, sizeof(_this));
  _this.uFrameX = 483;
  _this.uFrameWidth = 148;
  _this.uFrameZ = 334;
  *(int *)v13 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
  *(int *)v14 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
  sprintf(pTmpBuf, "%s: %d", pGlobalTXT_LocalizationStrings[25], pParty->uNumGoldInBank);
  _this.DrawTitleText(pFontArrus, 0, 0xDCu, v14[0], pTmpBuf, 3u);
  switch(dialog_menu_id)
  {
	case 1:
		{
		v8 = v14[0];
		if ( pDialogueWindow->pCurrentPosActiveItem != 2 )
			v8 = v13[0];
		_this.DrawTitleText(pFontArrus, 0, 0x92u, v8, pGlobalTXT_LocalizationStrings[60], 3u);
		v9 = v14[0];
		if ( pDialogueWindow->pCurrentPosActiveItem != 3 )
			v9 = v13[0];
		_this.DrawTitleText(pFontArrus, 0, 0xB0u, v9, pGlobalTXT_LocalizationStrings[244], 3u);
		break;
		}
	case 7:
		{
		v0 = window_SpeakInHouse;
		if ( window_SpeakInHouse->field_40 != 1 )
		{
			v1 = window_SpeakInHouse->field_40 - 2;
			if ( window_SpeakInHouse->field_40 == 2 )
			{
				v6 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer);
				v7 = v6;
				if ( !v6 )
				{
//LABEL_17:
					pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
					/*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
					{
						pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113;
						pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1;
						*(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
						++pMessageQueue_50CBD0->uNumMessages;
					}*/
					return;
				}
				if ( v6 > pParty->uNumGold )
				{
					HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 2);
					v7 = pParty->uNumGold;
				}
				if ( v7 )
				{
					Party::TakeGold(v7);
					pParty->uNumGoldInBank += v7;
					if ( uActiveCharacter )
						pPlayers[uActiveCharacter]->PlaySound(SPEECH_81, 0);
				}
				v0 = window_SpeakInHouse;
				v0->field_40 = 0;
				pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
				return;
			}
			if ( v1 != 1 )
				return;
			v0->field_40 = 0;
			pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
			return;      
		}
		v11 = pGlobalTXT_LocalizationStrings[112];
		v10 = pGlobalTXT_LocalizationStrings[60];
		sprintf(pTmpBuf, "%s\n%s", v10, v11);
		_this.DrawTitleText(pFontArrus, 0, 0x92u, v14[0], pTmpBuf, 3u);
		_this.DrawTitleText(pFontArrus, 0, 0xBAu, v13[0], (const char *)pKeyActionMap->pPressedKeysBuffer, 3u);
		v4 = pFontArrus;
		v5 = pFontArrus->GetLineWidth((const char *)pKeyActionMap->pPressedKeysBuffer);
		_this.DrawFlashingInputCursor(v5 / 2 + 80, 185, v4);
		break;
		}

	case 8:
		{
		v0 = window_SpeakInHouse;
		if ( window_SpeakInHouse->field_40 != 1 )
		{
			v1 = window_SpeakInHouse->field_40 - 2;
			if ( window_SpeakInHouse->field_40 == 2 )
			{
				window_SpeakInHouse->field_40 = 0;
				v2 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer);
				v3 = v2;
				if ( v2 )
				{
					if ( v2 > pParty->uNumGoldInBank )
					{
						HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 2);
						v3 = pParty->uNumGoldInBank;
					}
					if ( v3 )
					{
						Party::SetGold(pParty->uNumGold + v3);
						pParty->uNumGoldInBank -= v3;
					}
				}
				pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
				return;
			}
			if ( v1 != 1 )
				return;
			v0->field_40 = 0;
			pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
			return;  
		}
		v11 = pGlobalTXT_LocalizationStrings[112];
		v10 = pGlobalTXT_LocalizationStrings[244];
		sprintf(pTmpBuf, "%s\n%s", v10, v11);
		_this.DrawTitleText(pFontArrus, 0, 0x92u, v14[0], pTmpBuf, 3u);
		_this.DrawTitleText(pFontArrus, 0, 0xBAu, v13[0], (const char *)pKeyActionMap->pPressedKeysBuffer, 3u);
		v4 = pFontArrus;
		v5 = pFontArrus->GetLineWidth((const char *)pKeyActionMap->pPressedKeysBuffer);
		_this.DrawFlashingInputCursor(v5 / 2 + 80, 185, v4);
		return;
		break;
		}

	default:
		{
		break;
		}
  }
}
// F8B19C: using guessed type int dword_F8B19C;

//----- (004B8285) --------------------------------------------------------
void __cdecl TavernDialog()
{
  int v0;
  int pItemNum;
  double v2; // st7@1
  signed int v3; // ebx@1
  int v4; // ecx@1
  int v5; // esi@3
  signed int v6; // edi@5
  int v7; // ecx@5
  int pNumString; // edi@16
  signed int v9; // esi@16
  unsigned int pNumActiveItem; // esi@18
  int v11; // eax@18
  unsigned int v12; // eax@19
  int v13; // eax@21
  int v14; // ecx@26
  //GUIButton *v15; // eax@28
  //GUIButton *v16; // esi@28
  int v17; // eax@28
  char *v18; // eax@30
  int v19; // eax@30
  unsigned int v20; // ecx@30
  int v21; // edx@30
  int v22; // eax@30
  unsigned __int16 v23; // ax@30
  int v24; // eax@34
  int v25; // eax@34
  char *v26; // esi@36
  int v27; // edi@46
  unsigned int pColorText; // eax@57
  signed int v31; // eax@59
  //GUIWindow *v33; // edi@64
  int v34; // eax@64
  int v35; // ecx@64
  int v36; // esi@64
  char v37; // sf@64
  GUIButton *pButton; // eax@65
  int v39; // edx@69
  int v40; // ecx@69
  int v41; // ecx@69
  int v42; // ecx@70
  unsigned int v43; // edx@70
  int v44; // edx@71
  int v45; // ecx@71
  int v46; // ecx@72
  int v47; // eax@74
  signed int v48; // edi@77
  signed int i; // esi@79
  int v50; // eax@80
  //GUIWindow *v51; // ecx@81
  _QWORD v52; // qax@81
  signed int v53; // edi@81
  int v54; // edi@81
  //GUIButton *v55; // esi@83
  const char **v56; // eax@83
  int v57; // eax@83
  unsigned int v58; // ecx@83
  //Player *v59; // edx@83
  unsigned __int16 v60; // ax@83
  int v61; // eax@99
  char *v63; // eax@99
  GUIFont *v64; // edx@99
  GUIFont *v65; // edi@100
  unsigned int v66; // [sp-10h] [bp-284h]@75
  unsigned __int16 v67; // [sp-Ch] [bp-280h]@75
  int v68; // [sp-Ch] [bp-280h]@99
  char *v69; // [sp-8h] [bp-27Ch]@75
  int v70; // [sp-8h] [bp-27Ch]@99
  unsigned int v71; // [sp-4h] [bp-278h]@75
  const char *v72; // [sp-4h] [bp-278h]@93
  unsigned int v73; // [sp-4h] [bp-278h]@99
  char Dest[100]; // [sp+Ch] [bp-268h]@55
  char v75[100]; // [sp+70h] [bp-204h]@59
  char a1[100]; // [sp+D4h] [bp-1A0h]@57
  char v77[100]; // [sp+138h] [bp-13Ch]@59
  //GUIWindow v78; // [sp+19Ch] [bp-D8h]@99
  GUIWindow dialog_window; // [sp+1F0h] [bp-84h]@1
  char *Str[2]; // [sp+244h] [bp-30h]@30
  unsigned int pColorWhite; // [sp+24Ch] [bp-28h]@1
  unsigned __int8 v82; // [sp+253h] [bp-21h]@59
  int v83; // [sp+254h] [bp-20h]@1
  int pColorYellow; // [sp+258h] [bp-1Ch]@1
  Player *pPlayer; // [sp+25Ch] [bp-18h]@1
  int all_text_height; // [sp+260h] [bp-14h]@18
  unsigned __int8 v87; // [sp+266h] [bp-Eh]@59
  unsigned __int8 v88; // [sp+267h] [bp-Dh]@57
  int v89; // [sp+268h] [bp-Ch]@1
  unsigned int pTextHeight; // [sp+26Fh] [bp-5h]@55
  int v91; // [sp+270h] [bp-4h]@3
  GUIFont *pOutString;

  pPlayer = pPlayers[uActiveCharacter];
  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
  dialog_window.uFrameX = 483;
  dialog_window.uFrameWidth = 148;
  dialog_window.uFrameZ = 334;
  pColorWhite = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
  pColorYellow = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
  v2 = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier;
  *(float *)&v83 = v2;
  *(float *)&v89 = v2 * v2;
  v3 = (signed __int64)(*(float *)&v89 * 0.1);
  pItemNum = v3 * (100 - pPlayer->GetMerchant()) / 100;
  if ( pItemNum < v3 / 3 )
    pItemNum = v3 / 3;
  v5 = 1;
  pOutString = (GUIFont *)pItemNum;
  if ( pItemNum <= 0 )
    pOutString = (GUIFont *)1;
  v6 = (signed __int64)(*(float *)&v89 * *(float *)&v83 * 0.0099999998);
  v7 = v6 * (100 - pPlayer->GetMerchant()) / 100;
  if ( v7 < v6 / 3 )
  v7 = v6 / 3;
  v83 = v7;
  if ( v7 <= 0 )
  {
    v7 = 1;
    v83 = 1;
  }
  switch(dialog_menu_id)
  {
    case DIALOG_SHOP_MAIN:
    {
      if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
          return;

      sprintf(Dest, "\xC" "%05d", pDialogueWindow->pCurrentPosActiveItem == 2 ? pColorYellow : pColorWhite);
      sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[178], pOutString); // Rent room for %d gold
      strcat(Dest, pTmpBuf2);
      pTextHeight = pFontArrus->CalcTextHeight(Dest, &dialog_window, 0, 0);
      strcat(Dest, "\n \n");

      sprintf(a1, "\xC" "%05d", pDialogueWindow->pCurrentPosActiveItem == 3 ? pColorYellow : pColorWhite);
      sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[86], // Buy food for %d days for %d gold
        (unsigned int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier,
         v83);
      strcat(a1, pTmpBuf2);
      v88 = pFontArrus->CalcTextHeight(a1, &dialog_window, 0, 0);
      strcat(a1, "\n \n");

      sprintf(v77, "\xC" "%05d", pDialogueWindow->pCurrentPosActiveItem == 4 ? pColorYellow : pColorWhite);
      strcat(v77, pGlobalTXT_LocalizationStrings[160]); // Learn Skills
      v82 = pFontArrus->CalcTextHeight(v77, &dialog_window, 0, 0);
      strcat(v77, "\n \n");
      v75[0] = 0;
      pTextHeight = 0;
      if ( (signed int)window_SpeakInHouse->ptr_1C >= 108 && (signed int)window_SpeakInHouse->ptr_1C <= 120 )
      {
        sprintf(v75, "\xC" "%05d", pDialogueWindow->pCurrentPosActiveItem == 5 ? pColorYellow : pColorWhite);
        strcat(v75, pGlobalTXT_LocalizationStrings[611]); // Play Arcomage
        pTextHeight = pFontArrus->CalcTextHeight(v75, &dialog_window, 0, 0);
      }
      pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
      v36 = LOBYTE(pFontArrus->uFontHeight) - 3;
      v37 = -pDialogueWindow->pNumPresenceButton < 0;
      if ( !(v37 ^ pNumActiveItem < pNumActiveItem + pDialogueWindow->pNumPresenceButton) )
      {
        sprintf(pTmpBuf, "%s%s%s%s", Dest, a1, v77, v75);
        dialog_window.DrawTitleText(pFontArrus, 0, 146, 0, pTmpBuf, 3);
        return;
      }
      while ( 1 )
      {
        pButton = pDialogueWindow->GetControl(pNumActiveItem);
        if ( pButton->uControlParam == 15 )
        {
          v46 = pTextHeight;
          pButton->uHeight = pTextHeight;
          pButton->uY = 146;
          v41 = v46 + 145;
          pButton->uW = v41;
        }
        else if ( pButton->uControlParam == 16 )
        {
          v44 = v88;
          v45 = pTextHeight + v36 + 146;
          pButton->uHeight = v88;
          pButton->uY = v45;
          v41 = v45 + v44 - 1;
          pButton->uW = v41;
        }
        else if ( pButton->uControlParam == 96 )
        {
          v42 = pTextHeight + v88 + 2 * v36 + 146;
          v43 = v82;
          pButton->uY = v42;
          pButton->uHeight = v43;
          v41 = v43 + v42 - 1;
          pButton->uW = v41;
        }
        else if ( pButton->uControlParam == 101 )
        {
          v39 = pTextHeight + 3 * v36 + pTextHeight + v88 + 146;
          v40 = v87;
          pButton->uHeight = pTextHeight;
          pButton->uY = v39;
          v41 = v39 + v40 - 1;
          pButton->uW = v41;
        }
        pNumActiveItem++;
        if ( pNumActiveItem >= pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem )
        {
          sprintf(pTmpBuf, "%s%s%s%s", &Dest, &a1, &v77, &v75);
          dialog_window.DrawTitleText(pFontArrus, 0, 146, 0, pTmpBuf, 3);
          return;
        }
      }
      break;
    }
    case DIALOG_SHOP_ARCOMAGE_102:
    {
      __debugbreak;
      pOutString = pFontArrus;
      strcpy(pTmpBuf, pNPCTopics[354].pText);
      dialog_window.uFrameWidth = 460;
      dialog_window.uFrameZ = 452;
      pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf, &dialog_window, 12, 0) + 7;
      if ( 352 - pTextHeight < 8 )
      {
        pOutString = pFontCreate;
        pTextHeight = pFontCreate->CalcTextHeight(pTmpBuf, &dialog_window, 12, 0) + 7;
      }
      auto pTex = (uTextureID_Leather != -1 ? &pIcons_LOD->pTextures[uTextureID_Leather] : 0);
      pRenderer->_4A6A68(8, 352 - pTextHeight, pTex, (pTex ? pTex->uTextureHeight : 26) - pTextHeight);
      pRenderer->DrawTextureIndexed(8, 347 - pTextHeight, pTexture_591428);
      v63 = FitTextInAWindow(pTmpBuf, pOutString, &dialog_window, 0xCu, 0);
      window_SpeakInHouse->DrawText(pOutString, 12, 354 - pTextHeight, 0, v63, 0, 0, 0);
      break;
    }
    case DIALOG_SHOP_ARCOMAGE_103:
    {
      __debugbreak;
      strcpy(pTmpBuf, pNPCTopics[(uint)window_SpeakInHouse->ptr_1C + 247].pText);
      dialog_window.uFrameWidth = 460;
      dialog_window.uFrameZ = 452;
      v61 = pFontArrus->CalcTextHeight(pTmpBuf, &dialog_window, 12, 0);
      pTextHeight = v61 + 7;
      auto pTex = (uTextureID_Leather != -1 ? &pIcons_LOD->pTextures[uTextureID_Leather] : nullptr);
      pRenderer->_4A6A68(8, 352 - (v61 + 7), pTex, (pTex ? pTex->uTextureHeight : 26) - (v61 + 7));
      pRenderer->DrawTextureIndexed(8, 347 - pTextHeight, pTexture_591428);
      v63 = FitTextInAWindow(pTmpBuf, pFontArrus, &dialog_window, 0xCu, 0);
      window_SpeakInHouse->DrawText(pFontArrus, 12, 354 - pTextHeight, 0, v63, 0, 0, 0);
      break;
    }
    case DIALOG_SHOP_ARCOMAGE_RESULT:
    {
      if ( pArcomageGame->bGameInProgress == 1 )
        return;
      if ( pArcomageGame->uGameResult )
      {
        if ( pArcomageGame->uGameResult == 1 )
          v72 = pGlobalTXT_LocalizationStrings[640];// You won!
        else
          v72 = pGlobalTXT_LocalizationStrings[641];// You lost!
      }
      else
      {
        v72 = pGlobalTXT_LocalizationStrings[639];// A tie!
      }
      strcpy(pTmpBuf, v72);
      v66 = (174 - pFontArrus->CalcTextHeight(pTmpBuf, &dialog_window, 0, 0)) / 2 + 138;
      dialog_window.DrawTitleText(pFontArrus, 0, v66, pColorYellow, pTmpBuf, 3);
      break;
    }
    case DIALOG_SHOP_REST:
    {
      if ( pParty->uNumGold >= (unsigned int)pOutString )
      {
        Party::TakeGold((unsigned int)pOutString);
        v27 = (int)window_SpeakInHouse->ptr_1C;
        HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 2);
        dialog_menu_id = 0;
        sub_4BD8B5();
        sub_4B1D27();
        pVideoPlayer->Unload();
        window_SpeakInHouse->Release();
        window_SpeakInHouse = 0;
        if ( pMessageQueue_50CBD0->uNumMessages )
          pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
        pMessageQueue_50CBD0->pMessages[0].eType = UIMSG_OpenRestUI;
        pMessageQueue_50CBD0->pMessages[0].param = v27;
        pMessageQueue_50CBD0->pMessages[0].field_8 = 1;
        ++pMessageQueue_50CBD0->uNumMessages;
        return;
      }
      ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);
      HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 4);
      pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v5, 0);
      break;
    }
    case DIALOG_SHOP_SKILLS:
    {
      if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
        return;
      v0 = 0;
      v9 = (signed __int64)(p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
      pItemNum = v9 * (100 - pPlayer->GetMerchant()) / 100;
      if ( pItemNum < v9 / 3 )
        pItemNum = v9 / 3;
      pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
      all_text_height = 0;
      if ( pNumActiveItem < pNumActiveItem + pDialogueWindow->pNumPresenceButton )
      {
        do
        {
          v12 = pDialogueWindow->GetControl(pNumActiveItem)->uControlParam - 36;
          if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayer->classType][v12] && !pPlayer->pActiveSkills[v12] )
          {
            all_text_height = pFontArrus->CalcTextHeight(pSkillNames[v12], &dialog_window, 0, 0);
            v0++;
          }
          ++pNumActiveItem;
        }
        while ( pNumActiveItem < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton );
        if ( v0 )
        {
          sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[401], pItemNum);
          dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3);
          v91 = (149 - all_text_height) / v0;
          if ( (149 - all_text_height) / v0 > 32 )
            v91 = 32;
          v14 = (149 - v0 * v91 - all_text_height) / 2 - v91 / 2 + 162;
          pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
          if ( pNumActiveItem < pNumActiveItem + pDialogueWindow->pNumPresenceButton )
          {
            pItemNum = 2;
            do
            {
              pButton = pDialogueWindow->GetControl(pItemNum);
              v17 = pButton->uControlParam - 36;
              if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayer->classType][v17] || pPlayer->pActiveSkills[v17] )
              {
                pButton->uW = 0;
                pButton->uHeight = 0;
                pButton->uY = 0;
              }
              else
              {
                pButton->uY = v91 + v14;
                pTextHeight = pFontArrus->CalcTextHeight(pSkillNames[v17], &dialog_window, 0, 0);
                pButton->uHeight = pTextHeight;
                v14 = pTextHeight + pButton->uY - 1;
                pButton->uW = v14;
                pColorText = pColorYellow;
                if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum )
                  pColorText = pColorWhite;
                dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pSkillNames[v17], 3);
              }
              pNumActiveItem = pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton;
              pItemNum++;
            }
            while ( pItemNum < pNumActiveItem );
          }
          return;
        }
      }
      sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], pPlayer->pName, pClassNames[pPlayer->classType]);
      strcat(pTmpBuf, "\n \n");
      strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);
      pTextHeight = (174 - pFontArrus->CalcTextHeight(pTmpBuf, &dialog_window, 0, 0)) / 2 + 138;
      dialog_window.DrawTitleText(pFontArrus, 0, pTextHeight, pColorYellow, pTmpBuf, 3);
      return;
    }
    case DIALOG_SHOP_BYE_FOOD:
    {
      *(_QWORD *)Str = pParty->uNumFoodRations;
      //if ( (double)pParty->uNumFoodRations >= p2DEvents_minus1__20[13 * (unsigned int)ptr_507BC0->ptr_1C] )
      if ( (double)pParty->uNumFoodRations >= p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier )
      {
        ShowStatusBarString(pGlobalTXT_LocalizationStrings[140], 2);
        if ( uActiveCharacter )
          pPlayers[uActiveCharacter]->PlaySound(SPEECH_67, 0);
        pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v5, 0);
        return;
      }
      if ( pParty->uNumGold >= v7 )
      {
        Party::TakeGold(v7);
        //pParty->uNumFoodRations = (signed __int64)p2DEvents_minus1__20[13 * (unsigned int)ptr_507BC0->ptr_1C];
        pParty->uNumFoodRations = (signed __int64)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier;
        HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 3);
        pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
        return;
      }
      ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);
      HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 4);
      pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v5, 0);
      break;
    }
    case DIALOG_SHOP_ARCOMAGE_MAIN:
    {
      if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
      {
        v48 = 2;
        pShopOptions[0] = pGlobalTXT_LocalizationStrings[620];
        pShopOptions[1] = pGlobalTXT_LocalizationStrings[622];
        pOutString = 0;
        if ( pParty->HasItem(0x28Bu) )
        {
          pShopOptions[2] = pGlobalTXT_LocalizationStrings[621];
          v48 = 3;
        }
        for ( i = 0; i < v48; ++i )
          all_text_height = pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
        all_text_height = (174 - all_text_height) / v48;
        pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
        v54 = (174 - v48 * (174 - all_text_height) / v48 - all_text_height) / 2 - (174 - all_text_height) / v48 / 2 + 138;
        v37 = -pDialogueWindow->pNumPresenceButton < 0;
        if ( v37 ^ pNumActiveItem < pNumActiveItem + pDialogueWindow->pNumPresenceButton )
        {
          pItemNum = 2;
          pNumString = 0;
          do
          {
            pButton = pDialogueWindow->GetControl(pItemNum);
            pButton->uY = all_text_height + v54;
            pTextHeight = pFontArrus->CalcTextHeight((const char *)pShopOptions[pNumString], &dialog_window, 0, 0);
            pButton->uHeight = pTextHeight;
            v54 = pButton->uY + pTextHeight - 1;
            pButton->uW = v54;
            pColorText = pColorYellow;
            if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum )
              pColorText = pColorWhite;
            dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, *(const char **)&pOutString->cFirstChar, 3);
            pItemNum++;
            pNumActiveItem = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
          }
          while ( pItemNum < pNumActiveItem );
        }
      }
      break;
    }
    default:
    {
      break;
    }
  }
}


//----- (004B910F) --------------------------------------------------------
void __cdecl WeaponShopDialog()
{
  int v0; // ebx@1
  int pNumActiveItem; // eax@6
  signed int v2; // esi@8
  ItemGen *v4; // eax@11
  char *v5; // ecx@12
  unsigned __int8 v6; // dl@13
  char *v7; // edx@14
  int v9; // ST08_4@16
  int v10; // eax@16
  signed int v11; // esi@18
  int v12; // ST08_4@21
  int v13; // eax@21
  int v14; // edi@23
  char **v15; // esi@23
  int v16; // eax@24
  //int v18; // edx@25
  int v19; // edi@25
  unsigned __int8 v20; // sf@25
  GUIButton *pButton; // esi@27
  int pNewItem; // eax@27
  unsigned int v24; // ecx@27
  int v25; // edx@27
  unsigned int pColorText; // ax@27
  signed int v27; // esi@32
  int v28; // ST08_4@36
  int v29; // eax@36
  signed int v32; // esi@41
  unsigned int v33; // esi@43
  int v34; // eax@43
  unsigned int v35; // eax@44
  int v36; // eax@46
  __int32 v37; // ecx@51
  int v40; // eax@53
  char *v41; // eax@55
  unsigned int v43; // ecx@55
  const char **v44; // edx@55
  int v45; // eax@55
  int v47; // eax@59
  const char **v48; // eax@63
  unsigned int v49; // esi@65
  Texture *v50; // eax@65
  int v51; // edi@65
  int v52; // esi@70
  Texture *v53; // ST1C_4@70
  int v54; // edi@70
  signed int v55; // ecx@73
  SHORT v56; // di@82
  bool v57; // eax@82
  const char *v58; // ecx@84
  POINT *v59; // esi@89
  LONG v60; // ecx@90
  int v61; // eax@90
  int v62; // ecx@90
  ItemGen *v63; // esi@90
  int v64; // eax@95
  int all_text_height; // esi@96
  char **v66; // edi@96
  int v67; // eax@97
  int v69; // edx@98
  int v70; // edi@98
  int v71;
  const char **v72; // eax@100
  int pTextHeight; // eax@100
  unsigned int v74; // ecx@100
  int v78; // [sp-14h] [bp-10Ch]@14
  ItemGen *v79; // [sp-10h] [bp-108h]@12
  int v80; // [sp-10h] [bp-108h]@14
  void *v81; // [sp-Ch] [bp-104h]@12
  unsigned __int16 v82; // [sp-Ch] [bp-104h]@14
  int v83; // [sp-8h] [bp-100h]@11
  char *v84; // [sp-8h] [bp-100h]@14
  __int64 *v85; // [sp-4h] [bp-FCh]@11
  unsigned int v86; // [sp-4h] [bp-FCh]@14
  POINT v87; // [sp+Ch] [bp-ECh]@8
  POINT v88; // [sp+14h] [bp-E4h]@18
  POINT v89; // [sp+1Ch] [bp-DCh]@89
  POINT v90; // [sp+24h] [bp-D4h]@19
  POINT v91; // [sp+2Ch] [bp-CCh]@89
  POINT v92; // [sp+34h] [bp-C4h]@9
  POINT v93; // [sp+3Ch] [bp-BCh]@33
  POINT v94; // [sp+44h] [bp-B4h]@18
  POINT v95; // [sp+4Ch] [bp-ACh]@32
  POINT v96; // [sp+54h] [bp-A4h]@18
  POINT v97; // [sp+5Ch] [bp-9Ch]@32
  POINT a2; // [sp+64h] [bp-94h]@8
  POINT v99; // [sp+6Ch] [bp-8Ch]@32
  POINT v100; // [sp+74h] [bp-84h]@8
  GUIWindow dialog_window; // [sp+7Ch] [bp-7Ch]@1
  char *Str; // [sp+D0h] [bp-28h]@55
  __int32 v103; // [sp+D4h] [bp-24h]@25
  int pColorYellow; // [sp+D8h] [bp-20h]@1
  int pColorWhite; // [sp+DCh] [bp-1Ch]@1
  POINT v106; // [sp+E0h] [bp-18h]@8
  Player *pPlayer; // [sp+E8h] [bp-10h]@1
  int pItemNum; // [sp+ECh] [bp-Ch]@26
  const char **v109; // [sp+F0h] [bp-8h]@26
  unsigned __int8 v110; // [sp+F7h] [bp-1h]@16
  int pNumString;

  pPlayer = pPlayers[uActiveCharacter];
  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
  dialog_window.uFrameX = 483;
  dialog_window.uFrameWidth = 148;
  dialog_window.uFrameZ = 334;
  pColorWhite = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
  pColorYellow = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u);
  switch(dialog_menu_id)
  {
    case DIALOG_SHOP_MAIN:
    {
      pNumActiveItem = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
      if ( pNumActiveItem )
      {
        pShopOptions[0] = pGlobalTXT_LocalizationStrings[134];
        pShopOptions[1] = pGlobalTXT_LocalizationStrings[152];
        pShopOptions[2] = pGlobalTXT_LocalizationStrings[159];
        pShopOptions[3] = pGlobalTXT_LocalizationStrings[160];
        all_text_height = 0;
        for (int i = 0; i < 4; ++i)//while ( (signed int)v15 < (signed int)&unk_F8B1C8 );
          all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
        v103 = (174 - all_text_height) / 4;
        pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
        v19 = (174 - 4 * (174 - all_text_height) / 4 - all_text_height) / 2 - (174 - all_text_height) / 4 / 2 + 138;
        v20 = -pDialogueWindow->pNumPresenceButton < 0;
        if ( v20 ^ pNumActiveItem > pNumActiveItem + pDialogueWindow->pNumPresenceButton )
        {
          pItemNum = 2;
          pNumString = 0;
          do
          {
            pButton = pDialogueWindow->GetControl(pItemNum);
            pButton->uY = v103 + v19;
            pTextHeight = pFontArrus->CalcTextHeight((const char *)pShopOptions[pNumString], &dialog_window, 0, 0);
            pButton->uHeight = pTextHeight;
            v19 = pButton->uY + pTextHeight - 1;
            pButton->uW = v19;
            pColorText = pColorYellow;
            if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum )
              pColorText = pColorWhite;
            dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, (const char *)pShopOptions[pNumString], 3);
            ++pItemNum;
            ++pNumString;
            pNumActiveItem = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
          }
          while ( pItemNum < pNumActiveItem );
        }
      }
      break;
    }
    case DIALOG_SHOP_BUY_STANDART:
    {
      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
      v48 = 0;
      pItemNum = 0;
      v109 = 0;
      do
      {
        //  if ( pParty->field_777C[9 * (int)&v48[3 * (unsigned int)window_SpeakInHouse->ptr_1C]] )
        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][(int)v48].uItemID)
        {
          v49 = word_F8B158[(signed int)v48];
          v50 = ItemsInShopTexture[(signed int)v48];
          v49 += 30;
          v51 = 60 - ((signed int)v50->uTextureWidth >> 1);
          pRenderer->DrawTextureTransparent(v51 + pItemNum, v49, v50);
          sub_40F92A(&pRenderer->pActiveZBuffer[v51 + pItemNum + 640 * v49], ItemsInShopTexture[(signed int)v109], (int)((char *)v109 + 1));
          v48 = v109;
        }
        pItemNum += 70;
        v48 = (const char **)((char *)v48 + 1);
        v109 = v48;
      }
      while ( (signed int)v48 < 6 );
      pNumActiveItem = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
      if ( pNumActiveItem )
      {
        v55 = 0;
        v106.x = 0;
        v106.x = 0;
        do
        {
          if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v55].uItemID);//9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] )
            ++v106.x;
          ++v55;
        }
        while ( v55 < 6 );
        v56 = GetAsyncKeyState(17);
        v57 = pPlayer->CanSteal();
        Str = (char *)v57;
        if ( v56 && v57 )
        {
          v58 = pGlobalTXT_LocalizationStrings[185];
        }
        else
        {
          v58 = pGlobalTXT_LocalizationStrings[195];
          if ( dialog_menu_id != 2 )
            v58 = pGlobalTXT_LocalizationStrings[196];
        }
        DrawTextAtStatusBar(v58, 0);
        if ( v106.x )
        {
          v59 = pMouse->GetCursorPos(&v91);
          pNumActiveItem = v59->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v89)->y];
          if ( pRenderer->pActiveZBuffer[pNumActiveItem] & 0xFFFF )
          {
            v60 = (pRenderer->pActiveZBuffer[pNumActiveItem] & 0xFFFF) - 1;
            v106.x = v60;
            v61 = (int)window_SpeakInHouse->ptr_1C;
            //  v62 = 9 * (v60 + 12 * v61);
            v63 = (ItemGen *)&pParty->StandartItemsInShops[(int)v61][v60];
            if ( dialog_menu_id != 2 )
              v63 = &pParty->SpecialItemsInShops[(int)v61][v60];//v63 = (ItemGen *)&pParty->field_C59C[v62 + 724];
            if ( !v56 || !Str )
            {
              v64 = pPlayer->_490EEE(v63, 1, v61, 2);
              v7 = BuilDialogueString((char *)pMerchantsBuyPhrases[v64], uActiveCharacter - 1, v63, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
              pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0);
              dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3);
            }
            else
            {
            v7 = BuilDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, v63, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
            pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0);
            dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3);
            }
          }
        }
        else
        {
          dialog_window.DrawCurrentTime( pParty->field_3C.field_50[(unsigned int)window_SpeakInHouse->ptr_1C]  - pParty->uTimePlayed);
          pNumActiveItem = 0; //added
        }
      }
      break;
    }
    case DIALOG_SHOP_SELL:
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[199], 0);
      if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
        return;
      if((v11 = pMouse->GetCursorPos(&v96)->x - 14, v106.x = (v11 >> 5) + 14 * ((pMouse->GetCursorPos(&v88)->y - 17) >> 5),
        pMouse->GetCursorPos(&v94)->x <= 13) || pMouse->GetCursorPos(&v90)->x >= 462 
        || (pNumActiveItem = pPlayer->GetItemIDAtInventoryIndex((int *)&v106.x), !pNumActiveItem) )
        return;
      v79 = (ItemGen *)&pPlayer->pInventoryItems[pNumActiveItem - 1];
      v13 = pPlayer->_490EEE(v79, 1, (int)window_SpeakInHouse->ptr_1C, 3);
      v7 = BuilDialogueString((char *)pMerchantsSellPhrases[v13], uActiveCharacter - 1, v79, (char *)window_SpeakInHouse->ptr_1C, 3, 0);
      pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0);
      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3);
      break;
    }
    case DIALOG_SHOP_IDENTIFY:
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[197], 0);
      if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
        return;
      if((v2 = pMouse->GetCursorPos(&a2)->x - 14, v106.x = (v2 >> 5) + 14 * ((pMouse->GetCursorPos(&v87)->y - 17) >> 5),
        pMouse->GetCursorPos(&v100)->x <= 13) || pMouse->GetCursorPos(&v92)->x >= 462 
        || (pNumActiveItem = pPlayer->GetItemIDAtInventoryIndex((int *)&v106.x), !pNumActiveItem) )
        return;
      v4 = (ItemGen *)&pPlayer->pInventoryItems[pNumActiveItem - 1];
      if (!v4->Identified())
      {
        v10 = pPlayer->_490EEE(v4, 1, (int)window_SpeakInHouse->ptr_1C, 4);
        v7 = BuilDialogueString((char *)pMerchantsIdentifyPhrases[v10], uActiveCharacter - 1, v4, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
        pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0);
        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3);
      }
      else
      {
        v7 = BuilDialogueString("%24", uActiveCharacter - 1, v4, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
        pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0);
        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3);
      }
      break;
    }
    case DIALOG_SHOP_REPAIR:
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[198], 0);
      if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win())
            return;
      if( (v2 = pMouse->GetCursorPos(&a2)->x - 14, v106.x = (v2 >> 5) + 14 * ((pMouse->GetCursorPos(&v87)->y - 17) >> 5),
          pMouse->GetCursorPos(&v100)->x <= 13) || pMouse->GetCursorPos(&v92)->x >= 462
            || (pNumActiveItem = pPlayer->GetItemIDAtInventoryIndex((int *)&v106.x), !pNumActiveItem)
            || (pNumActiveItem = 9 * pNumActiveItem, !(pPlayer->field_1F5[4 * pNumActiveItem + 15] & 2)) )
            return;
      v4 = (ItemGen *)&pPlayer->pInventoryItems[pNumActiveItem - 1];
      v10 = pPlayer->_490EEE(v4, 2, (int)window_SpeakInHouse->ptr_1C, 5);
      v7 = BuilDialogueString((char *)pMerchantsRepairPhrases[v10], uActiveCharacter - 1, v4, (char *)window_SpeakInHouse->ptr_1C, 5, 0);
      pTextHeight = (174 - pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0)) / 2 + 138;
      dialog_window.DrawTitleText(pFontArrus, 0, pTextHeight, pColorWhite, v7, 3);
      return;
    }
    break;
    case DIALOG_SHOP_DISPLAY_EQUIPMENT:
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      pShopOptions[0] = pGlobalTXT_LocalizationStrings[200];//sell
      pShopOptions[1] = pGlobalTXT_LocalizationStrings[113];//identify
      pShopOptions[2] = 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;
      pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
      v70 = (3 * (58 - (signed int)v103) - all_text_height) / 2 - ((174 - all_text_height) / 3) / 2 + 138;
      v20 = -pDialogueWindow->pNumPresenceButton < 0;
      if ( v20 ^ pNumActiveItem > pNumActiveItem + pDialogueWindow->pNumPresenceButton )
      {
        pItemNum = 2;
        pNumString = 0;
        do
        {
          pButton = pDialogueWindow->GetControl(pItemNum);
          pButton->uY = v103 + v70;
          pTextHeight = pFontArrus->CalcTextHeight((const char *)pShopOptions[pNumString], &dialog_window, 0, 0);
          pButton->uHeight = pTextHeight;
          v70 = pButton->uY + pTextHeight - 1;
          pButton->uW = v70;
          pColorText = pColorYellow;
          if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum )
            pColorText = pColorWhite;
          dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, (const char *)pShopOptions[pNumString], 3);
          ++pItemNum;
          ++pNumString;
          pNumActiveItem = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
        }
        while ( pItemNum < pNumActiveItem );
      }
      break;
    }
    case DIALOG_SHOP_BUY_SPECIAL:
    {
      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
      v109 = 0;
      pItemNum = 0;
      do
      {
        //   if ( pParty->field_C59C[9 * (int)&v109[3 * (unsigned int)window_SpeakInHouse->ptr_1C] + 724] )
        if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][(signed int)v109].uItemID)
        {
          v52 = word_F8B158[(signed int)v109] + 30;
          v53 = ItemsInShopTexture[(signed int)v109];
          v54 = 60 - ((signed int)v53->uTextureWidth >> 1);
          pRenderer->DrawTextureTransparent(v54 + pItemNum, word_F8B158[(signed int)v109] + 30, v53);
          sub_40F92A(&pRenderer->pActiveZBuffer[v54 + pItemNum + 640 * v52], ItemsInShopTexture[(signed int)v109], (int)((char *)v109 + 1));
        }
        v109 = (const char **)((char *)v109 + 1);
        pItemNum += 70;
      }
      while ( (signed int)v109 < 6 );
      pNumActiveItem = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
      if ( pNumActiveItem )
      {
        v55 = 0;
        v106.x = 0;
        do
        {
          // if ( pParty->field_C59C[9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] )
          if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v55].uItemID)
            ++v106.x;
          ++v55;
        }
        while ( v55 < 6 );
        v56 = GetAsyncKeyState(17);
        v57 = pPlayer->CanSteal();
        Str = (char *)v57;
        if ( v56 && v57 )
        {
          v58 = pGlobalTXT_LocalizationStrings[185];
        }
        else
        {
          v58 = pGlobalTXT_LocalizationStrings[195];
          if ( dialog_menu_id != 2 )
            v58 = pGlobalTXT_LocalizationStrings[196];
        }
        DrawTextAtStatusBar(v58, 0);
        if ( v106.x )
        {
          v59 = pMouse->GetCursorPos(&v91);
          pNumActiveItem = v59->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v89)->y];
          if ( pRenderer->pActiveZBuffer[pNumActiveItem] & 0xFFFF )
          {
            v60 = (pRenderer->pActiveZBuffer[pNumActiveItem] & 0xFFFF) - 1;
            v106.x = v60;
            v61 = (int)window_SpeakInHouse->ptr_1C;
            //  v62 = 9 * (v60 + 12 * v61);
            v63 = (ItemGen *)&pParty->StandartItemsInShops[(int)v61][v60];
            if ( dialog_menu_id != 2 )
              v63 = &pParty->SpecialItemsInShops[(int)v61][v60];//v63 = (ItemGen *)&pParty->field_C59C[v62 + 724];
            if ( !v56 || !Str )
            {
              v64 = pPlayer->_490EEE(v63, 1, v61, 2);
              v7 = BuilDialogueString((char *)pMerchantsBuyPhrases[v64], uActiveCharacter - 1, v63, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
              pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0);
              dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3);
            }
            else
            {
              v7 = BuilDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, v63, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
              pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0);
              dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3);
            }
          }
        }
        else
        {
          dialog_window.DrawCurrentTime( pParty->field_3C.field_50[(unsigned int)window_SpeakInHouse->ptr_1C]  - pParty->uTimePlayed);
          pNumActiveItem = 0; //added
        }
      }
      break;
    }
    case DIALOG_SHOP_SKILLS:
    {
      if (!sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win())
        return;
      v0 = 0;
      all_text_height = 0;
      //v32 = (signed __int64)(*(float *)&p2DEvents_minus1__24[13 * (signed int)v31] * 500.0);
      v32 = (signed __int64)(p2DEvents[(signed int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
      pItemNum = v32 * (100 - pPlayer->GetMerchant()) / 100;
      if ( pItemNum < v32 / 3 )
        pItemNum = v32 / 3;
      pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
      if ( pNumActiveItem >= pNumActiveItem + pDialogueWindow->pNumPresenceButton )
      {
        sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], pPlayer->pName, pClassNames[pPlayer->classType]);
        strcat(pTmpBuf, "\n \n");
        strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);
        pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf, &dialog_window, 0, 0);
        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorYellow, pTmpBuf, 3);
        return;
      }
      do
      {
        v35 = pDialogueWindow->GetControl(pNumActiveItem)->uControlParam - 36;
        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayer->classType][v35] && !pPlayer->pActiveSkills[v35] )
        {
          all_text_height += pFontArrus->CalcTextHeight(pSkillNames[v35], &dialog_window, 0, 0);
          v0++;
        }
        ++pNumActiveItem;
      }
      while ( pNumActiveItem < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem );
      if ( !v0 )
      {
        sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], pPlayer->pName, pClassNames[pPlayer->classType]);
        strcat(pTmpBuf, "\n \n");
        strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);
        pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf, &dialog_window, 0, 0);
        dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorYellow, pTmpBuf, 3);
        return;
      }
      sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[401], pItemNum);
      dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3);
      v103 = (149 - all_text_height) / v0;
      if ( (149 - all_text_height) / v0 > 32 )
        v103 = 32;
      pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
      v37 = (149 - v0 * v103 - all_text_height) / 2 - v103 / 2 + 162;
      if ( pNumActiveItem < pNumActiveItem + pDialogueWindow->pNumPresenceButton )
      {
        pItemNum = 2;
        do
        {
          pButton = pDialogueWindow->GetControl(pItemNum);
          v40 = pButton->uControlParam - 36;
          if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayer->classType][v40] || pPlayer->pActiveSkills[v40] )
          {
            pButton->uW = 0;
            pButton->uHeight = 0;
            pButton->uY = 0;
          }
          else
          {
            pButton->uY = v103 + v37;
            pTextHeight = pFontArrus->CalcTextHeight(pSkillNames[v40], &dialog_window, 0, 0);
            pButton->uHeight = pTextHeight;
            v37 = pButton->uY + pTextHeight - 1;
            pButton->uW = v37;
            pColorText = pColorYellow;
            if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum )
              pColorText = pColorWhite;
            dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pSkillNames[v40], 3);
          }
          pNumActiveItem = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
          pItemNum++;
        }
        while ( pItemNum < pNumActiveItem );
      }
      break;
    }
    default:
    {
      if( dialog_menu_id > 5 )
        pNumActiveItem = dialog_menu_id - 96;
      else
        pNumActiveItem = dialog_menu_id - 4;
      break;
    }
  }
}



//----- (004B9CC6) --------------------------------------------------------
void __cdecl AlchemistDialog()
{
  int v0;
  int pNumActiveItem; // eax@7
  signed int v5; // esi@9
  unsigned int v6; // esi@11
  int v7; // eax@11
  unsigned int v8; // eax@12
  int v9; // eax@14
  int v10; // ecx@19
  int v13; // eax@21
  char *v14; // eax@23
  int v15; // eax@23
  unsigned int v16; // ecx@23
  int v17; // edx@23
  int v18; // eax@23
  int v20; // eax@27
  char *v21; // edx@29
  int v22; // esi@30
  char **v23; // edi@30
  int v24; // eax@31
  int v26; // edx@32
  int v27; // edi@32
  unsigned __int8 v28; // sf@32
  const char **v30; // eax@34
  int v31; // eax@34
  unsigned int v32; // ecx@34
  int v34; // eax@34
  signed int v36; // esi@39
  ItemGen *v37; // eax@42
  char *v38; // ecx@43
  unsigned __int8 v39; // dl@44
  int v40; // eax@46
  int v41; // ST08_4@47
  int v42; // eax@47
  signed int v43; // esi@49
  int v44; // ST08_4@52
  int v45; // eax@52
  Texture *v46; // ecx@55
  unsigned int v47; // edi@55
  unsigned int v48; // esi@57
  int v49; // edx@61
  Texture *v50; // ecx@67
  unsigned int v51; // edi@67
  unsigned int v52; // esi@69
  int v53; // edx@73
  Texture *v54; // ecx@79
  unsigned int v55; // edi@79
  unsigned int v56; // esi@81
  int v57; // edx@85
  Texture *v58; // ecx@91
  unsigned int v59; // edi@91
  unsigned int v60; // esi@93
  int v61; // edx@97
  signed int v62; // ecx@102
  SHORT v63; // di@110
  bool v64; // eax@110
  const char *v65; // ecx@112
  POINT *v66; // esi@117
  int v67; // ecx@118
  int v68; // eax@118
  int v69; // ecx@118
  ItemGen *v70; // esi@118
  int v71; // eax@123
  int all_text_height; // edi@125
  char **v73; // esi@125
  int v74; // eax@126
  int pItemNum;
  int v76; // edx@127
  int v77; // edi@127
  GUIButton *pButton; // esi@129
  const char **v79; // eax@129
  int pTextHeight; // eax@129
  unsigned int v81; // ecx@129
  unsigned int pColorText; // ax@129
  int v85; // [sp-14h] [bp-ECh]@29
  int v86; // [sp-10h] [bp-E8h]@29
  ItemGen *v87; // [sp-10h] [bp-E8h]@43
  unsigned __int16 v88; // [sp-Ch] [bp-E4h]@29
  void *v89; // [sp-Ch] [bp-E4h]@43
  char *v90; // [sp-8h] [bp-E0h]@29
  int v91; // [sp-8h] [bp-E0h]@42
  unsigned int v92; // [sp-4h] [bp-DCh]@29
  __int64 *v93; // [sp-4h] [bp-DCh]@42
  POINT v94; // [sp+Ch] [bp-CCh]@39
  POINT v95; // [sp+14h] [bp-C4h]@49
  POINT v96; // [sp+1Ch] [bp-BCh]@117
  POINT v97; // [sp+24h] [bp-B4h]@40
  POINT v98; // [sp+2Ch] [bp-ACh]@117
  POINT v99; // [sp+34h] [bp-A4h]@49
  POINT v100; // [sp+3Ch] [bp-9Ch]@50
  POINT v101; // [sp+44h] [bp-94h]@39
  POINT v102; // [sp+4Ch] [bp-8Ch]@49
  POINT a2; // [sp+54h] [bp-84h]@39
  GUIWindow dialog_window; // [sp+5Ch] [bp-7Ch]@1
  int v105; // [sp+B0h] [bp-28h]@19
  int pColorYellow; // [sp+B4h] [bp-24h]@1
  int Str; // [sp+B8h] [bp-20h]@23
  int pColorWhite; // [sp+BCh] [bp-1Ch]@1
  __int32 v109; // [sp+C0h] [bp-18h]@39
  Player *pPlayer; // [sp+C4h] [bp-14h]@1
  int pNumString; // [sp+C8h] [bp-10h]@9
  unsigned int v112; // [sp+CCh] [bp-Ch]@9
  unsigned __int8 v113; // [sp+D3h] [bp-5h]@47
  int v114; // [sp+D4h] [bp-4h]@11

  pPlayer = pPlayers[uActiveCharacter];
  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
  dialog_window.uFrameX = 483;
  dialog_window.uFrameWidth = 148;
  dialog_window.uFrameZ = 334;
  pColorWhite = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
  pColorYellow = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u);
  switch(dialog_menu_id)
  {
    case DIALOG_SHOP_MAIN:
    {
      if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
      {
        pShopOptions[0] = pGlobalTXT_LocalizationStrings[134];
        pShopOptions[1] = pGlobalTXT_LocalizationStrings[152];
        pShopOptions[2] = pGlobalTXT_LocalizationStrings[159];
        pShopOptions[3] = pGlobalTXT_LocalizationStrings[160];
        all_text_height = 0;
        for (int i = 0; i < 4; ++i)//while ( (signed int)v15 < (signed int)&unk_F8B1C8 );
          all_text_height += pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
        Str = (174 - all_text_height) / 4;
        pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
        v76 = pNumActiveItem + pDialogueWindow->pNumPresenceButton;
        v77 = (174 - 4 * (174 - all_text_height) / 4 - all_text_height) / 2 - (174 - all_text_height) / 4 / 2 + 138;
        v28 = -pDialogueWindow->pNumPresenceButton < 0;
        if ( v28 ^ pNumActiveItem > v76 )
        {
          pItemNum = 2;
          pNumString = 0;
          do
          {
            pButton = pDialogueWindow->GetControl(pItemNum);
            pButton->uY = Str + v77;
            pTextHeight = pFontArrus->CalcTextHeight((const char *)pShopOptions[pNumString], &dialog_window, 0, 0);
            pButton->uHeight = pTextHeight;
            v77 = pButton->uY + pTextHeight - 1;
            pButton->uW = v77;
            pColorText = pColorYellow;
            if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum )
              pColorText = pColorWhite;
            dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, (const char *)pShopOptions[pNumString], 3);
            ++pItemNum;
            ++pNumString;
            pNumActiveItem = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
          }
          while ( pItemNum < pNumActiveItem );
        }
      }
      return;
    }
    case DIALOG_SHOP_BUY_STANDART:
    {
      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
      v114 = 0;
      do
      {
        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v114].uItemID);
        {
          v46 = ItemsInShopTexture[v114];
          v47 = 152 - v46->uTextureHeight;
          if ( (signed int)v47 < 1 )
            v47 = 0;
          v48 = 75 * v114 - v46->uTextureWidth / 2 + 40;
          if ( v114 )
          {
            if ( v114 == 5 )
            {
              v49 = ItemsInShopTexture[5]->uTextureWidth;
              if ( (signed int)v48 > 457 - v49 )
                v48 = 457 - v49;
            }
          }
          else if ( (signed int)v48 < 18 )
            v48 = 18;
          pRenderer->DrawTextureTransparent(v48, v47, v46);
          sub_40F92A(&pRenderer->pActiveZBuffer[v48 + 640 * v47], ItemsInShopTexture[v114], v114 + 1);
        }
        ++v114;
      }
      while ( v114 < 6 );
      v114 = 0;
      do
      {
        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v114+1].uItemID);
        {
          v50 = ItemsInShopTexture[v114 + 6];
          v51 = 308 - v50->uTextureHeight;
          if ( (signed int)v51 < 1 )
            v51 = 0;
          v52 = 75 * v114 - v50->uTextureWidth / 2 + 40;
          if ( v114 )
          {
            if ( v114 == 5 )
            {
              v53 = ItemsInShopTexture[11]->uTextureWidth;
              if ( (signed int)v52 > 457 - v53 )
                v52 = 457 - v53;
            }
          }
          else
          {
            if ( (signed int)v52 < 18 )
              v52 = 18;
          }
          pRenderer->DrawTextureTransparent(v52, v51, v50);
          sub_40F92A(&pRenderer->pActiveZBuffer[v52 + 640 * v51], ItemsInShopTexture[v114 + 6], v114 + 7);
        }
        ++v114;
      }
      while ( v114 < 6 );
      if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
      {
        v62 = 0;
        v109 = 0;
        do
        {
          if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v62].uItemID);
            ++v109;
          ++v62;
        }
        while ( v62 < 12 );
        v63 = GetAsyncKeyState(17);
        v64 = pPlayer->CanSteal();
        Str = v64;
        if ( v63 && v64 )
        {
          v65 = pGlobalTXT_LocalizationStrings[185];
        }
        else if ( dialog_menu_id == 2 )
        {
          v65 = pGlobalTXT_LocalizationStrings[195];
        }
        else
        {
          v65 = pGlobalTXT_LocalizationStrings[196];
        }
        DrawTextAtStatusBar(v65, 0);
        if ( !v109 )
        {
          dialog_window.DrawCurrentTime( pParty->field_3C.field_50[ (unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed);
          return;
        }
        v66 = pMouse->GetCursorPos(&v98);
        pNumActiveItem = v66->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v96)->y];
        if ( pRenderer->pActiveZBuffer[pNumActiveItem] & 0xFFFF )
        {
          v67 = (pRenderer->pActiveZBuffer[pNumActiveItem] & 0xFFFF) - 1;
          v70 = (ItemGen *)&pParty->StandartItemsInShops[(int)window_SpeakInHouse->ptr_1C][v67];
          if ( dialog_menu_id != 2 )
            v70 = &pParty->SpecialItemsInShops[(int)window_SpeakInHouse->ptr_1C][v67];//v70 = (ItemGen *)&pParty->field_C59C[v69 + 724];
          if ( !v63 || !Str )
          {
            v71 = pPlayer->_490EEE(v70, 4, (int)window_SpeakInHouse->ptr_1C, 2);
            v38 = (char *)pMerchantsBuyPhrases[v71];
          }
          else
          {
            v38 = pGlobalTXT_LocalizationStrings[181];
          }
          v21 = BuilDialogueString(v38, uActiveCharacter - 1, v70, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
          v40 = pFontArrus->CalcTextHeight(v21, &dialog_window, 0, 0);
          dialog_window.DrawTitleText(pFontArrus, 0, (174 - v40) / 2 + 138, pColorWhite, v21, 3);
          return ;
        }
      }
      return;
    }
    case DIALOG_SHOP_SELL:
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[199], 0);
      if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
        return;
      if ((v43 = pMouse->GetCursorPos(&v99)->x - 14, v109 = (v43 >> 5) + 14 * ((pMouse->GetCursorPos(&v95)->y - 17) >> 5),
           pMouse->GetCursorPos(&v102)->x <= 13) || pMouse->GetCursorPos(&v100)->x >= 462 
          || (pNumActiveItem = pPlayer->GetItemIDAtInventoryIndex((int *)&v109), !pNumActiveItem) )
          return;
      v87 = (ItemGen *)&pPlayer->pInventoryItems[pNumActiveItem - 1];
      v45 = pPlayer->_490EEE(v87, 4, (int)window_SpeakInHouse->ptr_1C, 3);
      v21 = BuilDialogueString((char *)pMerchantsSellPhrases[v45], uActiveCharacter - 1, v87, (char *)window_SpeakInHouse->ptr_1C, 3, 0);
      pTextHeight = pFontArrus->CalcTextHeight(v21, &dialog_window, 0, 0);
      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v21, 3);
      return; 
    }
    case DIALOG_SHOP_IDENTIFY:
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[197], 0);
      if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
        return;
      if ((v36 = pMouse->GetCursorPos(&a2)->x - 14, v109 = (v36 >> 5) + 14 * ((pMouse->GetCursorPos(&v94)->y - 17) >> 5),
          pMouse->GetCursorPos(&v101)->x <= 13) || pMouse->GetCursorPos(&v97)->x >= 462
         || (pNumActiveItem = pPlayer->GetItemIDAtInventoryIndex((int *)&v109), !pNumActiveItem) )
        return;
      v37 = (ItemGen *)&pPlayer->pInventoryItems[pNumActiveItem - 1];
      if (!v37->Identified())
      {
        v42 = pPlayer->_490EEE(v37, 4, (int)window_SpeakInHouse->ptr_1C, 4);
        v38 = (char *)pMerchantsIdentifyPhrases[v42];
      }
      else
      {
        v38 = "%24";
      }
      v21 = BuilDialogueString(v38, uActiveCharacter - 1, v37, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
      v40 = pFontArrus->CalcTextHeight(v21, &dialog_window, 0, 0);
      dialog_window.DrawTitleText(pFontArrus, 0, (174 - v40) / 2 + 138, pColorWhite, v21, 3);
      return;
    }
    case DIALOG_SHOP_DISPLAY_EQUIPMENT:
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      pShopOptions[0] = pGlobalTXT_LocalizationStrings[200];
      pShopOptions[1] = 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);
      Str = (174 - all_text_height) / 2;
      pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
      v26 = pNumActiveItem + pDialogueWindow->pNumPresenceButton;
      v27 = (2 * (87 - (174 - all_text_height) / 2) - all_text_height) / 2 - (174 - all_text_height) / 2 / 2 + 138;
      v28 = -pDialogueWindow->pNumPresenceButton < 0;
      if ( v28 ^ pNumActiveItem > v26 )
      {
        pItemNum = 2;
        pNumString = 0;
        do
        {
          pButton = pDialogueWindow->GetControl(pItemNum);
          pButton->uY = Str + v27;
          pTextHeight = pFontArrus->CalcTextHeight((const char *)pShopOptions[pNumString], &dialog_window, 0, 0);
          pButton->uHeight = pTextHeight;
          v27 = pButton->uY + pTextHeight - 1;
          pButton->uW = v27;
          pColorText = pColorYellow;
          if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum )
            pColorText = pColorWhite;
          dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, (const char *)pShopOptions[pNumString], 3);
          ++pItemNum;
          ++pNumString;
          pNumActiveItem = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
        }
        while ( pItemNum < pNumActiveItem );
      }
      return;
    }
    case DIALOG_SHOP_BUY_SPECIAL:
    {
      pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
      v114 = 0;
      do
      {
        if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v114].uItemID)
        {
          v54 = ItemsInShopTexture[v114];
          v55 = 152 - v54->uTextureHeight;
          if ( (signed int)v55 < 1 )
            v55 = 0;
          v56 = 75 * v114 - v54->uTextureWidth / 2 + 40;
          if ( v114 )
          {
            if ( v114 == 5 )
            {
              v57 = ItemsInShopTexture[5]->uTextureWidth;
              if ( (signed int)v56 > 457 - v57 )
                v56 = 457 - v57;
            }
          }
          else
          {
            if ( (signed int)v56 < 18 )
              v56 = 18;
          }
          pRenderer->DrawTextureTransparent(v56, v55, v54);
          sub_40F92A(&pRenderer->pActiveZBuffer[v56 + 640 * v55], ItemsInShopTexture[v114], v114 + 1);
        }
        ++v114;
      }
      while ( v114 < 6 );
      v114 = 0;
      do
      {
        if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][(signed int)v114].uItemID) //not itemid
        {
          v58 = ItemsInShopTexture[v114 + 6];
          v59 = 308 - v58->uTextureHeight;
          if ( (signed int)v59 < 1 )
            v59 = 0;
          v60 = 75 * v114 - v58->uTextureWidth / 2 + 40;
          if ( v114 )
          {
            if ( v114 == 5 )
            {
              v61 = ItemsInShopTexture[11]->uTextureWidth;
              if ( (signed int)v60 > 457 - v61 )
                v60 = 457 - v61;
            }
          }
          else
          {
            if ( (signed int)v60 < 18 )
              v60 = 18;
          }
          pRenderer->DrawTextureTransparent(v60, v59, v58);
          sub_40F92A(&pRenderer->pActiveZBuffer[v60 + 640 * v59], ItemsInShopTexture[v114 + 6], v114 + 7);
        }
        ++v114;
      }
      while ( v114 < 6 );
      if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
      {
        v62 = 0;
        v109 = 0;
        do
        {
          if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v62].uItemID)
            ++v109;
          ++v62;
        }
        while ( v62 < 12 );
        v63 = GetAsyncKeyState(17);
        v64 = pPlayer->CanSteal();
        Str = v64;
        if ( v63 && v64 )
        {
          v65 = pGlobalTXT_LocalizationStrings[185];
        }
        else
        {
          v65 = pGlobalTXT_LocalizationStrings[195];
          if ( dialog_menu_id != 2 )
            v65 = pGlobalTXT_LocalizationStrings[196];
        }
        DrawTextAtStatusBar(v65, 0);
        if ( !v109 )
        {
          dialog_window.DrawCurrentTime( pParty->field_3C.field_50[ (unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed);
          return;
        }
        v66 = pMouse->GetCursorPos(&v98);
        pNumActiveItem = v66->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v96)->y];
        if ( pRenderer->pActiveZBuffer[pNumActiveItem] & 0xFFFF )
        {
          v67 = (pRenderer->pActiveZBuffer[pNumActiveItem] & 0xFFFF) - 1;
          v109 = v67;
          v68 = (int)window_SpeakInHouse->ptr_1C;
          //  v69 = 9 * (v67 + 12 * v68);
          v70 = (ItemGen *)&pParty->StandartItemsInShops[v68][v67];
          if ( dialog_menu_id != 2 )
            v70 = &pParty->SpecialItemsInShops[(int)v68][v67];//v70 = (ItemGen *)&pParty->field_C59C[v69 + 724];
          if ( !v63 || !Str )
          {
            v71 = pPlayer->_490EEE(v70, 4, v68, 2);
            v38 = (char *)pMerchantsBuyPhrases[v71];
          }
          else
          {
            v38 = pGlobalTXT_LocalizationStrings[181];
          }
          v21 = BuilDialogueString(v38, uActiveCharacter - 1, v70, (char *)window_SpeakInHouse->ptr_1C, 2, 0);
          v40 = pFontArrus->CalcTextHeight(v21, &dialog_window, 0, 0);
          dialog_window.DrawTitleText(pFontArrus, 0, (174 - v40) / 2 + 138, pColorWhite, v21, 3);
          return;
        }
      }
      return;
    }
    case DIALOG_SHOP_SKILLS:
    {
      if (!sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win())
        return;
      all_text_height = 0;
      v5 = (signed __int64)(p2DEvents[(signed int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
      pItemNum = v5 * (100 - pPlayer->GetMerchant()) / 100;
      if ( pItemNum < v5 / 3 )
        pItemNum = v5 / 3;
      pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
      v114 = 0;
      if ( pNumActiveItem >= pNumActiveItem + pDialogueWindow->pNumPresenceButton )
      {
        sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], pPlayer->pName, pClassNames[pPlayer->classType]);
        strcat(pTmpBuf, "\n \n");
        strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);
        v40 = pFontArrus->CalcTextHeight(pTmpBuf, &dialog_window, 0, 0);
        dialog_window.DrawTitleText(pFontArrus, 0, (174 - v40) / 2 + 138, pColorYellow, pTmpBuf, 3);
        return;
      }
      do
      {
        v8 = pDialogueWindow->GetControl(pNumActiveItem)->uControlParam - 36;
        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayer->classType][v8] && !pPlayer->pActiveSkills[v8] )
        {
          all_text_height = pFontArrus->CalcTextHeight(pSkillNames[v8], &dialog_window, 0, 0);
          ++v114;
        }
        ++pNumActiveItem;
      }
      while ( pNumActiveItem < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem );
      if ( !v114 )
      {
        sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], pPlayer->pName, pClassNames[pPlayer->classType]);
        strcat(pTmpBuf, "\n \n");
        strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);
        v40 = pFontArrus->CalcTextHeight(pTmpBuf, &dialog_window, 0, 0);
        dialog_window.DrawTitleText(pFontArrus, 0, (174 - v40) / 2 + 138, pColorYellow, pTmpBuf, 3);
        return;
      }
      if ( v114 )
      {
        sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[401], pItemNum);
        dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3);
        v18 = (149 - all_text_height) / v114;
        if ( (149 - all_text_height) / v114 > 32 )
          v18 = 32;
        pNumActiveItem = pDialogueWindow->pStartingPosActiveItem;
        v105 = (149 - v114 * v18 - all_text_height) / 2 - v18 / 2 + 162;
        if ( pNumActiveItem < pNumActiveItem + pDialogueWindow->pNumPresenceButton )
        {
          pItemNum = 2;
          do
          {
            pButton = pDialogueWindow->GetControl(pItemNum);
            v13 = pButton->uControlParam - 36;
            if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayer->classType][v13] || pPlayer->pActiveSkills[v13] )
            {
              pButton->uW = 0;
              pButton->uHeight = 0;
              pButton->uY = 0;
            }
            else
            {
              pButton->uY = v18 + v105;
              pTextHeight = pFontArrus->CalcTextHeight(pSkillNames[v13], &dialog_window, 0, 0);
              pButton->uHeight = pTextHeight;
              v105 = pButton->uY + pTextHeight - 1;
              pButton->uW = v105;
              pColorText = pColorYellow;
              if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum )
                pColorText = pColorWhite;
              dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pSkillNames[v13], 3);
            }
            pNumActiveItem = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
            pItemNum++;
          }
          while ( pItemNum < pNumActiveItem );
        }
        return;
      }
    }
    default:
    {
      return;// (POINT *)dialog_menu_id - 96;
    }
  }
}

//----- (004BA928) --------------------------------------------------------
void __cdecl ArmorShopDialog()
    {
    Player *v0; // ebx@1
    signed int v1; // esi@8
    unsigned int v2; // eax@10
    ItemGen *v3; // eax@11
    unsigned __int8 v4; // dl@12
    char *v5; // ecx@12
    char *v6; // eax@13
    int v7; // ST08_4@15
    int v8; // eax@15
    signed int v9; // esi@17
    unsigned int v10; // eax@19
    char *v11; // edi@19
    int v12; // ST08_4@20
    int v13; // eax@20
    unsigned __int8 v14; // dl@20
    char *v15; // ecx@20
    char **v16; // edi@22
    int all_text_height; // ebx@22
    char **v18; // esi@22
    int v19; // eax@23
    GUIWindow *v20; // ecx@24
    int v21; // eax@24
    int v22; // edx@24
    int v23; // ebx@24
    unsigned __int8 v24; // sf@24
    GUIButton *control_button; // eax@26
    GUIButton *v26; // esi@26
    int v27; // eax@26
    unsigned int v28; // ecx@26
    int v29; // edx@26

    signed int v31; // esi@31
    unsigned int v32; // eax@33
    int v33; // eax@34
    int v34; // ST08_4@35
    int v35; // eax@35
    char *v36; // edx@36
    GUIWindow *v37; // edi@42
    signed int v38; // esi@42
    unsigned int v39; // esi@44
    int v40; // eax@44
    unsigned int v41; // eax@45
    int v42; // eax@47
    int v43; // ecx@52
    GUIButton *v44; // eax@54
    GUIButton *v45; // esi@54
    int v46; // eax@54
    char *v47; // eax@56
    int v48; // eax@56
    unsigned int v49; // ecx@56
    int v50; // edx@56
    int v51; // eax@56
    unsigned __int16 v52; // ax@56
    int v53; // eax@60
    int textureH; // eax@60
    signed int textureW; // ebx@65
    Texture *v56; // eax@67
    unsigned int v57; // edi@68
    Texture *v58; // ST1C_4@68
    int v59; // eax@68
    int v60; // edi@69
    signed int v61; // ebx@73
    Texture *v62; // eax@75
    int v63; // edi@76
    Texture *v64; // ST1C_4@76
    unsigned int v65; // ST18_4@76
    int v66; // eax@76
    int v67; // edi@77
    signed int v68; // ecx@81
    SHORT v69; // bx@89
    bool v70; // eax@89
    const char *v71; // ecx@91
    void *v72; // eax@95
    POINT *v73; // esi@97
    int v74; // ecx@97
    int v75; // eax@98
    int v76; // ecx@98
    ItemGen *selected_item; // ecx@99
    unsigned __int8 v78; // bl@104
    char **v79; // edi@105
    int v80; // ebx@105
    char **v81; // esi@105
    int v82; // eax@106
    GUIWindow *v83; // ecx@107
    int v84; // eax@107
    int v85; // edx@107
    int v86; // ebx@107
    GUIButton *v87; // eax@109
    GUIButton *v88; // esi@109
    int v89; // eax@109
    unsigned int v90; // ecx@109
    int v91; // edx@109
    unsigned __int16 v92; // ax@109
    signed int v93; // edx@114
    POINT *v94; // edi@120
    __int32 v95; // ecx@120
    void *v96; // ST14_4@122
    unsigned __int8 v97; // bl@122
    ItemGen *v98; // ST10_4@122
    int v99; // eax@122
    char *v100; // eax@122
    const char *v101; // ST18_4@122
    unsigned __int16 v102; // ST14_2@122
    int v103; // eax@122
    signed int v104; // edi@123
    Texture *v105; // eax@125
    int v106; // ebx@126
    Texture *v107; // ST1C_4@126
    unsigned int v108; // ST18_4@126
    int v109; // eax@126
    int v110; // ebx@127
    GUIWindow *v111; // [sp-18h] [bp-11Ch]@36
    unsigned int v112; // [sp-14h] [bp-118h]@13
    int v113; // [sp-14h] [bp-118h]@36
    ItemGen *v114; // [sp-10h] [bp-114h]@12
    unsigned int v115; // [sp-10h] [bp-114h]@13
    ItemGen *v116; // [sp-10h] [bp-114h]@20
    int v117; // [sp-10h] [bp-114h]@36
    void *v118; // [sp-Ch] [bp-110h]@12
    unsigned __int16 v119; // [sp-Ch] [bp-110h]@13
    void *v120; // [sp-Ch] [bp-110h]@20
    char *v121; // [sp-8h] [bp-10Ch]@13
    int v122; // [sp-8h] [bp-10Ch]@20
    unsigned int v123; // [sp-4h] [bp-108h]@13
    __int64 *v124; // [sp-4h] [bp-108h]@20
    int v125; // [sp-4h] [bp-108h]@68
    int v126; // [sp-4h] [bp-108h]@76
    int v127; // [sp-4h] [bp-108h]@126
    POINT v128; // [sp+Ch] [bp-F8h]@8
    POINT v129; // [sp+14h] [bp-F0h]@18
    char v130; // [sp+1Ch] [bp-E8h]@120
    POINT a2; // [sp+24h] [bp-E0h]@8
    POINT v132; // [sp+2Ch] [bp-D8h]@120
    POINT v133; // [sp+34h] [bp-D0h]@17
    POINT v134; // [sp+3Ch] [bp-C8h]@97
    POINT v135; // [sp+44h] [bp-C0h]@31
    POINT v136; // [sp+4Ch] [bp-B8h]@97
    POINT v137; // [sp+54h] [bp-B0h]@17
    POINT v138; // [sp+5Ch] [bp-A8h]@32
    POINT v139; // [sp+64h] [bp-A0h]@17
    POINT v140; // [sp+6Ch] [bp-98h]@31
    POINT v141; // [sp+74h] [bp-90h]@8
    POINT v142; // [sp+7Ch] [bp-88h]@31
    POINT v143; // [sp+84h] [bp-80h]@9
    GUIWindow dialog_window; // [sp+8Ch] [bp-78h]@1
    char *Str; // [sp+E0h] [bp-24h]@56
    int v146; // [sp+E4h] [bp-20h]@24
    int hilight_color; // [sp+E8h] [bp-1Ch]@1
    int m_text_color; // [sp+ECh] [bp-18h]@1
    __int32 v149; // [sp+F0h] [bp-14h]@8
    Player* _this; // [sp+F4h] [bp-10h]@1
    unsigned __int8 uPlayerID; // [sp+FBh] [bp-9h]@15
    int v152; // [sp+FCh] [bp-8h]@24
    int v153; // [sp+100h] [bp-4h]@44
    int th;
    short text_color;

    v0 = pPlayers[uActiveCharacter];
    _this = pPlayers[uActiveCharacter];
    memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
    dialog_window.uFrameX = 483;
    dialog_window.uFrameWidth = 148;
    dialog_window.uFrameZ = 334;
    m_text_color = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
    hilight_color = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u);
    switch (dialog_menu_id)
    {
    case DIALOG_SHOP_MAIN:
        {
        if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
            return;
        pShopOptions[0] = pGlobalTXT_LocalizationStrings[134]; //"Buy Standard"
        pShopOptions[1] = pGlobalTXT_LocalizationStrings[152]; //"Buy Special"
        pShopOptions[2] = pGlobalTXT_LocalizationStrings[159]; //"Display Inventory"
        pShopOptions[3] = 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;
        int j=0;
        if ( pDialogueWindow->pNumPresenceButton>=0 )
            {
            th = 2;
            for (v152 = pDialogueWindow->pStartingPosActiveItem; v152 < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;  ++v152)
                {
                control_button = pDialogueWindow->GetControl(v152);
                control_button->uY = v146 + v23;
                v27 = pFontArrus->CalcTextHeight(pShopOptions[j], &dialog_window, 0, 0);
                control_button->uHeight = v27;
                v23 = control_button->uY + control_button->uHeight - 1;
                control_button->uW = v23;
                text_color = hilight_color;
                if ( pDialogueWindow->pCurrentPosActiveItem != th )
                    text_color = m_text_color;
                dialog_window.DrawTitleText(pFontArrus, 0, control_button->uY, text_color, pShopOptions[j], 3);
                ++th;               
                ++j;
                }
            }
        }
        break;
    case DIALOG_SHOP_BUY_STANDART:
        {
        pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
        textureW = 0;
        v153 = 0;
        for(int i=0; i<8; ++i)
            {
            if ( pParty->StandartItemsInShops[window_SpeakInHouse->par1C][i].uItemID);
                {
                textureW = ItemsInShopTexture[i]->uTextureWidth;
                textureH = ItemsInShopTexture[i]->uTextureHeight;
                if ( i >= 4 )  //low row
                    {
                    v60 = 90 - (textureW/2);
                    pRenderer->DrawTextureTransparent(v60 + v153 - 420, 126, ItemsInShopTexture[i]);
                    v59 = v60 + v153 + 80220;
                    }
                else
                    {
                    v57 = 98 -  textureH;
                    v152 = 86 - (textureW/2);
                    pRenderer->DrawTextureTransparent(v153 + v152, v57, ItemsInShopTexture[i]);
                    v59 = v153 + v152 + 640 * v57;
                    }
                ZBuffer_DoFill(&pRenderer->pActiveZBuffer[v59], ItemsInShopTexture[i], i+1);
                }
                v153 += 105;

            }

        if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
            return;

        v149 = 0;
        for(int i=0; i<8; ++i)
            {
            if ( pParty->StandartItemsInShops[window_SpeakInHouse->par1C][i].uItemID);
            ++v149;

            }

        v69 = GetAsyncKeyState(17);
        v70 = _this->CanSteal();
        //Str = (char *)v70;
        if ( v69 == 0 || v70 == 0 )
            {
            v71 = pGlobalTXT_LocalizationStrings[195]; //"Select the Item to Buy"
            }
        else
            {
            v71 = pGlobalTXT_LocalizationStrings[185];//"Steal item"
            }
        DrawTextAtStatusBar(v71, 0);
        if ( v149 != 0 )
            {
            v73 = pMouse->GetCursorPos(&v136);
            v74 = pRenderer->pActiveZBuffer[v73->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v134)->y]] & 0xFFFF;
            if ( !v74 )
                return;
            v149 = v74 - 1;
            selected_item = &pParty->StandartItemsInShops[window_SpeakInHouse->par1C][v74-1];
            if ( v69 ==0 || v70 == 0)
                {
                v120 = window_SpeakInHouse->ptr_1C;
                v15 = (char *)pMerchantsBuyPhrases[_this->_490EEE(selected_item, 2, window_SpeakInHouse->par1C, 2)];
                }
            else
                {
                v120 = window_SpeakInHouse->ptr_1C;
                v15 = pGlobalTXT_LocalizationStrings[181]; //"Steal %24"
                }
            v36 = BuilDialogueString(v15, uActiveCharacter - 1, selected_item, (char *)v120, 2, 0);
            v115 = (174 - pFontArrus->CalcTextHeight(v36, &dialog_window, 0, 0)) / 2 + 138;
            dialog_window.DrawTitleText(pFontArrus, 0, v115, m_text_color, v36, 3);
            return;
            }
        dialog_window.DrawCurrentTime( pParty->field_3C.field_50[window_SpeakInHouse->par1C]- pParty->uTimePlayed);
        return;
        }
        break;
    case DIALOG_SHOP_SELL:
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[199], 0);//"Select the Item to Sell"
      if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win())
        return;

      if((v9 = pMouse->GetCursorPos(&v139)->x - 14, v149 = (v9 >> 5) + 14 * ((pMouse->GetCursorPos(&v133)->y - 17) >> 5),
         pMouse->GetCursorPos(&v137)->x <= 13) || pMouse->GetCursorPos(&v129)->x >= 462 
         || (v10 = v0->GetItemIDAtInventoryIndex((int *)&v149), v11 = 0, !v10) )
           return;
   
      v116 = (ItemGen *)&v0->pInventoryItems[v10-1];
      v13 = v0->_490EEE(v116, 2, window_SpeakInHouse->par1C, 3);
      v15 = (char *)pMerchantsSellPhrases[v0->_490EEE(v116, 2, window_SpeakInHouse->par1C, 3)];
      v36 = BuilDialogueString(v15, uActiveCharacter - 1, v116, (char *) window_SpeakInHouse->par1C, 3, 0);
      v115 = (174 - pFontArrus->CalcTextHeight(v36, &dialog_window, 0, 0)) / 2 + 138;
      dialog_window.DrawTitleText(pFontArrus, 0, v115, m_text_color, v36, 3);
      return;
    }
    break;
    case DIALOG_SHOP_IDENTIFY:
        {
        draw_leather();
        CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
        DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[197], 0); //"Select the Item to Identify"	
        if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
            {
            v1 = pMouse->GetCursorPos(&a2)->x - 14;
            v149 = (v1 >> 5) + 14 * ((pMouse->GetCursorPos(&v128)->y - 17) >> 5);
            if ( pMouse->GetCursorPos(&v141)->x > 13 )
                {
                if ( pMouse->GetCursorPos(&v143)->x < 462 )
                    {
                    v2 = v0->GetItemIDAtInventoryIndex((int *)&v149);
                    if ( v2 )
                        {
                        v3 = (ItemGen *)&v0->pInventoryItems[v2-1];
                        if (v3->Identified())
                            {
                            v118 = window_SpeakInHouse->ptr_1C;
                            v4 = uActiveCharacter - 1;
                            v5 = "%24";
                            v114 = v3;
                            }
                        else
                            {
                            v118 = window_SpeakInHouse->ptr_1C;
                            v114 = v3;
                            v7 = (int)window_SpeakInHouse->ptr_1C;
                            uPlayerID = uActiveCharacter - 1;
                            v8 = v0->_490EEE(v3, 2, v7, 4);
                            v4 = uPlayerID;
                            v5 = (char *)pMerchantsIdentifyPhrases[v8];
                            }
                        v6 = BuilDialogueString(v5, v4, v114, (char *)v118, 4, 0);
                        v115 = (174 - pFontArrus->CalcTextHeight(v6, &dialog_window, 0, 0)) / 2 + 138;
                        dialog_window.DrawTitleText(pFontArrus, 0, v115, m_text_color, v6, 3);
                        return;
                        }
                    }
                }
            }
        }
        break;
    case DIALOG_SHOP_REPAIR:
        {
        draw_leather();
        CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
        DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[198], 0);
        if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win())
            return;

          if( (v31 = pMouse->GetCursorPos(&v135)->x - 14,
            v149 = (v31 >> 5) + 14 * ((pMouse->GetCursorPos(&v142)->y - 17) >> 5),
            pMouse->GetCursorPos(&v140)->x <= 13)
            || pMouse->GetCursorPos(&v138)->x >= 462
            || (v32 = v0->GetItemIDAtInventoryIndex((int *)&v149), v11 = 0, !v32)
            || (v33 = 9 * v32, !(v0->field_1F5[4 * v33 + 15] & 2)) )
            return;
  

        v120 = window_SpeakInHouse->ptr_1C;
        v116 = (ItemGen *)&v0->spellbook.pDarkSpellbook.bIsSpellAvailable[4 * v33 + 5];
        v34 = (int)window_SpeakInHouse->ptr_1C;
        uPlayerID = uActiveCharacter - 1;
        v35 = v0->_490EEE((ItemGen *)&v0->spellbook.pDarkSpellbook.bIsSpellAvailable[4 * v33 + 5], 2, v34, 5);
        v14 = uPlayerID;
        v15 = (char *)pMerchantsRepairPhrases[v35];
        v36 = BuilDialogueString(v15, v14, v116, (char *)v120, 5, 0);
        v115 = (174 - pFontArrus->CalcTextHeight(v36, &dialog_window, 0, 0)) / 2 + 138;
        dialog_window.DrawTitleText(pFontArrus, 0, v115, m_text_color, v36, 3);
        return;
        }
        break;
    case 6: //buy standart
        {
        pRenderer->DrawTextureIndexed(8u, 8u, ShopTexture);
        DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[195], 0); //"Select the Item to Buy"
        if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
            return;
        v149 = 0;
        for(int i=0;i<6;++i)
            if (pParty->SpecialItemsInShops[window_SpeakInHouse->par1C][i].uItemID)
                ++v149;


        if ( v149 )
            {
            v94 = pMouse->GetCursorPos(&v132);
            v149 = pRenderer->pActiveZBuffer[v94->x + pSRZBufferLineOffsets[pMouse->GetCursorPos((POINT *)&v130)->y]];
            v95 = v149;
            if ( v149 && v149 != -65536 )
                {
                --v149;
 
                v97 = uActiveCharacter - 1;

                v99 = _this->_490EEE(
                    &pParty->SpecialItemsInShops[window_SpeakInHouse->par1C][v95-1], 2,	window_SpeakInHouse->par1C,	2);
                v100 = BuilDialogueString((char *)pMerchantsBuyPhrases[v99], uActiveCharacter - 1, v98, (char *)window_SpeakInHouse->par1C, 2, 0);
                v103 = pFontArrus->CalcTextHeight(v100, &dialog_window, 0, 0);
                dialog_window.DrawTitleText(pFontArrus, 0, (174 - v103) / 2 + 138, m_text_color, v100, 3);
                }
            v104 = 0;
            v153 = 0;
            do
                {
                //if ( pParty->field_C59C[9 * (v104 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] )
                if (pParty->SpecialItemsInShops[window_SpeakInHouse->par1C][v104].uItemID)
                    {
                    v105 = ItemsInShopTexture[v104];
                    if ( v104 >= 4 )
                        {
                        v110 = 90 - ((signed int)v105->uTextureWidth >> 1);
                        pRenderer->DrawTextureTransparent(v153 + v110 - 420, 0x7Eu, ItemsInShopTexture[v104]);
                        v127 = v104 + 1;
                        v109 = v153 + v110 + 80220;
                        }
                    else
                        {
                        v106 = 98 - v105->uTextureHeight;
                        v107 = ItemsInShopTexture[v104];
                        v108 = 98 - v105->uTextureHeight;
                        v152 = 86 - ((signed int)v105->uTextureWidth >> 1);
                        pRenderer->DrawTextureTransparent(v152 + v153, v108, v107);
                        v127 = v104 + 1;
                        v109 = v152 + v153 + 640 * v106;
                        }
                    ZBuffer_DoFill(&pRenderer->pActiveZBuffer[v109], ItemsInShopTexture[v104], v127);
                    }
                v153 += 105;
                ++v104;
                }
                while ( v104 < 8 );
                return;
            }
        dialog_window.DrawCurrentTime(pParty->field_3C.field_50[window_SpeakInHouse->par1C]-  pParty->uTimePlayed);
        return;
        }
        break;
    case DIALOG_SHOP_DISPLAY_EQUIPMENT:
        {
        draw_leather();
        CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
        v79 = pShopOptions;
        pShopOptions[0] = pGlobalTXT_LocalizationStrings[200]; //"Sell"
        pShopOptions[1] = pGlobalTXT_LocalizationStrings[113]; //"Identify"
        pShopOptions[2] = 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);
        v83 = pDialogueWindow;
        v152 = (174 - all_text_height) / 3;
        v84 = pDialogueWindow->pStartingPosActiveItem;
        v85 = v84 + pDialogueWindow->pNumPresenceButton;
        v86 = (3 * (58 - v152) - all_text_height) / 2 - v152 / 2 + 138;
        v24 = -pDialogueWindow->pNumPresenceButton < 0;
        _this = (Player *)pDialogueWindow->pStartingPosActiveItem;
        if ( v24 ^ __OFSUB__(v84, v85) )
            {
            v153 = 2;
            do
                {
                v87 = v83->GetControl((unsigned int)_this);
                v88 = v87;
                v87->uY = v152 + v86;
                v89 = pFontArrus->CalcTextHeight(*v79, &dialog_window, 0, 0);
                v90 = v88->uY;
                v91 = v153;
                v88->uHeight = v89;
                v86 = v90 + v89 - 1;
                v88->uW = v86;
                v92 = hilight_color;
                if ( pDialogueWindow->pCurrentPosActiveItem != v91 )
                    v92 = m_text_color;
                dialog_window.DrawTitleText(pFontArrus, 0, v90, v92, *v79, 3u);
                v83 = pDialogueWindow;
                ++v153;
                ++v79;
                _this = (Player *)((char *)_this + 1);
                }
                while ( (signed int)_this < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem );
            }
        return;
        }
        break;
    case DIALOG_SHOP_BUY_SPECIAL:
        {
        pRenderer->DrawTextureIndexed(8, 8, ShopTexture);
        v11 = 0;
        v61 = 0;
        v153 = 0;
        do
            {
            if (pParty->SpecialItemsInShops[window_SpeakInHouse->par1C][v61].uItemID)
                {
                v62 = ItemsInShopTexture[v61];
                if ( v61 >= 4 )
                    {
                    v67 = 90 - ((signed int)v62->uTextureWidth >> 1);
                    pRenderer->DrawTextureTransparent(v153 + v67 - 420, 0x7Eu, ItemsInShopTexture[v61]);
                    v66 = v153 + v67 + 80220;
                    }
                else
                    {
                    v63 = 98 - v62->uTextureHeight;
                    v64 = ItemsInShopTexture[v61];
                    v65 = 98 - v62->uTextureHeight;
                    v152 = 86 - ((signed int)v62->uTextureWidth >> 1);
                    pRenderer->DrawTextureTransparent(v152 + v153, v65, v64);
                    v66 = v152 + v153 + 640 * v63;
                    }
                ZBuffer_DoFill(&pRenderer->pActiveZBuffer[v66], ItemsInShopTexture[v61], v61 + 1);
                }
            v153 += 105;
            ++v61;
            }
            while ( v61 < 8 );

            if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
                return;
            v68 = 0;
            v149 = 0;

            do
                {
                // if ( (char *)pParty->field_C59C[9 * (v68 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] != v11 )
                if (pParty->SpecialItemsInShops[window_SpeakInHouse->par1C][(signed int)v68].uItemID)
                    ++v149;
                ++v68;
                }
                while ( v68 < 6 );

                v69 = GetAsyncKeyState(17);
                v70 = _this->CanSteal();
                Str = (char *)v70;
                if ( v69 == 0 || (char *)v70 == 0 )
                    {
                    v71 = pGlobalTXT_LocalizationStrings[196]; //Select the Special Item to Buy"
                    }
                else
                    {
                    v71 = pGlobalTXT_LocalizationStrings[185];
                    }
                DrawTextAtStatusBar(v71, 0);
                if ( (char *)v149 != 0 )
                    {
                    v73 = pMouse->GetCursorPos(&v136);
                    v74 = pRenderer->pActiveZBuffer[v73->x + pSRZBufferLineOffsets[pMouse->GetCursorPos((POINT *)&v134)->y]] & 0xFFFF;
                    if ( !v74 )
                        return;
                    v149 = v74 - 1;

                    if ( dialog_menu_id == 2 )
                        selected_item = &pParty->StandartItemsInShops[window_SpeakInHouse->par1C][v74-1];
                    else
                        selected_item = &pParty->SpecialItemsInShops[window_SpeakInHouse->par1C][v74-1];//(ItemGen *)&pParty->field_C59C[v76 + 724];
                    if ( v69 == 0 || Str == 0 )
                        {
                        v120 = window_SpeakInHouse->ptr_1C;
                        v15 = (char *)pMerchantsBuyPhrases[_this->_490EEE(selected_item, 2, window_SpeakInHouse->par1C, 2)];
                        }
                    else
                        {
                        v120 = window_SpeakInHouse->ptr_1C;
                        v15 = pGlobalTXT_LocalizationStrings[181]; //"Steal %24"
                        }
                    v36 = BuilDialogueString(v15, uActiveCharacter - 1, selected_item, (char *)v120, 2, 0);
                    v115 = (174 - pFontArrus->CalcTextHeight(v36, &dialog_window, 0, 0)) / 2 + 138;
                    dialog_window.DrawTitleText(pFontArrus, 0, v115, m_text_color, v36, 3);
                    return;
                    }
                dialog_window.DrawCurrentTime( pParty->field_3C.field_50[window_SpeakInHouse->par1C]- pParty->uTimePlayed);
                return;
        }
        break;
    case DIALOG_SHOP_SKILLS:
        {
        if (!sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
            return;
        v152 = 0;
        v37 = pDialogueWindow;
        //v38 = (signed __int64)(*(float *)&p2DEvents_minus1__24[13 * (unsigned int)ptr_507BC0->ptr_1C] * 500.0);
        v38 = (signed __int64)(p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
        _this = (Player *)(v38 * (100 - v0->GetMerchant()) / 100);
        if ( (signed int)_this < v38 / 3 )
            _this = (Player *)(v38 / 3);
        v39 = v37->pStartingPosActiveItem;
        v40 = v37->pNumPresenceButton;
        v153 = 0;
        if ( (signed int)v39 < (signed int)(v39 + v40) )
            {
            do
                {
                v41 = v37->GetControl(v39)->uControlParam - 36;
                if ( byte_4ED970_skill_learn_ability_by_class_table[v0->classType][v41] && !v0->pActiveSkills[v41] )
                    {
                    v42 = pFontArrus->CalcTextHeight(pSkillNames[v41], &dialog_window, 0, 0);
                    v152 += v42;
                    ++v153;
                    }
                ++v39;
                }
                while ( (signed int)v39 < v37->pNumPresenceButton + v37->pStartingPosActiveItem );
                if ( v153 )
                    {
                    sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[401], _this);
                    dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u);
                    _this = (Player *)((149 - v152) / v153);
                    if ( (149 - v152) / v153 > 32 )
                        _this = (Player *)32;
                    v43 = (149 - v153 * (signed int)_this - v152) / 2 - (signed int)_this / 2 + 162;
                    v152 = v37->pStartingPosActiveItem;
                    v146 = v43;
                    if ( v152 < v152 + v37->pNumPresenceButton )
                        {
                        v153 = 2;
                        do
                            {
                            v44 = v37->GetControl(v152);
                            v45 = v44;
                            v46 = v44->uControlParam - 36;
                            if ( !byte_4ED970_skill_learn_ability_by_class_table[v0->classType][v46] || v0->pActiveSkills[v46] )
                                {
                                v45->uW = 0;
                                v45->uHeight = 0;
                                v45->uY = 0;
                                }
                            else
                                {
                                v47 = pSkillNames[v46];
                                v45->uY = (unsigned int)((char *)_this + v146);
                                Str = v47;
                                v48 = pFontArrus->CalcTextHeight(v47, &dialog_window, 0, 0);
                                v49 = v45->uY;
                                v50 = v153;
                                v45->uHeight = v48;
                                v51 = v49 + v48 - 1;
                                v45->uW = v51;
                                v146 = v51;
                                v52 = hilight_color;
                                if ( pDialogueWindow->pCurrentPosActiveItem != v50 )
                                    v52 = m_text_color;
                                dialog_window.DrawTitleText(pFontArrus, 0, v49, v52, Str, 3u);
                                }
                            v53 = v37->pStartingPosActiveItem;
                            ++v152;
                            textureH = v37->pNumPresenceButton + v53;
                            ++v153;
                            }
                            while ( v152 < textureH );
                        }
                    return;
                    }
            }
        sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], v0->pName, pClassNames[v0->classType]); //"Seek knowledge elsewhere %s the %s"
        strcat(pTmpBuf, "\n \n");
        strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]); //"I can offer you nothing further."
        v115 = (174 - pFontArrus->CalcTextHeight(pTmpBuf, &dialog_window, 0, 0)) / 2 + 138;
        dialog_window.DrawTitleText(pFontArrus, 0, v115, hilight_color, pTmpBuf, 3);
        return;
        }
        break;
      }
    }



    //----- (004B5D7C) --------------------------------------------------------
    void GuildDialog()
        {
        GUIWindow *v0; // ebx@1
        Player *currPlayer; // edi@1
        signed int base_teach_price; // ebx@1
        int v3; // edi@6
        int result; // eax@11
        unsigned int v5; // ebx@13
        int v6; // esi@13
        signed int v7; // esi@17
        int v8; // esi@22
        signed int v9; // ecx@22
        char *v10; // eax@22
        const char *statusbar_string; // ecx@26
        POINT *v12; // esi@30
        int v13; // ecx@30
        void *v14; // ST1C_4@31
        ItemGen *v15; // ST18_4@31
        int v16; // ST10_4@31
        int v17; // eax@31
        char *v18; // edx@31
        int v19; // eax@32
        GUIWindow *v20; // edi@35
        int v21; // esi@35
        int v22; // eax@35
        unsigned int v23; // eax@36
        int v24; // eax@39
        int v25; // eax@40
        int v26; // ecx@47
        GUIButton *v27; // eax@49
        GUIButton *v28; // esi@49
        unsigned int v29; // eax@49
        char *v30; // eax@52
        int v31; // eax@55
        unsigned int v32; // ecx@55
        int v33; // eax@55
        unsigned __int16 v34; // ax@55
        int v35; // eax@58
        const char *v36; // ST20_4@61
        unsigned __int16 v37; // ST1C_2@61
        int v38; // eax@61
        GUIWindow *v39; // [sp-18h] [bp-304h]@31
        int v40; // [sp-14h] [bp-300h]@31
        int v41; // [sp-10h] [bp-2FCh]@31
        unsigned __int16 v42; // [sp-Ch] [bp-2F8h]@31
        char *v43; // [sp-8h] [bp-2F4h]@31
        unsigned int v44; // [sp-4h] [bp-2F0h]@31
        char Dest[100]; // [sp+Ch] [bp-2E0h]@3
        char v46[100]; // [sp+70h] [bp-27Ch]@3
        char v47[100]; // [sp+D4h] [bp-218h]@3
        char v48[100]; // [sp+138h] [bp-1B4h]@3
        char v49[100]; // [sp+19Ch] [bp-150h]@3
        POINT v50; // [sp+264h] [bp-88h]@30
        POINT v51; // [sp+26Ch] [bp-80h]@30
        GUIWindow working_window; // [sp+274h] [bp-78h]@1
        signed int v53; // [sp+27Ch] [bp-70h]@1
        signed int v54; // [sp+284h] [bp-68h]@1
        int v55; // [sp+2C8h] [bp-24h]@47
        int main_text_color; // [sp+2CCh] [bp-20h]@1
        int hi_text_color; // [sp+2D0h] [bp-1Ch]@1
        Player *v58; // [sp+2D4h] [bp-18h]@1
        unsigned __int8 uPlayerID; // [sp+2DBh] [bp-11h]@31
        char *Str; // [sp+2DCh] [bp-10h]@35
        int v61; // [sp+2E0h] [bp-Ch]@35
        unsigned int v62; // [sp+2E4h] [bp-8h]@13
        int v63; // [sp+2E8h] [bp-4h]@1

        v0 = window_SpeakInHouse;
        memcpy(&working_window, window_SpeakInHouse, sizeof(GUIWindow));
        v58 = pPlayers[uActiveCharacter];
        currPlayer = v58;
        working_window.uFrameX = 483;
        working_window.uFrameWidth = 148;
        working_window.uFrameZ = 334;
        main_text_color = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
        hi_text_color = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
        //v2 = (signed __int64)(p2DEvents_minus1__20[13 * (unsigned int)v0->ptr_1C] * 500.0);
        base_teach_price = (signed __int64)(p2DEvents[(unsigned int)v0->ptr_1C - 1].fPriceMultiplier * 500.0);
        v63 = base_teach_price * (100 - currPlayer->GetMerchant()) / 100;
        if ( v63 < base_teach_price / 3 )
            v63 = base_teach_price / 3;
        strcpy(Dest, "");
        strcpy(v46, "");
        strcpy(v47, "");
        strcpy(v48, "");
        strcpy(v49, "");
        if ( dialog_menu_id != 1 )
            {
            if ( dialog_menu_id != 18 ) //buy skill
                {
                if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
                    {
                    //v3 = (int)(&currPlayer->uIntelligence + dword_F8B19C); //test skill
                    if ( v58->pActiveSkills[dialog_menu_id-36] )
                        {
                        sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[403], pClassNames[dialog_menu_id - 16]); //"You already know the %s skill"
                        ShowStatusBarString(pTmpBuf, 2u);
                        pAudioPlayer->PlaySound(SOUND_27, 0, 0, -1, 0, 0, 0, 0);
                        }
                    else
                        {
                        if ( pParty->uNumGold < v63 )
                            {
                            ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); //"You don't have enough gold"
                            HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 2);
                            }
                        else
                            {
                            Party::TakeGold(v63);
                            v58->pActiveSkills[dialog_menu_id-36] = 1;
                            }
                        }
                    }
                pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
                return;
                }
            pRenderer->DrawTextureIndexed(8u, 8u, ShopTexture);
            v5 = 0;
            v6 = 0;
            v62 = 0;
            v63 = 32;
            do
                {
                if (pParty->SpellBooksInGuilds[window_SpeakInHouse->par1C-139][v6].uItemID)
                    // if ( *(&pParty->pPlayers[1].pInstalledBeacons[0].field_18 + 9 * (v6 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)) )

                    {
                    pRenderer->DrawTextureTransparent(v63, 0x5Au, ItemsInShopTexture[v6]);
                    ZBuffer_DoFill((int *)((char *)pRenderer->pActiveZBuffer + v62 + 230528), ItemsInShopTexture[v6], v6 + 1);
                    currPlayer = v58;
                    }
                v63 += 70;
                v62 += 280;
                ++v6;
                }
                while ( v63 < 452 );

                v62 = 1680;
                v7 = 6;
                v63 = 32;
                do
                    {
                    if (pParty->SpellBooksInGuilds[window_SpeakInHouse->par1C-139][v7].uItemID)
                        // if ( *(&pParty->pPlayers[1].pInstalledBeacons[0].field_18 + 9 * (v7 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)) )
                        {
                        pRenderer->DrawTextureTransparent(v63, 0xFAu, ItemsInShopTexture[v7]);
                        ZBuffer_DoFill((int *)((char *)pRenderer->pActiveZBuffer + v62 + 638448), ItemsInShopTexture[v7], v7 + 1);
                        currPlayer = v58;
                        }
                    v63 += 70;
                    v62 += 280;
                    ++v7;
                    }
                    while ( v63 < 452 );

                    if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
                        {
                        v8 = 0;
                        v9 = 12;
                        // v10 = (char *)(&pParty->pPlayers[1].pInstalledBeacons[0].field_18 + 108 * (unsigned int)window_SpeakInHouse->ptr_1C);
                        //  v10 =
                        do
                            {
                            if (pParty->SpellBooksInGuilds[window_SpeakInHouse->par1C-139][v9].uItemID )
                                ++v8;
                            // v10 += 36;
                            --v9;
                            }
                            while ( v9 );

                            GetAsyncKeyState(17);
                            statusbar_string = pGlobalTXT_LocalizationStrings[195]; //"Select the Item to Buy"
                            if ( dialog_menu_id != 2 )
                                statusbar_string = pGlobalTXT_LocalizationStrings[196]; //"Select the Special Item to Buy"	
                            DrawTextAtStatusBar(statusbar_string, 0);
                            if ( !v8 )
                                {
                                working_window.DrawCurrentTime(
                                    __PAIR__(
                                    *(int *)&stru_AA1058[3].pSounds[8 * (unsigned int)window_SpeakInHouse->ptr_1C + 44472],
                                    *(int *)&stru_AA1058[3].pSounds[8 * (unsigned int)window_SpeakInHouse->ptr_1C + 44468])
                                    - pParty->uTimePlayed);
                                return;
                                }
                            v12 = pMouse->GetCursorPos(&v51);
                            result = v12->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v50)->y];
                            v13 = pRenderer->pActiveZBuffer[result] & 0xFFFF;
                            if ( pRenderer->pActiveZBuffer[result] & 0xFFFF )
                                {
                                v14 = window_SpeakInHouse->ptr_1C;
                                v15 = (ItemGen *)(&pParty->pPlayers[1].uExpressionTimeLength + 18 * (v13 + 12 * (int)v14));
                                v16 = (int)window_SpeakInHouse->ptr_1C;
                                uPlayerID = uActiveCharacter - 1;
                                v17 = currPlayer->_490EEE( (ItemGen *)&pParty->pPlayers[1].uExpressionTimeLength + v13 + 12 * (int)v14, 3, v16,  2);
                                v18 = BuilDialogueString((char *)pMerchantsBuyPhrases[v17], uPlayerID, v15, (char *)v14, 2, 0);     
                                v19 = pFontArrus->CalcTextHeight(v18, &working_window, 0, 0);
                                working_window.DrawTitleText(pFontArrus, 0, (174 - v19) / 2 + 138,  main_text_color, v18, 3);
                                return;
                                }
                        }
                    return;
            }
        if ( !(unsigned __int16)_449B57_test_bit(
            (unsigned __int8 *)currPlayer->_guilds_member_bits,
            guild_mambership_flags[(unsigned int)window_SpeakInHouse->ptr_1C-139]) )
            { //you must me member
            v38 = pFontArrus->CalcTextHeight(pNPCTopics[121].pText, &working_window, 0, 0);
            working_window.DrawTitleText(pFontArrus, 0, (212 - v38) / 2 + 101, hi_text_color, pNPCTopics[121].pText, 3u);
            pDialogueWindow->pNumPresenceButton = 0;
            return;
            }

        if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
            return;
        v20 = pDialogueWindow;
        v5 = 0;
        v62 = 0;
        Str = 0;
        v21 = pDialogueWindow->pStartingPosActiveItem;
        v22 = v21 + pDialogueWindow->pNumPresenceButton;
        v61 = 0;
        if ( pDialogueWindow->pStartingPosActiveItem >= pDialogueWindow->pStartingPosActiveItem+pDialogueWindow->pNumPresenceButton )
            {
            sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], pPlayers[uActiveCharacter]->pName, pClassNames[pPlayers[uActiveCharacter]->classType]); // "Seek knowledge elsewhere %s the %s"	
            strcat(pTmpBuf, "\n \n");
            strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]); //"I can offer you nothing further."
            v19 = pFontArrus->CalcTextHeight(pTmpBuf, &working_window, 0, 0);
            working_window.DrawTitleText(pFontArrus, v5, (174 - v19) / 2 + 138, hi_text_color, pTmpBuf, 3);
            return;
            }
        do
            {
            v23 = v20->GetControl(v21)->uControlParam;
            if ( v23 == 18 )
                {
                v25 = pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[400], &working_window, 0, 0); //"Buy Spells"
                v62 += v25;
                ++v61;
                }
            else
                {

                if((byte_4ED970_skill_learn_ability_by_class_table[v58->classType][v23-36])&&(v58->pActiveSkills[v23-36]))
                    // or
                    //byte_4ED970_skill_learn_ability_by_class_table[v58->uClass - 1][v23 + 1]
                    {
                    v24 = pFontArrus->CalcTextHeight(pClassNames[v23 - 16], &working_window, 0, 0);
                    v62 += v24;
                    ++v61;
                    ++Str;
                    }
                }
            ++v21;
            }
            while ( v21 < v20->pNumPresenceButton + v20->pStartingPosActiveItem );
            if ( !v61 )
                {
LABEL_64:
                sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], v58->pName, pClassNames[v58->classType]); // "Seek knowledge elsewhere %s the %s"	
                strcat(pTmpBuf, "\n \n");
                strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]); //"I can offer you nothing further."
                v19 = pFontArrus->CalcTextHeight(pTmpBuf, &working_window, 0, 0);
                working_window.DrawTitleText(pFontArrus, v5, (174 - v19) / 2 + 138, hi_text_color, pTmpBuf, 3);
                return;
                }
            if ( Str )
                {
                sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[401], v63); //"Skill Cost: %lu"
                working_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u);
                }
            v63 = (signed int)(149 - v62) / v61;
            if ( v63 > 32 )
                v63 = 32;
            v26 = (signed int)(149 - v61 * v63 - v62) / 2 - v63 / 2 + 162;
            v62 = v20->pStartingPosActiveItem;
            v55 = v26;
            if (v20->pStartingPosActiveItem < v20->pStartingPosActiveItem + v20->pNumPresenceButton )
                {
                v61 = 2;
                while ( 1 )
                    {
                    v27 = v20->GetControl(v62);
                    v28 = v27;
                    v29 = v27->uControlParam;
                    if ( v29 == 18 )
                        break;

                    //  __debugbreak();
                    //pSkillAvailabilityPerClass[8 + v58->uClass][4 + v23]
                    // or
                    if ((byte_4ED970_skill_learn_ability_by_class_table[v58->classType][v29 - 36])&&(v58->pActiveSkills[v29-36]))
                        // or
                        //byte_4ED970_skill_learn_ability_by_class_table[v58->uClass - 1][v23 + 1]

                        {
                        v30 = pClassNames[v29 -16];
LABEL_55:
                        Str = v30;
                        v28->uY = v63 + v55;
                        v31 = pFontArrus->CalcTextHeight(v30, &working_window, 0, 0);
                        v32 = v28->uY;
                        v28->uHeight = v31;
                        v33 = v32 + v31 - 1;
                        v28->uW = v33;
                        v55 = v33;
                        v34 = hi_text_color;
                        if ( pDialogueWindow->pCurrentPosActiveItem != v61 )
                            v34 = main_text_color;
                        working_window.DrawTitleText(pFontArrus, 0, v32, v34, Str, 3u);
                        v35 = v20->pStartingPosActiveItem;
                        ++v62;
                        ++v61;
                        if ( (signed int)v62 >=v20->pNumPresenceButton +v20->pStartingPosActiveItem  )
                            return;
                        }
                    v28->uW = 0;
                    v28->uHeight = 0;
                    v28->uY = 0;
LABEL_58:
                    v35 = v20->pStartingPosActiveItem;
                    ++v62;
                    ++v61;
                    if ( (signed int)v62 >=v20->pNumPresenceButton +v20->pStartingPosActiveItem  )
                        return;
                    }
                v30 = pGlobalTXT_LocalizationStrings[400]; //"Buy Spells"
                goto LABEL_55;
                }
            return;
        }



//----- (004B705E) --------------------------------------------------------
void TempleDialog()
    {
    GUIWindow *v0; // ebx@1
    Player *v1; // esi@1
    int v2; // edi@1
    int result; // eax@4
    GUIWindow *v4; // edi@6
    void *v5; // eax@6
    int v6; // eax@6
    unsigned int v7; // eax@8
    int v8; // ecx@8
    unsigned int v9; // eax@9
    int v10; // eax@11
    int v11; // eax@12
    GUIWindow *v12; // ecx@16
    int v13; // edx@16
    GUIButton *v14; // eax@19
    GUIButton *v15; // edi@19
    int v16; // eax@19
    const char *v17; // eax@21
    int v18; // eax@21
    unsigned int v19; // ecx@21
    int v20; // eax@21
    unsigned __int16 v21; // ax@21
    unsigned __int16 v22; // ST14_2@27
    int v23; // eax@27
    double v24; // st7@28
    unsigned int v25; // ebx@28
    DDM_DLV_Header *v26; // edi@29
    int v27; // eax@31
    int v28; // eax@32
    //unsigned int v29; // ecx@34
    unsigned int v30; // edx@36
    unsigned int v31; // edx@38
    unsigned int v32; // edx@40
    unsigned int v33; // edx@42
    unsigned int v34; // edx@44
    int v35; // edi@50
    signed int v36; // eax@50
    unsigned __int8 v37; // al@54
    int v38; // ecx@54
    GUIWindow *v39; // eax@56
    unsigned __int8 v40; // al@61
    GUIButton *v41; // edi@64
    int v42; // esi@66
    GUIWindow *v43; // ecx@66
    int v44; // edi@66
    int v45; // eax@68
    signed int v46; // edi@69
    int v47; // edi@71
    GUIButton *v48; // eax@73
    const char *v49; // edx@73
    GUIButton *v50; // esi@73
    int v51; // eax@73
    unsigned int v52; // ecx@73
    unsigned __int16 v53; // ax@73
    char a1[300]; // [sp+10h] [bp-1B4h]@64
    GUIWindow v57; // [sp+13Ch] [bp-88h]@1
    __int64 v58; // [sp+190h] [bp-34h]@1
    __int64 v59; // [sp+198h] [bp-2Ch]@1
    __int64 v60; // [sp+1A0h] [bp-24h]@1
    GUIWindow *v61; // [sp+1ACh] [bp-18h]@6
    unsigned int v62; // [sp+1B0h] [bp-14h]@8
    unsigned __int8 v63; // [sp+1B7h] [bp-Dh]@64
    int v64; // [sp+1B8h] [bp-Ch]@6
    unsigned int v65; // [sp+1BCh] [bp-8h]@6
    DDM_DLV_Header *v66; // [sp+1C0h] [bp-4h]@6

    v0 = window_SpeakInHouse;
    memcpy(&v57, window_SpeakInHouse, sizeof(v57));
    v57.uFrameX = 483;
    v57.uFrameWidth = 148;
    v57.uFrameZ = 334;
    HIDWORD(v58) = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
    HIDWORD(v59) = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
    v1 = pPlayers[uActiveCharacter];
    //v2 = pPlayers[uActiveCharacter]->_4B807C(p2DEvents_minus1__20[13 * (unsigned int)v0->ptr_1C]);
    v2 = pPlayers[uActiveCharacter]->_4B807C(p2DEvents[(unsigned int)v0->ptr_1C - 1].fPriceMultiplier);
    HIDWORD(v60) = v2;
    if ( dialog_menu_id != 1 )
        {
        if ( dialog_menu_id != 10 )
            {
            if ( dialog_menu_id != 11 )
                {

                if ( dialog_menu_id == 96 )
                    {
                    if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
                        {
                        v4 = pDialogueWindow;
                        v61 = pDialogueWindow;
                        v5 = window_SpeakInHouse->ptr_1C;
                        v66 = 0;
                        //v65 = (signed __int64)(*(float *)&p2DEvents_minus1__24[13 * (signed int)v5] * 500.0);
                        v65 = (signed __int64)(p2DEvents[(signed int)v5 - 1].flt_24 * 500.0);
                        v6 = v1->GetMerchant();
                        v64 = (signed int)(v65 * (100 - v6)) / 100;
                        if ( v64 < (signed int)v65 / 3 )
                            v64 = (signed int)v65 / 3;
                        v7 = v4->pStartingPosActiveItem;
                        v8 = v7 + v4->pNumPresenceButton;
                        v65 = 0;
                        v62 = v7;
                        if ( (signed int)v7 >= v8 )
                            goto LABEL_78;
                        do
                            {
                            v9 = v4->GetControl(v62)->uControlParam - 36;
                            if ( byte_4ED970_skill_learn_ability_by_class_table[v1->classType][v9] && !v1->pActiveSkills[v9] )
                                {
                                v10 = pFontArrus->CalcTextHeight(pSkillNames[v9], &v57, 0, 0);
                                v66 = (DDM_DLV_Header *)((char *)v66 + v10);
                                ++v65;
                                }
                            v11 = v4->pStartingPosActiveItem;
                            ++v62;
                            }
                            while ( (signed int)v62 < v4->pNumPresenceButton + v11 );
                            if ( v65 )
                                {
                                sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[401], v64);
                                v57.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u);
                                v64 = (149 - (signed int)v66) / (signed int)v65;
                                if ( v64 > 32 )
                                    v64 = 32;
                                v65 = (signed int)(149 - v65 * v64 - (int)v66) / 2 - v64 / 2 + 162;
                                v12 = v61;
                                result = v61->pStartingPosActiveItem;
                                v13 = result + v61->pNumPresenceButton;
                                v62 = v61->pStartingPosActiveItem;
                                if ( result < v13 )
                                    {
                                    v66 = (DDM_DLV_Header *)2;
                                    while ( 1 )
                                        {
                                        v14 = v12->GetControl(v62);
                                        v15 = v14;
                                        v16 = v14->uControlParam - 36;
                                        if ( !byte_4ED970_skill_learn_ability_by_class_table[v1->classType][v16] || v1->pActiveSkills[v16] )
                                            {
                                            v15->uW = 0;
                                            v15->uHeight = 0;
                                            v15->uY = 0;
                                            }
                                        else
                                            {
                                            v17 = pSkillNames[v16];
                                            v15->uY = v64 + v65;
                                            HIDWORD(v60) = (uint32)v17;
                                            v18 = pFontArrus->CalcTextHeight(v17, &v57, 0, 0);
                                            v19 = v15->uY;
                                            v15->uHeight = v18;
                                            v20 = v19 + v18 - 1;
                                            v15->uW = v20;
                                            v65 = v20;
                                            v21 = WORD2(v59);
                                            if ( (DDM_DLV_Header *)pDialogueWindow->pCurrentPosActiveItem != v66 )
                                                v21 = WORD2(v58);
                                            v57.DrawTitleText(pFontArrus, 0, v19, v21, (const char *)HIDWORD(v60), 3u);
                                            }
                                        result = (int)v61;
                                        ++v62;
                                        v66 = (DDM_DLV_Header *)((char *)v66 + 1);
                                        if ( (signed int)v62 >= v61->pNumPresenceButton + v61->pStartingPosActiveItem )
                                            break;
                                        v12 = v61;
                                        }
                                    }
                                }
                            else
                                {
LABEL_78:
                                sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], v1->pName, pClassNames[v1->classType]);
                                strcat(pTmpBuf, "\n \n");
                                strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);
                                v22 = WORD2(v59);
                                v23 = pFontArrus->CalcTextHeight(pTmpBuf, &v57, 0, 0);
                                result = (int)v57.DrawTitleText(pFontArrus, 0, (174 - v23) / 2 + 138, v22, pTmpBuf, 3u);
                                }
                        }
                    }
                return;
                }

            // DONATION
            //v24 = p2DEvents_minus1__20[13 * (unsigned int)ptr_507BC0->ptr_1C];
            v24 = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier;
            v25 = 0;
            if ( pParty->uNumGold >= (unsigned int)(signed __int64)v24 )
                {
                Party::TakeGold((signed __int64)v24);
                v26 = &pOutdoor->ddm;
                if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor )
                    v26 = &pIndoor->dlv;
                v27 = v26->uReputation;
                v66 = v26;
                if ( v27 > -5 )
                    {
                    v28 = v27 - 1;
                    v26->uReputation = v28;
                    if ( v28 < -5 )
                        v26->uReputation = -5;
                    }
                if ( (unsigned __int8)byte_F8B1EF[uActiveCharacter] == pParty->uDaysPlayed % 7 )
                    {
                    if ( v26->uReputation <= -5 )
                        {
                        v30 = pParty->uDaysPlayed % 7 + 1;
                        LOBYTE(v30) = v30 | 0x80;
                        _42777D_CastSpell_UseWand_ShootArrow(SPELL_AIR_WIZARD_EYE, uActiveCharacter - 1, v30, 48, 0);
                        }
                    if ( v26->uReputation <= -10 )
                        {
                        v31 = pParty->uDaysPlayed % 7 + 1;
                        LOBYTE(v31) = v31 | 0x80;
                        _42777D_CastSpell_UseWand_ShootArrow(SPELL_SPIRIT_PRESERVATION, uActiveCharacter - 1, v31, 48, 0);
                        v26 = v66;
                        }
                    if ( v26->uReputation <= -15 )
                        {
                        v32 = pParty->uDaysPlayed % 7 + 1;
                        LOBYTE(v32) = v32 | 0x80;
                        _42777D_CastSpell_UseWand_ShootArrow(SPELL_BODY_PROTECTION_FROM_MAGIC, uActiveCharacter - 1, v32, 48, 0);
                        v26 = v66;
                        }
                    if ( v26->uReputation <= -20 )
                        {
                        v33 = pParty->uDaysPlayed % 7 + 1;
                        LOBYTE(v33) = v33 | 0x80;
                        _42777D_CastSpell_UseWand_ShootArrow(SPELL_LIGHT_HOUR_OF_POWER, uActiveCharacter - 1, v33, 48, 0);
                        v26 = v66;
                        }
                    if ( v26->uReputation <= -25 )
                        {
                        v34 = pParty->uDaysPlayed % 7 + 1;
                        LOBYTE(v34) = v34 | 0x80;
                        _42777D_CastSpell_UseWand_ShootArrow(SPELL_LIGHT_DAY_OF_PROTECTION, uActiveCharacter - 1, v34, 48, 0);
                        }
                    }
                ++byte_F8B1EF[uActiveCharacter];
                v1->PlaySound(SPEECH_83, 0);
                ShowStatusBarString(pGlobalTXT_LocalizationStrings[527], 2u); // "Thank You!"
                goto LABEL_46;
                }
            goto LABEL_55;
            }
        if ( !v1->_4B6FF9() )
            return;
        v25 = 0;
        if ( pParty->uNumGold < v2 )
            {
LABEL_55:
            ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u);
            HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 2);
            goto LABEL_46;
            }
        Party::TakeGold(v2);
        v35 = LODWORD(v1->pConditions[17]);
        v59 = v1->pConditions[14];
        v58 = v1->pConditions[15];
        v60 = v1->pConditions[16];
        v61 = (GUIWindow *)HIDWORD(v1->pConditions[17]);
        memset(v1, 0, 0xA0u);
        v1->sHealth = v1->GetMaxHealth();
        v1->sMana = v1->GetMaxMana();
        v36 = (signed int)window_SpeakInHouse->ptr_1C;
        if ( v36 != 78 && (v36 <= 80 || v36 > 82) )
            {
            if ( (unsigned int)v61 | v35 )
                {
                v37 = LOBYTE(v1->field_1928);
                v38 = v1->field_1924;
                v1->uFace = v37;
                v1->uVoiceID = v38;
                ReloadPlayerPortraits(uActiveCharacter - 1, (char)v37);
                }
            goto LABEL_63;
            }
        v39 = v61;
        if ( (unsigned int)v61 | v35 )
            {
            LODWORD(v1->pConditions[17]) = v35;
            }
        else
            {
            if ( !v60 && !v58 && !v59 )
                goto LABEL_63;
            v1->field_1928 = v1->uFace;
            v1->field_1924 = v1->uVoiceID;
            v1->SetCondition(0x11u, 1);
            v1->uVoiceID = (v1->GetSexByVoice() != 0) + 23;
            v40 = (v1->GetSexByVoice() != 0) + 23;
            v1->uFace = v40;
            ReloadPlayerPortraits(uActiveCharacter - 1, (char)v40);
            LODWORD(v1->pConditions[17]) = LODWORD(pParty->uTimePlayed);
            v39 = (GUIWindow *)HIDWORD(pParty->uTimePlayed);
            }
        HIDWORD(v1->pConditions[17]) = (int)v39;
LABEL_63:
        pAudioPlayer->PlaySound((SoundID)(SOUND_GoldReceived|0x2), -1, 0, -1, 0, 0, 0, 0);
        v1->PlaySound(SPEECH_82, 0);
        pOtherOverlayList->_4418B1(20, uActiveCharacter + 99, 0, 65536);
LABEL_46:
        pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, v25);
        return ; // void func
        }
    v63 = 1;
    v41 = pDialogueWindow->GetControl(pDialogueWindow->pStartingPosActiveItem);
    strcpy(a1, "");
    v41->uHeight = 0;
    v41->uY = 0;
    if ( v1->_4B6FF9() )
        {
        sprintf(a1, "%s %d %s", pGlobalTXT_LocalizationStrings[104], HIDWORD(v60), pGlobalTXT_LocalizationStrings[97]);
        v63 = 0;
        }
    strcpy(&a1[100], pGlobalTXT_LocalizationStrings[68]);
    strcpy(&a1[200], pGlobalTXT_LocalizationStrings[160]);
    v42 = v63;
    v43 = pDialogueWindow;
    v44 = v63;
    v66 = 0;
    if ( v63 < pDialogueWindow->pNumPresenceButton )
        {
        v61 = (GUIWindow *)&a1[100 * v63];
        do
            {
            v45 = pFontArrus->CalcTextHeight((const char *)v61, &v57, 0, 0);
            v66 = (DDM_DLV_Header *)((char *)v66 + v45);
            v43 = pDialogueWindow;
            v61 = (GUIWindow *)((char *)v61 + 100);
            ++v44;
            }
            while ( v44 < pDialogueWindow->pNumPresenceButton );
        }
    v46 = v43->pNumPresenceButton - v42;
    v64 = (174 - (signed int)v66) / v46;
    if ( v64 > 32 )
        v64 = 32;
    v47 = (174 - v64 * v46 - (signed int)v66) / 2 - v64 / 2 + 138;
    v65 = v42 + v43->pStartingPosActiveItem;
    if ( v42 + v43->pStartingPosActiveItem < v43->pStartingPosActiveItem + v43->pNumPresenceButton )
        {
        v61 = (GUIWindow *)(v42 + 2);
        v66 = (DDM_DLV_Header *)&a1[100 * v42];
        do
            {
            v48 = v43->GetControl(v65);
            v49 = (const char *)v66;
            v50 = v48;
            v48->uY = v64 + v47;
            v51 = pFontArrus->CalcTextHeight(v49, &v57, 0, 0);
            v52 = v50->uY;
            v50->uHeight = v51;
            v47 = v52 + v51 - 1;
            v50->uW = v47;
            v53 = WORD2(v59);
            if ( (GUIWindow *)pDialogueWindow->pCurrentPosActiveItem != v61 )
                v53 = WORD2(v58);
            v57.DrawTitleText(pFontArrus, 0, v52, v53, (const char *)v66, 3u);
            v43 = pDialogueWindow;
            v66 = (DDM_DLV_Header *)((char *)v66 + 100);
            v61 = (GUIWindow *)((char *)v61 + 1);
            ++v65;
            }
            while ( (signed int)v65 < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem );
        }
    return;
    }

//----- (004B4710) --------------------------------------------------------
int __cdecl TrainingDialog()
{
  Player *v0; // ebx@1
  int color2; // eax@1
  //unsigned int v2; // ecx@1
  //int v3; // eax@1
  //signed int v4; // edx@1
  unsigned __int64 v5; // edi@3
  //unsigned int v6; // esi@3
  //void *v7; // ecx@3
  int v8; // edx@4
  double v9; // st7@6
  signed int v10; // esi@6
  int v11; // ecx@6
  int result; // eax@9
  GUIWindow *v13; // edi@14
  signed int v14; // esi@14
  unsigned int v15; // esi@16
  int v16; // eax@16
  unsigned int v17; // eax@17
  int v18; // eax@19
  int v19; // ecx@24
  GUIButton *v20; // eax@26
  GUIButton *v21; // esi@26
  int v22; // eax@26
  const char *v23; // eax@28
  int v24; // eax@28
  unsigned int v25; // ecx@28
  int v26; // eax@28
  unsigned __int16 v27; // ax@28
  int v28; // eax@32
  unsigned __int16 v29; // ST14_2@34
  int v30; // eax@34
  const char *v31; // ST18_4@36
  unsigned __int16 v32; // ST14_2@36
  int v33; // eax@36
  int v34; // eax@37
  unsigned int v35; // edi@38
  unsigned int v36; // eax@38
  int v37; // ecx@41
  char *v38; // eax@41
  int *v39; // eax@45
  unsigned int v40; // eax@46
  void *v41; // ecx@46
  unsigned int v42; // eax@46
  GUIWindow *v43; // ecx@59
  int v44; // edx@59
  char **v45; // esi@60
  int v46; // eax@62
  int v47; // eax@68
  int v48; // edx@69
  int v49; // ebx@69
  unsigned __int8 v50; // sf@69
  char **v51; // edi@70
  GUIButton *v52; // eax@71
  GUIButton *v53; // esi@71
  int v54; // eax@71
  unsigned int v55; // ecx@71
  int v56; // eax@71
  unsigned __int16 v57; // ax@71
  unsigned __int16 v58; // [sp-Ch] [bp-90h]@38
  const char *v59; // [sp-Ch] [bp-90h]@63
  char *v60; // [sp-8h] [bp-8Ch]@38
  char *v61; // [sp-8h] [bp-8Ch]@63
  unsigned int v62; // [sp-4h] [bp-88h]@38
  int v63; // [sp-4h] [bp-88h]@52
  char *v64; // [sp-4h] [bp-88h]@63
  GUIWindow v65; // [sp+Ch] [bp-78h]@1
  //__int64 v66; // [sp+60h] [bp-24h]@3
  unsigned int white; // [sp+68h] [bp-1Ch]@1
  int v68; // [sp+6Ch] [bp-18h]@3
  int v69; // [sp+70h] [bp-14h]@6
  //unsigned int i; // [sp+74h] [bp-10h]@1
  //int v71; // [sp+78h] [bp-Ch]@1
  int v72; // [sp+7Ch] [bp-8h]@16
  int v73; // [sp+80h] [bp-4h]@14

  v0 = pPlayers[uActiveCharacter];
  memcpy(&v65, window_SpeakInHouse, sizeof(v65));
  v65.uFrameX = 483;
  v65.uFrameWidth = 148;
  v65.uFrameZ = 334;
  white = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
  color2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u);
  //v71 = color2;
  //v2 = v0->uLevel;
  //v3 = 0;
  //v4 = 0;
  //for ( i = v2; v4 < (signed int)v2; ++v4 )
  //  v3 += v4 + 1;
  //v5 = 1000 * v3;
  v5 = 1000ui64 * v0->uLevel * (v0->uLevel + 1) / 2;  // E n = n(n + 1) / 2
  //v6 = HIDWORD(v0->uExperience);
  //v7 = window_SpeakInHouse->ptr_1C;
  v68 = pMaxLevelPerTrainingHallType[(unsigned int)window_SpeakInHouse->ptr_1C - 89];
  //v66 = 1000 * v3;
  if (v0->uExperience >= v5)
  {
    v8 = v0->classType % 4 + 1;
    if ( v8 == 4 )
      v8 = 3;
    v9 = (double)v0->uLevel;
    //i = 0;
    v69 = v8;
    //v10 = (signed __int64)(v9 * p2DEvents_minus1__20[13 * (signed int)v7] * (double)v8);
    v10 = (signed __int64)(v9 * p2DEvents[(signed int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier * (double)v8);
    v11 = v10 * (100 - v0->GetMerchant()) / 100;
    if ( v11 < v10 / 3 )
      v11 = v10 / 3;
    //i = v11;
  }
  result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
  if ( result )
  {
    if ( dialog_menu_id != 1 )
    {
      if ( dialog_menu_id != 17 )
      {
        result = dialog_menu_id - 96;
        if ( dialog_menu_id == 96 )
        {
          result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
          if ( result )
          {
            //i = 0;
            int _v0 = 0;
            v13 = pDialogueWindow;
            //v14 = (signed __int64)(*(float *)&p2DEvents_minus1__24[13 * (unsigned int)ptr_507BC0->ptr_1C] * 500.0);
            v14 = (signed __int64)(p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
            v73 = v14 * (100 - v0->GetMerchant()) / 100;
            if ( v73 < v14 / 3 )
              v73 = v14 / 3;
            v15 = v13->pStartingPosActiveItem;
            v16 = v13->pNumPresenceButton;
            v72 = 0;
            if ( (signed int)v15 >= (signed int)(v15 + v16) )
              goto LABEL_76;
            do
            {
              v17 = v13->GetControl(v15)->uControlParam - 36;
              if ( byte_4ED970_skill_learn_ability_by_class_table[v0->classType][v17] && !v0->pActiveSkills[v17] )
              {
                v18 = pFontArrus->CalcTextHeight(pSkillNames[v17], &v65, 0, 0);
                _v0 += v18;
                ++v72;
              }
              ++v15;
            }
            while ( (signed int)v15 < v13->pNumPresenceButton + v13->pStartingPosActiveItem );
            if ( v72 )
            {
              sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[401], v73);// "Skill Cost: %lu"
              v65.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u);
              v73 = (signed int)(149 - _v0) / v72;
              if ( v73 > 32 )
                v73 = 32;
              result = v13->pStartingPosActiveItem;
              v19 = (signed int)(149 - v72 * v73 - _v0) / 2 - v73 / 2 + 162;
              int _v1 = result;
              v68 = v19;
              if ( result < result + v13->pNumPresenceButton )
              {
                v72 = 2;
                do
                {
                  v20 = v13->GetControl(_v1);
                  v21 = v20;
                  v22 = v20->uControlParam - 36;
                  if ( !byte_4ED970_skill_learn_ability_by_class_table[v0->classType][v22] || v0->pActiveSkills[v22] )
                  {
                    v21->uW = 0;
                    v21->uHeight = 0;
                    v21->uY = 0;
                  }
                  else
                  {
                    v23 = pSkillNames[v22];
                    v21->uY = v73 + v68;
                    //HIDWORD(v66) = (int)v23;
                    v24 = pFontArrus->CalcTextHeight(v23, &v65, 0, 0);
                    v25 = v21->uY;
                    v21->uHeight = v24;
                    v26 = v25 + v24 - 1;
                    v21->uW = v26;
                    v68 = v26;
                    v27 = color2;
                    if ( pDialogueWindow->pCurrentPosActiveItem != v72 )
                      v27 = white;
                    v65.DrawTitleText(pFontArrus, 0, v25, v27, v23, 3u);
                  }
                  v28 = v13->pStartingPosActiveItem;
                  ++_v1;
                  result = v13->pNumPresenceButton + v28;
                  ++v72;
                }
                while ( (signed int)_v1 < result );
              }
            }
            else
            {
LABEL_76:
              sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], v0->pName, pClassNames[v0->classType]);// 
                                                // "Seek knowledge elsewhere %s the %s"
              strcat(pTmpBuf, "\n \n");
              strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);// "I can offer you nothing further."
              v29 = color2;
              v30 = pFontArrus->CalcTextHeight(pTmpBuf, &v65, 0, 0);
              result = (int)v65.DrawTitleText(pFontArrus, 0, (174 - v30) / 2 + 138, v29, pTmpBuf, 3u);
            }
          }
        }
        return result;
      }
      if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
      {
        v31 = pNPCTopics[122].pText;
        v32 = color2;
        v33 = pFontArrus->CalcTextHeight(pNPCTopics[122].pText, &v65, 0, 0);
        v65.DrawTitleText(pFontArrus, 0, (212 - v33) / 2 + 101, v32, v31, 3u);
        result = (int)pDialogueWindow;
        pDialogueWindow->pNumPresenceButton = 0;
        return result;
      }
      v34 = v0->uLevel;
      if ( v34 < v68 )
      {
        if ( (signed __int64)v0->uExperience >= v5 )
        {
          if ( pParty->uNumGold >= v11)
          {
            Party::TakeGold(v11);
            HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 2);
            ++v0->uLevel;
            v0->uSkillPoints += v0->uLevel / 10 + 5;
            v0->sHealth = v0->GetMaxHealth();
            v0->sMana = v0->GetMaxMana();
            v37 = 0;
            v38 = byte_F8B148;
            do
            {
              if ( *(int *)v38 > v37 )
                v37 = *(int *)v38;
              v38 += 4;
            }
            while ( (signed int)v38 < (signed int)word_F8B158 );
            v39 = &dword_F8B144 + uActiveCharacter;
            ++*v39;
            if ( *v39 > v37 )
            {
              v40 = sub_494820(pParty->uCurrentHour);
              v41 = window_SpeakInHouse->ptr_1C;
              v42 = 60 * (v40 + 4) - pParty->uCurrentMinute;
              if ( v41 == (void *)94 || v41 == (void *)95 )
                v42 += 720;
              RestAndHeal((signed int)(v42 + 10080));
              if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor )
                pOutdoor->SetFog();
            }
            v0->PlaySound(SPEECH_87, 0);
            sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[430], v0->pName, v0->uLevel, v0->uLevel / 10 + 5);// 
                                                // "%s is now Level %lu and has earned %lu Skill Points!"
            ShowStatusBarString(pTmpBuf, 2u);
            goto LABEL_56;
          }
          ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u);// "You don't have enough gold"
          v63 = 4;
LABEL_55:
          HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, v63);
LABEL_56:
          /*result = pMessageQueue_50CBD0->uNumMessages;
          if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
          {
            pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113;
            pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1;
            result = 3 * pMessageQueue_50CBD0->uNumMessages + 3;
            *(&pMessageQueue_50CBD0->uNumMessages + result) = 0;
            ++pMessageQueue_50CBD0->uNumMessages;
          }
          return result;*/
          pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
          return 1; // void function actually
        }
        sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[538], (unsigned int)(v5 - v0->uExperience), v34 + 1);// 
                                                // "You need %d more experience to train to level %d"
        v35 = 0;
        v62 = 3;
        v60 = pTmpBuf;
        v58 = color2;
        v36 = (212 - pFontArrus->CalcTextHeight(pTmpBuf, &v65, 0, 0)) / 2 + 88;
      }
      else
      {
        sprintf(pTmpBuf, "%s\n \n%s", pGlobalTXT_LocalizationStrings[536], pGlobalTXT_LocalizationStrings[529]);// 
                                                // ""With your skills, you should be working here as a teacher.""
                                                // ""Sorry, but we are unable to train you.""
        v35 = 0;
        v62 = 3;
        v60 = pTmpBuf;
        v58 = color2;
        v36 = (212 - pFontArrus->CalcTextHeight(pTmpBuf, &v65, 0, 0)) / 2 + 101;
      }
      v65.DrawTitleText(pFontArrus, v35, v36, v58, v60, v62);
      v63 = 3;
      goto LABEL_55;
    }
    result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
    if ( result )
    {
      v43 = pDialogueWindow;
      v72 = 0;
      pShopOptions[0] = pTmpBuf;
      pShopOptions[1] = pGlobalTXT_LocalizationStrings[160];// "Learn Skills"
      v44 = pDialogueWindow->pNumPresenceButton;
      v73 = pDialogueWindow->pStartingPosActiveItem;
      if ( v73 < v73 + v44 )
      {
        v45 = pShopOptions;
        do
        {
          if ( v43->GetControl(v73)->uControlParam == 17 )
          {
            v46 = v0->uLevel;
            if ( v46 < v68 )
            {
              if ( (signed __int64)v0->uExperience < v5 )
              {
                v64 = (char *)(v46 + 1);
                v61 = (char *)(v5 - LODWORD(v0->uExperience));
                v59 = pGlobalTXT_LocalizationStrings[538];// "You need %d more experience to train to level %d"
              }
              else
              {
                v64 = (char *)v11;
                v61 = (char *)(v46 + 1);
                v59 = pGlobalTXT_LocalizationStrings[537];// "Train to level %d for %d gold"
              }
            }
            else
            {
              v64 = pGlobalTXT_LocalizationStrings[529];// ""Sorry, but we are unable to train you.""
              v61 = pGlobalTXT_LocalizationStrings[536];// ""With your skills, you should be working here as a teacher.""
              v59 = "%s\n \n%s";
            }
            sprintfex(*v45, v59, v61, v64);
          }
          v47 = pFontArrus->CalcTextHeight(*v45, &v65, 0, 0);
          v43 = pDialogueWindow;
          v72 += v47;
          ++v45;
          ++v73;
        }
        while ( v73 < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem );
      }
      //HIDWORD(v66) = (174 - v72) / 2;
      result = v43->pStartingPosActiveItem;
      v48 = result + v43->pNumPresenceButton;
      v49 = (2 * (87 - (174 - v72) / 2) - v72) / 2 - (174 - v72) / 2 / 2 + 138;
      v50 = -v43->pNumPresenceButton < 0;
      v73 = v43->pStartingPosActiveItem;
      if ( v50 ^ __OFSUB__(result, v48) )
      {
        int _v3 = 2;
        v51 = pShopOptions;
        do
        {
          v52 = v43->GetControl(v73);
          v53 = v52;
          v52->uY = (174 - v72) / 2 + v49;
          v54 = pFontArrus->CalcTextHeight(*v51, &v65, 0, 0);
          v55 = v53->uY;
          v53->uHeight = v54;
          v56 = v54 + v55 - 1;
          v53->uW = v56;
          v49 = v56;
          v57 = color2;
          if ( pDialogueWindow->pCurrentPosActiveItem != _v3 )
            v57 = white;
          v65.DrawTitleText(pFontArrus, 0, v55, v57, *v51, 3u);
          v43 = pDialogueWindow;
          ++_v3;
          ++v51;
          ++v73;
          result = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
        }
        while ( v73 < result );
      }
    }
  }
  return result;
}









//----- (004B4FCF) --------------------------------------------------------
void MagicShopDialog()
    {
  Player *v0; // ebx@1
  int result; // eax@6
  signed int v2; // esi@8
  unsigned int v3; // ebx@10
  char *v4; // eax@11
  char *v5; // eax@12
  unsigned int v6; // eax@12
  int v7; // ST08_4@14
  int v8; // eax@14
  unsigned __int8 v9; // dl@14
  char *v10; // ecx@14
  signed int v11; // esi@16
  int v12; // ST08_4@19
  int v13; // eax@19
  int all_text_height; // edi@21
  char **v15; // esi@21
  int v16; // eax@22
  GUIWindow *v17; // ecx@23
  int v18; // edx@23
  int v19; // edi@23
  unsigned __int8 v20; // sf@23
  GUIButton *control_button; // esi@25
  const char **v22; // eax@25
  int v23; // eax@25
  unsigned int v24; // ecx@25
  const char **v25; // edx@25
  unsigned __int16 text_color; // ax@25
  signed int v27; // esi@30
  int v28; // ST08_4@34
  int v29; // eax@34
  char *v30; // edx@35
  GUIWindow *v31; // edi@40
  void *v32; // eax@40
  signed int v33; // esi@40
  unsigned int v34; // esi@42
  int v35; // eax@42
  unsigned int v36; // eax@43
  int v37; // eax@45
  int v38; // ecx@50
  GUIButton *v39; // eax@52
  GUIButton *v40; // esi@52
  int v41; // eax@52
  char *v42; // eax@54
  int v43; // eax@54
  unsigned int v44; // ecx@54
  int v45; // edx@54
  int v46; // eax@54
  unsigned __int16 v47; // ax@54
  int v48; // eax@58
  signed int v49; // esi@62
  Texture *v50; // ecx@64
  unsigned int v51; // edi@64
  unsigned int v52; // esi@66
  int v53; // edx@70
  Texture *v54; // ecx@76
  unsigned int v55; // edi@76
  unsigned int v56; // esi@76
  int v57; // edx@80
  Texture *v58; // ecx@86
  unsigned int v59; // edi@86
  unsigned int v60; // esi@88
  int v61; // edx@92
  Texture *v62; // ecx@98
  unsigned int v63; // edi@98
  unsigned int v64; // esi@100
  int v65; // edx@104
  signed int v66; // ecx@109
  SHORT v67; // di@117
  bool v68; // eax@117
  const char *v69; // ecx@119
  POINT *v70; // esi@124
  int v71; // ecx@125
  int v72; // eax@125
  int v73; // ecx@125
  ItemGen *v74; // esi@125
  int v75; // eax@130
  int v76; // esi@131
  char **v77; // edi@131
  int v78; // eax@132
  GUIWindow *v79; // ecx@133
  int v80; // edx@133
  int v81; // edi@133
  GUIButton *v82; // esi@135
  const char **v83; // eax@135
  int v84; // eax@135
  unsigned int v85; // ecx@135
  int v86; // edx@135
  unsigned __int16 v87; // ax@135
  GUIWindow *v88; // [sp-18h] [bp-110h]@35
  int v89; // [sp-14h] [bp-10Ch]@35
  ItemGen *v90; // [sp-10h] [bp-108h]@14
  int v91; // [sp-10h] [bp-108h]@35
  unsigned __int16 v92; // [sp-Ch] [bp-104h]@12
  void *v93; // [sp-Ch] [bp-104h]@14
  int v94; // [sp-8h] [bp-100h]@11
  char *v95; // [sp-8h] [bp-100h]@12
  __int64 *v96; // [sp-4h] [bp-FCh]@11
  unsigned int v97; // [sp-4h] [bp-FCh]@12
  POINT v98; // [sp+Ch] [bp-ECh]@8
  POINT v99; // [sp+14h] [bp-E4h]@16
  POINT v100; // [sp+1Ch] [bp-DCh]@124
  POINT v101; // [sp+24h] [bp-D4h]@17
  POINT v102; // [sp+2Ch] [bp-CCh]@124
  POINT v103; // [sp+34h] [bp-C4h]@9
  POINT v104; // [sp+3Ch] [bp-BCh]@31
  POINT v105; // [sp+44h] [bp-B4h]@16
  POINT v106; // [sp+4Ch] [bp-ACh]@30
  POINT v107; // [sp+54h] [bp-A4h]@16
  POINT v108; // [sp+5Ch] [bp-9Ch]@30
  POINT a2; // [sp+64h] [bp-94h]@8
  POINT v110; // [sp+6Ch] [bp-8Ch]@30
  POINT v111; // [sp+74h] [bp-84h]@8
  GUIWindow dialog_window; // [sp+7Ch] [bp-7Ch]@1
  char *Str; // [sp+D0h] [bp-28h]@54
  int v146; // [sp+D4h] [bp-24h]@23
  unsigned int hilight_color; // [sp+D8h] [bp-20h]@1
  unsigned int m_text_color; // [sp+DCh] [bp-1Ch]@1
  __int32 v117; // [sp+E0h] [bp-18h]@8
  int v118; // [sp+E4h] [bp-14h]@40
  const char **v119; // [sp+E8h] [bp-10h]@24
  Player *_this; // [sp+ECh] [bp-Ch]@1
  unsigned __int8 uPlayerID; // [sp+F3h] [bp-5h]@14
  int v152; // [sp+F4h] [bp-4h]@23
  int v122;
  int v114;

  v0 = pPlayers[uActiveCharacter];
  _this = pPlayers[uActiveCharacter];
  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
  dialog_window.uFrameX = 483;
  dialog_window.uFrameWidth = 148;
  dialog_window.uFrameZ = 334;
  m_text_color = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
  hilight_color = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u);
  if ( dialog_menu_id > 5 )
  {
    if ( dialog_menu_id == 94 )
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      pShopOptions[0] = pGlobalTXT_LocalizationStrings[200];// "Sell"
      pShopOptions[1] = pGlobalTXT_LocalizationStrings[113];// "Identify"
      pShopOptions[2] = pGlobalTXT_LocalizationStrings[179];// "Repair"
      v76 = 0;
      v77 = pShopOptions;
      do
      {
        v78 = pFontArrus->CalcTextHeight(*v77, &dialog_window, 0, 0);
        ++v77;
        v76 += v78;
      }
      while ( (signed int)v77 < (signed int)&pShopOptions[3] );
      v79 = pDialogueWindow;
      _this = (Player *)((174 - v76) / 3);
      result = pDialogueWindow->pStartingPosActiveItem;
      v80 = result + pDialogueWindow->pNumPresenceButton;
      v81 = (3 * (58 - (signed int)_this) - v76) / 2 - (174 - v76) / 3 / 2 + 138;
      v20 = -pDialogueWindow->pNumPresenceButton < 0;
      v118 = pDialogueWindow->pStartingPosActiveItem;
      if ( v20 ^ __OFSUB__(result, v80) )
      {
        v122 = 2;
        v119 = (const char **)pShopOptions;
        do
        {
          v82 = v79->GetControl(v118);
          v83 = v119;
          v82->uY = (unsigned int)((char *)_this + v81);
          v84 = pFontArrus->CalcTextHeight(*v83, &dialog_window, 0, 0);
          v85 = v82->uY;
          v86 = v122;
          v82->uHeight = v84;
          v81 = v84 + v85 - 1;
          v82->uW = v81;
          v87 = hilight_color;
          if ( pDialogueWindow->pCurrentPosActiveItem != v86 )
            v87 = m_text_color;
          dialog_window.DrawTitleText(pFontArrus, 0, v85, v87, *v119, 3u);
          v79 = pDialogueWindow;
          ++v122;
          ++v119;
          ++v118;
          result = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
        }
        while ( v118 < result );
      }
      return;
    }
    if ( dialog_menu_id != 95 )
    {
      result = dialog_menu_id - 96;
      if ( dialog_menu_id == 96 )
      {
        result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
        if ( result )
        {
          v31 = pDialogueWindow;
          v3 = 0;
          v32 = window_SpeakInHouse->ptr_1C;
          v118 = 0;
            //v33 = (signed __int64)(*(float *)&p2DEvents_minus1__24[13 * (signed int)v32] * 500.0);
            v33 = (signed __int64)(p2DEvents[(signed int)v32 - 1].flt_24 * 500.0);
          v119 = (const char **)(v33 * (100 - _this->GetMerchant()) / 100);
          if ( (signed int)v119 < v33 / 3 )
            v119 = (const char **)(v33 / 3);
          v34 = v31->pStartingPosActiveItem;
          v35 = v34 + v31->pNumPresenceButton;
          v122 = 0;
          if ( (signed int)v34 >= v35 )
            goto LABEL_140;
          do
          {
            v36 = v31->GetControl(v34)->uControlParam - 36;
            if ( byte_4ED970_skill_learn_ability_by_class_table[_this->classType][v36] && !_this->pActiveSkills[v36] )
            {
              v37 = pFontArrus->CalcTextHeight(pSkillNames[v36], &dialog_window, 0, 0);
              v118 += v37;
              ++v122;
            }
            ++v34;
          }
          while ( (signed int)v34 < v31->pNumPresenceButton + v31->pStartingPosActiveItem );
          if ( !v122 )
          {
LABEL_140:
            sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[544], _this->pName, pClassNames[_this->classType]);// 
                                                // "Seek knowledge elsewhere %s the %s"
            strcat(pTmpBuf, "\n \n");
            strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);// "I can offer you nothing further."
            v30 = pTmpBuf;
            v97 = 3;
            v95 = pTmpBuf;
            v92 = hilight_color;
            v91 = 0;
            v89 = 0;
            v88 = &dialog_window;
            goto LABEL_61;
          }
          sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[401], v119);// "Skill Cost: %lu"
          dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u);
          v119 = (const char **)((149 - v118) / v122);
          if ( (149 - v118) / v122 > 32 )
            v119 = (const char **)32;
          result = v31->pStartingPosActiveItem;
          v38 = (149 - v122 * (signed int)v119 - v118) / 2 - (signed int)v119 / 2 + 162;
          v118 = result;
          v114 = v38;
          if ( result < result + v31->pNumPresenceButton )
          {
            v122 = 2;
            do
            {
              v39 = v31->GetControl(v118);
              v40 = v39;
              v41 = v39->uControlParam - 36;
              if ( !byte_4ED970_skill_learn_ability_by_class_table[_this->classType][v41] || _this->pActiveSkills[v41] )
              {
                v40->uW = 0;
                v40->uHeight = 0;
                v40->uY = 0;
              }
              else
              {
                v42 = pSkillNames[v41];
                v40->uY = (unsigned int)((char *)v119 + v114);
                Str = v42;
                v43 = pFontArrus->CalcTextHeight(v42, &dialog_window, 0, 0);
                v44 = v40->uY;
                v45 = v122;
                v40->uHeight = v43;
                v46 = v44 + v43 - 1;
                v40->uW = v46;
                v114 = v46;
                v47 = hilight_color;
                if ( pDialogueWindow->pCurrentPosActiveItem != v45 )
                  v47 = m_text_color;
                dialog_window.DrawTitleText(pFontArrus, 0, v44, v47, Str, 3u);
              }
              v48 = v31->pStartingPosActiveItem;
              ++v118;
              result = v31->pNumPresenceButton + v48;
              ++v122;
            }
            while ( v118 < result );
          }
        }
      }
      return;
    }
  }
  else
  {
    if ( dialog_menu_id == 5 )
    {
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[198], 0);// "Select the Item to Repair"
      result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
      if ( !result
        || (v27 = pMouse->GetCursorPos(&v110)->x - 14,
            v117 = (v27 >> 5) + 14 * ((pMouse->GetCursorPos(&v108)->y - 17) >> 5),
            result = (int)pMouse->GetCursorPos(&v106),
            *(int *)result <= 13)
        || (result = (int)pMouse->GetCursorPos(&v104), *(int *)result >= 462)
        || (result = v0->GetItemIDAtInventoryIndex((int *)&v117), v3 = 0, !result)
        || (result *= 9, !(_this->field_1F5[4 * result + 15] & 2)) )
        return;
      v96 = 0;
      v94 = 5;
      v93 = window_SpeakInHouse->ptr_1C;
      v90 = (ItemGen *)&_this->spellbook.pDarkSpellbook.bIsSpellAvailable[4 * result + 5];
      v28 = (int)window_SpeakInHouse->ptr_1C;
      uPlayerID = uActiveCharacter - 1;
      v29 = _this->_490EEE((ItemGen *)&_this->spellbook.pDarkSpellbook.bIsSpellAvailable[4 * result + 5], 3, v28, 5);
      v9 = uPlayerID;
      v10 = (char *)pMerchantsRepairPhrases[v29];
      goto LABEL_35;
    }
    if ( dialog_menu_id == 1 )
    {
     /* result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
      if ( result )
      {
        pShopOptions[0] = pGlobalTXT_LocalizationStrings[134];// "Buy Standard"
        pShopOptions[1] = pGlobalTXT_LocalizationStrings[152];// "Buy Special"
        pShopOptions[2] = pGlobalTXT_LocalizationStrings[159];// "Display Inventory"
        v14 = 0;
        pShopOptions[3] = pGlobalTXT_LocalizationStrings[160];// "Learn Skills"
        v15 = pShopOptions;
        do
        {
          v16 = pFontArrus->CalcTextHeight(*v15, &dialogue_window, 0, 0);
          ++v15;
          v14 += v16;
        }
        while ( (signed int)v15 < (signed int)&unk_F8B1C8 );
        v17 = pDialogueWindow;
        v114 = (174 - v14) / 4;
        result = pDialogueWindow->pStartingPosActiveItem;
        v18 = result + pDialogueWindow->pNumPresenceButton;
        v19 = (174 - 4 * (174 - v14) / 4 - v14) / 2 - (174 - v14) / 4 / 2 + 138;
        v20 = -pDialogueWindow->pNumPresenceButton < 0;
        v122 = pDialogueWindow->pStartingPosActiveItem;
        if ( v20 ^ __OFSUB__(result, v18) )
        {
          v119 = (const char **)2;
          _this = (Player *)pShopOptions;
          do
          {
            v21 = v17->GetControl(v122);
            v22 = (const char **)_this;
            v21->uY = v114 + v19;
            v23 = pFontArrus->CalcTextHeight(*v22, &dialogue_window, 0, 0);
            v24 = v21->uY;
            v25 = v119;
            v21->uHeight = v23;
            v19 = v24 + v23 - 1;
            v21->uW = v19;
            v26 = color2;
            if ( (const char **)pDialogueWindow->pCurrentPosActiveItem != v25 )
              v26 = m_text_color;
            dialogue_window.DrawTitleText(pFontArrus, 0, v24, v26, (const char *)LODWORD(_this->pConditions[0]), 3u);
            v17 = pDialogueWindow;
            v119 = (const char **)((char *)v119 + 1);
            _this = (Player *)((char *)_this + 4);
            ++v122;
            result = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
          }
          while ( v122 < result );
        }
      }*/
    if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
        return;
    pShopOptions[0] = pGlobalTXT_LocalizationStrings[134]; //"Buy Standard"
    pShopOptions[1] = pGlobalTXT_LocalizationStrings[152]; //"Buy Special"
    pShopOptions[2] = pGlobalTXT_LocalizationStrings[159]; //"Display Inventory"
    pShopOptions[3] = 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;
    int j=0;
    if ( pDialogueWindow->pNumPresenceButton>=0 )
        {
       int th = 2;
        for (v152 = pDialogueWindow->pStartingPosActiveItem; v152 < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;  ++v152)
            {
            control_button = pDialogueWindow->GetControl(v152);
            control_button->uY = v146 + v23;
            v27 = pFontArrus->CalcTextHeight(pShopOptions[j], &dialog_window, 0, 0);
            control_button->uHeight = v27;
            v23 = control_button->uY + control_button->uHeight - 1;
            control_button->uW = v23;
            text_color = hilight_color;
            if ( pDialogueWindow->pCurrentPosActiveItem != th )
                text_color = m_text_color;
            dialog_window.DrawTitleText(pFontArrus, 0, control_button->uY, text_color, pShopOptions[j], 3);
            ++th;               
            ++j;
            }
        }
        

      return;
    }
    if ( dialog_menu_id != 2 )
    {
      if ( dialog_menu_id != 3 )
      {
        result = dialog_menu_id - 4;
        if ( dialog_menu_id == 4 )
        {
          draw_leather();
          CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
          DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[197], 0);// "Select the Item to Identify"
          result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
          if ( result )
          {
            v2 = pMouse->GetCursorPos(&a2)->x - 14;
            v117 = (v2 >> 5) + 14 * ((pMouse->GetCursorPos(&v98)->y - 17) >> 5);
            result = (int)pMouse->GetCursorPos(&v111);
            if ( *(int *)result > 13 )
            {
              result = (int)pMouse->GetCursorPos(&v103);
              if ( *(int *)result < 462 )
              {
                result = v0->GetItemIDAtInventoryIndex((int *)&v117);
                v3 = 0;
                if ( result )
                {
                  v96 = 0;
                  v94 = 4;
                  v4 = (char *)&_this->pInventoryItems[result-1];
                  if ( v4[20] & 1 )
                  {
                    v5 = BuilDialogueString("%24", uActiveCharacter - 1, (ItemGen *)v4, (char *)window_SpeakInHouse->ptr_1C, 4, 0);
                    v97 = 3;
                    v95 = v5;
                    v92 = m_text_color;
                    v6 = (212 - pFontArrus->CalcTextHeight(v5, &dialog_window, 0, 0)) / 2 + 101;
                   
                       dialog_window.DrawTitleText(pFontArrus, v3, v6, v92, v95, v97); 
                       return;
                  }
                  v93 = window_SpeakInHouse->ptr_1C;
                  v90 = (ItemGen *)v4;
                  v7 = (int)window_SpeakInHouse->ptr_1C;
                  uPlayerID = uActiveCharacter - 1;
                  v8 = ((Player *)_this)->_490EEE((ItemGen *)v4, 3, v7, 4);
                  v9 = uPlayerID;
                  v10 = (char *)pMerchantsIdentifyPhrases[v8];
                  goto LABEL_35;
                }
              }
            }
          }
        }
        return;
      }
      draw_leather();
      CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
      DrawTextAtStatusBar(pGlobalTXT_LocalizationStrings[199], 0);// "Select the Item to Sell"
      result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
      if ( !result
        || (v11 = pMouse->GetCursorPos(&v107)->x - 14,
            v117 = (v11 >> 5) + 14 * ((pMouse->GetCursorPos(&v99)->y - 17) >> 5),
            result = (int)pMouse->GetCursorPos(&v105),
            *(int *)result <= 13)
        || (result = (int)pMouse->GetCursorPos(&v101), *(int *)result >= 462)
        || (result = v0->GetItemIDAtInventoryIndex((int *)&v117), v3 = 0, !result) )
        return;
      v96 = 0;
      v94 = 3;
      v93 = window_SpeakInHouse->ptr_1C;
      v90 = (ItemGen *)&_this->pInventoryItems[result-1];
      v12 = (int)window_SpeakInHouse->ptr_1C;
      uPlayerID = uActiveCharacter - 1;
      v13 = _this->_490EEE(v90, 3, v12, 3);
      v9 = uPlayerID;
      v10 = (char *)pMerchantsSellPhrases[v13];
LABEL_35:
      v30 = BuilDialogueString(v10, v9, v90, (char *)v93, v94, v96);
      v97 = 3;
      v95 = v30;
      v92 = m_text_color;
      v91 = v3;
      v89 = v3;
      v88 = &dialog_window;
LABEL_61:
      v6 = (174 - pFontArrus->CalcTextHeight(v30, v88, v89, v91)) / 2 + 138;
      dialog_window.DrawTitleText(pFontArrus, v3, v6, v92, v95, v97);
      return;
    }
  }
  pRenderer->DrawTextureIndexed(8u, 8u, ShopTexture);
  v3 = 0;
  v49 = 0;
  v122 = 0;
  if ( dialog_menu_id == 2 )
  {
    do
    {
     // if ( pParty->field_777C[9 * (v49 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] )
	 if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v49].uItemID);
      {
        v50 = ItemsInShopTexture[v49];
        v51 = 152 - v50->uTextureHeight;
        if ( (signed int)v51 < 1 )
          v51 = 0;
        v52 = 75 * v49 - v50->uTextureWidth / 2 + 40;
        if ( v122 )
        {
          if ( v122 == 5 )
          {
            v53 = ItemsInShopTexture[5]->uTextureWidth;
            if ( (signed int)v52 > 457 - v53 )
              v52 = 457 - v53;
          }
        }
        else
        {
          if ( (signed int)v52 < 18 )
            v52 = 18;
        }
        pRenderer->DrawTextureTransparent(v52, v51, v50);
        sub_40F92A(&pRenderer->pActiveZBuffer[v52 + 640 * v51], ItemsInShopTexture[v122], v122 + 1);
        v49 = v122;
      }
      ++v49;
      v122 = v49;
    }
    while ( v49 < 6 );
    v122 = 0;
    do
    {
      //if ( pParty->field_777C[9 * (v122 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 54] )
	if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v122+1].uItemID);
      {
        v54 = ItemsInShopTexture[v122 + 6];
        v55 = 306 - v54->uTextureHeight;
        v56 = 75 * v122 - v54->uTextureWidth / 2 + 40;
        if ( v122 )
        {
          if ( v122 == 5 )
          {
            v57 = ItemsInShopTexture[11]->uTextureWidth;
            if ( (signed int)v56 > 457 - v57 )
              v56 = 457 - v57;
          }
        }
        else
        {
          if ( (signed int)v56 < 18 )
            v56 = 18;
        }
        pRenderer->DrawTextureTransparent(v56, v55, v54);
        sub_40F92A(&pRenderer->pActiveZBuffer[v56 + 640 * v55], ItemsInShopTexture[v122 + 6], v122 + 7);
      }
      ++v122;
    }
    while ( v122 < 6 );
  }
  else
  {
    do
    {
     // if ( pParty->field_C59C[9 * (v49 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] )
	if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v49].uItemID)
      {
        v58 = ItemsInShopTexture[v49];
        v59 = 152 - v58->uTextureHeight;
        if ( (signed int)v59 < 1 )
          v59 = 0;
        v60 = 75 * v49 - v58->uTextureWidth / 2 + 40;
        if ( v122 )
        {
          if ( v122 == 5 )
          {
            v61 = ItemsInShopTexture[5]->uTextureWidth;
            if ( (signed int)v60 > 457 - v61 )
              v60 = 457 - v61;
          }
        }
        else
        {
          if ( (signed int)v60 < 18 )
            v60 = 18;
        }
        pRenderer->DrawTextureTransparent(v60, v59, v58);
        sub_40F92A(&pRenderer->pActiveZBuffer[v60 + 640 * v59], ItemsInShopTexture[v122], v122 + 1);
        v49 = v122;
      }
      ++v49;
      v122 = v49;
    }
    while ( v49 < 6 );
    v122 = 0;
    do
    {
      //if ( pParty->Spell_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v49] + 778] )  //weak
		if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v49].uAttributes)
      {
        v62 = ItemsInShopTexture[v122 + 6];
        v63 = 306 - v62->uTextureHeight;
        if ( (signed int)v63 < 1 )
          v63 = 0;
        v64 = 75 * v122 - v62->uTextureWidth / 2 + 40;
        if ( v122 )
        {
          if ( v122 == 5 )
          {
            v65 = ItemsInShopTexture[11]->uTextureWidth;
            if ( (signed int)v64 > 457 - v65 )
              v64 = 457 - v65;
          }
        }
        else
        {
          if ( (signed int)v64 < 18 )
            v64 = 18;
        }
        pRenderer->DrawTextureTransparent(v64, v63, v62);
        sub_40F92A(&pRenderer->pActiveZBuffer[v64 + 640 * v63], ItemsInShopTexture[v122 + 6], v122 + 7);
      }
      ++v122;
    }
    while ( v122 < 6 );
  }
  result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
  if ( result )
  {
    v66 = 0;
    v117 = 0;
    if ( dialog_menu_id == 2 )
    {
      do
      {
        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v66].uItemID); //9 * (v66 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] )
          ++v117;
        ++v66;
      }
      while ( v66 < 12 );
    }
    else
    {
      do
      {
        //if ( pParty->field_C59C[9 * (v66 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] )
	  if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v66].uItemID)
          ++v117;
        ++v66;
      }
      while ( v66 < 12 );
    }
    v67 = GetAsyncKeyState(VK_CONTROL);
    v68 = _this->CanSteal();
    Str = (char *)v68;
    if ( v67 && v68 )
    {
      v69 = pGlobalTXT_LocalizationStrings[185];// "Steal item"
    }
    else
    {
      v69 = pGlobalTXT_LocalizationStrings[195];// "Select the Item to Buy"
      if ( dialog_menu_id != 2 )
        v69 = pGlobalTXT_LocalizationStrings[196];// "Select the Special Item to Buy"
    }
    DrawTextAtStatusBar(v69, 0);
    if ( !v117 )
		{
      dialog_window.DrawCurrentTime( pParty->field_3C.field_50[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed);
	  return;
		}
    v70 = pMouse->GetCursorPos(&v102);
    result = v70->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v100)->y];
    if ( pRenderer->pActiveZBuffer[result] & 0xFFFF )
    {
      v71 = (pRenderer->pActiveZBuffer[result] & 0xFFFF) - 1;
      v117 = v71;
      v72 = (int)window_SpeakInHouse->ptr_1C;
     // v73 = 9 * (v71 + 12 * v72);
      v74 = (ItemGen *)&pParty->StandartItemsInShops[v72][v71];
      if ( dialog_menu_id != 2 )
       // v74 = (ItemGen *)&pParty->field_C59C[v73 + 724];
	      v74 =&pParty->SpecialItemsInShops[v72][v71];
      if ( v67 && Str )
      {
        v10 = pGlobalTXT_LocalizationStrings[181];// "Steal %24"
        v96 = 0;
        v94 = 2;
        v93 = window_SpeakInHouse->ptr_1C;
        v90 = v74;
        v9 = uActiveCharacter - 1;
      }
      else
      {
        v96 = 0;
        v94 = 2;
        v93 = window_SpeakInHouse->ptr_1C;
        v90 = v74;
        uPlayerID = uActiveCharacter - 1;
        v75 = _this->_490EEE(v74, 3, v72, 2);
        v9 = uPlayerID;
        v10 = (char *)pMerchantsBuyPhrases[v75];
      }
      goto LABEL_35;
    }
  }
  return;
}