changeset 761:f24fb0d64a5c

TileTable File
author Gloval
date Sat, 23 Mar 2013 17:07:08 +0400
parents 7f1487b74571 (current diff) b2468462a360 (diff)
children a84db04439a4 90bcfb56c8f9 6fef3dae2551
files TileTable.cpp mm7_4.cpp mm7_data.cpp
diffstat 9 files changed, 901 insertions(+), 119 deletions(-) [+]
line wrap: on
line diff
--- a/Player.cpp	Sat Mar 23 17:02:14 2013 +0400
+++ b/Player.cpp	Sat Mar 23 17:07:08 2013 +0400
@@ -8276,7 +8276,7 @@
     currPlayerId = 1;
   else if ( this == pPlayers[3] )
     currPlayerId = 2;
-  else if ( this == pPlayers[4] );
+  else if ( this == pPlayers[4] )
      currPlayerId  = 3;
   if ( var_type > VAR_AutoNotes )
   {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TileTable.cpp	Sat Mar 23 17:07:08 2013 +0400
@@ -0,0 +1,796 @@
+#include  <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "TileFrameTable.h"
+#include "FrameTableInc.h"
+#include "Allocator.h"
+#include "PaletteManager.h"
+#include "LOD.h"
+
+#include "mm7_data.h"
+
+
+//----- (00487E1D) --------------------------------------------------------
+TileTable::~TileTable()
+{
+  if ( pTiles )
+  {
+    pAllocator->FreeChunk(pTiles);
+    pTiles = nullptr;
+  }
+  sNumTiles = 0;
+}
+
+//----- (00487E3B) --------------------------------------------------------
+TileDesc *TileTable::GetTileById(unsigned int uTileID)
+{
+  /*TileDesc *result; // eax@3
+
+  if ( (uTileID & 0x80000000u) != 0 || (signed int)uTileID > (signed int)(this->uNumTiles - 1) )
+    result = this->pTiles;
+  else
+    result = &this->pTiles[uTileID];
+  return result;*/
+
+  assert(uTileID < sNumTiles);
+  return &pTiles[uTileID];
+}
+
+//----- (00487E58) --------------------------------------------------------
+void TileTable::InitializeTileset(Tileset tileset)
+{
+  for (int i = 0; i < sNumTiles; ++i )
+  {
+    if (pTiles[i].tileset == tileset && pTiles[i].pTileName[0] )
+    {
+      pTiles[i].uBitmapID = pBitmaps_LOD->LoadTexture(pTiles[i].pTileName);
+      if ( pTiles[i].uBitmapID != -1 )
+        pBitmaps_LOD->pTextures[pTiles[i].uBitmapID].palette_id2 = pPaletteManager->LoadPalette(pBitmaps_LOD->pTextures[pTiles[i].uBitmapID].palette_id1);
+    }
+  }
+}
+
+//----- (00487ED6) --------------------------------------------------------
+int TileTable::GetTileForTerrainType( signed int terrain_type, bool not_random )
+    {
+  int v5; // edx@3
+  int v6; // edx@11
+
+  if (  not_random || terrain_type > 8 )
+  {
+    return GetTileId(terrain_type, 0);
+  }
+   v5 = rand() % 50;
+  if ( v5 < 20)
+  {
+    return GetTileId(terrain_type, 0);
+  }
+  else if ( v5 < 30 )
+  {
+    return GetTileId(terrain_type, 1);
+  }
+  else if ( v5 < 40 )
+  {
+    return GetTileId(terrain_type, 2);
+  }
+  else if ( v5 < 48 )
+  {
+    return GetTileId(terrain_type, 3);
+  }
+  v6 = rand() % 8;
+  return GetTileId(terrain_type, v6+4);
+  return 0;
+}
+
+//----- (00487F84) --------------------------------------------------------
+unsigned int TileTable::GetTileId(unsigned int uTerrainType, unsigned int uSection)
+{  
+  for (int i=0; i<sNumTiles; ++i)
+      {
+      if( (pTiles[i].tileset==uTerrainType)&&(pTiles[i].uSection==uSection))
+          return i;
+      }
+  return 0;
+}
+
+//----- (00487FB4) --------------------------------------------------------
+void TileTable::ToFile()
+{
+  TileTable *v1; // esi@1
+  FILE *v2; // eax@1
+  FILE *v3; // edi@1
+
+  auto Str = this;
+
+  v1 = Str;
+  v2 = fopen("data\\dtile.bin", "wb");
+  v3 = v2;
+  if ( !v2 )
+    Abortf("Unable to save dtile.bin!");
+  fwrite(v1, 4u, 1u, v2);
+  fwrite(v1->pTiles, 0x1Au, v1->sNumTiles, v3);
+  fclose(v3);
+}
+
+//----- (00488000) --------------------------------------------------------
+void TileTable::FromFile(void *pSerialized)
+{
+  sNumTiles = *(int *)pSerialized;
+  pTiles = (TileDesc *)pAllocator->AllocNamedChunk(pTiles, sizeof(TileDesc) * sNumTiles, "Tile Descrip");
+  memcpy(pTiles, (char *)pSerialized + 4, sizeof(TileDesc) * sNumTiles);
+}
+
+//----- (00488047) --------------------------------------------------------
+int TileTable::FromFileTxt(const char *pFilename)
+{
+  TileTable *v2; // ebp@1
+  FILE *v3; // eax@1
+  unsigned int v4; // ebx@3
+  void *v5; // eax@9
+  unsigned __int16 v6; // ax@14
+  const char *v7; // ST14_4@14
+  unsigned __int16 v8; // ax@14
+  const char *v9; // esi@14
+  int v10; // eax@17
+  int v11; // eax@20
+  int v12; // eax@22
+  int v13; // eax@24
+  int v14; // eax@26
+  int v15; // eax@28
+  int v16; // eax@30
+  int v17; // eax@32
+  int v18; // eax@34
+  int v19; // eax@36
+  int v20; // eax@38
+  int v21; // eax@40
+  int v22; // eax@42
+  int v23; // eax@44
+  int v24; // eax@46
+  int v25; // eax@48
+  int v26; // eax@50
+  int v27; // eax@52
+  int v28; // eax@54
+  int v29; // eax@56
+  int v30; // eax@58
+  int v31; // eax@60
+  int v32; // eax@62
+  int v33; // eax@64
+  int v34; // eax@66
+  const char *v35; // esi@67
+  int v36; // eax@70
+  int v37; // eax@73
+  int v38; // eax@75
+  int v39; // eax@77
+  int v40; // eax@79
+  int v41; // eax@81
+  int v42; // eax@83
+  int v43; // eax@85
+  int v44; // eax@87
+  int v45; // eax@89
+  int v46; // eax@91
+  int v47; // eax@93
+  int v48; // eax@108
+  int v49; // eax@110
+  int v50; // eax@112
+  int v51; // eax@114
+  int v52; // eax@116
+  int v53; // eax@118
+  int v54; // eax@120
+  int v55; // eax@122
+  int v56; // eax@124
+  int v57; // eax@126
+  int v58; // eax@128
+  int v59; // eax@130
+  int v60; // eax@132
+  int v61; // eax@134
+  int v62; // eax@136
+  int v63; // eax@138
+  int v64; // eax@140
+  int v65; // eax@142
+  int v66; // eax@144
+  int v67; // eax@146
+  int v68; // eax@148
+  int v69; // eax@150
+  int v70; // eax@151
+  int j; // edi@152
+  const char *v72; // esi@153
+  int v73; // eax@154
+  int v74; // eax@156
+  int v75; // eax@160
+  int v76; // eax@162
+  int v77; // eax@164
+  int v78; // eax@166
+  int v79; // eax@168
+  int v80; // eax@170
+  FILE *i; // [sp-10h] [bp-304h]@3
+  FILE *File; // [sp+4h] [bp-2F0h]@1
+  FrameTableTxtLine v84; // [sp+8h] [bp-2ECh]@4
+  FrameTableTxtLine v85; // [sp+84h] [bp-270h]@4
+  char Buf; // [sp+100h] [bp-1F4h]@4
+
+  v2 = this;
+  v3 = fopen(pFilename, "r");
+  File = v3;
+  if ( !v3 )
+    Abortf("TileTable::load - Unable to open file: %s.");
+  v4 = 0;
+  for ( i = v3; fgets(&Buf, 490, i); i = File )
+  {
+    *strchr(&Buf, 10) = 0;
+    memcpy(&v84, txt_file_frametable_parser(&Buf, &v85), sizeof(v84));
+    if ( v84.uPropCount && *v84.pProperties[0] != 47 )
+      ++v4;
+  }
+  v2->sNumTiles = v4;
+  v5 = pAllocator->AllocNamedChunk(v2->pTiles, 26 * v4, "Tile Descrip");
+  v2->pTiles = (TileDesc *)v5;
+  if ( !v5 )
+    Abortf("TileTable::Load - Out of Memory!");
+  memset(v5, 0, 26 * v2->sNumTiles);
+  v2->sNumTiles = 0;
+  fseek(File, 0, 0);
+  if ( fgets(&Buf, 490, File) )
+  {
+    while ( 1 )
+    {
+      *strchr(&Buf, 10) = 0;
+      memcpy(&v84, txt_file_frametable_parser(&Buf, &v85), sizeof(v84));
+      if ( v84.uPropCount )
+      {
+        if ( *v84.pProperties[0] != 47 )
+          break;
+      }
+LABEL_173:
+      if ( !fgets(&Buf, 490, File) )
+        goto LABEL_174;
+    }
+    strcpy(v2->pTiles[v2->sNumTiles].pTileName, v84.pProperties[0]);
+    v6 = atoi(v84.pProperties[1]);
+    v7 = v84.pProperties[2];
+    v2->pTiles[v2->sNumTiles].uTileID = v6;
+    v8 = atoi(v7);
+    v9 = v84.pProperties[3];
+    v2->pTiles[v2->sNumTiles].uBitmapID = v8;
+    v2->pTiles[v2->sNumTiles].tileset = Tileset_Grass;
+    if ( _strcmpi(v9, "TTtype_NULL") )
+    {
+      if ( _strcmpi(v9, "TTtype_Start") )
+      {
+        if ( _strcmpi(v9, "TTtype_Grass") )
+        {
+          if ( _strcmpi(v9, "TTtype_Cracked") )
+          {
+            if ( _strcmpi(v9, "TTtype_Snow") )
+            {
+              if ( _strcmpi(v9, "TTtype_Sand") )
+              {
+                if ( _strcmpi(v9, "TTtype_Volcano") )
+                {
+                  if ( _strcmpi(v9, "TTtype_Dirt") )
+                  {
+                    if ( _strcmpi(v9, "TTtype_Water") )
+                    {
+                      if ( _strcmpi(v9, "TTtype_Tropical") )
+                      {
+                        if ( _strcmpi(v9, "TTtype_Swamp") )
+                        {
+                          if ( _strcmpi(v9, "TTtype_City") )
+                          {
+                            if ( _strcmpi(v9, "TTtype_RoadGrassCobble") )
+                            {
+                              if ( _strcmpi(v9, "TTtype_RoadGrassDirt") )
+                              {
+                                if ( _strcmpi(v9, "TTtype_RoadCrackedCobble") )
+                                {
+                                  if ( _strcmpi(v9, "TTtype_RoadCrackedDirt") )
+                                  {
+                                    if ( _strcmpi(v9, "TTtype_RoadSandCobble") )
+                                    {
+                                      if ( _strcmpi(v9, "TTtype_RoadSandDirt") )
+                                      {
+                                        if ( _strcmpi(v9, "TTtype_RoadVolcanoCobble") )
+                                        {
+                                          if ( _strcmpi(v9, "TTtype_RoadVolcanoDirt") )
+                                          {
+                                            if ( _strcmpi(v9, "TTtype_RoadSwampCobble") )
+                                            {
+                                              if ( _strcmpi(v9, "TTtype_RoadSwampDirt") )
+                                              {
+                                                if ( _strcmpi(v9, "TTtype_RoadTropicalCobble") )
+                                                {
+                                                  if ( _strcmpi(v9, "TTtype_RoadTropicalDirt") )
+                                                  {
+                                                    if ( _strcmpi(v9, "TTtype_RoadSnowCobble") )
+                                                    {
+                                                      if ( _strcmpi(v9, "TTtype_RoadSnowDirt") )
+                                                      {
+                                                        if ( !_strcmpi(v9, "TTtype_RoadCityStone") )
+                                                        {
+                                                          v34 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                                          *(char *)v34 |= 0x1Cu;
+                                                        }
+                                                      }
+                                                      else
+                                                      {
+                                                        v33 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                                        *(char *)v33 |= 0xDu;
+                                                      }
+                                                    }
+                                                    else
+                                                    {
+                                                      v32 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                                      *(char *)v32 |= 0xCu;
+                                                    }
+                                                  }
+                                                  else
+                                                  {
+                                                    v31 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                                    *(char *)v31 |= 0x1Bu;
+                                                  }
+                                                }
+                                                else
+                                                {
+                                                  v30 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                                  *(char *)v30 |= 0x1Au;
+                                                }
+                                              }
+                                              else
+                                              {
+                                                v29 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                                *(char *)v29 |= 0x19u;
+                                              }
+                                            }
+                                            else
+                                            {
+                                              v28 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                              *(char *)v28 |= 0x18u;
+                                            }
+                                          }
+                                          else
+                                          {
+                                            v27 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                            *(char *)v27 |= 0x11u;
+                                          }
+                                        }
+                                        else
+                                        {
+                                          v26 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                          *(char *)v26 |= 0x10u;
+                                        }
+                                      }
+                                      else
+                                      {
+                                        v25 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                        *(char *)v25 |= 0xFu;
+                                      }
+                                    }
+                                    else
+                                    {
+                                      v24 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                      *(char *)v24 |= 0xEu;
+                                    }
+                                  }
+                                  else
+                                  {
+                                    v23 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                    *(char *)v23 |= 0x17u;
+                                  }
+                                }
+                                else
+                                {
+                                  v22 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                  *(char *)v22 |= 0x16u;
+                                }
+                              }
+                              else
+                              {
+                                v21 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                                *(char *)v21 |= 0xBu;
+                              }
+                            }
+                            else
+                            {
+                              v20 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                              *(char *)v20 |= 0xAu;
+                            }
+                          }
+                          else
+                          {
+                            v19 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                            *(char *)v19 |= 9u;
+                          }
+                        }
+                        else
+                        {
+                          v18 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                          *(char *)v18 |= 7u;
+                        }
+                      }
+                      else
+                      {
+                        v17 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                        *(char *)v17 |= 8u;
+                      }
+                    }
+                    else
+                    {
+                      v16 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                      *(char *)v16 |= 5u;
+                    }
+                  }
+                  else
+                  {
+                    v15 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                    *(char *)v15 |= 4u;
+                  }
+                }
+                else
+                {
+                  v14 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                  *(char *)v14 |= 3u;
+                }
+              }
+              else
+              {
+                v13 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+                *(char *)v13 |= 2u;
+              }
+            }
+            else
+            {
+              v12 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+              *(char *)v12 |= 1u;
+            }
+          }
+          else
+          {
+            v11 = (int)&v2->pTiles[v2->sNumTiles].tileset;
+            *(char *)v11 |= 6u;
+          }
+        }
+      }
+      else
+      {
+        v10 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+        *(char *)v10 |= 0xFEu;
+      }
+    }
+    else
+    {
+      LOBYTE(v2->pTiles[v2->sNumTiles].tileset) = -1;
+    }
+    v35 = v84.pProperties[4];
+    v2->pTiles[v2->sNumTiles].uSection = 0;
+    v2->pTiles[v2->sNumTiles].uAttributes = 0;
+    if ( !_strcmpi(v35, "TTsect_NULL") )
+    {
+      LOBYTE(v2->pTiles[v2->sNumTiles].uSection) = -1;
+LABEL_152:
+      for ( j = 5; j < v84.uPropCount; ++j )
+      {
+        v72 = v84.pProperties[j];
+        if ( _strcmpi(v84.pProperties[j], "TTattr_Burn") )
+        {
+          if ( _strcmpi(v72, "TTattr_Water") )
+          {
+            if ( _strcmpi(v72, "TTattr_Water2") )
+            {
+              if ( _strcmpi(v72, "TTattr_Block") )
+              {
+                if ( _strcmpi(v72, "TTattr_Repulse") )
+                {
+                  if ( _strcmpi(v72, "TTattr_Flat") )
+                  {
+                    if ( _strcmpi(v72, "TTattr_Wave") )
+                    {
+                      if ( _strcmpi(v72, "TTattr_NoDraw") )
+                      {
+                        if ( !_strcmpi(v72, "TTattr_Transition") )
+                        {
+                          v80 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
+                          *(short *)v80 |= 0x200u;
+                        }
+                      }
+                      else
+                      {
+                        v79 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
+                        *(char *)v79 |= 0x40u;
+                      }
+                    }
+                    else
+                    {
+                      v78 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
+                      *(char *)v78 |= 0x20u;
+                    }
+                  }
+                  else
+                  {
+                    v77 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
+                    *(char *)v77 |= 0x10u;
+                  }
+                }
+                else
+                {
+                  v76 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
+                  *(char *)v76 |= 8u;
+                }
+              }
+              else
+              {
+                v75 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
+                *(char *)v75 |= 4u;
+              }
+            }
+            else
+            {
+              HIBYTE(v2->pTiles[v2->sNumTiles].uAttributes) |= 1u;
+            }
+          }
+          else
+          {
+            v74 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
+            *(char *)v74 |= 2u;
+          }
+        }
+        else
+        {
+          v73 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
+          *(char *)v73 |= 1u;
+        }
+      }
+      ++v2->sNumTiles;
+      goto LABEL_173;
+    }
+    if ( !_strcmpi(v35, "TTsect_Start") )
+    {
+      v36 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v36 |= 0xFEu;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Base1") )
+      goto LABEL_152;
+    if ( !_strcmpi(v35, "TTsect_Base2") )
+    {
+      v37 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v37 |= 1u;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Base3") )
+    {
+      v38 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v38 |= 2u;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Base4") )
+    {
+      v39 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v39 |= 3u;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Special1") )
+    {
+      v40 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v40 |= 4u;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Special2") )
+    {
+      v41 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v41 |= 5u;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Special3") )
+    {
+      v42 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v42 |= 6u;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Special4") )
+    {
+      v43 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v43 |= 7u;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Special5") )
+    {
+      v44 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v44 |= 8u;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Special6") )
+    {
+      v45 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v45 |= 9u;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Special7") )
+    {
+      v46 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v46 |= 0xAu;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_Special8") )
+    {
+      v47 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+      *(char *)v47 |= 0xBu;
+      goto LABEL_152;
+    }
+    if ( !_strcmpi(v35, "TTsect_NE1") )
+      goto LABEL_130;
+    if ( !_strcmpi(v35, "TTsect_NW1") )
+      goto LABEL_134;
+    if ( !_strcmpi(v35, "TTsect_SE1") )
+      goto LABEL_130;
+    if ( !_strcmpi(v35, "TTsect_SW1") )
+      goto LABEL_134;
+    if ( !_strcmpi(v35, "TTsect_E1") )
+      goto LABEL_138;
+    if ( !_strcmpi(v35, "TTsect_W1") )
+      goto LABEL_140;
+    if ( !_strcmpi(v35, "TTsect_N1") )
+      goto LABEL_142;
+    if ( !_strcmpi(v35, "TTsect_S1") )
+      goto LABEL_144;
+    if ( !_strcmpi(v35, "TTsect_XNE1") )
+      goto LABEL_146;
+    if ( _strcmpi(v35, "TTsect_XNW1") )
+    {
+      if ( !_strcmpi(v35, "TTsect_XSE1") )
+        goto LABEL_146;
+      if ( _strcmpi(v35, "TTsect_XSW1") )
+      {
+        if ( !_strcmpi(v35, "TTsect_CROS") )
+        {
+LABEL_151:
+          v70 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
+          *(short *)v70 |= 0x200u;
+          goto LABEL_152;
+        }
+        if ( !_strcmpi(v35, "TTsect_NS") )
+        {
+          v48 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v48 |= 1u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_EW") )
+        {
+          v49 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v49 |= 2u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_N_E") )
+        {
+          v50 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v50 |= 3u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_N_W") )
+        {
+          v51 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v51 |= 4u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_S_E") )
+        {
+          v52 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v52 |= 5u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_S_W") )
+        {
+          v53 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v53 |= 6u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_NS_E") )
+        {
+          v54 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v54 |= 7u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_NS_W") )
+        {
+          v55 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v55 |= 8u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_EW_N") )
+        {
+          v56 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v56 |= 9u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_EW_S") )
+        {
+          v57 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v57 |= 0xAu;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_NCAP") )
+        {
+          v58 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v58 |= 0xBu;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_ECAP") )
+        {
+LABEL_130:
+          v59 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v59 |= 0xCu;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_SCAP") )
+        {
+          v60 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v60 |= 0xDu;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_WCAP") )
+        {
+LABEL_134:
+          v61 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v61 |= 0xEu;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_DN") )
+        {
+          v62 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v62 |= 0xFu;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_DS") )
+        {
+LABEL_138:
+          v63 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v63 |= 0x10u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_DW") )
+        {
+LABEL_140:
+          v64 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v64 |= 0x11u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_DE") )
+        {
+LABEL_142:
+          v65 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v65 |= 0x12u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_DSW") )
+        {
+LABEL_144:
+          v66 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v66 |= 0x13u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_DNE") )
+        {
+LABEL_146:
+          v67 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v67 |= 0x14u;
+          goto LABEL_151;
+        }
+        if ( !_strcmpi(v35, "TTsect_DSE") )
+        {
+          v68 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+          *(char *)v68 |= 0x15u;
+          goto LABEL_151;
+        }
+        if ( _strcmpi(v35, "TTsect_DNW") )
+          goto LABEL_152;
+      }
+    }
+    v69 = (int)&v2->pTiles[v2->sNumTiles].uSection;
+    *(char *)v69 |= 0x16u;
+    goto LABEL_151;
+  }
+LABEL_174:
+  fclose(File);
+  return 1;
+}
+
--- a/UIHouses.cpp	Sat Mar 23 17:02:14 2013 +0400
+++ b/UIHouses.cpp	Sat Mar 23 17:07:08 2013 +0400
@@ -409,7 +409,7 @@
 	dword_F8B1E4 = 0;
 	dword_F8B1F4 = 0;
 	memset(byte_F8B1F0, 0, 4);
-	memset(byte_F8B148, 0, 16);
+	memset(player_levels, 0, 16);
 	pRenderer->ClearZBuffer(0, 479);
 
 	if (((uCloseTime - 1 <= uOpenTime)&&((pParty->uCurrentHour <uOpenTime)&&(pParty->uCurrentHour >(uCloseTime - 1))))||
@@ -738,7 +738,7 @@
 			}
 			if ( v1 > pParty->uNumGold )
 			{
-				PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney);
+				PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
 				v2 = pParty->uNumGold;
 			}
 			if ( v2 > pParty->uFine )
@@ -834,7 +834,7 @@
 				}
 				if ( v6 > pParty->uNumGold )
 				{
-					PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney);
+					PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
 					v7 = pParty->uNumGold;
 				}
 				if ( v7 )
@@ -881,7 +881,7 @@
 				{
 					if ( v2 > pParty->uNumGoldInBank )
 					{
-						PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney);
+						PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
 						v3 = pParty->uNumGoldInBank;
 					}
 					if ( v3 )
@@ -1194,7 +1194,7 @@
       {
         Party::TakeGold((unsigned int)pOutString);
         v27 = (int)window_SpeakInHouse->ptr_1C;
-        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney);
+        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
         dialog_menu_id = HOUSE_DIALOGUE_NULL;
         sub_4BD8B5();
         sub_4B1D27();
@@ -1553,7 +1553,7 @@
         v106.x = 0;
         do
         {
-          if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v55].uItemID);//9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] )
+          if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v55].uItemID)//9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] )
             ++v106.x;
           ++v55;
         }
@@ -2056,7 +2056,7 @@
       v114 = 0;
       do
       {
-        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v114].uItemID);
+        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v114].uItemID)
         {
           v46 = ItemsInShopTexture[v114];
           v47 = 152 - v46->uTextureHeight;
@@ -2083,7 +2083,7 @@
       v114 = 0;
       do
       {
-        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v114+1].uItemID);
+        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v114+1].uItemID)
         {
           v50 = ItemsInShopTexture[v114 + 6];
           v51 = 308 - v50->uTextureHeight;
@@ -2116,7 +2116,7 @@
         v109 = 0;
         do
         {
-          if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v62].uItemID);
+          if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v62].uItemID)
             ++v109;
           ++v62;
         }
@@ -2702,7 +2702,7 @@
         v149 = 0;
         for(int i=0; i<8; ++i)
             {
-            if ( pParty->StandartItemsInShops[window_SpeakInHouse->par1C][i].uItemID);
+            if ( pParty->StandartItemsInShops[window_SpeakInHouse->par1C][i].uItemID)
             ++v149;
 
             }
@@ -3242,7 +3242,7 @@
                         if ( pParty->uNumGold < v63 )
                             {
                             ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); //"You don't have enough gold"
-                            PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney);
+                            PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
                             }
                         else
                             {
@@ -3726,7 +3726,7 @@
             {
 LABEL_55:
             ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u);
-            PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney);
+            PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
             goto LABEL_46;
             }
         Party::TakeGold(v2);
@@ -3844,7 +3844,7 @@
     }
 
 //----- (004B4710) --------------------------------------------------------
-int __cdecl TrainingDialog()
+void TrainingDialog()
 {
   //Player *v0; // ebx@1
   int color2; // eax@1
@@ -3858,7 +3858,7 @@
   double v9; // st7@6
   signed int v10; // esi@6
   int v11; // ecx@6
-  int result; // eax@9
+  //int result; // eax@9
   GUIWindow *v13; // edi@14
   signed int v14; // esi@14
   unsigned int v15; // esi@16
@@ -3874,29 +3874,29 @@
   unsigned int v25; // ecx@28
   int v26; // eax@28
   unsigned __int16 v27; // ax@28
-  int v28; // eax@32
+  //int v28; // eax@32
   unsigned __int16 v29; // ST14_2@34
   int v30; // eax@34
-  const char *v31; // ST18_4@36
-  unsigned __int16 v32; // ST14_2@36
+  //const char *v31; // ST18_4@36
+  //unsigned __int16 v32; // ST14_2@36
   int v33; // eax@36
   int v34; // eax@37
   unsigned int v35; // edi@38
   unsigned int v36; // eax@38
-  int v37; // ecx@41
-  char *v38; // eax@41
-  int *v39; // eax@45
+  //int v37; // ecx@41
+  //char *v38; // eax@41
+  //int *v39; // eax@45
   unsigned int v40; // eax@46
-  void *v41; // ecx@46
+  //void *v41; // ecx@46
   unsigned int v42; // eax@46
   GUIWindow *v43; // ecx@59
   int v44; // edx@59
   char **v45; // esi@60
-  int v46; // eax@62
+  //int v46; // eax@62
   int v47; // eax@68
-  int v48; // edx@69
+  //int v48; // edx@69
   int v49; // ebx@69
-  unsigned __int8 v50; // sf@69
+  //unsigned __int8 v50; // sf@69
   char **v51; // edi@70
   GUIButton *v52; // eax@71
   GUIButton *v53; // esi@71
@@ -3905,12 +3905,12 @@
   int v56; // eax@71
   unsigned __int16 v57; // ax@71
   unsigned __int16 v58; // [sp-Ch] [bp-90h]@38
-  const char *v59; // [sp-Ch] [bp-90h]@63
+  //const char *v59; // [sp-Ch] [bp-90h]@63
   char *v60; // [sp-8h] [bp-8Ch]@38
-  char *v61; // [sp-8h] [bp-8Ch]@63
+  //char *v61; // [sp-8h] [bp-8Ch]@63
   unsigned int v62; // [sp-4h] [bp-88h]@38
   int v63; // [sp-4h] [bp-88h]@52
-  char *v64; // [sp-4h] [bp-88h]@63
+  //char *v64; // [sp-4h] [bp-88h]@63
   GUIWindow v65; // [sp+Ch] [bp-78h]@1
   //__int64 v66; // [sp+60h] [bp-24h]@3
   unsigned int white; // [sp+68h] [bp-1Ch]@1
@@ -3926,7 +3926,7 @@
   v65.uFrameX = 483;
   v65.uFrameWidth = 148;
   v65.uFrameZ = 334;
-  white = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
+  white = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(255, 255, 255);
   color2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u);
   //v71 = color2;
   //v2 = v0->uLevel;
@@ -3938,7 +3938,7 @@
   v5 = 1000ui64 * pPlayers[uActiveCharacter]->uLevel * (pPlayers[uActiveCharacter]->uLevel + 1) / 2;  // E n = n(n + 1) / 2
   //v6 = HIDWORD(v0->uExperience);
   //v7 = window_SpeakInHouse->ptr_1C;
-  v68 = pMaxLevelPerTrainingHallType[(unsigned int)window_SpeakInHouse->ptr_1C - 89];
+  v68 = pMaxLevelPerTrainingHallType[(unsigned int)window_SpeakInHouse->ptr_1C - HOUSE_TRAINING_HALL_EMERALD_ISLE];
   //v66 = 1000 * v3;
   if (pPlayers[uActiveCharacter]->uExperience >= v5)
   {
@@ -3955,18 +3955,16 @@
       v11 = v10 / 3;
     //i = v11;
   }
-  result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
-  if ( result )
+
+  if (sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win())
   {
     if ( dialog_menu_id != HOUSE_DIALOGUE_MAIN )
     {
-      if ( dialog_menu_id != HOUSE_DIALOGUE_TRAININGHALL_17 )
+      if ( dialog_menu_id != HOUSE_DIALOGUE_TRAININGHALL_TRAIN )
       {
-        result = dialog_menu_id - 96;
         if ( dialog_menu_id == HOUSE_DIALOGUE_LEARN_SKILLS )
         {
-          result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
-          if ( result )
+          if (sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win())
           {
             //i = 0;
             int _v0 = 0;
@@ -4000,11 +3998,11 @@
               v73 = (signed int)(149 - _v0) / v72;
               if ( v73 > 32 )
                 v73 = 32;
-              result = v13->pStartingPosActiveItem;
+              //result = v13->pStartingPosActiveItem;
               v19 = (signed int)(149 - v72 * v73 - _v0) / 2 - v73 / 2 + 162;
-              int _v1 = result;
+              int _v1 = v13->pStartingPosActiveItem;
               v68 = v19;
-              if ( result < result + v13->pNumPresenceButton )
+              if (v13->pStartingPosActiveItem < v13->pStartingPosActiveItem + v13->pNumPresenceButton )
               {
                 v72 = 2;
                 do
@@ -4034,12 +4032,10 @@
                       v27 = white;
                     v65.DrawTitleText(pFontArrus, 0, v25, v27, v23, 3u);
                   }
-                  v28 = v13->pStartingPosActiveItem;
                   ++_v1;
-                  result = v13->pNumPresenceButton + v28;
                   ++v72;
                 }
-                while ( (signed int)_v1 < result );
+                while ( (signed int)_v1 < v13->pStartingPosActiveItem + v13->pNumPresenceButton );
               }
             }
             else
@@ -4051,21 +4047,20 @@
               strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);// "I can offer you nothing further."
               v29 = color2;
               v30 = pFontArrus->CalcTextHeight(pTmpBuf, &v65, 0, 0);
-              result = (int)v65.DrawTitleText(pFontArrus, 0, (174 - v30) / 2 + 138, v29, pTmpBuf, 3u);
+              (int)v65.DrawTitleText(pFontArrus, 0, (174 - v30) / 2 + 138, v29, pTmpBuf, 3u);
             }
           }
         }
-        return result;
+        return;
       }
       if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
       {
-        v31 = pNPCTopics[122].pText;
-        v32 = color2;
+        //v31 = pNPCTopics[122].pText;
+        //v32 = color2;
         v33 = pFontArrus->CalcTextHeight(pNPCTopics[122].pText, &v65, 0, 0);
-        v65.DrawTitleText(pFontArrus, 0, (212 - v33) / 2 + 101, v32, v31, 3);
-        result = (int)pDialogueWindow;
+        v65.DrawTitleText(pFontArrus, 0, (212 - v33) / 2 + 101, color2, pNPCTopics[122].pText, 3);
         pDialogueWindow->pNumPresenceButton = 0;
-        return result;
+        return;
       }
       v34 = pPlayers[uActiveCharacter]->uLevel;
       if ( v34 < v68 )
@@ -4075,28 +4070,28 @@
           if ( pParty->uNumGold >= v11)
           {
             Party::TakeGold(v11);
-            PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney);
+            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();
-            v37 = 0;
-            v38 = byte_F8B148;
-            do
+
+            uint max_level_in_party = player_levels[0];
+            for (uint _it = 1; _it < 4; ++_it)
             {
-              if ( *(int *)v38 > v37 )
-                v37 = *(int *)v38;
-              v38 += 4;
+              if (player_levels[_it] > max_level_in_party)
+                max_level_in_party = player_levels[_it];
             }
-            while ( (signed int)v38 < (signed int)word_F8B158 );
-            v39 = &dword_F8B144 + uActiveCharacter;
-            ++*v39;
-            if ( *v39 > v37 )
+
+            ++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
             {
-              v40 = sub_494820(pParty->uCurrentHour);
-              v41 = window_SpeakInHouse->ptr_1C;
+              v40 = _494820_training_time(pParty->uCurrentHour);
+              //v41 = window_SpeakInHouse->ptr_1C;
               v42 = 60 * (v40 + 4) - pParty->uCurrentMinute;
-              if ( v41 == (void *)94 || v41 == (void *)95 )
+              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 )
@@ -4107,7 +4102,7 @@
                                                 // "%s is now Level %lu and has earned %lu Skill Points!"
             ShowStatusBarString(pTmpBuf, 2);
             pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
-            return true;
+            return;
           }
           ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2);// "You don't have enough gold"
           v63 = 4;
@@ -4125,7 +4120,7 @@
           }
           return result;*/
           pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0);
-          return 1; // void function actually
+          return;
         }
         sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[538], (unsigned int)(v5 - pPlayers[uActiveCharacter]->uExperience), v34 + 1);// 
                                                 // "You need %d more experience to train to level %d"
@@ -4150,8 +4145,8 @@
       v63 = 3;
       goto LABEL_55;
     }
-    result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win();
-    if ( result )
+
+    if (sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win())
     {
       v43 = pDialogueWindow;
       v72 = 0;
@@ -4164,31 +4159,21 @@
         v45 = pShopOptions;
         do
         {
-          if ( v43->GetControl(v73)->uControlParam == 17 )
+          if ( v43->GetControl(v73)->uControlParam == HOUSE_DIALOGUE_TRAININGHALL_TRAIN )
           {
-            v46 = pPlayers[uActiveCharacter]->uLevel;
-            if ( v46 < v68 )
-            {
-              if ( (signed __int64)pPlayers[uActiveCharacter]->uExperience < v5 )
-              {
-                v64 = (char *)(v46 + 1);
-                v61 = (char *)(v5 - LODWORD(pPlayers[uActiveCharacter]->uExperience));
-                v59 = pGlobalTXT_LocalizationStrings[538];// "You need %d more experience to train to level %d"
-              }
-              else
-              {
-                v64 = (char *)v11;
-                v61 = (char *)(v46 + 1);
-                v59 = pGlobalTXT_LocalizationStrings[537];// "Train to level %d for %d gold"
-              }
-            }
+            //v46 = pPlayers[uActiveCharacter]->uLevel;
+            if (pPlayers[uActiveCharacter]->uLevel >= v68)
+              sprintfex(*v45, "%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
             {
-              v64 = pGlobalTXT_LocalizationStrings[529];// ""Sorry, but we are unable to train you.""
-              v61 = pGlobalTXT_LocalizationStrings[536];// ""With your skills, you should be working here as a teacher.""
-              v59 = "%s\n \n%s";
+              if (pPlayers[uActiveCharacter]->uExperience < v5)
+                sprintfex(*v45, pGlobalTXT_LocalizationStrings[538],  // "You need %d more experience to train to level %d"
+                          (uint)(v5 - pPlayers[uActiveCharacter]->uExperience), pPlayers[uActiveCharacter]->uLevel + 1);
+              else
+                sprintfex(*v45, pGlobalTXT_LocalizationStrings[537],  // "Train to level %d for %d gold"
+                          pPlayers[uActiveCharacter]->uLevel + 1, v11);
             }
-            sprintfex(*v45, v59, v61, v64);
           }
           v47 = pFontArrus->CalcTextHeight(*v45, &v65, 0, 0);
           v43 = pDialogueWindow;
@@ -4198,13 +4183,10 @@
         }
         while ( v73 < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem );
       }
-      //HIDWORD(v66) = (174 - v72) / 2;
-      result = v43->pStartingPosActiveItem;
-      v48 = result + v43->pNumPresenceButton;
+
       v49 = (2 * (87 - (174 - v72) / 2) - v72) / 2 - (174 - v72) / 2 / 2 + 138;
-      v50 = -v43->pNumPresenceButton < 0;
       v73 = v43->pStartingPosActiveItem;
-      if ( v50 ^ result < v48 )
+      if (v43->pStartingPosActiveItem < v43->pStartingPosActiveItem + v43->pNumPresenceButton)
       {
         int _v3 = 2;
         v51 = pShopOptions;
@@ -4227,13 +4209,11 @@
           ++_v3;
           ++v51;
           ++v73;
-          result = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem;
         }
-        while ( v73 < result );
+        while ( v73 < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton);
       }
     }
   }
-  return result;
 }
 
 
@@ -4753,7 +4733,7 @@
     do
     {
      // if ( pParty->field_777C[9 * (v49 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] )
-	 if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v49].uItemID);
+	 if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v49].uItemID)
       {
         v50 = ItemsInShopTexture[v49];
         v51 = 152 - v50->uTextureHeight;
@@ -4786,7 +4766,7 @@
     do
     {
       //if ( pParty->field_777C[9 * (v122 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 54] )
-	if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v122+1].uItemID);
+	if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v122+1].uItemID)
       {
         v54 = ItemsInShopTexture[v122 + 6];
         v55 = 306 - v54->uTextureHeight;
@@ -4882,12 +4862,12 @@
   if ( result )
   {
     v66 = 0;
-    v117 = 0;
+    v117 = 0;\
     if ( dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_STANDARD)
     {
       do
       {
-        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v66].uItemID); //9 * (v66 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] )
+        if ( pParty->StandartItemsInShops[(unsigned int)window_SpeakInHouse->ptr_1C][v66].uItemID) //9 * (v66 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] )
           ++v117;
         ++v66;
       }
--- a/UIHouses.h	Sat Mar 23 17:02:14 2013 +0400
+++ b/UIHouses.h	Sat Mar 23 17:07:08 2013 +0400
@@ -21,7 +21,7 @@
   HOUSE_DIALOGUE_14 = 14,
   HOUSE_DIALOGUE_TAVERN_REST = 15,
   HOUSE_DIALOGUE_TAVERN_BUY_FOOD = 16,
-  HOUSE_DIALOGUE_TRAININGHALL_17 = 17,
+  HOUSE_DIALOGUE_TRAININGHALL_TRAIN = 17,
   HOUSE_DIALOGUE_GULD_BUY_BOOKS = 18,
   //...
   HOUSE_DIALOGUE_GUILD_LEARN_SKILL = 72,
@@ -55,7 +55,14 @@
   HOUSE_STABLES_HARMONDALE = 54,
   HOUSE_TEMPLE_EMERALD_ISLE = 74,
   HOUSE_TEMPLE_HARMONDALE = 75,
+  HOUSE_TRAINING_HALL_EMERALD_ISLE = 89,
   HOUSE_TRAINING_HALL_HARMONDALE = 90,
+  HOUSE_TRAINING_HALL_91 = 91,
+  HOUSE_TRAINING_HALL_92 = 92,
+  HOUSE_TRAINING_HALL_93 = 93,
+  HOUSE_TRAINING_HALL_94 = 94,
+  HOUSE_TRAINING_HALL_95 = 95,
+
   HOUSE_TOWNHALL_HARMONDALE = 102,
   HOUSE_TAVERN_EMERALD_ISLE = 107,
   HOUSE_BANK_HARMONDALE = 128,
@@ -82,13 +89,13 @@
 
 enum HouseSoundID: unsigned __int32
 {
-  HouseSound_Greeting = 1,
-  HouseSound_NotEnoughMoney = 2,
-  HouseSound_Greeting_2 = 3,      // good greeting when you're guild member
+  HouseSound_Greeting = 1,        // General greeting
+  HouseSound_NotEnoughMoney_TrainingSuccessful = 2,
+  HouseSound_Greeting_2 = 3,      // Polite Greeting when you're guild member
   HouseSound_Goodbye = 4          // farewells when bought something
 };
 
-int __cdecl TrainingDialog();
+void TrainingDialog();
 char *__cdecl JailDialog();
 void  MagicShopDialog();
 void  GuildDialog();
--- a/mm7_2.cpp	Sat Mar 23 17:02:14 2013 +0400
+++ b/mm7_2.cpp	Sat Mar 23 17:07:08 2013 +0400
@@ -1590,7 +1590,7 @@
 					do
 					{
 						// if ( pParty->field_777C[9 * (v48 + 12 * (int)v47)] )
-						if ( pParty->StandartItemsInShops[(int)v47][v48].uItemID);
+						if ( pParty->StandartItemsInShops[(int)v47][v48].uItemID)
 						{
 							v49 = rand();
 							v8 = window_SpeakInHouse;
--- a/mm7_4.cpp	Sat Mar 23 17:02:14 2013 +0400
+++ b/mm7_4.cpp	Sat Mar 23 17:07:08 2013 +0400
@@ -2873,14 +2873,14 @@
 }
 
 //----- (00494820) --------------------------------------------------------
-unsigned int __fastcall sub_494820(unsigned int a1)
+unsigned int __fastcall _494820_training_time(unsigned int a1)
 {
   signed int v1; // eax@1
 
   v1 = 5;
-  if ( a1 % 0x18 >= 5 )
+  if ( a1 % 24 >= 5 )
     v1 = 29;
-  return v1 - a1 % 0x18;
+  return v1 - a1 % 24;
 }
 
 //----- (00494836) --------------------------------------------------------
@@ -6350,7 +6350,7 @@
     sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[427], pPlayer->pName, pGlobalTXT_LocalizationStrings[562]);// 
                                                 // "%s is in no condition to %s"
                                                 // "do anything"
-    v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
+    v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(255, 255, 0x9Bu);
     v3 = pFontArrus->CalcTextHeight(pTmpBuf, &v4, 0, 0);
     v4.DrawTitleText(pFontArrus, 0, (212 - v3) / 2 + 101, v2, pTmpBuf, 3u);
     result = 0;
@@ -8936,7 +8936,7 @@
           pParty->uFallStartY = pParty->vPosition.z;
           pParty->sRotationY = v5->field_18;
         }
-        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney);
+        PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful);
         v12 = v5->uTravelTime;
         int _v47;
         if ( (signed int)window_SpeakInHouse->ptr_1C >= 63 )
--- a/mm7_5.cpp	Sat Mar 23 17:02:14 2013 +0400
+++ b/mm7_5.cpp	Sat Mar 23 17:07:08 2013 +0400
@@ -1579,7 +1579,7 @@
             pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
           dword_50CDC8 = v0;
           sub_42FBDD();
-          PlayHouseSound(uCurrentHouse_Animation, HouseSound_NotEnoughMoney);
+          PlayHouseSound(uCurrentHouse_Animation, HouseSound_NotEnoughMoney_TrainingSuccessful);
           pVideoPlayer->Unload();
           sub_44603D();
           viewparams->bRedrawGameUI = v0;
@@ -2561,7 +2561,7 @@
         case UIMSG_OpenRestUI:
           dword_506F14 = 2;
           RestUI_Initialize();
-          v86 = 60 * (sub_494820(pParty->uCurrentHour) + 1) - pParty->uCurrentMinute;
+          v86 = 60 * (_494820_training_time(pParty->uCurrentHour) + 1) - pParty->uCurrentMinute;
           _506F18_num_hours_to_sleep = v86;
           if ( uMessageParam == 111 || uMessageParam == 114 || uMessageParam == 116 )
             _506F18_num_hours_to_sleep = v86 + 720;
@@ -2733,7 +2733,7 @@
           }
           GUIWindow::Create(pButton_RestUI_WaitUntilDawn->uX, pButton_RestUI_WaitUntilDawn->uY, 0, 0, WINDOW_5A,
             (int)pButton_RestUI_WaitUntilDawn, (int)pGlobalTXT_LocalizationStrings[237]);// "Wait until Dawn"
-          v97 = sub_494820(pParty->uCurrentHour);
+          v97 = _494820_training_time(pParty->uCurrentHour);
           dword_506F14 = v0;
           _506F18_num_hours_to_sleep = 60 * v97 - pParty->uCurrentMinute;
           continue;
--- a/mm7_data.cpp	Sat Mar 23 17:02:14 2013 +0400
+++ b/mm7_data.cpp	Sat Mar 23 17:07:08 2013 +0400
@@ -2219,8 +2219,8 @@
 int dword_AE3370; // weak
 char byte_AE5B91; // weak
 int dword_F1B430[32]; // weak
-int dword_F8B144; // idb
-char byte_F8B148[16];
+//int dword_F8B144; // nexindex [-1] to the following
+int player_levels[4] = {1, 1, 1, 1};
 __int16 word_F8B158[777]; // weak
 struct Texture *ShopTexture; // idb
 struct Texture *ItemsInShopTexture[12];
--- a/mm7_data.h	Sat Mar 23 17:02:14 2013 +0400
+++ b/mm7_data.h	Sat Mar 23 17:07:08 2013 +0400
@@ -1678,8 +1678,7 @@
 extern int dword_AE3370; // weak
 extern char byte_AE5B91; // weak
 extern int dword_F1B430[32]; // weak
-extern int dword_F8B144; // idb
-extern char byte_F8B148[16];
+extern int player_levels[4];
 extern __int16 word_F8B158[]; // weak
 extern struct Texture *ShopTexture; // idb
 extern struct Texture *ItemsInShopTexture[12];
@@ -2240,7 +2239,7 @@
 int __cdecl _493938_regenerate();
 void sub_493F79(struct stru351_summoned_item *_this, __int64 a2);
 void __cdecl _494035_timed_effects__water_walking_damage__etc();
-unsigned int __fastcall sub_494820(unsigned int a1);
+unsigned int __fastcall _494820_training_time(unsigned int a1);
 char *__fastcall sub_495366(unsigned __int8 a1, unsigned __int8 a2);
 char * GetReputationString(signed int a1);
 char *BuilDialogueString(char *lpsz, unsigned __int8 uPlayerID, struct ItemGen *a3, char *a4, int a5, __int64 *a6);