changeset 2259:43a508455445

Adding MapInfo.cpp, moving a few functions there
author Grumpy7
date Tue, 04 Mar 2014 00:02:21 +0100
parents 01d7e9ec51e6
children eab43c3d7767
files Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters Game.cpp MapInfo.cpp MapInfo.h UI/Books/UIMapBook.cpp mm7_2.cpp mm7_5.cpp mm7_unsorted_subs.h
diffstat 8 files changed, 526 insertions(+), 508 deletions(-) [+]
line wrap: on
line diff
--- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters	Mon Mar 03 23:49:23 2014 +0100
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters	Tue Mar 04 00:02:21 2014 +0100
@@ -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/Game.cpp	Mon Mar 03 23:49:23 2014 +0100
+++ b/Game.cpp	Tue Mar 04 00:02:21 2014 +0100
@@ -2987,7 +2987,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 +3002,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;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MapInfo.cpp	Tue Mar 04 00:02:21 2014 +0100
@@ -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	Mon Mar 03 23:49:23 2014 +0100
+++ b/MapInfo.h	Tue Mar 04 00:02:21 2014 +0100
@@ -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/UI/Books/UIMapBook.cpp	Mon Mar 03 23:49:23 2014 +0100
+++ b/UI/Books/UIMapBook.cpp	Tue Mar 04 00:02:21 2014 +0100
@@ -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	Mon Mar 03 23:49:23 2014 +0100
+++ b/mm7_2.cpp	Tue Mar 04 00:02:21 2014 +0100
@@ -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	Mon Mar 03 23:49:23 2014 +0100
+++ b/mm7_5.cpp	Tue Mar 04 00:02:21 2014 +0100
@@ -1060,17 +1060,6 @@
   }
 }
 
-//----- (00410D99) --------------------------------------------------------
-int 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;
-}
 
 // 4E28F8: using guessed type int pCurrentScreen;
 
--- a/mm7_unsorted_subs.h	Mon Mar 03 23:49:23 2014 +0100
+++ b/mm7_unsorted_subs.h	Tue Mar 04 00:02:21 2014 +0100
@@ -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 sub_410D99_get_map_index(int a1);
 void __fastcall LoadThumbnailLloydTexture(unsigned int uSlot, unsigned int uPlayer);
 void SetAttributeNames();
 void uGameUIFontMain_initialize();