changeset 8:1ac6c35cf106

Слияние
author Серик@ПончиК
date Wed, 10 Oct 2012 21:06:27 +0600
parents 1200e31f08e5 (current diff) 2ca04ccb612a (diff)
children fd8c1724b4eb
files
diffstat 31 files changed, 1277 insertions(+), 1253 deletions(-) [+]
line wrap: on
line diff
--- a/Actor.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/Actor.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -237,7 +237,7 @@
 LABEL_17:
   if ( (uDialogue_SpeakingActorNPC_ID & 0x80000000u) != 0 )
     v9 = 4;
-  v11 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)10, v9, 0);
+  v11 = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)10, v9, 0);
   pDialogueWindow = v11;
   if ( v5->uFlags & 0x80 )
   {
--- a/Arcomage.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/Arcomage.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -225,7 +225,7 @@
     TranslateMessage(&pArcomageGame->msg);
     DispatchMessageA(&pArcomageGame->msg);
   }
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
   {
     EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);
     v4 = *((unsigned int *)pAsyncMouse + 7);
@@ -1381,7 +1381,7 @@
     ++v3;
   }
   while ( (signed int)v3 < (signed int)&unk_5052C8 );
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
   {
     pAsyncMouse->_409E3D(*((unsigned char *)pAsyncMouse + 103));
     pAsyncMouse->_46B944();
@@ -5714,7 +5714,7 @@
   int pXY[2]; // [sp+18h] [bp-Ch]@5
   int v10; // [sp+20h] [bp-4h]@3
 
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
     pAsyncMouse->_409E3D(1);
   pAudioPlayer->StopChannels(-1, -1);
   strcpy(pArcomageGame->pPlayer1Name, pArcomagePlayer1Name);
--- a/AudioPlayer.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/AudioPlayer.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -76,7 +76,7 @@
     v2 = 1;
     while ( 1 )
     {
-      if ( v1->pSounds[v2].uType != 1
+      if ( v1->pSounds[v2].eType != SOUND_DESC_SYSTEM
         || (sprintf(pSoundName, "%s", pSounds[v2].pSoundName),
             v1->pSounds[v2].pSoundData[0] = ::LoadSound(pSoundName, (char *)0xFFFFFFFF, pSounds[v2].uSoundID),
             !pAudioPlayer->b3DSoundInitialized)
@@ -367,8 +367,8 @@
   for ( i = 0; i < (signed int)v2->uNumSounds; ++v3 )
   {
     v5 = &v2->pSounds[v3];
-    v6 = v5->uType;
-    if ( v6 != 1 && (a2 || v6 != 4) )
+    v6 = v5->eType;
+    if ( v6 != SOUND_DESC_SYSTEM && (a2 || v6 != SOUND_DESC_LOCK) )
     {
       v7 = v5->pSoundData[0];
       if ( v7 )
@@ -386,32 +386,32 @@
 void SoundList::_4A9DCD(unsigned int uSoundID, char a3)
 {
   unsigned int v3; // esi@1
-  SoundList *v4; // edi@1
+  //SoundList *v4; // edi@1
   SoundDesc *v5; // eax@1
   void *v6; // ecx@8
 
   v3 = uSoundID;
-  v4 = this;
+  //v4 = this;
   v5 = &this->pSounds[uSoundID];
-  if ( v5->uType != 1 )
+  if ( v5->eType != SOUND_DESC_SYSTEM )
   {
     if ( v5->uFlags & 2 && v5->p3DSound && a3 )
     {
       if ( LOBYTE(v5->bDecompressed) )
         AIL_mem_free_lock(v5->p3DSound);
-      v4->pSounds[v3].p3DSound = 0;
-      v4->pSounds[v3].uFlags &= 0xFFFFFFFEu;
+      pSounds[v3].p3DSound = 0;
+      pSounds[v3].uFlags &= 0xFFFFFFFEu;
     }
-    v6 = v4->pSounds[v3].pSoundData[0];
+    v6 = pSounds[v3].pSoundData[0];
     if ( v6 )
     {
       ReleaseSoundData(v6);
-      v4->pSounds[v3].pSoundData[0] = 0;
-      v4->pSounds[v3].uFlags &= 0xFFFFFFFEu;
+      pSounds[v3].pSoundData[0] = 0;
+      pSounds[v3].uFlags &= 0xFFFFFFFEu;
     }
   }
 }
-// 4D830C: using guessed type int __stdcall AIL_mem_free_lock(int);
+
 
 //----- (004A9E3D) --------------------------------------------------------
 void SoundList::ToFile()
@@ -513,18 +513,18 @@
           v13 = v11 == 0;
           v14 = v2->uNumSounds;
           if ( v13 )
-            v12[v14].uType = SOUND_DESC_LOCK;
+            v12[v14].eType = SOUND_DESC_LOCK;
           else
-            v12[v14].uType = SOUND_DESC_LEVEL;
+            v12[v14].eType = SOUND_DESC_LEVEL;
         }
         else
         {
-          v2->pSounds[v2->uNumSounds].uType = SOUND_DESC_SWAP;
+          v2->pSounds[v2->uNumSounds].eType = SOUND_DESC_SWAP;
         }
       }
       else
       {
-        v2->pSounds[v2->uNumSounds].uType = SOUND_DESC_SYSTEM;
+        v2->pSounds[v2->uNumSounds].eType = SOUND_DESC_SYSTEM;
       }
       if ( v19.field_0 >= 4 && !_strcmpi(v19.pProperties[3], "3D") )
       {
@@ -850,7 +850,7 @@
           v71 = &pSoundList->pSounds[v92];
           if ( !v71->pSoundData[0] )
           {
-            if ( v71->uType == 2 )
+            if (v71->eType == SOUND_DESC_SWAP)
               pSoundList->_4A9A67(eSoundID, 0);
           }
         }
@@ -1775,32 +1775,32 @@
 //----- (004AB71F) --------------------------------------------------------
 void AudioPlayer::StopChannels(int uStartChannel, int uEndChannel)
 {
-  AudioPlayer *v3; // esi@1
+  //AudioPlayer *v3; // esi@1
   int v4; // ecx@1
   char *v5; // edi@4
   int v6; // ebx@12
   MixerChannel *pChannel; // edi@14
-  _STREAM *v8; // esi@23
+  //_STREAM *v8; // esi@23
   int v9; // [sp+4h] [bp-4h]@3
 
-  v3 = this;
+  //v3 = this;
   v4 = 0;
-  if ( v3->bPlayerReady )
+  if ( bPlayerReady )
   {
-    if ( v3->b3DSoundInitialized )
+    if ( b3DSoundInitialized )
     {
       v9 = 0;
-      if ( v3->uNum3DSamples > 0 )
+      if ( uNum3DSamples > 0 )
       {
-        v5 = (char *)&v3->p3DSamples[0].field_8;
+        v5 = (char *)&p3DSamples[0].field_8;
         do
         {
           if ( (uStartChannel == -1 || v4 < uStartChannel || v4 > uEndChannel)
             && *(int *)v5
-            && pSoundList->pSounds[*(int *)v5].uType != 1 )
+            && pSoundList->pSounds[*(int *)v5].eType != SOUND_DESC_SYSTEM)
           {
             AIL_end_3D_sample(*((int **)v5 - 2));
-            v3->_4ABF23((AudioPlayer_3DSample *)(v5 - 8));
+            _4ABF23((AudioPlayer_3DSample *)(v5 - 8));
             *((int *)v5 - 1) = 0;
             v4 = v9;
           }
@@ -1808,32 +1808,32 @@
           v5 += 16;
           v9 = v4;
         }
-        while ( v4 < v3->uNum3DSamples );
+        while ( v4 < uNum3DSamples );
       }
     }
     v6 = 0;
-    if ( v3->hDigDriver && v3->uMixerChannels > 0 )
+    if ( hDigDriver && uMixerChannels > 0 )
     {
-      pChannel = v3->pMixerChannels;
+      pChannel = pMixerChannels;
       do
       {
         if ( (uStartChannel == -1 || v6 < uStartChannel || v6 > uEndChannel)
-          && pSoundList->pSounds[pChannel->uSourceTrackIdx].uType != 1 )
+          && pSoundList->pSounds[pChannel->uSourceTrackIdx].eType != SOUND_DESC_SYSTEM)
         {
           AIL_end_sample(pChannel->hSample);
-          v3->_4ABE55(pChannel);
+          _4ABE55(pChannel);
           pChannel->dword_000004 = 0;
         }
         ++v6;
         ++pChannel;
       }
-      while ( v6 < v3->uMixerChannels );
+      while (v6 < uMixerChannels);
     }
-    if ( v3->hSequence )
-      AIL_end_sequence(v3->hSequence);
-    v8 = v3->hStream;
-    if ( v8 )
-      AIL_pause_stream(v8, 1);
+    if (hSequence)
+      AIL_end_sequence(hSequence);
+    //v8 = hStream;
+    if (hStream)
+      AIL_pause_stream(hStream, 1);
   }
 }
 
@@ -2142,7 +2142,7 @@
 void AudioPlayer::_4ABE55(MixerChannel *pChannel)
 {
   int v2; // ebx@1
-  AudioPlayer *v3; // esi@1
+  //AudioPlayer *v3; // esi@1
   SoundDesc *v4; // eax@2
   unsigned __int8 v5; // zf@5
   unsigned __int8 v6; // sf@5
@@ -2158,11 +2158,11 @@
   int v16; // [sp+50h] [bp-4h]@5
 
   v2 = 0;
-  v3 = this;
+  //v3 = this;
   if ( pSoundList->pSounds )
   {
     v4 = &pSoundList->pSounds[pChannel->uSourceTrackIdx];
-    if ( v4->uType == 2 )
+    if ( v4->eType == SOUND_DESC_SWAP)
     {
       if ( v4->pSoundData[0] && !(v4->uFlags & 1) )
       {
@@ -2187,7 +2187,7 @@
           ++v2;
           v7 += 16;
         }
-        while ( v2 < v3->uMixerChannels );
+        while ( v2 < uMixerChannels );
         if ( !v15 )
         {
 LABEL_16:
@@ -2199,10 +2199,10 @@
             {
               v11 = v14[v10];
               v12 = 16 * (v14[v10++] + 47);
-              v3->pMixerChannels[v11].uSourceTrackID = 0;
+              pMixerChannels[v11].uSourceTrackID = 0;
               v13 = __OFSUB__(v10, v16);
               v6 = v10 - v16 < 0;
-              *(unsigned int *)((char *)&v3->bEAXSupported + v12) = 0;
+              *(unsigned int *)((char *)&bEAXSupported + v12) = 0;
             }
             while ( v6 ^ v13 );
           }
@@ -2286,7 +2286,7 @@
 void AudioPlayer::_4ABF23(AudioPlayer_3DSample *a2)
 {
   int v2; // ebx@1
-  AudioPlayer *v3; // esi@1
+  //AudioPlayer *v3; // esi@1
   SoundDesc *v4; // eax@2
   unsigned __int8 v5; // zf@5
   unsigned __int8 v6; // sf@5
@@ -2301,11 +2301,11 @@
   int v15; // [sp+50h] [bp-4h]@5
 
   v2 = 0;
-  v3 = this;
+  //v3 = this;
   if ( pSoundList->pSounds )
   {
     v4 = &pSoundList->pSounds[a2->field_8];
-    if ( v4->uType == 2 )
+    if ( v4->eType == SOUND_DESC_SWAP)
     {
       if ( v4->p3DSound && !(v4->uFlags & 1) )
       {
@@ -2330,7 +2330,7 @@
           ++v2;
           v7 += 16;
         }
-        while ( v2 < v3->uNum3DSamples );
+        while ( v2 < uNum3DSamples );
         if ( !v14 )
         {
 LABEL_16:
@@ -2341,10 +2341,10 @@
             do
             {
               v11 = v13[v10++];
-              *(&v3->bEAXSupported + 4 * (v11 + 2)) = 0;
+              *(&bEAXSupported + 4 * (v11 + 2)) = 0;
               v12 = __OFSUB__(v10, v15);
               v6 = v10 - v15 < 0;
-              v3->p3DSamples[v11].field_8 = 0;
+              p3DSamples[v11].field_8 = 0;
             }
             while ( v6 ^ v12 );
           }
--- a/AudioPlayer.h	Wed Oct 10 21:05:53 2012 +0600
+++ b/AudioPlayer.h	Wed Oct 10 21:06:27 2012 +0600
@@ -55,6 +55,10 @@
 #pragma pack(push, 1)
 struct MixerChannel
 {
+  inline MixerChannel():
+    hSample(nullptr), dword_000004(0), uSourceTrackIdx(0), uSourceTrackID(0)
+  {}
+
   _SAMPLE *hSample;
   int dword_000004;
   unsigned int uSourceTrackIdx;
@@ -95,7 +99,8 @@
 {
   //----- (004A9669) --------------------------------------------------------
   AudioPlayer():
-    bPlayerReady(false)
+    bPlayerReady(false), b3DSoundInitialized(false),
+    hStream(nullptr)
   {
     uMixerChannels = 16;
     field_2D0_time_left = 256;
@@ -197,7 +202,7 @@
 {
   char pSoundName[32];
   unsigned int uSoundID;
-  SOUND_DESC_TYPE uType;
+  SOUND_DESC_TYPE eType;
   int uFlags;
   void *pSoundData[17];
   void *p3DSound;
--- a/CShow.h	Wed Oct 10 21:05:53 2012 +0600
+++ b/CShow.h	Wed Oct 10 21:06:27 2012 +0600
@@ -41,7 +41,7 @@
   char v10; // [sp+4h] [bp-8h]@4
   int a3; // [sp+Bh] [bp-1h]@14
 
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
     pAsyncMouse->Suspend();
   switch ( eVideo )
   {
@@ -100,7 +100,7 @@
   }
   if ( bShowMouseAfterPlayback )
   {
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       pAsyncMouse->Resume();
   }
 }
--- a/DecalBuilder.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/DecalBuilder.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -73,24 +73,28 @@
 //----- (0049B490) --------------------------------------------------------
 bool DecalBuilder::AddBloodsplat(float x, float y, float z, float r, float g, float b, float radius, int a8, int a9)
 {
-  double v10; // ST1C_8@1
+  //double v10; // ST1C_8@1
   char v11; // ST24_1@1
-  double v12; // ST1C_8@1
-  double v13; // ST1C_8@1
+  //double v12; // ST1C_8@1
+  //double v13; // ST1C_8@1
   int a7a; // [sp+40h] [bp+18h]@1
-  float arg14a; // [sp+44h] [bp+1Ch]@1
-  float arg14b; // [sp+44h] [bp+1Ch]@1
-  float arg14c; // [sp+44h] [bp+1Ch]@1
+  //float arg14a; // [sp+44h] [bp+1Ch]@1
+  //float arg14b; // [sp+44h] [bp+1Ch]@1
+  //float arg14c; // [sp+44h] [bp+1Ch]@1
 
-  arg14a = b * 255.0;
+  /*arg14a = b * 255.0;
   v10 = arg14a + 6.7553994e15;
   v11 = LOBYTE(v10);
   arg14b = g * 255.0;
   v12 = arg14b + 6.7553994e15;
   a7a = LODWORD(v12);
   arg14c = r * 255.0;
-  v13 = arg14c + 6.7553994e15;
-  return pBloodsplatContainer->AddBloodsplat(x, y, z, radius, SLOBYTE(v13), a7a, v11);
+  v13 = arg14c + 6.7553994e15;*/
+  return pBloodsplatContainer->AddBloodsplat(x, y, z, radius,
+                                             //SLOBYTE(v13), a7a, v11);
+                                             r * 255.0f,
+                                             g * 255.0f,
+                                             b * 255.0f);
 }
 
 //----- (0049B525) --------------------------------------------------------
--- a/GUIProgressBar.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/GUIProgressBar.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -28,7 +28,7 @@
   char Str1[64]; // [sp+4h] [bp-78h]@16
 
   v2 = this;
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
     pAsyncMouse->Suspend();
   if ( v2->pLoadingBg.pPixels )
     return 0;
@@ -120,7 +120,7 @@
   int v3; // edi@7
 
   v1 = this;
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
     pAsyncMouse->Resume();
   if ( v1->uType == 1 )
   {
--- a/GUIWindow.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/GUIWindow.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -362,7 +362,7 @@
   v1 = this;
   if ( !this )
     return;
-  v2 = this->uWindowType;
+  v2 = this->eWindowType;
   if ( (signed int)v2 > 18 )
   {
     v5 = v2 - 19;
@@ -452,7 +452,7 @@
   v1->pControlsHead = 0;
   v1->pControlsTail = 0;
   v1->uNumControls = 0;
-  v1->uWindowType = 0;
+  v1->eWindowType = WINDOW_null;
   v10 = v1->field_3C;
   v11 = uNumVisibleWindows;
   while ( v10 < v11 )
@@ -2123,11 +2123,11 @@
 
 
 //----- (0041C432) --------------------------------------------------------
-GUIWindow *GUIWindow::Create(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight, unsigned int uWindowType, int a4, int a5)
+GUIWindow *GUIWindow::Create(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight, WindowType eWindowType, int a4, int a5)
 {
   unsigned int uNextFreeWindowID; // ebp@1
-  int *v8; // eax@1
-  GUIWindow *pWindow; // esi@4
+  //int *v8; // eax@1
+  //GUIWindow *pWindow; // esi@4
   int v10; // eax@4
   unsigned int v11; // ebx@15
   NPCData *v12; // ebp@15
@@ -2152,16 +2152,14 @@
   int a4a; // [sp+20h] [bp+10h]@15
 
   uNextFreeWindowID = 0;
-  v8 = (int *)&pWindowList[0].uWindowType;
-  do
+  for (uNextFreeWindowID = 0; uNextFreeWindowID < 20; ++uNextFreeWindowID)
   {
-    if ( !*v8 )
+    if (pWindowList[uNextFreeWindowID].eWindowType == WINDOW_null)
       break;
-    v8 += 21;
-    ++uNextFreeWindowID;
   }
-  while ( (signed int)v8 < (signed int)&pVisibleWindowsIdxs[6] );
-  pWindow = &pWindowList[uNextFreeWindowID];
+
+
+  auto pWindow = &pWindowList[uNextFreeWindowID];
   pWindow->uFrameWidth = uWidth;
   pWindow->uFrameZ = uX + uWidth - 1;
   pWindow->uFrameW = uY + uHeight - 1;
@@ -2172,21 +2170,21 @@
   ++v10;
   pWindow->uFrameY = uY;
   pWindow->uFrameHeight = uHeight;
-  pWindow->uWindowType = uWindowType;
+  pWindow->eWindowType = eWindowType;
   pWindow->field_44 = 0;
   uNumVisibleWindows = v10;
   pWindow->field_3C = v10;
   pVisibleWindowsIdxs[v10] = uNextFreeWindowID + 1;
-  if ( (signed int)uWindowType <= 20 )
+  if ( (signed int)eWindowType <= 20 )
   {
-    if ( uWindowType != 20 )
+    if (eWindowType != WINDOW_Chest)
     {
-      switch ( uWindowType )
+      switch (eWindowType)
       {
-        case 9u:
+        case WINDOW_Book:
           pWindow->InitializeBookView();
           break;
-        case 0xAu:
+        case WINDOW_A:
           dword_506978 = uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions;
           uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 4;
           ptr_5076F4 = pWindow->CreateButton(
@@ -2199,8 +2197,8 @@
                          0x71u,
                          0,
                          0,
-                         pGlobalTXT_LocalizationStrings[79],
-                         (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0),
+                         pGlobalTXT_LocalizationStrings[79], //"Exit"
+                         (Texture *)(uTextureID_506438 != -1 ? &pIcons_LOD->pTextures[uTextureID_506438] : 0),
                          0);
           if ( pWindow->ptr_1C != (void *)1 )
           {
@@ -2211,7 +2209,7 @@
             {
               if ( v12->joins )
               {
-                pWindow->CreateButton(0x1E0u, 0x82u, 0x8Cu, v11, 1, 0, 0x88u, 0xDu, 0, nullstring, 0);
+                pWindow->CreateButton(0x1E0u, 0x82u, 0x8Cu, v11, 1, 0, 0x88u, 0xDu, 0, "", 0);
                 a4a = 1;
               }
               v13 = (void *)v12->bDrawSomeAnim;
@@ -2383,7 +2381,7 @@
             pWindow->_41D08F(a4a, 1, 0, 1);
           }
           break;
-        case 0x11u:
+        case WINDOW_11:
           dword_506978 = uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions;
           uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 17;
           ptr_5076F4 = pWindow->CreateButton(
@@ -2428,11 +2426,11 @@
             0);
           pWindow->CreateButton(8u, 8u, 0x1CCu, 0x158u, 1, 0, 0x5Au, 1u, 0, pWindow->str_48, 0);
           break;
-        case 0x12u:
+        case WINDOW_12:
           InitializeBookTextures();
           pWindow->_411621();
           break;
-        case 0x13u:
+        case WINDOW_13:
           dword_506978 = uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions;
           pKeyActionMap->_459E5A(0, 15, pWindow);
           uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 19;
@@ -2448,7 +2446,7 @@
     pWindow->CreateButton(0, 0, 0, 0, 1, 0, 0xB0u, 0, 9u, nullstring, 0);
     return pWindow;
   }
-  if ( uWindowType == 25 )
+  if (eWindowType == WINDOW_HouseInterior)
   {
     uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 13;
     ptr_5076F4 = pWindow->CreateButton(
@@ -2514,7 +2512,7 @@
   }
   else
   {
-    if ( uWindowType == 26 )
+    if (eWindowType == WINDOW_1A)
     {
       dword_506978 = uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions;
       uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 18;
@@ -2559,7 +2557,7 @@
       pWindow->CreateButton(8u, 8u, 0x1CCu, 0x158u, 1, 0, 0x19Bu, 1u, 0, pWindow->str_48, 0);
       return pWindow;
     }
-    if ( uWindowType == 27 )
+    if (eWindowType == WINDOW_1B)
     {
       pEventTimer->Pause();
       pAudioPlayer->StopChannels(-1, -1);
@@ -2567,9 +2565,9 @@
       ShowStatusBarString(pGlobalTXT_LocalizationStrings[39], 2u);
       return pWindow;
     }
-    if ( uWindowType == 30 )
+    if (eWindowType == WINDOW_1E)
       goto LABEL_62;
-    if ( uWindowType == 31 )
+    if (eWindowType == WINDOW_1F)
     {
       pMouse->SetCursorBitmap("MICON2");
       ptr_5076F4 = pWindow->CreateButton(
--- a/GUIWindow.h	Wed Oct 10 21:05:53 2012 +0600
+++ b/GUIWindow.h	Wed Oct 10 21:06:27 2012 +0600
@@ -30,17 +30,26 @@
 
 
 /*  298 */
-enum WindowType
+enum WindowType: unsigned __int32
 {
-  WINDOW_Credits = 0x1,
+  WINDOW_null = 0,
+  WINDOW_MainMenu = 0x1,
   WINDOW_CharacterRecord = 0x4,
   WINDOW_Options = 0x6,
   WINDOW_Book = 0x9,
+  WINDOW_A = 10,
+  WINDOW_11 = 17,
+  WINDOW_12 = 18,
+  WINDOW_13 = 19,
   WINDOW_Chest = 0x14,
   WINDOW_HouseInterior = 0x19,
+  WINDOW_1A = 26,
+  WINDOW_1B = 27,
+  WINDOW_1E = 30,
+  WINDOW_1F = 31,
   WINDOW_FinalWindow = 0x46,
   WINDOW_KeyMappingOptions = 0x69,
-  WINDOW_VideoOptions = 0x6A,
+  WINDOW_VideoOptions = 0x6A
 };
 
 /*  155 */
@@ -63,7 +72,7 @@
   char _41D3B7();
   char _41D73D_draw_buff_tooltip();
 
-  static GUIWindow *Create(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight, unsigned int uWindowType, int a4, int a5);
+  static GUIWindow *Create(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight, enum WindowType eType, int a4, int a5);
 
   unsigned int uFrameX;
   unsigned int uFrameY;
@@ -71,7 +80,7 @@
   unsigned int uFrameHeight;
   unsigned int uFrameZ;
   unsigned int uFrameW;
-  unsigned int uWindowType;
+  WindowType   eWindowType;
   void *ptr_1C;
   unsigned int uNumControls;
   int field_24;
@@ -100,6 +109,7 @@
   UIMSG_00 = 0x0,
   UIMSG_ChangeGameState = 0x5,
   UIMSG_PlayArcomage = 0x1D,
+  UIMSG_ExitToWindows = 0x39,
   UIMSG_LoadGame = 0x52,
   UIMSG_SaveGame = 0x53,
   UIMSG_ShowStatus_DateTime = 0x5C,
--- a/Game.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/Game.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -51,7 +51,7 @@
   Render *v0; // esi@3
   int _null; // ebx@6
   float v2; // ST24_4@11
-  double v3; // ST28_8@11
+  //double v3; // ST28_8@11
   int v4; // edi@26
   int v5; // eax@35
 
@@ -100,8 +100,9 @@
       if ( pRenderer->pRenderD3D )
       {
         v2 = (double)(((signed int)pMiscTimer->uTotalGameTimeElapsed >> 2) & 0x1F) * 0.032258064 * 6.0;
-        v3 = v2 + 6.7553994e15;
-        pRenderer->field_1036A8_bitmapid = LODWORD(v3);
+        //v3 = v2 + 6.7553994e15;
+        //pRenderer->field_1036A8_bitmapid = LODWORD(v3);
+        pRenderer->field_1036A8_bitmapid = floorf(v2);
       }
 
       if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
@@ -260,7 +261,7 @@
     LOBYTE(dword_6BE364_game_settings_1) = dword_6BE364_game_settings_1 | 0x80;
     dword_6BE340 = 2;
     uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 0;
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       pAsyncMouse->Resume();
     if ( LOBYTE(pGame->pKeyboardInstance->bUsingAsynKeyboard) && pAsyncKeyboard )
       pAsyncKeyboard->Resume();
@@ -292,7 +293,7 @@
         v2->Present();
         continue;
       }
-      if ( pAsyncMouse )
+      if (pAsyncMouse)
         pAsyncMouse->_46B736_consume_click_lists(v3);
       if ( pVideoPlayer->pSmackerMovie && !SmackWait(pVideoPlayer->pSmackerMovie) )
       {
@@ -743,9 +744,9 @@
 {
   struct tagRECT Rect; // [sp+0h] [bp-10h]@6
 
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
     pAsyncMouse->Suspend();
-  if ( LOBYTE(pGame->pKeyboardInstance->bUsingAsynKeyboard) && pAsyncKeyboard )
+  if (pGame->pKeyboardInstance->bUsingAsynKeyboard && pAsyncKeyboard)
     pAsyncKeyboard->Suspend();
   WriteWindowsRegistryInt("startinwindow", pRenderer->bWindowMode);
   if ( GetWindowRect(hWnd, &Rect) && pRenderer->bWindowMode )
@@ -757,10 +758,13 @@
   WriteWindowsRegistryInt("valAlwaysRun", bAlwaysRun);
   pItemsTable->Release();
   pNPCStats->Release();
-  pAsyncKeyboard->Release();
-  pAsyncMouse->Release();
-  if ( pMouse )
+  if (pAsyncKeyboard)
+    pAsyncKeyboard->Release();
+  if (pAsyncMouse)
+    pAsyncMouse->Release();
+  if (pMouse)
     pMouse->Deactivate();
+
   pAudioPlayer->Release();
   pNew_LOD->FreeSubIndexAndIO();
   pGames_LOD->FreeSubIndexAndIO();
@@ -783,12 +787,12 @@
 int Game::_44EC23(stru148 *a2, int *a3, signed int a4)
 {
   double v4; // st7@4
-  double v5; // ST00_8@4
+  //double v5; // ST00_8@4
   signed int v6; // eax@5
-  double v7; // ST00_8@6
+  //double v7; // ST00_8@6
   signed int result; // eax@8
-  double v9; // ST00_8@9
-  double v10; // ST00_8@11
+  //double v9; // ST00_8@9
+  //double v10; // ST00_8@11
   float a2a; // [sp+14h] [bp+8h]@4
   float a3a; // [sp+18h] [bp+Ch]@4
   float a3b; // [sp+18h] [bp+Ch]@6
@@ -801,12 +805,14 @@
     a2a = v4;
     *a3 |= 2u;
     a3a = (1.0 - this->_E28_timed_gamma_strength) * v4;
-    v5 = a3a + 6.7553994e15;
-    if ( SLODWORD(v5) >= 0 )
+    //v5 = a3a + 6.7553994e15;
+    //if ( SLODWORD(v5) >= 0 )
+    if (floorf(a3a) >= 0 )
     {
       a3b = (1.0 - this->_E28_timed_gamma_strength) * a2a;
-      v7 = a3b + 6.7553994e15;
-      v6 = LODWORD(v7);
+      //v7 = a3b + 6.7553994e15;
+      //v6 = LODWORD(v7);
+      v6 = floorf(a3b);
     }
     else
     {
@@ -814,13 +820,15 @@
     }
     if ( a4 >= v6 )
     {
-      a4a = (1.0 - this->_E28_timed_gamma_strength) * a2a;
-      v9 = a4a + 6.7553994e15;
-      if ( SLODWORD(v9) >= 0 )
+      a4a = (1.0 - _E28_timed_gamma_strength) * a2a;
+      //v9 = a4a + 6.7553994e15;
+      //if ( SLODWORD(v9) >= 0 )
+      if (floorf(a4a) >= 0)
       {
-        a4b = (1.0 - this->_E28_timed_gamma_strength) * a2a;
-        v10 = a4b + 6.7553994e15;
-        result = LODWORD(v10);
+        a4b = (1.0 - _E28_timed_gamma_strength) * a2a;
+        //v10 = a4b + 6.7553994e15;
+        //result = LODWORD(v10);
+        result = floorf(a4b);
       }
       else
       {
@@ -861,10 +869,10 @@
   double v4; // st7@3
   double v5; // ST00_8@3
   signed int v6; // eax@4
-  double v7; // ST00_8@5
+  //double v7; // ST00_8@5
   signed int result; // eax@7
   double v9; // ST00_8@8
-  double v10; // ST00_8@10
+  //double v10; // ST00_8@10
   float v11; // [sp+14h] [bp+8h]@3
   float v12; // [sp+18h] [bp+Ch]@3
   float v13; // [sp+18h] [bp+Ch]@5
@@ -881,8 +889,9 @@
     if ( SLODWORD(v5) >= 0 )
     {
       v13 = (1.0 - this->_E28_timed_gamma_strength) * v11;
-      v7 = v13 + 6.7553994e15;
-      v6 = LODWORD(v7);
+      //v7 = v13 + 6.7553994e15;
+      //v6 = LODWORD(v7);
+      v6 = floorf(v13);
     }
     else
     {
@@ -890,13 +899,14 @@
     }
     if ( a4 >= v6 )
     {
-      v14 = (1.0 - this->_E28_timed_gamma_strength) * v11;
+      v14 = (1.0 - _E28_timed_gamma_strength) * v11;
       v9 = v14 + 6.7553994e15;
       if ( SLODWORD(v9) >= 0 )
       {
-        v15 = (1.0 - this->_E28_timed_gamma_strength) * v11;
-        v10 = v15 + 6.7553994e15;
-        result = LODWORD(v10);
+        v15 = (1.0 - _E28_timed_gamma_strength) * v11;
+        //v10 = v15 + 6.7553994e15;
+        //result = LODWORD(v10);
+        result = floorf(v15);
       }
       else
       {
--- a/Indoor.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/Indoor.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -53,16 +53,16 @@
 void __fastcall sub_43F39E(IndoorLocation_drawstru *_this)
 {
   int *v1; // ecx@1
-  double v2; // ST30_8@3
-  double v3; // ST30_8@6
-  double v4; // ST28_8@6
+  //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
+  //unsigned __int8 v11; // [sp+1Ch] [bp-4h]@3
   signed int v12; // [sp+1Ch] [bp-4h]@8
 
   pBLVRenderParams->Set(_this);
@@ -73,24 +73,24 @@
   uNumBillboardsToDraw = 0;
   if ( !byte_4D864C || !(BYTE1(pGame->uFlags) & 0x10) )
   {
-    v2 = pParty->flt_TorchlightColorB + 6.7553994e15;
-    v11 = LOBYTE(v2);
+    //v2 = pParty->flt_TorchlightColorB + 6.7553994e15;
+    //v11 = LOBYTE(v2);
     if ( (signed __int64)pParty->pPartyBuffs[16].uExpireTime <= 0 )
       v5 = 800;
     else
       v5 = 800 * pParty->pPartyBuffs[16].uPower;
     LOBYTE(v1) = byte_4E94D0;
-    v4 = pParty->flt_TorchlightColorR + 6.7553994e15;
-    v3 = pParty->flt_TorchlightColorG + 6.7553994e15;
+    //v4 = pParty->flt_TorchlightColorR + 6.7553994e15;
+    //v3 = pParty->flt_TorchlightColorG + 6.7553994e15;
     pMobileLightsStack->AddLight(
       SLOWORD(pBLVRenderParams->vPartyPos.x),
       SLOWORD(pBLVRenderParams->vPartyPos.y),
       SLOWORD(pBLVRenderParams->vPartyPos.z),
       SLOWORD(pBLVRenderParams->uRadius),
       v5,
-      LOBYTE(v4),
-      LOBYTE(v3),
-      v11,
+      floorf(pParty->flt_TorchlightColorR),
+      floorf(pParty->flt_TorchlightColorG),
+      floorf(pParty->flt_TorchlightColorB),
       v1);
   }
   PrepareWallsRenderList_BLV();
--- a/IndoorCamera.h	Wed Oct 10 21:05:53 2012 +0600
+++ b/IndoorCamera.h	Wed Oct 10 21:06:27 2012 +0600
@@ -10,11 +10,8 @@
   {
     sRotationX = 0;
     sRotationY = 0;
-    __debugbreak();
-    {
-    //LODWORD(flt_1C_fov) = 0x44FA0000u;
-    //LODWORD(flt_20_inv_1C) = 0x4203126Fu;
-    }
+    flt_1C_fov = 2000.0f;
+    flt_20_inv_1C = 32.768002f;
 
     field_4C = 0;
   }
--- a/IndoorCameraD3D.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/IndoorCameraD3D.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -505,12 +505,12 @@
   RenderVertexSoft vert[20]; // [sp+0h] [bp-680h]@1
   RenderVertexD3D3 pD3DVertices[5]; // [sp+3C0h] [bp-2C0h]@15
   RenderVertexSoft a1; // [sp+640h] [bp-40h]@1
-  double v24; // [sp+670h] [bp-10h]@25
-  double v25; // [sp+678h] [bp-8h]@1
+  //double v24; // [sp+670h] [bp-10h]@25
+  //double v25; // [sp+678h] [bp-8h]@1
 
   v7 = this;
   a1.flt_2C = 0.0;
-  HIDWORD(v25) = (int)this;
+  //HIDWORD(v25) = (int)this;
   v8 = (char *)&vert[0].flt_2C;
   v9 = 20;
   do
@@ -640,8 +640,12 @@
         do
         {
           LODWORD(a7) = *((int *)v13 - 3);
-          v25 = a7 + 6.7553994e15;
-          v24 = *((float *)v13 - 4) + 6.7553994e15;
+          //v25 = a7 + 6.7553994e15;
+          auto _v25 = floorf(a7);
+
+          //v24 = *((float *)v13 - 4) + 6.7553994e15;
+          auto _v24 = floorf(*((float *)v13 - 4));
+
           v14 = *(int *)v13;
           v15 = *(int *)v13;
           v16 = (*(int *)v13 >> 3) & 0x1F;
@@ -657,7 +661,7 @@
           }
           v13 += 32;
           --uNumD3DVertices;
-          pRenderer->pTargetSurface[LODWORD(v24) + pRenderer->uTargetSurfacePitch * LODWORD(v25)] = v18 | v16 | (unsigned __int16)v17;
+          pRenderer->pTargetSurface[(uint)_v24 + pRenderer->uTargetSurfacePitch * (uint)_v25] = v18 | v16 | (unsigned __int16)v17;
         }
         while ( uNumD3DVertices );
       }
--- a/LOD.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/LOD.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -1910,34 +1910,34 @@
 //----- (00461954) --------------------------------------------------------
 void LOD::File::AllocSubIndicesAndIO(unsigned int uNumSubIndices, unsigned int uBufferSize)
 {
-  LOD::File *v3; // esi@1
+  //LOD::File *v3; // esi@1
   LOD::Directory *pSubIndices_dup; // eax@3
   char v5; // zf@3
 
-  v3 = this;
-  if ( this->pSubIndices )
+  //v3 = this;
+  if (pSubIndices)
   {
     MessageBoxA(0, "Attempt to reset a LOD subindex!", "MM6", MB_ICONEXCLAMATION);
-    pAllocator->FreeChunk(v3->pSubIndices);
-    v3->pSubIndices = 0;
+    pAllocator->FreeChunk(pSubIndices);
+    pSubIndices = nullptr;
   }
   pSubIndices_dup = (LOD::Directory *)pAllocator->AllocNamedChunk(
-                                      v3->pSubIndices,
+                                      pSubIndices,
                                       32 * uNumSubIndices,
                                       "LODsub");
-  v5 = v3->pIOBuffer == 0;
-  v3->pSubIndices = pSubIndices_dup;
+  v5 = pIOBuffer == 0;
+  pSubIndices = pSubIndices_dup;
   if ( !v5 )
   {
     MessageBoxA(0, "Attempt to reset a LOD IObuffer!", "MM6", MB_ICONEXCLAMATION);
-    pAllocator->FreeChunk(v3->pIOBuffer);
-    v3->pIOBuffer = 0;
-    v3->uIOBufferSize = 0;
+    pAllocator->FreeChunk(pIOBuffer);
+    pIOBuffer = 0;
+    uIOBufferSize = 0;
   }
   if ( uBufferSize )
   {
-    v3->pIOBuffer = (unsigned __int8 *)pAllocator->AllocNamedChunk(v3->pIOBuffer, uBufferSize, "LODio");
-    v3->uIOBufferSize = uBufferSize;
+    pIOBuffer = (unsigned __int8 *)pAllocator->AllocNamedChunk(pIOBuffer, uBufferSize, "LODio");
+    uIOBufferSize = uBufferSize;
   }
 }
 
@@ -2861,7 +2861,7 @@
   strcpy(v8->pName, pContainer);
   if (pRenderer->pRenderD3D && v8->pBits & 2 && dword_011BA8)
   {
-    if ( !pHardwareSurfaces || !pHardwareTextures )
+    if (!pHardwareSurfaces || !pHardwareTextures)
     {
       pHardwareSurfaces = new IDirectDrawSurface *[1000];
       memset(pHardwareSurfaces, 0, 1000 * sizeof(IDirectDrawSurface4 *));
@@ -3108,6 +3108,17 @@
 }
 
 
+Texture *LODFile_IconsBitmaps::LoadTexturePtr(const char *pContainer, enum TEXTURE_TYPE uTextureType)
+{
+  uint id = LoadTexture(pContainer, uTextureType);
+  if (id == -1)
+  {
+    Log::Warning(L"LOD error\\no container: \"%S\"", pContainer);
+    return nullptr;
+  }
+  return &pTextures[id];
+}
+
 //----- (0040FB20) --------------------------------------------------------
 unsigned int LODFile_IconsBitmaps::LoadTexture(const char *pContainer, enum TEXTURE_TYPE uTextureType)
 {
--- a/LOD.h	Wed Oct 10 21:05:53 2012 +0600
+++ b/LOD.h	Wed Oct 10 21:06:27 2012 +0600
@@ -134,6 +134,7 @@
   bool LoadIconsOrEvents(const char *pLODFilename);
   void ReleaseAll();
   unsigned int LoadTexture(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT);
+  Texture *LoadTexturePtr(const char *pContainer, enum TEXTURE_TYPE uTextureType = TEXTURE_DEFAULT);
   int LoadTextureFromLOD(Texture *pOutTex, const char *pContainer, enum TEXTURE_TYPE eTextureType);
   int ReloadTexture(Texture *pDst, const char *pContainer, int mode);
   void ReleaseHardwareTextures();
--- a/LightmapBuilder.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/LightmapBuilder.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -72,9 +72,9 @@
   int arg0; // [sp+2Ch] [bp-40h]@21
   int v29; // [sp+30h] [bp-3Ch]@21
   int v30; // [sp+34h] [bp-38h]@21
-  double v31; // [sp+38h] [bp-34h]@21
-  double v32; // [sp+40h] [bp-2Ch]@21
-  double v33; // [sp+48h] [bp-24h]@21
+  //double v31; // [sp+38h] [bp-34h]@21
+  //double v32; // [sp+40h] [bp-2Ch]@21
+  //double v33; // [sp+48h] [bp-24h]@21
   int v34; // [sp+50h] [bp-1Ch]@24
   LightmapBuilder *thisa; // [sp+54h] [bp-18h]@1
   int v36; // [sp+58h] [bp-14h]@21
@@ -163,15 +163,17 @@
       a6 = v20;
       v36 = v21;
       v37 = v19[20];
-      v33 = a6 + 6.7553994e15;
+      //v33 = a6 + 6.7553994e15;
       a6 = *((float *)v19 + 100) * 255.0;
-      v32 = a6 + 6.7553994e15;
+      //v32 = a6 + 6.7553994e15;
       a6 = *((float *)v19 + 120) * 255.0;
-      v31 = a6 + 6.7553994e15;
-      v38 = __PAIR__(LODWORD(v32), LODWORD(v31));
-      v22 = LODWORD(v31) | ((LODWORD(v32) | (LODWORD(v33) << 8)) << 8);
-      if ( !(LODWORD(v31) | ((LODWORD(v32) | (LODWORD(v33) << 8)) << 8)) )
-        v22 = 0xFFFFFFu;
+      //v31 = a6 + 6.7553994e15;
+      //v38 = __PAIR__(LODWORD(v32), LODWORD(v31));
+      v38 = __PAIR__((int)floorf(a6), (int)floorf(a6));
+      //v22 = LODWORD(v31) | ((LODWORD(v32) | (LODWORD(v33) << 8)) << 8);
+      v22 = (int)floorf(a6) | (((int)floorf(a6) | ((int)floorf(a6) << 8)) << 8);
+      if (!v22)
+        v22 = 0x00FFFFFF;
       v27 = a7;
       v23 = (int)a5;
       v26 = (Vec3_float_ *)a9;
@@ -257,7 +259,7 @@
   float v61; // [sp+24h] [bp-28h]@8
   float v62; // [sp+28h] [bp-24h]@8
   Vec3_float_ a1; // [sp+2Ch] [bp-20h]@8
-  double v64; // [sp+38h] [bp-14h]@8
+  //double v64; // [sp+38h] [bp-14h]@8
   int pLightmapVertices_; // [sp+40h] [bp-Ch]@5
   float v66; // [sp+44h] [bp-8h]@5
   char v67; // [sp+4Bh] [bp-1h]@2
@@ -359,28 +361,31 @@
     a1.z = a5;
     a1.y = v30;
     a1.Normalize();
-    v64 = v62 + 6.7553994e15;
-    LODWORD(a5) = LODWORD(v64);
-    v64 = v61 + 6.7553994e15;
-    arg0c = LODWORD(v64);
-    v64 = v60 + 6.7553994e15;
-    arg8 = LODWORD(v64);
-    HIDWORD(v64) = abs(*(int *)(v25 + 8) - (signed)LODWORD(a5));
+    //v64 = v62 + 6.7553994e15;
+    //LODWORD(a5) = LODWORD(v64);
+    LODWORD(a5) = floorf(v62);
+    //v64 = v61 + 6.7553994e15;
+    //arg0c = LODWORD(v64);
+    arg0c = floorf(v61);
+    //v64 = v60 + 6.7553994e15;
+    //arg8 = LODWORD(v64);
+    arg8 = floorf(v60);
+    auto v64 /*HIDWORD(v64)*/ = abs(*(int *)(v25 + 8) - (signed)LODWORD(a5));
     arg0a = abs(*(int *)(v25 + 4) - arg0c);
     v31 = abs(*(int *)v25 - arg8);
     LODWORD(a5) = v31;
     v32 = arg0a;
-    v33 = HIDWORD(v64);
+    v33 = v64;//HIDWORD(v64);
     if ( v31 < arg0a )
     {
       v34 = v31;
       v31 = arg0a;
       v32 = v34;
     }
-    if ( v31 < SHIDWORD(v64) )
+    if ( v31 < v64)//SHIDWORD(v64) )
     {
       v35 = v31;
-      v31 = HIDWORD(v64);
+      v31 = v64;//HIDWORD(v64);
       v33 = v35;
     }
     if ( v32 < (signed int)v33 )
@@ -806,7 +811,7 @@
   char v21; // c2@12
   char v22; // c3@12
   signed int v23; // [sp+10h] [bp-4h]@2
-  float pLighta; // [sp+1Ch] [bp+8h]@13
+  //float pLighta; // [sp+1Ch] [bp+8h]@13
   signed int a2a; // [sp+20h] [bp+Ch]@4
 
   v7 = pLight;
@@ -841,8 +846,8 @@
     stru_F8AD28._blv_lights_rs[*pSlot] = (double)pLight->uLightColorR * 0.0039215689;
     stru_F8AD28._blv_lights_gs[*pSlot] = (double)pLight->uLightColorG * 0.0039215689;
     stru_F8AD28._blv_lights_bs[*pSlot] = (double)pLight->uLightColorB * 0.0039215689;
-    pLighta = v13;
-    stru_F8AD28._blv_lights_light_dot_faces[*pSlot] = abs(COERCE_UNSIGNED_INT64(pLighta + 6.7553994e15));
+    //pLighta = v13;
+    stru_F8AD28._blv_lights_light_dot_faces[*pSlot] = abs((int)floorf(v13));//COERCE_UNSIGNED_INT64(pLighta + 6.7553994e15));
     result = (BLVFace *)*pSlot;
     stru_F8AD28._blv_lights_smthngs[(*pSlot)++] = v7->field_B;
     LOBYTE(result) = 1;
@@ -1035,16 +1040,20 @@
 
   v7 = a5;
   LODWORD(a5) = *(unsigned int *)(LODWORD(a5) + 8);
-  v24 = a5 + 6.7553994e15;
-  v26 = LODWORD(v24);
+  //v24 = a5 + 6.7553994e15;
+  v26 = floorf(a5);//LODWORD(v24);
   LODWORD(a5) = *(unsigned int *)(LODWORD(v7) + 4);
-  v24 = a5 + 6.7553994e15;
+  //v24 = a5 + 6.7553994e15;
+  auto _v24 = floorf(a5);
   LODWORD(a5) = *(unsigned int *)LODWORD(v7);
-  v23 = a5 + 6.7553994e15;
-  *(_QWORD *)((char *)&v24 + 4) = __PAIR__(LODWORD(v24), LODWORD(v23));
+  //v23 = a5 + 6.7553994e15;
+  auto _v23 = floorf(a5);
+  //*(_QWORD *)((char *)&v24 + 4) = __PAIR__(LODWORD(v24), LODWORD(v23));
   v26 = abs((signed)LODWORD(a1.z) - v26);
-  v25 = abs((signed)LODWORD(a1.y) - (signed)LODWORD(v24));
-  v8 = abs((int)a1.x - (signed)LODWORD(v23));
+  //v25 = abs((signed)LODWORD(a1.y) - (signed)LODWORD(v24));
+  //v8 = abs((int)a1.x - (signed)LODWORD(v23));
+  v25 = abs((signed)LODWORD(a1.y) - (signed)_v24);
+  v8 = abs((int)a1.x - (signed)_v23);
   LODWORD(a5) = v8;
   v9 = v25;
   v10 = v26;
@@ -1548,8 +1557,8 @@
   float v17; // ST04_4@17
   double v18; // st7@17
   int result; // eax@19
-  double v20; // ST14_8@20
-  double v21; // ST14_8@20
+  //double v20; // ST14_8@20
+  //double v21; // ST14_8@20
   double v22; // st7@20
   int v23; // ecx@20
   double v24; // st6@20
@@ -1633,11 +1642,13 @@
     else
     {
       a5a = ((double)a1->field_A - v15->field_2C) * v15->field_4 + v15->field_24 - 0.5;
-      v20 = a5a + 6.7553994e15;
-      a5b = (double)SLODWORD(v20);
+      //v20 = a5a + 6.7553994e15;
+      //a5b = (double)SLODWORD(v20);
+      a5b = (double)floorf(a5a);
       a1a = ((double)a1->field_A - *(float *)(v14 + 44)) * *(float *)(v14 + 4) + *(float *)(v14 + 36) + 0.5;
-      v21 = a1a + 6.7553994e15;
-      v22 = (double)SLODWORD(v21);
+      //v21 = a1a + 6.7553994e15;
+      //v22 = (double)SLODWORD(v21);
+      v22 = (double)floorf(a1a);
       result = v9->field_8;
       v23 = v9->field_C;
       v24 = -((a3a - a2a) / (v22 - a5b));
@@ -1985,17 +1996,22 @@
     v30 = a1->field_C10 & 0xFFi64;
     a1b = BYTE2(a1->field_C10);
     v7 = arg4;
-    v31 = v6;
+    //v31 = v6;
     *((float *)&v30 + 1) = (double)v30 * v4->flt_C14;
     a1c = (double)a1b * v4->flt_C14 * arg4->x;
-    v29 = a1c + 6.7553994e15;
-    arg4a = LODWORD(v29);
-    a1d = v31 * v7->y;
+    //v29 = a1c + 6.7553994e15;
+    //arg4a = LODWORD(v29);
+    arg4a = floorf(a1c);
+
+    a1d = v6 * v7->y;
     v29 = a1d + 6.7553994e15;
     LODWORD(v31) = LODWORD(v29);
+
     a1e = *((float *)&v30 + 1) * v7->z;
+
     v29 = a1e + 6.7553994e15;
     HIDWORD(v30) = LODWORD(v29);
+
     v8 = uCurrentlyLoadedLevelType;
     v9 = LODWORD(v29) | ((LODWORD(v31) | (arg4a << 8)) << 8);
     if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
--- a/Mouse.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/Mouse.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -25,7 +25,7 @@
 {
   unsigned int v3; // eax@2
 
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
   {
     *pX = *((int *)pAsyncMouse + 6);
     v3 = *((int *)pAsyncMouse + 7);
@@ -41,11 +41,8 @@
 //----- (004698A6) --------------------------------------------------------
 void Mouse::RemoveHoldingItem()
 {
-  Mouse *v1; // esi@1
-
-  v1 = this;
   pParty->pPickedItem.Reset();
-  if ( _strcmpi(v1->pCurrentCursorName, "MICON2") )
+  if (strcmpi(pCurrentCursorName, "MICON2"))
     SetCursorBitmap("MICON1");
 }
 
@@ -109,7 +106,7 @@
     v3 = LoadCursorA(GetModuleHandleW(nullptr), "Arrow");
     SetClassLongA(hWnd, GCL_HCURSOR, (LONG)v3);
     v4 = (int)pAsyncMouse;
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
     {
       v10 = 0.0;
       v5 = 0.0;
@@ -125,7 +122,7 @@
     v7 = (LONG)LoadCursorA(GetModuleHandleW(nullptr), "Target");
     SetClassLongA(hWnd, -12, v7);
     v4 = (int)pAsyncMouse;
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
     {
       v10 = 14.0;
       v5 = 14.0;
@@ -157,7 +154,7 @@
 
   v1 = this;
   this->field_8 = 1;
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
   {
     v2 = *((int *)pAsyncMouse + 6);
     Point.x = *((int *)pAsyncMouse + 6);
@@ -175,7 +172,7 @@
   v1->uMouseClickY = result;
   if ( pRenderer->bWindowMode )
     goto LABEL_16;
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
     goto LABEL_24;
   if ( v2 < 0 )
     v2 = 0;
@@ -187,7 +184,7 @@
   {
     result = 479;
 LABEL_16:
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       goto LABEL_24;
     if ( pRenderer->bWindowMode && (v2 < 0 || result < 0 || v2 > 639 || result > 479) )
       goto LABEL_23;
@@ -253,7 +250,7 @@
 
   v2 = pAsyncMouse;
   result = a2;
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
   {
     a2->x = *((int *)pAsyncMouse + 6);
     v4 = *((int *)v2 + 7);
@@ -475,7 +472,7 @@
            pItemsTable->pItems[pParty->pPickedItem.uItemID].pIconName,
            TEXTURE_16BIT_PALETTE);
     v3 = (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0);
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
     {
       v4 = *((int *)pAsyncMouse + 6);
       v5 = *((int *)pAsyncMouse + 7);
@@ -612,10 +609,10 @@
 //----- (00465C2C) --------------------------------------------------------
 void AsyncMouse::Release()
 {
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
   {
     pAsyncMouse->Suspend();
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       (**(void (__stdcall ***)(int))pAsyncMouse)(1);
   }
   pAsyncMouse = 0;
--- a/NPC.h	Wed Oct 10 21:05:53 2012 +0600
+++ b/NPC.h	Wed Oct 10 21:06:27 2012 +0600
@@ -1,6 +1,18 @@
 #pragma once
 
 
+struct NPCTopic
+{
+  const char *pTopic;
+  const char *pText;
+};
+
+extern NPCTopic pNPCTopics[789];
+
+
+
+
+
 /*  136 */
 #pragma pack(push, 1)
 struct NPCData
@@ -65,6 +77,10 @@
 #pragma pack(push, 1)
 struct NPCStats
 {
+  inline NPCStats():
+    pNPCTextTXT_Raw(nullptr), pNPCTopicTXT_Raw(nullptr), pNPCDistTXT_Raw(nullptr)
+  {}
+
   void Initialize2();
   void Initialize1();
   void Initialize();
--- a/Player.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/Player.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -7649,7 +7649,7 @@
               if ( v36 != 13 )
               {
 LABEL_178:
-                if ( pGUIWindow_CurrentMenu && pGUIWindow_CurrentMenu->uWindowType )
+                if ( pGUIWindow_CurrentMenu && pGUIWindow_CurrentMenu->eWindowType != WINDOW_null)
                 {
                   if ( !v73 )
                     goto LABEL_187;
@@ -7740,7 +7740,7 @@
     }
     if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions
       && pGUIWindow_CurrentMenu
-      && pGUIWindow_CurrentMenu->uWindowType
+      && pGUIWindow_CurrentMenu->eWindowType != WINDOW_null
       && (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
     {
       pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113;
--- a/Render.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/Render.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -5485,10 +5485,10 @@
     {
       if ( v1->field_40110 )
       {
-        if ( pAsyncMouse )
+        if (pAsyncMouse)
           pAsyncMouse->_46BAEC();
         pRenderD3D->Present(0);
-        if ( pAsyncMouse )
+        if (pAsyncMouse)
           pAsyncMouse->_46BB0A();
       }
     }
@@ -6463,7 +6463,7 @@
   result = pSurface->Lock(0, pDesc, uLockFlags, 0);
   if ( result == DDERR_SURFACELOST )
   {
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       pAsyncMouse->Suspend();
     v6 = v4->Restore();
     if ( v6 )
@@ -6493,7 +6493,7 @@
     if ( pRenderer->pRenderD3D )
       pRenderD3D->HandleLostResources();
     result = pRenderer->pDirectDraw4->RestoreAllSurfaces();
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       pAsyncMouse->Resume();
   }
   else
@@ -8759,7 +8759,7 @@
   //HWLTexture *pHWLTexture; // esi@1
   //signed int result; // eax@1
   //IDirectDrawSurface **v9; // ebx@9
-  IDirectDrawSurface4 *v10; // edi@11
+  //IDirectDrawSurface4 *v10; // edi@11
   //int v11; // ebx@11
   HRESULT v12; // eax@14
   unsigned __int16 *v13; // ecx@19
@@ -8767,9 +8767,9 @@
   DWORD v15; // edx@20
   HRESULT v16; // eax@23
   stru350 Dst; // [sp+Ch] [bp-F8h]@12
-  DDSURFACEDESC2 desc; // [sp+6Ch] [bp-98h]@13
-  DDSCAPS2 v19; // [sp+E8h] [bp-1Ch]@13
-  int v20; // [sp+100h] [bp-4h]@12
+  //DDSURFACEDESC2 desc; // [sp+6Ch] [bp-98h]@13
+  //DDSCAPS2 v19; // [sp+E8h] [bp-1Ch]@13
+  //int v20; // [sp+100h] [bp-4h]@12
 
   auto pHWLTexture = pD3DBitmaps.LoadTexture(pName, bMipMaps);
   if ( pHWLTexture )
@@ -8784,50 +8784,60 @@
             bMipMaps,
             uMinDeviceTextureDim) )
       Abortf("HiScreen16::LoadTexture - D3Drend->CreateTexture() failed: %x", 0);
-    v10 = *pOutSurface;
+    //v10 = *pOutSurface;
     //v11 = 0;
     if ( bMipMaps )
     {
       Dst._450DDE();
-      v20 = 0;
-      Dst._450DF1((const char *)dword_4EFCBC, (const char *)dword_4EFCBC);
+      //v20 = 0;
+      Dst._450DF1(&stru_4EFCBC, &stru_4EFCBC);
+
+      IDirectDrawSurface4 *pNextSurf = *pOutSurface;
       while ( 1 )
       {
-        memset(&v19, 0, 0x10u);
-        v19.dwCaps = 0x401000u;                 // DDSCAPS_TEXTURE |  DDSCAPS_MIPMAP
-        memset(&desc, 0, 0x7Cu);
-        desc.dwSize = 124;
-        if ( LockSurface_DDraw4(v10, &desc, 0x21u) )
+        DDSCAPS2 v19;
+        memset(&v19, 0, sizeof(DDSCAPS2));
+        v19.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_MIPMAP;
+
+        DDSURFACEDESC2 desc;
+        memset(&desc, 0, sizeof(DDSURFACEDESC2));
+        desc.dwSize = sizeof(DDSURFACEDESC2);
+
+        if ( LockSurface_DDraw4(pNextSurf, &desc, 0x21u) )
         {
           Dst.sub_451007_scale_image_bicubic(
-            (int)pHWLTexture->pPixels,
+            pHWLTexture->pPixels,
             pHWLTexture->uWidth,
             pHWLTexture->uHeight,
             pHWLTexture->uWidth,
-            (signed int)desc.lpSurface,
+            (unsigned short *)desc.lpSurface,
             desc.dwWidth,
             desc.dwHeight,
             desc.lPitch >> 1,
             0,
             0);
-          ErrD3D(v10->Unlock(0));
-          bMipMaps = 0x4D86ACu;
-        }
-        if ( v10->GetAttachedSurface(&v19, (LPDIRECTDRAWSURFACE4 *)&pName) )
+          ErrD3D(pNextSurf->Unlock(0));
+          //bMipMaps = 0x4D86ACu;
+        }
+        if (FAILED(pNextSurf->GetAttachedSurface(&v19, &pNextSurf)))
           break;
-        v10 = (IDirectDrawSurface4 *)pName;
+        //v10 = (IDirectDrawSurface4 *)pName;
         //v11 = 0;
       }
-      v20 = -1;
+      //v20 = -1;
       //nullsub_1();
     }
     else
     {
-      memset(&v19, 0, 0x10u);
-      v19.dwCaps = DDSCAPS_TEXTURE |  DDSCAPS_MIPMAP;
-      memset(&desc, 0, 0x7Cu);
-      desc.dwSize = 124;
-      if ( LockSurface_DDraw4(v10, &desc, 0x21u) )
+        DDSCAPS2 v19;
+        memset(&v19, 0, sizeof(DDSCAPS2));
+        v19.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_MIPMAP;
+
+        DDSURFACEDESC2 desc;
+        memset(&desc, 0, sizeof(DDSURFACEDESC2));
+        desc.dwSize = sizeof(DDSURFACEDESC2);
+
+      if ( LockSurface_DDraw4(*pOutSurface, &desc, 0x21u) )
       {
         bMipMaps = 0;
         v13 = pHWLTexture->pPixels;
@@ -8853,11 +8863,11 @@
           }
           while ( bMipMaps < desc.dwHeight );
         }
-        ErrD3D(v10->Unlock(0));
-      }
-    }
-    free(pHWLTexture->pPixels);
-    free(pHWLTexture);
+        ErrD3D((*pOutSurface)->Unlock(0));
+      }
+    }
+    delete [] pHWLTexture->pPixels;
+    delete pHWLTexture;
     return true;
   }
   return false;
@@ -10972,7 +10982,7 @@
       pMiscTimer->Resume();
     pAsyncMouse->Release();
     CreateAsyncMouse();
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       pAsyncMouse->Clip();
   }
 }
@@ -11021,14 +11031,6 @@
 //----- (004524D8) --------------------------------------------------------
 HWLTexture *RenderHWLContainer::LoadTexture(const char *pName, int bMipMaps)
 {
-  //RenderHWLContainer *v3; // esi@1
-  unsigned int v4; // eax@1
-  int v5; // ebx@2
-  int v6; // edi@3
-  //HWLTexture *result; // eax@8
-  //HWLTexture *pTex; // edi@9
-  //char *v9; // ebx@9
-  //unsigned __int16 *v10; // eax@9
   int v11; // eax@13
   int v12; // ecx@13
   void *v13; // eax@13
@@ -11042,60 +11044,68 @@
   int v21; // ecx@16
   int v22; // eax@16
   int v23; // esi@16
-  //char Str1[20]; // [sp+Ch] [bp-28h]@1
-  unsigned int pSource; // [sp+20h] [bp-14h]@10
   unsigned __int16 *v26; // [sp+24h] [bp-10h]@13
   int v27; // [sp+28h] [bp-Ch]@14
   int v28; // [sp+2Ch] [bp-8h]@13
-  unsigned int DstBuf; // [sp+30h] [bp-4h]@9
-  int pDesta; // [sp+3Ch] [bp+8h]@2
-  void *pDestc; // [sp+3Ch] [bp+8h]@10
   int pDestb; // [sp+3Ch] [bp+8h]@15
 
   //v3 = this;
   //sprintf(Str1, "%s", pName);
-  v4 = uNumItems;
-  if ( v4 && (v5 = 0, pDesta = uNumItems, (signed int)v4 > 0) )
-  {
-    while ( 1 )
-    {
-      v6 = v5 + (pDesta - v5) / 2;
-      if ( !_strcmpi(pName, pSpriteNames[v6]) )
-        break;
-      if ( _strcmpi(pName, pSpriteNames[v6]) <= 0 )
-        pDesta = v5 + (pDesta - v5) / 2;
-      else
-        v5 = v6 + 1;
-      if ( v5 >= pDesta )
-        return false;
-    }
-    fseek(pFile, pSpriteOffsets[v6], SEEK_SET);
+  //v4 = uNumItems;
+  if (!uNumItems)
+    return nullptr;
+
+  //{
+  //v5 = 0, pDesta = uNumItems;
+  uint idx1 = 0,
+       idx2 = uNumItems;
+  while (true)
+  {
+    auto i = idx1 + (idx2 - idx1) / 2;
+
+    auto res = strcmpi(pName, pSpriteNames[i]);
+    if (!res)
+    {
+      fseek(pFile, pSpriteOffsets[i], SEEK_SET);
+      break;
+    }
+    else if (res < 0)
+      idx2 = idx1 + (idx2 - idx1) / 2;
+    else
+      idx1 = i + 1;
+
+    if ( idx1 >= idx2 )
+      return false;
+  }
+
+
+  uint uCompressedSize = 0;
+  fread(&uCompressedSize, 4, 1, pFile);
 
     auto pTex = new HWLTexture;
-    fread(&DstBuf, 4u, 1u, pFile);
-    fread(&pTex->field_18, 4u, 1u, pFile);
-    fread(&pTex->field_1C, 4u, 1u, pFile);
-    fread(&pTex->field_20, 4u, 1u, pFile);
-    fread(&pTex->field_24, 4u, 1u, pFile);
-    //v9 = (char *)&pTex->uWidth;
-    fread(&pTex->uWidth, 4u, 1u, pFile);
-    fread(&pTex->uHeight, 4u, 1u, pFile);
-    fread(&pTex->field_30, 4u, 1u, pFile);
-    fread(&pTex->field_34, 4u, 1u, pFile);
-    //v10 = new unsigned __int16[pTex->uWidth * pTex->uHeight];
+    fread(&pTex->field_18, 4, 1, pFile);
+    fread(&pTex->field_1C, 4, 1, pFile);
+    fread(&pTex->field_20, 4, 1, pFile);
+    fread(&pTex->field_24, 4, 1, pFile);
+    fread(&pTex->uWidth, 4, 1, pFile);
+    fread(&pTex->uHeight, 4, 1, pFile);
+    fread(&pTex->field_30, 4, 1, pFile);
+    fread(&pTex->field_34, 4, 1, pFile);
+
     pTex->pPixels = new unsigned __int16[pTex->uWidth * pTex->uHeight];
-    if ( DstBuf )
-    {
-      pDestc = new char[DstBuf];
-      fread(pDestc, 1u, DstBuf, pFile);
-      pSource = 2 * pTex->uWidth * pTex->uHeight;
-      zlib::MemUnzip(pTex->pPixels, &pSource, pDestc, DstBuf);
-      delete [] pDestc;
+    if (uCompressedSize)
+    {
+      auto pCompressedData = new char[uCompressedSize];
+      {
+        fread(pCompressedData, 1, uCompressedSize, pFile);
+        auto uDecompressedSize = pTex->uWidth * pTex->uHeight * sizeof(short);
+        zlib::MemUnzip(pTex->pPixels, &uDecompressedSize, pCompressedData, uCompressedSize);
+      }
+      delete [] pCompressedData;
     }
     else
-    {
       fread(pTex->pPixels, 2, pTex->uWidth * pTex->uHeight, pFile);
-    }
+
     if ( field_61A94_scale_hwls_to_half )
     {
       v11 = pTex->uHeight / 2;
@@ -11142,12 +11152,12 @@
     }
     return pTex;
     //result = pTex;
-  }
-  else
-  {
+//  }
+//  else
+//  {
 //LABEL_8:
-    return nullptr;
-  }
+//    return nullptr;
+//  }
 }
 
 //----- (0045271F) --------------------------------------------------------
--- a/Render.h	Wed Oct 10 21:05:53 2012 +0600
+++ b/Render.h	Wed Oct 10 21:06:27 2012 +0600
@@ -116,6 +116,11 @@
 #pragma pack(push, 1)
 struct HWLTexture
 {
+  inline HWLTexture():
+    field_0(0), field_4(0), field_8(0),
+    field_C(0), field_10(0), field_14(0)
+  {}
+
   int field_0;
   int field_4;
   int field_8;
--- a/Texture.h	Wed Oct 10 21:05:53 2012 +0600
+++ b/Texture.h	Wed Oct 10 21:06:27 2012 +0600
@@ -331,19 +331,32 @@
 
 
 
+struct stru355
+{
+  int field_0;
+  int field_4;
+  int field_8;
+  int field_C;
+  int field_10;
+  int field_14;
+  int field_18;
+  int field_1C;
+};
 
 /*  390 */
 #pragma pack(push, 1)
 struct stru350
 {
   stru350 *_450DDE();
-  void    *_450DF1(const char *Src, const char *a3);
+  bool _450DF1(const stru355 *p1, const stru355 *p2);
   unsigned int _450F55(int a2);
   int _450FB1(int a2);
-  int sub_451007_scale_image_bicubic(int a2, signed int a3, signed int a4, int a5, signed int a6, signed int a7, signed int a8, int a9, int a10, int a11);
+  int sub_451007_scale_image_bicubic(unsigned short *pSrc, int srcWidth, int srcHeight, int srcPitch,
+                                     unsigned short *pDst, int dstWidth, int dstHeight, int dstPitch,
+                                     int a9, int a10);
 
-  int field_0[8];
-  int array_20[8];
+  stru355 field_0;
+  stru355 field_20;
   int field_40;
   int field_44;
   int field_48;
--- a/VideoPlayer.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/VideoPlayer.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -1130,7 +1130,7 @@
     if ( EnterHouse((enum HOUSE_TYPE)165) )
     {
       pAudioPlayer->PlaySound(SOUND_0, 0, 0, -1, 0, 0, 0, 0);
-      ptr_507BC0 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_HouseInterior, 165, 0);
+      ptr_507BC0 = GUIWindow::Create(0, 0, 640, 480, WINDOW_HouseInterior, 165, 0);
       ptr_507BC0->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 1u, 0x31u, nullstring, 0);
       ptr_507BC0->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 2u, 0x32u, nullstring, 0);
       ptr_507BC0->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 3u, 0x33u, nullstring, 0);
--- a/mm7_1.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/mm7_1.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -1569,7 +1569,7 @@
   {
     while ( 2 )
     {
-      v4 = (GUIWindow *)&pWindowList_at_506F50_minus1_indexing[21 * pVisibleWindowsIdxs[v2]];
+      v4 = &pWindowList[pVisibleWindowsIdxs[v2] - 1];
       for ( result = v4->pControlsHead; result; result = result->pNext )
       {
         if ( result->uHotkey == v3 )
@@ -1619,14 +1619,16 @@
     for ( i = uNumVisibleWindows; i >= 0; --i )
     {
       result = 84 * pVisibleWindowsIdxs[i];
-      for ( j = *(GUIButton **)((char *)pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_ + result); j; j = j->pNext )
+      //for ( j = *(GUIButton **)((char *)pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_ + result); j; j = j->pNext )
+      for ( j = pWindowList[pVisibleWindowsIdxs[i] - 1].pControlsHead; j; j = j->pNext )
         j->field_28 = 0;
     }
   }
   for ( k = uNumVisibleWindows; k >= 0; --k )
   {
     result = 84 * pVisibleWindowsIdxs[k];
-    for ( l = *(GUIButton **)((char *)pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_ + result); l; l = l->pNext )
+    //for ( l = *(GUIButton **)((char *)pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_ + result); l; l = l->pNext )
+    for ( l = pWindowList[pVisibleWindowsIdxs[k] - 1].pControlsHead; l; l = l->pNext )
     {
       LOBYTE(result) = v10;
       if ( l->uHotkey == v10 )
@@ -1671,7 +1673,7 @@
   pFontCreate->field_3 = 0;
 
   for (uint i = 0; i < 20; ++i)
-    pWindowList[i].uWindowType = 0;
+    pWindowList[i].eWindowType = WINDOW_null;
 
   uNumVisibleWindows = -1;
   memset(pVisibleWindowsIdxs, 0, sizeof(pVisibleWindowsIdxs));
@@ -1753,7 +1755,8 @@
   uTextureID_BUTTYES2 = pIcons_LOD->LoadTexture("BUTTYES2", TEXTURE_16BIT_PALETTE);
   uTextureID_BUTTMAKE = pIcons_LOD->LoadTexture("BUTTMAKE", TEXTURE_16BIT_PALETTE);
   uTextureID_BUTTMAKE2 = pIcons_LOD->LoadTexture("BUTTMAKE2", TEXTURE_16BIT_PALETTE);
-  pGUIWindow0 = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Credits, 0, 0);
+
+  pGUIWindow0 = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, 0);
   pGUIWindow0->CreateButton(7u, 8u, 0x1CCu, 0x157u, 1, 0, 0xAu, 0, 0, nullstring, 0);
   pGUIWindow0->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0x28u, 2, 94, 0x6Eu, 1u, 0x31u, nullstring, 0);
   pGUIWindow0->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0x28u, 2, 94, 0x6Eu, 2u, 0x32u, nullstring, 0);
@@ -3922,7 +3925,7 @@
   char v4; // al@17
   bool v5; // eax@21
   GUIButton Dst; // [sp+8h] [bp-DCh]@19
-  double v7; // [sp+C4h] [bp-20h]@17
+  //double v7; // [sp+C4h] [bp-20h]@17
   float v8; // [sp+CCh] [bp-18h]@17
   __int64 v9; // [sp+D0h] [bp-14h]@17
   unsigned int v10; // [sp+D8h] [bp-Ch]@9
@@ -3973,11 +3976,11 @@
     }
     v9 = v3;
     v8 = (double)v3 * 0.001953125 * 120.0;
-    v7 = v8 + 6.7553994e15;
-    HIDWORD(v9) = LODWORD(v7);
-    v4 = LOBYTE(v7) + 1;
-    byte_4E2BC8 = LOBYTE(v7) + 1;
-    if ( (unsigned __int8)(LOBYTE(v7) + 1) >= 0x78u )
+    //v7 = v8 + 6.7553994e15;
+    HIDWORD(v9) = floorf(v8);//LODWORD(v7);
+    v4 = (int)floorf(v8) % 256 + 1;//LOBYTE(v7) + 1;
+    byte_4E2BC8 = v4;
+    if ( (unsigned __int8)(v4) >= 0x78u )
     {
       v4 = 1;
       byte_4E2BC8 = 1;
@@ -5077,7 +5080,7 @@
           if ( !v25 )
           {
             if ( v23->IsInteractive() )
-              v26 = (const char *)dword_722240[2 * stru_5E4C90.field_0[v24->field_1C]];
+              v26 = pNPCTopics[stru_5E4C90.field_0[v24->field_1C] + 379].pTopic;
             else
               v26 = pDecorationList->pDecorations[v24->uDecorationDescID].field_20;
             goto LABEL_87;
@@ -5365,7 +5368,7 @@
   bRingsShownInCharScreen = 0;
   CharacterUI_LoadPaperdollTextures();
   uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = v1;
-  v2 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_CharacterRecord, uActiveCharacter, 0);
+  v2 = GUIWindow::Create(0, 0, 640, 480, WINDOW_CharacterRecord, uActiveCharacter, 0);
   pCharacterScreen_StatsBtn = v2->CreateButton(
                                 pViewport->uViewportX + 12,
                                 pViewport->uViewportY + 308,
@@ -5474,7 +5477,7 @@
   bRingsShownInCharScreen = 0;
   CharacterUI_LoadPaperdollTextures();
   uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 23;
-  v2 = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_HouseInterior|WINDOW_Options, v1, 0);
+  v2 = GUIWindow::Create(0, 0, 640, 480, (WindowType)(WINDOW_HouseInterior|WINDOW_Options), v1, 0);
   ptr_50767C = v2->CreateButton(
                  394u,
                  318u,
--- a/mm7_2.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/mm7_2.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -546,7 +546,7 @@
     {
       v65 = pFontArrus;
       pOutString = pFontArrus;
-      strcpy(pTmpBuf, pStr_72217C);
+      strcpy(pTmpBuf, pNPCTopics[354].pText);
       v78.uFrameWidth = 460;
       v78.uFrameZ = 452;
       v62 = v65->CalcTextHeight(pTmpBuf, &v78, 12, 0) + 7;
@@ -596,7 +596,7 @@
         v66 = (174 - pFontArrus->CalcTextHeight(v26, &v79, 0, 0)) / 2 + 138;
         goto LABEL_98;
       }
-      strcpy(pTmpBuf, *(const char **)&dword_721E24[8 * (unsigned int)ptr_507BC0->ptr_1C]);
+      strcpy(pTmpBuf, pNPCTopics[(uint)ptr_507BC0->ptr_1C + 247].pText);
       v78.uFrameWidth = 460;
       v78.uFrameZ = 452;
       v61 = pFontArrus->CalcTextHeight(pTmpBuf, &v78, 12, 0);
@@ -3132,7 +3132,7 @@
 // 50C9DC: using guessed type int dword_50C9DC;
 
 //----- (004BBA85) --------------------------------------------------------
-int __cdecl sub_4BBA85_bounties()
+const char *sub_4BBA85_bounties()
 {
   int v0; // edi@1
   signed __int64 v1; // qax@2
@@ -3142,11 +3142,11 @@
   __int16 v5; // ax@14
   char v6; // zf@14
   Player *v7; // ebx@16
-  int result; // eax@19
+  const char *result; // eax@19
 
   uDialogueType = 83;
   pDialogueWindow->Release();
-  pDialogueWindow = GUIWindow::Create(0, 0, 640u, 350u, WINDOW_Credits, 0, 0);
+  pDialogueWindow = GUIWindow::Create(0, 0, 640, 350, WINDOW_MainMenu, 0, 0);
   ptr_5076F4 = pDialogueWindow->CreateButton(
                  471u,
                  445u,
@@ -3158,7 +3158,7 @@
                  0,
                  0,
                  pGlobalTXT_LocalizationStrings[34],// "Cancel"
-                 (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0),
+                 (Texture *)(uTextureID_506438 != -1 ? &pIcons_LOD->pTextures[uTextureID_506438] : 0),
                  0);
   pDialogueWindow->CreateButton(0, 0, 0, 0, 1, 0, 0x51u, 0, 0, nullstring, 0);
   pDialogueWindow->CreateButton(480u, 160u, 140u, 30u, 1, 0, 0, 0x53u, 0, nullstring, 0);
@@ -3193,9 +3193,9 @@
   if ( v6 )
   {
     v6 = v5 == 0;
-    result = dword_722164;
+    result = pNPCTopics[351].pText;
     if ( v6 )
-      result = dword_722174;
+      result = pNPCTopics[353].pText;
   }
   else
   {
@@ -3213,16 +3213,11 @@
       pParty->field_750[v4] = 0;
       pParty->field_75A[v4] = 0;
     }
-    result = dword_72216C;
+    result = pNPCTopics[352].pText;
   }
   dword_F8B1A4 = (char *)result;
   return result;
 }
-// 722164: using guessed type int dword_722164;
-// 72216C: using guessed type int dword_72216C;
-// 722174: using guessed type int dword_722174;
-// F8B19C: using guessed type int dword_F8B19C;
-// F8B1A0: using guessed type __int16 word_F8B1A0;
 
 //----- (004BBCDD) --------------------------------------------------------
 void __cdecl sub_4BBCDD()
@@ -3698,7 +3693,7 @@
 GUIButton *__cdecl sub_4BCA33()
 {
   pDialogueWindow->Release();
-  pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x159u, WINDOW_Credits, 0, 0);
+  pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x159u, WINDOW_MainMenu, 0, 0);
   ptr_5076F4 = pDialogueWindow->CreateButton(
                  0x1D7u,
                  0x1BDu,
@@ -3814,12 +3809,12 @@
   {
 LABEL_9:
     pDialogueWindow->Release();
-    pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x159u, WINDOW_Credits, v1, v1);
+    pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x159u, WINDOW_MainMenu, v1, v1);
     ptr_5076F4 = pDialogueWindow->CreateButton(
-                   526u,
-                   445u,
-                   75u,
-                   33u,
+                   526,
+                   445,
+                   75,
+                   33,
                    1,
                    v1,
                    0x71u,
@@ -4081,9 +4076,9 @@
           {
             v1 = 0;
             v27 = v26 == v13;
-            v29 = dword_722164;
+            v29 = (int)pNPCTopics[351].pText;
             if ( v27 )
-              v29 = dword_722174;
+              v29 = (int)pNPCTopics[353].pText;
             dword_F8B1A4 = (char *)v29;
           }
           else
@@ -4103,7 +4098,7 @@
               pParty->field_75A[v25] = v13;
             }
             v1 = 0;
-            dword_F8B1A4 = (char *)dword_72216C;
+            dword_F8B1A4 = pNPCTopics[352].pText;
           }
           goto LABEL_196;
         }
@@ -4121,12 +4116,12 @@
     switch ( v55 )
     {
       case 96:
-        pDialogueWindow->uWindowType = 1;
+        pDialogueWindow->eWindowType = WINDOW_MainMenu;
         sub_4BCA33();
         sub_4B3703((void *)dword_F8B198);
         break;
       case 101:
-        pDialogueWindow->uWindowType = 1;
+        pDialogueWindow->eWindowType = WINDOW_MainMenu;
         sub_4BCA33();
         sub_4B3A72(dword_F8B198);
         break;
@@ -4203,7 +4198,7 @@
             {
               if ( v55 == 94 )
               {
-                pDialogueWindow->uWindowType = 1;
+                pDialogueWindow->eWindowType = WINDOW_MainMenu;
                 sub_4BCA33();
                 sub_4B3AD4(dword_F8B198);
               }
@@ -5115,7 +5110,7 @@
   pRenderer->EndScene();
   free(_this.pPixels);
   _this.pPixels = 0;
-  ptr_507BC0 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_Credits, 0, 0);
+  ptr_507BC0 = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, 0);
   pWindow.uFrameX = 75;
   pWindow.uFrameY = 60;
   pWindow.uFrameWidth = 469;
@@ -6120,12 +6115,14 @@
 
 
 //----- (00451007) --------------------------------------------------------
-int stru350::sub_451007_scale_image_bicubic(int a2, signed int a3, signed int a4, int a5, signed int a6, signed int a7, signed int a8, int a9, int a10, int a11)
-{
-  signed int v11; // esi@1
-  signed int result; // eax@1
-  signed int v13; // edi@8
-  signed int v14; // ecx@10
+int stru350::sub_451007_scale_image_bicubic(unsigned short *pSrc, int srcWidth, int srcHeight, int srcPitch,
+                                            unsigned short *pDst, int dstWidth, int dstHeight, int dstPitch,
+                                            int a10, int a11)
+{
+  int v11; // esi@1
+  int result; // eax@1
+  int v13; // edi@8
+  int v14; // ecx@10
   double v15; // st7@11
   double v16; // st6@11
   float v17; // ST3C_4@12
@@ -6135,9 +6132,9 @@
   int v21; // eax@18
   unsigned int v22; // ecx@25
   unsigned int v23; // eax@29
-  signed int v24; // ecx@29
-  signed int v25; // edi@33
-  signed int v26; // ecx@35
+  unsigned __int16 *v24; // ecx@29
+  int v25; // edi@33
+  int v26; // ecx@35
   double v27; // st7@36
   double v28; // st6@36
   float v29; // ST34_4@37
@@ -6146,10 +6143,10 @@
   int v32; // eax@41
   int v33; // eax@43
   unsigned int v34; // ecx@50
-  __int16 v35; // ax@54
-  signed int v36; // ecx@54
-  signed int v37; // edi@58
-  signed int v38; // ecx@60
+  unsigned __int16 v35; // ax@54
+  unsigned __int16 *v36; // ecx@54
+  int v37; // edi@58
+  int v38; // ecx@60
   double v39; // st7@61
   double v40; // st6@61
   float v41; // ST34_4@62
@@ -6159,9 +6156,9 @@
   int v45; // eax@68
   unsigned int v46; // ecx@75
   char v47; // al@79
-  signed int v48; // ecx@79
-  signed int v49; // edi@86
-  signed int v50; // ecx@88
+  unsigned __int16 *v48; // ecx@79
+  int v49; // edi@86
+  int v50; // ecx@88
   double v51; // st7@89
   double v52; // st6@89
   float v53; // ST34_4@90
@@ -6171,9 +6168,9 @@
   int v57; // eax@96
   unsigned int v58; // ecx@103
   unsigned int v59; // eax@107
-  signed int v60; // ecx@107
-  signed int v61; // edi@111
-  signed int v62; // ecx@113
+  unsigned __int16 *v60; // ecx@107
+  int v61; // edi@111
+  int v62; // ecx@113
   double v63; // st7@114
   double v64; // st6@114
   float v65; // ST34_4@115
@@ -6182,10 +6179,10 @@
   int v68; // eax@119
   int v69; // eax@121
   unsigned int v70; // ecx@128
-  __int16 v71; // ax@132
-  signed int v72; // ecx@132
-  signed int v73; // edi@136
-  signed int v74; // ecx@138
+  unsigned __int16 v71; // ax@132
+  unsigned __int16 *v72; // ecx@132
+  int v73; // edi@136
+  int v74; // ecx@138
   double v75; // st7@139
   double v76; // st6@139
   float v77; // ST34_4@140
@@ -6195,9 +6192,9 @@
   int v81; // eax@146
   unsigned int v82; // ecx@153
   char v83; // al@157
-  signed int v84; // ecx@157
-  signed int v85; // edi@164
-  signed int v86; // ecx@166
+  unsigned __int16 *v84; // ecx@157
+  int v85; // edi@164
+  int v86; // ecx@166
   double v87; // st7@167
   double v88; // st6@167
   float v89; // ST34_4@168
@@ -6208,9 +6205,9 @@
   int v94; // eax@173
   unsigned int v95; // ecx@181
   unsigned int v96; // eax@185
-  signed int v97; // ecx@185
-  signed int v98; // edi@189
-  signed int v99; // ecx@191
+  unsigned __int16 *v97; // ecx@185
+  int v98; // edi@189
+  int v99; // ecx@191
   double v100; // st7@192
   double v101; // st6@192
   float v102; // ST34_4@193
@@ -6220,10 +6217,10 @@
   int v106; // eax@196
   int v107; // eax@198
   unsigned int v108; // ecx@206
-  __int16 v109; // ax@210
-  signed int v110; // ecx@210
-  signed int v111; // edi@214
-  signed int v112; // ecx@216
+  unsigned __int16 v109; // ax@210
+  unsigned __int16 *v110; // ecx@210
+  int v111; // edi@214
+  int v112; // ecx@216
   double v113; // st7@217
   double v114; // st6@217
   float v115; // ST34_4@218
@@ -6234,12 +6231,13 @@
   int v120; // eax@223
   unsigned int v121; // ecx@231
   char v122; // al@235
-  signed int v123; // ecx@235
+  unsigned __int16 *v123; // ecx@235
   double v124; // [sp+Ch] [bp-7Ch]@12
   double v125; // [sp+Ch] [bp-7Ch]@37
   double v126; // [sp+Ch] [bp-7Ch]@62
   double v127; // [sp+Ch] [bp-7Ch]@90
-  double v128; // [sp+Ch] [bp-7Ch]@115
+  //double v128; // [sp+Ch] [bp-7Ch]@115
+  uint _v128;
   double v129; // [sp+Ch] [bp-7Ch]@140
   double v130; // [sp+Ch] [bp-7Ch]@168
   double v131; // [sp+Ch] [bp-7Ch]@193
@@ -6248,7 +6246,8 @@
   double v134; // [sp+14h] [bp-74h]@37
   double v135; // [sp+14h] [bp-74h]@62
   double v136; // [sp+14h] [bp-74h]@90
-  double v137; // [sp+14h] [bp-74h]@115
+  //double v137; // [sp+14h] [bp-74h]@115
+  uint _v137;
   double v138; // [sp+14h] [bp-74h]@140
   double v139; // [sp+14h] [bp-74h]@168
   double v140; // [sp+14h] [bp-74h]@193
@@ -6257,7 +6256,8 @@
   double v143; // [sp+1Ch] [bp-6Ch]@37
   double v144; // [sp+1Ch] [bp-6Ch]@62
   double v145; // [sp+1Ch] [bp-6Ch]@90
-  double v146; // [sp+1Ch] [bp-6Ch]@115
+  //double v146; // [sp+1Ch] [bp-6Ch]@115
+  uint _v146;
   double v147; // [sp+1Ch] [bp-6Ch]@140
   double v148; // [sp+1Ch] [bp-6Ch]@168
   double v149; // [sp+1Ch] [bp-6Ch]@193
@@ -6266,7 +6266,8 @@
   double v152; // [sp+24h] [bp-64h]@37
   double v153; // [sp+24h] [bp-64h]@62
   double v154; // [sp+24h] [bp-64h]@90
-  double v155; // [sp+24h] [bp-64h]@115
+  //double v155; // [sp+24h] [bp-64h]@115
+  uint _v155;
   double v156; // [sp+24h] [bp-64h]@140
   double v157; // [sp+24h] [bp-64h]@168
   double v158; // [sp+24h] [bp-64h]@193
@@ -6286,43 +6287,43 @@
   int v172; // [sp+48h] [bp-40h]@91
   int v173; // [sp+48h] [bp-40h]@116
   int v174; // [sp+48h] [bp-40h]@141
-  int v175; // [sp+4Ch] [bp-3Ch]@13
+  unsigned __int16 *v175; // [sp+4Ch] [bp-3Ch]@13
   int *v176; // [sp+50h] [bp-38h]@15
   int *v177; // [sp+50h] [bp-38h]@40
   int *v178; // [sp+50h] [bp-38h]@65
   int *v179; // [sp+50h] [bp-38h]@93
   int *v180; // [sp+50h] [bp-38h]@118
   int *v181; // [sp+50h] [bp-38h]@143
-  int v182; // [sp+50h] [bp-38h]@169
-  int v183; // [sp+50h] [bp-38h]@194
-  int v184; // [sp+50h] [bp-38h]@219
-  int v185; // [sp+54h] [bp-34h]@38
-  int v186; // [sp+54h] [bp-34h]@63
-  int v187; // [sp+54h] [bp-34h]@91
-  int v188; // [sp+54h] [bp-34h]@116
-  int v189; // [sp+54h] [bp-34h]@141
+  char *v182; // [sp+50h] [bp-38h]@169
+  char *v183; // [sp+50h] [bp-38h]@194
+  char *v184; // [sp+50h] [bp-38h]@219
+  unsigned __int16 *v185; // [sp+54h] [bp-34h]@38
+  unsigned __int16 *v186; // [sp+54h] [bp-34h]@63
+  unsigned __int16 *v187; // [sp+54h] [bp-34h]@91
+  unsigned __int16 *v188; // [sp+54h] [bp-34h]@116
+  unsigned __int16 *v189; // [sp+54h] [bp-34h]@141
   signed int v190; // [sp+54h] [bp-34h]@170
   signed int v191; // [sp+54h] [bp-34h]@195
   signed int v192; // [sp+54h] [bp-34h]@220
-  signed int v193; // [sp+5Ch] [bp-2Ch]@7
-  signed int v194; // [sp+5Ch] [bp-2Ch]@32
-  signed int v195; // [sp+5Ch] [bp-2Ch]@57
-  signed int v196; // [sp+5Ch] [bp-2Ch]@85
-  signed int v197; // [sp+5Ch] [bp-2Ch]@110
-  signed int v198; // [sp+5Ch] [bp-2Ch]@135
-  signed int v199; // [sp+5Ch] [bp-2Ch]@163
-  signed int v200; // [sp+5Ch] [bp-2Ch]@188
-  signed int v201; // [sp+5Ch] [bp-2Ch]@213
-  stru350 *v202; // [sp+60h] [bp-28h]@1
-  signed int v203; // [sp+64h] [bp-24h]@12
-  signed int v204; // [sp+64h] [bp-24h]@37
-  signed int v205; // [sp+64h] [bp-24h]@62
-  signed int v206; // [sp+64h] [bp-24h]@90
-  signed int v207; // [sp+64h] [bp-24h]@115
-  signed int v208; // [sp+64h] [bp-24h]@140
-  signed int v209; // [sp+64h] [bp-24h]@168
-  signed int v210; // [sp+64h] [bp-24h]@193
-  signed int v211; // [sp+64h] [bp-24h]@218
+  unsigned __int16 *v193; // [sp+5Ch] [bp-2Ch]@7
+  unsigned __int16 *v194; // [sp+5Ch] [bp-2Ch]@32
+  unsigned __int16 *v195; // [sp+5Ch] [bp-2Ch]@57
+  unsigned __int16 *v196; // [sp+5Ch] [bp-2Ch]@85
+  unsigned __int16 *v197; // [sp+5Ch] [bp-2Ch]@110
+  unsigned __int16 *v198; // [sp+5Ch] [bp-2Ch]@135
+  unsigned __int16 *v199; // [sp+5Ch] [bp-2Ch]@163
+  unsigned __int16 *v200; // [sp+5Ch] [bp-2Ch]@188
+  unsigned __int16 *v201; // [sp+5Ch] [bp-2Ch]@213
+  //stru350 *v202; // [sp+60h] [bp-28h]@1
+  int v203; // [sp+64h] [bp-24h]@12
+  int v204; // [sp+64h] [bp-24h]@37
+  int v205; // [sp+64h] [bp-24h]@62
+  int v206; // [sp+64h] [bp-24h]@90
+  int v207; // [sp+64h] [bp-24h]@115
+  int v208; // [sp+64h] [bp-24h]@140
+  int v209; // [sp+64h] [bp-24h]@168
+  int v210; // [sp+64h] [bp-24h]@193
+  int v211; // [sp+64h] [bp-24h]@218
   float v212; // [sp+6Ch] [bp-1Ch]@11
   float v213; // [sp+6Ch] [bp-1Ch]@36
   float v214; // [sp+6Ch] [bp-1Ch]@61
@@ -6372,52 +6373,52 @@
   unsigned int v258; // [sp+84h] [bp-4h]@168
   unsigned int v259; // [sp+84h] [bp-4h]@193
   unsigned int v260; // [sp+84h] [bp-4h]@218
-  signed int v261; // [sp+A0h] [bp+18h]@10
-  float v262; // [sp+A0h] [bp+18h]@12
-  float v263; // [sp+A0h] [bp+18h]@12
-  unsigned int v264; // [sp+A0h] [bp+18h]@12
-  signed int v265; // [sp+A0h] [bp+18h]@35
-  float v266; // [sp+A0h] [bp+18h]@37
-  float v267; // [sp+A0h] [bp+18h]@37
-  unsigned int v268; // [sp+A0h] [bp+18h]@37
-  signed int v269; // [sp+A0h] [bp+18h]@60
-  float v270; // [sp+A0h] [bp+18h]@62
-  float v271; // [sp+A0h] [bp+18h]@62
-  unsigned int v272; // [sp+A0h] [bp+18h]@62
-  signed int v273; // [sp+A0h] [bp+18h]@88
-  float v274; // [sp+A0h] [bp+18h]@90
-  float v275; // [sp+A0h] [bp+18h]@90
-  unsigned int v276; // [sp+A0h] [bp+18h]@90
-  signed int v277; // [sp+A0h] [bp+18h]@113
-  float v278; // [sp+A0h] [bp+18h]@115
-  float v279; // [sp+A0h] [bp+18h]@115
-  unsigned int v280; // [sp+A0h] [bp+18h]@115
-  signed int v281; // [sp+A0h] [bp+18h]@138
-  float v282; // [sp+A0h] [bp+18h]@140
-  float v283; // [sp+A0h] [bp+18h]@140
-  unsigned int v284; // [sp+A0h] [bp+18h]@140
-  signed int v285; // [sp+A0h] [bp+18h]@166
-  float v286; // [sp+A0h] [bp+18h]@168
-  float v287; // [sp+A0h] [bp+18h]@168
-  unsigned int v288; // [sp+A0h] [bp+18h]@168
-  signed int v289; // [sp+A0h] [bp+18h]@191
-  float v290; // [sp+A0h] [bp+18h]@193
-  float v291; // [sp+A0h] [bp+18h]@193
-  unsigned int v292; // [sp+A0h] [bp+18h]@193
-  signed int v293; // [sp+A0h] [bp+18h]@216
-  float v294; // [sp+A0h] [bp+18h]@218
-  float v295; // [sp+A0h] [bp+18h]@218
-  unsigned int v296; // [sp+A0h] [bp+18h]@218
-  int v297; // [sp+ACh] [bp+24h]@8
-  int v298; // [sp+ACh] [bp+24h]@33
-  int v299; // [sp+ACh] [bp+24h]@86
-  int v300; // [sp+ACh] [bp+24h]@111
-  int v301; // [sp+ACh] [bp+24h]@164
-  int v302; // [sp+ACh] [bp+24h]@189
+  signed int a6a; // [sp+A0h] [bp+18h]@10
+  float a6s; // [sp+A0h] [bp+18h]@12
+  float a6t; // [sp+A0h] [bp+18h]@12
+  unsigned int a6b; // [sp+A0h] [bp+18h]@12
+  signed int a6c; // [sp+A0h] [bp+18h]@35
+  float a6u; // [sp+A0h] [bp+18h]@37
+  float a6v; // [sp+A0h] [bp+18h]@37
+  unsigned int a6d; // [sp+A0h] [bp+18h]@37
+  signed int a6e; // [sp+A0h] [bp+18h]@60
+  float a6w; // [sp+A0h] [bp+18h]@62
+  float a6x; // [sp+A0h] [bp+18h]@62
+  unsigned int a6f; // [sp+A0h] [bp+18h]@62
+  signed int a6g; // [sp+A0h] [bp+18h]@88
+  float a6y; // [sp+A0h] [bp+18h]@90
+  float a6z; // [sp+A0h] [bp+18h]@90
+  unsigned int a6h; // [sp+A0h] [bp+18h]@90
+  signed int a6i; // [sp+A0h] [bp+18h]@113
+  float a6ba; // [sp+A0h] [bp+18h]@115
+  float a6bb; // [sp+A0h] [bp+18h]@115
+  unsigned int a6j; // [sp+A0h] [bp+18h]@115
+  signed int a6k; // [sp+A0h] [bp+18h]@138
+  float a6bc; // [sp+A0h] [bp+18h]@140
+  float a6bd; // [sp+A0h] [bp+18h]@140
+  unsigned int a6l; // [sp+A0h] [bp+18h]@140
+  signed int a6m; // [sp+A0h] [bp+18h]@166
+  float a6be; // [sp+A0h] [bp+18h]@168
+  float a6bf; // [sp+A0h] [bp+18h]@168
+  unsigned int a6n; // [sp+A0h] [bp+18h]@168
+  signed int a6o; // [sp+A0h] [bp+18h]@191
+  float a6bg; // [sp+A0h] [bp+18h]@193
+  float a6bh; // [sp+A0h] [bp+18h]@193
+  unsigned int a6p; // [sp+A0h] [bp+18h]@193
+  signed int a6q; // [sp+A0h] [bp+18h]@216
+  float a6bi; // [sp+A0h] [bp+18h]@218
+  float a6bj; // [sp+A0h] [bp+18h]@218
+  unsigned int a6r; // [sp+A0h] [bp+18h]@218
+  int a9a; // [sp+ACh] [bp+24h]@8
+  int a9b; // [sp+ACh] [bp+24h]@33
+  int a9c; // [sp+ACh] [bp+24h]@86
+  int a9d; // [sp+ACh] [bp+24h]@111
+  int a9e; // [sp+ACh] [bp+24h]@164
+  int a9f; // [sp+ACh] [bp+24h]@189
 
   v11 = 0;
-  result = this->field_0[3];
-  v202 = this;
+  result = this->field_0.field_C;
+  //v202 = this;
   v230 = 0;
   if ( result != 8 )
   {
@@ -6425,47 +6426,47 @@
     {
       if ( result != 32 )
         return result;
-      result = this->array_20[3];
+      result = this->field_20.field_C;
       if ( result != 8 )
       {
         if ( result != 16 )
         {
-          if ( result != 32 || (result = a6, v193 = a6, v231 = 0, a8 <= 0) )
+          if ( result != 32 || (result = (int)pDst, v193 = pDst, v231 = 0, dstHeight <= 0) )
             return result;
-          v13 = a7;
-          v297 = 4 * (a9 - a7);
+          v13 = dstWidth;
+          a9a = 4 * (dstPitch - dstWidth);
           while ( 1 )
           {
             v14 = 0;
-            v261 = 0;
-            if ( a7 > v11 )
+            a6a = 0;
+            if ( dstWidth > v11 )
               break;
 LABEL_30:
-            v193 += v297;
+            v193 = (unsigned __int16 *)((char *)v193 + a9a);
             ++v231;
             result = v231;
-            if ( v231 >= a8 )
+            if ( v231 >= dstHeight )
               return result;
             v11 = 0;
           }
-          v221 = (double)a7;
-          v212 = (double)a3;
-          v15 = (double)a8;
-          v16 = (double)a4;
+          v221 = (double)dstWidth;
+          v212 = (double)srcWidth;
+          v15 = (double)dstHeight;
+          v16 = (double)srcHeight;
           while ( 1 )
           {
-            v262 = (double)v261 / v221 * v212;
-            v151 = v262 + 6.7553994e15;
+            a6s = (double)a6a / v221 * v212;
+            v151 = floorf(a6s);//a6s + 6.7553994e15;
             v203 = v14 + 1;
-            v263 = (double)(v14 + 1) / v221 * v212;
-            v142 = v263 + 6.7553994e15;
+            a6t = (double)(v14 + 1) / v221 * v212;
+            v142 = floorf(a6t);//a6t + 6.7553994e15;
             v17 = (double)v231 / v15 * v16;
-            v133 = v17 + 6.7553994e15;
+            v133 = floorf(v17);//v17 + 6.7553994e15;
             v18 = (double)(v231 + 1) / v15 * v16;
-            v124 = v18 + 6.7553994e15;
+            v124 = floorf(v18);//v18 + 6.7553994e15;
             v19 = (LODWORD(v124) - LODWORD(v133)) * (LODWORD(v142) - LODWORD(v151));
             v252 = 0;
-            v264 = 0;
+            a6b = 0;
             v240 = 0i64;
             if ( SLODWORD(v133) < SLODWORD(v124) )
               break;
@@ -6473,27 +6474,27 @@
             v22 = (unsigned int)v240 / ((LODWORD(v124) - LODWORD(v133)) * (LODWORD(v142) - LODWORD(v151)));
             if ( v19 )
             {
-              v264 /= v19;
+              a6b /= v19;
               v252 /= v19;
               HIDWORD(v240) /= v19;
             }
             if ( v22 != 255 )
               v22 &= 0x7FFFFFFFu;
-            v23 = v202->_450F55(HIDWORD(v240) | ((v252 | ((v264 | (v22 << 8)) << 8)) << 8));
+            v23 = _450F55(HIDWORD(v240) | ((v252 | ((a6b | (v22 << 8)) << 8)) << 8));
             v24 = v193;
-            v193 += 4;
-            *(int *)v24 = v23;
+            v193 += 2;
+            *(_DWORD *)v24 = v23;
             v14 = v203;
-            v261 = v203;
-            if ( v203 >= a7 )
+            a6a = v203;
+            if ( v203 >= dstWidth )
               goto LABEL_30;
           }
           v160 = LODWORD(v124) - LODWORD(v133);
-          v175 = a2 + 4 * (LODWORD(v151) + a5 * LODWORD(v133));
+          v175 = &pSrc[2 * (LODWORD(v151) + srcPitch * LODWORD(v133))];
           while ( SLODWORD(v151) >= SLODWORD(v142) )
           {
 LABEL_24:
-            v175 += 4 * a5;
+            v175 += 2 * srcPitch;
             --v160;
             if ( !v160 )
               goto LABEL_25;
@@ -6508,7 +6509,7 @@
               v230 = 1;
               v13 = v20 != a11 ? 0xFF : 0;
             }
-            v21 = v202->_450FB1(v20);
+            v21 = _450FB1(v20);
             if ( !v230 )
               break;
             LODWORD(v240) = v13 + v240;
@@ -6524,50 +6525,50 @@
           }
           LODWORD(v240) = ((unsigned int)v21 >> 24) + v240;
 LABEL_22:
-          v264 += BYTE2(v21);
+          a6b += BYTE2(v21);
           v252 += BYTE1(v21);
           HIDWORD(v240) += (unsigned __int8)v21;
           goto LABEL_23;
         }
-        result = a6;
-        v194 = a6;
+        result = (int)pDst;
+        v194 = pDst;
         v232 = 0;
-        if ( a8 <= 0 )
+        if ( dstHeight <= 0 )
           return result;
-        v25 = a7;
-        v298 = 2 * (a9 - a7);
+        v25 = dstWidth;
+        a9b = 2 * (dstPitch - dstWidth);
         while ( 1 )
         {
           v26 = 0;
-          v265 = 0;
-          if ( a7 > v11 )
+          a6c = 0;
+          if ( dstWidth > v11 )
             break;
 LABEL_55:
-          v194 += v298;
+          v194 = (unsigned __int16 *)((char *)v194 + a9b);
           ++v232;
           result = v232;
-          if ( v232 >= a8 )
+          if ( v232 >= dstHeight )
             return result;
           v11 = 0;
         }
-        v222 = (double)a7;
-        v213 = (double)a3;
-        v27 = (double)a8;
-        v28 = (double)a4;
+        v222 = (double)dstWidth;
+        v213 = (double)srcWidth;
+        v27 = (double)dstHeight;
+        v28 = (double)srcHeight;
         while ( 1 )
         {
-          v266 = (double)v265 / v222 * v213;
-          v125 = v266 + 6.7553994e15;
+          a6u = (double)a6c / v222 * v213;
+          v125 = a6u + 6.7553994e15;
           v204 = v26 + 1;
-          v267 = (double)(v26 + 1) / v222 * v213;
-          v134 = v267 + 6.7553994e15;
+          a6v = (double)(v26 + 1) / v222 * v213;
+          v134 = a6v + 6.7553994e15;
           v29 = (double)v232 / v27 * v28;
           v143 = v29 + 6.7553994e15;
           v30 = (double)(v232 + 1) / v27 * v28;
           v152 = v30 + 6.7553994e15;
           v31 = (LODWORD(v152) - LODWORD(v143)) * (LODWORD(v134) - LODWORD(v125));
           v253 = 0;
-          v268 = 0;
+          a6d = 0;
           v241 = 0i64;
           if ( SLODWORD(v143) < SLODWORD(v152) )
             break;
@@ -6575,27 +6576,27 @@
           v34 = (unsigned int)v241 / ((LODWORD(v152) - LODWORD(v143)) * (LODWORD(v134) - LODWORD(v125)));
           if ( v31 )
           {
-            v268 /= v31;
+            a6d /= v31;
             v253 /= v31;
             HIDWORD(v241) /= v31;
           }
           if ( v34 != 255 )
             v34 &= 0x7FFFFFFFu;
-          v35 = v202->_450F55(HIDWORD(v241) | ((v253 | ((v268 | (v34 << 8)) << 8)) << 8));
+          v35 = _450F55(HIDWORD(v241) | ((v253 | ((a6d | (v34 << 8)) << 8)) << 8));
           v36 = v194;
-          v194 += 2;
-          *(short *)v36 = v35;
+          ++v194;
+          *v36 = v35;
           v26 = v204;
-          v265 = v204;
-          if ( v204 >= a7 )
+          a6c = v204;
+          if ( v204 >= dstWidth )
             goto LABEL_55;
         }
         v170 = LODWORD(v152) - LODWORD(v143);
-        v185 = a2 + 4 * (LODWORD(v125) + a5 * LODWORD(v143));
+        v185 = &pSrc[2 * (LODWORD(v125) + srcPitch * LODWORD(v143))];
         while ( SLODWORD(v125) >= SLODWORD(v134) )
         {
 LABEL_49:
-          v185 += 4 * a5;
+          v185 += 2 * srcPitch;
           --v170;
           if ( !v170 )
             goto LABEL_50;
@@ -6610,7 +6611,7 @@
             v230 = 1;
             v25 = v32 != a11 ? 0xFF : 0;
           }
-          v33 = v202->_450FB1(v32);
+          v33 = _450FB1(v32);
           if ( !v230 )
             break;
           LODWORD(v241) = v25 + v241;
@@ -6626,49 +6627,49 @@
         }
         LODWORD(v241) = ((unsigned int)v33 >> 24) + v241;
 LABEL_47:
-        v268 += BYTE2(v33);
+        a6d += BYTE2(v33);
         v253 += BYTE1(v33);
         HIDWORD(v241) += (unsigned __int8)v33;
         goto LABEL_48;
       }
-      result = a6;
-      v195 = a6;
+      result = (int)pDst;
+      v195 = pDst;
       v233 = 0;
-      if ( a8 <= 0 )
+      if ( dstHeight <= 0 )
         return result;
-      v37 = a7;
+      v37 = dstWidth;
       while ( 1 )
       {
         v38 = 0;
-        v269 = 0;
-        if ( a7 > v11 )
+        a6e = 0;
+        if ( dstWidth > v11 )
           break;
 LABEL_80:
-        v195 += a9 - a7;
+        v195 = (unsigned __int16 *)((char *)v195 + dstPitch - dstWidth);
         ++v233;
         result = v233;
-        if ( v233 >= a8 )
+        if ( v233 >= dstHeight )
           return result;
         v11 = 0;
       }
-      v223 = (double)a7;
-      v214 = (double)a3;
-      v39 = (double)a8;
-      v40 = (double)a4;
+      v223 = (double)dstWidth;
+      v214 = (double)srcWidth;
+      v39 = (double)dstHeight;
+      v40 = (double)srcHeight;
       while ( 1 )
       {
-        v270 = (double)v269 / v223 * v214;
-        v126 = v270 + 6.7553994e15;
+        a6w = (double)a6e / v223 * v214;
+        v126 = a6w + 6.7553994e15;
         v205 = v38 + 1;
-        v271 = (double)(v38 + 1) / v223 * v214;
-        v135 = v271 + 6.7553994e15;
+        a6x = (double)(v38 + 1) / v223 * v214;
+        v135 = a6x + 6.7553994e15;
         v41 = (double)v233 / v39 * v40;
         v144 = v41 + 6.7553994e15;
         v42 = (double)(v233 + 1) / v39 * v40;
         v153 = v42 + 6.7553994e15;
         v43 = (LODWORD(v153) - LODWORD(v144)) * (LODWORD(v135) - LODWORD(v126));
         v254 = 0;
-        v272 = 0;
+        a6f = 0;
         v242 = 0i64;
         if ( SLODWORD(v144) < SLODWORD(v153) )
           break;
@@ -6676,26 +6677,27 @@
         v46 = (unsigned int)v242 / ((LODWORD(v153) - LODWORD(v144)) * (LODWORD(v135) - LODWORD(v126)));
         if ( v43 )
         {
-          v272 /= v43;
+          a6f /= v43;
           v254 /= v43;
           HIDWORD(v242) /= v43;
         }
         if ( v46 != 255 )
           v46 &= 0x7FFFFFFFu;
-        v47 = v202->_450F55(HIDWORD(v242) | ((v254 | ((v272 | (v46 << 8)) << 8)) << 8));
-        v48 = v195++;
-        *(char *)v48 = v47;
+        v47 = _450F55(HIDWORD(v242) | ((v254 | ((a6f | (v46 << 8)) << 8)) << 8));
+        v48 = v195;
+        v195 = (unsigned __int16 *)((char *)v195 + 1);
+        *(_BYTE *)v48 = v47;
         v38 = v205;
-        v269 = v205;
-        if ( v205 >= a7 )
+        a6e = v205;
+        if ( v205 >= dstWidth )
           goto LABEL_80;
       }
       v171 = LODWORD(v153) - LODWORD(v144);
-      v186 = a2 + 4 * (LODWORD(v126) + a5 * LODWORD(v144));
+      v186 = &pSrc[2 * (LODWORD(v126) + srcPitch * LODWORD(v144))];
       while ( SLODWORD(v126) >= SLODWORD(v135) )
       {
 LABEL_74:
-        v186 += 4 * a5;
+        v186 += 2 * srcPitch;
         --v171;
         if ( !v171 )
           goto LABEL_75;
@@ -6710,7 +6712,7 @@
           v230 = 1;
           v37 = v44 != a11 ? 0xFF : 0;
         }
-        v45 = v202->_450FB1(v44);
+        v45 = _450FB1(v44);
         if ( !v230 )
           break;
         LODWORD(v242) = v37 + v242;
@@ -6726,52 +6728,52 @@
       }
       LODWORD(v242) = ((unsigned int)v45 >> 24) + v242;
 LABEL_72:
-      v272 += BYTE2(v45);
+      a6f += BYTE2(v45);
       v254 += BYTE1(v45);
       HIDWORD(v242) += (unsigned __int8)v45;
       goto LABEL_73;
     }
-    result = this->array_20[3];
+    result = this->field_20.field_C;
     if ( result != 8 )
     {
       if ( result != 16 )
       {
-        if ( result != 32 || (result = a6, v196 = a6, v234 = 0, a8 <= 0) )
+        if ( result != 32 || (result = (int)pDst, v196 = pDst, v234 = 0, dstHeight <= 0) )
           return result;
-        v49 = a7;
-        v299 = 4 * (a9 - a7);
+        v49 = dstWidth;
+        a9c = 4 * (dstPitch - dstWidth);
         while ( 1 )
         {
           v50 = 0;
-          v273 = 0;
-          if ( a7 > v11 )
+          a6g = 0;
+          if ( dstWidth > v11 )
             break;
 LABEL_108:
-          v196 += v299;
+          v196 = (unsigned __int16 *)((char *)v196 + a9c);
           ++v234;
           result = v234;
-          if ( v234 >= a8 )
+          if ( v234 >= dstHeight )
             return result;
           v11 = 0;
         }
-        v224 = (double)a7;
-        v215 = (double)a3;
-        v51 = (double)a8;
-        v52 = (double)a4;
+        v224 = (double)dstWidth;
+        v215 = (double)srcWidth;
+        v51 = (double)dstHeight;
+        v52 = (double)srcHeight;
         while ( 1 )
         {
-          v274 = (double)v273 / v224 * v215;
-          v127 = v274 + 6.7553994e15;
+          a6y = (double)a6g / v224 * v215;
+          v127 = a6y + 6.7553994e15;
           v206 = v50 + 1;
-          v275 = (double)(v50 + 1) / v224 * v215;
-          v136 = v275 + 6.7553994e15;
+          a6z = (double)(v50 + 1) / v224 * v215;
+          v136 = a6z + 6.7553994e15;
           v53 = (double)v234 / v51 * v52;
           v145 = v53 + 6.7553994e15;
           v54 = (double)(v234 + 1) / v51 * v52;
           v154 = v54 + 6.7553994e15;
           v55 = (LODWORD(v154) - LODWORD(v145)) * (LODWORD(v136) - LODWORD(v127));
           v255 = 0;
-          v276 = 0;
+          a6h = 0;
           v243 = 0i64;
           if ( SLODWORD(v145) < SLODWORD(v154) )
             break;
@@ -6779,27 +6781,27 @@
           v58 = (unsigned int)v243 / ((LODWORD(v154) - LODWORD(v145)) * (LODWORD(v136) - LODWORD(v127)));
           if ( v55 )
           {
-            v276 /= v55;
+            a6h /= v55;
             v255 /= v55;
             HIDWORD(v243) /= v55;
           }
           if ( v58 != 255 )
             v58 &= 0x7FFFFFFFu;
-          v59 = v202->_450F55(HIDWORD(v243) | ((v255 | ((v276 | (v58 << 8)) << 8)) << 8));
+          v59 = _450F55(HIDWORD(v243) | ((v255 | ((a6h | (v58 << 8)) << 8)) << 8));
           v60 = v196;
-          v196 += 4;
-          *(int *)v60 = v59;
+          v196 += 2;
+          *(_DWORD *)v60 = v59;
           v50 = v206;
-          v273 = v206;
-          if ( v206 >= a7 )
+          a6g = v206;
+          if ( v206 >= dstWidth )
             goto LABEL_108;
         }
         v172 = LODWORD(v154) - LODWORD(v145);
-        v187 = a2 + 2 * (LODWORD(v127) + a5 * LODWORD(v145));
+        v187 = &pSrc[LODWORD(v127) + srcPitch * LODWORD(v145)];
         while ( SLODWORD(v127) >= SLODWORD(v136) )
         {
 LABEL_102:
-          v187 += 2 * a5;
+          v187 += srcPitch;
           --v172;
           if ( !v172 )
             goto LABEL_103;
@@ -6808,13 +6810,13 @@
         v164 = LODWORD(v136) - LODWORD(v127);
         while ( 1 )
         {
-          v56 = *(short *)v179;
+          v56 = *(_WORD *)v179;
           if ( a10 )
           {
             v230 = 1;
             v49 = v56 != a11 ? 0xFF : 0;
           }
-          v57 = v202->_450FB1(v56);
+          v57 = _450FB1(v56);
           if ( !v230 )
             break;
           LODWORD(v243) = v49 + v243;
@@ -6830,93 +6832,104 @@
         }
         LODWORD(v243) = ((unsigned int)v57 >> 24) + v243;
 LABEL_100:
-        v276 += BYTE2(v57);
+        a6h += BYTE2(v57);
         v255 += BYTE1(v57);
         HIDWORD(v243) += (unsigned __int8)v57;
         goto LABEL_101;
       }
-      result = a6;
-      v197 = a6;
+      result = (int)pDst;
+      v197 = pDst;
       v235 = 0;
-      if ( a8 <= 0 )
+      if ( dstHeight <= 0 )
         return result;
-      v61 = a7;
-      v300 = 2 * (a9 - a7);
+      v61 = dstWidth;
+      a9d = 2 * (dstPitch - dstWidth);
       while ( 1 )
       {
         v62 = 0;
-        v277 = 0;
-        if ( a7 > v11 )
+        a6i = 0;
+        if ( dstWidth > v11 )
           break;
 LABEL_133:
-        v197 += v300;
+        v197 = (unsigned __int16 *)((char *)v197 + a9d);
         ++v235;
         result = v235;
-        if ( v235 >= a8 )
+        if ( v235 >= dstHeight )
           return result;
         v11 = 0;
       }
-      v225 = (double)a7;
-      v216 = (double)a3;
-      v63 = (double)a8;
-      v64 = (double)a4;
+      v225 = (double)dstWidth;
+      v216 = (double)srcWidth;
+      v63 = (double)dstHeight;
+      v64 = (double)srcHeight;
       while ( 1 )
       {
-        v278 = (double)v277 / v225 * v216;
-        v128 = v278 + 6.7553994e15;
+        a6ba = (double)a6i / v225 * v216;
+        _v128 = floorf(a6ba);
+        //v128 = a6ba + 6.7553994e15;
         v207 = v62 + 1;
-        v279 = (double)(v62 + 1) / v225 * v216;
-        v137 = v279 + 6.7553994e15;
+        a6bb = (double)(v62 + 1) / v225 * v216;
+        //v137 = a6bb + 6.7553994e15;
+        _v137 = floorf(a6bb);
         v65 = (double)v235 / v63 * v64;
-        v146 = v65 + 6.7553994e15;
+        //v146 = v65 + 6.7553994e15;
+        _v146 = floorf(v65);
         v66 = (double)(v235 + 1) / v63 * v64;
-        v155 = v66 + 6.7553994e15;
-        v67 = (LODWORD(v155) - LODWORD(v146)) * (LODWORD(v137) - LODWORD(v128));
+        //v155 = v66 + 6.7553994e15;
+        _v155 = floorf(v66);
+        //v67 = (LODWORD(v155) - LODWORD(v146)) * (LODWORD(v137) - LODWORD(v128));
+        v67 = (_v155 - _v146) * (_v137 - _v128);
         v256 = 0;
-        v280 = 0;
+        a6j = 0;
         v244 = 0i64;
-        if ( SLODWORD(v146) < SLODWORD(v155) )
+        //if ( SLODWORD(v146) < SLODWORD(v155) )
+        if (_v146 < _v155)
           break;
 LABEL_128:
-        v70 = (unsigned int)v244 / ((LODWORD(v155) - LODWORD(v146)) * (LODWORD(v137) - LODWORD(v128)));
+        //v70 = (unsigned int)v244 / ((LODWORD(v155) - LODWORD(v146)) * (LODWORD(v137) - LODWORD(v128)));
+        v70 = (unsigned int)v244 / ((_v155 - _v146) * (_v137 - _v128));
         if ( v67 )
         {
-          v280 /= v67;
+          a6j /= v67;
           v256 /= v67;
           HIDWORD(v244) /= v67;
         }
         if ( v70 != 255 )
           v70 &= 0x7FFFFFFFu;
-        v71 = v202->_450F55(HIDWORD(v244) | ((v256 | ((v280 | (v70 << 8)) << 8)) << 8));
+        v71 = _450F55(HIDWORD(v244) | ((v256 | ((a6j | (v70 << 8)) << 8)) << 8));
         v72 = v197;
-        v197 += 2;
-        *(short *)v72 = v71;
+        ++v197;
+        *v72 = v71;
         v62 = v207;
-        v277 = v207;
-        if ( v207 >= a7 )
+        a6i = v207;
+        if ( v207 >= dstWidth )
           goto LABEL_133;
       }
-      v173 = LODWORD(v155) - LODWORD(v146);
-      v188 = a2 + 2 * (LODWORD(v128) + a5 * LODWORD(v146));
-      while ( SLODWORD(v128) >= SLODWORD(v137) )
+      //v173 = LODWORD(v155) - LODWORD(v146);
+      v173 = _v155 - _v146;
+      //v188 = &pSrc[LODWORD(v128) + srcPitch * LODWORD(v146)];
+      v188 = &pSrc[_v128 + srcPitch * _v146];
+      //while ( SLODWORD(v128) >= SLODWORD(v137) )
+      while (_v128 >= _v137)
       {
 LABEL_127:
-        v188 += 2 * a5;
+        v188 += srcPitch;
         --v173;
         if ( !v173 )
           goto LABEL_128;
       }
       v180 = (int *)v188;
-      v165 = LODWORD(v137) - LODWORD(v128);
+      //v165 = LODWORD(v137) - LODWORD(v128);
+      v165 = _v137 - _v128;
       while ( 1 )
       {
-        v68 = *(short *)v180;
+        v68 = *(_WORD *)v180;
         if ( a10 )
         {
           v230 = 1;
           v61 = v68 != a11 ? 0xFF : 0;
         }
-        v69 = v202->_450FB1(v68);
+        v69 = _450FB1(v68);
         if ( !v230 )
           break;
         LODWORD(v244) = v61 + v244;
@@ -6932,49 +6945,49 @@
       }
       LODWORD(v244) = ((unsigned int)v69 >> 24) + v244;
 LABEL_125:
-      v280 += BYTE2(v69);
+      a6j += BYTE2(v69);
       v256 += BYTE1(v69);
       HIDWORD(v244) += (unsigned __int8)v69;
       goto LABEL_126;
     }
-    result = a6;
-    v198 = a6;
+    result = (int)pDst;
+    v198 = pDst;
     v236 = 0;
-    if ( a8 <= 0 )
+    if ( dstHeight <= 0 )
       return result;
-    v73 = a7;
+    v73 = dstWidth;
     while ( 1 )
     {
       v74 = 0;
-      v281 = 0;
-      if ( a7 > v11 )
+      a6k = 0;
+      if ( dstWidth > v11 )
         break;
 LABEL_158:
-      v198 += a9 - a7;
+      v198 = (unsigned __int16 *)((char *)v198 + dstPitch - dstWidth);
       ++v236;
       result = v236;
-      if ( v236 >= a8 )
+      if ( v236 >= dstHeight )
         return result;
       v11 = 0;
     }
-    v226 = (double)a7;
-    v217 = (double)a3;
-    v75 = (double)a8;
-    v76 = (double)a4;
+    v226 = (double)dstWidth;
+    v217 = (double)srcWidth;
+    v75 = (double)dstHeight;
+    v76 = (double)srcHeight;
     while ( 1 )
     {
-      v282 = (double)v281 / v226 * v217;
-      v129 = v282 + 6.7553994e15;
+      a6bc = (double)a6k / v226 * v217;
+      v129 = a6bc + 6.7553994e15;
       v208 = v74 + 1;
-      v283 = (double)(v74 + 1) / v226 * v217;
-      v138 = v283 + 6.7553994e15;
+      a6bd = (double)(v74 + 1) / v226 * v217;
+      v138 = a6bd + 6.7553994e15;
       v77 = (double)v236 / v75 * v76;
       v147 = v77 + 6.7553994e15;
       v78 = (double)(v236 + 1) / v75 * v76;
       v156 = v78 + 6.7553994e15;
       v257 = 0;
       v79 = (LODWORD(v156) - LODWORD(v147)) * (LODWORD(v138) - LODWORD(v129));
-      v284 = 0;
+      a6l = 0;
       v245 = 0i64;
       if ( SLODWORD(v147) < SLODWORD(v156) )
         break;
@@ -6982,26 +6995,27 @@
       v82 = (unsigned int)v245 / ((LODWORD(v156) - LODWORD(v147)) * (LODWORD(v138) - LODWORD(v129)));
       if ( v79 )
       {
-        v284 /= v79;
+        a6l /= v79;
         v257 /= v79;
         HIDWORD(v245) /= v79;
       }
       if ( v82 != 255 )
         v82 &= 0x7FFFFFFFu;
-      v83 = v202->_450F55(HIDWORD(v245) | ((v257 | ((v284 | (v82 << 8)) << 8)) << 8));
-      v84 = v198++;
-      *(char *)v84 = v83;
+      v83 = _450F55(HIDWORD(v245) | ((v257 | ((a6l | (v82 << 8)) << 8)) << 8));
+      v84 = v198;
+      v198 = (unsigned __int16 *)((char *)v198 + 1);
+      *(_BYTE *)v84 = v83;
       v74 = v208;
-      v281 = v208;
-      if ( v208 >= a7 )
+      a6k = v208;
+      if ( v208 >= dstWidth )
         goto LABEL_158;
     }
     v174 = LODWORD(v156) - LODWORD(v147);
-    v189 = a2 + 2 * (LODWORD(v129) + a5 * LODWORD(v147));
+    v189 = &pSrc[LODWORD(v129) + srcPitch * LODWORD(v147)];
     while ( SLODWORD(v129) >= SLODWORD(v138) )
     {
 LABEL_152:
-      v189 += 2 * a5;
+      v189 += srcPitch;
       --v174;
       if ( !v174 )
         goto LABEL_153;
@@ -7010,13 +7024,13 @@
     v181 = (int *)v189;
     while ( 1 )
     {
-      v80 = *(short *)v181;
+      v80 = *(_WORD *)v181;
       if ( a10 )
       {
         v230 = 1;
         v73 = v80 != a11 ? 0xFF : 0;
       }
-      v81 = v202->_450FB1(v80);
+      v81 = _450FB1(v80);
       if ( !v230 )
         break;
       LODWORD(v245) = v73 + v245;
@@ -7032,37 +7046,37 @@
     }
     LODWORD(v245) = ((unsigned int)v81 >> 24) + v245;
 LABEL_150:
-    v284 += BYTE2(v81);
+    a6l += BYTE2(v81);
     v257 += BYTE1(v81);
     HIDWORD(v245) += (unsigned __int8)v81;
     goto LABEL_151;
   }
-  result = this->array_20[3];
+  result = this->field_20.field_C;
   if ( result == 8 )
   {
-    result = a6;
-    v201 = a6;
+    result = (int)pDst;
+    v201 = pDst;
     v239 = 0;
-    if ( a8 <= 0 )
+    if ( dstHeight <= 0 )
       return result;
-    v111 = a7;
+    v111 = dstWidth;
     while ( 1 )
     {
       v112 = 0;
-      v293 = 0;
-      if ( a7 <= v11 )
+      a6q = 0;
+      if ( dstWidth <= v11 )
         goto LABEL_236;
-      v229 = (double)a7;
-      v220 = (double)a3;
-      v113 = (double)a8;
-      v114 = (double)a4;
+      v229 = (double)dstWidth;
+      v220 = (double)srcWidth;
+      v113 = (double)dstHeight;
+      v114 = (double)srcHeight;
       do
       {
-        v294 = (double)v293 / v229 * v220;
-        v132 = v294 + 6.7553994e15;
+        a6bi = (double)a6q / v229 * v220;
+        v132 = a6bi + 6.7553994e15;
         v211 = v112 + 1;
-        v295 = (double)(v112 + 1) / v229 * v220;
-        v141 = v295 + 6.7553994e15;
+        a6bj = (double)(v112 + 1) / v229 * v220;
+        v141 = a6bj + 6.7553994e15;
         v115 = (double)v239 / v113 * v114;
         v150 = v115 + 6.7553994e15;
         v116 = (double)(v239 + 1) / v113 * v114;
@@ -7070,25 +7084,25 @@
         v251 = 0;
         v117 = (LODWORD(v159) - LODWORD(v150)) * (LODWORD(v141) - LODWORD(v132));
         v260 = 0;
-        v296 = 0;
+        a6r = 0;
         v248 = 0;
         if ( SLODWORD(v150) >= SLODWORD(v159) )
           goto LABEL_231;
         v169 = LODWORD(v159) - LODWORD(v150);
-        v184 = a2 + a5 * LODWORD(v150);
+        v184 = (char *)pSrc + srcPitch * LODWORD(v150);
         do
         {
           v118 = LODWORD(v132);
           v192 = LODWORD(v132);
           while ( v118 < SLODWORD(v141) )
           {
-            v119 = *(char *)(v184 + v192);
+            v119 = (unsigned __int8)v184[v192];
             if ( a10 )
             {
               v230 = 1;
               v111 = v119 != a11 ? 0xFF : 0;
             }
-            v120 = v202->_450FB1(v119);
+            v120 = _450FB1(v119);
             if ( v230 )
             {
               v248 += v111;
@@ -7103,14 +7117,14 @@
             {
               v248 += (unsigned int)v120 >> 24;
             }
-            v296 += BYTE2(v120);
+            a6r += BYTE2(v120);
             v260 += BYTE1(v120);
             v251 += (unsigned __int8)v120;
 LABEL_228:
             ++v192;
             v118 = v192;
           }
-          v184 += a5;
+          v184 += srcPitch;
           --v169;
         }
         while ( v169 );
@@ -7118,54 +7132,55 @@
         v121 = v248 / ((LODWORD(v159) - LODWORD(v150)) * (LODWORD(v141) - LODWORD(v132)));
         if ( v117 )
         {
-          v296 /= v117;
+          a6r /= v117;
           v260 /= v117;
           v251 /= v117;
         }
         if ( v121 != 255 )
           v121 &= 0x7FFFFFFFu;
-        v122 = v202->_450F55(v251 | ((v260 | ((v296 | (v121 << 8)) << 8)) << 8));
-        v123 = v201++;
-        *(char *)v123 = v122;
+        v122 = _450F55(v251 | ((v260 | ((a6r | (v121 << 8)) << 8)) << 8));
+        v123 = v201;
+        v201 = (unsigned __int16 *)((char *)v201 + 1);
+        *(_BYTE *)v123 = v122;
         v112 = v211;
-        v293 = v211;
-      }
-      while ( v211 < a7 );
+        a6q = v211;
+      }
+      while ( v211 < dstWidth );
 LABEL_236:
-      v201 += a9 - a7;
+      v201 = (unsigned __int16 *)((char *)v201 + dstPitch - dstWidth);
       ++v239;
       result = v239;
-      if ( v239 >= a8 )
+      if ( v239 >= dstHeight )
         return result;
       v11 = 0;
     }
   }
   if ( result == 16 )
   {
-    result = a6;
-    v200 = a6;
+    result = (int)pDst;
+    v200 = pDst;
     v238 = 0;
-    if ( a8 <= 0 )
+    if ( dstHeight <= 0 )
       return result;
-    v98 = a7;
-    v302 = 2 * (a9 - a7);
+    v98 = dstWidth;
+    a9f = 2 * (dstPitch - dstWidth);
     while ( 1 )
     {
       v99 = 0;
-      v289 = 0;
-      if ( a7 <= v11 )
+      a6o = 0;
+      if ( dstWidth <= v11 )
         goto LABEL_211;
-      v228 = (double)a7;
-      v219 = (double)a3;
-      v100 = (double)a8;
-      v101 = (double)a4;
+      v228 = (double)dstWidth;
+      v219 = (double)srcWidth;
+      v100 = (double)dstHeight;
+      v101 = (double)srcHeight;
       do
       {
-        v290 = (double)v289 / v228 * v219;
-        v131 = v290 + 6.7553994e15;
+        a6bg = (double)a6o / v228 * v219;
+        v131 = a6bg + 6.7553994e15;
         v210 = v99 + 1;
-        v291 = (double)(v99 + 1) / v228 * v219;
-        v140 = v291 + 6.7553994e15;
+        a6bh = (double)(v99 + 1) / v228 * v219;
+        v140 = a6bh + 6.7553994e15;
         v102 = (double)v238 / v100 * v101;
         v149 = v102 + 6.7553994e15;
         v103 = (double)(v238 + 1) / v100 * v101;
@@ -7173,25 +7188,25 @@
         v250 = 0;
         v104 = (LODWORD(v158) - LODWORD(v149)) * (LODWORD(v140) - LODWORD(v131));
         v259 = 0;
-        v292 = 0;
+        a6p = 0;
         v247 = 0;
         if ( SLODWORD(v149) >= SLODWORD(v158) )
           goto LABEL_206;
         v168 = LODWORD(v158) - LODWORD(v149);
-        v183 = a2 + a5 * LODWORD(v149);
+        v183 = (char *)pSrc + srcPitch * LODWORD(v149);
         do
         {
           v105 = LODWORD(v131);
           v191 = LODWORD(v131);
           while ( v105 < SLODWORD(v140) )
           {
-            v106 = *(char *)(v183 + v191);
+            v106 = (unsigned __int8)v183[v191];
             if ( a10 )
             {
               v230 = 1;
               v98 = v106 != a11 ? 0xFF : 0;
             }
-            v107 = v202->_450FB1(v106);
+            v107 = _450FB1(v106);
             if ( v230 )
             {
               v247 += v98;
@@ -7206,14 +7221,14 @@
             {
               v247 += (unsigned int)v107 >> 24;
             }
-            v292 += BYTE2(v107);
+            a6p += BYTE2(v107);
             v259 += BYTE1(v107);
             v250 += (unsigned __int8)v107;
 LABEL_203:
             ++v191;
             v105 = v191;
           }
-          v183 += a5;
+          v183 += srcPitch;
           --v168;
         }
         while ( v168 );
@@ -7221,50 +7236,50 @@
         v108 = v247 / ((LODWORD(v158) - LODWORD(v149)) * (LODWORD(v140) - LODWORD(v131)));
         if ( v104 )
         {
-          v292 /= v104;
+          a6p /= v104;
           v259 /= v104;
           v250 /= v104;
         }
         if ( v108 != 255 )
           v108 &= 0x7FFFFFFFu;
-        v109 = v202->_450F55(v250 | ((v259 | ((v292 | (v108 << 8)) << 8)) << 8));
+        v109 = _450F55(v250 | ((v259 | ((a6p | (v108 << 8)) << 8)) << 8));
         v110 = v200;
-        v200 += 2;
-        *(short *)v110 = v109;
+        ++v200;
+        *v110 = v109;
         v99 = v210;
-        v289 = v210;
-      }
-      while ( v210 < a7 );
+        a6o = v210;
+      }
+      while ( v210 < dstWidth );
 LABEL_211:
-      v200 += v302;
+      v200 = (unsigned __int16 *)((char *)v200 + a9f);
       ++v238;
       result = v238;
-      if ( v238 >= a8 )
+      if ( v238 >= dstHeight )
         return result;
       v11 = 0;
     }
   }
-  if ( result != 32 || (result = a6, v199 = a6, v237 = 0, a8 <= 0) )
+  if ( result != 32 || (result = (int)pDst, v199 = pDst, v237 = 0, dstHeight <= 0) )
     return result;
-  v85 = a7;
-  v301 = 4 * (a9 - a7);
+  v85 = dstWidth;
+  a9e = 4 * (dstPitch - dstWidth);
   while ( 2 )
   {
     v86 = 0;
-    v285 = 0;
-    if ( a7 <= v11 )
+    a6m = 0;
+    if ( dstWidth <= v11 )
       goto LABEL_186;
-    v227 = (double)a7;
-    v218 = (double)a3;
-    v87 = (double)a8;
-    v88 = (double)a4;
-    do
-    {
-      v286 = (double)v285 / v227 * v218;
-      v130 = v286 + 6.7553994e15;
+    v227 = (double)dstWidth;
+    v218 = (double)srcWidth;
+    v87 = (double)dstHeight;
+    v88 = (double)srcHeight;
+    do
+    {
+      a6be = (double)a6m / v227 * v218;
+      v130 = a6be + 6.7553994e15;
       v209 = v86 + 1;
-      v287 = (double)(v86 + 1) / v227 * v218;
-      v139 = v287 + 6.7553994e15;
+      a6bf = (double)(v86 + 1) / v227 * v218;
+      v139 = a6bf + 6.7553994e15;
       v89 = (double)v237 / v87 * v88;
       v148 = v89 + 6.7553994e15;
       v90 = (double)(v237 + 1) / v87 * v88;
@@ -7272,25 +7287,25 @@
       v249 = 0;
       v91 = (LODWORD(v157) - LODWORD(v148)) * (LODWORD(v139) - LODWORD(v130));
       v258 = 0;
-      v288 = 0;
+      a6n = 0;
       v246 = 0;
       if ( SLODWORD(v148) >= SLODWORD(v157) )
         goto LABEL_181;
       v167 = LODWORD(v157) - LODWORD(v148);
-      v182 = a2 + a5 * LODWORD(v148);
+      v182 = (char *)pSrc + srcPitch * LODWORD(v148);
       do
       {
         v92 = LODWORD(v130);
         v190 = LODWORD(v130);
         while ( v92 < SLODWORD(v139) )
         {
-          v93 = *(char *)(v182 + v190);
+          v93 = (unsigned __int8)v182[v190];
           if ( a10 )
           {
             v230 = 1;
             v85 = v93 != a11 ? 0xFF : 0;
           }
-          v94 = v202->_450FB1(v93);
+          v94 = _450FB1(v93);
           if ( v230 )
           {
             v246 += v85;
@@ -7305,14 +7320,14 @@
           {
             v246 += (unsigned int)v94 >> 24;
           }
-          v288 += BYTE2(v94);
+          a6n += BYTE2(v94);
           v258 += BYTE1(v94);
           v249 += (unsigned __int8)v94;
 LABEL_178:
           ++v190;
           v92 = v190;
         }
-        v182 += a5;
+        v182 += srcPitch;
         --v167;
       }
       while ( v167 );
@@ -7320,25 +7335,25 @@
       v95 = v246 / ((LODWORD(v157) - LODWORD(v148)) * (LODWORD(v139) - LODWORD(v130)));
       if ( v91 )
       {
-        v288 /= v91;
+        a6n /= v91;
         v258 /= v91;
         v249 /= v91;
       }
       if ( v95 != 255 )
         v95 &= 0x7FFFFFFFu;
-      v96 = v202->_450F55(v249 | ((v258 | ((v288 | (v95 << 8)) << 8)) << 8));
+      v96 = _450F55(v249 | ((v258 | ((a6n | (v95 << 8)) << 8)) << 8));
       v97 = v199;
-      v199 += 4;
-      *(int *)v97 = v96;
+      v199 += 2;
+      *(_DWORD *)v97 = v96;
       v86 = v209;
-      v285 = v209;
-    }
-    while ( v209 < a7 );
+      a6m = v209;
+    }
+    while ( v209 < dstWidth );
 LABEL_186:
-    v199 += v301;
+    v199 = (unsigned __int16 *)((char *)v199 + a9e);
     ++v237;
     result = v237;
-    if ( v237 < a8 )
+    if ( v237 < dstHeight )
     {
       v11 = 0;
       continue;
@@ -7351,6 +7366,8 @@
 
 
 
+
+
 //----- (0044E1EC) --------------------------------------------------------
 int TextureFrameTable::FromFileTxt(const char *Args)
 {
@@ -8706,15 +8723,16 @@
 //----- (00450DDE) --------------------------------------------------------
 stru350 *stru350::_450DDE()
 {
-  _450DF1(" ", " ");
+  _450DF1(&stru_4E82A4, &stru_4E82A4);
   return this;
 }
 
+
 //----- (00450DF1) --------------------------------------------------------
-void *stru350::_450DF1(const char *Src, const char *a3)
-{
-  stru350 *v3; // esi@1
-  void *result; // eax@1
+bool stru350::_450DF1(const stru355 *p1, const stru355 *p2)
+{
+  //stru350 *v3; // esi@1
+  //void *result; // eax@1
   unsigned int v5; // ecx@2
   int v6; // edi@2
   int v7; // edx@2
@@ -8742,7 +8760,7 @@
   int v29; // edx@31
   int v30; // ebx@35
   int v31; // ecx@35
-  unsigned int v32; // edi@35
+  int v32; // edi@35
   int v33; // edx@35
   unsigned int i; // ecx@35
   int v35; // ecx@39
@@ -8750,13 +8768,14 @@
   int v37; // ecx@39
   int v38; // ebx@39
 
-  v3 = this;
-  memcpy(this, Src, 0x20u);
-  result = memcpy(v3->array_20, a3, 0x20u);
-  (*(char *)&result) = 1;
-  if ( v3->field_0[1] & 1 )
-  {
-    v5 = v3->field_0[7];
+  //v3 = this;
+  memcpy(&field_0, p1, sizeof(stru355));
+  memcpy(&field_20, p2, sizeof(stru355));
+  //result = memcpy(&v3->field_20, p2, 0x20u);
+  //LOBYTE(result) = 1;
+  if (field_0.field_4 & 1)
+  {
+    v5 = field_0.field_1C;
     v6 = 0;
     v7 = 0;
     while ( !(v5 & 1) )
@@ -8770,13 +8789,13 @@
       ++v7;
     }
     while ( v5 & 1 );
-    v3->field_40 = 32 - v7 - v6;
-  }
-  else
-  {
-    v3->field_40 = 0;
-  }
-  v8 = v3->field_0[4];
+    field_40 = 32 - v7 - v6;
+  }
+  else
+  {
+    field_40 = 0;
+  }
+  v8 = field_0.field_10;
   v9 = 0;
   v10 = 0;
   while ( !(v8 & 1) )
@@ -8792,8 +8811,8 @@
   while ( v8 & 1 );
   v11 = 24 - v10 - v9;
   v12 = 0;
-  v3->field_48 = v11;
-  v13 = v3->field_0[5];
+  field_48 = v11;
+  v13 = field_0.field_14;
   v14 = 0;
   while ( !(v13 & 1) )
   {
@@ -8807,8 +8826,8 @@
   }
   while ( v13 & 1 );
   v15 = 16 - v14;
-  v16 = v3->field_0[6];
-  v3->field_50 = v15 - v12;
+  v16 = field_0.field_18;
+  field_50 = v15 - v12;
   v17 = 0;
   v18 = 0;
   while ( !(v16 & 1) )
@@ -8822,15 +8841,15 @@
     ++v18;
   }
   while ( v16 & 1 );
-  v19 = (v3->array_20[1] & 1) == 0;
-  v3->field_58 = v17 - v18 + 8;
+  v19 = (field_20.field_4 & 1) == 0;
+  field_58 = v17 - v18 + 8;
   if ( v19 )
   {
-    v3->field_44 = 0;
-  }
-  else
-  {
-    v20 = v3->array_20[7];
+    field_44 = 0;
+  }
+  else
+  {
+    v20 = field_20.field_1C;
     v21 = 0;
     v22 = 0;
     while ( !(v20 & 1) )
@@ -8844,9 +8863,9 @@
       ++v22;
     }
     while ( v20 & 1 );
-    v3->field_44 = 32 - v22 - v21;
-  }
-  v23 = v3->array_20[4];
+    field_44 = 32 - v22 - v21;
+  }
+  v23 = field_20.field_10;
   v24 = 0;
   v25 = 0;
   while ( !(v23 & 1) )
@@ -8862,8 +8881,8 @@
   while ( v23 & 1 );
   v26 = 24 - v25 - v24;
   v27 = 0;
-  v3->field_4C = v26;
-  v28 = v3->array_20[5];
+  field_4C = v26;
+  v28 = field_20.field_14;
   v29 = 0;
   while ( !(v28 & 1) )
   {
@@ -8878,8 +8897,8 @@
   while ( v28 & 1 );
   v30 = 0;
   v31 = 16 - v29 - v27;
-  v32 = v3->array_20[6];
-  v3->field_54 = v31;
+  v32 = field_20.field_18;
+  field_54 = v31;
   v33 = 0;
   for ( i = v32; !(i & 1); i >>= 1 )
     ++v30;
@@ -8891,7 +8910,7 @@
   while ( i & 1 );
   v35 = 32 - v33;
   v36 = v32;
-  v3->field_5C = v35 - v30;
+  field_5C = v35 - v30;
   v37 = 0;
   v38 = 0;
   while ( !(v36 & 1) )
@@ -8905,41 +8924,35 @@
     ++v38;
   }
   while ( v36 & 1 );
-  v3->field_5C = v37 - v38 + 8;
-  return result;
-}
+  field_5C = v37 - v38 + 8;
+  return true;
+}
+
 
 
 
 //----- (00450F55) --------------------------------------------------------
 unsigned int stru350::_450F55(int a2)
 {
-  int v2; // ebx@1
-
-  v2 = a2 & dword_4E82C0;
-  if ( this->array_20[1] & 1 )
+  int v2 = a2 & stru_4E82A4.field_1C;
+  if (field_20.field_4 & 1)
     v2 = (unsigned int)v2 >> this->field_44;
-  return v2 & this->array_20[7] | this->array_20[4] & ((a2 & (unsigned int)dword_4E82B4) >> this->field_4C) | this->array_20[5] & ((a2 & (unsigned int)dword_4E82B8) >> this->field_54) | this->array_20[6] & ((a2 & (unsigned int)dword_4E82BC) >> this->field_5C);
-}
-// 4E82B4: using guessed type int dword_4E82B4;
-// 4E82B8: using guessed type int dword_4E82B8;
-// 4E82BC: using guessed type int dword_4E82BC;
-// 4E82C0: using guessed type int dword_4E82C0;
+  return v2 & field_20.field_1C |
+         field_20.field_10 & ((a2 & (unsigned int)stru_4E82A4.field_10) >> field_4C) |
+         field_20.field_14 & ((a2 & (unsigned int)stru_4E82A4.field_14) >> field_54) |
+         field_20.field_18 & ((a2 & (unsigned int)stru_4E82A4.field_18) >> field_5C);
+}
 
 //----- (00450FB1) --------------------------------------------------------
 int stru350::_450FB1(int a2)
 {
-  int v2; // ebx@2
-  int v4; // [sp+Ch] [bp-4h]@1
-
-  v4 = this->field_0[1] & 1;
+  int v2 = 0;
+  int v4 = field_0.field_4 & 1;
   if ( v4 )
-    v2 = a2 & this->field_0[7];
-  else
-    v2 = 0;
+    v2 = a2 & field_0.field_1C;
   if ( v4 )
-    v2 <<= this->field_40;
-  return v2 | ((a2 & this->field_0[4]) << this->field_48) | ((a2 & this->field_0[5]) << this->field_50) | ((a2 & this->field_0[6]) << this->field_58);
+    v2 <<= field_40;
+  return v2 | ((a2 & field_0.field_10) << field_48) | ((a2 & field_0.field_14) << field_50) | ((a2 & field_0.field_18) << field_58);
 }
 
 
@@ -11722,7 +11735,7 @@
   uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_saveD", TEXTURE_16BIT_PALETTE);
   uTextureID_AR_UP_DN = pIcons_LOD->LoadTexture("AR_UP_DN", TEXTURE_16BIT_PALETTE);
   uTextureID_AR_DN_DN = pIcons_LOD->LoadTexture("AR_DN_DN", TEXTURE_16BIT_PALETTE);
-  pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (WindowType)(WINDOW_Chest|WINDOW_Credits|0x2), 0, 0);
+  pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (WindowType)(WINDOW_Chest|WINDOW_MainMenu|0x2), 0, 0);
   pGUIWindow_CurrentMenu->CreateButton(21u, 198u, 0xBFu, 0x12u, 1, 0, 0xA5u, 0, 0, nullstring, 0);
   pGUIWindow_CurrentMenu->CreateButton(21u, 218u, 0xBFu, 0x12u, 1, 0, 0xA5u, 1u, 0, nullstring, 0);
   pGUIWindow_CurrentMenu->CreateButton(21u, 238u, 0xBFu, 0x12u, 1, 0, 0xA5u, 2u, 0, nullstring, 0);
@@ -12833,10 +12846,12 @@
 //----- (0046082C) --------------------------------------------------------
 bool Initialize_GamesLOD_NewLOD()
 {
-  pGames_LOD->AllocSubIndicesAndIO(0x12Cu, 0);
+  pGames_LOD = new LODWriteableFile;
+  pGames_LOD->AllocSubIndicesAndIO(300, 0);
   if (pGames_LOD->LoadFile("data\\games.lod", 1))
   {
-    pNew_LOD->AllocSubIndicesAndIO(0x12Cu, 0x186A0u);
+    pNew_LOD = new LODWriteableFile;
+    pNew_LOD->AllocSubIndicesAndIO(300, 0x186A0u);
     return true;
   }
   return false;
@@ -13629,14 +13644,6 @@
 //----- (004627B7) --------------------------------------------------------
 void __cdecl MainMenu_Loop()
 {
-  unsigned int v0; // eax@8
-  Texture *v1; // esi@8
-  unsigned int v2; // eax@8
-  Texture *v3; // edi@8
-  unsigned int v4; // eax@8
-  Texture *v5; // ebp@8
-  unsigned int v6; // eax@8
-  Texture *v7; // ebx@8
   GUIButton *v8; // eax@27
   unsigned int v9; // ecx@35
   int v10; // ecx@36
@@ -13645,14 +13652,9 @@
   Texture *v13; // [sp-14h] [bp-50h]@39
   GUIButton *v14; // [sp+0h] [bp-3Ch]@27
   GUIWindow *v15; // [sp+4h] [bp-38h]@11
-  LONG uMouseX; // [sp+8h] [bp-34h]@11
-  LONG uMouseY; // [sp+Ch] [bp-30h]@11
-  POINT v18; // [sp+10h] [bp-2Ch]@11
-  POINT v19; // [sp+18h] [bp-24h]@11
-  MSG Msg; // [sp+20h] [bp-1Ch]@15
 
   uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 0;
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
     pAsyncMouse->Resume();
   if ( LOBYTE(pGame->pKeyboardInstance->bUsingAsynKeyboard) && pAsyncKeyboard )
     pAsyncKeyboard->Resume();
@@ -13662,97 +13664,100 @@
   ++pIcons_LOD->uTexturePacksCount;
   if ( !pIcons_LOD->uNumPrevLoadedFiles )
     pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
-  pWindow_Credits = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_Credits, 0, 0);
-  v0 = pIcons_LOD->LoadTexture("title_new", TEXTURE_16BIT_PALETTE);
-  v1 = (Texture *)(v0 != -1 ? (int)&pIcons_LOD->pTextures[v0] : 0);
-  pMainMenu_BtnNew = pWindow_Credits->CreateButton(
-                       0x1EFu,
-                       0xACu,
-                       (v0 != -1 ? pIcons_LOD->pTextures[v0].uTextureWidth : 24),
-                       (v0 != -1 ? pIcons_LOD->pTextures[v0].uTextureHeight : 26),
-                       1,
-                       0,
-                       0x36u,
-                       0,
-                       0x4Eu,
-                       nullstring,
-                       v1,
-                       0);
-  v2 = pIcons_LOD->LoadTexture("title_load", TEXTURE_16BIT_PALETTE);
-  v3 = (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0);
-  pMainMenu_BtnLoad = pWindow_Credits->CreateButton(
-                        0x1EFu,
-                        0xE3u,
-                        (v2 != -1 ? pIcons_LOD->pTextures[v2].uTextureWidth : 24),
-                        (v2 != -1 ? pIcons_LOD->pTextures[v2].uTextureHeight : 26),
-                        1,
-                        0,
-                        0x37u,
-                        1u,
-                        0x4Cu,
-                        nullstring,
-                        v3,
-                        0);
-  v4 = pIcons_LOD->LoadTexture("title_cred", TEXTURE_16BIT_PALETTE);
-  v5 = (Texture *)(v4 != -1 ? (int)&pIcons_LOD->pTextures[v4] : 0);
-  pMainMenu_BtnCredits = pWindow_Credits->CreateButton(
-                           0x1EFu,
-                           0x11Au,
-                           (v4 != -1 ? pIcons_LOD->pTextures[v4].uTextureWidth : 24),
-                           (v4 != -1 ? pIcons_LOD->pTextures[v4].uTextureHeight : 26),
-                           1,
-                           0,
-                           0x38u,
-                           2u,
-                           0x43u,
-                           nullstring,
-                           v5,
-                           0);
-  v6 = pIcons_LOD->LoadTexture("title_exit", TEXTURE_16BIT_PALETTE);
-  v7 = (Texture *)(v6 != -1 ? (int)&pIcons_LOD->pTextures[v6] : 0);
-  pMainMenu_BtnExit = pWindow_Credits->CreateButton(
-                        0x1EFu,
-                        0x151u,
-                        (v6 != -1 ? pIcons_LOD->pTextures[v6].uTextureWidth : 24),
-                        (v6 != -1 ? pIcons_LOD->pTextures[v6].uTextureHeight : 26),
-                        1,
-                        0,
-                        0x39u,
-                        3u,
-                        0,
-                        nullstring,
-                        v7,
-                        0);
+  pWindow_Credits = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, 0);
+
+  auto pNew = pIcons_LOD->LoadTexturePtr("title_new", TEXTURE_16BIT_PALETTE);
+  //v0 = pIcons_LOD->LoadTexture("title_new", TEXTURE_16BIT_PALETTE);
+  //v1 = (Texture *)(v0 != -1 ? &pIcons_LOD->pTextures[v0] : 0);
+  pMainMenu_BtnNew = pWindow_Credits->CreateButton(495, 172,
+                                                   pNew->uTextureWidth,
+                                                   pNew->uTextureHeight,
+                                                   1,
+                                                   0,
+                                                   54,
+                                                   0,
+                                                   78,
+                                                   "",
+                                                   pNew,
+                                                   0);
+  //v2 = pIcons_LOD->LoadTexture("title_load", TEXTURE_16BIT_PALETTE);
+  //v3 = (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0);
+  auto pLoad = pIcons_LOD->LoadTexturePtr("title_load", TEXTURE_16BIT_PALETTE);
+  pMainMenu_BtnLoad = pWindow_Credits->CreateButton(495, 227,
+                                                    pLoad->uTextureWidth,
+                                                    pLoad->uTextureHeight,
+                                                    1,
+                                                    0,
+                                                    55,
+                                                    1,
+                                                    76,
+                                                    "",
+                                                    pLoad,
+                                                    0);
+  //v4 = pIcons_LOD->LoadTexture("title_cred", TEXTURE_16BIT_PALETTE);
+  //v5 = (Texture *)(v4 != -1 ? (int)&pIcons_LOD->pTextures[v4] : 0);
+  auto pCredits = pIcons_LOD->LoadTexturePtr("title_cred", TEXTURE_16BIT_PALETTE);
+  pMainMenu_BtnCredits = pWindow_Credits->CreateButton(495, 282,
+                                                       pCredits->uTextureWidth,
+                                                       pCredits->uTextureHeight,
+                                                       1,
+                                                       0,
+                                                       56,
+                                                       2,
+                                                       67,
+                                                       "",
+                                                       pCredits,
+                                                       0);
+  //v6 = pIcons_LOD->LoadTexture("title_exit", TEXTURE_16BIT_PALETTE);
+  //v7 = (Texture *)(v6 != -1 ? (int)&pIcons_LOD->pTextures[v6] : 0);
+  auto pExit = pIcons_LOD->LoadTexturePtr("title_exit", TEXTURE_16BIT_PALETTE);
+  pMainMenu_BtnExit = pWindow_Credits->CreateButton(495, 337,
+                                                    pExit->uTextureWidth,
+                                                    pExit->uTextureHeight,
+                                                    1,
+                                                    0,
+                                                    57,
+                                                    3,
+                                                    0,
+                                                    "",
+                                                    pExit,
+                                                    0);
+
   stru_506F20.Release();
   stru_506F20.Load("title.pcx", 0);
-  SetCurrentMenuID(0);
+  SetCurrentMenuID(MENU_MAIN);
   SetForegroundWindow(hWnd);
-  SendMessageA(hWnd, 0x1Cu, 1u, 0);
-  while ( !uCurrentMenuID || uCurrentMenuID == 3 )
-  {
-    uMouseX = pMouse->GetCursorPos(&v18)->x;
-    uMouseY = pMouse->GetCursorPos(&v19)->y;
+  SendMessageA(hWnd, WM_ACTIVATEAPP, 1, 0);
+  while (uCurrentMenuID == MENU_MAIN ||
+         uCurrentMenuID == MENU_LOAD)
+  {
+    POINT pt;
+    pMouse->GetCursorPos(&pt);
+    //uMouseX = pMouse->GetCursorPos(&v18)->x;
+    //uMouseY = pMouse->GetCursorPos(&v19)->y;
     v15 = pWindow_Credits;
-    if ( uCurrentMenuID == 3 )
+    if ( uCurrentMenuID == MENU_LOAD)
     {
       if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 12 )
       {
         stru_506F20.Release();
         stru_506F20.Load("lsave640.pcx", 0);
-        pGUIWindow2 = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Credits, 0, 0);
+        pGUIWindow2 = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, 0);
         uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 12;
         GameUI_DrawLoadMenu(0);
       }
       v15 = pGUIWindow_CurrentMenu;
     }
-    while ( PeekMessageA(&Msg, 0, 0, 0, 1u) )
-    {
-      if ( Msg.message == 18 )
+
+    MSG msg;
+    while ( PeekMessageA(&msg, 0, 0, 0, PM_REMOVE) )
+    {
+      if (msg.message == WM_QUIT)
         Game_DeinitializeAndTerminate(0);
-      TranslateMessage(&Msg);
-      DispatchMessageA(&Msg);
-    }
-    if ( BYTE1(dword_6BE364_game_settings_1) & 1 )
+      TranslateMessage(&msg);
+      DispatchMessageA(&msg);
+    }
+    if (dword_6BE364_game_settings_1 & 0x0100)
     {
       WaitMessage();
     }
@@ -13760,11 +13765,11 @@
     {
       pRenderer->BeginScene();
       pRenderer->DrawTextureRGB(0, 0, &stru_506F20);
-      if ( pAsyncMouse )
+      if (pAsyncMouse)
         pAsyncMouse->_46B736_consume_click_lists(1);
       GUI_MainMenuMessageProc();
       GUI_UpdateWindows();
-      if ( pAsyncMouse )
+      if (pAsyncMouse)
         pAsyncMouse->_46B736_consume_click_lists(1);
       if ( uCurrentMenuID )
       {
@@ -13789,10 +13794,10 @@
           {
             while ( 1 )
             {
-              if ( uMouseX >= (signed int)v8->uX
-                && uMouseX <= (signed int)v8->uZ
-                && uMouseY >= (signed int)v8->uY
-                && uMouseY <= (signed int)v8->uW
+              if ( pt.x >= (signed int)v8->uX
+                && pt.x <= (signed int)v8->uZ
+                && pt.y >= (signed int)v8->uY
+                && pt.y <= (signed int)v8->uW
                 && v15 == pWindow_Credits )
               {
                 v9 = v8->uControlParam;
@@ -13806,24 +13811,24 @@
                     {
                       if ( v11 != 1 )
                         goto LABEL_44;
-                      v13 = v7;
+                      v13 = pExit;
                       v12 = 337;
                     }
                     else
                     {
-                      v13 = v5;
+                      v13 = pCredits;
                       v12 = 282;
                     }
                   }
                   else
                   {
-                    v13 = v3;
+                    v13 = pLoad;
                     v12 = 227;
                   }
                 }
                 else
                 {
-                  v13 = v1;
+                  v13 = pNew;
                   v12 = 172;
                 }
                 pRenderer->DrawTextureIndexed(495u, v12, v13);
@@ -13856,8 +13861,6 @@
   pWindow_Credits->Release();
   pIcons_LOD->_4114F2();
 }
-// 4E28F8: using guessed type int uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions;
-// 6BE364: using guessed type int dword_6BE364_game_settings_1;
 
 
 
@@ -13921,7 +13924,7 @@
         v28 = 0;
         if ( pArcomageGame->bGameInProgress )
         {
-          if ( pAsyncMouse )
+          if (pAsyncMouse)
             goto _def_wnd_proc;
           pArcomageGame->stru1.field_0 = 7;
           v29 = 1;
@@ -13940,7 +13943,7 @@
         v31 = 0;
         if ( !pArcomageGame->bGameInProgress )
           goto LABEL_240;
-        if ( pAsyncMouse )
+        if (pAsyncMouse)
           goto _def_wnd_proc;
         pArcomageGame->stru1.field_0 = 8;
         v29 = 1;
@@ -13949,7 +13952,7 @@
         v32 = 0;
         if ( !pArcomageGame->bGameInProgress )
           goto LABEL_218;
-        if ( pAsyncMouse )
+        if (pAsyncMouse)
           goto _def_wnd_proc;
         pArcomageGame->stru1.field_0 = 3;
         v29 = 0;
@@ -13964,7 +13967,7 @@
           back_to_game();
           return DefWindowProcA(hWnd, Msg, wParam, v4);
         }
-        if ( pAsyncMouse )
+        if (pAsyncMouse)
           goto _def_wnd_proc;
         pArcomageGame->stru1.field_0 = 4;
         v29 = 0;
@@ -13973,7 +13976,7 @@
         v28 = 0;
         if ( pArcomageGame->bGameInProgress )
         {
-          if ( pAsyncMouse )
+          if (pAsyncMouse)
             goto _def_wnd_proc;
           pArcomageGame->stru1.field_0 = 7;
           return DefWindowProcA(hWnd, Msg, wParam, v4);
@@ -14027,7 +14030,7 @@
           }
           goto _def_wnd_proc;
         }
-        if ( pAsyncMouse )
+        if (pAsyncMouse)
           goto _def_wnd_proc;
         pArcomageGame->stru1.field_0 = 8;
         return DefWindowProcA(hWnd, Msg, wParam, v4);
@@ -14049,7 +14052,7 @@
       case WM_MOUSEMOVE:
         if ( pArcomageGame->bGameInProgress )
         {
-          if ( pAsyncMouse )
+          if (pAsyncMouse)
             goto _def_wnd_proc;
           pXY[0] = (unsigned __int16)lParam;
           pXY[1] = lParam >> 16;
@@ -14063,7 +14066,7 @@
         }
         else
         {
-          if ( pAsyncMouse )
+          if (pAsyncMouse)
             goto _def_wnd_proc;
           pMouse->SetMouseClick((unsigned __int16)lParam, lParam >> 16);
         }
@@ -14364,7 +14367,7 @@
             Abortf(pGlobalTXT_LocalizationStrings[62]);
         }
         BYTE1(dword_6BE364_game_settings_1) &= 0xFEu;
-        if ( pAsyncMouse )
+        if (pAsyncMouse)
           pAsyncMouse->Resume();
         if ( pArcomageGame->bGameInProgress )
         {
@@ -14401,7 +14404,7 @@
         dword_4E98BC_bApplicationActive = 0;
         if ( (pVideoPlayer->pSmackerMovie || pVideoPlayer->pBinkMovie) && pVideoPlayer->bPlayingMovie )
           pVideoPlayer->bStopBeforeSchedule = 1;
-        if ( pAsyncMouse )
+        if (pAsyncMouse)
           pAsyncMouse->Suspend();
         if ( pRenderer->bUserDirect3D && pRenderer->uAcquiredDirect3DDevice == 1 )
           SetWindowPos(::hWnd, (HWND)0xFFFFFFFE, 0, 0, 0, 0, 0x18u);
@@ -14448,7 +14451,7 @@
           pAsyncKeyboard->_45B3A4();
       }
     }
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       pAsyncMouse->_46B1DD();
     PostQuitMessage(0);
     return 0;
@@ -14461,7 +14464,7 @@
       if ( pRenderer->bUserDirect3D && pRenderer->uAcquiredDirect3DDevice == 1 )
         SetWindowPos(::hWnd, (HWND)0xFFFFFFFE, 0, 0, 0, 0, 0x18u);
       ClipCursor(0);
-      if ( pAsyncMouse )
+      if (pAsyncMouse)
       {
         pAsyncMouse->Suspend();
         return DefWindowProcA(hWnd, Msg, wParam, v4);
@@ -14582,10 +14585,13 @@
 {
   pViewport->SetScreen(viewparams->uSomeX, viewparams->uSomeY, viewparams->uSomeZ, viewparams->uSomeW);
   pViewport->_4C02F8((signed __int64)(flt_6BE3A0 * 65536.0));
+
+  pIndoorCamera = new IndoorCamera;
   pIndoorCamera->Initialize(
     65,
     viewparams->uScreenZ - viewparams->uScreenX + 1,
     viewparams->uScreenW - viewparams->uScreenY + 1);
+
   InitializeTurnBasedAnimations(&stru_50C198);
   pBitmaps_LOD->dword_11B84 = pBitmaps_LOD->uNumLoadedFiles;
   pSprites_LOD->field_ECA0 = pSprites_LOD->uNumLoadedSprites;
@@ -15200,6 +15206,8 @@
 
 
   bCanLoadFromCD = GetPrivateProfileIntW(L"settings", L"use_cd", 1, pMM6IniFile);
+  if (bNoCD)
+    bCanLoadFromCD = false;
   if (bCanLoadFromCD)
   {
     if (!FindMM7CD(hWnd, &cMM7GameCDDriveLetter))
@@ -15461,18 +15469,11 @@
 //----- (00465D0B) --------------------------------------------------------
 void __cdecl SecondaryInitialization()
 {
-  //_UNKNOWN *v0; // edi@3
-  //char **v1; // ebp@3
-  //char *v2; // esi@3
-  //__int16 uIconID; // ax@4
   __int16 v4; // ax@4
   signed int v5; // esi@5
   int v6; // ecx@6
   int v7; // edx@7
   ObjectDesc *v8; // eax@7
-  //signed int v9; // esi@8
-  signed int v10; // ebx@14
-  signed int v11; // esi@15
   char pContainer[32]; // [sp+10h] [bp-Ch]@9
 
   pMouse->Initialize(hWnd);
@@ -15558,9 +15559,15 @@
   if ( pSprites_LOD->field_ECA0 < (signed int)pSprites_LOD->uNumLoadedSprites )
     pSprites_LOD->field_ECA0 = pSprites_LOD->uNumLoadedSprites;
   pPaletteManager->LockAll();
+
   _mkdir("Saves");
-  v10 = 1;
-  do
+  for (uint i = 0; i < 5; ++i)
+    for (uint j = 0; j < 6; ++j)
+    {
+      sprintf(pTmpBuf, "data\\lloyd%d%d.pcx", i, j);
+      remove(pTmpBuf);
+    }
+  /*do
   {
     v11 = 1;
     do
@@ -15572,7 +15579,8 @@
     while ( v11 < 6 );
     ++v10;
   }
-  while ( v10 < 5 );
+  while ( v10 < 5 );*/
+
   Initialize_GamesLOD_NewLOD();
   dword_576E2C = 512;
   dword_576E28 = 9;
@@ -15613,8 +15621,10 @@
     if (wcsstr(pCmdLine, L"-noanim"))
     {
       dword_6BE364_game_settings_1 |= 0x40;
-      bNoVideo = 1;
-    }
+      bNoVideo = true;
+    }
+    if (wcsstr(pCmdLine, L"-nocd"))
+      bNoCD = true;
   }
   stru_51076C.registry_debug_flags = ReadWindowsRegistryInt("debug flags", 0);
 
@@ -15659,7 +15669,7 @@
             pGame->Deinitialize();
           return true;
         }
-        if ( uCurrentMenuID == 1 )
+        if (GetCurrentMenuID() == MENU_NEWGAME)
         {
           if ( pAudioPlayer->hAILRedbook )
             AIL_redbook_stop(pAudioPlayer->hAILRedbook);
@@ -15703,7 +15713,7 @@
           if ( uCurrentMenuID != 10 )
             goto LABEL_49;
           pMouse->Activate(0);
-          if ( pAsyncMouse )
+          if (pAsyncMouse)
             pAsyncMouse->Suspend();
           if ( LOBYTE(pGame->pKeyboardInstance->bUsingAsynKeyboard) && pAsyncKeyboard )
             pAsyncKeyboard->Suspend();
@@ -15714,7 +15724,7 @@
           if ( !GetOpenFileNameA((LPOPENFILENAMEA)&ofn) )
           {
             pMouse->Activate(1);
-            if ( pAsyncMouse )
+            if (pAsyncMouse)
               pAsyncMouse->Resume();
             if ( LOBYTE(pGame->pKeyboardInstance->bUsingAsynKeyboard) && pAsyncKeyboard )
               pAsyncKeyboard->Resume();
@@ -15723,7 +15733,7 @@
           _chdir("..\\");
           strcpy(pCurrentMapName, ofn.lpstrFileTitle);
           pMouse->Activate(1);
-          if ( pAsyncMouse )
+          if (pAsyncMouse)
             pAsyncMouse->Resume();
           if ( LOBYTE(pGame->pKeyboardInstance->bUsingAsynKeyboard) && pAsyncKeyboard )
             pAsyncKeyboard->Resume();
@@ -16069,7 +16079,7 @@
 }
 
 //----- (00466CA0) --------------------------------------------------------
-unsigned int __cdecl GetCurrentMenuID()
+unsigned int GetCurrentMenuID()
 {
   return uCurrentMenuID;
 }
@@ -16649,7 +16659,7 @@
     if ( a1 <= 782 )
     {
       uTextureID_720980 = pIcons_LOD->LoadTexture("leather", TEXTURE_16BIT_PALETTE);
-      ptr_507BC4 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)30, v1 - 700, 0);
+      ptr_507BC4 = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)30, v1 - 700, 0);
     }
   }
 }
@@ -16934,7 +16944,7 @@
         if ( v4 == 2 && (unsigned __int16)(v0->pActiveSkills[2] & 0xFFC0)
           || v4 == 1 && (signed int)SkillToMastery(v0->pActiveSkills[1]) >= 3 )
         {
-          if ( pAsyncMouse )
+          if (pAsyncMouse)
           {
             v18 = *((int *)pAsyncMouse + 6);
             v19 = *((int *)pAsyncMouse + 7);
@@ -17082,7 +17092,7 @@
     }
     return;
   }
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
   {
     v32 = *((int *)pAsyncMouse + 6);
     v33 = *((int *)pAsyncMouse + 7);
@@ -17932,7 +17942,7 @@
     goto LABEL_36;
   }
   if ( v25->IsInteractive() )
-    v24 = (const char *)dword_722240[2 * stru_5E4C90.field_0[v26->field_1C]];
+    v24 = pNPCTopics[stru_5E4C90.field_0[v26->field_1C] + 379].pTopic;
   else
     v24 = pDecorationList->pDecorations[v26->uDecorationDescID].field_20;
 LABEL_51:
--- a/mm7_3.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/mm7_3.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -5674,7 +5674,7 @@
   pAwardsTXT_Raw = (char *)pEvents_LOD->LoadRaw("awards.txt", 0);
   strtok(pAwardsTXT_Raw, "\r");
   v7 = pAwards;
-  do
+  for (uint i = 0; i < 104; ++i)
   {
     v1 = strtok(v0, "\r") + 1;
     v6 = v0;
@@ -5721,7 +5721,7 @@
     while ( (signed int)(v6 - 1) <= 2 && (char *)v5 == v0 );
     ++v7;
   }
-  while ( (signed int)v7 < (signed int)&dword_7241C8 );
+  //while ( (signed int)v7 < (signed int)&dword_7241C8 );
 }
 // 7241C8: using guessed type int dword_7241C8;
 
@@ -5744,7 +5744,7 @@
   pScrollsTXT_Raw = (char *)pEvents_LOD->LoadRaw("scroll.txt", 0);
   strtok(pScrollsTXT_Raw, "\r");
   v6 = pScrolls;
-  do
+  for (uint i = 0; i < 82; ++i)
   {
     v1 = strtok(v0, "\r") + 1;
     v2 = 0;
@@ -5784,15 +5784,15 @@
     while ( v2 - 1 <= 1 && (char *)v7 == v0 );
     ++v6;
   }
-  while ( (signed int)v6 < (signed int)dword_723E80_award_related );
-}
-// 723E80: using guessed type int dword_723E80_award_related[];
+  //while ( (signed int)v6 < (signed int)dword_723E80_award_related );
+}
+
 
 //----- (00476590) --------------------------------------------------------
 void __cdecl InitializeMerchants()
 {
   char *v0; // ebx@1
-  char **v1; // edi@3
+  //char **v1; // edi@3
   char *v2; // ecx@4
   char v3; // dl@5
   char *v4; // eax@5
@@ -5806,8 +5806,8 @@
   pMerchantsTXT_Raw = 0;
   pMerchantsTXT_Raw = (char *)pEvents_LOD->LoadRaw("merchant.txt", 0);
   strtok(pMerchantsTXT_Raw, "\r");
-  v1 = (char **)pMerchantsRepairPhrases;
-  do
+  //v1 = (char **)pMerchantsRepairPhrases;
+  for (uint i = 0; i < 7; ++i)
   {
     v7 = v0;
     v6 = (signed int)v0;
@@ -5840,24 +5840,24 @@
       {
         if ( v7 == (char *)1 )
         {
-          *(v1 - 14) = RemoveQuotes(v2);
+          pMerchantsBuyPhrases[i] = RemoveQuotes(v2);
         }
         else
         {
           if ( v7 == (char *)2 )
           {
-            *(v1 - 7) = RemoveQuotes(v2);
+            pMerchantsSellPhrases[i] = RemoveQuotes(v2);
           }
           else
           {
             if ( v7 == (char *)3 )
             {
-              *v1 = RemoveQuotes(v2);
+              pMerchantsRepairPhrases[i] = RemoveQuotes(v2);
             }
             else
             {
               if ( v7 - 3 == (char *)1 )
-                v1[7] = RemoveQuotes(v2);
+                pMerchantsIdentifyPhrases[i] = RemoveQuotes(v2);
             }
           }
         }
@@ -5866,9 +5866,9 @@
       v2 = (char *)(v5 + 1);
     }
     while ( (signed int)(v7 - 1) <= 4 && (char *)v6 == v0 );
-    ++v1;
-  }
-  while ( (signed int)v1 < (signed int)pMerchantsIdentifyPhrases );
+    //++v1;
+  }
+  //while ( (signed int)v1 < (signed int)pMerchantsIdentifyPhrases );
 }
 
 //----- (00476682) --------------------------------------------------------
@@ -5890,7 +5890,7 @@
   pTransitionsTXT_Raw = (char *)pEvents_LOD->LoadRaw("trans.txt", 0);
   strtok(pTransitionsTXT_Raw, "\r");
   v6 = pTransitionStrings;
-  do
+  for (uint i = 0; i < 464; ++i)
   {
     v1 = strtok(v0, "\r") + 1;
     v2 = 0;
@@ -5930,7 +5930,7 @@
     while ( v2 - 1 <= 1 && (char *)v7 == v0 );
     ++v6;
   }
-  while ( (signed int)v6 < (signed int)"awards.txt" );
+  //while ( (signed int)v6 < (signed int)"awards.txt" );
 }
 
 //----- (00476750) --------------------------------------------------------
@@ -5950,7 +5950,7 @@
   pAutonoteTXT_Raw = (char *)pEvents_LOD->LoadRaw("autonote.txt", 0);
   strtok(pAutonoteTXT_Raw, "\r");
   v0 = (char *)&stru_723720[0].eType;
-  do
+  for (uint i = 0; i < 195; ++i)
   {
     v1 = 0;
     v2 = strtok(0, "\r") + 1;
@@ -6016,9 +6016,9 @@
     while ( v1 - 1 <= 2 && !v6 );
     v0 += 8;
   }
-  while ( (signed int)v0 < (signed int)&pScrolls[1] );
-}
-// 723720: using guessed type Autonote stru_723720[195];
+  //while ( (signed int)v0 < (signed int)&pScrolls[1] );
+}
+
 
 //----- (004768A9) --------------------------------------------------------
 void __cdecl InitializeQuests()
@@ -6029,7 +6029,7 @@
   char v3; // dl@5
   char *v4; // ecx@5
   int v5; // esi@9
-  const char **v6; // [sp+10h] [bp-8h]@3
+  //const char **v6; // [sp+10h] [bp-8h]@3
   signed int v7; // [sp+14h] [bp-4h]@4
 
   v0 = 0;
@@ -6038,8 +6038,10 @@
   pQuestsTXT_Raw = 0;
   pQuestsTXT_Raw = (char *)pEvents_LOD->LoadRaw("quests.txt", 0);
   strtok(pQuestsTXT_Raw, "\r");
-  v6 = pQuestTable;
-  do
+
+  //v6 = pQuestTable;
+  for (uint i = 0; i < 512; ++i)
+  //do
   {
     v1 = strtok(v0, "\r") + 1;
     v2 = 0;
@@ -6071,15 +6073,15 @@
       else
       {
         if ( v2 == 1 )
-          *v6 = RemoveQuotes(v1);
+          pQuestTable[i] = RemoveQuotes(v1);
       }
       ++v2;
       v1 = (char *)(v5 + 1);
     }
     while ( v2 - 1 <= 1 && (char *)v7 == v0 );
-    ++v6;
-  }
-  while ( (signed int)v6 < (signed int)&unk_723714 );
+    //++v6;
+  }
+  //while ( (signed int)v6 < (signed int)&unk_723714 );
 }
 
 
@@ -6087,19 +6089,14 @@
 //----- (00476977) --------------------------------------------------------
 void NPCStats::Initialize2()
 {
-  NPCStats *v1; // esi@1
-  char *v2; // ebx@1
-  char *v3; // eax@3
   char *v4; // eax@4
   char v5; // dl@5
   char *v6; // ecx@5
   int v7; // edi@9
-  char *v8; // eax@20
   char *v9; // eax@21
   char v10; // dl@22
   char *v11; // ecx@22
   int v12; // edi@26
-  char *v13; // eax@37
   char *v14; // eax@39
   char v15; // dl@40
   int v16; // ecx@40
@@ -6110,29 +6107,28 @@
   signed int v21; // ecx@58
   char *v22; // [sp+10h] [bp-10h]@4
   char *v23; // [sp+10h] [bp-10h]@21
-  char *v24; // [sp+10h] [bp-10h]@39
   char *v25; // [sp+14h] [bp-Ch]@4
   char *v26; // [sp+14h] [bp-Ch]@21
   signed int v27; // [sp+14h] [bp-Ch]@39
-  signed int v28; // [sp+18h] [bp-8h]@3
-  signed int v29; // [sp+18h] [bp-8h]@20
+  //signed int v28; // [sp+18h] [bp-8h]@3
+  //signed int v29; // [sp+18h] [bp-8h]@20
   signed int v30; // [sp+18h] [bp-8h]@37
   char *v31; // [sp+1Ch] [bp-4h]@37
 
-  v1 = this;
-  v2 = 0;
-  if ( this->pNPCTextTXT_Raw )
-    pAllocator->FreeChunk(this->pNPCTextTXT_Raw);
-  v1->pNPCTextTXT_Raw = 0;
-  v3 = (char *)pEvents_LOD->LoadRaw("npctext.txt", 0);
-  v1->pNPCTextTXT_Raw = v3;
-  strtok(v3, "\r");
-  v28 = (signed int)&unk_72166C_pNPCText;
-  do
-  {
-    v4 = strtok(v2, "\r") + 1;
-    v22 = v2;
-    v25 = v2;
+  //v1 = this;
+  //v2 = 0;
+  if (pNPCTextTXT_Raw)
+    pAllocator->FreeChunk(pNPCTextTXT_Raw);
+
+  //v3 = (char *)pEvents_LOD->LoadRaw("npctext.txt", 0);
+  pNPCTextTXT_Raw = (char *)pEvents_LOD->LoadRaw("npctext.txt", 0);
+  strtok(pNPCTextTXT_Raw, "\r");
+
+  for (uint i = 0; i < 789; ++i)
+  {
+    v4 = strtok(nullptr, "\r") + 1;
+    v22 = nullptr;
+    v25 = nullptr;
     do
     {
       v5 = *v4;
@@ -6147,40 +6143,39 @@
           v5 = v4[(int)v6];
         }
         while ( v5 != 9 );
-        v2 = 0;
+        //v2 = 0;
       }
       v7 = (int)&v4[(int)v6];
       if ( !v4[(int)v6] )
         v25 = (char *)1;
       *(char *)v7 = 0;
-      if ( v6 == v2 )
+      if ( v6 == nullptr )
       {
         v25 = (char *)1;
       }
       else
       {
         if ( v22 == (char *)1 )
-          *(int *)v28 = (int)RemoveQuotes(v4);
+          pNPCTopics[i].pText = RemoveQuotes(v4);
       }
       ++v22;
       v4 = (char *)(v7 + 1);
     }
-    while ( (signed int)(v22 - 1) <= 1 && v25 == v2 );
-    v28 += 8;
-  }
-  while ( v28 < (signed int)pQuestTable );
-  if ( v1->pNPCTopicTXT_Raw != v2 )
-    pAllocator->FreeChunk(v1->pNPCTopicTXT_Raw);
-  v1->pNPCTopicTXT_Raw = v2;
-  v8 = (char *)pEvents_LOD->LoadRaw("npctopic.txt", (int)v2);
-  v1->pNPCTopicTXT_Raw = v8;
-  strtok(v8, "\r");
-  v29 = (signed int)&unk_721668_pNPCTopic;
-  do
-  {
-    v9 = strtok(v2, "\r") + 1;
-    v23 = v2;
-    v26 = v2;
+    while ( (signed int)(v22 - 1) <= 1 && v25 == nullptr );
+  }
+
+  if (pNPCTopicTXT_Raw)
+    pAllocator->FreeChunk(pNPCTopicTXT_Raw);
+
+  //v8 = (char *)pEvents_LOD->LoadRaw("npctopic.txt", (int)v2);
+  pNPCTopicTXT_Raw = (char *)pEvents_LOD->LoadRaw("npctopic.txt", 0);
+  strtok(pNPCTopicTXT_Raw, "\r");
+
+  for (uint i = 0; i < 579; ++i)
+  {
+    v9 = strtok(nullptr, "\r") + 1;
+    v23 = nullptr;
+    v26 = nullptr;
     do
     {
       v10 = *v9;
@@ -6195,42 +6190,43 @@
           v10 = v9[(int)v11];
         }
         while ( v10 != 9 );
-        v2 = 0;
+        //v2 = 0;
       }
       v12 = (int)&v9[(int)v11];
       if ( !v9[(int)v11] )
         v26 = (char *)1;
       *(char *)v12 = 0;
-      if ( v11 == v2 )
+      if ( v11 == nullptr )
       {
         v26 = (char *)1;
       }
       else
       {
         if ( v23 == (char *)1 )
-          *(int *)v29 = (int)RemoveQuotes(v9);
+          pNPCTopics[i].pTopic = RemoveQuotes(v9);
       }
       ++v23;
       v9 = (char *)(v12 + 1);
     }
-    while ( (signed int)(v23 - 1) <= 1 && v26 == v2 );
-    v29 += 8;
-  }
-  while ( v29 < (signed int)&unk_722880 );
-  if ( v1->pNPCDistTXT_Raw != v2 )
-    pAllocator->FreeChunk(v1->pNPCDistTXT_Raw);
-  v1->pNPCDistTXT_Raw = v2;
-  v13 = (char *)pEvents_LOD->LoadRaw("npcdist.txt", (int)v2);
-  v1->pNPCDistTXT_Raw = v13;
-  strtok(v13, "\r");
-  strtok(v2, "\r");
+    while ( (signed int)(v23 - 1) <= 1 && v26 == nullptr );
+  }
+
+  if (pNPCDistTXT_Raw)
+    pAllocator->FreeChunk(pNPCDistTXT_Raw);
+
+  //v13 = (char *)pEvents_LOD->LoadRaw("npcdist.txt", (int)v2);
+  pNPCDistTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcdist.txt", 0);
+  strtok(pNPCDistTXT_Raw, "\r");
+  strtok(nullptr, "\r");
   v30 = 1;
-  v31 = &v1->array_16544[0].field_4[1];
+  v31 = &array_16544[0].field_4[1];
+
+  char *v2 = 0;
   while ( 2 )
   {
-    v14 = strtok(v2, "\r") + 1;
+    v14 = strtok(nullptr, "\r") + 1;
     v27 = 0;
-    v24 = v2;
+    char *v24 = nullptr;
     do
     {
       v15 = *v14;
@@ -6261,7 +6257,7 @@
       {
         if ( (signed int)v2 < 77 )
         {
-          v1->array_16544[(int)v2].field_4[v30] = atoi(v14);
+          array_16544[(int)v2].field_4[v30] = atoi(v14);
           goto LABEL_54;
         }
         v18 = v2 == 0;
@@ -6283,7 +6279,7 @@
     }
     break;
   }
-  v19 = v1->array_16544;
+  v19 = array_16544;
   v20 = 77;
   do
   {
@@ -6296,10 +6292,11 @@
     --v20;
   }
   while ( v20 );
-  if ( v1->pNPCDistTXT_Raw )
-  {
-    pAllocator->FreeChunk(v1->pNPCDistTXT_Raw);
-    v1->pNPCDistTXT_Raw = 0;
+
+  if (pNPCDistTXT_Raw)
+  {
+    pAllocator->FreeChunk(pNPCDistTXT_Raw);
+    pNPCDistTXT_Raw = nullptr;
   }
 }
 
@@ -6569,13 +6566,13 @@
 //----- (0047702F) --------------------------------------------------------
 void NPCStats::Initialize()
 {
-  NPCStats *v1; // edi@1
+  //NPCStats *v1; // edi@1
   char *v2; // ebx@1
-  char *v3; // eax@1
+  //char *v3; // eax@1
   char *v4; // ebx@3
   char v5; // al@4
   int v6; // ecx@4
-  char *v7; // eax@18
+  //char *v7; // eax@18
   char *v8; // ebx@18
   char *v9; // ecx@19
   char v10; // dl@20
@@ -6590,8 +6587,7 @@
   char *v19; // [sp+18h] [bp-8h]@18
   signed int v20; // [sp+1Ch] [bp-4h]@3
   signed int v21; // [sp+1Ch] [bp-4h]@19
-
-  v1 = this;
+  //v1 = this;
 
   Initialize1();
   Initialize2();
@@ -6603,13 +6599,13 @@
   InitializeMerchants();
   InitializeScrolls();
   v2 = 0;
-  v1->field_17FC0 = 0;
-  v1->pNPCNamesTXT_Raw = 0;
-  v3 = (char *)pEvents_LOD->LoadRaw("npcnames.txt", 0);
-  v1->pNPCNamesTXT_Raw = v3;
-  strtok(v3, "\r");
+  field_17FC0 = 0;
+  pNPCNamesTXT_Raw = 0;
+  //v3 = (char *)pEvents_LOD->LoadRaw("npcnames.txt", 0);
+  pNPCNamesTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcnames.txt", 0);
+  strtok(pNPCNamesTXT_Raw, "\r");
   v18 = 0;
-  v16 = (char *)v1->pNPCNames;
+  v16 = (char *)pNPCNames;
   while ( 1 )
   {
     v4 = strtok(v2, "\r") + 1;
@@ -6648,8 +6644,8 @@
       else
       {
 LABEL_45:
-        if ( v20 == 1 && !v1->uNumNPCNames[1] )
-          v1->uNumNPCNames[1] = v18;
+        if ( v20 == 1 && !uNumNPCNames[1] )
+          uNumNPCNames[1] = v18;
       }
       ++v20;
       v4 += v14 + 1;
@@ -6661,16 +6657,16 @@
       break;
     v2 = 0;
   }
-  v1->pNPCProfTXT_Raw = 0;
-  v1->uNumNPCNames[0] = v18;
-  v7 = (char *)pEvents_LOD->LoadRaw("npcprof.txt", 0);
-  v1->pNPCProfTXT_Raw = v7;
-  strtok(v7, "\r");
+  pNPCProfTXT_Raw = 0;
+  uNumNPCNames[0] = v18;
+  //v7 = (char *)pEvents_LOD->LoadRaw("npcprof.txt", 0);
+  pNPCProfTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcprof.txt", 0);
+  strtok(pNPCProfTXT_Raw, "\r");
   strtok(0, "\r");
   strtok(0, "\r");
   strtok(0, "\r");
-  v8 = (char *)&v1->pProfessions[0].pJoinText;
-  v19 = (char *)&v1->pProfessions[0].pJoinText;
+  v8 = (char *)&pProfessions[0].pJoinText;
+  v19 = (char *)&pProfessions[0].pJoinText;
   v13 = 58;
   do
   {
@@ -6732,7 +6728,7 @@
     v19 = v8;
   }
   while ( !v12 );
-  v1->uNumNPCProfessions = 59;
+  uNumNPCProfessions = 59;
 }
 
 //----- (00477266) --------------------------------------------------------
@@ -16876,7 +16872,7 @@
     sprintfex(byte_591098, pGlobalTXT_LocalizationStrings[410], pMapStats->pInfos[v1].pName);// "Leave %s"
   else
     strcpy(byte_591098, pGlobalTXT_LocalizationStrings[79]);// "Exit"
-  result = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)17, 0, (int)byte_591098);
+  result = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)17, 0, (int)byte_591098);
   pDialogueWindow = result;
   return result;
 }
@@ -17066,10 +17062,8 @@
 
 
 //----- (00445308) --------------------------------------------------------
-int __fastcall sub_445308(int a1)
-{
-  int result; // eax@12
-
+const char *__fastcall sub_445308(int a1)
+{
   if ( a1 == 10
     || a1 == 11
     || a1 == 12
@@ -17081,12 +17075,11 @@
     || a1 == 42
     || a1 == 43
     || a1 == 52 )
-    result = *(&pNPCStats->field_13A60 + 5 * a1);
-  else
-    result = dword_722320;
-  return result;
-}
-// 722320: using guessed type int dword_722320;
+    return (const char *)*(&pNPCStats->field_13A60 + 5 * a1);
+  else
+    return pNPCTopics[407].pTopic;
+}
+
 
 //----- (00445350) --------------------------------------------------------
 void __cdecl DrawDialogueUI()
@@ -17246,7 +17239,7 @@
       }
       if ( byte_5B0938[0] )
         goto LABEL_24;
-      v7 = ptr_F8B1E8;
+      v7 = (char *)ptr_F8B1E8;
 LABEL_37:
       v8 = 0;
       goto LABEL_38;
@@ -18154,7 +18147,7 @@
               pVideoPlayer->Unload();
             pVideoPlayer->bStopBeforeSchedule = 0;
             pVideoPlayer->field_40 = 0;
-            if ( pAsyncMouse )
+            if (pAsyncMouse)
               pAsyncMouse->Suspend();
             v128 = uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions;
             v13 = &pSomeEVT[v9];
@@ -18193,7 +18186,7 @@
               if ( v128 == 13 )
                 pVideoPlayer->_4BF28F(pAnimatedRooms[uCurrentHouse_Animation].field_0, 1u);
             }
-            if ( pAsyncMouse )
+            if (pAsyncMouse)
               pAsyncMouse->Resume();
             goto LABEL_291;
           case EVENT_CheckSkill:
@@ -18339,13 +18332,13 @@
                 if ( EnterHouse((enum HOUSE_TYPE)170) )
                 {
                   pAudioPlayer->StopChannels(-1, -1);
-                  ptr_507BC0 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_HouseInterior, 170, 0);
+                  ptr_507BC0 = GUIWindow::Create(0, 0, 640, 480, WINDOW_HouseInterior, 170, 0);
                   ptr_507BC0->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 1u, 0x31u, v7, 0);
                   ptr_507BC0->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 2u, 0x32u, v7, 0);
                   ptr_507BC0->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 3u, 0x33u, v7, 0);
                   ptr_507BC0->CreateButton(0x197u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 4u, 0x34u, v7, 0);
                   ptr_507BC0->CreateButton(0, 0, 0, 0, 1, 0, 0xB0u, 0, 9u, v7, 0);
-                  ptr_F8B1E8 = (char *)dword_72193C;
+                  ptr_F8B1E8 = pNPCTopics[90].pText;
                 }
               }
             }
@@ -18417,7 +18410,7 @@
                 if ( EnterHouse((enum HOUSE_TYPE)165) )
                 {
                   pAudioPlayer->PlaySound((SoundID)0, 0, 0, -1, 0, 0, 0, 0);
-                  v47 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_HouseInterior, 165, 0);
+                  v47 = GUIWindow::Create(0, 0, 640, 480, WINDOW_HouseInterior, 165, 0);
                   ptr_507BC0 = v47;
                   v48 = v47->pControlsHead;
                   if ( v48 )
@@ -19140,7 +19133,7 @@
               v104 = 187;
               if ( uCurrentHouse_Animation != 167 )
                 v104 = v103;
-              ptr_507BC0 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_HouseInterior, v104, 0);
+              ptr_507BC0 = GUIWindow::Create(0, 0, 640, 480, WINDOW_HouseInterior, v104, 0);
               ptr_507BC0->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 1u, 0x31u, v7, 0);
               ptr_507BC0->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 2u, 0x32u, v7, 0);
               ptr_507BC0->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 3u, 0x33u, v7, 0);
--- a/mm7_4.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/mm7_4.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -5139,7 +5139,7 @@
             }
             else
             {
-              v11 = (char *)dword_721824;
+              v11 = (char *)pNPCTopics[55].pText;
             }
             pPlayer = v61;
             v13 = a3;
@@ -6000,7 +6000,7 @@
     pTextures_arrowr[v4] = &pIcons_LOD->pTextures[v3];
   }
   while ( uControlParam < 20 );
-  pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Credits, 0, 0);
+  pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, 0);
   uControlParama = 0;
   uXa = 8;
   do
@@ -6478,7 +6478,7 @@
   v26 = 0;
   stru_506F20.Release();
   stru_506F20.Load("makeme.pcx", 0);
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
     pAsyncMouse->Resume();
   v2 = 6;
   pGUIWindow_CurrentMenu->field_40 = 0;
@@ -6714,7 +6714,7 @@
   }
   while ( (signed int)v10 < (signed int)((char *)&pParty->field_871C[455] + 2) );
   pAudioPlayer->StopChannels(-1, -1);
-  if ( pAsyncMouse )
+  if (pAsyncMouse)
     pAsyncMouse->Suspend();
   return v26;
 }
@@ -6832,7 +6832,7 @@
     v21.pPixels,
     (signed __int16)v21.uWidth);
   free(pString);
-  pWindow_Credits = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Credits, 0, (int)ptr);
+  pWindow_Credits = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, (int)ptr);
   pWindow_Credits->CreateButton(0, 0, 0, 0, 1, 0, 0x71u, 0, 0x1Bu, nullstring, 0);
   uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 9;
   SetCurrentMenuID(8u);
@@ -6862,7 +6862,7 @@
     }
     else
     {
-      if ( pAsyncMouse )
+      if (pAsyncMouse)
         pAsyncMouse->_46B736_consume_click_lists(1);
       if ( dword_A74C88 )
       {
@@ -10110,7 +10110,7 @@
   dword_F8B1A8 = 0;
   v11 = 0;
   uDialogueType = 84;
-  ptr_F8B1E8 = (char *)dword_722B44;
+  ptr_F8B1E8 = (char *)pNPCTopics[667].pText;
   v0 = _4F0882_evt_VAR_PlayerItemInHands_vals;
   while ( 1 )
   {
@@ -10135,7 +10135,7 @@
     if ( (signed int)v0 >= (signed int)((char *)dword_4F08EC + 2) )
       goto LABEL_10;
   }
-  ptr_F8B1E8 = (char *)dword_722B3C;
+  ptr_F8B1E8 = (char *)pNPCTopics[666].pText;
   v4 = _4F0882_evt_VAR_PlayerItemInHands_vals[2 * v11];
   dword_F8B1A8 = _4F0882_evt_VAR_PlayerItemInHands_vals[2 * v11];
   pParty->pPlayers[0].AddVariable(VAR_PlayerItemInHands, v4);
@@ -10231,7 +10231,7 @@
       if ( a1 == 13 )
       {
         ptr_F8B1E8 = (char *)*(&pNPCStats->field_13A64 + 5 * v2->uProfession);
-        ptr_F8B1E8 = sub_495461(ptr_F8B1E8, uActiveCharacter - 1, 0, 0, 0, 0);
+        ptr_F8B1E8 = sub_495461((char *)ptr_F8B1E8, uActiveCharacter - 1, 0, 0, 0, 0);
         sub_4B40E6();
         byte_F8B1EC = 0;
         goto _return;
@@ -10432,7 +10432,7 @@
       byte_F8B1EC = 0;
       uDialogueType = 13;
       ptr_F8B1E8 = (char *)*(&pNPCStats->field_13A64 + 5 * v2->uProfession);
-      ptr_F8B1E8 = sub_495461(ptr_F8B1E8, uActiveCharacter - 1, 0, 0, 0, 0);
+      ptr_F8B1E8 = sub_495461((char *)ptr_F8B1E8, uActiveCharacter - 1, 0, 0, 0, 0);
       if ( uActiveCharacter )
         pPlayers[uActiveCharacter]->PlaySound(38, 0);
       v19 = pGlobalTXT_LocalizationStrings[155];
@@ -10477,13 +10477,7 @@
 _return:
   pVideoPlayer->_4BF5B2();
 }
-// 591080: using guessed type int dword_591080;
-// F8B19C: using guessed type int dword_F8B19C;
-// F8B1A8: using guessed type int dword_F8B1A8;
-// F8B1B0: using guessed type int dword_F8B1B0;
-// F8B1B4: using guessed type int dword_F8B1B4;
-// F8B1D8: using guessed type int dword_F8B1D8;
-// F8B1EC: using guessed type char byte_F8B1EC;
+
 
 //----- (004B254D) --------------------------------------------------------
 char *__thiscall _4B254D_SkillMasteryTeacher(int _this)
@@ -10528,7 +10522,7 @@
   v2 = (_this - 200) % 3;
   v3 = (_this - 200) / 3;
   v4 = v2;
-  v35 = (char *)dword_721A64;
+  v35 = (char *)pNPCTopics[127].pText;
   dword_F8B1AC_something_todo_with_awards = v3;
   if ( v2 )
   {
@@ -10613,12 +10607,12 @@
     return pTmpBuf;
   }
   if ( !v1->CanAct() )
-    return _721A3C_npc_text;
+    return (char *)pNPCTopics[122].pText;
   if ( !v7 )
-    return (char *)_721A84_npc_text;
+    return (char *)pNPCTopics[131].pText;
   v16 = SkillToMastery(a1[0]);
   if ( (signed int)v16 > v4 + 1 )
-    return (char *)_721A6C_npc_text[2 * v4];
+    return (char *)pNPCTopics[v4 + 128].pText;
   if ( v34 != 2 )
   {
     if ( v34 == 3 )
@@ -10785,7 +10779,7 @@
   dword_F8B1B4 = 1000;
 LABEL_42:
   if ( dword_F8B1B4 > pParty->uNumGold )
-    return (char *)dword_721A4C;
+    return (char *)pNPCTopics[124].pText;
 LABEL_79:
   dword_F8B1A8 = 1;
   if ( v34 == 2 )
@@ -10816,13 +10810,12 @@
 
 
 //----- (004B29F2) --------------------------------------------------------
-int __fastcall sub_4B29F2(int a1)
+const char *__fastcall sub_4B29F2(int a1)
 {
   int v1; // esi@1
   Player *v2; // edi@1
   int v3; // eax@1
   Player *v4; // ecx@1
-  int result; // eax@2
 
   v1 = a1;
   dword_F8B1A8 = 0;
@@ -10835,26 +10828,25 @@
   {
     if ( (unsigned __int16)_449B57_test_bit((unsigned __int8 *)v2->field_152, dword_F8B1AC_something_todo_with_awards) )
     {
-      result = dword_721A44;
+      return pNPCTopics[123].pText;
     }
     else
     {
       if ( dword_F8B1B4 <= pParty->uNumGold )
       {
-        result = dword_7219DC[2 * v1];
         dword_F8B1A8 = 1;
+        return pNPCTopics[v1 + 110].pText;
       }
       else
       {
-        result = dword_721A4C;
-      }
-    }
-  }
-  else
-  {
-    result = (int)_721A3C_npc_text;
-  }
-  return result;
+        return pNPCTopics[124].pText;
+      }
+    }
+  }
+  else
+  {
+    return pNPCTopics[122].pText;
+  }
 }
 
 
@@ -11863,9 +11855,9 @@
 
   v0 = GetNPCData(uDialogue_SpeakingActorNPC_ID);
   v1 = 0;
-  pDialogueWindow->uWindowType = 1;
+  pDialogueWindow->eWindowType = WINDOW_MainMenu;
   pDialogueWindow->Release();
-  v2 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)10, 1, 0);
+  v2 = GUIWindow::Create(0, 0, 640, 480, WINDOW_A, 1, 0);
   pDialogueWindow = v2;
   if ( *(&pNPCStats->field_13A5C + 5 * v0->uProfession) )
   {
@@ -11905,22 +11897,22 @@
 
   v1 = a4;
   uDialogueType = 81;
-  ptr_F8B1E8 = (char *)dword_721984[2 * a4];
+  ptr_F8B1E8 = (char *)pNPCTopics[a4 + 99].pText;
   sub_4B29F2(a4);
   pDialogueWindow->Release();
-  pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x15Eu, WINDOW_Credits, v1, 0);
+  pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x15E, WINDOW_MainMenu, v1, 0);
   ptr_5076F4 = pDialogueWindow->CreateButton(
-                 0x1D7u,
-                 0x1BDu,
-                 0xA9u,
-                 0x23u,
+                 0x1D7,
+                 0x1BD,
+                 0xA9,
+                 0x23,
                  1,
                  0,
-                 0x71u,
+                 0x71,
                  0,
                  0,
                  pGlobalTXT_LocalizationStrings[34],
-                 (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0),
+                 (Texture *)(uTextureID_506438 != -1 ? &pIcons_LOD->pTextures[uTextureID_506438] : 0),
                  0);
   pDialogueWindow->CreateButton(0, 0, 0, 0, 1, 0, 0x51u, 0, 0, nullstring, 0);
   pDialogueWindow->CreateButton(
@@ -11948,10 +11940,10 @@
 
   v1 = a4;
   uDialogueType = 78;
-  ptr_F8B1E8 = (char *)dword_721BAC[2 * a4];
+  ptr_F8B1E8 = (char *)pNPCTopics[a4 + 168].pText;
   _4B254D_SkillMasteryTeacher(a4);
   pDialogueWindow->Release();
-  pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x15Eu, WINDOW_Credits, v1, 0);
+  pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x15Eu, WINDOW_MainMenu, v1, 0);
   v2 = nullstring;
   ptr_5076F4 = pDialogueWindow->CreateButton(
                  0x1D7u,
@@ -11985,7 +11977,7 @@
   v0 = 0;
   v1 = array_5913D8[(unsigned int)((char *)array_5913D8[6] + -(dword_591080 != 0) - 1)];
   pDialogueWindow->Release();
-  pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x15Eu, WINDOW_Credits, 0, 0);
+  pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x15Eu, WINDOW_MainMenu, 0, 0);
   ptr_5076F4 = pDialogueWindow->CreateButton(
                  0x1D7u,
                  0x1BDu,
@@ -12059,7 +12051,7 @@
   if ( _this + 1 == uNumDialogueNPCPortraits && uHouse_ExitPic )
   {
     pDialogueWindow->Release();
-    pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_Credits, 0, 0);
+    pDialogueWindow = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, 0);
     sprintfex(byte_591098, pGlobalTXT_LocalizationStrings[411], pMapStats->pInfos[uHouse_ExitPic].pName);
     ptr_5076F4 = pDialogueWindow->CreateButton(
                    0x236u,
@@ -12114,7 +12106,7 @@
         GUIButton::_41D0D8((GUIButton *)array_5913D8[i + 7]);
     }
     v4 = 1;
-    pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x159u, WINDOW_Credits, 0, 0);
+    pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x159u, WINDOW_MainMenu, 0, 0);
     ptr_5076F4 = pDialogueWindow->CreateButton(
                    471u,
                    445u,
@@ -12518,9 +12510,9 @@
       }
       if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() )
       {
-        v31 = _721A3C_npc_text;
+        v31 = pNPCTopics[122].pText;
         v32 = v71;
-        v33 = pFontArrus->CalcTextHeight(_721A3C_npc_text, &v65, 0, 0);
+        v33 = pFontArrus->CalcTextHeight(pNPCTopics[122].pText, &v65, 0, 0);
         v65.DrawText2(pFontArrus, 0, (212 - v33) / 2 + 101, v32, v31, 3u);
         result = (int)pDialogueWindow;
         pDialogueWindow->field_28 = 0;
@@ -13915,9 +13907,9 @@
                             (unsigned __int8 *)v1->field_152,
                             word_4F0704[2 * (unsigned int)ptr_507BC0->ptr_1C]) )
   {
-    v36 = dword_721A34;
+    v36 = pNPCTopics[121].pText;
     v37 = v57;
-    v38 = pFontArrus->CalcTextHeight(dword_721A34, &v52, 0, 0);
+    v38 = pFontArrus->CalcTextHeight(pNPCTopics[121].pText, &v52, 0, 0);
     v52.DrawText2(pFontArrus, 0, (212 - v38) / 2 + 101, v37, v36, 3u);
     result = (int)pDialogueWindow;
     pDialogueWindow->field_28 = 0;
@@ -14612,9 +14604,9 @@
                             (unsigned __int8 *)v1->field_152,
                             word_4F0754[2 * (unsigned int)ptr_507BC0->ptr_1C]) )
   {
-    v24 = dword_721BC4;
+    v24 = pNPCTopics[171].pText;
     v25 = v31;
-    v26 = pFontArrus->CalcTextHeight(dword_721BC4, &v28, 0, 0);
+    v26 = pFontArrus->CalcTextHeight(pNPCTopics[171].pText, &v28, 0, 0);
     v28.DrawText2(pFontArrus, 0, (212 - v26) / 2 + 101, v25, v24, 3u);
     result = (int)pDialogueWindow;
     pDialogueWindow->field_28 = 0;
@@ -15689,7 +15681,7 @@
 LABEL_19:
   strcpy(byte_591098, v21);
 LABEL_20:
-  pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)26, 0, (int)byte_591098);
+  pDialogueWindow = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)26, 0, (int)byte_591098);
   //if ( BYTE1(pAnimatedRooms[p2DEvents_minus1___02[26 * v9]].field_C) )
   if ( BYTE1(pAnimatedRooms[p2DEvents[v9 - 1].uAnimationID].field_C) )
     HousePlaySomeSound(v9, 1);
--- a/mm7_5.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/mm7_5.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -583,7 +583,7 @@
           uTextureID_507CB0 = pIcons_LOD->LoadTexture("option03", TEXTURE_16BIT_PALETTE);
           uTextureID_507CB8 = pIcons_LOD->LoadTexture("option02", TEXTURE_16BIT_PALETTE);
           uTextureID_507CB4 = pIcons_LOD->LoadTexture("option01", TEXTURE_16BIT_PALETTE);
-          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_Options, 0, 0);
+          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_Options, 0, 0);
           pGUIWindow_CurrentMenu->CreateButton(
             0x16u,
             0x10Eu,
@@ -785,7 +785,7 @@
           uTextureID_507BFC = pIcons_LOD->LoadTexture("resume1", TEXTURE_16BIT_PALETTE);
           uTextureID_507C00 = pIcons_LOD->LoadTexture("optkb_1", TEXTURE_16BIT_PALETTE);
           uTextureID_507C04 = pIcons_LOD->LoadTexture("optkb_2", TEXTURE_16BIT_PALETTE);
-          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_KeyMappingOptions, 0, 0);
+          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_KeyMappingOptions, 0, 0);
           pGUIWindow_CurrentMenu->CreateButton(0xF1u, 0x12Eu, 0xD6u, 0x28u, 1, 0, 0x71u, 0, 0, nullstring, 0);
           pGUIWindow_CurrentMenu->CreateButton(19u, 0x12Eu, 0x6Cu, 0x14u, 1, 0, 0x1A0u, 0, 0, nullstring, 0);
           pGUIWindow_CurrentMenu->CreateButton(127u, 0x12Eu, 0x6Cu, 0x14u, 1, 0, 0x1A1u, 0, 0, nullstring, 0);
@@ -891,7 +891,7 @@
           uTextureID_507C50 = pIcons_LOD->LoadTexture("opvdG-bs", TEXTURE_16BIT_PALETTE);
           uTextureID_507C54 = pIcons_LOD->LoadTexture("opvdG-cl", TEXTURE_16BIT_PALETTE);
           uTextureID_507C58 = pIcons_LOD->LoadTexture("opvdG-tn", TEXTURE_16BIT_PALETTE);
-          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_VideoOptions, 0, 0);
+          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_VideoOptions, 0, 0);
           pGUIWindow_CurrentMenu->CreateButton(0xF1u, 0x12Eu, 0xD6u, 0x28u, v0, 0, 0x71u, 0, 0, v1, 0);
           if ( pRenderer->pRenderD3D )
           {
@@ -1175,7 +1175,7 @@
             }
             goto LABEL_184;
           }
-          ModalWindow(pstr_722494, 0);
+          ModalWindow(pNPCTopics[453].pText, 0);
           goto _continue;
         case UIMSG_SkillUp|0x2:
           pGUIWindow_CurrentMenu->Release();
@@ -1225,7 +1225,7 @@
             pGUIWindow_CurrentMenu->Release();
           pEventTimer->Pause();
           pAudioPlayer->StopChannels(-1, -1);
-          v26 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_Book, uMessage, 0);
+          v26 = GUIWindow::Create(0, 0, 640, 480, WINDOW_Book, uMessage, 0);
           v27 = 354;
           v28 = 570;
           v170 = 0;
@@ -1241,7 +1241,7 @@
             pGUIWindow_CurrentMenu->Release();
           pEventTimer->Pause();
           pAudioPlayer->StopChannels(-1, -1);
-          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_Book, uMessage, 0);
+          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_Book, uMessage, 0);
           ptr_507BE0 = GUIWindow::Create(0x258u, 0x169u, 0, 0, (enum WindowType)99, (int)ptr_507A00, 0);
           bFlashHistoryBook = 0;
           goto _continue;
@@ -1588,7 +1588,7 @@
               uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = v0;
               if ( !pIcons_LOD->uNumPrevLoadedFiles )
                 pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
-              pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)3, 0, 0);
+              pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)3, 0, 0);
               uTextureID_507944 = pIcons_LOD->LoadTexture("options", TEXTURE_16BIT_PALETTE);
               uTextureID_507940 = pIcons_LOD->LoadTexture("new1", TEXTURE_16BIT_PALETTE);
               uTextureID_50793C = pIcons_LOD->LoadTexture("load1", TEXTURE_16BIT_PALETTE);
@@ -2041,7 +2041,7 @@
 LABEL_438:
           v141 = (WindowType)9;
 LABEL_439:
-          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, v141, v148, v162);
+          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, v141, v148, v162);
           goto _continue;
         case UIMSG_B2:
           v165 = 0;
@@ -2468,7 +2468,7 @@
           if ( !uActiveCharacter
             || uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions )
             goto LABEL_90;
-          ptr_507BC8 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)104, uMessageParam, 0);
+          ptr_507BC8 = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)104, uMessageParam, 0);
           uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 25;
           pEventTimer->Pause();
           goto _continue;
@@ -2881,7 +2881,7 @@
                 GUIWindow::Create(0x1DCu, 0x1C2u, 0, 0, (enum WindowType)90, (int)ptr_5079F8, 0);
                 uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 8;
                 pEventTimer->Pause();
-                pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)18, 0, 0);
+                pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)18, 0, 0);
                 pAudioPlayer->PlaySound((SoundID)48, 0, 0, -1, 0, 0, 0, 0);
                 viewparams->field_48 = v0;
                 goto _continue;
@@ -2902,7 +2902,7 @@
           pEventTimer->Pause();
           pAudioPlayer->StopChannels(-1, -1);
           uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 104;
-          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)12, 5, 0);
+          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)12, 5, 0);
           papredoll_dbrds[2] = pIcons_LOD->LoadTexture("BUTTEXI1", TEXTURE_16BIT_PALETTE);
           ptr_5076F4 = pGUIWindow_CurrentMenu->CreateButton(
                          0x187u,
@@ -2944,12 +2944,12 @@
             dword_50651C = -1;
           goto _continue;
         case UIMSG_A9:
-          GUIWindow::Create(ptr_507B9C->uX, ptr_507B9C->uY, 0, 0, WINDOW_HouseInterior|0x42, (int)ptr_507B9C, 0);
+          GUIWindow::Create(ptr_507B9C->uX, ptr_507B9C->uY, 0, 0, (WindowType)(WINDOW_HouseInterior|0x42), (int)ptr_507B9C, 0);
 LABEL_707:
           dword_506548 = v0;
           goto _continue;
         case UIMSG_AA:
-          GUIWindow::Create(ptr_507BA0->uX, ptr_507BA0->uY, 0, 0, WINDOW_HouseInterior|0x42, (int)ptr_507BA0, 0);
+          GUIWindow::Create(ptr_507BA0->uX, ptr_507BA0->uY, 0, 0, (WindowType)(WINDOW_HouseInterior|0x42), (int)ptr_507BA0, 0);
 LABEL_709:
           dword_506544 = v0;
           goto _continue;
@@ -3069,7 +3069,7 @@
             pCharacterScreen_AwardsBtn->uY,
             0,
             0,
-            WINDOW_HouseInterior|0x42,
+            (WindowType)(WINDOW_HouseInterior|0x42),
             (int)pCharacterScreen_AwardsBtn,
             0);
           sub_419100();
@@ -3371,7 +3371,7 @@
 //----- (00435748) --------------------------------------------------------
 void __cdecl GUI_MainMenuMessageProc()
 {
-  AudioPlayer *v0; // ebp@2
+  //AudioPlayer *v0; // ebp@2
   char *v1; // ebx@2
   unsigned int v2; // ecx@18
   void *v3; // edi@21
@@ -3421,7 +3421,7 @@
 
   if ( pMessageQueue_50CBD0->uNumMessages )
   {
-    v0 = pAudioPlayer;
+    //v0 = pAudioPlayer;
     v1 = (char *)pParty->pPlayers;
     do
     {
@@ -3521,7 +3521,7 @@
               (enum WindowType)92,
               (int)pCreationUI_BtnPressLeft[v25],
               1);
-            v0 = pAudioPlayer;
+            //v0 = pAudioPlayer;
             pAudioPlayer->PlaySound((SoundID)66, 0, 0, -1, 0, 0, 0, 0);
             v22 = (Player *)v23;
             goto LABEL_117;
@@ -3550,7 +3550,7 @@
               (enum WindowType)92,
               (int)pCreationUI_BtnPressRight[v21],
               1);
-            v0 = pAudioPlayer;
+            //v0 = pAudioPlayer;
             pAudioPlayer->PlaySound((SoundID)66, 0, 0, -1, 0, 0, 0, 0);
             v22 = (Player *)v19;
 LABEL_117:
@@ -3904,7 +3904,7 @@
                 v40 = 2;
                 goto LABEL_89;
               }
-              if ( v45 == 57 )
+              if ( v45 == UIMSG_ExitToWindows )
               {
                 GUIWindow::Create(0x1EFu, 0x151u, 0, 0, (enum WindowType)90, (int)pMainMenu_BtnExit, 0);
                 v40 = 4;
@@ -14245,7 +14245,7 @@
   v3 = a4;
   pEventTimer->Pause();
   dword_506F0C[0] = uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions;
-  result = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_FinalWindow, v3, (int)v2);
+  result = GUIWindow::Create(0, 0, 640, 480, WINDOW_FinalWindow, v3, (int)v2);
   ptr_507BDC = result;
   uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 22;
   return result;
@@ -14903,12 +14903,13 @@
   GUIButton Dst; // [sp+28h] [bp-E0h]@133
   ItemGen v51; // [sp+E4h] [bp-24h]@129
 
-  if ( GetCurrentMenuID() != 6 )
-    sub_41CD4F(0x22u);
+  if (GetCurrentMenuID() != MENU_CREATEPARTY)
+    sub_41CD4F(34);
   for ( i = 1; i <= uNumVisibleWindows; ++i )
   {
-    v0 = (GUIWindow *)&pWindowList_at_506F50_minus1_indexing[21 * pVisibleWindowsIdxs[i]];
-    v1 = v0->uWindowType;
+    //v0 = (GUIWindow *)&pWindowList_at_506F50_minus1_indexing[21 * pVisibleWindowsIdxs[i]];
+    v0 = &pWindowList[pVisibleWindowsIdxs[i] - 1];
+    v1 = v0->eWindowType;
     if ( (signed int)v1 > 70 )
     {
       if ( (signed int)v1 > 95 )
@@ -15889,7 +15890,7 @@
       if ( v5 )
       {
         if ( a2 == 57 )
-          v7 = (const CHAR *)dword_72266C;
+          v7 = pNPCTopics[512].pText;
         else
           v7 = (const CHAR *)*(&pNPCStats->field_13A5C + 5 * v5->uProfession);
         lpsz = v7;
@@ -16406,7 +16407,8 @@
       return;
     while ( 1 )
     {
-      v8 = (GUIWindow *)&pWindowList_at_506F50_minus1_indexing[21 * pVisibleWindowsIdxs[v7]];
+      //v8 = (GUIWindow *)&pWindowList_at_506F50_minus1_indexing[21 * pVisibleWindowsIdxs[v7]];
+      v8 = &pWindowList[pVisibleWindowsIdxs[v7] - 1];
       if ( x >= (signed int)v8->uFrameX )
       {
         if ( x <= (signed int)v8->uFrameZ && y >= (signed int)v8->uFrameY && y <= (signed int)v8->uFrameW )
@@ -16516,7 +16518,7 @@
 {
   if ( pArcomageGame->bGameInProgress == 1 )
   {
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       pArcomageGame->stru1.field_0 = 7;
   }
 }
@@ -16526,7 +16528,7 @@
 {
   if ( pArcomageGame->bGameInProgress == 1 )
   {
-    if ( pAsyncMouse )
+    if (pAsyncMouse)
       pArcomageGame->stru1.field_0 = 8;
   }
 }
--- a/mm7_6.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/mm7_6.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -2342,7 +2342,7 @@
       {
         if ( ptr_507BD4 )
           return result;
-        ptr_507BD4 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_HouseInterior|0x2, (int)&pStru277[result], 0);
+        ptr_507BD4 = GUIWindow::Create(0, 0, 640, 480, (WindowType)(WINDOW_HouseInterior|0x2), (int)&pStru277[result], 0);
         ptr_507BD4->CreateButton(0x34u, 0x1A6u, 0x23u, 0, 2, 0, 0x45u, 0, 0x31u, nullstring, 0);
         ptr_507BD4->CreateButton(0xA5u, 0x1A6u, 0x23u, 0, 2, 0, 0x45u, 1u, 0x32u, nullstring, 0);
         ptr_507BD4->CreateButton(0x118u, 0x1A6u, 0x23u, 0, 2, 0, 0x45u, 2u, 0x33u, nullstring, 0);
@@ -2353,7 +2353,7 @@
       {
         if ( ptr_507BD4 )
           return result;
-        v17 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_HouseInterior|0x2, (int)&pStru277[result], 0);
+        v17 = GUIWindow::Create(0, 0, 640, 480, (WindowType)(WINDOW_HouseInterior|0x2), (int)&pStru277[result], 0);
         v29 = 0;
         v28 = nullstring;
         v27 = 0;
@@ -2376,7 +2376,7 @@
       {
         if ( ptr_507BD4 )
           return result;
-        v17 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_HouseInterior|0x2, (int)&pStru277[result], 0);
+        v17 = GUIWindow::Create(0, 0, 640, 480, (WindowType)(WINDOW_HouseInterior|0x2), (int)&pStru277[result], 0);
         v29 = 0;
         v28 = nullstring;
         v27 = 0;
@@ -2400,7 +2400,7 @@
       {
         if ( ptr_507BD4 )
           return result;
-        ptr_507BD4 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_HouseInterior|0x2, 20 * result + 5292232, 0);
+        ptr_507BD4 = GUIWindow::Create(0, 0, 640, 480, (WindowType)(WINDOW_HouseInterior|0x2), 20 * result + 5292232, 0);
         ptr_507BD4->CreateButton(0x34u, 0x1A6u, 0x23u, 0, 2, 0, 0x8Du, 0, 0x31u, nullstring, 0);
         ptr_507BD4->CreateButton(0xA5u, 0x1A6u, 0x23u, 0, 2, 0, 0x8Du, 1u, 0x32u, nullstring, 0);
         ptr_507BD4->CreateButton(0x118u, 0x1A6u, 0x23u, 0, 2, 0, 0x8Du, 2u, 0x33u, nullstring, 0);
@@ -2421,7 +2421,7 @@
       }
       if ( HIBYTE(v6) & 2 && !ptr_507BD4 )
       {
-        ptr_507BD4 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_HouseInterior|0x2, 20 * result + 5292232, 0);
+        ptr_507BD4 = GUIWindow::Create(0, 0, 640, 480, (WindowType)(WINDOW_HouseInterior|0x2), 20 * result + 5292232, 0);
         ptr_5079EC = ptr_507BD4->CreateButton(
                        0x1D5u,
                        0xB2u,
--- a/mm7_data.cpp	Wed Oct 10 21:05:53 2012 +0600
+++ b/mm7_data.cpp	Wed Oct 10 21:06:27 2012 +0600
@@ -1,5 +1,6 @@
 #include "mm7_data.h"
 
+#include "NPC.h"
 
 
 
@@ -324,6 +325,7 @@
 
 int (__cdecl *sprintfex)(char *a1, const char *a2, ...) = nullptr;
 
+int pWindowList_at_506F50_minus1_indexing[1];
 int dword_4C9890[10]; // weak
 int dword_4C9920[16]; // weak
 _UNKNOWN unk_4D8548; // weak
@@ -1060,24 +1062,13 @@
 char aGammaControlNo[777]; // idb
 __int16 word_4E8152[11];
 char byte_4E8168[116];
-char aEWorkMsdevMm7Mm7CodeGenerate_cpp[777]; // idb
-char aCanTCreateRandomMonsterSSeeMapstats_txtAndMonsters[777]; // idb
-char aSC[777]; // idb
-char aSB[5]; // weak
-char aSA[777]; // idb
-char aElementalLightA[777]; // idb
-char aElementalLightB[18]; // weak
-char aElementalLightC[18]; // weak
-char asc_4E82A4[2]; // weak
-int dword_4E82B4; // weak
-int dword_4E82B8; // weak
-int dword_4E82BC; // weak
-int dword_4E82C0; // weak
 char aD3dTextureName[777]; // idb
 char aLogd3d_txt[777]; // idb
 char byte_4E8398[777]; // weak
 _UNKNOWN unk_4E83B0; // weak
 _UNKNOWN unk_4E8408; // weak
+stru355 stru_4E82A4 = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000};
+stru355 stru_4EFCBC = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000};
 char aGlobal_txt[777]; // idb
 char aMagic[777]; // idb
 char aDark_0[777]; // idb
@@ -2084,7 +2075,6 @@
 char aDirect3dRender[777]; // idb
 char aD3drendInitFai[777]; // idb
 char aThereArenTAn_0[777]; // idb
-int dword_4EFCBC[8];
 char aErrorExecuting[777]; // idb
 char aEWorkMsdevM_23[777]; // idb
 char aHiscreen16Load[777]; // idb
@@ -2370,7 +2360,6 @@
 int dword_506E68; // weak
 __int16 word_506E6C[18]; // weak
 unsigned int pPrevVirtualCidesMapping[27];
-int pWindowList_at_506F50_minus1_indexing[777]; // idb
 int dword_506F08; // weak
 int dword_506F0C[777]; // idb
 int uRestUI_FoodRequiredToRest;
@@ -2702,7 +2691,7 @@
 int dword_6BE368_debug_settings_2; // weak
 unsigned __int8 bUseLoResSprites;
 unsigned __int8 bUseRegistry;
-unsigned __int8 bCanLoadFromCD;
+unsigned __int8 bCanLoadFromCD = false;
 int bShowDamage; // idb
 unsigned int bAlwaysRun;
 unsigned int bFlipOnExit;
@@ -2721,6 +2710,7 @@
 char _702ACC_unused; // weak
 int bDebugResouces; // weak
 unsigned int bNoVideo;
+bool bNoCD = false;
 int aborting_app; // weak
 int dword_720020_zvalues[100];
 int dword_7201B0_zvalues[299];
@@ -2755,33 +2745,7 @@
 int blv_prev_party_y; // weak
 char *dword_721660; // idb
 char *dword_721664; // idb
-_UNKNOWN unk_721668_pNPCTopic; // weak
-_UNKNOWN unk_72166C_pNPCText; // weak
-int dword_721824; // weak
-int dword_72193C; // weak
-int dword_721984[22];
-int dword_7219DC[777]; // weak
-char *dword_721A34; // idb
-char *_721A3C_npc_text; // idb
-int dword_721A44; // weak
-int dword_721A4C; // weak
-int dword_721A64; // weak
-int _721A6C_npc_text[777]; // weak
-int _721A84_npc_text; // weak
-int dword_721BAC[6];
-char *dword_721BC4; // idb
-_UNKNOWN dword_721E24[777]; // idb
-int dword_722164; // weak
-int dword_72216C; // weak
-int dword_722174; // weak
-char *pStr_72217C; // idb
-int dword_722240[777]; // idb
-int dword_722320; // weak
-char *pstr_722494;
-int dword_72266C; // weak
-_UNKNOWN unk_722880; // weak
-int dword_722B3C; // weak
-int dword_722B44; // weak
+NPCTopic pNPCTopics[789];
 char *dword_722F10; // idb
 const char *pQuestTable[512];
 _UNKNOWN unk_723714; // weak
@@ -2791,7 +2755,7 @@
 int dword_723E80_award_related[777]; // weak
 int dword_723E84[777]; // weak
 int dword_7241C8; // weak
-struct NPCStats *pNPCStats;
+struct NPCStats *pNPCStats = nullptr;
 char *aNPCProfessionNames[59];
 char *pAwardsTXT_Raw;
 char *pScrollsTXT_Raw;
@@ -2895,7 +2859,7 @@
 int dword_F8B198; // weak
 int dword_F8B19C; // weak
 __int16 word_F8B1A0; // weak
-char *dword_F8B1A4; // idb
+const char *dword_F8B1A4; // idb
 int dword_F8B1A8; // weak
 int dword_F8B1AC_something_todo_with_awards; // idb
 int dword_F8B1B0; // weak
@@ -2906,7 +2870,7 @@
 int dword_F8B1DC; // weak
 int dword_F8B1E0; // weak
 int dword_F8B1E4; // weak
-char *ptr_F8B1E8; // idb
+const char *ptr_F8B1E8; // idb
 char byte_F8B1EC; // weak
 char byte_F8B1EF[777]; // weak
 char byte_F8B1F0[4];
--- a/mm7_data.h	Wed Oct 10 21:05:53 2012 +0600
+++ b/mm7_data.h	Wed Oct 10 21:06:27 2012 +0600
@@ -312,6 +312,7 @@
 // Data declarations
 extern int (__cdecl *sprintfex)(char *a1, const char *a2, ...);
 
+extern int pWindowList_at_506F50_minus1_indexing[1];
 extern int dword_4C9890[10]; // weak
 extern int dword_4C9920[16]; // weak
 extern _UNKNOWN unk_4D8548; // weak
@@ -1048,24 +1049,14 @@
 extern char aGammaControlNo[]; // idb
 extern __int16 word_4E8152[11];
 extern char byte_4E8168[116];
-extern char aEWorkMsdevMm7Mm7CodeGenerate_cpp[]; // idb
-extern char aCanTCreateRandomMonsterSSeeMapstats_txtAndMonsters[]; // idb
-extern char aSC[]; // idb
-extern char aSB[5]; // weak
-extern char aSA[]; // idb
-extern char aElementalLightA[]; // idb
-extern char aElementalLightB[18]; // weak
-extern char aElementalLightC[18]; // weak
-extern char asc_4E82A4[2]; // weak
-extern int dword_4E82B4; // weak
-extern int dword_4E82B8; // weak
-extern int dword_4E82BC; // weak
-extern int dword_4E82C0; // weak
 extern char aD3dTextureName[]; // idb
 extern char aLogd3d_txt[]; // idb
 extern char byte_4E8398[]; // weak
 extern _UNKNOWN unk_4E83B0; // weak
 extern _UNKNOWN unk_4E8408; // weak
+#include "Texture.h"
+extern stru355 stru_4E82A4;// = {0x20, 0x41, 0, 0x20, 0xFF0000, 0xFF00, 0xFF, 0xFF000000};
+extern stru355 stru_4EFCBC;// = {0x20, 0x41, 0, 0x10, 0x7C00, 0x3E0, 0x1F, 0x8000};
 extern char aGlobal_txt[]; // idb
 extern char aMagic[]; // idb
 extern char aDark_0[]; // idb
@@ -2072,7 +2063,6 @@
 extern char aDirect3dRender[]; // idb
 extern char aD3drendInitFai[]; // idb
 extern char aThereArenTAn_0[]; // idb
-extern int dword_4EFCBC[8];
 extern char aErrorExecuting[]; // idb
 extern char aEWorkMsdevM_23[]; // idb
 extern char aHiscreen16Load[]; // idb
@@ -2359,7 +2349,6 @@
 extern int dword_506E68; // weak
 extern __int16 word_506E6C[18]; // weak
 extern unsigned int pPrevVirtualCidesMapping[27];
-extern int pWindowList_at_506F50_minus1_indexing[]; // idb
 extern int dword_506F08; // weak
 extern int dword_506F0C[]; // idb
 extern int uRestUI_FoodRequiredToRest;
@@ -2710,6 +2699,7 @@
 extern char _702ACC_unused; // weak
 extern int bDebugResouces; // weak
 extern unsigned int bNoVideo;
+extern bool bNoCD;
 extern int aborting_app; // weak
 extern int dword_720020_zvalues[100];
 extern int dword_7201B0_zvalues[299];
@@ -2744,33 +2734,6 @@
 extern int blv_prev_party_y; // weak
 extern char *dword_721660; // idb
 extern char *dword_721664; // idb
-extern _UNKNOWN unk_721668_pNPCTopic; // weak
-extern _UNKNOWN unk_72166C_pNPCText; // weak
-extern int dword_721824; // weak
-extern int dword_72193C; // weak
-extern int dword_721984[22];
-extern int dword_7219DC[]; // weak
-extern char *dword_721A34; // idb
-extern char *_721A3C_npc_text; // idb
-extern int dword_721A44; // weak
-extern int dword_721A4C; // weak
-extern int dword_721A64; // weak
-extern int _721A6C_npc_text[]; // weak
-extern int _721A84_npc_text; // weak
-extern int dword_721BAC[6];
-extern char *dword_721BC4; // idb
-extern _UNKNOWN dword_721E24[]; // idb
-extern int dword_722164; // weak
-extern int dword_72216C; // weak
-extern int dword_722174; // weak
-extern char *pStr_72217C; // idb
-extern int dword_722240[]; // idb
-extern int dword_722320; // weak
-extern char *pstr_722494;
-extern int dword_72266C; // weak
-extern _UNKNOWN unk_722880; // weak
-extern int dword_722B3C; // weak
-extern int dword_722B44; // weak
 extern char *dword_722F10; // idb
 extern const char *pQuestTable[512];
 extern _UNKNOWN unk_723714; // weak
@@ -2884,7 +2847,7 @@
 extern int dword_F8B198; // weak
 extern int dword_F8B19C; // weak
 extern __int16 word_F8B1A0; // weak
-extern char *dword_F8B1A4; // idb
+extern const char *dword_F8B1A4; // idb
 extern int dword_F8B1A8; // weak
 extern int dword_F8B1AC_something_todo_with_awards; // idb
 extern int dword_F8B1B0; // weak
@@ -2895,7 +2858,7 @@
 extern int dword_F8B1DC; // weak
 extern int dword_F8B1E0; // weak
 extern int dword_F8B1E4; // weak
-extern char *ptr_F8B1E8; // idb
+extern const char *ptr_F8B1E8; // idb
 extern char byte_F8B1EC; // weak
 extern char byte_F8B1EF[]; // weak
 extern char byte_F8B1F0[4];
@@ -3214,7 +3177,7 @@
 void __cdecl DrawBranchlessDialogueUI();
 void __fastcall sub_4451A8_press_any_key(int a1, int a2, int a4);
 void __cdecl sub_4452BB();
-int __fastcall sub_445308(int a1);
+const char *__fastcall sub_445308(int a1);
 void __cdecl DrawDialogueUI();
 struct NPCData *__fastcall GetNPCData(unsigned int npcid);
 struct NPCData *__fastcall GetNewNPCData(signed int npcid, int a2);
@@ -3519,7 +3482,7 @@
 void __cdecl sub_4B1ECE();
 void __fastcall sub_4B2001(signed int a1);
 char *__thiscall _4B254D_SkillMasteryTeacher(int _this);
-int __fastcall sub_4B29F2(int a1);
+const char *__fastcall sub_4B29F2(int a1);
 char __cdecl sub_4B2A74();
 struct GUIButton *__fastcall sub_4B36CC(int a1, unsigned int a2);
 int __thiscall sub_4B3703(void *_this);
@@ -3550,7 +3513,7 @@
 POINT *__cdecl sub_4B9CC6();
 void __cdecl sub_4BA928();
 signed int __fastcall sub_4BB756(signed int a1);
-int __cdecl sub_4BBA85_bounties();
+const char *sub_4BBA85_bounties();
 void __cdecl sub_4BBCDD();
 void __fastcall _4BBF61_summon_actor(int a1, __int16 x, int y, int z); // idb
 void __cdecl ArenaFight();