changeset 2275:8193a64c7461

Слияние
author Ritor1
date Fri, 14 Mar 2014 09:32:42 +0600
parents 90f56da08d76 (current diff) 42b6a910b5d8 (diff)
children e2433db49428
files DecorationList.cpp Render.cpp
diffstat 25 files changed, 1413 insertions(+), 2567 deletions(-) [+]
line wrap: on
line diff
--- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj	Fri Mar 14 09:32:25 2014 +0600
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj	Fri Mar 14 09:32:42 2014 +0600
@@ -168,6 +168,7 @@
     <ClCompile Include="..\..\LOD.cpp" />
     <ClCompile Include="..\..\Log.cpp" />
     <ClCompile Include="..\..\LuaVM.cpp" />
+    <ClCompile Include="..\..\MapInfo.cpp" />
     <ClCompile Include="..\..\mm7text_ru.cpp" />
     <ClCompile Include="..\..\mm7_2.cpp" />
     <ClCompile Include="..\..\mm7_3.cpp" />
--- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters	Fri Mar 14 09:32:25 2014 +0600
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters	Fri Mar 14 09:32:42 2014 +0600
@@ -334,6 +334,7 @@
     <ClCompile Include="..\..\UI\Books\UISpellBook.cpp">
       <Filter>UI\Books</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\MapInfo.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\Level\Decoration.h" />
--- a/Chest.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/Chest.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -302,26 +302,26 @@
     item_texture = pIcons_LOD->GetTexture(item_texture_id);
     v6 = item_texture->uTextureWidth;
     if ( v6 < 14 )
-        v6 = 14;
+      v6 = 14;
     texture_cell_width = ((v6 - 14) >> 5) + 1;
     v8 = item_texture->uTextureHeight;
     if ( v8 < 14 )
         v8 = 14;
     texture_cell_height = ((v8 - 14) >> 5) + 1;
     if ( !areWeLoadingTexture )
-        {
-        item_texture->Release();
-        pIcons_LOD->SyncLoadedFilesCount();
-        }
+    {
+      item_texture->Release();
+      pIcons_LOD->SyncLoadedFilesCount();
+    }
     if ( (texture_cell_width + test_cell_position % chest_cell_width <= chest_cell_width) && 
         (texture_cell_height + test_cell_position / chest_cell_width <= chest_cell_heght) )
-        { //we not put over borders
+    { //we not put over borders
         _row = 0;
         if ( texture_cell_height <= 0 )
             return true;
         _cell_rows = 0;
         while ( 1 )
-            {
+        {
             _column = 0;
             if ( texture_cell_width > 0 )
                 {
@@ -353,19 +353,17 @@
   item_count = 0;
   max_items = pChestWidthsByType[pChests[uChestID].uChestBitmapID] * pChestHeightsByType[pChests[uChestID].uChestBitmapID];
   if ( max_items <= 0 )
-  {
     item_count = -1;
-  }
   else
   {
     while ( pChests[uChestID].igChestItems[item_count].uItemID )
     {
       ++item_count;
       if ( item_count >= max_items )
-          {
-          item_count = -1;
-          break;
-          }
+      {
+        item_count = -1;
+        break;
+      }
     }
   }
   return item_count;
@@ -373,14 +371,13 @@
 
 //----- (0041FFA2) --------------------------------------------------------
 int Chest::PutItemInChest(int position, ItemGen *put_item, signed int uChestID)
-{
-  int v3; // eax@1
+{//(rus:    )
   ItemGen *v4; // edi@1
   int v5; // esi@1
   int result; // eax@11
   unsigned int v7; // eax@12
   int v8; // edx@12
-  Texture *v9; // ecx@12
+  Texture *texture; // ecx@12
   signed int v10; // eax@12
   signed int v11; // edi@14
   unsigned int v12; // esi@14
@@ -397,11 +394,10 @@
   int v23; // [sp+20h] [bp-4h]@19
 
   v21 = 0;
-  v3 = pChests[uChestID].uChestBitmapID;
   v4 = put_item;
-  v5 = pChestWidthsByType[v3] * pChestHeightsByType[v3];
+  v5 = pChestWidthsByType[pChests[uChestID].uChestBitmapID] * pChestHeightsByType[pChests[uChestID].uChestBitmapID];
   Src = put_item;
-  v19 = pChestWidthsByType[v3];
+  v19 = pChestWidthsByType[pChests[uChestID].uChestBitmapID];
   if ( position == -1 )
   {
     item_in_chest_count = CountChestItems(uChestID);
@@ -410,9 +406,7 @@
     for( int _i = 0; _i < v5; _i++)
 	{
       if ( Chest::CanPlaceItemAt(_i, v4->uItemID, pChestWindow->par1C) )
-      {
         v21 = _i;
-      }
     }
     if ( v21 == v5 )
     {
@@ -422,18 +416,18 @@
     }
     v7 = pIcons_LOD->LoadTexture(v4->GetIconName(), TEXTURE_16BIT_PALETTE);
     HIWORD(v8) = 0;
-    v9 = pIcons_LOD->GetTexture(v7);
-    v10 = v9->uTextureWidth;
-    if ( v10 < 14 )
+    texture = pIcons_LOD->GetTexture(v7);
+    v10 = texture->uTextureWidth;
+    if ( texture->uTextureWidth < 14 )
       v10 = 14;
-    v11 = v9->uTextureHeight;
     v12 = ((v10 - 14) >> 5) + 1;
-    if ( v11 < 14 )
+    v11 = texture->uTextureHeight;
+    if ( texture->uTextureHeight < 14 )
       v11 = 14;
     v13 = ((v11 - 14) >> 5) + 1;
     if ( !areWeLoadingTexture )
     {
-      ((Texture *)v9)->Release();
+      texture->Release();
       pIcons_LOD->SyncLoadedFilesCount();
     }
     if ( v13 > 0 )
@@ -466,62 +460,58 @@
     result = v21 + 1;
   }
   else
-  {
     result = 1;
-  }
   return result;
 }
 // 506128: using guessed type int areWeLoadingTexture;
 
 //----- (0042013E) --------------------------------------------------------
 void Chest::PlaceItemAt( unsigned int put_cell_pos, unsigned int item_at_cell, signed int uChestID )
-    {
-    int uItemID; // edi@1
-    int v6; // edx@4
-    unsigned int v7; // eax@5
-    Texture *v8; // ecx@5
-    signed int v9; // eax@5
-    signed int v10; // edi@7
-    unsigned int texture_cell_width; // ebx@7
-    int textute_cell_height; // edi@9
-    int chest_cell_row_pos; // edx@12
-    int chest_cell_width; // [sp+10h] [bp-Ch]@11
+{
+  int uItemID; // edi@1
+  int v6; // edx@4
+  unsigned int v7; // eax@5
+  Texture *texture; // ecx@5
+  signed int v9; // eax@5
+  signed int v10; // edi@7
+  unsigned int texture_cell_width; // ebx@7
+  int textute_cell_height; // edi@9
+  int chest_cell_row_pos; // edx@12
+  int chest_cell_width; // [sp+10h] [bp-Ch]@11
 
-    uItemID = pChests[ uChestID].igChestItems[item_at_cell].uItemID;
-    pItemsTable->SetSpecialBonus(&pChests[ uChestID].igChestItems[item_at_cell]);
-    if ( uItemID >= 135 && uItemID <= 159 && !pChests[ uChestID].igChestItems[item_at_cell].uNumCharges)
-        {
-        v6 = rand() % 21 + 10;
-        pChests[ uChestID].igChestItems[item_at_cell].uNumCharges = v6;
-        pChests[ uChestID].igChestItems[item_at_cell].uMaxCharges = v6;
-        }
-    v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[uItemID].pIconName, TEXTURE_16BIT_PALETTE);
-    v8 = pIcons_LOD->GetTexture(v7);
-    v9 = v8->uTextureWidth;
-    if ( v9 < 14 )
-        v9 = 14;
-    v10 = v8->uTextureHeight;
-    texture_cell_width = ((v9 - 14) >> 5) + 1;
-    if ( v10 < 14 )
-        v10 = 14;
-    textute_cell_height = ((v10 - 14) >> 5) + 1;
-    if ( !areWeLoadingTexture )
-        {
-        v8->Release();
-        pIcons_LOD->SyncLoadedFilesCount();
-        }
-    chest_cell_width = pChestWidthsByType[pChests[ uChestID].uChestBitmapID];
-    chest_cell_row_pos = 0;
-    for(int i=0; i<textute_cell_height; ++i) 
-        { 
-        for (int j=0; j<texture_cell_width; ++j)
-            {
-            pChests[uChestID].pInventoryIndices[put_cell_pos + chest_cell_row_pos+j]=(signed __int16)-(put_cell_pos+1);
-            } 
-        chest_cell_row_pos += chest_cell_width;
-        }
-    pChests[uChestID].pInventoryIndices[put_cell_pos] = item_at_cell + 1;
-    }
+  uItemID = pChests[ uChestID].igChestItems[item_at_cell].uItemID;
+  pItemsTable->SetSpecialBonus(&pChests[ uChestID].igChestItems[item_at_cell]);
+  if ( uItemID >= 135 && uItemID <= 159 && !pChests[ uChestID].igChestItems[item_at_cell].uNumCharges)
+  {
+    v6 = rand() % 21 + 10;
+    pChests[ uChestID].igChestItems[item_at_cell].uNumCharges = v6;
+    pChests[ uChestID].igChestItems[item_at_cell].uMaxCharges = v6;
+  }
+  v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[uItemID].pIconName, TEXTURE_16BIT_PALETTE);
+  texture = pIcons_LOD->GetTexture(v7);
+  v9 = texture->uTextureWidth;
+  if ( texture->uTextureWidth < 14 )
+    v9 = 14;
+  texture_cell_width = ((v9 - 14) >> 5) + 1;
+  v10 = texture->uTextureHeight;
+  if ( texture->uTextureHeight < 14 )
+    v10 = 14;
+  textute_cell_height = ((v10 - 14) >> 5) + 1;
+  if ( !areWeLoadingTexture )
+  {
+    texture->Release();
+    pIcons_LOD->SyncLoadedFilesCount();
+  }
+  chest_cell_width = pChestWidthsByType[pChests[ uChestID].uChestBitmapID];
+  chest_cell_row_pos = 0;
+  for(int i = 0; i < textute_cell_height; ++i) 
+  { 
+    for (int j = 0; j < texture_cell_width; ++j)
+      pChests[uChestID].pInventoryIndices[put_cell_pos + chest_cell_row_pos+j]=(signed __int16)-(put_cell_pos+1);
+    chest_cell_row_pos += chest_cell_width;
+  }
+  pChests[uChestID].pInventoryIndices[put_cell_pos] = item_at_cell + 1;
+}
 // 506128: using guessed type int areWeLoadingTexture;
 
 //----- (00420284) --------------------------------------------------------
@@ -581,34 +571,29 @@
 
 //----- (00448A17) --------------------------------------------------------
 void Chest::ToggleFlag(signed int uChestID, unsigned __int16 uFlag, unsigned int bToggle)
-    {
-    unsigned __int16 *pFlags; // eax@3
-
-    if ( uChestID >= 0 && uChestID <= 19 )
-        {
-        pFlags = &pChests[uChestID].uFlags;
-        if ( bToggle )
-            *pFlags |= uFlag;
-        else
-            *pFlags &= ~uFlag;
-        }
-    }
+{
+  if ( uChestID >= 0 && uChestID <= 19 )
+  {
+    if ( bToggle )
+       pChests[uChestID].uFlags |= uFlag;
+    else
+      pChests[uChestID].uFlags &= ~uFlag;
+  }
+}
 
 //----- (00458B03) --------------------------------------------------------
 void ChestList::ToFile()
 {
-  ChestList *v1; // esi@1
   FILE *v2; // eax@1
   FILE *v3; // edi@1
 
-  v1 = this;
   v2 = fopen("data\\dchest.bin", "wb");
   v3 = v2;
   if ( !v2 )
     Error("Unable to save dchest.bin!");
 
-  fwrite(v1, 4u, 1u, v2);
-  fwrite(v1->pChests, 0x24u, v1->uNumChests, v3);
+  fwrite(this, 4, 1, v2);
+  fwrite(this->pChests, 36, this->uNumChests, v3);
   fclose(v3);
 }
 
@@ -634,7 +619,7 @@
 //----- (00458B9C) --------------------------------------------------------
 int ChestList::FromFileTxt(const char *Args)
 {
-  ChestList *v2; // ebx@1
+  //ChestList *v2; // ebx@1
   __int32 v3; // edi@1
   FILE *v4; // eax@1
   unsigned int v5; // esi@3
@@ -652,11 +637,11 @@
   FILE *File; // [sp+2F4h] [bp-4h]@1
   unsigned int Argsa; // [sp+300h] [bp+8h]@3
 
-  v2 = this;
+  //v2 = this;
   free(this->pChests);
   v3 = 0;
-  v2->pChests = 0;
-  v2->uNumChests = 0;
+  this->pChests = 0;
+  this->uNumChests = 0;
   v4 = fopen(Args, "r");
   File = v4;
   if ( !v4 )
@@ -677,16 +662,16 @@
     v5 = Argsa;
     v3 = 0;
   }
-  v6 = v2->pChests;
-  v2->uNumChests = v5;
+  v6 = this->pChests;
+  this->uNumChests = v5;
   v7 = malloc(36 * v5);
-  v2->pChests = (ChestDesc *)v7;
+  this->pChests = (ChestDesc *)v7;
   if ( v7 == (void *)v3 )
     Error("ChestDescriptionList::load - Out of Memory!");
 
-  memset(v7, v3, 36 * v2->uNumChests);
+  memset(v7, v3, 36 * this->uNumChests);
   v8 = File;
-  v2->uNumChests = v3;
+  this->uNumChests = v3;
   fseek(v8, v3, v3);
   for ( i = fgets(&Buf, 490, File); i; i = fgets(&Buf, 490, File) )
   {
@@ -694,14 +679,14 @@
     memcpy(&v17, txt_file_frametable_parser(&Buf, &v16), sizeof(v17));
 	if ( v17.uPropCount && *v17.pProperties[0] != 47 )
     {
-      strcpy(v2->pChests[v2->uNumChests].pName, v17.pProperties[0]);
+      strcpy(this->pChests[this->uNumChests].pName, v17.pProperties[0]);
       v10 = atoi(v17.pProperties[1]);
       v11 = v17.pProperties[2];
-      v2->pChests[v2->uNumChests].uWidth = v10;
+      this->pChests[this->uNumChests].uWidth = v10;
       v12 = atoi(v11);
       v13 = v17.pProperties[3];
-      v2->pChests[v2->uNumChests].uHeight = v12;
-      v2->pChests[v2->uNumChests++].uTextureID = atoi(v13);
+      this->pChests[this->uNumChests].uHeight = v12;
+      this->pChests[this->uNumChests++].uTextureID = atoi(v13);
     }
   }
   fclose(File);
@@ -710,11 +695,10 @@
 
 //----- (00420B13) --------------------------------------------------------
 void __fastcall sub_420B13(int a1, int a2)
-{
+{	//Give item from chest(rus:    )
     void *v2; // eax@1
-    ItemGen *v3; // ebx@1
     unsigned int v4; // eax@1
-    Texture *v5; // ecx@1
+    Texture *texture; // ecx@1
     signed int v6; // eax@1
     signed int v7; // edi@3
     signed int v8; // eax@3
@@ -728,85 +712,68 @@
     int i; // ecx@10
     int v17; // [sp+Ch] [bp-14h]@1
     int v18; // [sp+10h] [bp-10h]@3
-    int v19; // [sp+14h] [bp-Ch]@1
-    int v20; // [sp+18h] [bp-8h]@1
     int v21; // [sp+1Ch] [bp-4h]@5
     int v22; // [sp+1Ch] [bp-4h]@8
 
-    v19 = a2;
-    v2 = pChestWindow->ptr_1C;
-    v20 = (int)v2;
-    v2 = (void *)(5324 * (int)v2);
-    //v3 = (ItemGen *)((char *)v2 + 36 * a1 + (int)((char *)pChests + 4));
-	v3 = &pChests[v20].igChestItems[a1];
-    //v17 = pChestWidthsByType[*(short *)((char *)v2 + (int)pChests)];
-	v17 = pChestWidthsByType[pChests[v20].uChestBitmapID];
-    v4 = pIcons_LOD->LoadTexture(v3->GetIconName(), TEXTURE_16BIT_PALETTE);
-    v5 = pIcons_LOD->GetTexture(v4);
-    v6 = v5->uTextureWidth;
-    if ( v6 < 14 )
-        v6 = 14;
+    v2 = (void *)(5324 * (int)pChestWindow->ptr_1C);
+	v17 = pChestWidthsByType[pChests[(int)pChestWindow->ptr_1C].uChestBitmapID];
+    v4 = pIcons_LOD->LoadTexture(pChests[(int)pChestWindow->ptr_1C].igChestItems[a1].GetIconName(), TEXTURE_16BIT_PALETTE);
+    texture = pIcons_LOD->GetTexture(v4);
+
+    v6 = texture->uTextureWidth;
+    if ( texture->uTextureWidth < 14 )
+      v6 = 14;
     v7 = v6 - 14;
-    v8 = v5->uTextureHeight;
     v9 = (v7 >> 5) + 1;
     v18 = v9;
-    if ( v8 < 14 )
-        v8 = 14;
+
+    v8 = texture->uTextureHeight;
+    if ( texture->uTextureHeight < 14 )
+      v8 = 14;
     v10 = ((v8 - 14) >> 5) + 1;
     v21 = v10;
+
     if ( !areWeLoadingTexture )
     {
-        v5->Release();
-        pIcons_LOD->SyncLoadedFilesCount();
-        v10 = v21;
+      texture->Release();
+      pIcons_LOD->SyncLoadedFilesCount();
+      v10 = v21;
     }
     if ( v10 > 0 )
     {
-        v11 = 0;
-        v22 = v10;
-        do
+      v11 = 0;
+      for ( v22 = v10; v22; --v22 )
+      {
+        if ( v9 > 0 )
         {
-            if ( v9 > 0 )
-            {
-                v12 = v9;
-                //v13 = &pChests[0].pInventoryIndices[v19 + v11 + 2662 * (int)v20];
-				v13 = &pChests[v20].pInventoryIndices[v19 + v11];
-                v14 = v12 & 1;
-                v12 >>= 1;
-                memset(v13, 0, 4 * v12);
-                v15 = (int)((char *)v13 + 4 * v12);
-                for ( i = v14; i; --i )
-                {
-                    *(short *)v15 = 0;
-                    v15 += 2;
-                }
-                v9 = v18;
-            }
-            v11 += v17;
-            --v22;
+          v12 = v9;
+          v13 = &pChests[(int)pChestWindow->ptr_1C].pInventoryIndices[a2 + v11];
+          v14 = v12 & 1;
+          v12 >>= 1;
+          memset(&pChests[(int)pChestWindow->ptr_1C].pInventoryIndices[a2 + v11], 0, 4 * v12);
+          v15 = (int)((char *)v13 + 4 * v12);
+          for ( i = v14; i; --i )
+          {
+            *(short *)v15 = 0;
+            v15 += 2;
+          }
+          v9 = v18;
         }
-        while ( v22 );
+        v11 += v17;
+      }
     }
-    v3->Reset();
+    pChests[(int)pChestWindow->ptr_1C].igChestItems[a1].Reset();
 }
 // 506128: using guessed type int areWeLoadingTexture;
 //----- (00420E01) --------------------------------------------------------
 void OnChestLeftClick()
 {
-  int chest_id; // edi@1
-  POINT *v1; // esi@2
   int v2; // eax@2
   int v3; // ebx@4
   int v4; // esi@6
-  int v5; // ecx@6
-  //SpriteObject v6; // [sp+Ch] [bp-80h]@1
-  POINT v7; // [sp+7Ch] [bp-10h]@2
-  POINT a2; // [sp+84h] [bp-8h]@2
+  POINT cursor; // [sp+84h] [bp-8h]@2
   
   SpriteObject v6; // [sp+Ch] [bp-80h]@1
-  //SpriteObject::SpriteObject(&v6);
-
-  chest_id = pGUIWindow_CurrentMenu->par1C;
   if ( pParty->pPickedItem.uItemID )
   {
     if ( Chest::PutItemInChest(-1, &pParty->pPickedItem, pGUIWindow_CurrentMenu->par1C) )
@@ -814,24 +781,22 @@
   }
   else
   {
-    v1 = pMouse->GetCursorPos(&a2);
-    v2 = pRenderer->pActiveZBuffer[v1->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v7)->y]] & 0xFFFF;
+    pMouse->GetCursorPos(&cursor);
+    v2 = pRenderer->pActiveZBuffer[cursor.x + pSRZBufferLineOffsets[cursor.y]] & 0xFFFF;
     if ( v2 )
     {
       if ( v2 )
         v3 = v2 - 1;
       else
         v3 = -1;
-      v4 = pChests[chest_id].pInventoryIndices[v3] - 1;
-      if ( pChests[chest_id].igChestItems[v4].GetItemEquipType() == EQUIP_GOLD )
+      v4 = pChests[(int)pGUIWindow_CurrentMenu->par1C].pInventoryIndices[v3] - 1;
+      if ( pChests[(int)pGUIWindow_CurrentMenu->par1C].igChestItems[v4].GetItemEquipType() == EQUIP_GOLD )
       {
-        pParty->PartyFindsGold(pChests[chest_id].igChestItems[v4].uSpecEnchantmentType, 0); 
+        pParty->PartyFindsGold(pChests[(int)pGUIWindow_CurrentMenu->par1C].igChestItems[v4].uSpecEnchantmentType, 0); 
         viewparams->bRedrawGameUI = 1;
       }
       else
-      {
-        pParty->SetHoldingItem(&pChests[chest_id].igChestItems[v4]);
-      }
+        pParty->SetHoldingItem(&pChests[(int)pGUIWindow_CurrentMenu->par1C].igChestItems[v4]);
       sub_420B13(v4, v3);
     }
   }
--- a/Conditions.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/Conditions.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -28,16 +28,14 @@
 bool ConditionProcessor::IsPlayerAffected( Player* inPlayer, int condToCheck, int blockable)
 {
   if ( !blockable )
-  {
     return true;
-  }
   ConditionProcessor* thisProc = &conditionArray[condToCheck];
   if (thisProc->m_IsBlockedByProtFromMagic && pParty->pPartyBuffs[PARTY_BUFF_PROTECTION_FROM_MAGIC].uExpireTime > 0)
   {
     if (!(thisProc->m_DoesNeedGmProtFromMagic && pParty->pPartyBuffs[PARTY_BUFF_PROTECTION_FROM_MAGIC].uSkill < 4))
     {
       --pParty->pPartyBuffs[PARTY_BUFF_PROTECTION_FROM_MAGIC].uPower;
-      if ( pParty->pPartyBuffs[PARTY_BUFF_PROTECTION_FROM_MAGIC].uPower < 1u )
+      if ( pParty->pPartyBuffs[PARTY_BUFF_PROTECTION_FROM_MAGIC].uPower < 1 )
         pParty->pPartyBuffs[PARTY_BUFF_PROTECTION_FROM_MAGIC].Reset();
       return false;
     }
@@ -50,24 +48,18 @@
   for (unsigned int i = 0; i < thisProc->m_equipmentPairs.size() / 2; i++)
   {
     if (thisProc->m_equipmentPairs[i * 2].m_ItemId == (ITEM_TYPE)0)
-    {
       return true;
-    }
     ITEM_TYPE itemId = thisProc->m_equipmentPairs[i * 2].m_ItemId;
     ITEM_EQUIP_TYPE slot = thisProc->m_equipmentPairs[i * 2 + 1].m_EquipSlot;
     if (slot == EQIUP_ANY)
     {
       if (inPlayer->WearsItemAnyWhere(itemId))
-      {
         return false;
-      }
     }
     else
     {
       if (inPlayer->WearsItem(itemId, slot))
-      {
         return false;
-      }
     }
   }
   return true;
--- a/DecalBuilder.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/DecalBuilder.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -32,16 +32,10 @@
       result = 0.0;
   }
   else
-  {
     result = 1.0;
-  }
   return result;
 }
 
-
-
-
-
 //----- (0043B6EF) --------------------------------------------------------
 void BloodsplatContainer::AddBloodsplat(float x, float y, float z, float radius, char r, char g, char b)
 {
@@ -53,7 +47,7 @@
   if ( this->uNumBloodsplats == 64 )
     v8 = 0;
   v9 = 5 * (v8 + 1);
-  v10 = &this->std__vector_pBloodsplats[8 * v9 / 0x28u];
+  v10 = &this->std__vector_pBloodsplats[8 * v9 / 40];
   v10->x = x;
   v10->y = y;
   v10->z = z;
@@ -469,12 +463,12 @@
 char DecalBuilder::ApplyDecals_OutdoorFace(ODMFace *pFace)
 {
 	double v8; // st7@12
-	unsigned int v10; // [sp+20h] [bp-1Ch]@1
+	//unsigned int v10; // [sp+20h] [bp-1Ch]@1
 
 	Bloodsplat *pBloodsplat;
 
 	this->uNumDecals = 0;
-	v10 = pBloodsplatContainer->std__vector_pBloodsplats_size;
+	//v10 = pBloodsplatContainer->std__vector_pBloodsplats_size;
 	if ( !pFace->Indoor_sky() && !pFace->Fluid() )
 	{
 		for(int i = 0; i < pBloodsplatContainer->std__vector_pBloodsplats_size; i++ )
@@ -506,28 +500,28 @@
 bool DecalBuilder::_49BE8A(struct Polygon *a2, Vec3_float_ *_a3, float *a4, RenderVertexSoft *a5, unsigned int uStripType, char a7)
 {
   bool result; // eax@1
-  RenderVertexSoft *v8; // edi@3
-  Vec3_float_ *v9; // ebx@3
-  Bloodsplat *v10; // esi@3
-  float v11; // eax@5
+  //RenderVertexSoft *v8; // edi@3
+  //Vec3_float_ *v9; // ebx@3
+  //Bloodsplat *v10; // esi@3
+  //float v11; // eax@5
   float v12; // eax@6
-  double v13; // st7@13
+  //double v13; // st7@13
   double v14; // st7@19
-  short v15; // eax@20
+  //short v15; // eax@20
   int v16; // eax@22
-  int v17; // edx@24
-  DecalBuilder *v18; // eax@24
+  //int v17; // edx@24
+  //DecalBuilder *v18; // eax@24
   std::string v19; // [sp-18h] [bp-54h]@12
   const char *v20; // [sp-8h] [bp-44h]@12
-  int v21; // [sp-4h] [bp-40h]@12
+  //int v21; // [sp-4h] [bp-40h]@12
   double v22; // [sp+Ch] [bp-30h]@19
   unsigned int v23; // [sp+14h] [bp-28h]@1
-  DecalBuilder *v24; // [sp+18h] [bp-24h]@1
-  int v25; // [sp+1Ch] [bp-20h]@19
+  //DecalBuilder *v24; // [sp+18h] [bp-24h]@1
+  //int v25; // [sp+1Ch] [bp-20h]@19
   float v26; // [sp+20h] [bp-1Ch]@12
   int v27; // [sp+24h] [bp-18h]@12
   float v28; // [sp+28h] [bp-14h]@13
-  float v29; // [sp+2Ch] [bp-10h]@7
+  //float v29; // [sp+2Ch] [bp-10h]@7
   float v30; // [sp+30h] [bp-Ch]@6
   float v31; // [sp+34h] [bp-8h]@6
   bool v32; // [sp+38h] [bp-4h]@2
@@ -535,92 +529,91 @@
 
   this->uNumDecals = 0;
   result = pBloodsplatContainer->std__vector_pBloodsplats_size != 0;
-  v24 = this;
+ // v24 = this;
   v23 = pBloodsplatContainer->std__vector_pBloodsplats_size;
   if ( pBloodsplatContainer->std__vector_pBloodsplats_size )
   {
-    v32 = 0;
+    
     if ( (signed int)pBloodsplatContainer->std__vector_pBloodsplats_size > 0 )
     {
-      v8 = a5;
-      v9 = _a3;
-	  v10 = pBloodsplatContainer->std__vector_pBloodsplats;
-      while ( v32 < (signed int)v23)
+      //v8 = a5;
+      //v9 = _a3;
+	  for ( v32 = 0; v32 < (signed int)v23; ++v32 )
       {
-		if ( uStripType == 4 )
-		{
-		  a3 = v8->vWorldPosition.x;
-		  v11 = v8[3].vWorldPosition.x;
-		  v31 = v11;
-		  v30 = v8[1].vWorldPosition.y;
-		  v12 = v8->vWorldPosition.y;
-		  v29 = v12;
-		}
-		else if ( uStripType == 3 )
+        if ( uStripType == 4 )
+        {
+          a3 = a5->vWorldPosition.x;
+          //v11 = v8[3].vWorldPosition.x;
+          v31 = a5[3].vWorldPosition.x;
+          v30 = a5[1].vWorldPosition.y;
+          v12 = a5->vWorldPosition.y;
+          //v29 = v12;
+        }
+        else if ( uStripType == 3 )
         {
           if ( a7 )
           {
-            a3 = v8->vWorldPosition.x;
-            v31 = v8[2].vWorldPosition.x;
-            v30 = v8[1].vWorldPosition.y;
-            v12 = v8[2].vWorldPosition.y;
-            v29 = v12;
+            a3 = a5->vWorldPosition.x;
+            v31 = a5[2].vWorldPosition.x;
+            v30 = a5[1].vWorldPosition.y;
+            v12 = a5[2].vWorldPosition.y;
+            //v29 = v12;
           }
 		  else
 		  {
-			  a3 = v8[1].vWorldPosition.x;
-			  v11 = v8[2].vWorldPosition.x;
-			  v31 = v11;
-			  v30 = v8[1].vWorldPosition.y;
-			  v12 = v8->vWorldPosition.y;
-			  v29 = v12;
+			  a3 = a5[1].vWorldPosition.x;
+			  //v11 = v8[2].vWorldPosition.x;
+			  v31 = a5[2].vWorldPosition.x;
+			  v30 = a5[1].vWorldPosition.y;
+			  v12 = a5->vWorldPosition.y;
+			  //v29 = v12;
 		  }
         }
 		else
 			MessageBoxW(nullptr, L"Uknown strip type detected!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\PolyProjector.cpp:434", 0);
-        v21 = uStripType;
-        v13 = pGame->pIndoorCameraD3D->GetPolygonMinZ(v8, uStripType);
-        v21 = uStripType;
-        v28 = v13;
-        v26 = pGame->pIndoorCameraD3D->GetPolygonMaxZ(v8, uStripType);
-		if ( a3 - v10->radius < v10->x &&
-			v31 + v10->radius > v10->x &&
-			v30 - v10->radius < v10->y &&
-            v29 + v10->radius > v10->y &&
-            v28 - v10->radius < v10->z &&
-            v26 + v10->radius > v10->z )
+        //v21 = uStripType;
+        //v13 = pGame->pIndoorCameraD3D->GetPolygonMinZ(v8, uStripType);
+        //v21 = uStripType;
+        v28 = pGame->pIndoorCameraD3D->GetPolygonMinZ(a5, uStripType);
+        v26 = pGame->pIndoorCameraD3D->GetPolygonMaxZ(a5, uStripType);
+		if ( a3 - pBloodsplatContainer->std__vector_pBloodsplats[v32].radius < pBloodsplatContainer->std__vector_pBloodsplats[v32].x &&
+			v31 + pBloodsplatContainer->std__vector_pBloodsplats[v32].radius > pBloodsplatContainer->std__vector_pBloodsplats[v32].x &&
+			v30 - pBloodsplatContainer->std__vector_pBloodsplats[v32].radius < pBloodsplatContainer->std__vector_pBloodsplats[v32].y &&
+            v12 + pBloodsplatContainer->std__vector_pBloodsplats[v32].radius > pBloodsplatContainer->std__vector_pBloodsplats[v32].y &&
+            v28 - pBloodsplatContainer->std__vector_pBloodsplats[v32].radius < pBloodsplatContainer->std__vector_pBloodsplats[v32].z &&
+            v26 + pBloodsplatContainer->std__vector_pBloodsplats[v32].radius > pBloodsplatContainer->std__vector_pBloodsplats[v32].z )
         {
-			Vec3_float_::NegDot(&v8->vWorldPosition, v9, a4);
-			v26 = v9->y * v10->y
-				+ v9->z * v10->z
-				+ v9->x * v10->x
+			Vec3_float_::NegDot(&a5->vWorldPosition, _a3, a4);
+			v26 = _a3->y * pBloodsplatContainer->std__vector_pBloodsplats[v32].y
+				+ _a3->z * pBloodsplatContainer->std__vector_pBloodsplats[v32].z
+				+ _a3->x * pBloodsplatContainer->std__vector_pBloodsplats[v32].x
 				+ *a4;
 			v22 = v26 + 6.7553994e15;
-			v25 = LODWORD(v22);
+			//v25 = LODWORD(v22);
 			v14 = (double)SLODWORD(v22);
 			v28 = v14;
-			if ( v14 <= v10->radius )
+			if ( v14 <= pBloodsplatContainer->std__vector_pBloodsplats[v32].radius )
 			{
-				v15 = a2->flags;
+				//v15 = a2->flags;
 				if ( a2->flags & 2 || a2->flags & 0x100 )
 				{
-					v16 = v10->field_1C;
-					if ( !(v16 & 1) )
+					v16 = pBloodsplatContainer->std__vector_pBloodsplats[v32].field_1C;
+					if ( !(pBloodsplatContainer->std__vector_pBloodsplats[v32].field_1C & 1) )
 					{
 						LOBYTE(v16) = v16 | 1;
-						v10->field_1C = v16;
-						v10->field_20 = pEventTimer->Time();
+						pBloodsplatContainer->std__vector_pBloodsplats[v32].field_1C = v16;
+						pBloodsplatContainer->std__vector_pBloodsplats[v32].field_20 = pEventTimer->Time();
 					}
 				}
-				v17 = v32;
-				v10->dot_dist = LODWORD(v28);
-				v18 = v24;
-				v24->std__vector_30B00C[v24->uNumDecals] = v17;
-				++v18->uNumDecals;
+				//v17 = v32;
+				pBloodsplatContainer->std__vector_pBloodsplats[v32].dot_dist = LODWORD(v28);
+				//v18 = this;
+				this->std__vector_30B00C[this->uNumDecals] = v32;
+				++this->uNumDecals;
 			}
         }
-        ++v32;
-        ++v10;
+        //++v32;
+        //++v10;
         result = v32;
       }
     }
--- a/DecorationList.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/DecorationList.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -66,7 +66,6 @@
   unsigned __int8 v25; // of@16
   int j; // edi@17
   const char *v27; // esi@18
-  int v28; // eax@19
   int v29; // eax@21
   int v30; // eax@23
   int v31; // eax@25
@@ -224,10 +223,7 @@
             }
           }
           else
-          {
-            v28 = (int)&v2->pDecorations[v2->uNumDecorations].uFlags;
-            *(char *)v28 |= 1u;
-          }
+            v2->pDecorations[v2->uNumDecorations].uFlags |= 1;
         }
       }
       ++v2->uNumDecorations;
@@ -239,44 +235,28 @@
 //----- (00458600) --------------------------------------------------------
 void DecorationList::ToFile()
 {
-  DecorationList *v1; // esi@1
   FILE *v2; // eax@1
   FILE *v3; // edi@1
 
-  v1 = this;
   v2 = fopen("data\\ddeclist.bin", "wb");
   v3 = v2;
   if ( !v2 )
     Error("Unable to save ddeclist.bin!");
 
-  fwrite(v1, 4u, 1u, v2);
-  fwrite(v1->pDecorations, 0x54u, v1->uNumDecorations, v3);
+  fwrite(this, 4, 1, v2);
+  fwrite(this->pDecorations, 84, this->uNumDecorations, v3);
   fclose(v3);
 }
 //----- (004488B6) --------------------------------------------------------
 unsigned __int16 DecorationList::GetDecorIdByName(const char *pName)
 {
-  DecorationList *v2; // esi@1
-  signed int uID; // edi@2
-  signed int v4; // ebx@3
-  unsigned __int16 result; // ax@6
-
-  v2 = this;
-  if ( pName && (uID = 1, (signed int)this->uNumDecorations > 1) )
+  if ( pName &&  (signed int)this->uNumDecorations > 1 )
   {
-    v4 = 1;
-    while ( _stricmp(pName, v2->pDecorations[v4].pName) )
+    for ( uint uID = 1; uID < (signed int)this->uNumDecorations; ++uID )
     {
-      ++uID;
-      ++v4;
-      if ( uID >= (signed int)v2->uNumDecorations )
-        return 0;
+      if ( !_stricmp(pName, this->pDecorations[uID].pName) )
+        return uID;
     }
-    result = uID;
   }
-  else
-  {
-    result = 0;
-  }
-  return result;
+  return 0;
 }
\ No newline at end of file
--- a/Events.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/Events.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -282,17 +282,8 @@
 {
   unsigned int v3; // eax@5
   signed int v4; // esi@7
-  //char *v5; // eax@8
-  Player *v6; // ecx@8
-  //char *v7; // ebp@8
-  //signed int v8; // edx@10
-  //int v9; // edi@12
-  //ByteArray *v10; // esi@12
   int v11; // eax@14
   char *v12; // eax@15
-  //char *v13; // edi@21
-  int v14; // ebp@21
-  int v15; // edi@21
   const char *v16; // esi@21
   bool v17; // edx@21
   int v18; // ecx@22
@@ -302,11 +293,9 @@
   int v22; // edx@40
   int v23; // eax@40
   unsigned __int16 v24; // ax@45
-  int v25; // eax@54
   LevelDecoration *v26; // eax@55
   int v27; // eax@57
   int v28; // ecx@57
-  //int v29; // edx@58
   int pEventID; // eax@58
   int pNPC_ID; // ecx@58
   int pIndex; // esi@58
@@ -317,12 +306,8 @@
   int v37; // esi@62
   int v38; // eax@78
   int v39; // ecx@78
-  size_t v40; // edx@78
-  Actor *v41; // esi@79
   int v42; // eax@84
   int v43; // ecx@84
-  size_t v44; // edx@84
-  Actor *v45; // esi@85
   void *v46; // eax@91
   GUIWindow *v47; // eax@93
   GUIButton *v48; // ecx@93
@@ -357,16 +342,9 @@
   signed int v77; // ebp@186
   int v78; // edx@186
   Player *v79; // esi@187
-  //signed int v80; // ebp@200
-  //int v81; // edx@200
   Player *v82; // esi@201
   int v83; // eax@212
   int v84; // ebp@220
-  signed int v85; // ebp@224
-  char v86; // al@224
-  Player *v87; // esi@227
-  Player *v88; // ecx@231
-  int v89; // ecx@232
   int v90; // eax@243
   const char *v91; // ecx@247
   int v92; // eax@251
@@ -378,37 +356,24 @@
   unsigned int v98; // edx@265
   const char *v99; // esi@267
   int v100; // edx@267
-  //char *v101; // edi@281
   unsigned int v102; // esi@281
   int v103; // edi@284
   int v104; // eax@288
   int v105; // edx@294
   int v106; // [sp-20h] [bp-4C8h]@278
-  signed int v107; // [sp-1Ch] [bp-4C4h]@278
-  unsigned int v108; // [sp-18h] [bp-4C0h]@278
   signed int v109; // [sp-14h] [bp-4BCh]@278
   signed int v110; // [sp-10h] [bp-4B8h]@278
-  int v111; // [sp-Ch] [bp-4B4h]@278
-  // Event *v112; // [sp-8h] [bp-4B0h]@5
   int v113; // [sp-8h] [bp-4B0h]@106
   int v114; // [sp-8h] [bp-4B0h]@117
-  signed int v115; // [sp-8h] [bp-4B0h]@231
-  unsigned int v116; // [sp-8h] [bp-4B0h]@278
   int v117; // [sp-4h] [bp-4ACh]@106
   int v118; // [sp-4h] [bp-4ACh]@117
-  int v119; // [sp-4h] [bp-4ACh]@231
-  int v120; // [sp-4h] [bp-4ACh]@278
   int v121; // [sp-4h] [bp-4ACh]@294
   int curr_seq_num; // [sp+10h] [bp-498h]@4
-  //char *v123; // [sp+14h] [bp-494h]@0
-  signed int v124; // [sp+18h] [bp-490h]@7
-  //signed int v125; // [sp+1Ch] [bp-48Ch]@155
   int v126; // [sp+1Ch] [bp-48Ch]@262
   int player_choose; // [sp+20h] [bp-488h]@4
   int v128; // [sp+24h] [bp-484h]@21
   int v129; // [sp+24h] [bp-484h]@262
   signed int v130; // [sp+28h] [bp-480h]@0
-  //int v131; // [sp+2Ch] [bp-47Ch]@1
   int v132; // [sp+30h] [bp-478h]@262
   signed int v133; // [sp+34h] [bp-474h]@1
   int v134; // [sp+38h] [bp-470h]@262
@@ -422,7 +387,6 @@
   char Str[120]; // [sp+ECh] [bp-3BCh]@21
   Actor Dst; // [sp+164h] [bp-344h]@53
 
-  //v131 = uEventID;
   v133 = 0;
   EvtTargetObj = targetObj;
   dword_5B65C4_cancelEventProcessing = 0;
@@ -434,158 +398,129 @@
     return;
   }	*/
   if ( !uEventID )
-    {
+  {
     if ( !GameUI_Footer_TimeLeft )
       ShowStatusBarString(pGlobalTXT_LocalizationStrings[521], 2u);// Nothing here
     return;
-    }
+  }
   player_choose = (uActiveCharacter == 0)?6:4;  //4 - active or  6 - random player if active =0
   curr_seq_num = entry_line;
 
   if ( activeLevelDecoration )
-    {
+  {
     uSomeEVT_NumEvents = uGlobalEVT_NumEvents;
     pSomeEVT = pGlobalEVT.data();
     memcpy(pSomeEVT_Events.data(), pGlobalEVT_Index.data(), sizeof(EventIndex)*4400); //4400 evts
-    }
+  }
   else
-    {
+  {
     uSomeEVT_NumEvents = uLevelEVT_NumEvents;
     pSomeEVT = pLevelEVT.data();
     memcpy(pSomeEVT_Events.data(), pLevelEVT_Index.data(), sizeof(EventIndex)*4400);
-    }
+  }
 
-  v4 = 0;
-  v124 = 0;
-  //for (uint i = 0; i < uSomeEVT_NumEvents; ++i)
-  //  {
-    //v6 = v123;
-    //v7 = "";
-    while ( 1 )
+  for ( v4 = 0; v4 < uSomeEVT_NumEvents; ++v4 )
+  {
+    if ( dword_5B65C4_cancelEventProcessing )
     {
-    if ( dword_5B65C4_cancelEventProcessing )
-      goto LABEL_301;
-    //v8 = v4;
+      if ( v133 == 1 )
+        OnMapLeave();
+      return;
+    }
     if ( pSomeEVT_Events[v4].uEventID == uEventID && pSomeEVT_Events[v4].event_sequence_num == curr_seq_num )
       {
-      //v9 = pSomeEVT_Events[v8].uEventOffsetInEVT;
-      //v10 = (ByteArray *)&v5[v9];
       _evt_raw * _evt = (_evt_raw *)(pSomeEVT + pSomeEVT_Events[v4].uEventOffsetInEVT);
 
       switch (_evt->_e_type)
-        {
+      {
       case EVENT_CheckSeason:
-        //
         if ( !sub_4465DF_check_season(_evt->v5) )
-                {
+        {
           ++curr_seq_num;
-          v4 = v124;
+          //v4 = v124;
           break;
-                }
-        v124 = -1;
+        }
+        v4 = -1;
         curr_seq_num = _evt->v6 - 1;
           ++curr_seq_num;
         break;
       case EVENT_ShowMovie:
-        {
+      {
         strcpy(Source, (char *)&_evt->v7);
         v12 = (char *)&item.uExpireTime + strlen(Source) + 7;
         if ( *v12 == 32 )
           *v12 = 0;
-		if (pVideoPlayer->bBufferLoaded)
+        if (pVideoPlayer->bBufferLoaded)
           pVideoPlayer->Unload();
         pVideoPlayer->bStopBeforeSchedule = 0;
         pVideoPlayer->pResetflag = 0;
 
         v128 = pCurrentScreen;
-        //v13 = &pSomeEVT[v9];
-        //v14 = (unsigned __int8)v13[5];
-        //v15 = (unsigned __int8)v13[6];
-        v14 = _evt->v5;
-        v15 = _evt->v6;
         strcpy(Str, Source);
         v16 = RemoveQuotes(Str);
-		pVideoPlayer->MovieLoop(v16, 0, v14, 1);
+		pVideoPlayer->MovieLoop(v16, 0, _evt->v5, 1);
         if ( !_stricmp(v16, "arbiter good") )
                 {
                   pParty->alignment = PartyAlignment_Good;
           v18 = 0;
           LOBYTE(v17) = 1;
           SetUserInterface(PartyAlignment_Good, v17);
-          if ( !v15 || v128 == 3 )
-            {
+          if ( !_evt->v6 || v128 == 3 )
+          {
             pCurrentScreen = v128;
             if ( v128 == 3 )
               pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen;
             if ( v128 == 13 )
               pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
-            }
-
+          }
           ++curr_seq_num;
-          v4 = v124;
-
-          //v6 = v123;
-          //v7 = "";
           break;
-          }
+        }
         if ( !_stricmp(v16, "arbiter evil") )
-          {
+        {
           v18 = 2;
           pParty->alignment = PartyAlignment_Evil;
           LOBYTE(v17) = 1;
           SetUserInterface(PartyAlignment_Evil, v17);
-          if ( !v15 || v128 == 3 )
-            {
+          if ( !_evt->v6 || v128 == 3 )
+          {
             pCurrentScreen = v128;
             if ( v128 == 3 )
               pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen;
             if ( v128 == 13 )
               pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
-            }
+          }
           ++curr_seq_num;
-          v4 = v124;
-
-          //v6 = v123;
-          //v7 = "";
-
           break;
-          }
+        }
         if ( !_stricmp(v16, "pcout01") )    // moving to harmondale from emerald isle
-                {
+        {
           Rest(0x2760u);
           pParty->RestAndHeal();
           pParty->days_played_without_rest = 0;
-                }
-        if ( !v15 || v128 == 3 )
-          {
+        }
+        if ( !_evt->v6 || v128 == 3 )
+        {
           pCurrentScreen = v128;
           if ( v128 == 3 )
             pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen;
           if ( v128 == 13 )
-            pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
-          }
+            pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1);
+        }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         }
         break;
       case EVENT_CheckSkill:
-        {
+      {
         v19 = _evt->v7 + ((_evt->v8 + ((_evt->v9 + ((unsigned int)_evt->v10 << 8)) << 8)) << 8);
         if ( player_choose < 0 )
           goto LABEL_47;
         if ( player_choose <= 3 )
-          {
           v24 = pParty->pPlayers[0].pActiveSkills[3486 * player_choose + _evt->v5];
-          }
         else
           {
           if ( player_choose == 4 )
-            {
             v24 = pPlayers[uActiveCharacter]->pActiveSkills[_evt->v5];
-            }
           else
             {
             if ( player_choose == 5 )
@@ -605,15 +540,12 @@
                 if ( v20 >= 4 )
                   {
                   ++curr_seq_num;
-                  v4 = v124;
-
-                  //v6 = v123;
-                  //v7 = "";
                   break;
                   }
                 }
-              v11 = _evt->v11;
-              goto LABEL_130;
+              curr_seq_num = _evt->v11 - 1;
+              ++curr_seq_num;
+              break;
               }
 LABEL_47:
             //v10 = (ByteArray *)&v5[v9];
@@ -626,14 +558,11 @@
         v139 = v24 & 0x100;
         if ( (v24 & 0x3F) >= v19 && *(&v136 + _evt->v6) )
           {
-          v11 = _evt->v11;
-          goto LABEL_130;
+              curr_seq_num = _evt->v11 - 1;
+              ++curr_seq_num;
+              break;
           }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         }
         break;
 
@@ -647,29 +576,19 @@
           GameUI_InitializeDialogue(&Dst, false);
           }
         else
-          {
           bDialogueUI_InitializeActor_NPC_ID = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((unsigned int)_evt->v8 << 8)) << 8)) << 8);
-          }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_ChangeEvent:
-        v25 = EVT_DWORD(_evt->v5);
-        if ( v25 )
-          {
+        if ( EVT_DWORD(_evt->v5) )
           stru_5E4C90_MapPersistVars._decor_events[activeLevelDecoration->_idx_in_stru123] = _evt->v5 - 124;
-          }
         else
-          {
+        {
           v26 = (LevelDecoration *)activeLevelDecoration;
           stru_5E4C90_MapPersistVars._decor_events[activeLevelDecoration ->_idx_in_stru123] = 0;
           v26->uFlags |= LEVEL_DECORATION_INVISIBLE;
-          }
+        }
         ++curr_seq_num;
-        v4 = v124;
 
         break;
       case EVENT_SetNPCGreeting:
@@ -677,10 +596,6 @@
         pNPCStats->pNewNPCData[v27].uFlags &= 0xFFFFFFFCu;
         pNPCStats->pNewNPCData[v27].greet = EVT_DWORD(_evt->v9);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
             case EVENT_SetNPCTopic:
             {
@@ -723,79 +638,48 @@
               }
               ++curr_seq_num;
             }
-            v4 = v124;
             break;
       case EVENT_NPCSetItem:
         sub_448518_npc_set_item(EVT_DWORD(_evt->v5),EVT_DWORD(_evt->v9), _evt->v13);
         ++curr_seq_num;
-        v4 = v124;
-
         break;
       case EVENT_SetActorItem:
         Actor::GiveItem(EVT_DWORD(_evt->v5),EVT_DWORD(_evt->v9), _evt->v13);
         ++curr_seq_num;
-        v4 = v124;
         break;
       case EVENT_SetNPCGroupNews:
         pNPCStats->pGroups_copy[_evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8)] = _evt->v9 + ((uint)_evt->v10 << 8);
         ++curr_seq_num;
-        v4 = v124;
         break;
       case EVENT_SetActorGroup:
         __debugbreak();
         *(&pActors[0].uGroup + 0x11000000 * _evt->v8 + 209 * (_evt->v5 + ((_evt->v6 + ((uint)_evt->v7 << 8)) << 8))) = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8);
         ++curr_seq_num;
-        v4 = v124;
         break;
       case EVENT_ChangeGroup:
         v38 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8);
         v39 = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8);
-        v40 = uNumActors;
         __debugbreak();
-        if ( (signed int)uNumActors > 0 )
-          {
-          v41 = pActors.data();//[0].uGroup;
-          do
-            {
-            if ( v41->uGroup == v38 )
-              v41->uGroup = v39;
-            ++v41;
-            --v40;
-            }
-            while ( v40 );
-          }
+        for ( uint actor_id = 0; actor_id < uNumActors; actor_id++ )
+        {
+          if ( pActors[actor_id].uGroup == v38 )
+            pActors[actor_id].uGroup = v39;
+        }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_ChangeGroupAlly:
         v42 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8);
         v43 = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8);
-        v44 = uNumActors;
         __debugbreak();
-        if ( (signed int)uNumActors > 0 )
-          {
-          v45 = pActors.data();//[0].uAlly;
-          do
-            {
-            if ( v45->uGroup == v42 )
-              v45->uAlly = v43;
-            ++v45;
-            --v44;
-            }
-            while ( v44 );
-          }
+        for ( uint actor_id = 0; actor_id < uNumActors; actor_id++ )
+        {
+          if ( pActors[actor_id].uGroup == v42 )
+            pActors[actor_id].uAlly = v43;
+        }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_MoveNPC:
         {
-
         pNPCStats->pNewNPCData[EVT_DWORD(_evt->v5)].Location2D =EVT_DWORD(_evt->v9);
         if ( window_SpeakInHouse )
           {
@@ -812,7 +696,7 @@
               pAudioPlayer->PlaySound((SoundID)0, 0, 0, -1, 0, 0, 0, 0);
               window_SpeakInHouse = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_HouseInterior, 165, 0);
               v48 = window_SpeakInHouse->pControlsHead;
-              if ( v48 )
+              if ( window_SpeakInHouse->pControlsHead )
                 {
                 do
                   {
@@ -835,9 +719,7 @@
           }
 
         }
-                ++curr_seq_num;
-        v4 = v124;
-
+        ++curr_seq_num;
         break;
       case EVENT_Jmp:
         curr_seq_num = _evt->v5 - 1;
@@ -852,33 +734,28 @@
           pParty->pPlayers[uActiveCharacter].PlayEmotion((CHARACTER_EXPRESSION_ID)_evt->v6, 0);
         else if ( _evt->v5 == 5 ) //all players
           {
-          for(int i=0; i<4; ++i)
+          for(int i = 0; i < 4; ++i)
             pParty->pPlayers[i].PlayEmotion((CHARACTER_EXPRESSION_ID)_evt->v6, 0);
           }
         else  //random player
           pParty->pPlayers[rand() % 4].PlayEmotion((CHARACTER_EXPRESSION_ID)_evt->v6, 0);
           ++curr_seq_num;
-          v4 = v124;
-
           break;
       case EVENT_CharacterAnimation:
-        if ( _evt->v5 <= 3u ) //someone
+        if ( _evt->v5 <= 3 ) //someone
           pParty->pPlayers[_evt->v5].PlaySound((PlayerSpeech) _evt->v6, 0);
         else if ( _evt->v5 == 4 ) //active
           pParty->pPlayers[uActiveCharacter].PlaySound((PlayerSpeech) _evt->v6, 0);
         else if ( _evt->v5 == 5 ) //all
-          for(int i=0; i<4; ++i)
+          for(int i = 0; i < 4; ++i)
             pParty->pPlayers[i].PlaySound((PlayerSpeech) _evt->v6, 0);
         else  //random
           pParty->pPlayers[rand() % 4].PlaySound((PlayerSpeech) _evt->v6, 0);
         ++curr_seq_num;
-        v4 = v124;
-
         break;
       case EVENT_ForPartyMember:
         player_choose = _evt->v5;
         ++curr_seq_num;
-        v4 = v124;
         break;
       case EVENT_SummonItem:
         sub_42F7EB_DropItemAt(_evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8),
@@ -888,10 +765,6 @@
           _evt->v21 + ((_evt->v22 + ((_evt->v23 + ((uint)_evt->v24 << 8)) << 8)) << 8),
           _evt->v25, _evt->v26, 0, 0);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_Compare:
         pValue = EVT_DWORD(_evt->v7);
@@ -899,7 +772,7 @@
         {
           if ( pPlayers[player_choose]->CompareVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) )
           {
-            v124 = -1;
+           // v124 = -1;
             curr_seq_num = _evt->v11 - 1;
           }
         }
@@ -909,19 +782,19 @@
           {
             if ( pPlayers[uActiveCharacter]->CompareVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) )
             {
-              v124 = -1;
+             // v124 = -1;
               curr_seq_num = _evt->v11 - 1;
             }
           }
         }
         else  if ( player_choose == 5 )//all
         {
-          v130=0;
+          v130 = 0;
           for(int i = 1; i < 5; ++i)
           {
             if ( pPlayers[i]->CompareVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) )
             {
-              v124 = -1;
+             // v124 = -1;
               curr_seq_num = _evt->v11 - 1;
               break;
             }
@@ -932,21 +805,21 @@
         {
           if ( pPlayers[rand() % 4 + 1]->CompareVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) )
           {
-            v124 = -1;
+           // v124 = -1;
             curr_seq_num = _evt->v11 - 1;
           }
         }
         ++curr_seq_num;
-        v4 = v124;
+        v4 = -1;
         break;
       case EVENT_IsActorAlive:
          if  (IsActorAlive(EVT_BYTE(_evt->v5), EVT_DWORD(_evt->v6), EVT_BYTE(_evt->v10)))
-           {
-           v124 = -1;
+         {
+           //v124 = -1;
            curr_seq_num = _evt->v11 - 1;
-           }
+         }
          ++curr_seq_num;
-         v4 = v124;
+         v4 = -1;
          break;
       case EVENT_Substract:
         pValue = EVT_DWORD(_evt->v7);
@@ -1029,18 +902,11 @@
         else  if ( player_choose == 5 )//all
         {
           for(int i = 1; i < 5; ++i)
-          {
             pPlayers[i]->SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
-          }
         }
         else if ( player_choose == 6 ) //random
-        {
-          player_choose = rand() % 4;
-          pParty->pPlayers[player_choose].SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
-        }
-//substract:
+          pParty->pPlayers[rand() % 4].SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
         ++curr_seq_num;
-        v4 = v124;
         break;
       case EVENT_Set:
         pValue = EVT_DWORD(_evt->v7);
@@ -1053,18 +919,13 @@
         }
         else if ( player_choose == 5 )//all
         {
-                  //recheck v130
+          //recheck v130
           for ( int i = 1; i < 5; ++i )
             pPlayers[i]->SetVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
         }
         else if ( player_choose == 6 ) //random
-        {
-          player_choose = rand() % 4;
-          pPlayer = &pParty->pPlayers[player_choose];
-          pPlayer->SetVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
-        }
+          pParty->pPlayers[rand() % 4].SetVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
         ++curr_seq_num;
-        v4 = v124;
         break;
       case EVENT_Add:
         pValue = EVT_DWORD(_evt->v7);
@@ -1084,10 +945,7 @@
             pPlayers[i]->AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
         }
         else if ( player_choose == 6 ) //random
-        {
-          player_choose = rand() % 4;
-          pParty->pPlayers[player_choose].AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
-        }
+          pParty->pPlayers[rand() % 4].AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
         v83 = EVT_WORD(_evt->v5);
         if (v83 == 21 ||  // gold well on emerald isle
             v83 == 22 || v83 == 23 || v83 == 24 )
@@ -1096,36 +954,25 @@
           viewparams->bRedrawGameUI = true;
         }
         ++curr_seq_num;
-        v4 = v124;
         break;
       case EVENT_InputString:
         if ( !entry_line )
-          {
+        {
           strcpy(GameUI_Footer_TimedString.data(), &pLevelStr[pLevelStrOffsets[EVT_DWORD(_evt->v5 )]]);
-          v105 = curr_seq_num;
-          v121 = 26;
-LABEL_295:
-          sub_4451A8_press_any_key(uEventID, v105, v121);
-LABEL_301:
+          sub_4451A8_press_any_key(uEventID, curr_seq_num, 26);
           if ( v133 == 1 )
             OnMapLeave();
           return;
-          }
+        }
         v84 = _evt->v13 + ((_evt->v14 + ((_evt->v15 + ((uint)_evt->v16 << 8)) << 8)) << 8);
         if ( !_stricmp(GameUI_Footer_TimedString.data(), &pLevelStr[pLevelStrOffsets[_evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8)]])
           || !_stricmp(GameUI_Footer_TimedString.data(), &pLevelStr[pLevelStrOffsets[v84]]) )
-          {
+        {
           v11 = _evt->v17;
-LABEL_130:
-          //v124 = -1;
-LABEL_131:
           curr_seq_num = v11 - 1;
-          }
+        }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
+        v4 = -1;
         break;
       case EVENT_RandomGoTo:
         //v124 = -1;
@@ -1133,219 +980,131 @@
           + (_evt->v10 != 0)));
                 curr_seq_num = v11 - 1;
                 ++curr_seq_num;
-                v4 = v124;
+                v4 = -1;
                 break;
       case EVENT_ReceiveDamage:
-        v85 = EVT_DWORD(_evt->v7 );
-        v86 = _evt->v5;
-        if ( (unsigned __int8)v86 <= 3 )
-          {
-          v119 = _evt->v6;
-          v115 = EVT_DWORD(_evt->v7 );
-          v89 = (unsigned __int8)v86;
-          v88 = &pParty->pPlayers[v89];
-          v88->ReceiveDamage(v115, (DAMAGE_TYPE)v119);
-          ++curr_seq_num;
-          v4 = v124;
-          break;
-          }
-        if ( v86 == 4 )
-          {
-          if ( !uActiveCharacter )
-            {
-            ++curr_seq_num;
-            v4 = v124;
-
-            //v6 = v123;
-            //v7 = "";
-            break;
-            }
-          v119 = _evt->v6;
-          v88 = pPlayers[uActiveCharacter];
-          v115 = EVT_DWORD(_evt->v7 );
-          v88->ReceiveDamage(v115, (DAMAGE_TYPE)v119);
+        if ( (unsigned __int8)_evt->v5 <= 3 )
+        {
+          pParty->pPlayers[(unsigned __int8)_evt->v5].ReceiveDamage(EVT_DWORD(_evt->v7 ), (DAMAGE_TYPE)_evt->v6);
           ++curr_seq_num;
-          v4 = v124;
           break;
-          }
-        if ( v86 != 5 )
+        }
+        if ( _evt->v5 == 4 )
+        {
+          if ( !uActiveCharacter )
           {
-          v119 = _evt->v6;
-          v115 = EVT_DWORD(_evt->v7 );
-          v89 = rand() % 4;
-          v88 = &pParty->pPlayers[v89];
-          v88->ReceiveDamage(v115, (DAMAGE_TYPE)v119);
+            ++curr_seq_num;
+            break;
+          }
+          pPlayers[uActiveCharacter]->ReceiveDamage(EVT_DWORD(_evt->v7 ), (DAMAGE_TYPE)_evt->v6);
           ++curr_seq_num;
-          v4 = v124;
-
-          //v6 = v123;
-          //v7 = "";
           break;
-          }
-        v87 = pParty->pPlayers.data();
-        do
-          {
-          v87->ReceiveDamage(v85, (DAMAGE_TYPE)_evt->v6);
-          ++v87;
-          }
-          while ( (signed int)v87 < (signed int)pParty->pHirelings.data() );
+        }
+        if ( _evt->v5 != 5 )
+        {
+          pParty->pPlayers[rand() % 4].ReceiveDamage(EVT_DWORD(_evt->v7 ), (DAMAGE_TYPE)_evt->v6);
           ++curr_seq_num;
-          v4 = v124;
-
-          //v6 = v123;
-          //v7 = "";
+          break;
+        }
+        for ( uint pl_id = 0;pl_id < 4; pl_id++ )
+          pParty->pPlayers[pl_id].ReceiveDamage(EVT_DWORD(_evt->v7 ), (DAMAGE_TYPE)_evt->v6);
+          ++curr_seq_num;
           break;
       case EVENT_ToggleIndoorLight:
         pIndoor->ToggleLight(EVT_DWORD(_evt->v5 ), _evt->v9);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_SetFacesBit:
         sub_44892E_set_faces_bit(EVT_DWORD(_evt->v5),EVT_DWORD(_evt->v9), _evt->v13);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_ToggleChestFlag:
         Chest::ToggleFlag(EVT_DWORD(_evt->v5 ), EVT_DWORD(_evt->v9 ), _evt->v13);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_ToggleActorFlag:
         Actor::ToggleFlag(EVT_DWORD(_evt->v5 ), EVT_DWORD(_evt->v9 ), _evt->v13);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_ToggleActorGroupFlag:
         ToggleActorGroupFlag(EVT_DWORD(_evt->v5 ),  EVT_DWORD(_evt->v9 ), _evt->v13);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_SetSnow:
         if ( !_evt->v5 )
           pWeather->bRenderSnow = _evt->v6 != 0;
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_StatusText:
         v90 = EVT_DWORD(_evt->v5 );
         if ( activeLevelDecoration )
-          {
+        {
           if ( activeLevelDecoration == (LevelDecoration*)1 )
-            {
             current_npc_text = pNPCTopics[v90-1].pText;//(&dword_721664)[8 * v90];
-            }
           if ( canShowMessages == 1 )
             {
             v91 = pNPCTopics[v90-1].pText;//(&dword_721664)[8 * v90];
             //LABEL_248:
-            ShowStatusBarString(v91, 2u);
+            ShowStatusBarString(v91, 2);
             }
-          }
+        }
         else
-          {
+        {
           if ( canShowMessages == 1 )
-            {
+          {
             v91 = &pLevelStr[pLevelStrOffsets[v90]];
-            ShowStatusBarString(v91, 2u);
-            }
+            ShowStatusBarString(v91, 2);
           }
+        }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_ShowMessage:
-        v92 = EVT_DWORD(_evt->v5 );
         if ( activeLevelDecoration )
-          {
-          v93 = (char *)pNPCTopics[v92-1].pText;//(&dword_721664)[8 * v92];
+        {
+          current_npc_text = pNPCTopics[EVT_DWORD(_evt->v5 )-1].pText;//(&dword_721664)[8 * v92];
           byte_5B0938[0] = 0;
-          current_npc_text = v93;
-          }
+        }
         else
-          {
-          strcpy(byte_5B0938.data(), &pLevelStr[pLevelStrOffsets[v92]]);
-          }
+          strcpy(byte_5B0938.data(), &pLevelStr[pLevelStrOffsets[EVT_DWORD(_evt->v5 )]]);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_CastSpell:
               EventCastSpell(_evt->v5, _evt->v6, _evt->v7, EVT_DWORD(_evt->v8 ),
                     EVT_DWORD(_evt->v12 ), EVT_DWORD(_evt->v16 ), EVT_DWORD(_evt->v20 ),
                     EVT_DWORD(_evt->v24 ), EVT_DWORD(_evt->v28 ));
               ++curr_seq_num;
-              v4 = v124;
               break;
       case EVENT_SetTexture:
         sub_44861E_set_texture(EVT_DWORD(_evt->v5 ), (char *)&_evt->v9);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_SetSprite:
         SetDecorationSprite(EVT_DWORD(_evt->v5 ), _evt->v9, (char *)&_evt->v10);
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_SummonMonsters:
         sub_448CF4_spawn_monsters(_evt->v5, _evt->v6, _evt->v7,EVT_DWORD(_evt->v8 ),
                     EVT_DWORD(_evt->v12 ), EVT_DWORD(_evt->v16 ), EVT_DWORD(_evt->v20 ),
                     EVT_DWORD(_evt->v24 ));
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_MouseOver:
       case EVENT_LocationName:
         --curr_seq_num;
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_ChangeDoorState:
         Door_switch_animation(_evt->v5, _evt->v6);
         ++curr_seq_num;
-        v4 = v124;
         break;
       case EVENT_OpenChest:
         if ( !Chest::Open(_evt->v5) )
-          goto LABEL_301;
+        {
+          if ( v133 == 1 )
+            OnMapLeave();
+          return;
+        }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_MoveToMap:
         v94 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8);
@@ -1363,20 +1122,20 @@
           TransitionUI_Load(_evt->v29, _evt->v30, v135, v132, v126, v129, v95, v134, (char *)&_evt->v31);
           dword_5C3418 = uEventID;
           dword_5C341C = curr_seq_num + 1;
-          goto LABEL_301;
+          if ( v133 == 1 )
+            OnMapLeave();
+          return;
           }
         _5B65AC_npcdata_fame_or_other = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8);
         _5B65A8_npcdata_uflags_or_other = v94;
         _5B65B0_npcdata_rep_or_other = v126;
         if ( v129 == -1 )
-          {
           v98 = _5B65B4_npcdata_loword_house_or_other;
-          }
         else
-          {
+        {
           v98 = v129 & stru_5C6E00->uDoublePiMask;
           _5B65B4_npcdata_loword_house_or_other = v129 & stru_5C6E00->uDoublePiMask;
-          }
+        }
         v99 = (char *)&_evt->v31;
         _5B65B8_npcdata_hiword_house_or_other = v95;
         dword_5B65BC = v97;
@@ -1393,13 +1152,6 @@
             if ( _5B65B4_npcdata_loword_house_or_other != -1 )
               pParty->sRotationY = _5B65B4_npcdata_loword_house_or_other;
             _5B65B4_npcdata_loword_house_or_other = -1;
-            v120 = 0;
-            v116 = 0;
-            v111 = 0;
-            v110 = 0;
-            v109 = -1;
-            v108 = 0;
-            v107 = 0;
             pParty->sRotationX = v95;
             pParty->uFallSpeed = v134;
             dword_5B65C0 = 0;
@@ -1409,8 +1161,7 @@
             _5B65AC_npcdata_fame_or_other = 0;
             _5B65A8_npcdata_uflags_or_other = 0;
             v106 = 232;
-LABEL_280:
-            pAudioPlayer->PlaySound((SoundID)v106, v107, v108, v109, v110, v111, v116, v120);
+            pAudioPlayer->PlaySound((SoundID)v106, 0, 0, -1, 0, 0, 0, 0);
             }
           }
         else
@@ -1444,34 +1195,22 @@
             }
           }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_PlaySound:
-        v120 = 0;
-        v116 = 0;
-        v111 = 0;
         v110 = _evt->v13 + ((_evt->v14 + ((_evt->v15 + ((uint)_evt->v16 << 8)) << 8)) << 8);
         v109 = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8);
-        v108 = 0;
-        v107 = 0;
         v106 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8);
-        goto LABEL_280;
+        pAudioPlayer->PlaySound((SoundID)v106, 0, 0, v109, v110, 0, 0, 0);
+        ++curr_seq_num;
+        break;
       case EVENT_GiveItem:
         item.Reset();
-        //v101 = &pSomeEVT[v9];
-        v102 = _evt->v7
-          + ((_evt->v8 + ((_evt->v9 + ((uint)_evt->v10 << 8)) << 8)) << 8);
+        v102 = _evt->v7 + ((_evt->v8 + ((_evt->v9 + ((uint)_evt->v10 << 8)) << 8)) << 8);
         pItemsTable->GenerateItem(_evt->v5, _evt->v6, &item);
         if ( v102 )
           item.uItemID = v102;
         pParty->SetHoldingItem(&item);
         ++curr_seq_num;
-        v4 = v124;
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_SpeakInHouse:
         if ( EnterHouse((enum HOUSE_ID)EVT_DWORD(_evt->v5)))
@@ -1490,34 +1229,25 @@
           window_SpeakInHouse->CreateButton(  0,   0,  0, 0, 1,  0, UIMSG_CycleCharacters, 0, '\t', "", 0);
           }
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
       case EVENT_PressAnyKey:
-        v121 = 33;
-        v105 = curr_seq_num + 1;
-        goto LABEL_295;
+        sub_4451A8_press_any_key(uEventID, curr_seq_num + 1, 33);
+        if ( v133 == 1 )
+          OnMapLeave();
+        return;
       case EVENT_Exit:
         if ( v133 == 1 )
               OnMapLeave();
         return;
       default:
         ++curr_seq_num;
-        v4 = v124;
-
-        //v6 = v123;
-        //v7 = "";
         break;
         }
       }
-    ++v4;
-    v124 = v4;
-    if ( v4 >= uSomeEVT_NumEvents )
-       goto LABEL_301;
-    //}
     }
+    if ( v133 == 1 )
+      OnMapLeave();
+    return;
   }
 
 //----- (00444732) --------------------------------------------------------
@@ -1540,8 +1270,8 @@
     {
       if ( pLevelEVT_Index[event_index].uEventID == uEventID )
       {
-    test_evt=(_evt_raw*)&pLevelEVT[pLevelEVT_Index[event_index].uEventOffsetInEVT];
-    last_evt=test_evt;
+        test_evt=(_evt_raw*)&pLevelEVT[pLevelEVT_Index[event_index].uEventOffsetInEVT];
+        last_evt=test_evt;
         event_pos = pLevelEVT_Index[event_index+1].uEventOffsetInEVT;
         if ( test_evt->_e_type == EVENT_MouseOver )
           break;
@@ -1550,7 +1280,7 @@
       if ( event_index >= uLevelEVT_NumEvents )
        return NULL;
     }
-  test_evt=(_evt_raw*)&pLevelEVT[event_pos];
+    test_evt=(_evt_raw*)&pLevelEVT[event_pos];
     if ( test_evt->_e_type== EVENT_SpeakInHouse )
     {
       str_index = EVT_DWORD(test_evt->v5);
@@ -1558,10 +1288,10 @@
     }
     else
     {
-      for ( i = event_index+1; pLevelEVT_Index[i].uEventID  == uEventID; ++i )
+      for ( i = event_index + 1; pLevelEVT_Index[i].uEventID  == uEventID; ++i )
       {
         event_pos = pLevelEVT_Index[i].uEventOffsetInEVT;
-    test_evt=(_evt_raw*)&pLevelEVT[event_pos];
+        test_evt=(_evt_raw*)&pLevelEVT[event_pos];
         if ( test_evt->_e_type == EVENT_SpeakInHouse )
         {
           str_index = EVT_DWORD(test_evt->v5);
--- a/GUIButton.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/GUIButton.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -114,73 +114,51 @@
 //----- (0041D0D8) --------------------------------------------------------
 void GUIButton::Release()
 {
-  GUIWindow *v1; // eax@2
-  GUIButton *v2; // edx@2
-  GUIButton *v3; // eax@6
-  GUIButton *ptr;
-
-  ptr=this;
-  if ( ptr )
+  if ( this )
   {
-    v1 = ptr->pParent;
-    v2 = ptr->pNext;
-    if ( ptr == v1->pControlsHead )
+    if ( this == this->pParent->pControlsHead )
     {
-      if ( v2 )
+      if ( this->pNext )
       {
-        v1->pControlsHead = v2;
-        ptr->pNext->pPrev = 0;
+        this->pParent->pControlsHead = this->pNext;
+        this->pNext->pPrev = 0;
       }
       else
       {
-        v1->pControlsHead = 0;
-        ptr->pParent->pControlsTail = 0;
+        this->pParent->pControlsHead = 0;
+        this->pParent->pControlsTail = 0;
       }
     }
     else
     {
-      v3 = ptr->pPrev;
-      if ( v2 )
+      if ( this->pNext )
       {
-        v3->pNext = v2;
-        ptr->pNext->pPrev = v3;
+        this->pPrev->pNext = this->pNext;
+        this->pNext->pPrev = this->pPrev;
       }
       else
       {
-        v3->pNext = 0;
-        ptr->pParent->pControlsTail = v3;
+        this->pPrev->pNext = 0;
+        this->pParent->pControlsTail = this->pPrev;
       }
     }
-    --ptr->pParent->uNumControls;
+    --this->pParent->uNumControls;
   }
 }
 
-
 //----- (00415180) --------------------------------------------------------
 void GUIButton::DrawLabel( const char *label_text, struct GUIFont *pFont, int a5, int uFontShadowColor )
-    {
-  const char *v5; // ebx@1
-  GUIButton *v6; // esi@1
-  int v7; // eax@1
-
-  v5 = label_text;
-  v6 = this;
+{
   //strlen(edx0);
-  v7 = pFont->GetLineWidth(label_text);
-  return pParent->DrawText(
-           pFont,
-           v6->uX + (signed int)(v6->uWidth - v7) / 2,
-           v6->uY + (signed int)(v6->uHeight - pFont->uFontHeight) / 2,
-           a5,
-           label_text,
-           0,
-           0,
-           uFontShadowColor);
+  return pParent->DrawText(pFont,
+           this->uX + (signed int)(this->uWidth - pFont->GetLineWidth(label_text)) / 2,
+           this->uY + (signed int)(this->uHeight - pFont->uFontHeight) / 2,
+           a5, label_text, 0, 0, uFontShadowColor);
 }
 //----- (004B36CC) --------------------------------------------------------
 void CreateButtonInColumn( int column_pos, unsigned int control_id )
 {
-     pDialogueWindow->CreateButton( 480, 30 * column_pos + 146, 140, 30,  1,  0, UIMSG_SelectShopDialogueOption,  control_id,  0,   "",   0);
+  pDialogueWindow->CreateButton( 480, 30 * column_pos + 146, 140, 30,  1,  0, UIMSG_SelectShopDialogueOption,  control_id,  0,   "",   0);
 }
 //----- (00419379) --------------------------------------------------------
 void ReleaseAwardsScrollBar()
--- a/GUIFont.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/GUIFont.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -55,8 +55,6 @@
     return pFont;
 }
 
-
-
 //----- (0044D2FD) --------------------------------------------------------
 void GUIFont::_44D2FD_prolly_draw_credits_entry( GUIFont *pSecondFont, int uFrameX, int uFrameY, unsigned int w, unsigned int h, 
                                                  unsigned __int16 firstColor, unsigned __int16 secondColor, const char *pString, 
@@ -110,8 +108,6 @@
   }
 }
 
-
-
 //----- (0044D1E7) --------------------------------------------------------
 void GUIFont::DrawTextLine( unsigned int uDefaultColor, signed int uX, signed int uY, 
                             const char *text, int max_len_pix )
@@ -649,5 +645,5 @@
 //----- (00414174) --------------------------------------------------------
 void uGameUIFontShadow_initialize()
 {
-  uGameUIFontShadow = Color16(0xE6u, 214u, 193u);
+  uGameUIFontShadow = Color16(0xE6u, 214, 193);
 }
\ No newline at end of file
--- a/GUIProgressBar.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/GUIProgressBar.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -60,7 +60,7 @@
     }
     while ( v4 <= 5 );
     if ( v5 == 5 )
-      memset(&field_10, 0, 8u);
+      memset(&field_10, 0, 8);
     v7 = rand() % 5 + 1;
     if ( *(&field_10 + v7) == 1 )
     {
@@ -125,48 +125,41 @@
 //----- (004435CD) --------------------------------------------------------
 void GUIProgressBar::Progress()
 {
-  unsigned __int8 v1; // al@1
-
   ++this->uProgressCurrent;
-  v1 = this->uProgressMax;
-  if ( this->uProgressCurrent > v1 )
-    this->uProgressCurrent = v1;
+  if ( this->uProgressCurrent > this->uProgressMax )
+    this->uProgressCurrent = this->uProgressMax;
   Draw();
 }
 
 //----- (004435E2) --------------------------------------------------------
 void GUIProgressBar::Release()
 {
-  GUIProgressBar *v1; // esi@1
-  char v2; // al@5
   int v3; // edi@7
 
-  v1 = this;
-  if ( v1->uType == 1 )
+  if ( this->uType == 1 )
   {
-    if ( !v1->pLoadingBg.pPixels )
+    if ( !this->pLoadingBg.pPixels )
       return;
-    v2 = v1->uProgressMax;
-    if ( v1->uProgressCurrent != v2 )
+    if ( this->uProgressCurrent != this->uProgressMax )
     {
-      v1->uProgressCurrent = v2 - 1;
+      this->uProgressCurrent = this->uProgressMax - 1;
       Progress();
     }
-    free(v1->pLoadingBg.pPixels);
-    v3 = (int)&v1->pLoadingProgress.pLevelOfDetail0_prolly_alpha_mask;
-    free(v1->pLoadingProgress.pLevelOfDetail0_prolly_alpha_mask);
-    free(v1->pLoadingProgress.pPalette16);
-    v1->pLoadingProgress.pPalette16 = 0;
-    v1->pLoadingBg.pPixels = 0;
+    free(this->pLoadingBg.pPixels);
+    v3 = (int)&this->pLoadingProgress.pLevelOfDetail0_prolly_alpha_mask;
+    free(this->pLoadingProgress.pLevelOfDetail0_prolly_alpha_mask);
+    free(this->pLoadingProgress.pPalette16);
+    this->pLoadingProgress.pPalette16 = 0;
+    this->pLoadingBg.pPixels = 0;
   }
   else
   {
-    if ( !v1->pBardata.pLevelOfDetail0_prolly_alpha_mask )
+    if ( !this->pBardata.pLevelOfDetail0_prolly_alpha_mask )
       return;
-    free(v1->pBardata.pLevelOfDetail0_prolly_alpha_mask);
-    v3 = (int)&v1->pBardata.pPalette16;
-    free(v1->pBardata.pPalette16);
-    v1->pBardata.pLevelOfDetail0_prolly_alpha_mask = 0;
+    free(this->pBardata.pLevelOfDetail0_prolly_alpha_mask);
+    v3 = (int)&this->pBardata.pPalette16;
+    free(this->pBardata.pPalette16);
+    this->pBardata.pLevelOfDetail0_prolly_alpha_mask = 0;
   }
   *(int *)v3 = 0;
 }
@@ -179,7 +172,7 @@
   {
     if (pBardata.pLevelOfDetail0_prolly_alpha_mask)
     {
-            pRenderer->Sub01();
+      pRenderer->Sub01();
 
       pRenderer->DrawTextureIndexed(80, 122, &pBardata);//  
       pRenderer->DrawTextureTransparent(100, 146, &pIcons_LOD->pTextures[pIconsFrameTable->GetFrame(uIconID_TurnHour, 0)->uTextureID]);
--- a/GUIWindow.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/GUIWindow.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -80,41 +80,27 @@
     uNumMessages = pMessages[0].field_8 != 0;
 }
 
-
 //----- (004356B9) --------------------------------------------------------
 void GUIMessageQueue::PopMessage(enum UIMessageType *pType, int *pParam, int *a4)
 {
-  signed int v4; // edx@1
-  GUIMessage *v5; // eax@2
-
-  v4 = 0;
   if ( this->uNumMessages )
   {
-    v5 = this->pMessages;
     *pType = this->pMessages[0].eType;
     *pParam = this->pMessages[0].param;
     *a4 = this->pMessages[0].field_8;
     if ( (signed int)(this->uNumMessages - 1) > 0 )
     {
-      do
+      for ( uint i = 0; i < (signed int)(this->uNumMessages - 1); ++i )
       {
-        v5->eType = v5[1].eType;
-        v5->param = v5[1].param;
-        v5->field_8 = v5[1].field_8;
-        ++v4;
-        ++v5;
+        this->pMessages[i].eType = this->pMessages[i + 1].eType;
+        this->pMessages[i].param = this->pMessages[i + 1].param;
+        this->pMessages[i].field_8 = this->pMessages[i + 1].field_8;
       }
-      while ( v4 < (signed int)(this->uNumMessages - 1) );
     }
     --this->uNumMessages;
   }
 }
 
-
-
-
-
-
 //----- (0041B4E1) --------------------------------------------------------
 int __fastcall GUI_ReplaceHotkey(unsigned __int8 uOldHotkey, unsigned __int8 uNewHotkey, char bFirstCall)
 {
@@ -160,9 +146,6 @@
   return result;
 }
 
-
-
-
 //----- (0041B438) --------------------------------------------------------
 GUIButton *__fastcall GUI_HandleHotkey(unsigned __int8 uHotkey)
 {
@@ -343,9 +326,7 @@
   case WINDOW_null:
     return;
 	default:
-		{
 		break;
-		}
   }
   //v8 = this->pControlsHead;
   if ( this->pControlsHead )
@@ -373,11 +354,6 @@
   uNumVisibleWindows = uNumVisibleWindows - 1;
 }
 
-
-
-
-
-
 //----- (0041CD3B) --------------------------------------------------------
 GUIButton *GUIWindow::GetControl(unsigned int uID)
 {
@@ -647,30 +623,14 @@
 void GUIWindow::DrawMessageBox(int arg0)
 {
   unsigned int v2; // edi@1
-  GUIWindow *v3; // ebx@1
   signed int v4; // esi@2
   unsigned int v5; // eax@2
-  unsigned int v6; // edx@4
-  unsigned int v7; // ecx@6
-  unsigned int v8; // eax@9
-  __int32 v9; // eax@10
-  unsigned int v10; // eax@18
-  LONG v11; // ecx@18
-  unsigned int v12; // edx@18
-  unsigned int v13; // eax@18
-  const char *v14; // ecx@18
-  int v15; // eax@19
   unsigned int v16; // esi@19
-  const char *v17; // ebx@25
-  int v18; // eax@26
-  GUIWindow v19; // [sp+Ch] [bp-60h]@18
-  POINT a2; // [sp+60h] [bp-Ch]@8
-  unsigned int v21; // [sp+68h] [bp-4h]@18
+  GUIWindow current_window; // [sp+Ch] [bp-60h]@18
+  POINT cursor; // [sp+60h] [bp-Ch]@8
   unsigned int v22; // [sp+74h] [bp+8h]@2
-  unsigned int v23; // [sp+74h] [bp+8h]@18
 
   v2 = 0;
-  v3 = this;
   if ( arg0 )
   {
     v4 = pViewport->uViewportTL_X;
@@ -684,108 +644,82 @@
     v5 = window->GetWidth();
     v22 = window->GetHeight();
   }
-  v6 = this->uFrameX;
+  pMouse->GetCursorPos(&cursor);
   if ( (signed int)this->uFrameX >= v4 )
   {
-    v7 = this->uFrameWidth;
-    if ( (signed int)(v7 + v6) <= (signed int)v5 )
-      goto LABEL_9;
-    v3->uFrameX = v5 - v7;
+    if ( (signed int)(this->uFrameWidth + this->uFrameX) > (signed int)v5 )
+    {
+      this->uFrameX = v5 - this->uFrameWidth;
+      this->uFrameY = cursor.y + 30;
+    }
   }
   else
   {
     this->uFrameX = v4;
+    this->uFrameY = cursor.y + 30;
   }
-  v3->uFrameY = pMouse->GetCursorPos(&a2)->y + 30;
-LABEL_9:
-  v8 = v3->uFrameY;
-  if ( (signed int)v8 >= (signed int)v2 )
+
+  if ( (signed int)this->uFrameY >= (signed int)v2 )
   {
-    if ( (signed int)(v8 + v3->uFrameHeight) <= (signed int)v22 )
-      goto LABEL_14;
-    v9 = pMouse->GetCursorPos(&a2)->y - v3->uFrameHeight - 30;
+    if ( (signed int)(this->uFrameY + this->uFrameHeight) > (signed int)v22 )
+      this->uFrameY = cursor.y - this->uFrameHeight - 30;
   }
   else
-  {
-    v9 = pMouse->GetCursorPos(&a2)->y + 30;
-  }
-  v3->uFrameY = v9;
-LABEL_14:
-  if ( (signed int)v3->uFrameY < (signed int)v2 )
-    v3->uFrameY = v2;
-  if ( (signed int)v3->uFrameX < v4 )
-    v3->uFrameX = v4;
-  v10 = v3->uFrameWidth;
-  v11 = v3->uFrameX;
-  v12 = v3->uFrameY;
-  v21 = v10;
-  a2.y = v11;
-  v3->uFrameZ = v10 + v11 - 1;
-  v13 = v3->uFrameHeight;
-  v3->uFrameW = v13 + v12 - 1;
-  memcpy(&v19, v3, sizeof(v19));
-  v19.uFrameX += 12;
-  v19.uFrameWidth -= 24;
-  v19.uFrameY += 12;
-  v19.uFrameHeight -= 12;
-  v19.uFrameZ = v19.uFrameWidth + v19.uFrameX - 1;
-  v23 = v12;
-  v19.uFrameW = v19.uFrameHeight + v19.uFrameY - 1;
-  v14 = v3->Hint;
-  if ( v14 )
-  {
-    v15 = pFontLucida->CalcTextHeight(v14, &v19, 0, 0);
-    v12 = v23;
-    v16 = v15 + 24;
-  }
+    this->uFrameY = cursor.y + 30;
+  if ( (signed int)this->uFrameY < (signed int)v2 )
+    this->uFrameY = v2;
+  if ( (signed int)this->uFrameX < v4 )
+    this->uFrameX = v4;
+  this->uFrameZ = this->uFrameWidth + this->uFrameX - 1;
+  this->uFrameW = this->uFrameHeight + this->uFrameY - 1;
+  memcpy(&current_window, this, sizeof(current_window));
+  current_window.uFrameX += 12;
+  current_window.uFrameWidth -= 24;
+  current_window.uFrameY += 12;
+  current_window.uFrameHeight -= 12;
+  current_window.uFrameZ = current_window.uFrameWidth + current_window.uFrameX - 1;
+  current_window.uFrameW = current_window.uFrameHeight + current_window.uFrameY - 1;
+  if ( this->Hint )
+    v16 = pFontLucida->CalcTextHeight(this->Hint, &current_window, 0, 0) + 24;
   else
-  {
-    v16 = v13;
-  }
+    v16 = this->uFrameHeight;
   if ( (signed int)v16 < 64 )
     v16 = 64;
-  if ( (signed int)(v16 + v12) > 479 )
-    v16 = 479 - v12;
-  DrawPopupWindow(a2.y, v12, v21, v16);
-  v17 = v3->Hint;
-  if ( v17 )
-  {
-    v18 = pFontLucida->CalcTextHeight(v17, &v19, 0, 0);
-    v19.DrawTitleText(pFontLucida, 0, (signed int)(v16 - v18) / 2 - 14, 0, v17, 3);
-  }
+  if ( (signed int)(v16 + this->uFrameY) > 479 )
+    v16 = 479 - this->uFrameY;
+  DrawPopupWindow(this->uFrameX, this->uFrameY, this->uFrameWidth, v16);
+  if ( this->Hint )
+    current_window.DrawTitleText(pFontLucida, 0, (signed int)(v16 - pFontLucida->CalcTextHeight(this->Hint, &current_window, 0, 0)) / 2 - 14, 0, this->Hint, 3);
 }
 
-
-
-
 //----- (00411B59) --------------------------------------------------------
 void __fastcall LoadThumbnailLloydTexture(unsigned int uSlot, unsigned int uPlayer)
 {
-  unsigned int v2; // esi@1
-  unsigned int v3; // edi@1
+  //unsigned int v2; // esi@1
+  //unsigned int v3; // edi@1
   FILE *v4; // ebx@1
   FILE *v5; // eax@2
   char pContainerName[64]; // [sp+Ch] [bp-44h]@1
-  unsigned int v7; // [sp+4Ch] [bp-4h]@1
+  //unsigned int v7; // [sp+4Ch] [bp-4h]@1
 
-  v2 = uSlot;
-  v7 = uPlayer;
-  v3 = uSlot + 1;
+  //v2 = uSlot;
+  //v7 = uPlayer;
+  //v3 = uSlot + 1;
   sprintf(pContainerName, "data\\lloyd%d%d.pcx", uPlayer, uSlot + 1);
   v4 = fopen(pContainerName, "rb");
   if ( v4 )
   {
-    pSavegameThumbnails[v2].LoadFromFILE(v4, 0, 1u);
+    pSavegameThumbnails[uSlot].LoadFromFILE(v4, 0, 1);
     fclose(v4);
   }
   else
   {
-    sprintf(pContainerName, "lloyd%d%d.pcx", v7, v3);
+    sprintf(pContainerName, "lloyd%d%d.pcx", uPlayer, uSlot + 1);
     v5 = pNew_LOD->FindContainer(pContainerName, 1);
     if ( v5 )
-      pSavegameThumbnails[v2].LoadFromFILE(v5, 0, 0);
+      pSavegameThumbnails[uSlot].LoadFromFILE(v5, 0, 0);
     else
-      *((int *)&pSavegameThumbnails.data()->pPixels + 10 * v2) = 0;
+      *((int *)&pSavegameThumbnails.data()->pPixels + 10 * uSlot) = 0;
   }
 }
 
@@ -900,9 +834,7 @@
         pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]);
       }
       else
-      {
         pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uExitCancelTextureId]);
-      }
       return;
     }
     if ( current_npc_text )
@@ -925,9 +857,7 @@
         pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]);
       }
       else
-      {
         pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uExitCancelTextureId]);
-      }
       return;
     }
     for ( v8 = 0; v8 < uNumDialogueNPCPortraits; ++v8 )
@@ -964,9 +894,7 @@
         pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]);
       }
       else
-      {
         pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uExitCancelTextureId]);
-      }
       return;
   }
   v4 = (char *)pDialogueNPCCount - 1;
@@ -981,15 +909,11 @@
       pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]);
     }
     else
-    {
       pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uExitCancelTextureId]);
-    }
     return;
   }
   if ( v4 || !dword_591080 )//         
-  {
     SimpleHouseDialog();
-  }
   else
   {
     sprintfex( pTmpBuf.data(), pGlobalTXT_LocalizationStrings[429],
@@ -1058,9 +982,7 @@
     pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]);
   }
   else
-  {
     pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uExitCancelTextureId]);
-  }
 }
 
 //----- (004B1854) --------------------------------------------------------
@@ -1117,13 +1039,11 @@
   this->DrawTitleText(pFontArrus, 0, (212 - pFontArrus->CalcTextHeight(pTmpBuf.data(), this, 0, 0)) / 2 + 101, Color16(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
 }
 
-
-
 //----- (0044D406) --------------------------------------------------------
 void GUIWindow::DrawTitleText( GUIFont *a2, signed int uHorizontalMargin, unsigned int uVerticalMargin, unsigned __int16 uDefaultColor, 
                                const char *pInString, unsigned int uLineSpacing )
 {
-  GUIWindow *pWindow; // esi@1
+  //GUIWindow *pWindow; // esi@1
   unsigned int v8; // ebx@1
   char *v9; // eax@1
   unsigned int v11; // edi@1
@@ -1132,14 +1052,14 @@
   GUIFont *pFont; // [sp+Ch] [bp-4h]@1
   const char *Stra; // [sp+24h] [bp+14h]@5
 
-  pWindow = this;
+  //pWindow = this;
   pFont = a2;
   v8 = this->uFrameWidth - uHorizontalMargin;
   ui_current_text_color = uDefaultColor;
   v9 = FitTextInAWindow(pInString, a2, this, uHorizontalMargin, 0);
   Stra = strtok(v9, "\n");
-  v11 = uHorizontalMargin + pWindow->uFrameX;
-  v12 = uVerticalMargin + pWindow->uFrameY;
+  v11 = uHorizontalMargin + this->uFrameX;
+  v12 = uVerticalMargin + this->uFrameY;
   while ( 1 )
   {
     if ( !Stra )
@@ -1154,8 +1074,6 @@
 }
 // 5C6DB4: using guessed type int ui_current_text_color;
 
-
-
 //----- (0044CE08) --------------------------------------------------------
 void GUIWindow::DrawText( GUIFont *a2, signed int uX, int uY, unsigned int uFontColor, const char *Str, int a7, int a8, signed int uFontShadowColor )
     {
@@ -1202,9 +1120,7 @@
     if ( !uX )
       uX = 12;
     if ( a8 )
-    {
       v32 = Str;
-    }
     else
     {
       v11 = (int)FitTextInAWindow(Str, v10, v9, uX, 0);
@@ -1230,7 +1146,7 @@
             switch ( (unsigned __int8)v11 )
             {
               case 9u:
-                strncpy(Dest, &v32[v14 + 1], 3u);
+                strncpy(Dest, &v32[v14 + 1], 3);
                 Dest[3] = 0;
                 pInString += 3;
                 v29 = atoi(Dest);
@@ -1244,17 +1160,21 @@
                 v13 = uY + v31->uFrameY;
                 v12 = uX + v29 + v31->uFrameX;
                 if ( a8 )
-                  goto LABEL_36;
+                {
+                  v11 = v11 + v13 - 3;
+                  if ( v11 > a8 )
+                    return;
+                }
                 break;
               case 0xCu:
-                strncpy(Dest, &v32[v14 + 1], 5u);
+                strncpy(Dest, &v32[v14 + 1], 5);
                 Dest[5] = 0;
                 v11 = atoi(Dest);
                 pInString += 5;
                 uFontColor = v11;
                 break;
               case 0xDu:
-                strncpy(Dest, &v32[v14 + 1], 3u);
+                strncpy(Dest, &v32[v14 + 1], 3);
                 Dest[3] = 0;
                 pInString += 3;
                 v18 = atoi(Dest);
@@ -1264,7 +1184,6 @@
                 if ( a8 )
                 {
                   v11 = LOBYTE(v10->uFontHeight);
-LABEL_36:
                   v11 = v11 + v13 - 3;
                   if ( v11 > a8 )
                     return;
@@ -1285,24 +1204,11 @@
                   v12 += v10->pMetrics[v15].uLeftSpacing;
                 v17 = (int)((char *)&v10[1] + v10->font_pixels_offset[v15]);
                 if ( (short)uFontColor )
-                  pRenderer->DrawText(
-                    v12,
-                    v13,
-                    (unsigned __int8 *)v17,
-                    v16,
-                    LOBYTE(v10->uFontHeight),
-                    v10->pFontPalettes[0],
-                    uFontColor,
-                    uFontShadowColor);
+                  pRenderer->DrawText(v12, v13, (unsigned __int8 *)v17, v16, LOBYTE(v10->uFontHeight),
+                    v10->pFontPalettes[0], uFontColor, uFontShadowColor);
                 else
-                  pRenderer->DrawTextPalette(
-                    v12,
-                    v13,
-                    (unsigned char*)v17,
-                    v16,
-                    LOBYTE(v10->uFontHeight),
-                    v10->pFontPalettes[0],
-                    a7);
+                  pRenderer->DrawTextPalette(v12, v13, (unsigned char*)v17, v16, LOBYTE(v10->uFontHeight),
+                    v10->pFontPalettes[0], a7);
                 LOBYTE(v11) = v30;
                 v12 += v28;
                 if ( (signed int)pInString < (signed int)v30 )
@@ -1325,8 +1231,7 @@
 
 //----- (0044CB4F) --------------------------------------------------------
 int GUIWindow::DrawTextInRect( GUIFont *pFont, unsigned int uX, unsigned int uY, unsigned int uColor, const char *text, int rect_width, int reverse_text )
-    {
-
+{
   int pLineWidth; // ebx@1
   int text_width; // esi@3
   unsigned __int8 v12; // cl@7
@@ -1368,7 +1273,7 @@
   if ( reverse_text )
     _strrev(pTmpBuf2.data());
   Str1a = 0;
-  for (i=0; i<pNumLen; ++i)
+  for ( i = 0; i < pNumLen; ++i )
     {
       if ( text_width >= rect_width )
         break;
@@ -1390,7 +1295,7 @@
           text_width += pFont->pMetrics[v12].uWidth;
           if ( i < pNumLen )
               text_width += pFont->pMetrics[v12].uRightSpacing;
-          }       
+          }
       }
     }
   pTmpBuf2[i - 1] = 0;
@@ -1456,10 +1361,8 @@
           v13 += v20;
           if ( i < (signed int)pNumLen )
               v13 += pFont->pMetrics[v15].uRightSpacing;
-          }       
+          }
       }
-      
-   
   }
   return v28;
 }
@@ -1528,7 +1431,7 @@
 
 //----- (0041C432) --------------------------------------------------------
 GUIWindow * GUIWindow::Create( unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight, enum WindowType eWindowType, int pButton, const char* hint )
-    {
+{
   unsigned int uNextFreeWindowID; // ebp@1
   //int *v8; // eax@1
   //GUIWindow *pWindow; // esi@4
@@ -1665,9 +1568,7 @@
                   pWindow->CreateButton(0x1E0u, v11 + 130, 0x8Cu, v11, 1, 0, UIMSG_SelectNPCDialogueOption, 0x4Cu, 0, pTmpBuf.data(), 0);
                 }
                 else
-                {
                   pWindow->CreateButton(0x1E0u, v11 + 130, 0x8Cu, v11, 1, 0, UIMSG_SelectNPCDialogueOption, 0x4Cu, 0, pGlobalTXT_LocalizationStrings[406], 0);//
-                }
                 num_menu_buttons = 2;
               }
             }
@@ -1675,7 +1576,8 @@
           }
           break;
             }
-        case WINDOW_ChangeLocation: {
+        case WINDOW_ChangeLocation:
+        {
           pMainScreenNum = pCurrentScreen;
           pCurrentScreen = SCREEN_CHANGE_LOCATION;
           pBtn_ExitCancel = pWindow->CreateButton(                  566,                   445,  75,  33, 1, 0, UIMSG_CHANGE_LOCATION_ClickCencelBtn, 0, 'N', pGlobalTXT_LocalizationStrings[156], pIcons_LOD->GetTexture(uTextureID_BUTTDESC2), 0);//   
@@ -1683,7 +1585,7 @@
                             pWindow->CreateButton(pNPCPortraits_x[0][0], pNPCPortraits_y[0][0],  63,  73, 1, 0, UIMSG_OnTravelByFoot, 1, ' ', pWindow->Hint, 0, 0, 0);
                             pWindow->CreateButton(                    8,                     8, 460, 344, 1, 0, UIMSG_OnTravelByFoot, 1,   0, pWindow->Hint, 0);
           break;
-            }
+        }
         case WINDOW_SpellBook: {//   
           InitializeBookTextures();
           pWindow->OpenSpellBook();
@@ -1700,11 +1602,11 @@
       return pWindow;
     }
 //LABEL_62:
-    pWindow->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 1u, '1', "", 0);
-    pWindow->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 2u, '2', "", 0);
-    pWindow->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 3u, '3', "", 0);
-    pWindow->CreateButton(0x197u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 4u, '4', "", 0);
-    pWindow->CreateButton(0, 0, 0, 0, 1, 0, UIMSG_CycleCharacters, 0, 9u, "", 0);
+    pWindow->CreateButton(61, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 1, '1', "", 0);
+    pWindow->CreateButton(177, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 2, '2', "", 0);
+    pWindow->CreateButton(292, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 3, '3', "", 0);
+    pWindow->CreateButton(407, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 4, '4', "", 0);
+    pWindow->CreateButton(0, 0, 0, 0, 1, 0, UIMSG_CycleCharacters, 0, 9, "", 0);
     return pWindow;
   }
   if (eWindowType == WINDOW_HouseInterior)
@@ -1927,9 +1829,7 @@
         if ( pParty->PartyTimes._shop_ban_times[window_SpeakInHouse->par1C] <=pParty->uTimePlayed )
         {
           if ( window_SpeakInHouse->par1C < 53 )
-          {
             pParty->PartyTimes._shop_ban_times[window_SpeakInHouse->par1C] = 0;
-          }
           continue;
         }
         pNumMessages = pMessageQueue_50CBD0->uNumMessages;
@@ -2212,9 +2112,7 @@
         continue;
       }
       default:
-      {
         continue;
-      }
     }
   }
   if ( GetCurrentMenuID() == -1 )
@@ -2255,9 +2153,6 @@
   Dst.DrawTitleText(pFontSmallnum, 0, 0xCu, ui_mainmenu_copyright_color, pGlobalTXT_LocalizationStrings[157], 3);
 }
 
-
-
-
 int modal_window_prev_screen;
 
 //----- (004141CA) --------------------------------------------------------
@@ -2299,10 +2194,9 @@
 
 //----- (00467FB6) --------------------------------------------------------
 void CreateScrollWindow()
-    {
+{
   unsigned int v0; // eax@1
   char *v1; // ST18_4@3
-  unsigned int v2; // eax@3
   GUIWindow a1; // [sp+Ch] [bp-54h]@1
 
   memcpy(&a1, pGUIWindow_ScrollWindow, sizeof(a1));
@@ -2311,8 +2205,7 @@
   a1.uFrameY = 1;
   a1.uFrameWidth = 468;
   v0 = pFontSmallnum->CalcTextHeight(pScrolls[pGUIWindow_ScrollWindow->par1C], &a1, 0, 0)
-     + 2 * LOBYTE(pFontCreate->uFontHeight)
-     + 24;
+     + 2 * LOBYTE(pFontCreate->uFontHeight) + 24;
   a1.uFrameHeight = v0;
   if ( (signed int)(v0 + a1.uFrameY) > 479 )
   {
@@ -2329,31 +2222,20 @@
   a1.uFrameZ = a1.uFrameWidth + a1.uFrameX - 1;
   a1.uFrameW = a1.uFrameHeight + a1.uFrameY - 1;
   v1 = pItemsTable->pItems[(unsigned int)pGUIWindow_ScrollWindow->ptr_1C + 700].pName;
-  v2 = Color16(0xFFu, 0xFFu, 0x9Bu);
-  sprintf(pTmpBuf.data(), format_4E2D80, v2, v1);
-  a1.DrawTitleText(pFontCreate, 0, 0, 0, pTmpBuf.data(), 3u);
-  a1.DrawText(
-           pFontSmallnum,
-           1,
-           LOBYTE(pFontCreate->uFontHeight) - 3,
-           0,
-           pScrolls[(unsigned int)pGUIWindow_ScrollWindow->ptr_1C],
-           0,
-           0,
-           0);
+  sprintf(pTmpBuf.data(), format_4E2D80, Color16(0xFFu, 0xFFu, 0x9Bu), v1);
+  a1.DrawTitleText(pFontCreate, 0, 0, 0, pTmpBuf.data(), 3);
+  a1.DrawText(pFontSmallnum, 1, LOBYTE(pFontCreate->uFontHeight) - 3, 0,
+              pScrolls[(unsigned int)pGUIWindow_ScrollWindow->ptr_1C], 0, 0, 0);
 }
 //----- (00467F48) --------------------------------------------------------
 void CreateMsgScrollWindow( signed int mscroll_id )
-    {
-  signed int v1; // esi@1
-
-  v1 = mscroll_id;
+{
   if ( !pGUIWindow_ScrollWindow && mscroll_id >= 700 )
   {
     if ( mscroll_id <= 782 )
     {
       uTextureID_720980 = pIcons_LOD->LoadTexture("leather", TEXTURE_16BIT_PALETTE);
-      pGUIWindow_ScrollWindow = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Scroll, v1 - 700, 0);
+      pGUIWindow_ScrollWindow = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Scroll, mscroll_id - 700, 0);
     }
   }
 }
--- a/Game.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/Game.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -72,14 +72,11 @@
 //----- (0044103C) --------------------------------------------------------
 void Game::Draw()
 {
-  //float v2; // ST24_4@11
-  //double v3; // ST28_8@11
   int v4; // edi@26
-  //int v5; // eax@35
 
   uFlags2 &= ~0x02;
   if ( pParty->_497FC5_check_party_perception_against_level() )
-    uFlags2 |= 2u;
+    uFlags2 |= 2;
 
   pGame->pIndoorCameraD3D->sRotationX = pParty->sRotationX;
   pGame->pIndoorCameraD3D->sRotationY = pParty->sRotationY;
@@ -2987,7 +2984,7 @@
           {
             if ( !*((int *)&pSavegameThumbnails[10 * uMessageParam].pPixels ) )
               continue;
-            v173 = pMapStats->pInfos[sub_410D99_get_map_index(pPlayer->pInstalledBeacons[uMessageParam].SaveFileID)].pName;
+            v173 = pMapStats->pInfos[pMapStats->sub_410D99_get_map_index(pPlayer->pInstalledBeacons[uMessageParam].SaveFileID)].pName;
             sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[474], v173);// "Recall to %s"
             GameUI_SetFooterString(pTmpBuf.data());
             continue;
@@ -3002,7 +2999,7 @@
             GameUI_SetFooterString(pTmpBuf.data());
             continue;
           }
-          v174 = pMapStats->pInfos[sub_410D99_get_map_index(*(short *)(uNumSeconds + 26))].pName;
+          v174 = pMapStats->pInfos[pMapStats->sub_410D99_get_map_index(*(short *)(uNumSeconds + 26))].pName;
           sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[475], (unsigned int)pMapName, v174);// "Set %s over %s"
           GameUI_SetFooterString(pTmpBuf.data());
           continue;
--- a/GammaControl.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/GammaControl.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -23,30 +23,25 @@
   double v2; // st7@1
   unsigned __int16 *v3; // ecx@1
   double v4; // st6@2
-  double result; // st7@7
   signed int v6; // [sp+0h] [bp-8h]@1
   signed int v7; // [sp+4h] [bp-4h]@1
 
-  v7 = 0;
   v2 = 0.0;
   v6 = 256;
   v3 = a1->green;
-  do
+  for ( v7 = 0; v7 < 256; ++v7 )
   {
     v4 = ((double)*(v3 - 256) + (double)v3[256] + (double)*v3) * 0.000015259022 * 0.33333334;
     if ( v4 == 0.0 )
       --v6;
     else
       v2 = v2 + (double)v7 * 0.0039215689 / v4;
-    ++v7;
     ++v3;
   }
-  while ( v7 < 256 );
   if ( v6 )
-    result = v2 / (double)v6;
+    return v2 / (double)v6;
   else
-    result = 1.0;
-  return result;
+    return 1.0;
 }
 
 //----- (0044F408) --------------------------------------------------------
@@ -66,42 +61,33 @@
   signed __int64 v4; // qax@3
   signed int v6; // [sp+Ch] [bp-4h]@1
 
-  v6 = 0;
   v2 = pRamp->green;
-  do
+  for ( v6 = 0; v6 < 256; ++v6 )
   {
     v3 = (double)v6 * 0.0039215689 * this->fGamma;
     if ( v3 >= 1.0 || (v4 = (signed __int64)(v3 * 65535.0), (signed int)v4 > 65535) )
-	{
-		LODWORD(v4) = 65535;	
-	}
+      LODWORD(v4) = 65535;
     else if ( (signed int)v4 < 0 )
-    {
       LODWORD(v4) = 0;
-    }
 	else
 	{
     if ( (signed int)v4 > 65535 )
       LODWORD(v4) = 65535;
 	}
-    ++v6;
     v2[256] = v4;
     *v2 = v4;
     *(v2 - 256) = v4;
     ++v2;
   }
-  while ( v6 < 256 );
   return v4;
 }
 
 //----- (0044F4D9) --------------------------------------------------------
 void GammaController::Initialize(float gamma)
 {
-  GammaController *v2; // esi@1
   double v3; // st7@3
   double v4; // st6@4
 
-  v2 = this;
   //if (pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT ||
       //pVersion->pVersionInfo.dwMajorVersion != 4)
   {
@@ -117,19 +103,13 @@
         v3 = gamma;
     }
     else
-    {
       v3 = 0.1;
-    }
-    v2->fGamma = v3;
-    InitGammaRamp(&v2->field_60C);
-    SetGammaRamp(&v2->field_60C);
+    this->fGamma = v3;
+    InitGammaRamp(&this->field_60C);
+    SetGammaRamp(&this->field_60C);
   }
 }
 
-
-
-
-
 //----- (0044F215) --------------------------------------------------------
 GammaController::GammaController()
 {
@@ -139,29 +119,20 @@
   fGamma = flt_4D8670_default_gamma;
 }
 
-
-
 //----- (0044F24B) --------------------------------------------------------
 void GammaController::InitializeFromSurface(IDirectDrawSurface4 *a2)
 {
-  GammaController *v2; // esi@1
-  IDirectDrawGammaControl **v3; // edi@1
-  IDirectDrawGammaControl *v4; // eax@1
-
-  v2 = this;
-  v3 = &this->pGammaControl;
   this->pSurface = a2;
-  v4 = this->pGammaControl;
-  if ( v4 )
+  if ( this->pGammaControl )
   {
-    v4->Release();
-    *v3 = 0;
+    this->pGammaControl->Release();
+    this->pGammaControl = 0;
   }
   if ( pRenderer->IsGammaSupported() )
   {
-    ErrD3D(a2->QueryInterface(IID_IDirectDrawGammaControl, (LPVOID *)v3));
+    ErrD3D(a2->QueryInterface(IID_IDirectDrawGammaControl, (LPVOID *)&this->pGammaControl));
     GetRamp();
-    memcpy(&v2->field_60C, &v2->pDefaultRamp, 0x600u);
-    fGamma = _44F377(&v2->field_60C);
+    memcpy(&this->field_60C, &this->pDefaultRamp, 0x600u);
+    fGamma = _44F377(&this->field_60C);
   }
 }
\ No newline at end of file
--- a/IconFrameTable.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/IconFrameTable.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -7,83 +7,44 @@
 //----- (00494F3A) --------------------------------------------------------
 unsigned int IconFrameTable::FindIcon(const char *pIconName)
 {
-  IconFrameTable *v2; // esi@1
-  int v3; // ebx@1
-  unsigned int uID; // edi@1
-  unsigned int result; // eax@4
-
-  v2 = this;
-  v3 = 0;
-  uID = 0;
-  if ( (signed int)this->uNumIcons <= 0 )
+  for ( uint i = 0; i < (signed int)this->uNumIcons; i++ )
   {
-LABEL_4:
-    result = 0;
+    if ( !_stricmp(pIconName, this->pIcons[i].pAnimationName) )
+      return i;
   }
-  else
-  {
-    while ( _stricmp(pIconName, v2->pIcons[v3].pAnimationName) )
-    {
-      ++uID;
-      ++v3;
-      if ( (signed int)uID >= (signed int)v2->uNumIcons )
-        goto LABEL_4;
-    }
-    result = uID;
-  }
-  return result;
+  return 0;
 }
 
 //----- (00494F70) --------------------------------------------------------
 IconFrame *IconFrameTable::GetFrame(unsigned int uIconID, unsigned int uFrameID)
 {
-  //IconFrame *v3; // edi@1
-  IconFrame *v4; // ecx@1
-  //__int16 v5; // dx@2
   int v6; // edx@3
-  //unsigned int v7; // eax@3
-  char *i; // ecx@3
-  int v9; // esi@5
-  IconFrame *result; // eax@6
+  uint i;
 
-  v4 = &this->pIcons[uIconID];
-  if ( v4->uFlags & 1 && v4->uAnimLength != 0 )
+  if ( this->pIcons[uIconID].uFlags & 1 && this->pIcons[uIconID].uAnimLength != 0 )
   {
-    v6 = ((signed int)uFrameID >> 3) % (unsigned __int16)v4->uAnimLength;
-    for ( i = (char *)&v4->uAnimTime; ; i += 32 )
-    {
-      v9 = *(short *)i;
-      if ( v6 <= v9 )
-        break;
-      v6 -= v9;
-      ++uIconID;
-    }
-    result = &this->pIcons[uIconID];
+    v6 = ((signed int)uFrameID >> 3) % (unsigned __int16)this->pIcons[uIconID].uAnimLength;
+    for ( i = uIconID; v6 > this->pIcons[i].uAnimTime; i++ )
+      v6 -= this->pIcons[i].uAnimTime;
+    return &this->pIcons[i];
   }
   else
-  {
-    result = &this->pIcons[uIconID];
-  }
-  return result;
+    return &this->pIcons[uIconID];
 }
 
 //----- (00494FBF) --------------------------------------------------------
 void IconFrameTable::InitializeAnimation(unsigned int uIconID)
 {
-  IconFrameTable *v2; // esi@1
   unsigned int v3; // edi@3
   const char *i; // eax@3
-  IconFrame *v5; // eax@5
 
-  v2 = this;
   if ( (signed int)uIconID <= (signed int)this->uNumIcons && (uIconID & 0x80000000u) == 0 )
   {
     v3 = uIconID;
-    for ( i = this->pIcons[uIconID].pTextureName; ; i = v5[v3].pTextureName )
+    for ( i = this->pIcons[uIconID].pTextureName; ; i = this->pIcons[v3].pTextureName )
     {
-      v2->pIcons[v3].uTextureID = pIcons_LOD->LoadTexture(i, TEXTURE_16BIT_PALETTE);
-      v5 = v2->pIcons;
-      if ( !(v5[v3].uFlags & 1) )
+      this->pIcons[v3].uTextureID = pIcons_LOD->LoadTexture(i, TEXTURE_16BIT_PALETTE);
+      if ( !(this->pIcons[v3].uFlags & 1) )
         break;
       ++v3;
     }
@@ -93,20 +54,20 @@
 //----- (0049500A) --------------------------------------------------------
 void IconFrameTable::ToFile()
 {
-  IconFrameTable *v1; // esi@1
+  //IconFrameTable *v1; // esi@1
   FILE *v2; // eax@1
-  FILE *v3; // edi@1
+  //FILE *v3; // edi@1
 
-  IconFrameTable* Str = this;
+  //IconFrameTable* Str = this;
 
-  v1 = Str;
+  //v1 = Str;
   v2 = fopen("data\\dift.bin", "wb");
-  v3 = v2;
+  //v3 = v2;
   if ( !v2 )
     Error("Unable to save dift.bin!");
-  fwrite(v1, 4u, 1u, v2);
-  fwrite(v1->pIcons, 0x20u, v1->uNumIcons, v3);
-  fclose(v3);
+  fwrite(this, 4, 1, v2);
+  fwrite(this->pIcons, 0x20u, this->uNumIcons, v2);
+  fclose(v2);
 }
 
 //----- (00495056) --------------------------------------------------------
@@ -129,7 +90,7 @@
 //----- (0049509D) --------------------------------------------------------
 int IconFrameTable::FromFileTxt(const char *Args)
 {
-  IconFrameTable *v2; // ebx@1
+  //IconFrameTable *v2; // ebx@1
   FILE *v3; // eax@1
   int v4; // esi@3
   void *v5; // eax@10
@@ -153,8 +114,9 @@
   FILE *File; // [sp+300h] [bp-4h]@1
   int Argsa; // [sp+30Ch] [bp+8h]@26
 
-  v2 = this;
+  //v2 = this;
   //TileTable::dtor((TileTable *)this);
+  __debugbreak();//Ritor1: this function not used
   v3 = fopen(Args, "r");
   File = v3;
   if ( !v3 )
@@ -179,13 +141,13 @@
     while ( fgets(&Buf, 490, File) );
     v4 = v21;
   }
-  v2->uNumIcons = v4;
+  this->uNumIcons = v4;
   v5 = malloc(32 * v4);//, "I Frames");
-  v2->pIcons = (IconFrame *)v5;
+  this->pIcons = (IconFrame *)v5;
   if ( v5 )
   {
     v6 = File;
-    v2->uNumIcons = 0;
+    this->uNumIcons = 0;
     fseek(v6, 0, 0);
     for ( i = fgets(&Buf, 490, File); i; i = fgets(&Buf, 490, File) )
     {
@@ -193,38 +155,38 @@
       memcpy(&v20, frame_table_txt_parser(&Buf, &v19), sizeof(v20));
       if ( v20.uPropCount && *v20.pProperties[0] != 47 )
       {
-        strcpy(v2->pIcons[v2->uNumIcons].pAnimationName, v20.pProperties[0]);
-        strcpy(v2->pIcons[v2->uNumIcons].pTextureName, v20.pProperties[1]);
+        strcpy(this->pIcons[this->uNumIcons].pAnimationName, v20.pProperties[0]);
+        strcpy(this->pIcons[this->uNumIcons].pTextureName, v20.pProperties[1]);
         v8 = v20.pProperties[2];
-        v2->pIcons[v2->uNumIcons].uFlags = 0;
+        this->pIcons[this->uNumIcons].uFlags = 0;
         if ( !_stricmp(v8, "new") )
         {
-          v9 = (int)&v2->pIcons[v2->uNumIcons].uFlags;
+          v9 = (int)&this->pIcons[this->uNumIcons].uFlags;
           *(char *)v9 |= 4u;
         }
-        v2->pIcons[v2->uNumIcons].uAnimTime = atoi(v20.pProperties[3]);
-        v2->pIcons[v2->uNumIcons].uAnimLength = 0;
-        v2->pIcons[v2->uNumIcons++].uTextureID = 0;
+        this->pIcons[this->uNumIcons].uAnimTime = atoi(v20.pProperties[3]);
+        this->pIcons[this->uNumIcons].uAnimLength = 0;
+        this->pIcons[this->uNumIcons++].uTextureID = 0;
       }
     }
     fclose(File);
     v10 = 0;
-    if ( (signed int)(v2->uNumIcons - 1) > 0 )
+    if ( (signed int)(this->uNumIcons - 1) > 0 )
     {
       v11 = 0;
       do
       {
-        v12 = (int)&v2->pIcons[v11];
+        v12 = (int)&this->pIcons[v11];
         if ( !(*(char *)(v12 + 60) & 4) )
           *(char *)(v12 + 28) |= 1u;
         ++v10;
         ++v11;
       }
-      while ( v10 < (signed int)(v2->uNumIcons - 1) );
+      while ( v10 < (signed int)(this->uNumIcons - 1) );
     }
-    for ( j = 0; j < (signed int)v2->uNumIcons; *(short *)(Argsa + 26) = v15 )
+    for ( j = 0; j < (signed int)this->uNumIcons; *(short *)(Argsa + 26) = v15 )
     {
-      v14 = v2->pIcons;
+      v14 = this->pIcons;
       Argsa = (int)&v14[j];
       v15 = *(short *)(Argsa + 24);
       if ( *(char *)(Argsa + 28) & 1 )
--- a/Indoor.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/Indoor.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -93,18 +93,9 @@
 //----- (0043F39E) --------------------------------------------------------
 void __fastcall PrepareDrawLists_BLV()
 {
-  //int *v1; // ecx@1
-  //double v2; // ST30_8@3
-  //double v3; // ST30_8@6
-  //double v4; // ST28_8@6
   int v5; // eax@4
-  //int v6; // eax@7
   unsigned int v7; // ebx@8
   BLVSector *v8; // esi@8
-  //unsigned __int16 *v9; // edi@8
-  //int i; // [sp+18h] [bp-8h]@7
-  //unsigned __int8 v11; // [sp+1Ch] [bp-4h]@3
-  //signed int v12; // [sp+1Ch] [bp-4h]@8
 
   pBLVRenderParams->Reset();
   pMobileLightsStack->uNumLightsActive = 0;
@@ -137,46 +128,25 @@
   PrepareItemsRenderList_BLV();
   PrepareActorRenderList_BLV();
 
-  //v6 = 0;
   for (uint i = 0; i < pBspRenderer->uNumVisibleNotEmptySectors; ++i)
   {
     v7 = pBspRenderer->pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[i];
-    //v12 = 0;
     v8 = &pIndoor->pSectors[pBspRenderer->pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[i]];
-    //v9 = v8->pDecorationIDs;
 
     for (uint j = 0; j < v8->uNumDecorations; ++j)
-    //if ( v8->uNumDecorations > 0 )
-    {
-    //  do
       PrepareDecorationsRenderList_BLV(v8->pDecorationIDs[j], v7);
-    //  while ( v12 < v8->uNumDecorations );
-    }
-    //v6 = i + 1;
   }
   FindBillboardsLightLevels_BLV();
   pGame->PrepareBloodsplats();
 }
 
-
-
 //----- (004407D9) --------------------------------------------------------
 void BLVRenderParams::Reset()
 {
-  //IndoorLocation_drawstru *v2; // ebx@1
-  //int v4; // ST08_4@1
-  //int v5; // ST04_4@1
-  //int v6; // ST00_4@1
   int v7; // eax@1
   int v8; // ST08_4@2
   int v9; // ST04_4@2
   int v10; // ST00_4@2
-  //unsigned int v11; // edi@4
-  //unsigned int v12; // ecx@4
-  //int v13; // edx@4
-  //signed int v14; // ecx@4
-  //unsigned int v15; // edx@4
-  //unsigned int v16; // eax@4
   double v17; // st7@5
   int v18; // eax@5
   double v19; // st7@5
@@ -188,7 +158,6 @@
   int v25; // eax@5
   int v26; // eax@5
   signed int v27; // eax@6
-  //int result; // eax@6
   int v29; // [sp+24h] [bp+8h]@5
 
   this->field_0_timer_ = pEventTimer->uTotalGameTimeElapsed;
@@ -295,21 +264,17 @@
 //----- (00440B44) --------------------------------------------------------
 void IndoorLocation::ExecDraw(bool bD3D)
 {
-  int v2; // eax@3
-  //IndoorCameraD3D_Vec4 *v3; // edx@4
-  //unsigned int v5; // ecx@9
-  //RenderVertexSoft *v6; // [sp-4h] [bp-8h]@4
-
   if (bD3D)
   {
     pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z);
     for (uint i = 0; i < pBspRenderer->num_faces; ++i)
     {
-      //v2 = pBspRenderer->faces[i].uNodeID;
       if (pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].viewing_portal_id == -1)
         IndoorLocation::ExecDraw_d3d(pBspRenderer->faces[i].uFaceID, nullptr, 4, nullptr);
       else
-        IndoorLocation::ExecDraw_d3d(pBspRenderer->faces[i].uFaceID, pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].std__vector_0007AC, 4, pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].pPortalBounding);
+        IndoorLocation::ExecDraw_d3d(pBspRenderer->faces[i].uFaceID,
+                pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].std__vector_0007AC, 4,
+                pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].pPortalBounding);
     }
   }
   else for (uint j = 0; j < pBspRenderer->num_faces; ++j )
@@ -373,9 +338,6 @@
 }
 */
 
-
-
-
 //----- (00441BD4) --------------------------------------------------------
 void IndoorLocation::Draw()
 {
@@ -870,9 +832,7 @@
     return true;
   }
   else
-  {
     return false;
-  }
 }
 
 //----- (00444810) --------------------------------------------------------
@@ -895,8 +855,8 @@
     if ( bToggle )
       pIndoor->pLights[sLightID].uAtributes &= 0xFFFFFFF7u;
     else
-      pIndoor->pLights[sLightID].uAtributes |= 8u;
-    pParty->uFlags |= 2u;
+      pIndoor->pLights[sLightID].uAtributes |= 8;
+    pParty->uFlags |= 2;
   }
 }
 
@@ -1958,7 +1918,7 @@
     //v201 = pFilename;
     *(int *)pDest = 1;
     File = pGames_LOD->FindContainer(pFilename, 0);
-    fread(&header, 0x10u, 1u, File);
+    fread(&header, 0x10u, 1, File);
     uint v155 = header.uCompressedSize;
     uint Count = header.uDecompressedSize;
     BLVFace* Src = (BLVFace *)malloc(header.uDecompressedSize);
@@ -1966,9 +1926,7 @@
     if ( v155 <= Count )
     {
       if ( v155 == Count )
-      {
         fread(Src, 1, Count, File);
-      }
       else
       {
         void* _uSourceLen = malloc(v155);
@@ -1978,9 +1936,7 @@
       }
     }
     else
-    {
-    MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:1195", 0);
-    }
+      MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:1195", 0);
     pData = ((char *)Src + 40);
     //v154 = 875;
     goto LABEL_140;
@@ -2375,7 +2331,6 @@
   v4 = v43[0];
   if ( v55 == 1 )
     return this->pFaces[v4].uSectorID;
-  v37 = 0;
   if ( !v55 )
     return 0;
   pSectorID = 0;
@@ -2383,38 +2338,25 @@
   if ( v55 > 0 )
   {
     v39 = sY;
-    while ( 1 )
+    for ( v37 = 0; v37 < v55; ++v37 )
     {
-      pFace = &this->pFaces[v43[v37]];
-      //pPolygonType = pFace->uPolygonType;
-      if ( pFace->uPolygonType == POLYGON_Floor )
+      if ( this->pFaces[v43[v37]].uPolygonType == POLYGON_Floor )
+        v39 = sZ - this->pVertices[*this->pFaces[v43[v37]].pVertexIDs].z;
+      if ( this->pFaces[v43[v37]].uPolygonType == POLYGON_InBetweenFloorAndWall )
       {
-        v42 = this->pVertices[*pFace->pVertexIDs].z;
-        v39 = sZ - v42;
-        //goto LABEL_47;
+        v39 = sZ - ((fixpoint_mul(this->pFaces[v43[v37]].zCalc1, (sX << 16))
+                   + fixpoint_mul(this->pFaces[v43[v37]].zCalc2, (sY << 16))
+                   + this->pFaces[v43[v37]].zCalc3
+                   + 0x8000) >> 16);
       }
-      if ( pFace->uPolygonType == POLYGON_InBetweenFloorAndWall )
-      {
-        //v51 = pFace->zCalc1;
-        v57 = fixpoint_mul(pFace->zCalc1, (sX << 16));
-        //v56 = sY << 16;
-        //v51 = pFace->zCalc2;
-        v56 = fixpoint_mul(pFace->zCalc2, (sY << 16));
-        v42 = (v56 + pFace->zCalc3 + v57 + 32768) >> 16;
-        v39 = sZ - v42;
-      }
-//LABEL_47:
       if ( v39 >= 0 )
       {
         if ( v39 < v53 )
         {
-          pSectorID = pFace->uSectorID;
+          pSectorID = this->pFaces[v43[v37]].uSectorID;
           v53 = v39;
         }
       }
-      ++v37;
-      if ( v37 >= v55 )
-        return pSectorID;
     }
   }
   return pSectorID;
@@ -2498,7 +2440,7 @@
 
 //----- (0044C23B) --------------------------------------------------------
 bool BLVFaceExtra::HasEventint()
-	{
+{
    signed int event_index; // eax@1
   _evt_raw* start_evt;
   _evt_raw* end_evt;
@@ -2548,8 +2490,6 @@
   unsigned __int16 v50; // ax@48
   unsigned int v51; // eax@51
   unsigned __int16 v52; // ax@54
-  int v53; // ecx@57
-  unsigned __int64 v55; // qax@57
   int v56; // ecx@58
   int v57; // eax@58
   Vec3_int_ v67;
@@ -2650,7 +2590,11 @@
         v84 = (unsigned __int64)(door->vDirection.z * (signed __int64)v67.z) >> 16;
         v31 = (v85 + v83 + v84) * (signed __int64)v29;
         v32 = v31 >> 16;
-        goto LABEL_58;
+        v57 = -v32;
+        v28->sTextureDeltaV = v57;
+        v28->sTextureDeltaU += door->pDeltaUs[v88];
+        v28->sTextureDeltaV = v57 + door->pDeltaVs[v88];
+        continue;
       }*/
       v28->sTextureDeltaU = 0;
       v28->sTextureDeltaV = 0;
@@ -2696,7 +2640,7 @@
         v28->sTextureDeltaV -= v40;
       else
       {
-        if ( face->uAttributes & 0x20000 )
+        if ( face->uAttributes & FACE_UNKNOW7 )
         {
           if ( face->uBitmapID != -1 )
             v28->sTextureDeltaV -= v82 + pBitmaps_LOD->GetTexture(face->uBitmapID)->uTextureHeight;
@@ -2708,16 +2652,13 @@
         v82 = fixpoint_mul(door->vDirection.y, v70.y);
         v83 = fixpoint_mul(door->vDirection.z, v70.z);
         v75 = v84 + v82 + v83;
-        v53 = v89;
         v82 = fixpoint_mul(v75, v89);
         v28->sTextureDeltaU = -v82;
         v84 = fixpoint_mul(door->vDirection.x, v67.x);
         v82 = fixpoint_mul(door->vDirection.y, v67.y);
         v83 = fixpoint_mul(door->vDirection.z, v67.z);
         v75 = v84 + v82 + v83;
-        v55 = v75 * (signed __int64)v53;
-        v32 = v55 >> 16;
-LABEL_58:
+        v32 = fixpoint_mul(v75, v89);
         v57 = -v32;
         v28->sTextureDeltaV = v57;
         v28->sTextureDeltaU += door->pDeltaUs[v88];
--- a/Items.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/Items.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -1,5 +1,6 @@
 #define _CRT_SECURE_NO_WARNINGS
 #include <stdlib.h>
+#include <string>
 
 #include "Items.h"
 #include "MapInfo.h"
@@ -14,6 +15,22 @@
 #include "texts.h"
 #include "mm7_data.h"
 
+struct ci_less : std::binary_function<std::string, std::string, bool>
+{
+  // case-independent (ci) compare_less binary function
+  struct nocase_compare : public std::binary_function<unsigned char,unsigned char,bool> 
+  {
+    bool operator() (const unsigned char& c1, const unsigned char& c2) const {
+      return tolower (c1) < tolower (c2); 
+    }
+  };
+  bool operator() (const std::string & s1, const std::string & s2) const {
+    return std::lexicographical_compare 
+      (s1.begin (), s1.end (),   // source range
+      s2.begin (), s2.end (),   // dest range
+      nocase_compare ());  // comparison
+  }
+};
 
 
 struct ITEM_VARIATION
@@ -309,15 +326,55 @@
 
 //----- (00456D84) --------------------------------------------------------
 void ItemsTable::Initialize()
-	{
+{
+  std::map<std::string, ITEM_EQUIP_TYPE, ci_less> equipStatMap;
+  equipStatMap["weapon"] = EQUIP_SINGLE_HANDED;
+  equipStatMap["weapon2"] = EQUIP_TWO_HANDED;
+  equipStatMap["weapon1or2"] = EQUIP_SINGLE_HANDED;
+  equipStatMap["missile"] = EQUIP_BOW;
+  equipStatMap["bow"] = EQUIP_BOW;
+  equipStatMap["armor"] = EQUIP_ARMOUR;
+  equipStatMap["shield"] = EQUIP_SHIELD;
+  equipStatMap["helm"] = EQUIP_HELMET;
+  equipStatMap["belt"] = EQUIP_BELT;
+  equipStatMap["cloak"] = EQUIP_CLOAK;
+  equipStatMap["gauntlets"] = EQUIP_GAUNTLETS;
+  equipStatMap["boots"] = EQUIP_BOOTS;
+  equipStatMap["ring"] = EQUIP_RING;
+  equipStatMap["amulet"] = EQUIP_AMULET;
+  equipStatMap["weaponw"] = EQUIP_WAND;
+  equipStatMap["herb"] = EQUIP_REAGENT;
+  equipStatMap["reagent"] = EQUIP_REAGENT;
+  equipStatMap["bottle"] = EQUIP_POTION;
+  equipStatMap["sscroll"] = EQUIP_SPELL_SCROLL;
+  equipStatMap["book"] = EQUIP_BOOK;
+  equipStatMap["mscroll"] = EQUIP_MESSAGE_SCROLL;
+  equipStatMap["gold"] = EQUIP_GOLD;
+  equipStatMap["gem"] = EQUIP_GEM;
+
+  std::map<std::string, PLAYER_SKILL_TYPE, ci_less> equipSkillMap;
+  equipSkillMap["staff"] = PLAYER_SKILL_STAFF;
+  equipSkillMap["sword"] = PLAYER_SKILL_SWORD;
+  equipSkillMap["dagger"] = PLAYER_SKILL_DAGGER;
+  equipSkillMap["axe"] = PLAYER_SKILL_AXE;
+  equipSkillMap["spear"] = PLAYER_SKILL_SPEAR;
+  equipSkillMap["bow"] = PLAYER_SKILL_BOW;
+  equipSkillMap["mace"] = PLAYER_SKILL_MACE;
+  equipSkillMap["blaster"] = PLAYER_SKILL_BLASTER;
+  equipSkillMap["shield"] = PLAYER_SKILL_SHIELD;
+  equipSkillMap["leather"] = PLAYER_SKILL_LEATHER;
+  equipSkillMap["chain"] = PLAYER_SKILL_CHAIN;
+  equipSkillMap["plate"] = PLAYER_SKILL_PLATE;
+  equipSkillMap["club"] = PLAYER_SKILL_CLUB;
+  
+  std::map<std::string, ITEM_MATERIAL, ci_less> materialMap;
+  materialMap["artifact"] = MATERIAL_ARTEFACT;
+  materialMap["relic"] = MATERIAL_RELIC;
+  materialMap["special"] = MATERIAL_SPECIAL;
+
 	int i,j;
-	char* test_string;
-	unsigned char c;
-	bool break_loop;
-	unsigned int temp_str_len;
-	char* tmp_pos;
-	int decode_step;
-	int item_counter;
+  char* test_string;
+  int item_counter;
 
 	pMapStats = new MapStats;
 	pMapStats->Initialize();
@@ -348,44 +405,14 @@
 	for (i=0;i<24;++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 0: 
-					pEnchantments[i].pBonusStat=RemoveQuotes(test_string);
-					break;
-				case 1:
-					pEnchantments[i].pOfName= RemoveQuotes(test_string);
-					break;
-				default:
-					pEnchantments[i].to_item[decode_step-2]=atoi(test_string);
-					}
-				}
-			else
-				{ 
-				if (decode_step)
-					break_loop = true;
-				}
-			++decode_step;
-			test_string=tmp_pos+1;
-			} while ((decode_step<11)&&!break_loop);
-		}
+    auto tokens = Tokenize(test_string, '\t');
+    pEnchantments[i].pBonusStat=RemoveQuotes(tokens[0]);
+    pEnchantments[i].pOfName=RemoveQuotes(tokens[1]);
+    for (int j = 0; j < 9; j++)
+    {
+      pEnchantments[i].to_item[j]=atoi(tokens[j+2]);
+    }
+	}
 
 	memset(&pEnchantmentsSumm, 0, 36);
 	for(i=0;i<9;++i)
@@ -401,31 +428,13 @@
 	strtok(NULL, "\r");
 	strtok(NULL, "\r");
 	for(i=0;i<6;++i) //counted from 1
-		{
-		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  (decode_step==2)
-				bonus_ranges[i].minR = atoi(test_string);
-			else if (decode_step==3)
-				bonus_ranges[i].maxR =atoi(test_string);
-			++decode_step;
-			test_string=tmp_pos+1;
-			} while ((decode_step<4)&&!break_loop);
-		}
+  {
+    test_string = strtok(NULL, "\r") + 1;
+    auto tokens = Tokenize(test_string, '\t');
+    Assert(tokens.size() == 4, "Invalid number of tokens");
+    bonus_ranges[i].minR = atoi(tokens[2]);
+    bonus_ranges[i].maxR =atoi(tokens[3]);
+	}
 
 
 	pSpcItemsTXT_Raw = 0;
@@ -435,67 +444,34 @@
 	strtok(NULL, "\r");
 	strtok(NULL, "\r");
 	for (i=0;i<72;++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 0: 
-					pSpecialEnchantments[i].pBonusStatement=RemoveQuotes(test_string);
-					break;
-				case 1:
-					pSpecialEnchantments[i].pNameAdd= RemoveQuotes(test_string);
-					break;
-				case 14:
-					int res;
-					res=atoi(test_string);
-					if(!res)
-						{
-						++test_string; 
-						while (*test_string==' ')//fix X 2 case
-							++test_string; 
-						res=atoi(test_string);
-						}				
-					pSpecialEnchantments[i].iValue=res;
-					break;
-				case 15:
-					pSpecialEnchantments[i].iTreasureLevel=  tolower(*test_string) - 97;;
-					break;
-				default:
-					pSpecialEnchantments[i].to_item_apply[decode_step-2]=atoi(test_string);
-					}
-				}
-			else
-				{ 
-				if (decode_step)
-					break_loop = true;
-				}
-			++decode_step;
-			test_string=tmp_pos+1;
-			} while ((decode_step<16)&&!break_loop);
-		}
+	{
+    test_string = strtok(NULL, "\r") + 1;
+    auto tokens = Tokenize(test_string, '\t');
+    Assert(tokens.size() >= 17, "Invalid number of tokens");
+    pSpecialEnchantments[i].pBonusStatement=RemoveQuotes(tokens[0]);
+    pSpecialEnchantments[i].pNameAdd= RemoveQuotes(tokens[1]);
+    for (int j = 0; j < 12; j++)
+    {
+      pSpecialEnchantments[i].to_item_apply[j]=atoi(tokens[j+2]);
+    }
+    int res;
+    res=atoi(tokens[14]);
+    if(!res)
+    {
+      ++tokens[14]; 
+      while (*tokens[14]==' ')//fix X 2 case
+        ++tokens[14]; 
+      res=atoi(tokens[14]);
+    }				
+    pSpecialEnchantments[i].iValue=res;
+    pSpecialEnchantments[i].iTreasureLevel=  tolower(tokens[15][0]) - 97;
+	}
 
 	pSpecialEnchantments_count = 71;
 	memset(&pSpecialEnchantmentsSumm, 0, 96);
 	for(i=0;i<12;++i)
 		{
-		for (j=0;j<=pSpecialEnchantments_count;++j)
+		for (unsigned int j=0;j<=pSpecialEnchantments_count;++j)
 			pSpecialEnchantmentsSumm[i]+=pSpecialEnchantments[j].to_item_apply[i];
 		}
 
@@ -507,346 +483,81 @@
 	strtok(NULL, "\r");
 	uAllItemsCount = 0;
 	item_counter = 0;
-	while (true)
+	while (item_counter < 800)
 		{
 		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 0: //Item #
-					item_counter=atoi(test_string);
-					uAllItemsCount=item_counter;
-					break;
-				case 1: //Pic File
-					pItems[item_counter].pIconName = RemoveQuotes(test_string);
-					break;
-				case 2: //Name
-					pItems[item_counter].pName = RemoveQuotes(test_string);
-					break;
-				case 3: //Value
-					pItems[item_counter].uValue=atoi(test_string);
-					break;
-				case 4: //Equip Stat
-					{
-					if ( !_stricmp(test_string, "weapon") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_SINGLE_HANDED;
-						break;
-						}
-					if ( !_stricmp(test_string, "weapon2") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_TWO_HANDED;
-						break;
-						}
-					if ( !_stricmp(test_string, "weapon1or2") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_SINGLE_HANDED;
-						break;
-						}
-					if ( !(_stricmp(test_string, "missile")&&_stricmp(test_string, "bow")))
-						{
-						pItems[item_counter].uEquipType = EQUIP_BOW;
-						break;
-						}
-					if ( !_stricmp(test_string, "armor") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_ARMOUR;
-						break;
-						}
-					if ( !_stricmp(test_string, "shield") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_SHIELD;
-						break;
-						}
-					if ( !_stricmp(test_string, "helm") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_HELMET;
-						break;
-						}
-					if ( !_stricmp(test_string, "belt") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_BELT;
-						break;
-						}
-					if ( !_stricmp(test_string, "cloak") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_CLOAK;
-						break;
-						}
-					if ( !_stricmp(test_string, "gauntlets") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_GAUNTLETS;
-						break;
-						}
-					if ( !_stricmp(test_string, "boots") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_BOOTS;
-						break;
-						}
-					if ( !_stricmp(test_string, "ring") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_RING;
-						break;
-						}
-					if ( !_stricmp(test_string, "amulet") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_AMULET;
-						break;
-						}
-					if ( !_stricmp(test_string, "weaponw") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_WAND;
-						break;
-						}
-					if ( !(_stricmp(test_string, "herb")&&_stricmp(test_string, "reagent")))
-						{
-						pItems[item_counter].uEquipType = EQUIP_REAGENT;
-						break;
-						}
-					if ( !_stricmp(test_string, "bottle") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_POTION;
-						break;
-						}
-					if ( !_stricmp(test_string, "sscroll") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_SPELL_SCROLL;
-						break;
-						}
-					if ( !_stricmp(test_string, "book") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_BOOK;
-						break;
-						}
-					if ( !_stricmp(test_string, "mscroll") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_MESSAGE_SCROLL;
-						break;
-						}
-					if ( !_stricmp(test_string, "gold") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_GOLD;
-						break;
-						}
-					if ( !_stricmp(test_string, "gem") )
-						{
-						pItems[item_counter].uEquipType = EQUIP_GEM;
-						break;
-						}
-					pItems[item_counter].uEquipType = EQUIP_NONE;
-					break;
-					}
-				case 5: //Skill Group
-					{
-					if ( !_stricmp(test_string, "staff") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_STAFF;
-						break;
-						}
-					if ( !_stricmp(test_string, "sword") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_SWORD;
-						break;
-						}
-					if ( !_stricmp(test_string, "dagger") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_DAGGER;
-						break;
-						}
-					if ( !_stricmp(test_string, "axe") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_AXE;
-						break;
-						}
-					if ( !_stricmp(test_string, "spear") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_SPEAR;
-						break;
-						}
-					if ( !_stricmp(test_string, "bow") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_BOW;
-						break;
-						}
-					if ( !_stricmp(test_string, "mace") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_MACE;
-						break;
-						}
-					if ( !_stricmp(test_string, "blaster") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_BLASTER;
-						break;
-						}
-					if ( !_stricmp(test_string, "shield") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_SHIELD;
-						break;
-						}
-					if ( !_stricmp(test_string, "leather") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_LEATHER;
-						break;
-						}
-					if ( !_stricmp(test_string, "chain") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_CHAIN;
-						break;
-						}
-					if ( !_stricmp(test_string, "plate") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_PLATE;
-						break;
-						}
-					if ( !_stricmp(test_string, "club") )
-						{
-						pItems[item_counter].uSkillType = PLAYER_SKILL_CLUB;
-						break;
-						}
-					pItems[item_counter].uSkillType = PLAYER_SKILL_MISC;
-					break;
-					}
-				case 6: //Mod1
-					{
-					int ii;
-					char* test_char;
-					int tst_len;
-					tst_len=strlen(test_string);
-					pItems[item_counter].uDamageDice=0;
-					pItems[item_counter].uDamageRoll=0;
-					test_char=test_string;
-					for (ii=0; ii<tst_len; ++ii)
-						{
-						if (tolower(*test_char)=='d')
-							{
-							*test_char=0;
-							pItems[item_counter].uDamageDice=atoi(test_string);
-							pItems[item_counter].uDamageRoll=atoi(test_char+1);
-							*test_char='d';
-							break;
-							}
-						++test_char;
-						}
-					test_char=test_string;
-					if ((ii==tst_len)&&(tolower(*test_char)!='s'))
-						{
-						pItems[item_counter].uDamageDice=atoi(test_char);
-						pItems[item_counter].uDamageRoll=1;
-						}
-					break;
-					}
-				case 7: //Mod2
-					pItems[item_counter].uDamageMod=atoi(test_string);
-					break;
-				case 8: //material
-					{
-					if ( !_stricmp(test_string, "artifact") )
-						{
-						pItems[item_counter].uMaterial = MATERIAL_ARTEFACT;
-						break;
-						}
-					if ( !_stricmp(test_string, "relic") )
-						{
-						pItems[item_counter].uMaterial = MATERIAL_RELIC;
-						break;
-						}
-					if ( !_stricmp(test_string, "special") )
-						{
-						pItems[item_counter].uMaterial = MATERIAL_SPECIAL;
-						break;
-						}
-					pItems[item_counter].uMaterial = MATERIAL_COMMON;
-					break;}
-				case 9:  //ID/Rep/St
-					pItems[item_counter].uItemID_Rep_St=atoi(test_string);
-					break;
-				case 10: //Not identified name
-					pItems[item_counter].pUnidentifiedName = RemoveQuotes(test_string);
-					break;
-				case 11: //Sprite Index
-					pItems[item_counter].uSpriteID=atoi(test_string);
-					break;
-				case 12: //VarA
-					{
-					pItems[item_counter]._additional_value=0;
-					pItems[item_counter]._bonus_type=0;
-					if (pItems[item_counter].uMaterial==MATERIAL_SPECIAL)
-						{
-						for(int ii=0; ii<24; ++ii)
-							{
-							if (!_stricmp(test_string,pEnchantments[ii].pOfName))
-								{
-								pItems[item_counter]._bonus_type=ii+1;
-								break;
-								}
-							}
-						if (!pItems[item_counter]._bonus_type)
-							{
-							for(int ii=0; ii<72; ++ii)
-								{
-								if (!_stricmp(test_string,pSpecialEnchantments[ii].pNameAdd))
-									{
-									pItems[item_counter]._additional_value=ii+1;
-									}
-								}
-							}
-						}
+    auto tokens = Tokenize(test_string, '\t');
+    item_counter=atoi(tokens[0]);
+    uAllItemsCount=item_counter;
+    pItems[item_counter].pIconName = RemoveQuotes(tokens[1]);
+    pItems[item_counter].pName = RemoveQuotes(tokens[2]);
+    pItems[item_counter].uValue=atoi(tokens[3]);
+    auto findResult = equipStatMap.find(tokens[4]);
+    pItems[item_counter].uEquipType = findResult == equipStatMap.end() ? EQUIP_NONE : findResult->second;
+    auto findResult2 = equipSkillMap.find(tokens[5]);
+    pItems[item_counter].uSkillType = findResult2 == equipSkillMap.end() ? PLAYER_SKILL_MISC : findResult2->second;
+    auto tokens2 = Tokenize(tokens[6], 'd');
+    if (tokens2.size() == 2)
+    {
+      pItems[item_counter].uDamageDice=atoi(tokens2[0]);
+      pItems[item_counter].uDamageRoll=atoi(tokens2[1]);
+    }
+    else if (tolower(tokens2[0][0]) != 's')
+    {
+      pItems[item_counter].uDamageDice=atoi(tokens2[0]);
+      pItems[item_counter].uDamageRoll=1;
+    }
+    else
+    {
+      pItems[item_counter].uDamageDice=0;
+      pItems[item_counter].uDamageRoll=0;
+    }
+    pItems[item_counter].uDamageMod=atoi(tokens[7]);
+    auto findResult3 = materialMap.find(tokens[8]);
+    pItems[item_counter].uMaterial = findResult3 == materialMap.end() ? MATERIAL_COMMON : findResult->second;
+    pItems[item_counter].uItemID_Rep_St=atoi(tokens[9]);
+    pItems[item_counter].pUnidentifiedName = RemoveQuotes(tokens[10]);
+    pItems[item_counter].uSpriteID=atoi(tokens[11]);
 
-					break;
-					}
-				case 13: //VarB
-					if ((pItems[item_counter].uMaterial==MATERIAL_SPECIAL)&&(pItems[item_counter]._bonus_type))
-						{
-						char b_s=atoi(test_string);
-						if (b_s)
-							pItems[item_counter]._bonus_strength=b_s;
-						else
-							pItems[item_counter]._bonus_strength=1;
-						}
-					else
-						pItems[item_counter]._bonus_strength=0;
-					break;
-				case 14: //Equip X
-					pItems[item_counter].uEquipX=atoi(test_string);
-					break;
-				case 15: //Equip Y
-					pItems[item_counter].uEquipY=atoi(test_string);
-					break;
-				case 16: //Notes
-					pItems[item_counter].pDescription = RemoveQuotes(test_string);
-					break;
+    pItems[item_counter]._additional_value=0;
+    pItems[item_counter]._bonus_type=0;
+    if (pItems[item_counter].uMaterial==MATERIAL_SPECIAL)
+    {
+      for(int ii=0; ii<24; ++ii)
+      {
+        if (!_stricmp(tokens[12],pEnchantments[ii].pOfName))
+        {
+          pItems[item_counter]._bonus_type=ii+1;
+          break;
+        }
+      }
+      if (!pItems[item_counter]._bonus_type)
+      {
+        for(int ii=0; ii<72; ++ii)
+        {
+          if (!_stricmp(tokens[12],pSpecialEnchantments[ii].pNameAdd))
+          {
+            pItems[item_counter]._additional_value=ii+1;
+          }
+        }
+      }
+    }
 
-					}
-				}
-			else
-				{ 
-				if (decode_step)
-					break_loop = true;
-				}
-			++decode_step;
-			test_string=tmp_pos+1;
-			} while ((decode_step<17)&&!break_loop);
-			++item_counter;
-			if (item_counter>799)
-				break;
-		}
-
+    if ((pItems[item_counter].uMaterial==MATERIAL_SPECIAL)&&(pItems[item_counter]._bonus_type))
+    {
+      char b_s=atoi(tokens[13]);
+      if (b_s)
+        pItems[item_counter]._bonus_strength=b_s;
+      else
+        pItems[item_counter]._bonus_strength=1;
+    }
+    else
+      pItems[item_counter]._bonus_strength=0;
+    pItems[item_counter].uEquipX=atoi(tokens[14]);
+    pItems[item_counter].uEquipY=atoi(tokens[15]);
+    pItems[item_counter].pDescription = RemoveQuotes(tokens[16]);
+    item_counter++;
+	}
 
 	pRndItemsTXT_Raw = NULL;
 	uAllItemsCount = item_counter;
@@ -855,64 +566,19 @@
 	strtok(NULL, "\r");
 	strtok(NULL, "\r");
 	strtok(NULL, "\r");
-	item_counter = 0;
-	while (true)
+  for (item_counter = 0; item_counter < 619; item_counter++)
 		{
 		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 0: 
-					item_counter=atoi(test_string);
-					break;
-				case 2:
-					pItems[item_counter].uChanceByTreasureLvl1=atoi(test_string);
-					break;
-				case 3:
-					pItems[item_counter].uChanceByTreasureLvl2=atoi(test_string);
-					break;
-				case 4:
-					pItems[item_counter].uChanceByTreasureLvl3=atoi(test_string);
-					break;
-				case 5:
-					pItems[item_counter].uChanceByTreasureLvl4=atoi(test_string);
-					break;
-				case 6:
-					pItems[item_counter].uChanceByTreasureLvl5=atoi(test_string);
-					break;
-				case 7:
-					pItems[item_counter].uChanceByTreasureLvl6=atoi(test_string);
-					break;
-					}
-				}
-			else
-				{ 
-				if (decode_step)
-					break_loop = true;
-				}
-			++decode_step;
-			test_string=tmp_pos+1;
-			} while ((decode_step<8)&&!break_loop);
-			++item_counter;
-			if (item_counter>618)
-				break;
-		}
+    auto tokens = Tokenize(test_string, '\t');
+    Assert(tokens.size() > 7, "Invalid number of tokens");
+    item_counter = atoi(tokens[0]);
+    pItems[item_counter].uChanceByTreasureLvl1=atoi(tokens[2]);
+    pItems[item_counter].uChanceByTreasureLvl2=atoi(tokens[3]);
+    pItems[item_counter].uChanceByTreasureLvl3=atoi(tokens[4]);
+    pItems[item_counter].uChanceByTreasureLvl4=atoi(tokens[5]);
+    pItems[item_counter].uChanceByTreasureLvl5=atoi(tokens[6]);
+    pItems[item_counter].uChanceByTreasureLvl6=atoi(tokens[7]);
+  }
 
 	//ChanceByTreasureLvl Summ - to calculate chance
 	memset(&uChanceByTreasureLvlSumm, 0, 24);
@@ -930,119 +596,35 @@
 	for (i=0;i<3;++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: 
-					switch (i)
-						{
-					case 0:
-						uBonusChanceStandart[0]=atoi(test_string);
-						break;
-					case 1:
-						uBonusChanceSpecial[0]=atoi(test_string);
-						break;
-					case 2:
-						uBonusChanceWpSpecial[0]=atoi(test_string);
-						break;
-						}
-					break;
-				case 3:
-					switch (i)
-						{
-					case 0:
-						uBonusChanceStandart[1]=atoi(test_string);
-						break;
-					case 1:
-						uBonusChanceSpecial[1]=atoi(test_string);
-						break;
-					case 2:
-						uBonusChanceWpSpecial[1]=atoi(test_string);
-						break;
-						}
-					break;
-				case 4: 
-					switch (i)
-						{
-					case 0:
-						uBonusChanceStandart[2]=atoi(test_string);
-						break;
-					case 1:
-						uBonusChanceSpecial[2]=atoi(test_string);
-						break;
-					case 2:
-						uBonusChanceWpSpecial[2]=atoi(test_string);
-						break;
-						}
-					break;
-				case 5:
-					switch (i)
-						{
-					case 0:
-						uBonusChanceStandart[3]=atoi(test_string);
-						break;
-					case 1:
-						uBonusChanceSpecial[3]=atoi(test_string);
-						break;
-					case 2:
-						uBonusChanceWpSpecial[3]=atoi(test_string);
-						break;
-						}
-					break;
-				case 6: 
-					switch (i)
-						{
-					case 0:
-						uBonusChanceStandart[4]=atoi(test_string);
-						break;
-					case 1:
-						uBonusChanceSpecial[4]=atoi(test_string);
-						break;
-					case 2:
-						uBonusChanceWpSpecial[4]=atoi(test_string);
-						break;
-						}
-					break;
-				case 7:
-					switch (i)
-						{
-					case 0:
-						uBonusChanceStandart[5]=atoi(test_string);
-						break;
-					case 1:
-						uBonusChanceSpecial[5]=atoi(test_string);
-						break;
-					case 2:
-						uBonusChanceWpSpecial[5]=atoi(test_string);
-						break;
-						}
-					break;
-					}
-				}
-			else
-				{ 
-				if (decode_step)
-					break_loop = true;
-				}
-			++decode_step;
-			test_string=tmp_pos+1;
-			} while ((decode_step<8)&&!break_loop);
+    auto tokens = Tokenize(test_string, '\t');
+    Assert(tokens.size() > 7, "Invalid number of tokens");
+      switch (i)
+      {
+      case 0:
+        uBonusChanceStandart[0]=atoi(tokens[2]);
+        uBonusChanceStandart[1]=atoi(tokens[3]);
+        uBonusChanceStandart[2]=atoi(tokens[4]);
+        uBonusChanceStandart[3]=atoi(tokens[5]);
+        uBonusChanceStandart[4]=atoi(tokens[6]);
+        uBonusChanceStandart[5]=atoi(tokens[7]);
+        break;
+      case 1:
+        uBonusChanceSpecial[0]=atoi(tokens[2]);
+        uBonusChanceSpecial[1]=atoi(tokens[3]);
+        uBonusChanceSpecial[2]=atoi(tokens[4]);
+        uBonusChanceSpecial[3]=atoi(tokens[5]);
+        uBonusChanceSpecial[4]=atoi(tokens[6]);
+        uBonusChanceSpecial[5]=atoi(tokens[7]);
+        break;
+      case 2:
+        uBonusChanceWpSpecial[0]=atoi(tokens[2]);
+        uBonusChanceWpSpecial[1]=atoi(tokens[3]);
+        uBonusChanceWpSpecial[2]=atoi(tokens[4]);
+        uBonusChanceWpSpecial[3]=atoi(tokens[5]);
+        uBonusChanceWpSpecial[4]=atoi(tokens[6]);
+        uBonusChanceWpSpecial[5]=atoi(tokens[7]);
+        break;
+      }
 		}
 
 	if ( pRndItemsTXT_Raw )
@@ -1057,51 +639,14 @@
 	for (i=0; i<37; ++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 1:
-					pSkillDesc[i] = RemoveQuotes(test_string);
-					break;
-				case 2:
-					pNormalSkillDesc[i] = RemoveQuotes(test_string);
-					break;
-				case 3:
-					pExpertSkillDesc[i] = RemoveQuotes(test_string);
-					break;
-				case 4:
-					pMasterSkillDesc[i] = RemoveQuotes(test_string);
-					break;
-				case 5:
-					pGrandSkillDesc[i] = RemoveQuotes(test_string);
-					break;	  
-					}
-				}
-			else
-				{ 
-				if (decode_step)
-					break_loop = true;
-				}
-			++decode_step;
-			test_string=tmp_pos+1;
-			} while ((decode_step<6)&&!break_loop);
-		}
+    auto tokens = Tokenize(test_string, '\t');
+    Assert(tokens.size() >= 6, "Invalid number of tokens");
+    pSkillDesc[i] = RemoveQuotes(tokens[1]);
+    pNormalSkillDesc[i] = RemoveQuotes(tokens[2]);
+    pExpertSkillDesc[i] = RemoveQuotes(tokens[3]);
+    pMasterSkillDesc[i] = RemoveQuotes(tokens[4]);
+    pGrandSkillDesc[i] = RemoveQuotes(tokens[5]);
+	}
 
 	pStatsTXT_Raw = 0;
 	pStatsTXT_Raw = (char *)pEvents_LOD->LoadRaw("stats.txt", 0);
@@ -1109,139 +654,89 @@
 	for (i=0; i<26; ++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 (i)
-					{
-				case 0:
-				case 1:
-				case 2:
-				case 3:
-				case 4:
-				case 5:
-				case 6:
-					pAttributeDescriptions[i] = RemoveQuotes(test_string);
-					break;
-				case 7:
-					pHealthPointsAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 8:
-					pArmourClassAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 9:
-					pSpellPointsAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 10:
-					pPlayerConditionAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 11:
-					pFastSpellAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 12:
-					pPlayerAgeAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 13:
-					pPlayerLevelAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 14:
-					pPlayerExperienceAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 15:
-					pAttackBonusAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 16:
-					pAttackDamageAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 17:
-					pMissleBonusAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 18:
-					pMissleDamageAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 19:
-					pFireResistanceAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 20:
-					pAirResistanceAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 21:
-					pWaterResistanceAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 22:
-					pEarthResistanceAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 23:
-					pMindResistanceAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 24:
-					pBodyResistanceAttributeDescription = RemoveQuotes(test_string);
-					break;
-				case 25:
-					pSkillPointsAttributeDescription = RemoveQuotes(test_string);
-					break;  
-					}
-				}
-			else
-				{ 
-				if (decode_step)
-					break_loop = true;
-				}
-			++decode_step;
-			test_string=tmp_pos+1;
-			} while ((decode_step<2)&&!break_loop);
-		}
-
-
+    auto tokens = Tokenize(test_string, '\t');
+    Assert(tokens.size() == 2, "Invalid number of tokens");
+    switch (i)
+    {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+      pAttributeDescriptions[i] = RemoveQuotes(tokens[1]);
+      break;
+    case 7:
+      pHealthPointsAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 8:
+      pArmourClassAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 9:
+      pSpellPointsAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 10:
+      pPlayerConditionAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 11:
+      pFastSpellAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 12:
+      pPlayerAgeAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 13:
+      pPlayerLevelAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 14:
+      pPlayerExperienceAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 15:
+      pAttackBonusAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 16:
+      pAttackDamageAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 17:
+      pMissleBonusAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 18:
+      pMissleDamageAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 19:
+      pFireResistanceAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 20:
+      pAirResistanceAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 21:
+      pWaterResistanceAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 22:
+      pEarthResistanceAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 23:
+      pMindResistanceAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 24:
+      pBodyResistanceAttributeDescription = RemoveQuotes(tokens[1]);
+      break;
+    case 25:
+      pSkillPointsAttributeDescription = RemoveQuotes(tokens[1]);
+      break;  
+    }
+  }
+  
 	pClassTXT_Raw = 0;
 	pClassTXT_Raw = (char *)pEvents_LOD->LoadRaw("class.txt", 0);
 	strtok(pClassTXT_Raw, "\r");
 	for (i=0; i<36; ++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)
-				{
-				//if(i) 
-					pClassDescriptions[i]=RemoveQuotes(test_string);
-				}
-			else
-				{ 
-				if (decode_step)
-					break_loop = true;
-				}
-			++decode_step;
-			test_string=tmp_pos+1;
-			} while ((decode_step<2)&&!break_loop);
-		}
+    auto tokens = Tokenize(test_string, '\t');
+    Assert(tokens.size() == 3, "Invalid number of tokens");
+    pClassDescriptions[i]=RemoveQuotes(tokens[1]);
+	}
 
 
   
@@ -1543,62 +1038,28 @@
 
     ItemsTable *v5; // edi@1
     int v6; // ebx@3
-    int *v7; // ecx@33
+    //int *v7; // ecx@33
     //int v8; // eax@34
     //int v9; // eax@39
     int current_chance; // ebx@43
     int tmp_chance; // ecx@47
-    unsigned int *v12; // edx@48
-    unsigned int v13; // eax@49
-    signed int v14; // ebx@52
-    int v15; // eax@53
-    signed int v16; // eax@55
     int v17; // ebx@57
     int v18; // edx@62
-    signed int v19; // ebx@70
-    unsigned __int8 v20; // al@81
-    int v21; // eax@84
-    int v22; // ebx@85
-    int v23; // eax@86
-    int v24; // ebx@86
-    int special_chance; // edx@86
-    int v26; // edx@89
+    unsigned int special_chance; // edx@86
+    unsigned int v26; // edx@89
     unsigned int v27; // eax@89
-    int i; // ebx@89
-    unsigned int v29; // ecx@90
-    int v30; // ebx@91
-    int v31; // eax@91
     int v32; // ecx@91
     int v33; // eax@91
-    int v34; // eax@97
-    unsigned __int8 v35; // sf@97
-    unsigned __int8 v36; // of@97
-    int v37; // ebx@98
-    int v38; // edx@99
-    signed int v39; // ebx@101
-    int v40; // ecx@102
-    char v41; // zf@107
-    char v42; // al@108
-    char v43; // al@111
-    int *v44; // edx@118
+    unsigned int v34; // eax@97
     int v45; // eax@120
     int v46; // edx@120
     int j; // eax@121
-    unsigned int v48; // ecx@123
-    int v49; // eax@123
-    int v50; // eax@123
     int val_list[800]; // [sp+Ch] [bp-C88h]@33
     int total_chance; // [sp+C8Ch] [bp-8h]@33
-    int v53; // [sp+C90h] [bp-4h]@1
     int v54; // [sp+C9Ch] [bp+8h]@3
     //int v55; // [sp+CA0h] [bp+Ch]@34
     signed int v56; // [sp+CA0h] [bp+Ch]@55
     int v57; // [sp+CA0h] [bp+Ch]@62
-    int *v58; // [sp+CA0h] [bp+Ch]@102
-    int v59; // [sp+CA0h] [bp+Ch]@123
-    //signed int a2a; // [sp+CA4h] [bp+10h]@33
-    int a2b; // [sp+CA4h] [bp+10h]@101
-    int a2c; // [sp+CA4h] [bp+10h]@120
 
     v5 = this;
     if (!out_item)
@@ -1770,7 +1231,7 @@
     case EQUIP_BOW :    
         if ( !uBonusChanceWpSpecial[v6] )
             return;
-        if ((rand() % 100)>=uBonusChanceWpSpecial[v6])
+        if ((uint)(rand() % 100)>=uBonusChanceWpSpecial[v6])
             return;
         break;
     case      EQUIP_ARMOUR :        
@@ -1827,7 +1288,7 @@
     int spc_sum=0;
     int spc;
     memset(&val_list, 0, 3200);
-    for (int i=0; i<pSpecialEnchantments_count;++i)
+    for (unsigned int i=0; i<pSpecialEnchantments_count;++i)
         {
         int tr_lv= pSpecialEnchantments[i].iTreasureLevel;
         switch ( treasure_level - 1 )
@@ -2534,29 +1995,18 @@
 void GenerateItemsInChest()
     {
     unsigned int v0; // eax@1
-    Chest *v1; // ebx@1
     MapInfo *v2; // esi@1
     ItemGen *v3; // ebx@2
     int v4; // ebp@4
     int v5; // edi@4
     int v6; // esi@4
-    int v7; // eax@4
     signed int v8; // esi@4
     int v9; // edx@4
     int v10; // esi@8
     int v11; // ebp@25
     int v12; // esi@25
-    signed int v13; // ebp@27
     ItemGen *v14; // edi@28
-    signed int v15; // edx@32
-    signed __int64 v16; // qtt@32
-    int v17; // esi@34
     signed int v18; // [sp+10h] [bp-18h]@1
-    int v19; // [sp+14h] [bp-14h]@4
-    MapInfo *v20; // [sp+18h] [bp-10h]@1
-    Chest *v21; // [sp+1Ch] [bp-Ch]@1
-    int v22; // [sp+20h] [bp-8h]@26
-    signed int v23; // [sp+24h] [bp-4h]@2
 
     v18 = rand() % 100;  //main random
     v0 = pMapStats->GetMapInfo(pCurrentMapName);
@@ -2859,10 +2309,6 @@
 {
   int result; // eax@2
   char v5; // zf@3
-  const char *v6; // [sp-Ch] [bp-18h]@88
-  signed int v7; // [sp-8h] [bp-14h]@61
-  int v8; // [sp-4h] [bp-10h]@61
-  signed int v9; // [sp-4h] [bp-10h]@69
 
   result = 0; //BUG   fn is void
   if ( item_id <= 500 )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MapInfo.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -0,0 +1,518 @@
+#include "MapInfo.h"
+#include "LOD.h"
+#include "ErrorHandling.h"
+#include "mm7_data.h"
+#include "texts.h"
+#include "ObjectList.h"
+#include "SpriteObject.h"
+#include "Indoor.h"
+#include "mm7_unsorted_subs.h"
+
+
+//----- (00453F62) --------------------------------------------------------
+void MapStats::Initialize()
+{
+  char work_str[32]; // [sp+Ch] [bp-34h]@3
+  int work_str_pos;
+  int work_str_len;
+  int i;
+  char* test_string;
+  unsigned char c;
+  bool break_loop;
+  unsigned int temp_str_len;
+  char* tmp_pos;
+  int decode_step;
+  int item_counter;
+
+  if ( pMapStatsTXT_Raw )
+    free(pMapStatsTXT_Raw);
+  pMapStatsTXT_Raw = NULL;
+  pMapStatsTXT_Raw = (char *)pEvents_LOD->LoadRaw("MapStats.txt", 0);
+  strtok(pMapStatsTXT_Raw, "\r");
+  strtok(NULL, "\r");
+  strtok(NULL, "\r");
+
+  for (i=1; i<77; ++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 1:
+          pInfos[i].pName = RemoveQuotes(test_string);
+          break;
+        case 2:
+          pInfos[i].pFilename = RemoveQuotes(test_string);
+          break;
+        case 3:
+          pInfos[i].uNumResets = atoi(test_string);
+          break;
+        case 4:
+          pInfos[i].uFirstVisitedAt = atoi(test_string);
+          break;
+        case 5:
+          pInfos[i]._per = atoi(test_string);
+          break;
+        case 6:
+          pInfos[i].uRespawnIntervalDays = atoi(test_string);
+          break;
+        case 7:
+          pInfos[i]._alert_days = atoi(test_string);
+          break;
+        case 8:
+          pInfos[i]._steal_perm = atoi(test_string);
+          break;
+        case 9:
+          pInfos[i].LockX5 = atoi(test_string);
+          break;
+        case 10:
+          pInfos[i].Trap_D20 = atoi(test_string);
+          break;
+        case 11:
+          pInfos[i].Treasure_prob = atoi(test_string);
+          break;
+        case 12:
+          pInfos[i].Encounter_percent = atoi(test_string);
+          break;
+        case 13:
+          pInfos[i].EncM1percent = atoi(test_string);
+          break;
+        case 14:
+          pInfos[i].EncM2percent = atoi(test_string);
+          break;
+        case 15:
+          pInfos[i].EncM3percent = atoi(test_string);
+          break;
+        case 16:
+          pInfos[i].pEncounterMonster1Texture = RemoveQuotes(test_string);
+          break;
+        case 18:
+          pInfos[i].Dif_M1 = atoi(test_string);
+          break;
+        case 19:
+          pInfos[i].uEncounterMonster1AtLeast = 1;
+          pInfos[i].uEncounterMonster1AtMost = 1;
+          strcpy(work_str, test_string);
+          work_str_pos = 0;
+          work_str_len=strlen(work_str);
+          if (work_str_len )
+          {
+            while (work_str[work_str_pos] != '-' )
+            {
+              ++work_str_pos;
+              if (work_str_pos >= work_str_len )
+                break;
+            }
+            work_str[work_str_pos] = 0;
+            pInfos[i].uEncounterMonster1AtLeast = atoi(work_str);
+            if ( work_str_pos < work_str_len )
+              pInfos[i].uEncounterMonster1AtMost = atoi(&work_str[work_str_pos + 1]);
+            else
+              pInfos[i].uEncounterMonster1AtMost = pInfos[i].uEncounterMonster1AtLeast;
+          }
+          break;
+        case 20:
+          pInfos[i].pEncounterMonster2Texture = RemoveQuotes(test_string);
+          break;
+        case 22:
+          pInfos[i].Dif_M2 = atoi(test_string);
+          break;
+        case 23:
+          pInfos[i].uEncounterMonster2AtLeast = 1;
+          pInfos[i].uEncounterMonster2AtMost = 1;
+          strcpy(work_str, test_string);
+          work_str_pos = 0;
+          work_str_len=strlen(work_str);
+          if (work_str_len )
+          {
+            while (work_str[work_str_pos] != '-' )
+            {
+              ++work_str_pos;
+              if (work_str_pos >= work_str_len )
+                break;
+            }
+            work_str[work_str_pos] = 0;
+            pInfos[i].uEncounterMonster2AtLeast = atoi(work_str);
+            if ( work_str_pos < work_str_len )
+              pInfos[i].uEncounterMonster2AtMost = atoi(&work_str[work_str_pos + 1]);
+            else
+              pInfos[i].uEncounterMonster2AtMost = pInfos[i].uEncounterMonster2AtLeast;
+          }
+          break;
+        case 24:
+          pInfos[i].pEncounterMonster3Texture = RemoveQuotes(test_string);
+          break;
+        case 26:
+          pInfos[i].Dif_M3 = atoi(test_string);
+          break;
+        case 27:
+          pInfos[i].uEncounterMonster3AtLeast = 1;
+          pInfos[i].uEncounterMonster3AtMost = 1;
+          strcpy(work_str, test_string);
+          work_str_pos = 0;
+          work_str_len=strlen(work_str);
+          if (work_str_len )
+          {
+            while (work_str[work_str_pos] != '-' )
+            {
+              ++work_str_pos;
+              if (work_str_pos >= work_str_len )
+                break;
+            }
+            work_str[work_str_pos] = 0;
+            pInfos[i].uEncounterMonster3AtLeast = atoi(work_str);
+            if ( work_str_pos < work_str_len )
+              pInfos[i].uEncounterMonster3AtMost = atoi(&work_str[work_str_pos + 1]);
+            else
+              pInfos[i].uEncounterMonster3AtMost = pInfos[i].uEncounterMonster3AtLeast;
+          }
+          break;
+        case 28:
+          pInfos[i].uRedbookTrackID = atoi(test_string);
+          break;
+        case 29:
+          {
+            if ( !strcmp(test_string, "CAVE") )
+            {
+              pInfos[i].uEAXEnv = 8;
+              break;
+            }
+            if ( !strcmp(test_string, "STONEROOM") )
+            {
+              pInfos[i].uEAXEnv = 5;
+              break;
+            }
+            if ( !strcmp(test_string, "MOUNTAINS") )
+            {
+              pInfos[i].uEAXEnv = 17;
+              break;
+            }
+            if ( !strcmp(test_string, "PLAIN") )
+            {
+              pInfos[i].uEAXEnv = 19;
+              break;
+            }
+            if ( !strcmp(test_string, "FOREST") )
+            {
+              pInfos[i].uEAXEnv = 15;
+              break;
+            }
+            if ( !strcmp(test_string, "CITY") )
+            {
+              pInfos[i].uEAXEnv = 16;
+              break;
+            }
+            if ( !strcmp(test_string, "UNDERWATER") )
+            {
+              pInfos[i].uEAXEnv = 22;
+              break;
+            }
+            if ( !strcmp(test_string, "ARENA") )
+            {
+              pInfos[i].uEAXEnv = 9;
+              break;
+            }
+            if ( !strcmp(test_string, "GENERIC") )
+            {
+              pInfos[i].uEAXEnv = 0;
+              break;
+            }
+            if ( !strcmp(test_string, "PADDEDCELL") )
+            {
+              pInfos[i].uEAXEnv = 1;
+              break;
+            }
+            if ( !strcmp(test_string, "ROOM") )
+            {
+              pInfos[i].uEAXEnv = 2;
+              break;
+            }
+            if ( !strcmp(test_string, "BATHROOM") )
+            {
+              pInfos[i].uEAXEnv = 3;
+              break;
+            }
+            if ( !strcmp(test_string, "LIVINGROOM") )
+            {
+              pInfos[i].uEAXEnv = 4;
+              break;
+            }
+            if ( !strcmp(test_string, "AUDITORIUM") )
+            {
+              pInfos[i].uEAXEnv = 6;
+              break;
+            }
+            if ( !strcmp(test_string, "CONCERTHALL") )
+            {
+              pInfos[i].uEAXEnv = 7;
+              break;
+            }
+            if ( !strcmp(test_string, "HANGAR") )
+            {
+              pInfos[i].uEAXEnv = 10;
+              break;
+            }
+            if ( !strcmp(test_string, "CARPETEDHALLWAY") )
+            {
+              pInfos[i].uEAXEnv = 11;
+              break;
+            }
+            if ( !strcmp(test_string, "HALLWAY") )
+            {
+              pInfos[i].uEAXEnv = 12;
+              break;
+            }
+            if ( !strcmp(test_string, "STONECORRIDOR") )
+            {
+              pInfos[i].uEAXEnv = 13;
+              break;
+            }
+            if ( !strcmp(test_string, "ALLEY") )
+            {
+              pInfos[i].uEAXEnv = 14;
+              break;
+            }
+            if ( !strcmp(test_string, "QUARRY") )
+            {
+              pInfos[i].uEAXEnv = 18;
+              break;
+            }
+            if ( !strcmp(test_string, "PARKINGLOT") )
+            {
+              pInfos[i].uEAXEnv = 20;
+              break;
+            }
+            if ( !strcmp(test_string, "SEWERPIPE") )
+            {
+              pInfos[i].uEAXEnv = 21;
+              break;
+            }
+            if ( !strcmp(test_string, "DRUGGED") )
+            {
+              pInfos[i].uEAXEnv = 23;
+              break;
+            }
+            if ( !strcmp(test_string, "DIZZY") )
+            {
+              pInfos[i].uEAXEnv = 24;
+              break;
+            }
+            if ( !strcmp(test_string, "PSYCHOTIC") )
+            {
+              pInfos[i].uEAXEnv = 25;
+              break;
+            }
+            pInfos[i].uEAXEnv = 26;
+
+          }
+          break;
+        }
+      }
+      else
+      { 
+        break_loop = true;
+      }
+      ++decode_step;
+      test_string=tmp_pos+1;
+    } while ((decode_step<31)&&!break_loop);
+  }
+
+  uNumMaps = 77;
+}
+// 453F62: using guessed type char Str[32];
+
+//----- (00410D99) --------------------------------------------------------
+int MapStats::sub_410D99_get_map_index(int a1)
+{
+  for (int i = 1; i <= pMapStats->uNumMaps; i++)
+  {
+    if (_stricmp(pMapStats->pInfos[i].pFilename, pGames_LOD->pSubIndices[a1].pFilename) )
+      return i;
+  }
+  Error("Map not found");
+  return -1;
+}
+
+//----- (004547A3) --------------------------------------------------------
+MAP_TYPE MapStats::GetMapInfo(const char *Str2)
+{
+  Assert(uNumMaps >= 2);
+
+  for (uint i = 1; i < uNumMaps; ++i)
+    if (!_stricmp(pInfos[i].pFilename, Str2))
+      return (MAP_TYPE)i;
+
+  Error("Map not found!");
+  return (MAP_TYPE)-1;
+}
+
+
+//----- (0044FFD8) --------------------------------------------------------
+int MapInfo::SpawnRandomTreasure(SpawnPointMM7 *a2)
+{
+  //MapInfo *v2; // ebx@1
+  //SpawnPointMM7 *v3; // esi@1
+  //int v4; // eax@1
+  int v5; // edx@1
+  int v6; // eax@1
+  int v7; // ecx@1
+  int v8; // ebx@1
+  int v9; // eax@1
+  signed int v10; // ebx@1
+  signed int result; // eax@1
+  signed __int64 v12; // qtt@1
+  int v13; // ebx@1
+  int v14; // edx@10
+  signed int v15; // ebx@20
+  unsigned __int16 v16; // dx@20
+  ObjectDesc *v17; // ecx@21
+  unsigned __int16 v18; // ax@24
+  int v19; // ST0C_4@27
+  int v20; // ST08_4@27
+  int v21; // ST04_4@27
+  int v22; // eax@27
+  signed int v23; // ebx@29
+  unsigned __int16 v24; // dx@29
+  ObjectDesc *v25; // ecx@30
+  unsigned __int16 v26; // ax@33
+  //int v27; // ecx@35
+  //int v28; // eax@35
+  //int v29; // esi@35
+  //__int16 v30; // ax@35
+  SpriteObject a1a; // [sp+Ch] [bp-7Ch]@1
+  //int v32; // [sp+7Ch] [bp-Ch]@1
+  //int v33; // [sp+80h] [bp-8h]@1
+  int v34; // [sp+84h] [bp-4h]@1
+
+  //auto a1 = this;
+  //v2 = a1;
+  //v3 = a2;
+  //v4 = rand();
+  v34 = 0;
+  v5 = rand() % 100;
+  // v6 = 2 * (v2->Treasure_prob + 7 * v3->uIndex) - 14;
+  v7 = (unsigned __int8)byte_4E8168[a2->uIndex - 1][2 * Treasure_prob];
+  v8 = (unsigned __int8)byte_4E8168[a2->uIndex - 1][2 * Treasure_prob + 1];
+  //v32 = v5;
+  //v33 = v7;
+  v9 = rand();
+  v10 = v8 - v7 + 1;
+  v12 = v9;
+  result = v9 / v10;
+  v13 = v7 + (unsigned __int64)(v12 % v10);
+  if ( v13 < 7 )
+  {
+    if ( v5 < 20 )
+      return result;
+    if ( v5 >= 60 )
+    {
+      v19 = a2->vPosition.z;
+      v20 = a2->vPosition.y;
+      v21 = a2->vPosition.x;
+      v22 = rand();
+      return sub_450521_ProllyDropItemAt(v13, v22 % 27 + 20, v21, v20, v19, 0);
+    }
+    if ( a2->uIndex == 1 )
+    {
+      v14 = rand() % 51 + 50;
+      a1a.stru_24.uItemID = 197;
+      v34 = v14;
+    }
+    else if ( a2->uIndex == 2 )
+    {
+      v14 = rand() % 101 + 100;
+      a1a.stru_24.uItemID = 197;
+      v34 = v14;
+    }
+    else if ( a2->uIndex == 3 )
+    {
+      v14 = rand() % 301 + 200;
+      a1a.stru_24.uItemID = 198;
+      v34 = v14;
+    }
+    else if ( a2->uIndex == 4 )
+    {
+      v14 = rand() % 501 + 500;
+      a1a.stru_24.uItemID = 198;
+      v34 = v14;
+    }
+    else if ( a2->uIndex == 5 )
+    {
+      v14 = rand() % 1001 + 1000;
+      a1a.stru_24.uItemID = 199;
+      v34 = v14;
+    }
+    else if ( a2->uIndex == 6 )
+    {
+      v14 = rand() % 3001 + 2000;
+      a1a.stru_24.uItemID = 199;
+      v34 = v14;
+    }	 
+    v15 = 0;
+    v16 = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
+    a1a.uType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
+    v18 = 0;
+    for( int i = 0; i < pObjectList->uNumObjects; i++ )
+    {
+      if ( pObjectList->pObjects[i].uObjectID == v16 )
+      {
+        v18 = i;
+        break;
+      }
+    }
+    a1a.stru_24.SetIdentified();
+    a1a.uObjectDescID = v18;
+    a1a.stru_24.uSpecEnchantmentType = v34;
+  }
+  else
+  {
+    result = a1a.stru_24.GenerateArtifact();
+    if ( !result )
+      return result;
+    v23 = 0;
+    v24 = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
+    a1a.uType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
+    v26 = 0;
+    for( int i = 0; i < pObjectList->uNumObjects; i++ )
+    {
+      if( v24 == pObjectList->pObjects[i].uObjectID )
+      {
+        v26 = i;
+        break;
+      }
+    }
+    a1a.uObjectDescID = v26;
+    a1a.stru_24.Reset();
+  }
+  a1a.vPosition.y = a2->vPosition.y;
+  a1a.uAttributes = 0;
+  a1a.uSoundID = 0;
+  a1a.uFacing = 0;
+  a1a.vPosition.z = a2->vPosition.z;
+  a1a.vPosition.x = a2->vPosition.x;
+  a1a.spell_skill = 0;
+  a1a.spell_level = 0;
+  a1a.spell_id = 0;
+  a1a.spell_target_pid = 0;
+  a1a.spell_caster_pid = 0;
+  a1a.uSpriteFrameID = 0;
+  a1a.uSectorID = pIndoor->GetSector(a2->vPosition.x, a2->vPosition.y, a2->vPosition.z);;
+  return a1a.Create(0, 0, 0, 0);
+}
+
--- a/MapInfo.h	Fri Mar 14 09:32:25 2014 +0600
+++ b/MapInfo.h	Fri Mar 14 09:32:42 2014 +0600
@@ -86,9 +86,11 @@
 {
   void Initialize();
   MAP_TYPE GetMapInfo(const char *Str2);
-
+  int sub_410D99_get_map_index(int a1);
   MapInfo pInfos[77];
   unsigned int uNumMaps;
+
+
 };
 #pragma pack(pop)
 
--- a/Render.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/Render.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -8486,18 +8486,18 @@
       {
         //t = near_clip - v0.x / v1.x - v0.x    (      )
         t = (8.0 - array_50AC10[i].vWorldViewPosition.x) / (array_50AC10[i + 1].vWorldViewPosition.x - array_50AC10[i].vWorldViewPosition.x);
-        array_507D30[out_num_vertices].vWorldViewPosition.y = fixpoint_mul((array_50AC10[i + 1].vWorldViewPosition.y - array_50AC10[i].vWorldViewPosition.y), t) + array_50AC10[i].vWorldViewPosition.y;
-        array_507D30[out_num_vertices].vWorldViewPosition.z = fixpoint_mul((array_50AC10[i + 1].vWorldViewPosition.z - array_50AC10[i].vWorldViewPosition.z), t) + array_50AC10[i].vWorldViewPosition.z;
-        array_507D30[out_num_vertices].u = fixpoint_mul((array_50AC10[i + 1].u - array_50AC10[i].u), t) + array_50AC10[i].u;
-        array_507D30[out_num_vertices].v = fixpoint_mul((array_50AC10[i + 1].v - array_50AC10[i].v), t) + array_50AC10[i].v;
+        array_507D30[out_num_vertices].vWorldViewPosition.y = (array_50AC10[i + 1].vWorldViewPosition.y - array_50AC10[i].vWorldViewPosition.y) * t + array_50AC10[i].vWorldViewPosition.y;
+        array_507D30[out_num_vertices].vWorldViewPosition.z = (array_50AC10[i + 1].vWorldViewPosition.z - array_50AC10[i].vWorldViewPosition.z) * t + array_50AC10[i].vWorldViewPosition.z;
+        array_507D30[out_num_vertices].u = (array_50AC10[i + 1].u - array_50AC10[i].u) * t + array_50AC10[i].u;
+        array_507D30[out_num_vertices].v = (array_50AC10[i + 1].v - array_50AC10[i].v) * t + array_50AC10[i].v;
       }
       else
       {
         t = (8.0 - array_50AC10[i + 1].vWorldViewPosition.x) / (array_50AC10[i].vWorldViewPosition.x - array_50AC10[i + 1].vWorldViewPosition.x);
-        array_507D30[out_num_vertices].vWorldViewPosition.y = fixpoint_mul((array_50AC10[i].vWorldViewPosition.y - array_50AC10[i + 1].vWorldViewPosition.y), t) + array_50AC10[i + 1].vWorldViewPosition.y;
-        array_507D30[out_num_vertices].vWorldViewPosition.z = fixpoint_mul((array_50AC10[i].vWorldViewPosition.z - array_50AC10[i + 1].vWorldViewPosition.z), t) + array_50AC10[i + 1].vWorldViewPosition.z;
-        array_507D30[out_num_vertices].u = fixpoint_mul((array_50AC10[i].u - array_50AC10[i + 1].u), t) + array_50AC10[i + 1].u;
-        array_507D30[out_num_vertices].v = fixpoint_mul((array_50AC10[i].v - array_50AC10[i + 1].v), t) + array_50AC10[i + 1].v;
+        array_507D30[out_num_vertices].vWorldViewPosition.y = (array_50AC10[i].vWorldViewPosition.y - array_50AC10[i + 1].vWorldViewPosition.y) * t + array_50AC10[i + 1].vWorldViewPosition.y;
+        array_507D30[out_num_vertices].vWorldViewPosition.z = (array_50AC10[i].vWorldViewPosition.z - array_50AC10[i + 1].vWorldViewPosition.z) * t + array_50AC10[i + 1].vWorldViewPosition.z;
+        array_507D30[out_num_vertices].u = (array_50AC10[i].u - array_50AC10[i + 1].u) * t + array_50AC10[i + 1].u;
+        array_507D30[out_num_vertices].v = (array_50AC10[i].v - array_50AC10[i + 1].v) * t + array_50AC10[i + 1].v;
       }
       array_507D30[out_num_vertices].vWorldViewPosition.x = 8.0;
       array_507D30[out_num_vertices]._rhw = 1.0 / 8.0;
--- a/UI/Books/UIMapBook.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/UI/Books/UIMapBook.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -137,7 +137,7 @@
       {
         pRenderer->DrawTextureTransparent(pLloydsBeacons_SomeXs[BeaconID], pLloydsBeacons_SomeYs[BeaconID], pTexture_CurrentBook);
         pRenderer->DrawTextureRGB(pLloydsBeaconsPreviewXs[BeaconID], pLloydsBeaconsPreviewYs[BeaconID], &pSavegameThumbnails[BeaconID]);
-        Str = pMapStats->pInfos[sub_410D99_get_map_index(pPlayer->pInstalledBeacons[BeaconID].SaveFileID)].pName;
+        Str = pMapStats->pInfos[pMapStats->sub_410D99_get_map_index(pPlayer->pInstalledBeacons[BeaconID].SaveFileID)].pName;
         pTextHeight = pSpellFont->CalcTextHeight(Str, &pWindow, 0, 0);
         pWindow.uFrameY += -6 - pTextHeight;
         pWindow.DrawTitleText(pSpellFont, 0, 0, 1, Str, 3);
--- a/mm7_2.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/mm7_2.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -1389,159 +1389,6 @@
   return result;
 }
 
-//----- (0044FFD8) --------------------------------------------------------
-int MapInfo::SpawnRandomTreasure(SpawnPointMM7 *a2)
-{
-  //MapInfo *v2; // ebx@1
-  //SpawnPointMM7 *v3; // esi@1
-  //int v4; // eax@1
-  int v5; // edx@1
-  int v6; // eax@1
-  int v7; // ecx@1
-  int v8; // ebx@1
-  int v9; // eax@1
-  signed int v10; // ebx@1
-  signed int result; // eax@1
-  signed __int64 v12; // qtt@1
-  int v13; // ebx@1
-  int v14; // edx@10
-  signed int v15; // ebx@20
-  unsigned __int16 v16; // dx@20
-  ObjectDesc *v17; // ecx@21
-  unsigned __int16 v18; // ax@24
-  int v19; // ST0C_4@27
-  int v20; // ST08_4@27
-  int v21; // ST04_4@27
-  int v22; // eax@27
-  signed int v23; // ebx@29
-  unsigned __int16 v24; // dx@29
-  ObjectDesc *v25; // ecx@30
-  unsigned __int16 v26; // ax@33
-  //int v27; // ecx@35
-  //int v28; // eax@35
-  //int v29; // esi@35
-  //__int16 v30; // ax@35
-  SpriteObject a1a; // [sp+Ch] [bp-7Ch]@1
-  //int v32; // [sp+7Ch] [bp-Ch]@1
-  //int v33; // [sp+80h] [bp-8h]@1
-  int v34; // [sp+84h] [bp-4h]@1
-
-  //auto a1 = this;
-  //v2 = a1;
-  //v3 = a2;
-  //v4 = rand();
-  v34 = 0;
-  v5 = rand() % 100;
- // v6 = 2 * (v2->Treasure_prob + 7 * v3->uIndex) - 14;
-  v7 = (unsigned __int8)byte_4E8168[a2->uIndex - 1][2 * Treasure_prob];
-  v8 = (unsigned __int8)byte_4E8168[a2->uIndex - 1][2 * Treasure_prob + 1];
-  //v32 = v5;
-  //v33 = v7;
-  v9 = rand();
-  v10 = v8 - v7 + 1;
-  v12 = v9;
-  result = v9 / v10;
-  v13 = v7 + (unsigned __int64)(v12 % v10);
-  if ( v13 < 7 )
-  {
-    if ( v5 < 20 )
-      return result;
-    if ( v5 >= 60 )
-    {
-      v19 = a2->vPosition.z;
-      v20 = a2->vPosition.y;
-      v21 = a2->vPosition.x;
-      v22 = rand();
-      return sub_450521_ProllyDropItemAt(v13, v22 % 27 + 20, v21, v20, v19, 0);
-    }
-    if ( a2->uIndex == 1 )
-    {
-      v14 = rand() % 51 + 50;
-	  a1a.stru_24.uItemID = 197;
-	  v34 = v14;
-	}
-    else if ( a2->uIndex == 2 )
-    {
-		v14 = rand() % 101 + 100;
-		a1a.stru_24.uItemID = 197;
-		v34 = v14;
-	}
-        else if ( a2->uIndex == 3 )
-        {
-          v14 = rand() % 301 + 200;
-          a1a.stru_24.uItemID = 198;
-		  v34 = v14;
-        }
-        else if ( a2->uIndex == 4 )
-        {
-			  v14 = rand() % 501 + 500;
-			  a1a.stru_24.uItemID = 198;
-			  v34 = v14;
-		}
-		else if ( a2->uIndex == 5 )
-        {
-			v14 = rand() % 1001 + 1000;
-            a1a.stru_24.uItemID = 199;
-            v34 = v14;
-        }
-        else if ( a2->uIndex == 6 )
-        {
-				  v14 = rand() % 3001 + 2000;
-				  a1a.stru_24.uItemID = 199;
-				  v34 = v14;
-		}	 
-            v15 = 0;
-            v16 = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
-            a1a.uType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
-            v18 = 0;
-			for( int i = 0; i < pObjectList->uNumObjects; i++ )
-            {
-				if ( pObjectList->pObjects[i].uObjectID == v16 )
-				{
-					v18 = i;
-					break;
-				}
-            }
-            a1a.stru_24.SetIdentified();
-            a1a.uObjectDescID = v18;
-            a1a.stru_24.uSpecEnchantmentType = v34;
-  }
-  else
-  {
-	  result = a1a.stru_24.GenerateArtifact();
-	  if ( !result )
-		return result;
-	  v23 = 0;
-	  v24 = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
-	  a1a.uType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
-	  v26 = 0;
-		for( int i = 0; i < pObjectList->uNumObjects; i++ )
-		{
-			if( v24 == pObjectList->pObjects[i].uObjectID )
-			{
-				v26 = i;
-				break;
-			}
-		}
-	  a1a.uObjectDescID = v26;
-	  a1a.stru_24.Reset();
-  }
-  a1a.vPosition.y = a2->vPosition.y;
-  a1a.uAttributes = 0;
-  a1a.uSoundID = 0;
-  a1a.uFacing = 0;
-  a1a.vPosition.z = a2->vPosition.z;
-  a1a.vPosition.x = a2->vPosition.x;
-  a1a.spell_skill = 0;
-  a1a.spell_level = 0;
-  a1a.spell_id = 0;
-  a1a.spell_target_pid = 0;
-  a1a.spell_caster_pid = 0;
-  a1a.uSpriteFrameID = 0;
-  a1a.uSectorID = pIndoor->GetSector(a2->vPosition.x, a2->vPosition.y, a2->vPosition.z);;
-  return a1a.Create(0, 0, 0, 0);
-}
-
 //----- (00450521) --------------------------------------------------------
 int __fastcall sub_450521_ProllyDropItemAt(int ecx0, signed int a2, int a3, int a4, int a5, unsigned __int16 a6)
 {
@@ -2241,345 +2088,7 @@
   return 0;
 }
 
-//----- (00453F62) --------------------------------------------------------
-void MapStats::Initialize()
-{
-  char work_str[32]; // [sp+Ch] [bp-34h]@3
-  int work_str_pos;
-  int work_str_len;
-  int i;
-  char* test_string;
-  unsigned char c;
-  bool break_loop;
-  unsigned int temp_str_len;
-  char* tmp_pos;
-  int decode_step;
-  int item_counter;
-
-  if ( pMapStatsTXT_Raw )
-    free(pMapStatsTXT_Raw);
-  pMapStatsTXT_Raw = NULL;
-  pMapStatsTXT_Raw = (char *)pEvents_LOD->LoadRaw("MapStats.txt", 0);
-  strtok(pMapStatsTXT_Raw, "\r");
-  strtok(NULL, "\r");
-  strtok(NULL, "\r");
-
- for (i=1; i<77; ++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 1:
-					  pInfos[i].pName = RemoveQuotes(test_string);
-					  break;
-				  case 2:
-					  pInfos[i].pFilename = RemoveQuotes(test_string);
-					  break;
-				  case 3:
-					  pInfos[i].uNumResets = atoi(test_string);
-					  break;
-				  case 4:
-					  pInfos[i].uFirstVisitedAt = atoi(test_string);
-					  break;
-				  case 5:
-					  pInfos[i]._per = atoi(test_string);
-					  break;
-				  case 6:
-					  pInfos[i].uRespawnIntervalDays = atoi(test_string);
-					  break;
-				  case 7:
-					  pInfos[i]._alert_days = atoi(test_string);
-					  break;
-				  case 8:
-					  pInfos[i]._steal_perm = atoi(test_string);
-					  break;
-				  case 9:
-					  pInfos[i].LockX5 = atoi(test_string);
-					  break;
-				  case 10:
-					  pInfos[i].Trap_D20 = atoi(test_string);
-					  break;
-				  case 11:
-					  pInfos[i].Treasure_prob = atoi(test_string);
-					  break;
-				  case 12:
-					  pInfos[i].Encounter_percent = atoi(test_string);
-					  break;
-				  case 13:
-					  pInfos[i].EncM1percent = atoi(test_string);
-					  break;
-				  case 14:
-					  pInfos[i].EncM2percent = atoi(test_string);
-					  break;
-				  case 15:
-					  pInfos[i].EncM3percent = atoi(test_string);
-					  break;
-				  case 16:
-					  pInfos[i].pEncounterMonster1Texture = RemoveQuotes(test_string);
-					  break;
-				  case 18:
-					  pInfos[i].Dif_M1 = atoi(test_string);
-					  break;
-				  case 19:
-					  pInfos[i].uEncounterMonster1AtLeast = 1;
-					  pInfos[i].uEncounterMonster1AtMost = 1;
-					  strcpy(work_str, test_string);
-					  work_str_pos = 0;
-					  work_str_len=strlen(work_str);
-					  if (work_str_len )
-						  {
-						  while (work_str[work_str_pos] != '-' )
-							  {
-							  ++work_str_pos;
-							  if (work_str_pos >= work_str_len )
-								  break;
-							  }
-						  work_str[work_str_pos] = 0;
-						  pInfos[i].uEncounterMonster1AtLeast = atoi(work_str);
-						  if ( work_str_pos < work_str_len )
-							  pInfos[i].uEncounterMonster1AtMost = atoi(&work_str[work_str_pos + 1]);
-						  else
-							  pInfos[i].uEncounterMonster1AtMost = pInfos[i].uEncounterMonster1AtLeast;
-						  }
-					  break;
-				  case 20:
-					  pInfos[i].pEncounterMonster2Texture = RemoveQuotes(test_string);
-					  break;
-				  case 22:
-					  pInfos[i].Dif_M2 = atoi(test_string);
-					  break;
-				  case 23:
-					  pInfos[i].uEncounterMonster2AtLeast = 1;
-					  pInfos[i].uEncounterMonster2AtMost = 1;
-					  strcpy(work_str, test_string);
-					  work_str_pos = 0;
-					  work_str_len=strlen(work_str);
-					  if (work_str_len )
-						  {
-						  while (work_str[work_str_pos] != '-' )
-							  {
-							  ++work_str_pos;
-							  if (work_str_pos >= work_str_len )
-								  break;
-							  }
-						  work_str[work_str_pos] = 0;
-						  pInfos[i].uEncounterMonster2AtLeast = atoi(work_str);
-						  if ( work_str_pos < work_str_len )
-							  pInfos[i].uEncounterMonster2AtMost = atoi(&work_str[work_str_pos + 1]);
-						  else
-							  pInfos[i].uEncounterMonster2AtMost = pInfos[i].uEncounterMonster2AtLeast;
-						  }
-					  break;
-				  case 24:
-					  pInfos[i].pEncounterMonster3Texture = RemoveQuotes(test_string);
-					  break;
-				  case 26:
-					  pInfos[i].Dif_M3 = atoi(test_string);
-					  break;
-				  case 27:
-					  pInfos[i].uEncounterMonster3AtLeast = 1;
-					  pInfos[i].uEncounterMonster3AtMost = 1;
-					  strcpy(work_str, test_string);
-					  work_str_pos = 0;
-					  work_str_len=strlen(work_str);
-					  if (work_str_len )
-						  {
-						  while (work_str[work_str_pos] != '-' )
-							  {
-							  ++work_str_pos;
-							  if (work_str_pos >= work_str_len )
-								  break;
-							  }
-						  work_str[work_str_pos] = 0;
-						  pInfos[i].uEncounterMonster3AtLeast = atoi(work_str);
-						  if ( work_str_pos < work_str_len )
-							  pInfos[i].uEncounterMonster3AtMost = atoi(&work_str[work_str_pos + 1]);
-						  else
-							  pInfos[i].uEncounterMonster3AtMost = pInfos[i].uEncounterMonster3AtLeast;
-						  }
-					  break;
-				  case 28:
-					  pInfos[i].uRedbookTrackID = atoi(test_string);
-					  break;
-				  case 29:
-					  {
-					  if ( !strcmp(test_string, "CAVE") )
-						  {
-						  pInfos[i].uEAXEnv = 8;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "STONEROOM") )
-						  {
-						  pInfos[i].uEAXEnv = 5;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "MOUNTAINS") )
-						  {
-						  pInfos[i].uEAXEnv = 17;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "PLAIN") )
-						  {
-						  pInfos[i].uEAXEnv = 19;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "FOREST") )
-						  {
-						  pInfos[i].uEAXEnv = 15;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "CITY") )
-						  {
-						  pInfos[i].uEAXEnv = 16;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "UNDERWATER") )
-						  {
-						  pInfos[i].uEAXEnv = 22;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "ARENA") )
-						  {
-						  pInfos[i].uEAXEnv = 9;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "GENERIC") )
-						  {
-						  pInfos[i].uEAXEnv = 0;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "PADDEDCELL") )
-						  {
-						  pInfos[i].uEAXEnv = 1;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "ROOM") )
-						  {
-						  pInfos[i].uEAXEnv = 2;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "BATHROOM") )
-						  {
-						  pInfos[i].uEAXEnv = 3;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "LIVINGROOM") )
-						  {
-						  pInfos[i].uEAXEnv = 4;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "AUDITORIUM") )
-						  {
-						  pInfos[i].uEAXEnv = 6;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "CONCERTHALL") )
-						  {
-						  pInfos[i].uEAXEnv = 7;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "HANGAR") )
-						  {
-						  pInfos[i].uEAXEnv = 10;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "CARPETEDHALLWAY") )
-						  {
-						  pInfos[i].uEAXEnv = 11;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "HALLWAY") )
-						  {
-						  pInfos[i].uEAXEnv = 12;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "STONECORRIDOR") )
-						  {
-						  pInfos[i].uEAXEnv = 13;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "ALLEY") )
-						  {
-						  pInfos[i].uEAXEnv = 14;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "QUARRY") )
-						  {
-						  pInfos[i].uEAXEnv = 18;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "PARKINGLOT") )
-						  {
-						  pInfos[i].uEAXEnv = 20;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "SEWERPIPE") )
-						  {
-						  pInfos[i].uEAXEnv = 21;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "DRUGGED") )
-						  {
-						  pInfos[i].uEAXEnv = 23;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "DIZZY") )
-						  {
-						  pInfos[i].uEAXEnv = 24;
-						  break;
-						  }
-					  if ( !strcmp(test_string, "PSYCHOTIC") )
-						  {
-						  pInfos[i].uEAXEnv = 25;
-						  break;
-						  }
-					   pInfos[i].uEAXEnv = 26;
-					
-						  }
-					  break;
-				  }
-			  }
-		  else
-			  { 
-				  break_loop = true;
-			  }
-		  ++decode_step;
-		  test_string=tmp_pos+1;
-		  } while ((decode_step<31)&&!break_loop);
-	  }
- 
-  uNumMaps = 77;
-}
-// 453F62: using guessed type char Str[32];
-
-//----- (004547A3) --------------------------------------------------------
-MAP_TYPE MapStats::GetMapInfo(const char *Str2)
-{
-  assert(uNumMaps >= 2);
-
-  for (uint i = 1; i < uNumMaps; ++i)
-    if (!_stricmp(pInfos[i].pFilename, Str2))
-      return (MAP_TYPE)i;
-
-  assert(false && "Map not found!");
-}
+
 
 //----- (004547E4) --------------------------------------------------------
 void FactionTable::Initialize()
--- a/mm7_5.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/mm7_5.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -1060,33 +1060,6 @@
   }
 }
 
-//----- (00410D99) --------------------------------------------------------
-int __fastcall sub_410D99_get_map_index(int a1)
-{
-  int v1; // edi@1
-  signed int v2; // ebp@1
-  const char **v3; // esi@2
-  char *v4; // ebx@2
-
-  __debugbreak();//Ritor1
-  v1 = a1;
-  v2 = 1;
-  if ( _stricmp(pMapStats->pInfos[1].pFilename, (const char *)&pGames_LOD->pSubIndices[a1]) )
-  {
-    v3 = (const char **)&pMapStats->pInfos[1].pFilename;
-    v4 = (char *)&pMapStats->pInfos[1].pFilename;
-    do
-    {
-      if ( !*(int *)v4 )
-        break;
-      v3 += 17;
-      ++v2;
-      v4 = (char *)v3;
-    }
-    while ( _stricmp(*v3, (const char *)&pGames_LOD->pSubIndices[v1]) );
-  }
-  return v2;
-}
 
 // 4E28F8: using guessed type int pCurrentScreen;
 
--- a/mm7_unsorted_subs.h	Fri Mar 14 09:32:25 2014 +0600
+++ b/mm7_unsorted_subs.h	Fri Mar 14 09:32:42 2014 +0600
@@ -37,7 +37,6 @@
 void __fastcall ZBuffer_DoFill(int *pZBuffer, struct Texture *pTex, int uZValue);
 void __fastcall ZBuffer_DoFill2(int *pZBuffer, struct Texture *a2, int a3); // idb
 void SetMoonPhaseNames();
-int __fastcall sub_410D99_get_map_index(int a1);
 void __fastcall LoadThumbnailLloydTexture(unsigned int uSlot, unsigned int uPlayer);
 void SetAttributeNames();
 void uGameUIFontMain_initialize();
--- a/texts.cpp	Fri Mar 14 09:32:25 2014 +0600
+++ b/texts.cpp	Fri Mar 14 09:32:42 2014 +0600
@@ -6,6 +6,21 @@
 #include "texts.h"
 
 
+std::vector<char*> Tokenize( char* input, const char separator )
+{
+  std::vector<char*> retVect;
+  retVect.push_back(input);
+  while (*input)
+  {
+    if (*input == separator)
+    {
+        *input = '\0';
+        retVect.push_back(input + 1);
+    }
+    ++input;
+  }
+  return retVect;
+}
 
 
 
--- a/texts.h	Fri Mar 14 09:32:25 2014 +0600
+++ b/texts.h	Fri Mar 14 09:32:42 2014 +0600
@@ -1,5 +1,6 @@
 #pragma once
 #include <array>
+#include <vector>
 
 
 int  sprintfex(char *buf, const char *format, ...);
@@ -9,6 +10,7 @@
 char *RemoveQuotes(char *Str);
 void  InitializeGameText();
 
+std::vector<char*> Tokenize(char* input, const char separator);
 
 enum GLOBAL_LOCALIZ_INDEX
 	{