view GUI/UI/UIHouses.cpp @ 2541:a902abdfc7f2

1. Renamed class Game to class Engine. 2. Separated game logic as state of FSM from game logic as engine. 3. Found out that many UI screen initializers were optimized away, intially they all returned newly created window as separate object like it is done in CharacterUI_Initialize.
author a.parshin
date Sun, 10 May 2015 01:29:11 +0200
parents 1bcadc6dd203
children b6140dfeac27
line wrap: on
line source

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#define _CRT_SECURE_NO_WARNINGS

#include "Engine/Engine.h"

#include "UIGuilds.h"
#include "UIPartyCreation.h"
#include "UIShops.h"
#include "..\../GUI/GUIButton.h"
#include "..\../Engine/SaveLoad.h"
#include "..\../Engine/Graphics/Texture.h"
#include "UIHouses.h"
#include "..\../Engine/Party.h"
#include "..\../Engine/texts.h"
#include "..\../Engine/Events.h"
#include "..\../Arcomage/Arcomage.h"
#include "..\../Engine/LOD.h"
#include "..\../IO/Mouse.h"
#include "..\../GUI/GUIWindow.h"
#include "..\../GUI/GUIFont.h"
#include "..\../Engine/Graphics/Overlays.h"
#include "..\../Engine/Graphics/Outdoor.h"
#include "..\../Media/Audio/AudioPlayer.h"
#include "..\../Media/MediaPlayer.h"
#include "..\../Engine/Objects/Monsters.h"
#include "..\../Engine/Graphics/Viewport.h"
#include "..\../IO/Keyboard.h"
#include "..\../Engine/MapInfo.h"
#include "..\../Engine/Spells/CastSpellInfo.h"

#include "../../Engine/Graphics/Level/Decoration.h"

#include "..\../Engine/stru159.h"
int uHouse_ExitPic; // weak

int dword_591080; // weak

BuildingType in_current_building_type; // 00F8B198
HOUSE_DIALOGUE_MENU dialog_menu_id; // 00F8B19C

#pragma pack(push, 1)
struct stru365_travel_info
{
  unsigned char uMapInfoID;
  unsigned char pSchedule[7];
  unsigned int uTravelTime;
  int arrival_x;
  int arrival_y;
  int arrival_z;
  int arrival_rot_y;
  unsigned int  uQuestBit;  // quest bit required to set for this travel option to be enabled; otherwise 0
};
#pragma pack(pop)
stru365_travel_info transport_schedule[35] =  // 004F09B0
{// location name                              days    x        y       z     
  {MAP_STEADWICK,       {1, 0, 1, 0, 1, 0, 0},  2,  -18048,    4636,   833,  1536,  0},//for stable
  {MAP_PIERPONT,        {0, 1, 0, 1, 0, 1, 0},  2,   -2527,   -6773,  1153,   896,  0},
  {MAP_TATALIA,         {1, 0, 1, 0, 1, 0, 0},  2,    4730,  -10580,   320,  1024,  0},
  {MAP_HARMONDALE,      {0, 1, 0, 1, 0, 1, 0},  2,   -5692,   11137,     1,  1024,  0},
  {MAP_DEYJA,           {1, 0, 0, 1, 0, 0, 0},  3,    7227,  -16007,  2625,   640,  0},
  {MAP_BRAKADA_DESERT,  {0, 0, 1, 0, 0, 1, 0},  3,    8923,   17191,     1,   512,  0},
  {MAP_AVLEE,           {1, 0, 1, 0, 1, 0, 0},  3,   17059,   12331,   512,  1152,  0},
  {MAP_DEYJA,           {0, 1, 0, 0, 1, 0, 1},  2,    7227,  -16007,  2625,   640,  0},
  {MAP_HARMONDALE,      {0, 1, 0, 1, 0, 1, 0},  2,   -5692,   11137,     1,  1024,  0},
  {MAP_STEADWICK,       {1, 0, 1, 0, 1, 0, 0},  3,  -18048,    4636,   833,  1536,  0},
  {MAP_PIERPONT,        {0, 1, 0, 1, 0, 1, 0},  2,   -2527,   -6773,  1153,   896,  0},
  {MAP_STEADWICK,       {1, 0, 1, 0, 1, 0, 1},  3,  -18048,    4636,   833,  1536,  0},
  {MAP_HARMONDALE,      {0, 1, 0, 0, 0, 1, 0},  5,   -5692,   11137,     1,  1024,  0},
  {MAP_STEADWICK,       {0, 1, 0, 1, 0, 1, 0},  2,  -18048,    4636,   833,  1536,  0},
  {MAP_PIERPONT,        {0, 1, 0, 1, 0, 1, 0},  3,   -2527,   -6773,  1153,   896,  0},
  {MAP_DEYJA,           {0, 0, 1, 0, 0, 0, 1},  5,    7227,  -16007,  2625,   640,  0},
  {MAP_TATALIA,         {0, 1, 0, 1, 0, 1, 0},  2,   -2183,   -6941,    97,     0,  0},
  {MAP_AVLEE,           {1, 0, 0, 0, 1, 0, 0},  4,    7913,    9476,   193,     0,  0},
  {MAP_EVENMORN_ISLE,   {0, 0, 0, 0, 0, 0, 1},  7,   15616,    6390,   193,  1536,  PARTY_QUEST_EVENMORN_MAP_FOUND},
  {MAP_BRAKADA_DESERT,  {0, 0, 1, 0, 0, 0, 0},  6,   19171,  -19722,   193,  1024,  0},
  {MAP_AVLEE,           {0, 1, 0, 1, 0, 1, 0},  3,    7913,    9476,   193,     0,  0},
  {MAP_BRAKADA_DESERT,  {1, 0, 1, 0, 0, 0, 0},  6,   19171,  -19722,   193,  1024,  0},
  {MAP_TATALIA,         {1, 0, 1, 0, 1, 0, 0},  4,   -2183,   -6941,    97,     0,  0},
  {MAP_PIERPONT,        {0, 0, 0, 0, 0, 1, 0},  6,    -709,  -14087,   193,  1024,  0},//for boat
  {MAP_STEADWICK,       {0, 0, 0, 0, 0, 0, 1},  6,  -10471,   13497,   193,  1536,  0},
  {MAP_EVENMORN_ISLE,   {0, 1, 0, 1, 0, 0, 0},  1,   15616,    6390,   193,  1536,  PARTY_QUEST_EVENMORN_MAP_FOUND},
  {MAP_BRAKADA_DESERT,  {0, 1, 0, 1, 0, 0, 0},  1,   19171,  -19722,   193,  1024,  0},
  {MAP_STEADWICK,       {0, 1, 0, 1, 0, 1, 0},  2,  -10471,   13497,   193,  1536,  0},
  {MAP_BRAKADA_DESERT,  {1, 0, 1, 0, 0, 0, 0},  4,   19171,  -19722,   193,  1024,  0},
  {MAP_EVENMORN_ISLE,   {0, 0, 0, 0, 0, 0, 1},  5,   15616,    6390,   193,  1536,  PARTY_QUEST_EVENMORN_MAP_FOUND},
  {MAP_AVLEE,           {0, 0, 0, 0, 1, 0, 0},  5,    7913,    9476,   193,     0,  0},
  {MAP_STEADWICK,       {0, 1, 0, 0, 0, 1, 0},  4,  -10471,   13497,   193,  1536,  0},
  {MAP_PIERPONT,        {1, 0, 1, 0, 1, 0, 0},  3,    -709,  -14087,   193,  1024,  0},
  {MAP_TATALIA,         {0, 0, 0, 1, 0, 0, 0},  5,   -2183,   -6941,    97,     0,  0},
  {MAP_ARENA,           {0, 0, 0, 0, 0, 0, 1},  4,    3844,    2906,   193,   512,  0}
};

unsigned char transport_routes[20][4] =
{
  {  0,   1,   1,  34},  // HOUSE_STABLES_HARMONDALE
  {  2,   3,   4,   5},  // HOUSE_STABLES_STEADWICK
  {  6,   7,   8,   8},  // HOUSE_STABLES_TULAREAN_FOREST
  {  9,  10,  10,  10},  // HOUSE_STABLES_DEYJA
  { 11,  11,  12,  12},  // HOUSE_STABLES_BRACADA_DESERT
  { 13,  13,  13,  13},  // HOUSE_STABLES_TATALIA
  { 14,  14,  15,  15},  // HOUSE_STABLES_AVLEE
  {255, 255, 255, 255},  // HOUSE_STABLES_61
  {255, 255, 255, 255},  // HOUSE_STABLES_62
  {255, 255, 255, 255},  // HOUSE_BOATS_EMERALD_ISLE
  { 16,  17,  18,  19},  // HOUSE_BOATS_ERATHIA
  { 18,  20,  21,  21},  // HOUSE_BOATS_TULAREAN_FOREST
  { 22,  23,  24,  25},  // HOUSE_BOATS_BRACADA_DESERT
  { 22,  22,  23,  23},  // HOUSE_BOATS_EVENMORN_ISLAND
  {255, 255, 255, 255},  // HOUSE_BOATS_68
  { 27,  28,  29,  30},  // HOUSE_BOATS_TATALIA
  { 31,  32,  33,  33},  // HOUSE_BOATS_AVLEE
  { 24,  24,  24,  24},  // HOUSE_BOATS_71
  {255, 255, 255, 255},  // HOUSE_BOATS_72
  {255, 255, 255, 255}   // HOUSE_BOATS_73
};

std::array<const stru159, 196> pAnimatedRooms = //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 Tavern 01",       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 },
        {"Dark Guild",                  0x19, 0x2D1, 13, 3, 0 },
        {"Earth Guild",                 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}
}};



//----- (004B3A72) --------------------------------------------------------
void InitializaDialogueOptions_Tavern(BuildingType type)
{
  int num_buttons; // esi@1

  num_buttons = 0;
  if (type == BuildingType_Tavern)
  {
    num_buttons = 2;
    CreateButtonInColumn(0, 102);
    CreateButtonInColumn(1, 103);
    if ( pParty->HasItem(651) ) //Arcomage Deck
    {
      num_buttons = 3;
      CreateButtonInColumn(2, 104);
    }
  }
  pDialogueWindow->_41D08F_set_keyboard_control_group(num_buttons, 1, 0, 2);
  dword_F8B1E0 = pDialogueWindow->pNumPresenceButton;
}
// F8B1E0: using guessed type int dword_F8B1E0;

//----- (004B3AD4) --------------------------------------------------------
void InitializaDialogueOptions_Shops(BuildingType type)
{
  switch (type)
  {
    case BuildingType_WeaponShop:
    case BuildingType_ArmorShop:
    case BuildingType_MagicShop:
    {
      CreateButtonInColumn(0, 3);
      CreateButtonInColumn(1, 4);
      CreateButtonInColumn(2, 5);
      pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
    }
    break;
    
    case BuildingType_AlchemistShop:
    {
      CreateButtonInColumn(0, 3);
      CreateButtonInColumn(1, 4);
      pDialogueWindow->_41D08F_set_keyboard_control_group(2, 1, 0, 2);
    }
    break;
  }

  dword_F8B1E0 = pDialogueWindow->pNumPresenceButton;
}
// F8B1E0: using guessed type int dword_F8B1E0;

//----- (004B3B42) --------------------------------------------------------
void InitializaDialogueOptions(BuildingType type)
{
  switch (type)
  {
    case BuildingType_WeaponShop:
    case BuildingType_ArmorShop:
    case BuildingType_MagicShop:
    case BuildingType_AlchemistShop:
    {
      CreateButtonInColumn(0, 2);
      CreateButtonInColumn(1, 95);
      CreateButtonInColumn(2, 94);
      CreateButtonInColumn(3, 96);
      pDialogueWindow->_41D08F_set_keyboard_control_group(4, 1, 0, 2);
    }
    break;

    case BuildingType_FireGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 48);
      CreateButtonInColumn(2, 72);
      pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
    }
    break;

    case BuildingType_AirGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 49);
      CreateButtonInColumn(2, 72);
      pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
    }
    break;

    case BuildingType_WaterGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 50);
      CreateButtonInColumn(2, 72);
      pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
    }
    break;

    case BuildingType_EarthGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 51);
      CreateButtonInColumn(2, 72);
      pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
    }
    break;

    case BuildingType_SpiritGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 52);
      CreateButtonInColumn(2, 61);
      pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
    }
    break;

    case BuildingType_MindGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 53);
      CreateButtonInColumn(2, 61);
      pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
    }
    break;

    case BuildingType_BodyGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 54);
      CreateButtonInColumn(2, 61);
      pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
    }
    break;

    case BuildingType_LightGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 55);
      pDialogueWindow->_41D08F_set_keyboard_control_group(2, 1, 0, 2);
    }
    break;

    case BuildingType_DarkGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 56);
      pDialogueWindow->_41D08F_set_keyboard_control_group(2, 1, 0, 2);
    }
    break;

    case BuildingType_ElementalGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 48);
      CreateButtonInColumn(2, 49);
      CreateButtonInColumn(3, 50);
      CreateButtonInColumn(4, 51);
      pDialogueWindow->_41D08F_set_keyboard_control_group(5, 1, 0, 2);
    }
    break;

    case BuildingType_SelfGuild:
    {
      CreateButtonInColumn(0, 18);
      CreateButtonInColumn(1, 52);
      CreateButtonInColumn(2, 53);
      CreateButtonInColumn(3, 54);
      pDialogueWindow->_41D08F_set_keyboard_control_group(4, 1, 0, 2);
    }
    break;

    case BuildingType_16:
    case BuildingType_TownHall:
    {
      int num_buttons = 1;
      CreateButtonInColumn(0, 99);

      if (pParty->uFine)
      {
        num_buttons++;
        CreateButtonInColumn(1, 100);
      }

      pDialogueWindow->_41D08F_set_keyboard_control_group(num_buttons, 1, 0, 2);
    }
    break;

    case BuildingType_Bank:
    {
      CreateButtonInColumn(0, 7);
      CreateButtonInColumn(1, 8);
      pDialogueWindow->_41D08F_set_keyboard_control_group(2, 1, 0, 2);
    }
    break;

    case BuildingType_Temple:
    {
      CreateButtonInColumn(0, 10);
      CreateButtonInColumn(1, 11);
      CreateButtonInColumn(2, 96);
      pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
    }
    break;

    case BuildingType_Stables:
    case BuildingType_Boats:
    {
      CreateButtonInColumn(0, 105);
      CreateButtonInColumn(1, 106);
      CreateButtonInColumn(2, 107);
      CreateButtonInColumn(3, 108);
      pDialogueWindow->_41D08F_set_keyboard_control_group(4, 1, 0, 2);
    }
    break;

    case BuildingType_Training:
    {
      CreateButtonInColumn(0, 17);
      CreateButtonInColumn(1, 96);
      pDialogueWindow->_41D08F_set_keyboard_control_group(2, 1, 0, 2);
    }
    break;

    case BuildingType_Tavern:
    {
      CreateButtonInColumn(0, 15);
      CreateButtonInColumn(1, 16);
      CreateButtonInColumn(2, 96);
      if ( (signed int)window_SpeakInHouse->ptr_1C < 108 || (signed int)window_SpeakInHouse->ptr_1C > 120 )
      {
        pDialogueWindow->_41D08F_set_keyboard_control_group(3, 1, 0, 2);
        break;
      }
      CreateButtonInColumn(3, 101);
      pDialogueWindow->_41D08F_set_keyboard_control_group(4, 1, 0, 2);
    }
    break;

    case BuildingType_18:
    case BuildingType_19:
    case BuildingType_Throne_Room:
    case BuildingType_24:
    case BuildingType_Unic:
    case BuildingType_1A:
    case BuildingType_House:
    case BuildingType_Jail:
      break;

    default:
      Error("Invalid enumeration value: %u", type);
  }

/*  if ( a1 > 13 )
  {
    if ( a1 > 22 )
    {
      if ( a1 == 23 )
      {
        CreateButtonInColumn(0, 0xAu);
        CreateButtonInColumn(1, 0xBu);
        v14 = 96;
LABEL_41:
        CreateButtonInColumn(2, v14);
        v17 = 2;
        v11 = 0;
        v10 = 1;
        v9 = 3;
        goto LABEL_42;
      }
      if ( a1 <= 26 )
        goto LABEL_43;
      if ( a1 > 28 )
      {
        if ( a1 != 30 )
          goto LABEL_43;
        CreateButtonInColumn(0, 0x11u);
        v16 = 96;
        goto LABEL_37;
      }
      CreateButtonInColumn(0, 0x69u);
      CreateButtonInColumn(1, 0x6Au);
      CreateButtonInColumn(2, 0x6Bu);
      v12 = 108;
    }
    else
    {
      if ( a1 == 22 )
      {
        CreateButtonInColumn(0, 7u);
        v16 = 8;
        goto LABEL_37;
      }
      v1 = a1 - 14;
      if ( !v1 ) // == 14
      {
        CreateButtonInColumn(0, 0x12u);
        CreateButtonInColumn(1, 0x30u);
        CreateButtonInColumn(2, 0x31u);
        CreateButtonInColumn(3, 0x32u);
        CreateButtonInColumn(4, 0x33u);
        v17 = 2;
        v11 = 0;
        v10 = 1;
        v9 = 5;
        goto LABEL_42;
      }
      v2 = v1 - 1;
      if ( v2 ) // > 15
      {
        v3 = v2 - 2;
        if ( v3 ) // > 17
        {
          if ( v3 != 4 ) // 18, 19, 20
            goto LABEL_43;
          CreateButtonInColumn(0, 0xFu); // 21
          CreateButtonInColumn(1, 0x10u);
          v4 = 3;
          CreateButtonInColumn(2, 0x60u);
          v5 = (signed int)window_SpeakInHouse->ptr_1C;
          if ( v5 < 108 || v5 > 120 )
            goto LABEL_28;
          v4 = 4;
          v6 = 101;
          v7 = 3;
        }
        else // 16, 17
        {
          v4 = 1;
          CreateButtonInColumn(0, 0x63u);
          if ( !pParty->uFine )
          {
LABEL_28:
            v17 = 2;
            v11 = 0;
            v10 = 1;
            v9 = v4;
LABEL_42:
            pDialogueWindow->_41D08F_set_keyboard_control_group(v9, v10, v11, v17);
            goto LABEL_43;
          }
          v4 = 2;
          v7 = 1;
          v6 = 100;
        }
        CreateButtonInColumn(v7, v6);
        goto LABEL_28;
      }
      CreateButtonInColumn(0, 0x12u); // 15
      CreateButtonInColumn(1, 0x34u);
      CreateButtonInColumn(2, 0x35u);
      v12 = 54;
    }
LABEL_39:
    CreateButtonInColumn(3, v12);
    v17 = 2;
    v11 = 0;
    v10 = 1;
    v9 = 4;
    goto LABEL_42;
  }
  if ( a1 == 13 )
  {
    CreateButtonInColumn(0, 0x12u);
    v16 = 56;
LABEL_37:
    CreateButtonInColumn(1, v16);
    v17 = 2;
    v11 = 0;
    v10 = 1;
    v9 = 2;
    goto LABEL_42;
  }
  switch ( a1 )
  {
    case 1:
    case 2:
    case 3:
    case 4:
      CreateButtonInColumn(0, 2u);
      CreateButtonInColumn(1, 0x5Fu);
      CreateButtonInColumn(2, 0x5Eu);
      v12 = 96;
      goto LABEL_39;
    case 5:
      CreateButtonInColumn(0, 0x12u);
      v13 = 48;
      goto LABEL_9;
    case 6:
      CreateButtonInColumn(0, 0x12u);
      v13 = 49;
      goto LABEL_9;
    case 7:
      CreateButtonInColumn(0, 0x12u);
      v13 = 50;
      goto LABEL_9;
    case 8:
      CreateButtonInColumn(0, 0x12u);
      v13 = 51;
LABEL_9:
      CreateButtonInColumn(1, v13);
      v14 = 72;
      goto LABEL_41;
    case 9:
      CreateButtonInColumn(0, 0x12u);
      v15 = 52;
      goto LABEL_13;
    case 10:
      CreateButtonInColumn(0, 0x12u);
      v15 = 53;
      goto LABEL_13;
    case 11:
      CreateButtonInColumn(0, 0x12u);
      v15 = 54;
LABEL_13:
      CreateButtonInColumn(1, v15);
      v14 = 61;
      goto LABEL_41;
    case 12:
      CreateButtonInColumn(0, 0x12u);
      v16 = 55;
      goto LABEL_37;
    default:
      break;
  }
LABEL_43:*/
  dword_F8B1E0 = pDialogueWindow->pNumPresenceButton;
}
// F8B1E0: using guessed type int dword_F8B1E0;


//----- (004B1784) --------------------------------------------------------
bool  HouseUI_CheckIfPlayerCanInteract()
{
  GUIWindow window; // [sp+4h] [bp-54h]@3

  if ( pPlayers[uActiveCharacter]->CanAct() )
  {
    pDialogueWindow->pNumPresenceButton = dword_F8B1E0;
    return true;
  }
  else
  {
    pDialogueWindow->pNumPresenceButton = 0;
    memcpy(&window, pPrimaryWindow, sizeof(window));
    window.uFrameX = 483;
    window.uFrameWidth = 148;
    window.uFrameZ = 334;
    sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[427], pPlayers[uActiveCharacter]->pName,
              pGlobalTXT_LocalizationStrings[562]); // "%s is in no condition to %s""do anything"
    window.DrawTitleText(pFontArrus, 0, (212 - pFontArrus->CalcTextHeight(pTmpBuf.data(), &window, 0, 0)) / 2 + 101, ui_house_player_cant_interact_color, pTmpBuf.data(), 3);
    return false;
  }
}

//----- (0044622E) --------------------------------------------------------
bool EnterHouse(enum HOUSE_ID uHouseID)
{
	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
//	int v11; // ecx@17
//	unsigned int v12; // kr00_4@25
//	int v14; // eax@25
	unsigned int v17; // eax@37
	signed int v18; // edi@37
	signed int v19; // edi@41
	char pContainer[40]; // [sp+Ch] [bp-30h]@32
//	unsigned int v24; // [sp+34h] [bp-8h]@5

	GameUI_Footer_TimedString[0] = 0;
	pFooterString[0] = 0;
	ShowStatusBarString("", 2);
	if ( pMessageQueue_50CBD0->uNumMessages )
		pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
	viewparams->bRedrawGameUI = 1;
	uDialogueType = 0;
	pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_CANCELLED);
	pKeyActionMap->ResetKeys();
	if (uHouseID == HOUSE_600 || uHouseID == HOUSE_601)
		{
		GameOverMenu(0);
		return 0;
		}
	uOpenTime = p2DEvents[uHouseID - 1].uOpenTime;
	uCloseTime = p2DEvents[uHouseID - 1].uCloseTime;
	current_npc_text = 0;
	dword_F8B1E4 = 0;
	memset(byte_F8B1F0.data(), 0, 4);
	memset(player_levels.data(), 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.data(), 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.data(), 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->PartyTimes._shop_ban_times[uHouseID])
				||  (pParty->PartyTimes._shop_ban_times[uHouseID] <= pParty->uTimePlayed) )
				{
				pParty->PartyTimes._shop_ban_times[uHouseID] = 0;
				}
			else
				{
				ShowStatusBarString(pGlobalTXT_LocalizationStrings[191], 2u);// "You've been banned from this shop!"
				return 0;
				}
			}
        pAudioPlayer->StopChannels(-1, -1);

		uCurrentHouse_Animation = p2DEvents[uHouseID - 1].uAnimationID;
		in_current_building_type = (BuildingType)pAnimatedRooms[uCurrentHouse_Animation].uBuildingType;
		if ( in_current_building_type == BuildingType_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 = (BuildingType)pAnimatedRooms[p2DEvents[HOUSE_LORD_AND_JUDGE_EMERALD_ISLE].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: Error("Invalid alignment type: %u", pParty->alignment);
        }

		v17 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
		pDialogueNPCCount = 0;
		pTexture_Dialogue_Background = &pIcons_LOD->pTextures[v17];
		uTextureID_right_panel_loop = uTextureID_right_panel;
		PrepareHouse(uHouseID);
		v18 = 1;
		uTextureID_right_panel_loop = uTextureID_right_panel;
		if ( uNumDialogueNPCPortraits == 1 )
			pDialogueNPCCount = 1;
		pMediaPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
		dword_5C35D4 = 1;
		if ( (signed int)uHouseID < 139 || (signed int)uHouseID > 172 )
        {
			if ( (signed int)uHouseID >= HOUSE_STABLES_HARMONDALE && (signed int)uHouseID <= 73 && !IsTravelAvailable(uHouseID - HOUSE_STABLES_HARMONDALE) )
            {
              return 1;
            }
        }
		else
		{ //guilds
			v19 = guild_mambership_flags[uHouseID - HOUSE_FIRE_GUILD_INITIATE_EMERALD_ISLE]; //guilds flags 
			//v20 = uHouseID;
			//if ( !((unsigned __int8)(0x80u >> v19 % 8) & pPlayers[uActiveCharacter]->_guilds_member_bits[v19 /8]) )
			if(!_449B57_test_bit(pPlayers[uActiveCharacter]->_achieved_awards_bits,v19))
            {
				PlayHouseSound(uHouseID, HouseSound_Greeting_2);
				return 1;
            }
		}
		PlayHouseSound(uHouseID, HouseSound_Greeting);
		dword_5C35D4 = 1;
		return 1;
		}
	}

//----- (0044606A) --------------------------------------------------------
void PrepareHouse(HOUSE_ID house)
{
  __int16 uExitMapID; // ax@2
//  int v7; // ebx@11
//  int v13; // [sp+30h] [bp-30h]@11
  int npc_id_arr[6]; // [sp+34h] [bp-2Ch]@1
  int uAnimationID; // [sp+50h] [bp-10h]@1


  uAnimationID = p2DEvents[house - 1].uAnimationID;
  memset(npc_id_arr, 0, sizeof(npc_id_arr));
  uNumDialogueNPCPortraits = 0;
  uHouse_ExitPic = p2DEvents[house - 1].uExitPicID;
  if ( uHouse_ExitPic )
  {
    uExitMapID = p2DEvents[house - 1]._quest_related;
    if ( uExitMapID > 0 )
    {
	  if(_449B57_test_bit(pParty->_quest_bits,uExitMapID))
      {
        uHouse_ExitPic = 0;
      }
    }
  }

  dword_591080 = pAnimatedRooms[uAnimationID].house_npc_id;
  HouseNPCData[0]=0;
  uNumDialogueNPCPortraits = 0;
  if ( dword_591080 )
  {

    npc_id_arr[0] = dword_591080;
    uNumDialogueNPCPortraits = 1;
  }

  for (uint i = 1; i < pNPCStats->uNumNewNPCs; ++i)
  {
    if (pNPCStats->pNewNPCData[i].Location2D == house )
    {
      if (!(pNPCStats->pNewNPCData[i].uFlags & 0x80))
      {
        HouseNPCData[uNumDialogueNPCPortraits+1-((dword_591080 != 0) ? 1 : 0) ] = &pNPCStats->pNewNPCData[i];     
        npc_id_arr[uNumDialogueNPCPortraits] = pNPCStats->pNewNPCData[i].uPortraitID;
         ++uNumDialogueNPCPortraits;
        if ((pNPCStats->pNewNPCData[i].uFlags & 3) != 2)
          ++pNPCStats->pNewNPCData[i].uFlags;
      }
    }

  }

  for (int i = 0; i < uNumDialogueNPCPortraits; ++i)
  {
   
    char icon_name[128];
    sprintfex(icon_name, "npc%03u", npc_id_arr[i]);
    pDialogueNPCPortraits[i] = pIcons_LOD->LoadTexturePtr(icon_name, TEXTURE_16BIT_PALETTE);
  }

  if (uHouse_ExitPic)
  {
    pDialogueNPCPortraits[uNumDialogueNPCPortraits] = pIcons_LOD->LoadTexturePtr(pHouse_ExitPictures[uHouse_ExitPic], TEXTURE_16BIT_PALETTE);
    ++uNumDialogueNPCPortraits;
    uHouse_ExitPic = p2DEvents[house - 1].uExitMapID;
  }
}
//----- (004B1E92) --------------------------------------------------------
void PlayHouseSound(unsigned int uHouseID, HouseSoundID sound)
{
  if ( pAnimatedRooms[p2DEvents[uHouseID].uAnimationID].uRoomSoundId )
    pAudioPlayer->PlaySound((SoundID)(sound + 100 * (pAnimatedRooms[p2DEvents[uHouseID].uAnimationID].uRoomSoundId + 300)),
        806, 0, -1, 0, 0, 0, 0);
}

//----- (004BCACC) --------------------------------------------------------
void __fastcall OnSelectShopDialogueOption(signed int uMessageParam)
{
  int experience_for_next_level; // eax@5
  int v16; // eax@32
  __int16 v24; // ax@163
  signed int v36; // esi@227
  int pPrice; // ecx@227

  if ( !pDialogueWindow->pNumPresenceButton )
    return;
  pRenderer->ClearZBuffer(0, 479);
  if (dialog_menu_id == HOUSE_DIALOGUE_MAIN)
  {
    if ( in_current_building_type == BuildingType_Training )
    {
      if ( uMessageParam == HOUSE_DIALOGUE_TRAININGHALL_TRAIN )
      {
        experience_for_next_level = 0;
        if ( pPlayers[uActiveCharacter]->uLevel > 0 )
        {
          for( uint i = 0; i < pPlayers[uActiveCharacter]->uLevel; i++ )
            experience_for_next_level += i + 1;
        }
        if (pPlayers[uActiveCharacter]->uLevel < pMaxLevelPerTrainingHallType[(unsigned int)window_SpeakInHouse->ptr_1C - 89] &&
          (signed __int64)pPlayers[uActiveCharacter]->uExperience < 1000 * experience_for_next_level)//test experience
        return;
      }
      pDialogueWindow->Release();
      pDialogueWindow = GUIWindow::Create(0, 0, window->GetWidth(), 345, WINDOW_MainMenu, 0, 0);
      pBtn_ExitCancel = pDialogueWindow->CreateButton(526, 445, 75, 33, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[74],// "End Conversation"
                                                       pIcons_LOD->GetTexture(uTextureID_BUTTDESC2), 0);
      pDialogueWindow->CreateButton(8, 8, 450, 320, 1, 0, UIMSG_BuyInShop_Identify_Repair, 0, 0, "", nullptr);
    }
    if ( in_current_building_type != BuildingType_Training )
    {
      if ((in_current_building_type == BuildingType_Stables || in_current_building_type == BuildingType_Boats) &&
           transport_schedule[transport_routes[(unsigned int)window_SpeakInHouse->ptr_1C - HOUSE_STABLES_HARMONDALE][uMessageParam - HOUSE_DIALOGUE_TRANSPORT_SCHEDULE_1]].pSchedule[pParty->uDaysPlayed % 7]
          || in_current_building_type != BuildingType_Temple || uMessageParam != BuildingType_MindGuild )
      {
        pDialogueWindow->Release();
        pDialogueWindow = GUIWindow::Create(0, 0, window->GetWidth(), 345, WINDOW_MainMenu, 0, 0);
        pBtn_ExitCancel = pDialogueWindow->CreateButton(526, 445, 75, 33, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[74],// "End Conversation"
                                                         pIcons_LOD->GetTexture(uTextureID_BUTTDESC2), 0);
        pDialogueWindow->CreateButton(8, 8, 450, 320, 1, 0, UIMSG_BuyInShop_Identify_Repair, 0, 0, "", nullptr);
      }
      else if (uActiveCharacter)
      {
        if ( !pPlayers[uActiveCharacter]->IsPlayerHealableByTemple() )
          return;
      }
    }
    dialog_menu_id = (HOUSE_DIALOGUE_MENU)uMessageParam;
    if ( in_current_building_type < BuildingType_19 )
      ShopTexture = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(off_4F03B8[(int)in_current_building_type], TEXTURE_16BIT_PALETTE)];
  }
  
  //NEW
  switch (in_current_building_type)
  {
    case BuildingType_FireGuild:
    case BuildingType_AirGuild:
    case BuildingType_WaterGuild:
    case BuildingType_EarthGuild:
    case BuildingType_SpiritGuild:
    case BuildingType_MindGuild:
    case BuildingType_BodyGuild:
    case BuildingType_LightGuild:
    case BuildingType_DarkGuild:
    case BuildingType_ElementalGuild:
    case BuildingType_SelfGuild:
    case BuildingType_16:
    {
      if ( pParty->PartyTimes.Shops_next_generation_time[window_SpeakInHouse->par1C - 139] >= (signed __int64)pParty->uTimePlayed )
      {
        for ( uint i = 0; i < 12; ++i )
        {
          if ( pParty->SpellBooksInGuilds[window_SpeakInHouse->par1C - 139][i].uItemID )
            ItemsInShopTexture[i] = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pParty->SpellBooksInGuilds[window_SpeakInHouse->par1C - 139][i].GetIconName(), TEXTURE_16BIT_PALETTE)];
        }
      }
      else//generation new books
      {
        SpellBookGenerator();
        pParty->PartyTimes.Shops_next_generation_time[window_SpeakInHouse->par1C - 139] = pParty->uTimePlayed + (signed __int64)((double)(0xA8C000
                                  * (signed int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].field_1C) * 0.033333335);
      }
      break;
    }
    case BuildingType_TownHall:
    {
      if ( uMessageParam == HOUSE_DIALOGUE_TOWNHALL_MESSAGE )
      {
        if ( pParty->PartyTimes.bountyHunting_next_generation_time[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] < (signed __int64)pParty->uTimePlayed )//new generation
        {
          pParty->monster_for_hunting_killed[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = false;
          pParty->PartyTimes.bountyHunting_next_generation_time[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = (signed __int64)((double)(309657600 * (pParty->uCurrentMonth + 12i64 * pParty->uCurrentYear - 14015)) * 0.033333335);
          pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = rand() % 258 + 1;
          v16 = (int)((char *)window_SpeakInHouse->ptr_1C - 102);
          if ( !v16 )
          {
            while ( 1 )
            {
              v24 = pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)];
              if ( (unsigned __int16)v24 < 115 || (unsigned __int16)v24 > 132 )
              {
                if ( ((unsigned __int16)v24 < 235 || (unsigned __int16)v24 > 252)
                  && ((unsigned __int16)v24 < 133 || (unsigned __int16)v24 > 150)
                  && ((unsigned __int16)v24 < 0x97u || (unsigned __int16)v24 > 0xBAu)
                  && ((unsigned __int16)v24 < 0xBEu || (unsigned __int16)v24 > 0xC0u)
                  && ((unsigned __int16)v24 < 0xC4u || (unsigned __int16)v24 > 0xC6u)
                  && ((unsigned __int16)v24 < 0x2Bu || (unsigned __int16)v24 > 0x2Du)
                  && ((unsigned __int16)v24 < 0xCDu || (unsigned __int16)v24 > 0xCFu)
                  && ((unsigned __int16)v24 < 0x5Eu || (unsigned __int16)v24 > 0x60u)
                  && ((unsigned __int16)v24 < 0xFDu || (unsigned __int16)v24 > 0xFFu)
                  && ((unsigned __int16)v24 < 0x6Du || (unsigned __int16)v24 > 0x6Fu)
                  && ((unsigned __int16)v24 < 0x61u || (unsigned __int16)v24 > 0x63u) )
                  break;
              }
              pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = rand() % 258 + 1;
            }
          }
          if ( v16 == 1 )
          {
            while ( 1 )
            {
              v24 = pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)];
              if ( (unsigned __int16)v24 < 115 || (unsigned __int16)v24 > 132 )
              {
                if ( ((unsigned __int16)v24 < 0xE8u || (unsigned __int16)v24 > 0xF9u)
                  && ((unsigned __int16)v24 < 0x85u || (unsigned __int16)v24 > 0x96u)
                  && ((unsigned __int16)v24 < 0x97u || (unsigned __int16)v24 > 0xBAu)
                  && ((unsigned __int16)v24 < 0xBEu || (unsigned __int16)v24 > 0xC0u)
                  && ((unsigned __int16)v24 < 0xC4u || (unsigned __int16)v24 > 0xC6u)
                  && ((unsigned __int16)v24 < 0x2Bu || (unsigned __int16)v24 > 0x2Du)
                  && ((unsigned __int16)v24 < 0x52u || (unsigned __int16)v24 > 0x54u)
                  && ((unsigned __int16)v24 < 4 || (unsigned __int16)v24 > 6)
                  && ((unsigned __int16)v24 < 0x37u || (unsigned __int16)v24 > 0x39u)
                  && ((unsigned __int16)v24 < 0x3Au || (unsigned __int16)v24 > 0x3Cu)
                  && ((unsigned __int16)v24 < 0x3Du || (unsigned __int16)v24 > 0x3Fu)
                  && ((unsigned __int16)v24 < 0xFDu || (unsigned __int16)v24 > 0xFFu)
                  && ((unsigned __int16)v24 < 0x61u || (unsigned __int16)v24 > 0x63u)
                  && ((unsigned __int16)v24 < 0xCDu || (unsigned __int16)v24 > 0xCFu) )
                  break;
              }
              pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = rand() % 258 + 1;
            }
          }
          if ( v16 == 2 )
          {
            while ( 1 )
            {
              v24 = pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)];
              if ( (unsigned __int16)v24 < 0x73u || (unsigned __int16)v24 > 0x84u )
              {
                if ( ((unsigned __int16)v24 < 0xE8u || (unsigned __int16)v24 > 0xF9u)
                  && ((unsigned __int16)v24 < 0x85u || (unsigned __int16)v24 > 0x96u)
                  && ((unsigned __int16)v24 < 0x97u || (unsigned __int16)v24 > 0xBAu)
                  && ((unsigned __int16)v24 < 0xBEu || (unsigned __int16)v24 > 0xC0u)
                  && ((unsigned __int16)v24 < 0xC4u || (unsigned __int16)v24 > 0xC6u)
                  && ((unsigned __int16)v24 < 0x2Bu || (unsigned __int16)v24 > 0x2Du)
                  && ((unsigned __int16)v24 < 0x31u || (unsigned __int16)v24 > 0x33u)
                  && ((unsigned __int16)v24 < 0x34u || (unsigned __int16)v24 > 0x36u)
                  && ((unsigned __int16)v24 < 0xFDu || (unsigned __int16)v24 > 0xFFu)
                  && ((unsigned __int16)v24 < 0x61u || (unsigned __int16)v24 > 0x63u)
                  && ((unsigned __int16)v24 < 0x1Cu || (unsigned __int16)v24 > 0x1Eu) )
                  break;
              }
              pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = rand() % 258 + 1;
            }
          }
          if ( v16 == 3 )
          {
            while ( 1 )
            {
              v24 = pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)];
              if ( (unsigned __int16)v24 < 0x73u || (unsigned __int16)v24 > 0x84u )
              {
                if ( ((unsigned __int16)v24 < 0xE8u || (unsigned __int16)v24 > 0xF9u)
                  && ((unsigned __int16)v24 < 0x85u || (unsigned __int16)v24 > 0x96u)
                  && ((unsigned __int16)v24 < 0x97u || (unsigned __int16)v24 > 0xBAu)
                  && ((unsigned __int16)v24 < 0xBEu || (unsigned __int16)v24 > 0xC0u)
                  && ((unsigned __int16)v24 < 0xC4u || (unsigned __int16)v24 > 0xC6u)
                  && ((unsigned __int16)v24 < 0x2Bu || (unsigned __int16)v24 > 0x2Du)
                  && ((unsigned __int16)v24 < 0x5Eu || (unsigned __int16)v24 > 0x60u)
                  && ((unsigned __int16)v24 < 0x43u || (unsigned __int16)v24 > 0x45u)
                  && ((unsigned __int16)v24 < 0x4Fu || (unsigned __int16)v24 > 0x51u)
                  && ((unsigned __int16)v24 < 0xC1u || (unsigned __int16)v24 > 0xC3u)
                  && ((unsigned __int16)v24 < 0x13u || (unsigned __int16)v24 > 0x15u)
                  && ((unsigned __int16)v24 < 0xFDu || (unsigned __int16)v24 > 0xFFu)
                  && ((unsigned __int16)v24 < 0x61u || (unsigned __int16)v24 > 0x63u)
                  && ((unsigned __int16)v24 < 0x6Au || (unsigned __int16)v24 > 0x6Cu) )
                  break;
              }
              pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = rand() % 258 + 1;
            }
          }
          if ( v16 == 4 )
          {
            while ( 1 )
            {
              v24 = pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)];
              if ( (unsigned __int16)v24 < 0x73u || (unsigned __int16)v24 > 0x84u )
              {
                if ( ((unsigned __int16)v24 < 0xE8u || (unsigned __int16)v24 > 0xF9u)
                  && ((unsigned __int16)v24 < 0x85u || (unsigned __int16)v24 > 0x96u)
                  && ((unsigned __int16)v24 < 0x97u || (unsigned __int16)v24 > 0xBAu)
                  && ((unsigned __int16)v24 < 0xBEu || (unsigned __int16)v24 > 0xC0u)
                  && ((unsigned __int16)v24 < 0xC4u || (unsigned __int16)v24 > 0xC6u)
                  && ((unsigned __int16)v24 < 0x2Bu || (unsigned __int16)v24 > 0x2Du)
                  && ((unsigned __int16)v24 < 0x6Du || (unsigned __int16)v24 > 0x6Fu)
                  && ((unsigned __int16)v24 < 0x46u || (unsigned __int16)v24 > 0x48u)
                  && ((unsigned __int16)v24 < 0x100u || (unsigned __int16)v24 > 0x102u)
                  && ((unsigned __int16)v24 < 0xD9u || (unsigned __int16)v24 > 0xDBu)
                  && ((unsigned __int16)v24 < 0xC7u || (unsigned __int16)v24 > 0xC9u)
                  && ((unsigned __int16)v24 < 0xE5u || (unsigned __int16)v24 > 0xE7u)
                  && ((unsigned __int16)v24 < 0xDFu || (unsigned __int16)v24 > 0xE1u)
                  && ((unsigned __int16)v24 < 0x5Bu || (unsigned __int16)v24 > 0x5Du)
                  && ((unsigned __int16)v24 < 0x49u || (unsigned __int16)v24 > 0x4Bu)
                  && ((unsigned __int16)v24 < 0xFDu || (unsigned __int16)v24 > 0xFFu)
                  && ((unsigned __int16)v24 < 0x61u || (unsigned __int16)v24 > 0x63u)
                  && ((unsigned __int16)v24 < 0x10u || (unsigned __int16)v24 > 0x12u) )
                  break;
              }
              pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = rand() % 258 + 1;
            }
          }
        }
        bountyHunting_monster_id_for_hunting = pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)];
        if ( !pParty->monster_for_hunting_killed[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] )
        {
          bountyHunting_text = pNPCTopics[351].pText;//"В этом месяцу назначена награда за голову %s..."
          if ( !pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] )
            bountyHunting_text = pNPCTopics[353].pText;//"Кое кто уже приходил в этом месяце за наградой"
        }
        else
        {
          if ( pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] > 0 )//get prize
          {
            pParty->PartyFindsGold(100 * pMonsterStats->pInfos[(unsigned __int16)pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)]].uLevel, 0);
            for ( uint i = 0; i < 4; ++i )
              pParty->pPlayers[i].SetVariable(VAR_Award, 86);
            pParty->uNumBountiesCollected += 100 * pMonsterStats->pInfos[pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)]].uLevel;
            pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = 0;
            pParty->monster_for_hunting_killed[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = false;
          }
          bountyHunting_text = pNPCTopics[352].pText;//"Поздравляю! Вы успешно..."
        }
      }
      else if ( uMessageParam == HOUSE_DIALOGUE_TOWNHALL_PAY_FINE )
        pKeyActionMap->EnterText(1, 10, window_SpeakInHouse);
      break;
    }
    case BuildingType_Bank:
    {
      if ( dialog_menu_id >= 7 && dialog_menu_id <= 8 )
        pKeyActionMap->EnterText(1, 10, window_SpeakInHouse);
      return;
      break;
    }
    case BuildingType_WeaponShop:
    case BuildingType_ArmorShop:
    case BuildingType_MagicShop:
    case BuildingType_AlchemistShop:
    case BuildingType_Tavern:
    case BuildingType_Temple:
    case BuildingType_Training:
    {
      break;
    }
    default:
    {
      return;
      break;
    }
  }

  switch ( uMessageParam )
  {
    case HOUSE_DIALOGUE_LEARN_SKILLS:
    {
      pDialogueWindow->eWindowType = WINDOW_MainMenu;
      UI_CreateEndConversationButton();
      FillAviableSkillsToTeach(in_current_building_type);
      break;
    }
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN:
    {
      pDialogueWindow->eWindowType = WINDOW_MainMenu;
      UI_CreateEndConversationButton();
      InitializaDialogueOptions_Tavern(in_current_building_type);
      break;
    }
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RULES:
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_VICTORY_CONDITIONS:
    {
      dialog_menu_id = (HOUSE_DIALOGUE_MENU)uMessageParam;
      break;
    }
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RESULT:
    {
      pMessageQueue_50CBD0->AddGUIMessage(UIMSG_PlayArcomage, 0, 0);
      dialog_menu_id = HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RESULT;
      break;
    }
    case HOUSE_DIALOGUE_SHOP_BUY_STANDARD:
    case HOUSE_DIALOGUE_SHOP_BUY_SPECIAL:
    {
      if ( pParty->PartyTimes.Shops_next_generation_time[(unsigned int)window_SpeakInHouse->ptr_1C] < (signed __int64)pParty->uTimePlayed )
      {
        GenerateStandartShopItems();
        GenerateSpecialShopItems();
        pParty->PartyTimes.Shops_next_generation_time[window_SpeakInHouse->par1C] = pParty->uTimePlayed + (signed __int64)((double)(11059200 * (signed int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].field_1C) * 0.033333335);
      }
      if ( uMessageParam == HOUSE_DIALOGUE_SHOP_BUY_STANDARD )
      {
        if ( uItemsAmountPerShopType[p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType] )
        {
          for ( uint i = 0; i < (unsigned __int8)uItemsAmountPerShopType[p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType]; ++i )
          {
            if ( pParty->StandartItemsInShops[(int)window_SpeakInHouse->ptr_1C][i].uItemID )
              ItemsInShopTexture[i] = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pParty->StandartItemsInShops[(int)window_SpeakInHouse->ptr_1C][i].GetIconName(), TEXTURE_16BIT_PALETTE)];
          }
        }
        if ( in_current_building_type == BuildingType_WeaponShop )
        {
          if ( uItemsAmountPerShopType[p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType] )
          {
            for ( uint i = 0; i < (unsigned __int8)uItemsAmountPerShopType[p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType]; ++i )
            {
              if ( pParty->StandartItemsInShops[(int)window_SpeakInHouse->ptr_1C][i].uItemID)
                weapons_Ypos[i] = rand() % (300 - ItemsInShopTexture[i]->uTextureHeight);
            }
          }
        }
      }
      if ( uMessageParam == HOUSE_DIALOGUE_SHOP_BUY_SPECIAL )
      {
        if ( uItemsAmountPerShopType[p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType] )
        {
          for ( uint i = 0; i < (unsigned __int8)uItemsAmountPerShopType[p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType]; ++i )
          {
            if ( pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID )
              ItemsInShopTexture[i] = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].GetIconName(), TEXTURE_16BIT_PALETTE)];
          }
        }
        if ( in_current_building_type == BuildingType_WeaponShop )
        {
          if ( uItemsAmountPerShopType[p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType] )
          {
            for ( uint i = 0; i < (unsigned __int8)uItemsAmountPerShopType[p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType]; ++i )
            {
              if (pParty->SpecialItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][i].uItemID)
                weapons_Ypos[i] = rand() % (300 - ItemsInShopTexture[i]->uTextureHeight);
            }
          }
        }
      }
      break;
    }
    case HOUSE_DIALOGUE_SHOP_SELL:
    case HOUSE_DIALOGUE_SHOP_IDENTIFY:
    case HOUSE_DIALOGUE_SHOP_REPAIR:
    {
      dialog_menu_id = (HOUSE_DIALOGUE_MENU)uMessageParam;
      pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
      break;
    }
    case HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT:
    {
      pDialogueWindow->eWindowType = WINDOW_MainMenu;
      UI_CreateEndConversationButton();
      InitializaDialogueOptions_Shops(in_current_building_type);
      break;
    }
    default:
    {
      if( uMessageParam >= HOUSE_DIALOGUE_36 && uMessageParam <= HOUSE_DIALOGUE_GUILD_LEARN_SKILL )
      {
        v36 = (signed __int64)(p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
        pPrice = v36 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
        if ( pPrice < v36 / 3 )
        pPrice = v36 / 3;
        if(byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][uMessageParam - 36])
        {
          if ( !pPlayers[uActiveCharacter]->pActiveSkills[uMessageParam - 36] )
          {
            if ( pParty->uNumGold < pPrice )
            {
              ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);
              if ( in_current_building_type == BuildingType_Training || in_current_building_type == BuildingType_Tavern )
                PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_Goodbye);
              else
                PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
            }
            else
            {
              Party::TakeGold(pPrice);
              dword_F8B1E4 = 1;
              pPlayers[uActiveCharacter]->pActiveSkills[uMessageParam - 36] = 1;
              pPlayers[uActiveCharacter]->PlaySound(SPEECH_78, 0);
            }
          }
        }
      }
      break;
    }
  }
}
//----- (004B6943) --------------------------------------------------------
void  TravelByTransport()
{
  signed int v4; // ebx@1
  stru365_travel_info *pTravel; // esi@7
  signed int v12; // esi@13
  signed int v13; // edi@14
  DWORD v14; // eax@26
  DWORD v15; // edi@26
  int pTextHeight; // eax@36
  int pRealTextHeight; // esi@36
  int schedule_id; // esi@39
  GUIButton *pButton; // ebx@39
  signed int v25; // eax@41
  MapInfo pMap; // [sp-3Ch] [bp-2CCh]@62
  char pTopicArray[5][100]; // [sp+14h] [bp-27Ch]@37
  GUIWindow travel_window; // [sp+208h] [bp-88h]@1
  int pPrimaryTextHeight; // [sp+260h] [bp-30h]@36
  int index; // [sp+27Ch] [bp-14h]@36
  unsigned int pPrice; // [sp+288h] [bp-8h]@1
  int travel_time; // [sp+28Ch] [bp-4h]@48
  enum PlayerSpeech pSpeech;
  unsigned int pCurrentButton;

  memcpy(&travel_window, window_SpeakInHouse, sizeof(travel_window));
  travel_window.uFrameX = 483;
  travel_window.uFrameWidth = 148;
  travel_window.uFrameZ = 334;

  v4 = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType == BuildingType_Stables ? 25 : 50;
  v4 *= p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier;

  pPrice = v4 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
  if ( (signed int)pPrice < v4 / 3 )
    pPrice = v4 / 3;
  if ( dialog_menu_id == HOUSE_DIALOGUE_MAIN)
  {
    if ( HouseUI_CheckIfPlayerCanInteract() )
    {
      index = 0;
      strcpy(pTopicArray[4], "");
      sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[405], pPrice); // Price: %lu gold
      pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf2.data(), &travel_window, 0, 0);
      pRealTextHeight = pTextHeight + (LOBYTE(pFontArrus->uFontHeight) - 3) + 146;
      pPrimaryTextHeight = pRealTextHeight;
      pCurrentButton = 2;
      for ( uint i = pDialogueWindow->pStartingPosActiveItem; i < (unsigned int)(pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem); ++i )
      {
        schedule_id = transport_routes[(unsigned int)window_SpeakInHouse->ptr_1C - HOUSE_STABLES_HARMONDALE][index];
        pButton = pDialogueWindow->GetControl(i);

        if (schedule_id != 255)
        {
          //if (schedule_id >= 25)
            //Log::Warning(L"Transport UI: schedule overflow");
          if ( pCurrentButton >= 6 )
            v25 = true;
          else
            v25 = transport_schedule[schedule_id].pSchedule[pParty->uDaysPlayed % 7];
        }

        if (schedule_id != 255 && v25 && (!transport_schedule[schedule_id].uQuestBit
           || _449B57_test_bit(pParty->_quest_bits, transport_schedule[schedule_id].uQuestBit)) )//ошибка: рисуется несколько строчек одного направления путешествия
        {
  //get color for current string(определение цвета текущей строки)----------
          if ( pDialogueWindow->pCurrentPosActiveItem == pCurrentButton )
            sprintf(pTopicArray[index], "\f%05d", Color16(255, 255, 155));
          else
            sprintf(pTopicArray[index], "\f%05d", Color16(255, 255, 255));
  //hired NPC premium(премия наёмного НПС)----------------------------------
          travel_time = transport_schedule[schedule_id].uTravelTime;
          if ( (unsigned int)window_SpeakInHouse->ptr_1C >= HOUSE_BOATS_EMERALD_ISLE )
          {
            if ( CheckHiredNPCSpeciality(Sailor) )
              travel_time -= 2;
            if ( CheckHiredNPCSpeciality(Navigator) )
              travel_time -= 3;
            if ( CheckHiredNPCSpeciality(Pirate) )
              travel_time -= 2;
          }
          else
          {
            if ( CheckHiredNPCSpeciality(Horseman) )
              travel_time -= 2;
          }
          if ( CheckHiredNPCSpeciality(Explorer) )
            --travel_time;

          if ( travel_time < 1 )
            travel_time = 1;
          if ( schedule_id != 255 )
          {
            memcpy(&pMap, &pMapStats->pInfos[transport_schedule[schedule_id].uMapInfoID], 0x44u);
            sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[404], travel_time, pMap.pName); // Time - %d days, destination %s
            strcat(pTopicArray[index], pTmpBuf.data());
            strcat(pTopicArray[index], "\n \n");
            pButton->uY = pRealTextHeight;
            pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf.data(), &travel_window, 0, 0);
            pButton->uHeight = pTextHeight;
            pButton->uW = pButton->uY + pTextHeight - 1;
            pRealTextHeight += (LOBYTE(pFontArrus->uFontHeight) - 3) + pTextHeight;
          }
        }
        else
        {
          strcpy(pTopicArray[index], "");
          if ( pButton )
          {
            pButton->uW = 0;
            pButton->uHeight = 0;
            pButton->uY = 0;
          }
        }
        ++index;
        ++pCurrentButton;
      }
      if ( pRealTextHeight != pPrimaryTextHeight )
      {
        sprintf(pTmpBuf.data(), "%s\n \n%s%s%s%s%s", pTmpBuf2.data(), pTopicArray[0], pTopicArray[1], pTopicArray[2], pTopicArray[3], pTopicArray[4]);
        travel_window.DrawTitleText(pFontArrus, 0, 146, 0, pTmpBuf.data(), 3);
      }
      else
      {
        travel_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[561], &travel_window, 0, 0)) / 2 + 138,//"Извините, приходите в другой день"
                          Color16(255, 255, 255), pGlobalTXT_LocalizationStrings[561], 3);
        pAudioPlayer->StopChannels(-1, -1);
      }
    }
  }
  else//после нажатия топика
  {
    if ( dialog_menu_id >= HOUSE_DIALOGUE_TRANSPORT_SCHEDULE_1 && dialog_menu_id <= HOUSE_DIALOGUE_TRANSPORT_SCHEDULE_4 )
    {
      if ( pParty->uNumGold < pPrice )
      {
        ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);//"У вас не хватает золота"
        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_Greeting_2);
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
        return;
      }

      Party::TakeGold(pPrice);

      pTravel = &transport_schedule[transport_routes[(unsigned int)window_SpeakInHouse->ptr_1C - HOUSE_STABLES_HARMONDALE][dialog_menu_id - HOUSE_DIALOGUE_TRANSPORT_SCHEDULE_1]];
      if ( pTravel->pSchedule[pParty->uDaysPlayed % 7] )
      {
        if ( _stricmp(pCurrentMapName, pMapStats->pInfos[pTravel->uMapInfoID].pFilename) )
        {
          SaveGame(1, 0);
          strcpy(pCurrentMapName, pMapStats->pInfos[pTravel->uMapInfoID].pFilename);

          dword_6BE364_game_settings_1 |= GAME_SETTINGS_0001;
          _5B65B8_npcdata_hiword_house_or_other = 0;
          dword_5B65BC = 0;
          _5B65B4_npcdata_loword_house_or_other = pTravel->arrival_rot_y;
          uGameState = GAME_STATE_CHANGE_LOCATION;
          _5B65A8_npcdata_uflags_or_other = pTravel->arrival_x;
          _5B65AC_npcdata_fame_or_other = pTravel->arrival_y;
          _5B65B0_npcdata_rep_or_other = pTravel->arrival_z;
          dword_5B65C0 = pTravel->arrival_x | pTravel->arrival_y | pTravel->arrival_z | pTravel->arrival_rot_y;
        }
        else
        {
          pEngine->pIndoorCameraD3D->sRotationY = 0;

          pParty->uFlags |= 2u;
          pParty->vPosition.x = pTravel->arrival_x;
          pParty->vPosition.y = pTravel->arrival_y;
          pParty->vPosition.z = pTravel->arrival_z;
          pParty->uFallStartY = pParty->vPosition.z;
          pParty->sRotationX = 0;
          pParty->sRotationY = pTravel->arrival_rot_y;
        }
        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
        v12 = pTravel->uTravelTime;
        if ( (signed int)window_SpeakInHouse->ptr_1C >= 63 )
        {
          pSpeech = SPEECH_SetSail;
          v13 = 2500;
          if ( CheckHiredNPCSpeciality(Sailor) )
            v12 -= 2;
          if ( CheckHiredNPCSpeciality(Navigator) )
            v12 -= 3;
          if ( CheckHiredNPCSpeciality(Pirate) )
            v12 -= 2;
        }
        else
        {
          pSpeech = SPEECH_CarriageReady;
          v13 = 1500;
          if ( CheckHiredNPCSpeciality(Horseman) )
            v12 -= 2;
        }
        if ( CheckHiredNPCSpeciality(Explorer) )
          --v12;
        if ( v12 < 1 )
          v12 = 1;
        RestAndHeal(1440 * v12);
        pPlayers[uActiveCharacter]->PlaySound(pSpeech, 0);
        v14 = GetTickCount();
        v15 = v14 + v13;
        if ( v15 < v14 )
          v15 = v14;
        while ( GetTickCount() < v15 )
          sqrt(3.1415926);
        while ( HouseDialogPressCloseBtn() )
          ;
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 0, 0);
        return;
      }
      else
      {
        dialog_menu_id = HOUSE_DIALOGUE_MAIN;
        pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
      }
    }
  }
}
//----- (004B68EA) --------------------------------------------------------
bool __fastcall IsTravelAvailable(int a1)
{
  for ( uint i = 0; i < 4; ++i )
  {
    if ( transport_schedule[transport_routes[a1][i]].pSchedule[pParty->uDaysPlayed % 7] )
    {
      if (!transport_schedule[transport_routes[a1][i]].uQuestBit || _449B57_test_bit(pParty->_quest_bits, transport_schedule[transport_routes[a1][i]].uQuestBit))
        return true;
    }
  }
  return false;
}

//----- (004B7911) --------------------------------------------------------
void  TownHallDialog()
{
  int v1; // eax@10
  int v2; // esi@10
  signed int pStringSum; // ebx@24
  signed int v16; // ebx@28
  int v17; // ebx@28
  GUIButton *pButton; // eax@30
  int pTextHeight; // eax@30
  unsigned __int16 pTextColor; // ax@30
  GUIWindow window; // [sp+60h] [bp-BCh]@21
  GUIWindow townHall_window; // [sp+B4h] [bp-68h]@1
  int v29; // [sp+10Ch] [bp-10h]@28
  int v31; // [sp+114h] [bp-8h]@29
  GUIFont *pOutString; // [sp+118h] [bp-4h]@21

  memcpy(&townHall_window, window_SpeakInHouse, sizeof(townHall_window));
  townHall_window.uFrameX = 483;
  townHall_window.uFrameWidth = 148;
  townHall_window.uFrameZ = 334;
  sprintf(pTmpBuf.data(), "%s: %d", pGlobalTXT_LocalizationStrings[605], pParty->uFine);//Текущий штраф
  townHall_window.DrawTitleText(pFontArrus, 0, 260, Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
  switch(dialog_menu_id)
  {
    case HOUSE_DIALOGUE_MAIN:
    {
      pStringSum = 1;
      pTextHeight = 0;
      pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[604]);//Охота за вознаграждение
      if ( pParty->uFine > 0 )
      {
        pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[603]);//Заплатить штраф
        pStringSum = 2;
      }
      for ( uint i = 0; i < pStringSum; ++i )
        pTextHeight += pFontArrus->CalcTextHeight(pShopOptions[i], &townHall_window, 0, 0);
      v29 = (100 - pTextHeight) / pStringSum;
      v16 = 80 - pStringSum * ((100 - pTextHeight) / pStringSum);
      v17 = (v16 / 2) - v29 / 2 + 158;
      if ( pDialogueWindow->pNumPresenceButton > 0 )
      {
        v31 = 2;
        uint j = 0;
        for ( uint i = pDialogueWindow->pStartingPosActiveItem;
              i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
        {
          pButton = pDialogueWindow->GetControl(i);
          pButton->uY = v29 + v17;
          pTextHeight = pFontArrus->CalcTextHeight(pShopOptions[j], &townHall_window, 0, 0);
          pButton->uHeight = pTextHeight;
          v17 = pButton->uY + pTextHeight - 1;
          pButton->uW = v17;
          pTextColor = Color16(0xFFu, 0xFFu, 0x9Bu);
          if ( pDialogueWindow->pCurrentPosActiveItem != v31 )
            pTextColor = Color16(0xFFu, 0xFFu, 0xFFu);
          townHall_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pShopOptions[j], 3);
          ++v31;
          ++j;
        }
      }
      break;
    }
    case HOUSE_DIALOGUE_TOWNHALL_MESSAGE:
    {
      sprintf(pTmpBuf.data(), "\f%05d%s\f%05d", Color16(0xFFu, 0xFFu, 0x9Bu),
      pMonsterStats->pInfos[bountyHunting_monster_id_for_hunting].pName, Color16(0xFFu, 0xFFu, 0xFFu));
      sprintf(pTmpBuf2.data(), bountyHunting_text, pTmpBuf.data(), 100 * pMonsterStats->pInfos[bountyHunting_monster_id_for_hunting].uLevel);
      current_npc_text = pTmpBuf2.data();
      memcpy(&window, pDialogueWindow, sizeof(window));
      window.uFrameWidth = 458;
      window.uFrameZ = 457;
      pOutString = pFontArrus;
      pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf2.data(), &window, 13, 0) + 7;
      if ( 352 - pTextHeight < 8 )
      {
        pOutString = pFontCreate;
        pTextHeight = pFontCreate->CalcTextHeight(current_npc_text, &window, 13, 0) + 7;
      }
      pRenderer->GetLeather(8, 352 - pTextHeight, pIcons_LOD->GetTexture(uTextureID_Leather), pIcons_LOD->GetTexture(uTextureID_Leather)->uTextureHeight - pTextHeight);
      pRenderer->DrawTextureIndexed(8, 347 - pTextHeight, pTexture_591428);
      window.DrawText(pOutString, 13, 354 - pTextHeight, 0, FitTextInAWindow(current_npc_text, pOutString, &window, 13, 0), 0, 0, 0);
      break;
    }
    case HOUSE_DIALOGUE_TOWNHALL_PAY_FINE:
    {
      if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS)
      {
        sprintfex(pTmpBuf.data(), "%s\n%s", pGlobalTXT_LocalizationStrings[606], pGlobalTXT_LocalizationStrings[112]); // "Pay"   "How Much?"
        townHall_window.DrawTitleText(pFontArrus, 0, 146, Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
        townHall_window.DrawTitleText(pFontArrus, 0, 186, Color16(0xFFu, 0xFFu, 0xFFu), pKeyActionMap->pPressedKeysBuffer, 3);
        townHall_window.DrawFlashingInputCursor(pFontArrus->GetLineWidth(pKeyActionMap->pPressedKeysBuffer) / 2 + 80, 185, pFontArrus);
        return;
      }
      if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CONFIRMED)
      {
        v1 = atoi(pKeyActionMap->pPressedKeysBuffer);
        v2 = atoi(pKeyActionMap->pPressedKeysBuffer);
        if ( v1 <= 0 )
        {
          pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
          return;
        }
        if ( v1 > pParty->uNumGold )
        {
          PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
          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);
      }
      if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CANCELLED)
      {
        window_SpeakInHouse->receives_keyboard_input_2 = WINDOW_INPUT_NONE;
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
      }
      break;
    }
    default:
      break;
  }
  return;
}

//----- (004B7D7E) --------------------------------------------------------
void  BankDialog()
{
  int entered_sum; // eax@19
  unsigned int takes_sum; // esi@19
  unsigned __int16 pColorText; // ax@27
  GUIWindow bank_window; // [sp+Ch] [bp-5Ch]@1

  memcpy(&bank_window, window_SpeakInHouse, sizeof(bank_window));
  bank_window.uFrameX = 483;
  bank_window.uFrameWidth = 148;
  bank_window.uFrameZ = 334;
  sprintf(pTmpBuf.data(), "%s: %d", pGlobalTXT_LocalizationStrings[25], pParty->uNumGoldInBank);//Баланс
  bank_window.DrawTitleText(pFontArrus, 0, 220, Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
  switch(dialog_menu_id)
  {
    case HOUSE_DIALOGUE_MAIN:
    {
      pColorText = Color16(0xFFu, 0xFFu, 0x9Bu);
      if ( pDialogueWindow->pCurrentPosActiveItem != 2 )
        pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
      bank_window.DrawTitleText(pFontArrus, 0, 146, pColorText, pGlobalTXT_LocalizationStrings[60], 3);
      pColorText = Color16(0xFFu, 0xFFu, 0x9Bu);
      if ( pDialogueWindow->pCurrentPosActiveItem != 3 )
        pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
      bank_window.DrawTitleText(pFontArrus, 0, 176, pColorText, pGlobalTXT_LocalizationStrings[244], 3);
      break;
    }
    case HOUSE_DIALOGUE_BANK_PUT_GOLD:
    {
      if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS)
      {
        sprintf(pTmpBuf.data(), "%s\n%s", pGlobalTXT_LocalizationStrings[60], pGlobalTXT_LocalizationStrings[112]);//"Положить" "Сколько?"
        bank_window.DrawTitleText(pFontArrus, 0, 146, Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
        bank_window.DrawTitleText(pFontArrus, 0, 186, Color16(0xFFu, 0xFFu, 0xFFu), pKeyActionMap->pPressedKeysBuffer, 3);
        bank_window.DrawFlashingInputCursor(pFontArrus->GetLineWidth(pKeyActionMap->pPressedKeysBuffer) / 2 + 80, 185, pFontArrus);
        return;
      }
      if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CONFIRMED)
      {
        entered_sum = atoi(pKeyActionMap->pPressedKeysBuffer);
        takes_sum = entered_sum;
        if ( !entered_sum )
        {
          pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
          return;
        }
        if ( entered_sum > pParty->uNumGold )
        {
          PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
          takes_sum = pParty->uNumGold;
        }
        if ( takes_sum )
        {
          Party::TakeGold(takes_sum);
          pParty->uNumGoldInBank += takes_sum;
          if ( uActiveCharacter )
            pPlayers[uActiveCharacter]->PlaySound(SPEECH_81, 0);
        }
        window_SpeakInHouse->receives_keyboard_input_2 = WINDOW_INPUT_NONE;
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
        return;
      }
      if (window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CANCELLED)
      {
        window_SpeakInHouse->receives_keyboard_input_2 = WINDOW_INPUT_NONE;
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
      }
      return;
    }
    case HOUSE_DIALOGUE_BANK_GET_GOLD:
    {
      if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS)
      {
        sprintfex(pTmpBuf.data(), "%s\n%s", pGlobalTXT_LocalizationStrings[244], pGlobalTXT_LocalizationStrings[112]);//"Снять" "Сколько?"
        bank_window.DrawTitleText(pFontArrus, 0, 146, Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
        bank_window.DrawTitleText(pFontArrus, 0, 186, Color16(0xFFu, 0xFFu, 0xFFu), pKeyActionMap->pPressedKeysBuffer, 3);
        bank_window.DrawFlashingInputCursor(pFontArrus->GetLineWidth(pKeyActionMap->pPressedKeysBuffer) / 2 + 80, 185, pFontArrus);
        return;
      }
      if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CONFIRMED)
      {
        window_SpeakInHouse->receives_keyboard_input_2 = WINDOW_INPUT_NONE;
        entered_sum = atoi(pKeyActionMap->pPressedKeysBuffer);
        takes_sum = entered_sum;
        if ( entered_sum )
        {
          if ( entered_sum > pParty->uNumGoldInBank )
          {
            PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
            takes_sum = pParty->uNumGoldInBank;
          }
          if ( takes_sum )
          {
            Party::SetGold(pParty->uNumGold + takes_sum);
            pParty->uNumGoldInBank -= takes_sum;
          }
        }
        window_SpeakInHouse->receives_keyboard_input_2 = WINDOW_INPUT_NONE;
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
        return;
      }
      if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CANCELLED)
      {
        window_SpeakInHouse->receives_keyboard_input_2 = WINDOW_INPUT_NONE;
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
      }
      return;
    }
    default:
    {
      break;
    }
  }
}
// F8B19C: using guessed type int dword_F8B19C;

//----- (004B8285) --------------------------------------------------------
void  TavernDialog()
{
  int pPriceRoom;
  int pPriceFood;
  int pPriceSkill;
  int pItemNum;
  double v2; // st7@1
  int pNumString; // edi@16
  signed int v9; // esi@16
  unsigned int pColorText; // eax@57
  GUIButton *pButton; // eax@65
  int pSkillCount;
  signed int pOptionsCount; // edi@77
  signed int i; // esi@79
//  signed int v53; // edi@81
  int v54; // edi@81
  const char *pText; // [sp-4h] [bp-278h]@93
  char pTopic1[100]; // [sp+Ch] [bp-268h]@55
  char pTopic4[100]; // [sp+70h] [bp-204h]@59
  char pTopic2[100]; // [sp+D4h] [bp-1A0h]@57
  char pTopic3[100]; // [sp+138h] [bp-13Ch]@59
  GUIWindow dialog_window; // [sp+1F0h] [bp-84h]@1
  int v91; // [sp+270h] [bp-4h]@3
  unsigned int pTopic1Height; // [sp+26Fh] [bp-5h]@55
  unsigned __int8 pTopic2Height; // [sp+267h] [bp-Dh]@57
  unsigned __int8 pTopic3Height; // [sp+253h] [bp-21h]@59
  unsigned __int8 pTopic4Height;
  int pTextHeight;
  int all_text_height; // [sp+260h] [bp-14h]@18
  GUIFont *pOutString;

  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
  dialog_window.uFrameX = 483;
  dialog_window.uFrameWidth = 148;
  dialog_window.uFrameZ = 334;
  v2 = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier;

  pPriceRoom = ((v2 * v2) / 10) * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
  if ( pPriceRoom < ((v2 * v2) / 10) / 3 )
    pPriceRoom = ((v2 * v2) / 10) / 3;
  if ( pPriceRoom <= 0 )
    pPriceRoom = 1;

  pPriceFood = ((v2 * v2) * v2 / 100) * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
  if ( pPriceFood < ((v2 * v2) * v2 / 100) / 3 )
    pPriceFood = ((v2 * v2) * v2 / 100) / 3;
  if ( pPriceFood <= 0 )
    pPriceFood = 1;


  switch(dialog_menu_id)
  {
    case HOUSE_DIALOGUE_MAIN:
    {
      if ( !HouseUI_CheckIfPlayerCanInteract() )
          return;

      sprintf(pTopic1, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 2 ? Color16(0xFFu, 0xFFu, 0x9Bu) : Color16(0xFFu, 0xFFu, 0xFFu));
      sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[178], pPriceRoom); // Rent room for %d gold
      strcat(pTopic1, pTmpBuf2.data());
      pTopic1Height = pFontArrus->CalcTextHeight(pTopic1, &dialog_window, 0, 0);
      strcat(pTopic1, "\n \n");

      sprintf(pTopic2, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 3 ? Color16(0xFFu, 0xFFu, 0x9Bu) : Color16(0xFFu, 0xFFu, 0xFFu));
      sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[86], // Buy food for %d days for %d gold
        (unsigned int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier, pPriceFood);
      strcat(pTopic2, pTmpBuf2.data());
      pTopic2Height = pFontArrus->CalcTextHeight(pTopic2, &dialog_window, 0, 0);
      strcat(pTopic2, "\n \n");

      sprintf(pTopic3, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 4 ? Color16(0xFFu, 0xFFu, 0x9Bu) : Color16(0xFFu, 0xFFu, 0xFFu));
      strcat(pTopic3, pGlobalTXT_LocalizationStrings[160]); // Learn Skills
      pTopic3Height = pFontArrus->CalcTextHeight(pTopic3, &dialog_window, 0, 0);
      strcat(pTopic3, "\n \n");
      pTopic4[0] = 0;
      if ( (signed int)window_SpeakInHouse->par1C >= 108 && (signed int)window_SpeakInHouse->par1C <= 120 )
      {
        sprintf(pTopic4, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 5 ? Color16(0xFFu, 0xFFu, 0x9Bu) : Color16(0xFFu, 0xFFu, 0xFFu));
        strcat(pTopic4, pGlobalTXT_LocalizationStrings[611]); // Play Arcomage
        pTopic4Height = pFontArrus->CalcTextHeight(pTopic4, &dialog_window, 0, 0);
      }

      if ( pDialogueWindow->pNumPresenceButton )
      {
        for ( pItemNum = pDialogueWindow->pStartingPosActiveItem;
              pItemNum < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton; ++pItemNum )
        {
          pButton = pDialogueWindow->GetControl(pItemNum);
          if ( pButton->msg_param == 15 )
          {
            pButton->uHeight = pTopic1Height;
            pButton->uY = 146;
            pButton->uW = pTopic1Height + 145;
          }
          else if ( pButton->msg_param == 16 )
          {
            pButton->uHeight = pTopic2Height;
            pButton->uY = pTopic1Height + (LOBYTE(pFontArrus->uFontHeight) - 3) + 146;
            pButton->uW = (pTopic1Height + (LOBYTE(pFontArrus->uFontHeight) - 3) + 146) + pTopic2Height - 1;
          }
          else if ( pButton->msg_param == 96 )
          {
            pButton->uY = pTopic1Height + pTopic2Height + 2 * (LOBYTE(pFontArrus->uFontHeight) - 3) + 146;
            pButton->uHeight = pTopic3Height;
            pButton->uW = pTopic3Height + (pTopic1Height + pTopic2Height + 2 * (LOBYTE(pFontArrus->uFontHeight) - 3) + 146) - 1;
          }
          else if ( pButton->msg_param == 101 )
          {
            pButton->uHeight = pTopic4Height;
            pButton->uY = pTopic1Height + 3 * (LOBYTE(pFontArrus->uFontHeight) - 3) + pTopic4Height + pTopic2Height + 146;
            pButton->uW = (pTopic1Height + 3 * (LOBYTE(pFontArrus->uFontHeight) - 3) + pTopic4Height + pTopic2Height + 146) + pTopic4Height - 1;
          }
        }
        sprintfex(pTmpBuf.data(), "%s%s%s%s", pTopic1, pTopic2, pTopic3, pTopic4);
        dialog_window.DrawTitleText(pFontArrus, 0, 146, 0, pTmpBuf.data(), 3);
      }
      break;
    }
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RULES:
    {
      pOutString = pFontArrus;
      strcpy(pTmpBuf.data(), pNPCTopics[354].pText);
      dialog_window.uFrameWidth = game_viewport_width;
      dialog_window.uFrameZ = 452;
      pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf.data(), &dialog_window, 12, 0) + 7;
      if ( 352 - pTextHeight < 8 )
      {
        pOutString = pFontCreate;
        pTextHeight = pFontCreate->CalcTextHeight(pTmpBuf.data(), &dialog_window, 12, 0) + 7;
      }
      pRenderer->GetLeather(8, 352 - pTextHeight, pIcons_LOD->GetTexture(uTextureID_Leather), pIcons_LOD->GetTexture(uTextureID_Leather)->uTextureHeight - pTextHeight);
      pRenderer->DrawTextureIndexed(8, 347 - pTextHeight, pTexture_591428);
      window_SpeakInHouse->DrawText(pOutString, 12, 354 - pTextHeight, 0, FitTextInAWindow(pTmpBuf.data(), pOutString, &dialog_window, 0xCu, 0), 0, 0, 0);
      break;
    }
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_VICTORY_CONDITIONS:
    {
      strcpy(pTmpBuf.data(), pNPCTopics[(uint)window_SpeakInHouse->ptr_1C + 247].pText);
      dialog_window.uFrameWidth = game_viewport_width;
      dialog_window.uFrameZ = 452;
      pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf.data(), &dialog_window, 12, 0) + 7;
      pRenderer->GetLeather(8, 352 - pTextHeight, pIcons_LOD->GetTexture(uTextureID_Leather), pIcons_LOD->GetTexture(uTextureID_Leather)->uTextureHeight - pTextHeight);
      pRenderer->DrawTextureIndexed(8, 347 - pTextHeight, pTexture_591428);
      window_SpeakInHouse->DrawText(pFontArrus, 12, 354 - pTextHeight, 0,
                                    FitTextInAWindow(pTmpBuf.data(), pFontArrus, &dialog_window, 0xCu, 0), 0, 0, 0);
      break;
    }
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RESULT:
    {
      if ( pArcomageGame->bGameInProgress == 1 )
        return;
      if ( pArcomageGame->uGameWinner )
      {
        if ( pArcomageGame->uGameWinner == 1 )
          pText = pGlobalTXT_LocalizationStrings[640];// You won!
        else
          pText = pGlobalTXT_LocalizationStrings[641];// You lost!
      }
      else
      {
        pText = pGlobalTXT_LocalizationStrings[639];// A tie!
      }
      strcpy(pTmpBuf.data(), pText);
      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(pTmpBuf.data(), &dialog_window, 0, 0)) / 2 + 138,
                                  Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
      break;
    }
    case HOUSE_DIALOGUE_TAVERN_REST:
    {
      if ( pParty->uNumGold >= pPriceRoom )
      {
        Party::TakeGold(pPriceRoom);
        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
        dialog_menu_id = HOUSE_DIALOGUE_NULL;
        HouseDialogPressCloseBtn();
        GetHouseGoodbyeSpeech();
        pMediaPlayer->Unload();
        /*if ( pMessageQueue_50CBD0->uNumMessages )
          pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
        pMessageQueue_50CBD0->pMessages[0].eType = UIMSG_RentRoom;
        pMessageQueue_50CBD0->pMessages[0].param = (int)window_SpeakInHouse->ptr_1C;//107
        pMessageQueue_50CBD0->pMessages[0].field_8 = 1;
        ++pMessageQueue_50CBD0->uNumMessages;*/
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_RentRoom, (int)window_SpeakInHouse->ptr_1C, 1);
        window_SpeakInHouse->Release();
        window_SpeakInHouse = 0;
        return;
      }
      ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);//У вас не хватает золота
      PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_Goodbye);
      pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
      break;
    }

    case HOUSE_DIALOGUE_LEARN_SKILLS:
    {
      if ( !HouseUI_CheckIfPlayerCanInteract() )
        return;
      pSkillCount = 0;
      v9 = (signed __int64)(p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
      pPriceSkill = v9 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
      if ( pPriceSkill < v9 / 3 )
        pPriceSkill = v9 / 3;
      all_text_height = 0;
      for ( int i = pDialogueWindow->pStartingPosActiveItem;
            i < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton; ++i )
      {
        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pDialogueWindow->GetControl(i)->msg_param - 36]
            && !pPlayers[uActiveCharacter]->pActiveSkills[pDialogueWindow->GetControl(i)->msg_param - 36] )
        {
          all_text_height = pFontArrus->CalcTextHeight(pSkillNames[pDialogueWindow->GetControl(i)->msg_param - 36], &dialog_window, 0, 0);
          pSkillCount++;
        }
      }
      if ( pSkillCount )
      {
        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[401], pPriceSkill);//Стоимость навыка: %lu
        dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf.data(), 3);
        v91 = (149 - all_text_height) / pSkillCount;
        if ( (149 - all_text_height) / pSkillCount > 32 )
          v91 = 32;
        v54 = (149 - pSkillCount * v91 - all_text_height) / 2 - v91 / 2 + 162;
        for ( int i = pDialogueWindow->pStartingPosActiveItem;
              i < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton; i++ )
        {
          pButton = pDialogueWindow->GetControl(i);
          if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pButton->msg_param - 36]
            || pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param - 36] )
          {
            pButton->uW = 0;
            pButton->uHeight = 0;
            pButton->uY = 0;
          }
          else
          {
            pButton->uY = v91 + v54;
            pTextHeight = pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &dialog_window, 0, 0);
            pButton->uHeight = pTextHeight;
            v54 = pTextHeight + pButton->uY - 1;
            pButton->uW = v54;
            pColorText = Color16(0xFFu, 0xFFu, 0x9Bu);
            if ( pDialogueWindow->pCurrentPosActiveItem != i )
              pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
            dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pSkillNames[pButton->msg_param - 36], 3);
          }
        }
        return;
      }
      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[544], pPlayers[uActiveCharacter]->pName,//Советую вам %s %s поискать знания еще где-нибудь
              pClassNames[pPlayers[uActiveCharacter]->classType]);
      strcat(pTmpBuf.data(), "\n \n");
      strcat(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[528]);//Больше ничего не могу предложить.
      pTextHeight = (174 - pFontArrus->CalcTextHeight(pTmpBuf.data(), &dialog_window, 0, 0)) / 2 + 138;
      dialog_window.DrawTitleText(pFontArrus, 0, pTextHeight, Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
      return;
    }

    case HOUSE_DIALOGUE_TAVERN_BUY_FOOD:
    {
      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->AddGUIMessage(UIMSG_Escape, 1, 0);
        return;
      }
      if ( pParty->uNumGold >= pPriceFood )
      {
        Party::TakeGold(pPriceFood);
        pParty->uNumFoodRations = (signed __int64)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier;
        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_Greeting_2);
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
        return;
      }
      ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);  // "You don't have enough gold"
      PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_Goodbye);
      pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
      break;
    }

    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN:
    {
      if ( HouseUI_CheckIfPlayerCanInteract() )
      {
        pOptionsCount = 2;
        pShopOptions[0] = const_cast<char *>(pGlobalTXT_LocalizationStrings[620]);//Правила
        pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[622]);//Условия победы
        if ( pParty->HasItem(651) )//651 - Колода для игры в АркоМэйдж в Items.txt
        {
          pShopOptions[2] = const_cast<char *>(pGlobalTXT_LocalizationStrings[621]);//Играть
          pOptionsCount = 3;
        }
        for ( i = 0; i < pOptionsCount; ++i )
          all_text_height = pFontArrus->CalcTextHeight(pShopOptions[i], &dialog_window, 0, 0);
        all_text_height = (174 - all_text_height) / pOptionsCount;
        
        v54 = (174 - pOptionsCount * (174 - all_text_height) / pOptionsCount - all_text_height) / 2 - (174 - all_text_height) / pOptionsCount / 2 + 138;
        pNumString = 0;
        for ( pItemNum = pDialogueWindow->pStartingPosActiveItem;
              pItemNum < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem ; pItemNum++ )
        {
          pButton = pDialogueWindow->GetControl(pItemNum);
          pButton->uY = all_text_height + v54;
          pTextHeight = pFontArrus->CalcTextHeight(pShopOptions[pNumString], &dialog_window, 0, 0);
          pButton->uHeight = pTextHeight;
          v54 = pButton->uY + pTextHeight - 1;
          pButton->uW = v54;
          pColorText = Color16(0xFFu, 0xFFu, 0x9Bu);
          if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum )
            pColorText = Color16(0xFFu, 0xFFu, 0xFFu);
          dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, pShopOptions[pNumString], 3);
          ++pNumString;
        }
      }
      break;
    }
    default:
    {
      break;
    }
  }
}

//----- (004B705E) --------------------------------------------------------
void TempleDialog()
{
  int pPrice; // edi@1
  int pTextHeight; // eax@11
  unsigned __int16 pTextColor; // ax@21
  DDM_DLV_Header *v26; // edi@29
  unsigned int v30; // edx@36
  int v35; // edi@50
  GUIButton *pButton; // edi@64
//  int v47; // edi@71
  GUIWindow tample_window; // [sp+13Ch] [bp-88h]@1
  unsigned __int8 index; // [sp+1B7h] [bp-Dh]@64
  int v64; // [sp+1B8h] [bp-Ch]@6
  unsigned int pCurrentItem; // [sp+1BCh] [bp-8h]@6
  int all_text_height; // [sp+1C0h] [bp-4h]@6

  memcpy(&tample_window, window_SpeakInHouse, sizeof(tample_window));
  tample_window.uFrameX = 483;
  tample_window.uFrameWidth = 148;
  tample_window.uFrameZ = 334;
  pPrice = pPlayers[uActiveCharacter]->GetTempleHealCostModifier(p2DEvents[window_SpeakInHouse->par1C - 1].fPriceMultiplier);
  if ( dialog_menu_id == HOUSE_DIALOGUE_MAIN )
  {
    index = 1;
    pButton = pDialogueWindow->GetControl(pDialogueWindow->pStartingPosActiveItem);
    pButton->uHeight = 0;
    pButton->uY = 0;
    if ( pPlayers[uActiveCharacter]->IsPlayerHealableByTemple() )
    {
      sprintfex(pTmpBuf.data(), "%s %d %s", pGlobalTXT_LocalizationStrings[104], pPrice, pGlobalTXT_LocalizationStrings[97]);//"Лечить" "Золото"
      pShopOptions[0] = pTmpBuf.data();
      index = 0;
    }
    pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[68]);//"Пожертвовать"
    pShopOptions[2] = const_cast<char *>(pGlobalTXT_LocalizationStrings[160]);//"Обучиться навыкам"
    all_text_height = 0;
    if ( index < pDialogueWindow->pNumPresenceButton )
    {
      uint i = index;
      for ( uint j = index; j < pDialogueWindow->pNumPresenceButton; ++j )
      {
        all_text_height += pFontArrus->CalcTextHeight(pShopOptions[1 * i], &tample_window, 0, 0);
        i++;
      }
    }
    v64 = (174 - (signed int)all_text_height) / (pDialogueWindow->pNumPresenceButton - index);
    if ( v64 > 32 )
      v64 = 32;
    all_text_height = (174 - v64 * (pDialogueWindow->pNumPresenceButton - index) - (signed int)all_text_height) / 2 - v64 / 2 + 138;
    if ( index + pDialogueWindow->pStartingPosActiveItem < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton )
    {
      uint i = index;
      for ( pCurrentItem = index + pDialogueWindow->pStartingPosActiveItem;
          (signed int)pCurrentItem < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++pCurrentItem )
      {
        pButton = pDialogueWindow->GetControl(pCurrentItem);
        pButton->uY = v64 + all_text_height;
        pTextHeight = pFontArrus->CalcTextHeight(pShopOptions[1 * i], &tample_window, 0, 0);
        pButton->uHeight = pTextHeight;
        pButton->uW = pButton->uY + pTextHeight - 1;
        all_text_height = pButton->uW;
        pTextColor = Color16(0xFFu, 0xFFu, 0x9Bu);
        if ( pDialogueWindow->pCurrentPosActiveItem != index + 2 )
          pTextColor = Color16(0xFFu, 0xFFu, 0xFFu);
        tample_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pShopOptions[1 * i], 3);
        i++;
        index++;
      }
    }
    return;
  }
  //-------------------------------------------------
  if ( dialog_menu_id == HOUSE_DIALOGUE_TEMPLE_HEAL )
  {
    if ( !pPlayers[uActiveCharacter]->IsPlayerHealableByTemple() )
      return;
    if ( pParty->uNumGold < pPrice )
    {
      ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);//"У вас не хватает золота"
      PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
      pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
      return;
    }
    Party::TakeGold(pPrice);
    v35 = LODWORD(pPlayers[uActiveCharacter]->pConditions[Condition_Zombie]);
    memset(pPlayers[uActiveCharacter], 0, 0xA0u);
    pPlayers[uActiveCharacter]->sHealth = pPlayers[uActiveCharacter]->GetMaxHealth();
    pPlayers[uActiveCharacter]->sMana = pPlayers[uActiveCharacter]->GetMaxMana();
    if ( (signed int)window_SpeakInHouse->ptr_1C != 78 && ((signed int)window_SpeakInHouse->ptr_1C <= 80 || (signed int)window_SpeakInHouse->ptr_1C > 82) )
    {
      if ( (unsigned int)pPlayers[uActiveCharacter]->pConditions[Condition_Zombie] | v35 )// если состояние зомби
      {
        pPlayers[uActiveCharacter]->uCurrentFace = pPlayers[uActiveCharacter]->uPrevFace;
        pPlayers[uActiveCharacter]->uVoiceID = pPlayers[uActiveCharacter]->uPrevVoiceID;
        ReloadPlayerPortraits(uActiveCharacter - 1, pPlayers[uActiveCharacter]->uPrevFace);
      }
      pAudioPlayer->PlaySound((SoundID)SOUND_heal, -1, 0, -1, 0, 0, 0, 0);
      pPlayers[uActiveCharacter]->PlaySound(SPEECH_82, 0);
      pOtherOverlayList->_4418B1(20, uActiveCharacter + 99, 0, 65536);
      pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
      return;
    }
    if ( (unsigned int)pPlayers[uActiveCharacter]->pConditions[Condition_Zombie] | v35 )
      LODWORD(pPlayers[uActiveCharacter]->pConditions[Condition_Zombie]) = v35;
    else
    {
      if ( !pPlayers[uActiveCharacter]->pConditions[Condition_Eradicated]
        && !pPlayers[uActiveCharacter]->pConditions[Condition_Pertified] && !pPlayers[uActiveCharacter]->pConditions[Condition_Dead] )
      {
        pAudioPlayer->PlaySound((SoundID)SOUND_heal, -1, 0, -1, 0, 0, 0, 0);
        pPlayers[uActiveCharacter]->PlaySound(SPEECH_82, 0);
        pOtherOverlayList->_4418B1(20, uActiveCharacter + 99, 0, 65536);
        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
        return;
      }
      pPlayers[uActiveCharacter]->uPrevFace = pPlayers[uActiveCharacter]->uCurrentFace;
      pPlayers[uActiveCharacter]->uPrevVoiceID = pPlayers[uActiveCharacter]->uVoiceID;
      pPlayers[uActiveCharacter]->SetCondition(Condition_Zombie, 1);
      pPlayers[uActiveCharacter]->uVoiceID = (pPlayers[uActiveCharacter]->GetSexByVoice() != 0) + 23;
      pPlayers[uActiveCharacter]->uCurrentFace = (pPlayers[uActiveCharacter]->GetSexByVoice() != 0) + 23;
      ReloadPlayerPortraits(uActiveCharacter - 1, (pPlayers[uActiveCharacter]->GetSexByVoice() != 0) + 23);
      pPlayers[uActiveCharacter]->pConditions[Condition_Zombie] = pParty->uTimePlayed;
      //v39 = (GUIWindow *)HIDWORD(pParty->uTimePlayed);
    }
    //HIDWORD(pPlayers[uActiveCharacter]->pConditions[Condition_Zombie]) = (int)v39;
    pPlayers[uActiveCharacter]->pConditions[Condition_Zombie] = pParty->uTimePlayed;
    pAudioPlayer->PlaySound((SoundID)SOUND_heal, -1, 0, -1, 0, 0, 0, 0);
    pPlayers[uActiveCharacter]->PlaySound(SPEECH_82, 0);
    pOtherOverlayList->_4418B1(20, uActiveCharacter + 99, 0, 65536);
    pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
    return;
  }
  //---------------------------------------------------
  if ( dialog_menu_id == HOUSE_DIALOGUE_TEMPLE_DONATE )
  {
    pPrice = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier;
    if ( pParty->uNumGold >= (unsigned int)pPrice )
    {
      Party::TakeGold((unsigned int)pPrice);
      v26 = &pOutdoor->ddm;
      if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor )
        v26 = &pIndoor->dlv;
      if ( v26->uReputation > -5 )
      {
        v26->uReputation = v26->uReputation - 1;
        if ( v26->uReputation - 1 < -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 )
        {
          v30 = pParty->uDaysPlayed % 7 + 1;
          LOBYTE(v30) = v30 | 0x80;
          _42777D_CastSpell_UseWand_ShootArrow(SPELL_SPIRIT_PRESERVATION, uActiveCharacter - 1, v30, 48, 0);
        }
        if ( v26->uReputation <= -15 )
        {
          v30 = pParty->uDaysPlayed % 7 + 1;
          LOBYTE(v30) = v30 | 0x80;
          _42777D_CastSpell_UseWand_ShootArrow(SPELL_BODY_PROTECTION_FROM_MAGIC, uActiveCharacter - 1, v30, 48, 0);
        }
        if ( v26->uReputation <= -20 )
        {
          v30 = pParty->uDaysPlayed % 7 + 1;
          LOBYTE(v30) = v30 | 0x80;
          _42777D_CastSpell_UseWand_ShootArrow(SPELL_LIGHT_HOUR_OF_POWER, uActiveCharacter - 1, v30, 48, 0);
        }
        if ( v26->uReputation <= -25 )
        {
          v30 = pParty->uDaysPlayed % 7 + 1;
          LOBYTE(v30) = v30 | 0x80;
          _42777D_CastSpell_UseWand_ShootArrow(SPELL_LIGHT_DAY_OF_PROTECTION, uActiveCharacter - 1, v30, 48, 0);
        }
      }
      ++byte_F8B1EF[uActiveCharacter];
      pPlayers[uActiveCharacter]->PlaySound(SPEECH_83, 0);
      ShowStatusBarString(pGlobalTXT_LocalizationStrings[527], 2); // "Thank You!"
      pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
      return;
    }
    ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);//"У вас не хватает золота"
    PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
    pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
    return;
  }
  //------------------------------------------------
  if ( dialog_menu_id == HOUSE_DIALOGUE_LEARN_SKILLS )
  {
    if ( HouseUI_CheckIfPlayerCanInteract() )
    {
      all_text_height = 0;
      pCurrentItem = (signed __int64)(p2DEvents[(signed int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
      v64 = (signed int)(pCurrentItem * (100 - pPlayers[uActiveCharacter]->GetMerchant())) / 100;
      if ( v64 < (signed int)pCurrentItem / 3 )
        v64 = (signed int)pCurrentItem / 3;
      pCurrentItem = 0;
      for ( int i = pDialogueWindow->pStartingPosActiveItem; i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
      {
        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pDialogueWindow->GetControl(i)->msg_param - 36]
         && !pPlayers[uActiveCharacter]->pActiveSkills[pDialogueWindow->GetControl(i)->msg_param - 36] )
        {
          all_text_height += pFontArrus->CalcTextHeight(pSkillNames[pDialogueWindow->GetControl(i)->msg_param - 36], &tample_window, 0, 0);
          ++pCurrentItem;
        }
      }
      if ( pCurrentItem )
      {
        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[401], v64);
        tample_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf.data(), 3);
        v64 = (149 - (signed int)all_text_height) / (signed int)pCurrentItem;
        if ( v64 > 32 )
          v64 = 32;
        all_text_height = (signed int)(149 - pCurrentItem * v64 - (int)all_text_height) / 2 - v64 / 2 + 162;
        if ( pDialogueWindow->pStartingPosActiveItem < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton )
        {
          pCurrentItem = 2;
          for ( int i = pDialogueWindow->pStartingPosActiveItem;
                    i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
          {
            pButton = pDialogueWindow->GetControl(i);
            if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pButton->msg_param - 36]
              || pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param - 36] )
            {
              pButton->uW = 0;
              pButton->uHeight = 0;
              pButton->uY = 0;
            }
            else
            {
              pButton->uY = v64 + all_text_height;
              pTextHeight = pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &tample_window, 0, 0);
              pButton->uHeight = pTextHeight;
              pButton->uW = pButton->uY + pTextHeight - 1;
              all_text_height = pButton->uW;
              pTextColor = Color16(0xFFu, 0xFFu, 0x9Bu);
              if ( pDialogueWindow->pCurrentPosActiveItem != pCurrentItem )
                pTextColor = Color16(0xFFu, 0xFFu, 0xFFu);
              tample_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pSkillNames[pButton->msg_param - 36], 3);
            }
            pCurrentItem++;
          }
        }
      }
      else
      {
        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[544], pPlayers[uActiveCharacter]->pName, pClassNames[pPlayers[uActiveCharacter]->classType]);//"Советую вам %s %s поискать знания еще где-нибудь"
        strcat(pTmpBuf.data(), "\n \n");
        strcat(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[528]);//"Больше ничего не могу предложить."
        pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf.data(), &tample_window, 0, 0);
        tample_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
      }
    }
  }
  return;
}

//----- (004B4710) --------------------------------------------------------
void TrainingDialog()
{
  unsigned __int64 v5; // edi@3
  int v8; // edx@4
  double v9; // st7@6
  signed int v10; // esi@6
  int pPrice; // ecx@6
  signed int v14; // esi@14
//  int v16; // eax@16
  int v19; // ecx@24
  int v33; // eax@36
  unsigned int v36; // eax@38
  unsigned int v42; // eax@46
  int index;
  int all_text_height; // eax@68
  int v49; // ebx@69
  GUIButton *pButton; // eax@71
  int pTextHeight; // eax@71
  unsigned __int16 pTextColor; // ax@71
  GUIWindow training_dialog_window; // [sp+Ch] [bp-78h]@1
  int v69; // [sp+70h] [bp-14h]@6
  int v73; // [sp+80h] [bp-4h]@14

  memcpy(&training_dialog_window, window_SpeakInHouse, sizeof(training_dialog_window));
  training_dialog_window.uFrameX = 483;
  training_dialog_window.uFrameWidth = 148;
  training_dialog_window.uFrameZ = 334;
  v5 = 1000ui64 * pPlayers[uActiveCharacter]->uLevel * (pPlayers[uActiveCharacter]->uLevel + 1) / 2;  // E n = n(n + 1) / 2
  //v68 = pMaxLevelPerTrainingHallType[(unsigned int)window_SpeakInHouse->ptr_1C - HOUSE_TRAINING_HALL_EMERALD_ISLE];
  if (pPlayers[uActiveCharacter]->uExperience >= v5)
  {
    v8 = pPlayers[uActiveCharacter]->classType % 4 + 1;
    if ( v8 == 4 )
      v8 = 3;
    v9 = (double)pPlayers[uActiveCharacter]->uLevel;
    v69 = v8;
    v10 = (signed __int64)(v9 * p2DEvents[(signed int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier * (double)v8);
    pPrice = v10 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
    if ( pPrice < v10 / 3 )
      pPrice = v10 / 3;
  }
//-------------------------------------------------------
  all_text_height = 0;
  if (HouseUI_CheckIfPlayerCanInteract())
  {
    if ( dialog_menu_id == HOUSE_DIALOGUE_MAIN )
    {
      if (HouseUI_CheckIfPlayerCanInteract())
      {
        index = 0;
        pShopOptions[0] = pTmpBuf.data();
        pShopOptions[1] = const_cast<char *>(pGlobalTXT_LocalizationStrings[160]);// "Learn Skills"
        if ( pDialogueWindow->pStartingPosActiveItem < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton )
        {
          for ( int i = pDialogueWindow->pStartingPosActiveItem;
                i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
          {
            if ( pDialogueWindow->GetControl(i)->msg_param == HOUSE_DIALOGUE_TRAININGHALL_TRAIN )
            {
              if (pPlayers[uActiveCharacter]->uLevel >= pMaxLevelPerTrainingHallType[(unsigned int)window_SpeakInHouse->ptr_1C - HOUSE_TRAINING_HALL_EMERALD_ISLE])
                sprintfex(pShopOptions[index], "%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."
              else
              {
                if (pPlayers[uActiveCharacter]->uExperience < v5)
                  sprintfex(pShopOptions[index], pGlobalTXT_LocalizationStrings[538], (uint)(v5 - pPlayers[uActiveCharacter]->uExperience), pPlayers[uActiveCharacter]->uLevel + 1); // "You need %d more experience to train to level %d"
                else
                  sprintfex(pShopOptions[index], pGlobalTXT_LocalizationStrings[537], pPlayers[uActiveCharacter]->uLevel + 1, pPrice); // "Train to level %d for %d gold"
              }
            }
            all_text_height += pFontArrus->CalcTextHeight(pShopOptions[index], &training_dialog_window, 0, 0);
            ++index;
          }
        }
        v49 = (2 * (87 - (174 - all_text_height) / 2) - all_text_height) / 2 - (174 - all_text_height) / 2 / 2 + 138;
        if (pDialogueWindow->pStartingPosActiveItem < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton)
        {
          index = 0;
          for ( int i = pDialogueWindow->pStartingPosActiveItem;
                i < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton; ++i )
          {
            pButton = pDialogueWindow->GetControl(i);
            pButton->uY = (174 - all_text_height) / 2 + v49;
            pTextHeight = pFontArrus->CalcTextHeight(pShopOptions[index], &training_dialog_window, 0, 0);
            pButton->uHeight = pTextHeight;
            pButton->uW = pTextHeight + pButton->uY - 1;
            v49 = pButton->uW;
            pTextColor = Color16(0xE1u, 0xCDu, 0x23u);
            if ( pDialogueWindow->pCurrentPosActiveItem != i )
              pTextColor = Color16(255, 255, 255);
            training_dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pShopOptions[index], 3);
            ++index;
          }
        }
      }
    }
//------------------------------------------------------------------
    if ( dialog_menu_id == HOUSE_DIALOGUE_TRAININGHALL_TRAIN )
    {
      if ( !HouseUI_CheckIfPlayerCanInteract() )
      {
        v33 = pFontArrus->CalcTextHeight(pNPCTopics[122].pText, &training_dialog_window, 0, 0);
        training_dialog_window.DrawTitleText(pFontArrus, 0, (212 - v33) / 2 + 101, Color16(0xE1u, 0xCDu, 0x23u), pNPCTopics[122].pText, 3);
        pDialogueWindow->pNumPresenceButton = 0;
        return;
      }
      if ( pPlayers[uActiveCharacter]->uLevel < pMaxLevelPerTrainingHallType[(unsigned int)window_SpeakInHouse->ptr_1C - HOUSE_TRAINING_HALL_EMERALD_ISLE] )
      {
        if ( (signed __int64)pPlayers[uActiveCharacter]->uExperience >= v5 )
        {
          if ( pParty->uNumGold >= pPrice)
          {
            Party::TakeGold(pPrice);
            PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
            ++pPlayers[uActiveCharacter]->uLevel;
            pPlayers[uActiveCharacter]->uSkillPoints += pPlayers[uActiveCharacter]->uLevel / 10 + 5;
            pPlayers[uActiveCharacter]->sHealth = pPlayers[uActiveCharacter]->GetMaxHealth();
            pPlayers[uActiveCharacter]->sMana = pPlayers[uActiveCharacter]->GetMaxMana();
            uint max_level_in_party = player_levels[0];
            for (uint _it = 1; _it < 4; ++_it)
            {
              if (player_levels[_it] > max_level_in_party)
                max_level_in_party = player_levels[_it];
            }
            ++player_levels[uActiveCharacter - 1];
            if (player_levels[uActiveCharacter - 1] > max_level_in_party) // if we reach new maximum party level
                                                                          // feature is broken thou, since this array is always zeroed in EnterHouse
            {
              v42 = 60 * (_494820_training_time(pParty->uCurrentHour) + 4) - pParty->uCurrentMinute;
              if ((unsigned int)window_SpeakInHouse->ptr_1C == HOUSE_TRAINING_HALL_94 ||
                  (unsigned int)window_SpeakInHouse->ptr_1C == HOUSE_TRAINING_HALL_95)
                v42 += 720;
              RestAndHeal((signed int)(v42 + 10080));
              if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor )
                pOutdoor->SetFog();
            }
            pPlayers[uActiveCharacter]->PlaySound(SPEECH_87, 0);
            sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[430], pPlayers[uActiveCharacter]->pName, pPlayers[uActiveCharacter]->uLevel, pPlayers[uActiveCharacter]->uLevel / 10 + 5);// 
                                                // "%s is now Level %lu and has earned %lu Skill Points!"
            ShowStatusBarString(pTmpBuf.data(), 2);
            pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
            return;
          }
          ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);// "You don't have enough gold"
          PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, (HouseSoundID)4);
          pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
          return;
        }
        sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[538], (unsigned int)(v5 - pPlayers[uActiveCharacter]->uExperience), pPlayers[uActiveCharacter]->uLevel + 1);// 
                                                // "You need %d more experience to train to level %d"
        v36 = (212 - pFontArrus->CalcTextHeight(pTmpBuf.data(), &training_dialog_window, 0, 0)) / 2 + 88;
      }
      else
      {
        sprintf(pTmpBuf.data(), "%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.""
        v36 = (212 - pFontArrus->CalcTextHeight(pTmpBuf.data(), &training_dialog_window, 0, 0)) / 2 + 101;
      }
      training_dialog_window.DrawTitleText(pFontArrus, 0, v36, Color16(0xE1u, 0xCDu, 0x23u), pTmpBuf.data(), 3);
      PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, (HouseSoundID)3);
      pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
      return;
    }
  }
//-------------------------------------------------------------
  if ( dialog_menu_id == HOUSE_DIALOGUE_LEARN_SKILLS )
  {
    if (HouseUI_CheckIfPlayerCanInteract())
    {
      v14 = (signed __int64)(p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].flt_24 * 500.0);
      pPrice = v14 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
      if ( pPrice < v14 / 3 )
        pPrice = v14 / 3;
      index = 0;
      for ( int i = pDialogueWindow->pStartingPosActiveItem;
          (signed int)i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
      {
        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pDialogueWindow->GetControl(i)->msg_param - 36]
             && !pPlayers[uActiveCharacter]->pActiveSkills[pDialogueWindow->GetControl(i)->msg_param - 36] )
        {
          all_text_height += pFontArrus->CalcTextHeight(pSkillNames[pDialogueWindow->GetControl(i)->msg_param - 36], &training_dialog_window, 0, 0);
          ++index;
        }
      }
      if ( index )
      {
        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[401], pPrice);// "Skill Cost: %lu"
        training_dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf.data(), 3);
        v73 = (signed int)(149 - all_text_height) / index;
        if ( v73 > 32 )
          v73 = 32;
        v19 = (signed int)(149 - index * v73 - all_text_height) / 2 - v73 / 2 + 162;
        for ( int i = pDialogueWindow->pStartingPosActiveItem;
             (signed int)i < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton; ++i )
        {
          pButton = pDialogueWindow->GetControl(i);
          if ( !byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType][pButton->msg_param - 36]
              || pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param - 36] )
          {
            pButton->uW = 0;
            pButton->uHeight = 0;
            pButton->uY = 0;
          }
          else
          {
            pButton->uY = v73 + v19;
            pTextHeight = pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &training_dialog_window, 0, 0);
            pButton->uHeight = pTextHeight;
            pButton->uW = pButton->uY + pTextHeight - 1;
            v19 = pButton->uY + pTextHeight - 1;
            pTextColor = Color16(0xE1u, 0xCDu, 0x23u);
            if ( pDialogueWindow->pCurrentPosActiveItem != i )
              pTextColor = Color16(255, 255, 255);
            training_dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pSkillNames[pButton->msg_param - 36], 3);
          }
        }
      }
      else
      {
        sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[544], pPlayers[uActiveCharacter]->pName, pClassNames[pPlayers[uActiveCharacter]->classType]);// 
                                              // "Seek knowledge elsewhere %s the %s"
        strcat(pTmpBuf.data(), "\n \n");
        strcat(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[528]);// "I can offer you nothing further."
        pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf.data(), &training_dialog_window, 0, 0);
        training_dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, Color16(0xE1u, 0xCDu, 0x23u), pTmpBuf.data(), 3);
      }
    }
  }
  return;
}

//----- (004B6478) --------------------------------------------------------
void sub_4B6478()
{
  unsigned int v2; // eax@1
  signed int v3; // esi@1
  int pPrice; // ebx@1
  unsigned int v5; // esi@5
  int v6; // edi@6
//  int result; // eax@13
  int all_text_height; // eax@20
//  int v13; // eax@21
  GUIButton *pButton; // esi@27
//  unsigned int v16; // eax@28
  int pTextHeight; // eax@29
  unsigned __int16 pTextColor; // ax@29
//  unsigned __int16 v22; // ST14_2@36
  int v27; // [sp-4h] [bp-80h]@8
  GUIWindow dialog_window; // [sp+Ch] [bp-70h]@1
  int v32; // [sp+6Ch] [bp-10h]@1
  int index; // [sp+74h] [bp-8h]@17

  memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window));
  dialog_window.uFrameX = 483;
  dialog_window.uFrameWidth = 148;
  dialog_window.uFrameZ = 334;
  v2 = 52 * (unsigned int)window_SpeakInHouse->ptr_1C;
  v32 = (unsigned __int8)(((p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].uType != 18) - 1) & 0x96) + 100;
  v3 = (signed __int64)((double)v32 * p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier);
  pPrice = v3 * (100 - pPlayers[uActiveCharacter]->GetMerchant()) / 100;
  if ( pPrice < v3 / 3 )
    pPrice = v3 / 3;
  if ( dialog_menu_id == HOUSE_DIALOGUE_MAIN)
  {
    if ( !(unsigned __int16)_449B57_test_bit((unsigned __int8 *)pPlayers[uActiveCharacter]->_achieved_awards_bits, word_4F0754[2 * (unsigned int)window_SpeakInHouse->ptr_1C]) )
    {
      pTextHeight = pFontArrus->CalcTextHeight(pNPCTopics[171].pText, &dialog_window, 0, 0);//
      dialog_window.DrawTitleText(pFontArrus, 0, (212 - pTextHeight) / 2 + 101, Color16(0xFFu, 0xFFu, 0x9Bu), pNPCTopics[171].pText, 3);
      pDialogueWindow->pNumPresenceButton = 0;
      return;
    }
    if ( !HouseUI_CheckIfPlayerCanInteract() )
      return;
    all_text_height = 0;
    index = 0;
    for ( int i = pDialogueWindow->pStartingPosActiveItem;
          i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
    {
      if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType / 3][pDialogueWindow->GetControl(i)->msg_param - 36]
         && !pPlayers[uActiveCharacter]->pActiveSkills[pDialogueWindow->GetControl(i)->msg_param - 36] )
      {
        all_text_height += pFontArrus->CalcTextHeight(pSkillNames[pDialogueWindow->GetControl(i)->msg_param - 36], &dialog_window, 0, 0);
        ++index;
      }
    }
    if ( !index )
    {
      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[544], pPlayers[uActiveCharacter]->pName, pClassNames[pPlayers[uActiveCharacter]->classType]);
      strcat(pTmpBuf.data(), "\n \n");
      strcat(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[528]);//Больше ничего не могу предложить.
      pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf.data(), &dialog_window, 0, 0);
      dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
      return; 
    }
    sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[401], pPrice);//Стоимость навыка: %lu
    dialog_window.DrawTitleText(pFontArrus, 0, 0x92u, 0, pTmpBuf.data(), 3);
    v32 = (149 - all_text_height) / index;
    if ( v32 > 32 )
      v32 = 32;
    index = (149 - index * v32 - all_text_height) / 2 - v32 / 2 + 162;
    if ( pDialogueWindow->pStartingPosActiveItem < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton )
    {
      for ( int i = pDialogueWindow->pStartingPosActiveItem;
            i <pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
      {
        pButton = pDialogueWindow->GetControl(i);
        if ( byte_4ED970_skill_learn_ability_by_class_table[pPlayers[uActiveCharacter]->classType / 3][pButton->msg_param - 36] )
        {
          if ( !pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param - 36] )
          {
            pButton->uY = v32 + index;
            pTextHeight = pFontArrus->CalcTextHeight(pSkillNames[pButton->msg_param - 36], &dialog_window, 0, 0);
            pButton->uHeight = pTextHeight;
            pButton->uW = pButton->uY + pTextHeight - 1;
            index = pButton->uY + pTextHeight - 1;
            pTextColor = Color16(0xFFu, 0xFFu, 0x9Bu);
            if ( pDialogueWindow->pCurrentPosActiveItem != i )
              pTextColor = Color16(0xFFu, 0xFFu, 0xFFu);
            dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pSkillNames[pButton->msg_param - 36], 3);
          }
        }
        else
        {
          pButton->uW = 0;
          pButton->uHeight = 0;
          pButton->uY = 0;
        }
      }
    }
  return;
  }

  if ( HouseUI_CheckIfPlayerCanInteract() )
  {
    v5 = 0;
    __debugbreak();
    //pSkillAvailabilityPerClass[8 + v58->uClass][4 + v23]
    // or
    //byte_4ED970_skill_learn_ability_by_class_table[v58->uClass][v23 - 36]
    // or
    //byte_4ED970_skill_learn_ability_by_class_table[v58->uClass - 1][v23 + 1]
    __debugbreak(); // whacky condition - fix
    if (false
    //if ( !*(&byte_4ED94C[37 * v1->uClass / 3] + dword_F8B19C)
      || (v6 = (int)(&pPlayers[uActiveCharacter]->uIntelligence + dialog_menu_id), *(short *)v6) )
    {
      pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
    }
    else
    {
      if ( pParty->uNumGold < pPrice )
      {
        ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);//У вас не хватает золота
        v27 = 4;
      }
      else
      {
        Party::TakeGold(pPrice);
        *(short *)v6 = 1;
         v27 = 2;
      }
      PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, (HouseSoundID)v27);
    }
  }
  else
  {
    v5 = 0;
  }
  pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, v5);
  return; // void func
}

//----- (004B2A74) --------------------------------------------------------
void SimpleHouseDialog()
{
  NPCData *pNPC; // esi@6
  char *v15; // esi@14
  GUIButton *pButton; // eax@15
  char *v29; // esi@42
  int v31; // ST1C_4@42
  int index; // esi@51
  int v36;
  signed int all_text_height; // ecx@54
  int v40; // edi@57
  unsigned __int16 pTextColor; // ax@60
  GUIFont *pTextFont; // ebx@64
  int pTextHeight;
  GUIWindow w; // [sp+Ch] [bp-110h]@64
  GUIWindow right_panel_window; // [sp+60h] [bp-BCh]@13
  GUIWindow house_window; // [sp+B4h] [bp-68h]@1
  char *pInString; // [sp+114h] [bp-8h]@12

  memcpy(&house_window, pDialogueWindow, sizeof(house_window));
  if ( pDialogueNPCCount == uNumDialogueNPCPortraits && uHouse_ExitPic )
  {
    house_window.uFrameX = 493;
    house_window.uFrameWidth = 126;
    house_window.uFrameZ = 366;
    house_window.DrawTitleText(pFontCreate, 0, 2, 0, pMapStats->pInfos[uHouse_ExitPic].pName, 3);
    house_window.uFrameX = 483;
    house_window.uFrameWidth = 148;
    house_window.uFrameZ = 334;
    if ( !pTransitionStrings[uHouse_ExitPic] )
    {
      sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[411], pMapStats->pInfos[uHouse_ExitPic].pName);//Войти в ^Pv[%s]
      house_window.DrawTitleText(pFontCreate, 0, (212 - pFontCreate->CalcTextHeight(pTmpBuf.data(), &house_window, 0, 0)) / 2 + 101, 0, pTmpBuf.data(), 3);
      return;
    }
    house_window.DrawTitleText(pFontCreate, 0,
      (212 - pFontCreate->CalcTextHeight(pTransitionStrings[uHouse_ExitPic], &house_window, 0, 0)) / 2 + 101, 0, pTransitionStrings[uHouse_ExitPic], 3);
    return;
  }
  house_window.uFrameWidth -= 10;
  house_window.uFrameZ -= 10;
  pNPC = HouseNPCData[(unsigned int)((char *)pDialogueNPCCount + -(dword_591080 != 0) )];//- 1
  if ( pNPC->uProfession )
    sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[429], pNPC->pName, aNPCProfessionNames[pNPC->uProfession]);//^Pi[%s] %s
  else
    strcpy(pTmpBuf.data(), pNPC->pName);
  house_window.DrawTitleText(pFontCreate, 483, 113, Color16(0x15u, 0x99u, 0xE9u), pTmpBuf.data(), 3);
  if ( !dword_591080 )
  {
    if ( !uDialogueType )
    {
      if ( pNPC->greet )
      {
        house_window.uFrameWidth = game_viewport_width;
        house_window.uFrameZ = 452;
        pInString = pNPCStats->pNPCGreetings[pNPC->greet].pGreetings[((pNPC->uFlags & 3) == 2)];
        //pInString = (char *)*(&pNPCStats->field_17884 + ((pNPC->uFlags & 3) == 2) + 2 * pNPC->greet);
        pRenderer->GetLeather(8, 352 - (pFontArrus->CalcTextHeight(pInString, &house_window, 13, 0) + 7),
           pIcons_LOD->GetTexture(uTextureID_Leather), pIcons_LOD->GetTexture(uTextureID_Leather)->uTextureHeight
           - (pFontArrus->CalcTextHeight(pInString, &house_window, 13, 0) + 7));
        pRenderer->DrawTextureIndexed(8, 347 - (pFontArrus->CalcTextHeight(pInString, &house_window, 13, 0) + 7), pTexture_591428);
        pDialogueWindow->DrawText(pFontArrus, 13, 354 - (pFontArrus->CalcTextHeight(pInString, &house_window, 13, 0) + 7),
                                             0, FitTextInAWindow(pInString, pFontArrus, &house_window, 0xDu, 0), 0, 0, 0);
      }
    }
  }
  //for right panel
  memcpy(&right_panel_window, pDialogueWindow, sizeof(right_panel_window));
  right_panel_window.uFrameX = 483;
  right_panel_window.uFrameWidth = 148;
  right_panel_window.uFrameZ = 334;
  for ( int i = right_panel_window.pStartingPosActiveItem;
            i < right_panel_window.pStartingPosActiveItem + right_panel_window.pNumPresenceButton; ++i )
  {
    pButton = right_panel_window.GetControl(i);
    switch ( pButton->msg_param )
    {
      case 19://evt_A
        v15 = (char *)pNPCTopics[pNPC->evt_A].pTopic;
        if ( !v15 )
        {
          pButton->msg_param = 0;
          v15 = "";
        }
        strcpy(pButton->pButtonName, v15);
        continue;
      case 20://evt_B
        v15 = (char *)pNPCTopics[pNPC->evt_B].pTopic;
        if ( !v15 )
        {
          pButton->msg_param = 0;
          v15 = "";
        }
        if ( uDialogueType != 84 )
        {
          strcpy(pButton->pButtonName, v15);
          continue;
        }
        sprintf(pTmpBuf.data(), format_4E2D80, Color16(0xE1u, 0xCDu, 0x23u), pItemsTable->pItems[contract_approved].pUnidentifiedName);
        sprintf(pTmpBuf2.data(), current_npc_text, pTmpBuf.data());
        current_npc_text = pTmpBuf2.data();
        strcpy(pButton->pButtonName, v15);
        continue;
      case 21://evt_C
        v15 = (char *)pNPCTopics[pNPC->evt_C].pTopic;
        if ( !v15 )
        {
          pButton->msg_param = 0;
          v15 = "";
        }
        strcpy(pButton->pButtonName, v15);
        continue;
      case 22://evt_D
        v15 = (char *)pNPCTopics[pNPC->evt_D].pTopic;
        if ( !v15 )
        {
          pButton->msg_param = 0;
          v15 = "";
        }
        strcpy(pButton->pButtonName, v15);
        continue;
      case 23://evt_E
        v15 = (char *)pNPCTopics[pNPC->evt_E].pTopic;
        if ( !v15 )
        {
          pButton->msg_param = 0;
          v15 = "";
        }
        strcpy(pButton->pButtonName, v15);
        continue;
      case 24://evt_F
        v15 = (char *)pNPCTopics[pNPC->evt_F].pTopic;
        if ( !v15 )
        {
          pButton->msg_param = 0;
          v15 = "";
        }
        strcpy(pButton->pButtonName, v15);
        continue;
      case 76:
        strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[406]);//Нанять
        continue;
      case 77:
        strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[407]);//Подробнее
        continue;
      case 79:
        strcpy(pButton->pButtonName, _4B254D_SkillMasteryTeacher((int)right_panel_window.ptr_1C));
        continue;
      case 82:
        strcpy(pButton->pButtonName, ContractSelectText((int)right_panel_window.ptr_1C));
        continue;
      case 83:
        v29 = pMonsterStats->pInfos[bountyHunting_monster_id_for_hunting].pName;
        v31 = *(int *)v29;
        sprintfex(pTmpBuf.data(), "\f%05d%s\f%05d", Color16(0xFFu, 0xFFu, 0x9Bu), v31, Color16(0xFFu, 0xFFu, 0xFFu));
        sprintfex(pTmpBuf2.data(), bountyHunting_text, pTmpBuf.data(), 100 * (unsigned __int8)v29[8]);
        current_npc_text = pTmpBuf2.data();
        strcpy(pButton->pButtonName, "");
        continue;
    }
    if ( pButton->msg_param > 0 && pButton->msg_param < 13 )
    {
      strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[122]);//Вступить
      continue;
    }
    if ( pButton->msg_param > 13 && pButton->msg_param < 19 )
    {
      strcpy(pButton->pButtonName, "");
      continue;
    }
    if ( pButton->msg_param != 93 )
    {
      strcpy(pButton->pButtonName, "");
      continue;
    }
  }
  index = 0;
  all_text_height = 0;
  for ( int i = pDialogueWindow->pStartingPosActiveItem;
        i < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton; ++i )
  {
    pButton = pDialogueWindow->GetControl(i);
    all_text_height += pFontArrus->CalcTextHeight(pButton->pButtonName, &right_panel_window, 0, 0);
    index++;
  }
  if ( index )
  {
    v36 = (174 - all_text_height) / index;
    if ( v36 > 32 )
      v36 = 32;
    v40 = (174 - v36 * index - all_text_height) / 2 - v36 / 2 + 138;
    for ( int i = pDialogueWindow->pStartingPosActiveItem; i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
    {
      pButton = pDialogueWindow->GetControl(i);
      pButton->uY = v36 + v40;
      pTextHeight = pFontArrus->CalcTextHeight(pButton->pButtonName, &right_panel_window, 0, 0);
      pButton->uHeight = pTextHeight;
      v40 = pButton->uY + pTextHeight - 1;
      pButton->uW = v40;
      pTextColor = Color16(0xE1u, 0xCDu, 0x23u);
      if ( pDialogueWindow->pCurrentPosActiveItem != i )
        pTextColor = Color16(0xFFu, 0xFFu, 0xFFu);
      right_panel_window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pButton->pButtonName, 3);
    }
  }
  if ( current_npc_text )
  {
    w.uFrameWidth = 458;
    w.uFrameZ = 457;
    pTextFont = pFontArrus;
    pTextHeight = pFontArrus->CalcTextHeight(current_npc_text, &w, 13, 0) + 7;
    if ( 352 - pTextHeight < 8 )
    {
      pTextFont = pFontCreate;
      pTextHeight = pFontCreate->CalcTextHeight(current_npc_text, &w, 13, 0) + 7;
    }
    pRenderer->GetLeather(8, 352 - pTextHeight, pIcons_LOD->GetTexture(uTextureID_Leather), pIcons_LOD->GetTexture(uTextureID_Leather)->uTextureHeight - pTextHeight);
    pRenderer->DrawTextureIndexed(8, 347 - pTextHeight, pTexture_591428);
    house_window.DrawText(pTextFont, 13, 354 - pTextHeight, 0, FitTextInAWindow(current_npc_text, pTextFont, &w, 13, 0), 0, 0, 0);
  }
}

//----- (004B4F4F) --------------------------------------------------------
void JailDialog()
{
  GUIWindow jail_dialogue_window; // [sp+8h] [bp-54h]@1

  memcpy(&jail_dialogue_window, window_SpeakInHouse, sizeof(jail_dialogue_window));
  jail_dialogue_window.uFrameX = 483;
  jail_dialogue_window.uFrameWidth = 148;
  jail_dialogue_window.uFrameZ = 334;
  jail_dialogue_window.DrawTitleText(pFontArrus, 0, (310 - pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[672], &jail_dialogue_window, 0, 0)) / 2 + 18,
     Color16(0xFFu, 0xFFu, 0x9Bu), pGlobalTXT_LocalizationStrings[672], 3);//"За многочисленные преступления и злодеяния вы были приговорены к одному году заключения."
}


//----- (00443801) --------------------------------------------------------
void InitializeBuildingResidents()
{

  int i;
  char* test_string;
  unsigned char c;
  bool break_loop;
  unsigned int temp_str_len;
  char* tmp_pos;
  int decode_step;

  free(p2DEventsTXT_Raw);
  p2DEventsTXT_Raw = (char *)pEvents_LOD->LoadRaw("2dEvents.txt", 0);
  strtok(p2DEventsTXT_Raw, "\r");
  strtok(NULL, "\r");

  for (i=0;i<525;++i)
  {
    test_string = strtok(NULL, "\r") + 1;
    break_loop = false;
    decode_step=0;
    do 
    {
      c = *(unsigned char*)test_string;
      temp_str_len = 0;
      while((c!='\t')&&(c>0))
      {
        ++temp_str_len;
        c=test_string[temp_str_len];
      }		
      tmp_pos=test_string+temp_str_len;
      if (*tmp_pos == 0)
        break_loop = true;
      *tmp_pos = 0;
      if (temp_str_len)
      {
        switch (decode_step)
        {
        case 2:
          {
            if ( !_strnicmp(test_string, "wea", 3) )
            {
              p2DEvents[i].uType = BuildingType_WeaponShop;
              break;
            }
            if ( !_strnicmp(test_string, "arm", 3) )
            {
              p2DEvents[i].uType = BuildingType_ArmorShop;
              break;
            }
            if ( !_strnicmp(test_string, "mag", 3) )
            {
              p2DEvents[i].uType = BuildingType_MagicShop;
              break;
            }
            if ( !_strnicmp(test_string, "alc", 3) )
            {
              p2DEvents[i].uType = BuildingType_AlchemistShop;
              break;
            }
            if ( !_strnicmp(test_string, "sta", 3) )
            {
              p2DEvents[i].uType = BuildingType_Stables;
              break;
            }
            if ( !_strnicmp(test_string, "boa", 3) )
            {
              p2DEvents[i].uType = BuildingType_Boats;
              break;
            }
            if ( !_strnicmp(test_string, "tem", 3) )
            {
              p2DEvents[i].uType = BuildingType_Temple;
              break;
            }
            if ( !_strnicmp(test_string, "tra", 3) )
            {
              p2DEvents[i].uType = BuildingType_Training;
              break;
            }
            if ( !_strnicmp(test_string, "tow", 3) )
            {
              p2DEvents[i].uType = BuildingType_TownHall;
              break;
            }

            if ( !_strnicmp(test_string, "tav", 3) )
            {
              p2DEvents[i].uType = BuildingType_Tavern;
              break;
            }
            if ( !_strnicmp(test_string, "ban", 3) )
            {
              p2DEvents[i].uType = BuildingType_Bank;
              break;
            }
            if ( !_strnicmp(test_string, "fir", 3) )
            {
              p2DEvents[i].uType = BuildingType_FireGuild;
              break;
            }
            if ( !_strnicmp(test_string, "air", 3) )
            {
              p2DEvents[i].uType = BuildingType_AirGuild;
              break;
            }
            if ( !_strnicmp(test_string, "wat", 3) )
            {
              p2DEvents[i].uType = BuildingType_WaterGuild;
              break;
            }
            if ( !_strnicmp(test_string, "ear", 3) )
            {
              p2DEvents[i].uType = BuildingType_EarthGuild;
              break;
            }
            if ( !_strnicmp(test_string, "spi", 3) )
            {
              p2DEvents[i].uType = BuildingType_SpiritGuild;
              break;
            }
            if ( !_strnicmp(test_string, "min", 3) )
            {
              p2DEvents[i].uType = BuildingType_MindGuild;
              break;
            }
            if ( !_strnicmp(test_string, "bod", 3) )
            {
              p2DEvents[i].uType = BuildingType_BodyGuild;
              break;
            }
            if ( !_strnicmp(test_string, "lig", 3) )
            {
              p2DEvents[i].uType = BuildingType_LightGuild;
              break;
            }
            if ( !_strnicmp(test_string, "dar", 3) )
            {
              p2DEvents[i].uType = BuildingType_DarkGuild;
              break;
            }
            if ( !_strnicmp(test_string, "ele", 3) ) // "Element Guild" from mm6
            {
              p2DEvents[i].uType = BuildingType_ElementalGuild;
              break;
            }
            if ( !_strnicmp(test_string, "sel", 3) )
            {
              p2DEvents[i].uType = BuildingType_SelfGuild;
              break;
            }
            if ( !_strnicmp(test_string, "mir", 3) )
            {
              p2DEvents[i].uType = BuildingType_16;
              break;
            }
            if ( !_strnicmp(test_string, "mer", 3) ) // "Merc Guild" from mm6
            {
              p2DEvents[i].uType = BuildingType_TownHall;
              break;
            }
            p2DEvents[i].uType = BuildingType_18;
          }
          break;

        case 4:
          p2DEvents[i].uAnimationID = atoi(test_string);
          break;
        case 5:
          p2DEvents[i].pName = RemoveQuotes(test_string);
          break;
        case 6:
          p2DEvents[i].pProprieterName = RemoveQuotes(test_string);
          break;
        case 7:
          p2DEvents[i].pProprieterTitle = RemoveQuotes(test_string);
          break;
        case 8:
          p2DEvents[i].field_14 = atoi(test_string);
          break;
        case 9:
          p2DEvents[i]._state = atoi(test_string);
          break;
        case 10:
          p2DEvents[i]._rep = atoi(test_string);
          break;
        case 11:
          p2DEvents[i]._per = atoi(test_string);
          break;
        case 12:
          p2DEvents[i].fPriceMultiplier = atof(test_string);
          break;
        case 13:
          p2DEvents[i].flt_24 = atof(test_string);
          break;
        case 15:
          p2DEvents[i].field_1C = atoi(test_string);
          break;
        case 18:
          p2DEvents[i].uOpenTime = atoi(test_string);
          break;
        case 19:
          p2DEvents[i].uCloseTime = atoi(test_string);
          break;
        case 20:
          p2DEvents[i].uExitPicID = atoi(test_string);
          break;
        case 21:
          p2DEvents[i].uExitMapID = atoi(test_string);
          break;
        case 22:
          p2DEvents[i]._quest_related = atoi(test_string);
          break;
        case 23:
          p2DEvents[i].pEnterText = RemoveQuotes(test_string);
          break;
        }
      }
      ++decode_step;
      test_string=tmp_pos+1;
    } while ((decode_step<24)&&!break_loop);
  }

}

//----- (004BD8B5) --------------------------------------------------------
int HouseDialogPressCloseBtn()
{
  if ( pMessageQueue_50CBD0->uNumMessages )
    pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
  pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_CANCELLED);
  pKeyActionMap->ResetKeys();
  activeLevelDecoration = nullptr;
  current_npc_text = 0;
  if ( pDialogueNPCCount == 0)
    return 0;

  if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_SPECIAL && ShopTexture )
  {
    ShopTexture->Release();
    ShopTexture = 0;
  }

  switch(dialog_menu_id)
  {
    case -1:
      _4B4224_UpdateNPCTopics((int)((char *)pDialogueNPCCount - 1));
      BackToHouseMenu();
      break;

    case HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT:
    case HOUSE_DIALOGUE_LEARN_SKILLS:
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN:
      BackToHouseMenu();
      UI_CreateEndConversationButton();
      dialog_menu_id = HOUSE_DIALOGUE_MAIN;
      InitializaDialogueOptions(in_current_building_type);
      break;

    case HOUSE_DIALOGUE_SHOP_SELL:
    case HOUSE_DIALOGUE_SHOP_IDENTIFY:
    case HOUSE_DIALOGUE_SHOP_REPAIR:
      UI_CreateEndConversationButton();
      dialog_menu_id = HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT;
      InitializaDialogueOptions_Shops(in_current_building_type);
      break;

    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RULES:
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_VICTORY_CONDITIONS:
    case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RESULT:
      BackToHouseMenu();
      UI_CreateEndConversationButton();
      dialog_menu_id = HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN;
      InitializaDialogueOptions_Tavern(in_current_building_type);
      break;

    case HOUSE_DIALOGUE_NULL:
    case HOUSE_DIALOGUE_MAIN:
      pDialogueNPCCount = 0;
      pDialogueWindow->Release();
      dialog_menu_id = HOUSE_DIALOGUE_NULL;
      pDialogueWindow = 0;
      pIcons_LOD->SyncLoadedFilesCount();

      if ( uNumDialogueNPCPortraits == 1 )
        return 0;

      pBtn_ExitCancel = window_SpeakInHouse->pControlsHead;
      if ( uNumDialogueNPCPortraits > 0 )
      {
        for ( uint i = 0; i < (unsigned int)uNumDialogueNPCPortraits; ++i )
        {
          HouseNPCPortraitsButtonsList[i] = window_SpeakInHouse->CreateButton(pNPCPortraits_x[uNumDialogueNPCPortraits - 1][i],
                                            pNPCPortraits_y[uNumDialogueNPCPortraits - 1][i],
                                            63, 73, 1, 0, UIMSG_ClickHouseNPCPortrait, i, 0, byte_591180[i].data(), 0, 0, 0);
        }
      }

      BackToHouseMenu();
      break;

    default:
      BackToHouseMenu();
      dialog_menu_id = HOUSE_DIALOGUE_MAIN;
      InitializaDialogueOptions(in_current_building_type);
      break;
  }
  return 1;
}

//----- (004BF5B2) --------------------------------------------------------
void BackToHouseMenu()
{
  pMouse->_469E24();
  if ( window_SpeakInHouse && window_SpeakInHouse->ptr_1C == (void *)165 && !pMovie_Track)//!this->pSmackerMovie )
  {
    bGameoverLoop = true;
    HouseDialogPressCloseBtn();
    window_SpeakInHouse->Release();
    pParty->uFlags &= 0xFFFFFFFD;
    if ( EnterHouse(HOUSE_BODY_GUILD_ERATHIA) )
    {
      pAudioPlayer->PlaySound(SOUND_Invalid, 0, 0, -1, 0, 0, 0, 0);
      window_SpeakInHouse = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_HouseInterior, 165, 0);
      window_SpeakInHouse->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 1, 0x31, "", 0);
      window_SpeakInHouse->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 2, 0x32, "", 0);
      window_SpeakInHouse->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 3, 0x33, "", 0);
      window_SpeakInHouse->CreateButton(0x197u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 4, 0x34, "", 0);
    }
    bGameoverLoop = 0;
  }
}