changeset 2558:5d6fb8eb023c

Слияние
author Ritor1
date Wed, 13 May 2015 20:09:12 +0600
parents bbef1435eb8d (current diff) f2a8ed07e921 (diff)
children 6ab1273bc507
files GUI/GUIWindow.cpp
diffstat 23 files changed, 1476 insertions(+), 648 deletions(-) [+]
line wrap: on
line diff
--- a/Build/Visual Studio 2013/World of Might and Magic.vcxproj	Wed May 13 20:09:00 2015 +0600
+++ b/Build/Visual Studio 2013/World of Might and Magic.vcxproj	Wed May 13 20:09:12 2015 +0600
@@ -151,9 +151,12 @@
     <ClCompile Include="..\..\Engine\TurnEngine\TurnEngine.cpp" />
     <ClCompile Include="..\..\Engine\VectorTypes.cpp" />
     <ClCompile Include="..\..\Engine\ZlibWrapper.cpp" />
+    <ClCompile Include="..\..\Game\CreateParty.cpp" />
     <ClCompile Include="..\..\Game\Game.cpp" />
+    <ClCompile Include="..\..\Game\GameMenu.cpp" />
     <ClCompile Include="..\..\Game\GameOver.cpp" />
     <ClCompile Include="..\..\Game\MainMenu.cpp" />
+    <ClCompile Include="..\..\Game\MainMenuLoad.cpp" />
     <ClCompile Include="..\..\GUI\GUIButton.cpp" />
     <ClCompile Include="..\..\GUI\GUIFont.cpp" />
     <ClCompile Include="..\..\GUI\GUIProgressBar.cpp" />
@@ -330,9 +333,12 @@
     <ClInclude Include="..\..\Engine\TurnEngine\TurnEngine.h" />
     <ClInclude Include="..\..\Engine\VectorTypes.h" />
     <ClInclude Include="..\..\Engine\ZlibWrapper.h" />
+    <ClInclude Include="..\..\Game\CreateParty.h" />
     <ClInclude Include="..\..\Game\Game.h" />
+    <ClInclude Include="..\..\Game\GameMenu.h" />
     <ClInclude Include="..\..\Game\GameOver.h" />
     <ClInclude Include="..\..\Game\MainMenu.h" />
+    <ClInclude Include="..\..\Game\MainMenuLoad.h" />
     <ClInclude Include="..\..\GUI\GUIButton.h" />
     <ClInclude Include="..\..\GUI\GUIFont.h" />
     <ClInclude Include="..\..\GUI\GUIProgressBar.h" />
--- a/Build/Visual Studio 2013/World of Might and Magic.vcxproj.filters	Wed May 13 20:09:00 2015 +0600
+++ b/Build/Visual Studio 2013/World of Might and Magic.vcxproj.filters	Wed May 13 20:09:12 2015 +0600
@@ -601,6 +601,15 @@
     <ClCompile Include="..\..\GUI\UI\Chest.cpp">
       <Filter>GUI\UI</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\Game\MainMenuLoad.cpp">
+      <Filter>Game</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\Game\CreateParty.cpp">
+      <Filter>Game</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\Game\GameMenu.cpp">
+      <Filter>Game</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\lib\libavcodec\avcodec.h">
@@ -1369,6 +1378,15 @@
     <ClInclude Include="..\..\GUI\UI\Chest.h">
       <Filter>GUI\UI</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\Game\MainMenuLoad.h">
+      <Filter>Game</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\Game\CreateParty.h">
+      <Filter>Game</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\Game\GameMenu.h">
+      <Filter>Game</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\lib\OpenAL\lib\x86\avcodec-55.def">
--- a/Build/Visual Studio 2013/World of Might and Magic.vcxproj.user	Wed May 13 20:09:00 2015 +0600
+++ b/Build/Visual Studio 2013/World of Might and Magic.vcxproj.user	Wed May 13 20:09:12 2015 +0600
@@ -4,6 +4,6 @@
     <LocalDebuggerCommand>$(OutDir)$(TargetName)$(TargetExt)</LocalDebuggerCommand>
     <LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
-    <LocalDebuggerCommandArguments>-nomarg -window -nointro -nologo</LocalDebuggerCommandArguments>
+    <LocalDebuggerCommandArguments>-nomarg -window -nointro -nologo -nocd</LocalDebuggerCommandArguments>
   </PropertyGroup>
 </Project>
\ No newline at end of file
--- a/Engine/Engine.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/Engine/Engine.cpp	Wed May 13 20:09:12 2015 +0600
@@ -1,76 +1,76 @@
-
-
 #define _CRTDBG_MAP_ALLOC
+#define _CRT_SECURE_NO_WARNINGS
 #include <stdlib.h>
 #include <crtdbg.h>
-
-#define _CRT_SECURE_NO_WARNINGS
+#include <direct.h>
 
 #include "Engine/Engine.h"
-
-#include "Arcomage\Arcomage.h"
-
+#include "Engine/Party.h"
+#include "Engine/Timer.h"
+#include "Engine/LOD.h"
+#include "Engine/Events.h"
+#include "Engine/OurMath.h"
+#include "Engine/texts.h"
+#include "Engine/stru123.h"
+#include "Engine/LuaVM.h"
+#include "Engine/MMT.h"
+#include "Engine/SaveLoad.h"
+#include "Engine/Registry.h"
 #include "Engine/Graphics/Vis.h"
 #include "Engine/Graphics/Weather.h"
 #include "Engine/Graphics/LightmapBuilder.h"
 #include "Engine/Graphics/DecalBuilder.h"
 #include "Engine/Graphics/ParticleEngine.h"
-#include "IO/Mouse.h"
-#include "IO/Keyboard.h"
 #include "Engine/Graphics/GammaControl.h"
-#include "stru6.h"
 #include "Engine/Graphics/stru9.h"
 #include "Engine/Graphics/stru10.h"
-
-#include "Engine/Party.h"
 #include "Engine/Graphics/Viewport.h"
-#include "Engine/Timer.h"
 #include "Engine/Graphics/Outdoor.h"
 #include "Engine/Graphics/Overlays.h"
-#include "Media/Audio/AudioPlayer.h"
-#include "Engine/LOD.h"
-#include "GUI/GUIWindow.h"
+#include "Engine/Graphics/Lights.h"
+#include "Engine/Graphics/Level/Decoration.h"
+#include "Engine/Graphics/PaletteManager.h"
+#include "Engine/Graphics/DecorationList.h"
+#include "Engine/Graphics/RenderD3D11.h"
+#include "Engine/Graphics/Sprites.h"
 #include "Engine/TurnEngine/TurnEngine.h"
-#include "Media/Video/Bink_Smacker.h"
-#include "Engine/Events.h"
-#include "Engine/OurMath.h"
-#include "Engine/texts.h"
-#include "GUI/GUIFont.h"
-#include "Engine/Graphics/Lights.h"
 #include "Engine/Spells/CastSpellInfo.h"
 #include "Engine/Tables/FrameTableInc.h"
 #include "Engine/Objects/Actor.h"
+#include "Engine/Objects/ObjectList.h"
+#include "Engine/Objects/SpriteObject.h"
+#include "Engine/Objects/Chest.h"
+
+#include "Arcomage\Arcomage.h"
+
+#include "IO/Mouse.h"
+#include "IO/Keyboard.h"
+
+#include "GUI/GUIWindow.h"
 #include "GUI/GUIProgressBar.h"
-#include "Engine/Objects/ObjectList.h"
-#include "Engine/Graphics/Level/Decoration.h"
-#include "Engine/Graphics/PaletteManager.h"
+#include "GUI/GUIFont.h"
+#include "GUI/UI/UIGame.h"
 #include "GUI/UI/UIHouses.h"
 #include "GUI/UI/UIShops.h"
 #include "GUI/UI/UIPartyCreation.h"
-#include "Engine/SaveLoad.h"
-#include "Engine/Objects/SpriteObject.h"
-#include "Engine/Graphics/Sprites.h"
-#include "Engine/Registry.h"
-#include "Engine/Objects/Chest.h"
-
-#include "GUI/UI/UIGame.h"
-
-#include "Engine/Graphics/DecorationList.h"
+
+#include "GUI/NewUI/MainMenu.h"
+
+#include "Media/Audio/AudioPlayer.h"
+#include "Media/Video/Bink_Smacker.h"
+
 #include "Engine/Tables/IconFrameTable.h"
 #include "Engine/Tables/PlayerFrameTable.h"
-#include "Engine/MapsLongTimer.h"
 #include "Engine/Tables/StorylineTextTable.h"
 #include "Engine/Tables/FactionTable.h"
-#include "Engine/stru123.h"
-#include "Engine/LuaVM.h"
-#include "Engine/Graphics/RenderD3D11.h"
-#include "Engine/MMT.h"
-#include "GUI/NewUI\MainMenu.h"
+#include "Engine/MapsLongTimer.h"
 
 #include "Game/Game.h"
 #include "Game/MainMenu.h"
-
-#include <direct.h>
+#include "Game/MainMenuLoad.h"
+#include "Game/CreateParty.h"
+
+#include "stru6.h"
 
 
 
@@ -1811,8 +1811,8 @@
     Log::Warning(L"MM: entering main loop");
     while (1)
     {
-        MainMenuWindow *main_menu_window = MainMenuWindow::Create();
-        window->AddControl(main_menu_window);
+        //MainMenuWindow *main_menu_window = MainMenuWindow::Create();
+        //window->AddControl(main_menu_window);
         MainMenu_Loop();
         uGameState = GAME_STATE_PLAYING;
         while (1)
@@ -1822,27 +1822,16 @@
                 pEngine->Deinitialize();
                 return true;
             }
-
-            if (GetCurrentMenuID() == MENU_NEWGAME)
+            else if (GetCurrentMenuID() == MENU_SAVELOAD)
             {
-                if (use_music_folder)
-                    alSourceStop(mSourceID);
-                else
-                {
-                    if (pAudioPlayer->hAILRedbook)
-                        AIL_redbook_stop(pAudioPlayer->hAILRedbook);
-                }
-                pParty->Reset();
-                pOtherOverlayList->Reset();
-                strcpy(pCurrentMapName, pStartingMapName);
-                pParty->CreateDefaultParty(0);
-                PlayerCreationUI_Initialize();
-                if (PlayerCreationUI_Loop())
-                {
-                    DeleteCCharFont();
+                MainMenuLoad_Loop();
+                break;
+            }
+            else if (GetCurrentMenuID() == MENU_NEWGAME)
+            {
+                if (!CreateParty_Loop())
                     break;
-                }
-                DeleteCCharFont();
+
                 bFlashQuestBook = true;
                 pMediaPlayer->PlayFullscreenMovie(MOVIE_Emerald, true);
                 SaveNewGame();
@@ -2456,7 +2445,7 @@
 
     if (pGUIWindow_ScrollWindow)
         free_book_subwindow();
-    if (!current_screen_type && !pGUIWindow_Settings)
+    if (!current_screen_type && !pGUIWindow_CastTargetedSpell)
         pEventTimer->Resume();
     viewparams->bRedrawGameUI = 1;
 }
--- a/Engine/Objects/Player.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/Engine/Objects/Player.cpp	Wed May 13 20:09:12 2015 +0600
@@ -7604,11 +7604,11 @@
         enchantedItemPos = this->GetItemIDAtInventoryIndex(&invMatrixIndex);
         if ( enchantedItemPos )
         {
-         /* *((char *)pGUIWindow_Settings->ptr_1C + 8) &= 0x7Fu;
-          *((short *)pGUIWindow_Settings->ptr_1C + 2) = uActiveCharacter - 1;
-          *((int *)pGUIWindow_Settings->ptr_1C + 3) = enchantedItemPos - 1;
-          *((short *)pGUIWindow_Settings->ptr_1C + 3) = invMatrixIndex;*/
-          pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C;
+         /* *((char *)pGUIWindow_CastTargetedSpell->ptr_1C + 8) &= 0x7Fu;
+          *((short *)pGUIWindow_CastTargetedSpell->ptr_1C + 2) = uActiveCharacter - 1;
+          *((int *)pGUIWindow_CastTargetedSpell->ptr_1C + 3) = enchantedItemPos - 1;
+          *((short *)pGUIWindow_CastTargetedSpell->ptr_1C + 3) = invMatrixIndex;*/
+          pSpellInfo = (CastSpellInfo *)pGUIWindow_CastTargetedSpell->ptr_1C;
           pSpellInfo->uFlags &= 0x7F;
           pSpellInfo->uPlayerID_2 = uActiveCharacter - 1;
           pSpellInfo->spell_target_pid = enchantedItemPos - 1;
--- a/Engine/SaveLoad.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/Engine/SaveLoad.cpp	Wed May 13 20:09:12 2015 +0600
@@ -179,7 +179,11 @@
     }
   }
 
-  pGUIWindow_CurrentMenu->Release();
+  if (pGUIWindow_CurrentMenu)
+  {
+      pGUIWindow_CurrentMenu->Release();
+      pGUIWindow_CurrentMenu = nullptr;
+  }
   current_screen_type = SCREEN_GAME;
 
   viewparams->bRedrawGameUI = true;
--- a/Engine/Spells/CastSpellInfo.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/Engine/Spells/CastSpellInfo.cpp	Wed May 13 20:09:12 2015 +0600
@@ -3284,8 +3284,8 @@
     if (pCastSpellInfo[i].uSpellID && pCastSpellInfo[i].uFlags & 0x3CA)
     {
       pCastSpellInfo[i].uSpellID = 0;
-      pGUIWindow_Settings->Release();
-      pGUIWindow_Settings = 0;
+      pGUIWindow_CastTargetedSpell->Release();
+      pGUIWindow_CastTargetedSpell = nullptr;
       pMouse->SetCursorBitmap("MICON1");
       GameUI_Footer_TimeLeft = 0;
       _50C9A0_IsEnchantingInProgress = 0;
@@ -3487,8 +3487,8 @@
       spell->uSpellID = 0;
       if (spell->uFlags & 0x3CA)
       {
-        pGUIWindow_Settings->Release();
-        pGUIWindow_Settings = nullptr;
+        pGUIWindow_CastTargetedSpell->Release();
+        pGUIWindow_CastTargetedSpell = nullptr;
         pMouse->SetCursorBitmap("MICON1");
         GameUI_Footer_TimeLeft = 0;
         _50C9A0_IsEnchantingInProgress = 0;
@@ -3501,44 +3501,44 @@
     {
       if ( a5 & 2 )
       {
-        if ( pGUIWindow_Settings )
+        if ( pGUIWindow_CastTargetedSpell )
           return;
-        pGUIWindow_Settings = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
-        pGUIWindow_Settings->CreateButton(52, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 0, 49, "", 0);
-        pGUIWindow_Settings->CreateButton(165, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 1, 50, "", 0);
-        pGUIWindow_Settings->CreateButton(280, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 2, 51, "", 0);
-        pGUIWindow_Settings->CreateButton(390, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 3, 52, "", 0);
+        pGUIWindow_CastTargetedSpell = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(52, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 0, 49, "", 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(165, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 1, 50, "", 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(280, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 2, 51, "", 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(390, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 3, 52, "", 0);
         pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
         return;
       }
       if ( a5 & 8 )
       {
-        if ( pGUIWindow_Settings )
+        if ( pGUIWindow_CastTargetedSpell )
           return;
 
-        pGUIWindow_Settings = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
-        pGUIWindow_Settings->CreateButton(game_viewport_x, game_viewport_y, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Shoot_Monster, 0, 0, "", 0);
+        pGUIWindow_CastTargetedSpell = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(game_viewport_x, game_viewport_y, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Shoot_Monster, 0, 0, "", 0);
         pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
         return;
       }
       if ( a5 & 0x40 )
       {
-        if ( pGUIWindow_Settings )
+        if ( pGUIWindow_CastTargetedSpell )
           return;
 
-        pGUIWindow_Settings = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
-        pGUIWindow_Settings->CreateButton(game_viewport_x, game_viewport_y, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Telekinesis, 0, 0, "", 0);
+        pGUIWindow_CastTargetedSpell = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(game_viewport_x, game_viewport_y, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Telekinesis, 0, 0, "", 0);
         pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
         return;
       }
       if ( (char)a5 < 0 )
       {
-        if ( pGUIWindow_Settings )
+        if ( pGUIWindow_CastTargetedSpell )
           return;
         ++pIcons_LOD->uTexturePacksCount;
         if ( !pIcons_LOD->uNumPrevLoadedFiles )
           pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
-        pGUIWindow_Settings = pCastSpellInfo[result].GetCastSpellInInventoryWindow();
+        pGUIWindow_CastTargetedSpell = pCastSpellInfo[result].GetCastSpellInInventoryWindow();
         _50C9A0_IsEnchantingInProgress = 1;
         some_active_character = uActiveCharacter;
         pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
@@ -3546,31 +3546,31 @@
       }
       if ( HIBYTE(a5) & 1 )
       {
-        if ( pGUIWindow_Settings )
+        if ( pGUIWindow_CastTargetedSpell )
           return;
-        pGUIWindow_Settings = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
-        pGUIWindow_Settings->CreateButton(0x34u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 0, 0x31u, "", 0);
-        pGUIWindow_Settings->CreateButton(0xA5u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 1, 0x32u, "", 0);
-        pGUIWindow_Settings->CreateButton(0x118u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 2, 0x33u, "", 0);
-        pGUIWindow_Settings->CreateButton(0x186u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 3, 0x34u, "", 0);
-        pGUIWindow_Settings->CreateButton(8, 8, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Monster_Improvement, 0, 0, "", NULL);
+        pGUIWindow_CastTargetedSpell = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(0x34u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 0, 0x31u, "", 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(0xA5u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 1, 0x32u, "", 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(0x118u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 2, 0x33u, "", 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(0x186u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 3, 0x34u, "", 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(8, 8, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Monster_Improvement, 0, 0, "", NULL);
         pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
       }
-      if ( HIBYTE(a5) & 2 && !pGUIWindow_Settings )
+      if ( HIBYTE(a5) & 2 && !pGUIWindow_CastTargetedSpell )
       {
-          pGUIWindow_Settings = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
-        pBtn_NPCLeft = pGUIWindow_Settings->CreateButton(469, 178,
+          pGUIWindow_CastTargetedSpell = new OnCastTargetedSpell(0, 0, window->GetWidth(), window->GetHeight(), (int)&pCastSpellInfo[result], 0);
+        pBtn_NPCLeft = pGUIWindow_CastTargetedSpell->CreateButton(469, 178,
                        pIcons_LOD->GetTexture(uTextureID_Btn_NPCLeft)->uTextureWidth,
                        pIcons_LOD->GetTexture(uTextureID_Btn_NPCLeft)->uTextureHeight,
                        1, 0, UIMSG_ScrollNPCPanel, 0, 0, "",
                        pIcons_LOD->GetTexture(uTextureID_Btn_NPCLeft), 0);
-        pBtn_NPCRight = pGUIWindow_Settings->CreateButton(626, 178,
+        pBtn_NPCRight = pGUIWindow_CastTargetedSpell->CreateButton(626, 178,
                        pIcons_LOD->GetTexture(uTextureID_Btn_NPCRight)->uTextureWidth,
                        pIcons_LOD->GetTexture(uTextureID_Btn_NPCRight)->uTextureHeight,
                        1, 0, UIMSG_ScrollNPCPanel, 1, 0, "",
                        pIcons_LOD->GetTexture(uTextureID_Btn_NPCRight), 0);
-        pGUIWindow_Settings->CreateButton(491, 149, 64, 74, 1, 0, UIMSG_HiredNPC_CastSpell, 4, 0x35u, "", 0);
-        pGUIWindow_Settings->CreateButton(561, 149, 64, 74, 1, 0, UIMSG_HiredNPC_CastSpell, 5, 0x36u, "", 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(491, 149, 64, 74, 1, 0, UIMSG_HiredNPC_CastSpell, 4, 0x35u, "", 0);
+        pGUIWindow_CastTargetedSpell->CreateButton(561, 149, 64, 74, 1, 0, UIMSG_HiredNPC_CastSpell, 5, 0x36u, "", 0);
       }
     }
 }
--- a/GUI/GUIButton.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/GUI/GUIButton.cpp	Wed May 13 20:09:12 2015 +0600
@@ -85,7 +85,7 @@
 struct GUIWindow *ptr_507BC8;
 struct GUIWindow *pGUIWindow_CurrentMenu;
 struct GUIWindow *ptr_507BD0;
-struct GUIWindow *pGUIWindow_Settings;
+struct GUIWindow *pGUIWindow_CastTargetedSpell;
 struct GUIWindow *pModalWindow;
 struct GUIWindow *pGUIWindow_EscMessageWindow;
 struct GUIWindow *pBooksButtonOverlay;
--- a/GUI/GUIWindow.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/GUI/GUIWindow.cpp	Wed May 13 20:09:12 2015 +0600
@@ -64,7 +64,7 @@
 enum WindowType current_character_screen_window;
 struct GUIWindow *pWindow_MMT_MainMenu;
 struct GUIWindow *pWindow_MainMenu;
-std::array<struct GUIWindow *, 20> pWindowList;
+std::array<struct GUIWindow *, 50> pWindowList;
 
 struct GUIMessageQueue *pMessageQueue_50CBD0 = new GUIMessageQueue;
 struct GUIMessageQueue *pMessageQueue_50C9E8 = new GUIMessageQueue;
--- a/GUI/GUIWindow.h	Wed May 13 20:09:00 2015 +0600
+++ b/GUI/GUIWindow.h	Wed May 13 20:09:12 2015 +0600
@@ -37,7 +37,7 @@
   UIMSG_MainMenu_ShowLoadWindow = 55,
   UIMSG_ShowCredits = 56,
   UIMSG_ExitToWindows = 57,
-  UIMSG_3A = 58,
+  UIMSG_DebugBlv = 58,
 
   UIMSG_PlayerCreationChangeName = 60,
 
@@ -134,7 +134,7 @@
   UIMSG_PlayerCreation_FacePrev = 171,
   UIMSG_PlayerCreation_FaceNext = 172,
   UIMSG_AD = 173,
-  UIMSG_AE = 174,
+  UIMSG_DebugBlv2 = 174,
   UIMSG_ClickNPCTopic = 175,
   UIMSG_CycleCharacters = 176,
   UIMSG_OnCastLloydsBeacon = 177,
@@ -606,7 +606,7 @@
 extern enum WindowType current_character_screen_window;
 extern struct GUIWindow *pWindow_MMT_MainMenu;
 extern struct GUIWindow *pWindow_MainMenu;
-extern std::array<struct GUIWindow *, 20> pWindowList;
+extern std::array<struct GUIWindow *, 50> pWindowList;
 
 
 
@@ -830,7 +830,7 @@
 extern struct GUIWindow *ptr_507BC8;
 extern struct GUIWindow *pGUIWindow_CurrentMenu;
 extern struct GUIWindow *ptr_507BD0;
-extern struct GUIWindow *pGUIWindow_Settings;
+extern struct GUIWindow *pGUIWindow_CastTargetedSpell;
 extern struct GUIWindow *pModalWindow;
 extern struct GUIWindow *pGUIWindow_EscMessageWindow;
 extern struct GUIWindow *pBooksButtonOverlay;
--- a/GUI/UI/UICharacter.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/GUI/UI/UICharacter.cpp	Wed May 13 20:09:12 2015 +0600
@@ -2743,11 +2743,11 @@
     }
     if ( _50C9A0_IsEnchantingInProgress )//   
     {
-      /* *((char *)pGUIWindow_Settings->ptr_1C + 8) &= 0x7Fu;//CastSpellInfo
-      *((short *)pGUIWindow_Settings->ptr_1C + 2) = uActiveCharacter - 1;
-      *((int *)pGUIWindow_Settings->ptr_1C + 3) = v36;
-      *((short *)pGUIWindow_Settings->ptr_1C + 3) = pEquipType;*/
-      pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C;
+      /* *((char *)pGUIWindow_CastTargetedSpell->ptr_1C + 8) &= 0x7Fu;//CastSpellInfo
+      *((short *)pGUIWindow_CastTargetedSpell->ptr_1C + 2) = uActiveCharacter - 1;
+      *((int *)pGUIWindow_CastTargetedSpell->ptr_1C + 3) = v36;
+      *((short *)pGUIWindow_CastTargetedSpell->ptr_1C + 3) = pEquipType;*/
+      pSpellInfo = (CastSpellInfo *)pGUIWindow_CastTargetedSpell->ptr_1C;
       pSpellInfo->uFlags &= 0x7F;
       pSpellInfo->uPlayerID_2 = uActiveCharacter - 1;
       pSpellInfo->spell_target_pid = v34 - 1;
--- a/GUI/UI/UIMainMenu.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/GUI/UI/UIMainMenu.cpp	Wed May 13 20:09:12 2015 +0600
@@ -56,8 +56,8 @@
     POINT pt;
     pMouse->GetCursorPos(&pt);
     GUIWindow *pWindow = this;//pWindow_MainMenu;
-    if (GetCurrentMenuID() == MENU_SAVELOAD)
-        pWindow = pGUIWindow_CurrentMenu;
+    //if (GetCurrentMenuID() == MENU_SAVELOAD)
+    //    pWindow = pGUIWindow_CurrentMenu;
 
 
     if (GetCurrentMenuID() == MENU_MAIN)
--- a/GUI/UI/UIPartyCreation.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/GUI/UI/UIPartyCreation.cpp	Wed May 13 20:09:12 2015 +0600
@@ -1,29 +1,28 @@
 #define _CRTDBG_MAP_ALLOC
+#define _CRT_SECURE_NO_WARNINGS
 #include <stdlib.h>
 #include <crtdbg.h>
 
-#define _CRT_SECURE_NO_WARNINGS
-
 #include "Engine/Engine.h"
+#include "Engine/Party.h"
+#include "Engine/LOD.h"
+#include "Engine/Timer.h"
+#include "Engine/texts.h"
+#include "Engine/MMT.h"
+#include "Engine/Graphics/Render.h"
+#include "Engine/Tables/IconFrameTable.h"
 
-#include "UIPartyCreation.h"
-#include "..\../IO/Mouse.h"
-#include "..\../IO/Keyboard.h"
+#include "IO/Mouse.h"
+#include "IO/Keyboard.h"
+
+#include "GUI/UI/UIPartyCreation.h"
+#include "GUI/GUIFont.h"
+
+#include "Media/Audio/AudioPlayer.h"
 
 #include "Game/Game.h"
 #include "Game/MainMenu.h"
-#include "..\../GUI/GUIWindow.h"
-#include "..\../GUI/GUIFont.h"
-#include "..\../Engine/Party.h"
-#include "..\../Media/Audio/AudioPlayer.h"
-#include "..\../Engine/Graphics/Render.h"
-#include "..\../Engine/LOD.h"
-#include "..\../Engine/Timer.h"
-#include "..\../Engine/Tables/IconFrameTable.h"
-#include "..\../Engine/texts.h"
-
-#include "..\../Engine/MMT.h"
-
+#include "Game/CreateParty.h"
 
 
 //----- (004908DE) --------------------------------------------------------
@@ -78,8 +77,11 @@
     pIcons_LOD->ReloadTexture(pTextures_PlayerFaces[player_id][i], pTmpBuf.data(), 2);
   }
 }
+
+
 //----- (00495B39) --------------------------------------------------------
-void PlayerCreationUI_Draw()
+//void PlayerCreationUI_Draw()
+void GUIWindow_PartyCreation::Update()
 {
   int pTextCenter; // eax@3
   IconFrame *pFrame; // eax@3
@@ -385,8 +387,10 @@
   pRenderer->EndScene();
 }
 
+
 //----- (0049695A) --------------------------------------------------------
-void  PlayerCreationUI_Initialize()
+GUIWindow_PartyCreation::GUIWindow_PartyCreation() :
+    GUIWindow(0, 0, window->GetWidth(), window->GetHeight(), 0, nullptr)
 {
   unsigned int v0; // ebx@5
   signed int uControlParam; // [sp+10h] [bp-Ch]@7
@@ -438,81 +442,84 @@
     pTextures_arrowr[i] = pIcons_LOD->LoadTexturePtr(pTmpBuf.data(), TEXTURE_16BIT_PALETTE);
   }
 
-  pGUIWindow_CurrentMenu = new GUIWindow(0, 0, window->GetWidth(), window->GetHeight(), 0, 0);
+  //pGUIWindow_CurrentMenu = new GUIWindow(0, 0, window->GetWidth(), window->GetHeight(), 0, 0);
   uControlParam = 0;
   uX = 8;
   do
   {
-    pGUIWindow_CurrentMenu->CreateButton(uX, 120, 145, 25, 1, 0, UIMSG_PlayerCreationChangeName, uControlParam, 0, "", 0);
+    CreateButton(uX, 120, 145, 25, 1, 0, UIMSG_PlayerCreationChangeName, uControlParam, 0, "", 0);
     uX += 158;
     ++uControlParam;
   }
   while ( (signed int)uX < window->GetWidth() );
 
-  pCreationUI_BtnPressLeft[0]   = pGUIWindow_CurrentMenu->CreateButton( 10,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FacePrev,  0, 0, "", pTexture_presleft, 0);
-  pCreationUI_BtnPressLeft[1]   = pGUIWindow_CurrentMenu->CreateButton(169,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FacePrev,  1, 0, "", pTexture_presleft, 0);
-  pCreationUI_BtnPressLeft[2]   = pGUIWindow_CurrentMenu->CreateButton(327,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FacePrev,  2, 0, "", pTexture_presleft, 0);
-  pCreationUI_BtnPressLeft[3]   = pGUIWindow_CurrentMenu->CreateButton(486,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FacePrev,  3, 0, "", pTexture_presleft, 0);
+  pCreationUI_BtnPressLeft[0]   = CreateButton( 10,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FacePrev,  0, 0, "", pTexture_presleft, 0);
+  pCreationUI_BtnPressLeft[1]   = CreateButton(169,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FacePrev,  1, 0, "", pTexture_presleft, 0);
+  pCreationUI_BtnPressLeft[2]   = CreateButton(327,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FacePrev,  2, 0, "", pTexture_presleft, 0);
+  pCreationUI_BtnPressLeft[3]   = CreateButton(486,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FacePrev,  3, 0, "", pTexture_presleft, 0);
 
-  pCreationUI_BtnPressRight[0]  = pGUIWindow_CurrentMenu->CreateButton( 74,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FaceNext,  0, 0, "", pTexture_pressrigh, 0);
-  pCreationUI_BtnPressRight[1]  = pGUIWindow_CurrentMenu->CreateButton(233,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FaceNext,  1, 0, "", pTexture_pressrigh, 0);
-  pCreationUI_BtnPressRight[2]  = pGUIWindow_CurrentMenu->CreateButton(391,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FaceNext,  2, 0, "", pTexture_pressrigh, 0);
-  pCreationUI_BtnPressRight[3]  = pGUIWindow_CurrentMenu->CreateButton(549,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FaceNext,  3, 0, "", pTexture_pressrigh, 0);
+  pCreationUI_BtnPressRight[0]  = CreateButton( 74,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FaceNext,  0, 0, "", pTexture_pressrigh, 0);
+  pCreationUI_BtnPressRight[1]  = CreateButton(233,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FaceNext,  1, 0, "", pTexture_pressrigh, 0);
+  pCreationUI_BtnPressRight[2]  = CreateButton(391,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FaceNext,  2, 0, "", pTexture_pressrigh, 0);
+  pCreationUI_BtnPressRight[3]  = CreateButton(549,  32, 11, 13, 1, 0, UIMSG_PlayerCreation_FaceNext,  3, 0, "", pTexture_pressrigh, 0);
 
-  pCreationUI_BtnPressLeft2[0]  = pGUIWindow_CurrentMenu->CreateButton( 10, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoicePrev, 0, 0, "", pTexture_presleft, 0);
-  pCreationUI_BtnPressLeft2[1]  = pGUIWindow_CurrentMenu->CreateButton(169, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoicePrev, 1, 0, "", pTexture_presleft, 0);
-  pCreationUI_BtnPressLeft2[2]  = pGUIWindow_CurrentMenu->CreateButton(327, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoicePrev, 2, 0, "", pTexture_presleft, 0);
-  pCreationUI_BtnPressLeft2[3]  = pGUIWindow_CurrentMenu->CreateButton(486, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoicePrev, 3, 0, "", pTexture_presleft, 0);
+  pCreationUI_BtnPressLeft2[0]  = CreateButton( 10, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoicePrev, 0, 0, "", pTexture_presleft, 0);
+  pCreationUI_BtnPressLeft2[1]  = CreateButton(169, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoicePrev, 1, 0, "", pTexture_presleft, 0);
+  pCreationUI_BtnPressLeft2[2]  = CreateButton(327, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoicePrev, 2, 0, "", pTexture_presleft, 0);
+  pCreationUI_BtnPressLeft2[3]  = CreateButton(486, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoicePrev, 3, 0, "", pTexture_presleft, 0);
 
-  pCreationUI_BtnPressRight2[0] = pGUIWindow_CurrentMenu->CreateButton( 74, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoiceNext, 0, 0, "", pTexture_pressrigh, 0);
-  pCreationUI_BtnPressRight2[1] = pGUIWindow_CurrentMenu->CreateButton(233, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoiceNext, 1, 0, "", pTexture_pressrigh, 0);
-  pCreationUI_BtnPressRight2[2] = pGUIWindow_CurrentMenu->CreateButton(391, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoiceNext, 2, 0, "", pTexture_pressrigh, 0);
-  pCreationUI_BtnPressRight2[3] = pGUIWindow_CurrentMenu->CreateButton(549, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoiceNext, 3, 0, "", pTexture_pressrigh, 0);
+  pCreationUI_BtnPressRight2[0] = CreateButton( 74, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoiceNext, 0, 0, "", pTexture_pressrigh, 0);
+  pCreationUI_BtnPressRight2[1] = CreateButton(233, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoiceNext, 1, 0, "", pTexture_pressrigh, 0);
+  pCreationUI_BtnPressRight2[2] = CreateButton(391, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoiceNext, 2, 0, "", pTexture_pressrigh, 0);
+  pCreationUI_BtnPressRight2[3] = CreateButton(549, 103, 11, 13, 1, 0, UIMSG_PlayerCreation_VoiceNext, 3, 0, "", pTexture_pressrigh, 0);
 
   uControlParam = 0;
   uX = 8;
   do
   {
-    pGUIWindow_CurrentMenu->CreateButton(uX, 308,          150, v0, 1, 0, UIMSG_48,                            uControlParam, 0, "", 0);
-    pGUIWindow_CurrentMenu->CreateButton(uX, v0 + 308,     150, v0, 1, 0, UIMSG_49,                            uControlParam, 0, "", 0);
-    pGUIWindow_CurrentMenu->CreateButton(uX, 2 * v0 + 308, 150, v0, 1, 0, UIMSG_PlayerCreationRemoveUpSkill,   uControlParam, 0, "", 0);
-    pGUIWindow_CurrentMenu->CreateButton(uX, 3 * v0 + 308, 150, v0, 1, 0, UIMSG_PlayerCreationRemoveDownSkill, uControlParam, 0, "", 0);
+    CreateButton(uX, 308,          150, v0, 1, 0, UIMSG_48,                            uControlParam, 0, "", 0);
+    CreateButton(uX, v0 + 308,     150, v0, 1, 0, UIMSG_49,                            uControlParam, 0, "", 0);
+    CreateButton(uX, 2 * v0 + 308, 150, v0, 1, 0, UIMSG_PlayerCreationRemoveUpSkill,   uControlParam, 0, "", 0);
+    CreateButton(uX, 3 * v0 + 308, 150, v0, 1, 0, UIMSG_PlayerCreationRemoveDownSkill, uControlParam, 0, "", 0);
+
     uX += 158;
     ++uControlParam;
   }
   while ( (signed int)uX < window->GetWidth() );
 
-  pGUIWindow_CurrentMenu->CreateButton(  5, 21, 153, 365, 1, 0, UIMSG_PlayerCreation_SelectAttribute, 0, '1', "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(163, 21, 153, 365, 1, 0, UIMSG_PlayerCreation_SelectAttribute, 1, '2', "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(321, 21, 153, 365, 1, 0, UIMSG_PlayerCreation_SelectAttribute, 2, '3', "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(479, 21, 153, 365, 1, 0, UIMSG_PlayerCreation_SelectAttribute, 3, '4', "", 0);
+  CreateButton(  5, 21, 153, 365, 1, 0, UIMSG_PlayerCreation_SelectAttribute, 0, '1', "", 0);
+  CreateButton(163, 21, 153, 365, 1, 0, UIMSG_PlayerCreation_SelectAttribute, 1, '2', "", 0);
+  CreateButton(321, 21, 153, 365, 1, 0, UIMSG_PlayerCreation_SelectAttribute, 2, '3', "", 0);
+  CreateButton(479, 21, 153, 365, 1, 0, UIMSG_PlayerCreation_SelectAttribute, 3, '4', "", 0);
 
   uX = 23;
   uControlParam = 2;
   do
   {
-    pGUIWindow_CurrentMenu->CreateButton(uX, 169,          120, 20, 1, 0, UIMSG_0, uControlParam - 2, 0, "", 0);
-    pGUIWindow_CurrentMenu->CreateButton(uX, v0 + 169,     120, 20, 1, 0, UIMSG_0, uControlParam - 1, 0, "", 0);
-    pGUIWindow_CurrentMenu->CreateButton(uX, 2 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam, 0, "", 0);
-    pGUIWindow_CurrentMenu->CreateButton(uX, 3 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam + 1, 0, "", 0);
-    pGUIWindow_CurrentMenu->CreateButton(uX, 4 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam + 2, 0, "", 0);
-    pGUIWindow_CurrentMenu->CreateButton(uX, 5 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam + 3, 0, "", 0);
-    pGUIWindow_CurrentMenu->CreateButton(uX, 6 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam + 4, 0, "", 0);
+    CreateButton(uX, 169,          120, 20, 1, 0, UIMSG_0, uControlParam - 2, 0, "", 0);
+    CreateButton(uX, v0 + 169,     120, 20, 1, 0, UIMSG_0, uControlParam - 1, 0, "", 0);
+    CreateButton(uX, 2 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam, 0, "", 0);
+    CreateButton(uX, 3 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam + 1, 0, "", 0);
+    CreateButton(uX, 4 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam + 2, 0, "", 0);
+    CreateButton(uX, 5 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam + 3, 0, "", 0);
+    CreateButton(uX, 6 * v0 + 169, 120, 20, 1, 0, UIMSG_0, uControlParam + 4, 0, "", 0);
+
     uControlParam += 7;
     uX += 158;
   }
   while ( (signed int)uControlParam < 30 );
-  pGUIWindow_CurrentMenu->_41D08F_set_keyboard_control_group(28, 0, 7, 40);
+
+  _41D08F_set_keyboard_control_group(28, 0, 7, 40);
 
-  pGUIWindow_CurrentMenu->CreateButton(323, 417,          65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0,    0, "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(323, v0 + 417,     65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0xC,  0, "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(323, 2 * v0 + 417, 65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x14, 0, "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(388, 417,          65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x18, 0, "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(388, v0 + 417,     65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x1C, 0, "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(388, 2 * v0 + 417, 65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x20, 0, "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(453, 417,          65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x10, 0, "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(453, v0 + 417,     65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 8,    0, "", 0);
-  pGUIWindow_CurrentMenu->CreateButton(453, 2 * v0 + 417, 65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 4,    0, "", 0);
+  CreateButton(323, 417,          65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0,    0, "", 0);
+  CreateButton(323, v0 + 417,     65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0xC,  0, "", 0);
+  CreateButton(323, 2 * v0 + 417, 65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x14, 0, "", 0);
+  CreateButton(388, 417,          65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x18, 0, "", 0);
+  CreateButton(388, v0 + 417,     65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x1C, 0, "", 0);
+  CreateButton(388, 2 * v0 + 417, 65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x20, 0, "", 0);
+  CreateButton(453, 417,          65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 0x10, 0, "", 0);
+  CreateButton(453, v0 + 417,     65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 8,    0, "", 0);
+  CreateButton(453, 2 * v0 + 417, 65, v0, 1, 0, UIMSG_PlayerCreationSelectClass, 4,    0, "", 0);
 
   uControlParam = 0;
   do
@@ -520,20 +527,20 @@
     uX = -5;
     if ( uControlParam <= 3 )
       uX = 0;
-    pGUIWindow_CurrentMenu->CreateButton(100 * (uControlParam / 3) + uX + 17, v0 * (uControlParam % 3) + 417, 100, v0, 1, 0, UIMSG_PlayerCreationSelectActiveSkill,
+    CreateButton(100 * (uControlParam / 3) + uX + 17, v0 * (uControlParam % 3) + 417, 100, v0, 1, 0, UIMSG_PlayerCreationSelectActiveSkill,
       uControlParam, 0, "", 0);
     ++uControlParam;
   }
   while ( uControlParam < 9 );
 
-  pPlayerCreationUI_BtnOK    = pGUIWindow_CurrentMenu->CreateButton(580, 431, 51, 39, 1, 0, UIMSG_PlayerCreationClickOK, 0, '\r', "", pIcons_LOD->GetTexture(uTextureID_BUTTMAKE), 0);
-  pPlayerCreationUI_BtnReset = pGUIWindow_CurrentMenu->CreateButton(527, 431, 51, 39, 1, 0, UIMSG_PlayerCreationClickReset, 0, 'C', "", pIcons_LOD->GetTexture(uTextureID_BUTTMAKE2), 0);
-  pPlayerCreationUI_BtnMinus = pGUIWindow_CurrentMenu->CreateButton(523, 393, 20, 35, 1, 0, UIMSG_PlayerCreationClickMinus, 0, '-', "", pTexture_buttminu, 0);
-  pPlayerCreationUI_BtnPlus  = pGUIWindow_CurrentMenu->CreateButton(613, 393, 20, 35, 1, 0, UIMSG_PlayerCreationClickPlus, 1, '+', "", pTexture_buttplus, 0);
+  pPlayerCreationUI_BtnOK    = CreateButton(580, 431, 51, 39, 1, 0, UIMSG_PlayerCreationClickOK, 0, '\r', "", pIcons_LOD->GetTexture(uTextureID_BUTTMAKE), 0);
+  pPlayerCreationUI_BtnReset = CreateButton(527, 431, 51, 39, 1, 0, UIMSG_PlayerCreationClickReset, 0, 'C', "", pIcons_LOD->GetTexture(uTextureID_BUTTMAKE2), 0);
+  pPlayerCreationUI_BtnMinus = CreateButton(523, 393, 20, 35, 1, 0, UIMSG_PlayerCreationClickMinus, 0, '-', "", pTexture_buttminu, 0);
+  pPlayerCreationUI_BtnPlus  = CreateButton(613, 393, 20, 35, 1, 0, UIMSG_PlayerCreationClickPlus, 1, '+', "", pTexture_buttplus, 0);
 
   pFontCChar = LoadFont("cchar.fnt", "FONTPAL", NULL);
 }
-// 4E28F8: using guessed type int current_screen_type;
+
 
 //----- (0049750E) --------------------------------------------------------
 void DeleteCCharFont()
@@ -579,8 +586,9 @@
       WaitMessage();
     else
     {
-      PlayerCreationUI_Draw();
-      MainMenu_EventLoop();
+      //PlayerCreationUI_Draw();
+      //MainMenu_EventLoop();
+        CreateParty_EventLoop();
       pRenderer->BeginScene();
       GUI_UpdateWindows();
       pRenderer->EndScene();
@@ -600,7 +608,10 @@
     }
   }
   main_menu_background.Release();
+
   pGUIWindow_CurrentMenu->Release();
+  pGUIWindow_CurrentMenu = nullptr;
+
   pIcons_LOD->RemoveTexturesPackFromTextureList();
 
   memset(v20, 0, 32);
--- a/GUI/UI/UIPartyCreation.h	Wed May 13 20:09:00 2015 +0600
+++ b/GUI/UI/UIPartyCreation.h	Wed May 13 20:09:12 2015 +0600
@@ -1,8 +1,19 @@
 #pragma once
+#include "GUI/GUIWindow.h"
+
+
+
 bool PlayerCreation_Choose4Skills();
 void LoadPlayerPortraintsAndVoices();
 void ReloadPlayerPortraits(int player_id, int face_id);
-void PlayerCreationUI_Draw();
-void PlayerCreationUI_Initialize();
 void DeleteCCharFont();
 bool PlayerCreationUI_Loop();
+
+
+struct GUIWindow_PartyCreation : public GUIWindow
+{
+             GUIWindow_PartyCreation();
+    virtual ~GUIWindow_PartyCreation() {}
+
+    virtual void Update();
+};
\ No newline at end of file
--- a/GUI/UI/UiGame.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/GUI/UI/UiGame.cpp	Wed May 13 20:09:12 2015 +0600
@@ -44,8 +44,6 @@
 int uTextureID_GameUI_CharSelectionFrame; // 50C98C
 
 
-
-
 GUIWindow_GameMenu::GUIWindow_GameMenu() :
     GUIWindow(0, 0, window->GetWidth(), window->GetHeight(), 0, nullptr)
 {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Game/CreateParty.cpp	Wed May 13 20:09:12 2015 +0600
@@ -0,0 +1,201 @@
+#include "Engine/Engine.h"
+#include "Engine/Party.h"
+#include "Engine/Graphics/Viewport.h"
+#include "Engine/Graphics/Overlays.h"
+
+#include "IO/Keyboard.h"
+
+#include "GUI/UI/UIPartyCreation.h"
+
+#include "Media/Audio/AudioPlayer.h"
+#include "Media/Audio/AIL.h"
+
+void CreateParty_EventLoop()
+{
+    auto pPlayer = pParty->pPlayers.data();
+    while (pMessageQueue_50CBD0->uNumMessages)
+    {
+        UIMessageType msg;
+        int param, param2;
+        pMessageQueue_50CBD0->PopMessage(&msg, &param, &param2);
+
+        switch (msg)
+        {
+            case UIMSG_PlayerCreation_SelectAttribute:
+            {
+                pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem)
+                    % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * param;
+                uPlayerCreationUI_SelectedCharacter = param;
+                pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+            }
+            break;
+
+            case UIMSG_PlayerCreation_VoicePrev:
+            {
+                int sex = pParty->pPlayers[param].GetSexByVoice();
+                do
+                {
+                    if (pParty->pPlayers[param].uVoiceID == 0)
+                        pParty->pPlayers[param].uVoiceID = 19;
+                    else --pParty->pPlayers[param].uVoiceID;
+                } while (pParty->pPlayers[param].GetSexByVoice() != sex);
+                auto pButton = pCreationUI_BtnPressLeft2[param];
+
+                new OnButtonClick(pButton->uX, pButton->uY, 0, 0, (int)pButton, (char *)1);
+                pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+                pParty->pPlayers[param].PlaySound(SPEECH_PickMe, 0);
+            }
+            break;
+
+            case UIMSG_PlayerCreation_VoiceNext:
+            {
+                int sex = pParty->pPlayers[param].GetSexByVoice();
+                do
+                {
+                    pParty->pPlayers[param].uVoiceID = (pParty->pPlayers[param].uVoiceID + 1) % 20;
+                } while (pParty->pPlayers[param].GetSexByVoice() != sex);
+                auto pButton = pCreationUI_BtnPressRight2[param];
+                new OnButtonClick(pButton->uX, pButton->uY, 0, 0, (int)pButton, (char *)1);
+                pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+                pParty->pPlayers[param].PlaySound(SPEECH_PickMe, 0);
+            }
+            break;
+        case UIMSG_PlayerCreation_FacePrev:
+            //pPlayer = &pParty->pPlayers[pParam];
+            if (!pParty->pPlayers[param].uCurrentFace)
+                pParty->pPlayers[param].uCurrentFace = 19;
+            else
+                pParty->pPlayers[param].uCurrentFace -= 1;
+            pParty->pPlayers[param].uVoiceID = pParty->pPlayers[param].uCurrentFace;
+            pParty->pPlayers[param].SetInitialStats();
+            pParty->pPlayers[param].SetSexByVoice();
+            pParty->pPlayers[param].RandomizeName();
+            pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem)
+                % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * param;
+            uPlayerCreationUI_SelectedCharacter = param;
+            new OnButtonClick(pCreationUI_BtnPressLeft[param]->uX, pCreationUI_BtnPressLeft[param]->uY, 0, 0, (int)pCreationUI_BtnPressLeft[param], (char *)1);
+            pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0.0, 0);
+            pParty->pPlayers[param].PlaySound(SPEECH_PickMe, 0);
+            break;
+        case UIMSG_PlayerCreation_FaceNext:
+            //pPlayer = &pParty->pPlayers[pParam];
+            int v20; v20 = (char)((int)pParty->pPlayers[param].uCurrentFace + 1) % 20;
+            pParty->pPlayers[param].uCurrentFace = v20;
+            pParty->pPlayers[param].uVoiceID = v20;
+            pParty->pPlayers[param].SetInitialStats();
+            pParty->pPlayers[param].SetSexByVoice();
+            pParty->pPlayers[param].RandomizeName();
+            pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem)
+                % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * param;
+            uPlayerCreationUI_SelectedCharacter = param;
+            new OnButtonClick(pCreationUI_BtnPressRight[param]->uX, pCreationUI_BtnPressRight[param]->uY, 0, 0, (int)pCreationUI_BtnPressRight[param], (char *)1);
+            pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+            pParty->pPlayers[param].PlaySound(SPEECH_PickMe, 0);
+            break;
+        case UIMSG_PlayerCreationClickPlus:
+            new OnButtonClick2(613, 393, 0, 0, (int)pPlayerCreationUI_BtnPlus, (char *)1);
+            pPlayer[uPlayerCreationUI_SelectedCharacter].IncreaseAttribute((pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7);
+            pAudioPlayer->PlaySound(SOUND_ClickMinus, 0, 0, -1, 0, 0, 0, 0);
+            break;
+        case UIMSG_PlayerCreationClickMinus:
+            new OnButtonClick2(523, 393, 0, 0, (int)pPlayerCreationUI_BtnMinus, (char *)1);
+            pPlayer[uPlayerCreationUI_SelectedCharacter].DecreaseAttribute((pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7);
+            pAudioPlayer->PlaySound(SOUND_ClickPlus, 0, 0, -1, 0, 0, 0, 0);
+            break;
+        case UIMSG_PlayerCreationSelectActiveSkill:
+            if (pPlayer[uPlayerCreationUI_SelectedCharacter].GetSkillIdxByOrder(3) == 37)
+                pParty->pPlayers[uPlayerCreationUI_SelectedCharacter].pActiveSkills[pPlayer[uPlayerCreationUI_SelectedCharacter].GetSkillIdxByOrder(param + 4)] = 1;
+            pAudioPlayer->PlaySound(SOUND_ClickSkill, 0, 0, -1, 0, 0, 0, 0);
+            break;
+        case UIMSG_PlayerCreationSelectClass:
+            pPlayer[uPlayerCreationUI_SelectedCharacter].Reset((PLAYER_CLASS_TYPE)param);
+            pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+            break;
+        case UIMSG_PlayerCreationClickOK:
+            new OnButtonClick2(580, 431, 0, 0, (int)pPlayerCreationUI_BtnOK, 0);
+            if (PlayerCreation_GetUnspentAttributePointCount() || !PlayerCreation_Choose4Skills())
+                GameUI_Footer_TimeLeft = GetTickCount() + 4000;
+            else
+                uGameState = GAME_STATE_STARTING_NEW_GAME;
+            break;
+        case UIMSG_PlayerCreationClickReset:
+            new OnButtonClick2(527, 431, 0, 0, (int)pPlayerCreationUI_BtnReset, 0);
+            pParty->Reset();
+            break;
+        case UIMSG_PlayerCreationRemoveUpSkill:
+        {
+            int v4; v4 = pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem;
+            pGUIWindow_CurrentMenu->pCurrentPosActiveItem = v4 % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * param;
+            if (pPlayer[param].GetSkillIdxByOrder(2) != 37)//37 - None()
+                pParty->pPlayers[param].pActiveSkills[pPlayer[param].GetSkillIdxByOrder(2)] = 0;
+        }
+        break;
+        case UIMSG_PlayerCreationRemoveDownSkill:
+        {
+            int v4; v4 = pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem;
+            pGUIWindow_CurrentMenu->pCurrentPosActiveItem = v4 % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * param;
+            if (pPlayer[param].GetSkillIdxByOrder(3) != 37)//37 - None()
+                pParty->pPlayers[param].pActiveSkills[pPlayer[param].GetSkillIdxByOrder(3)] = 0;
+        }
+        break;
+        case UIMSG_PlayerCreationChangeName:
+            pAudioPlayer->PlaySound(SOUND_ClickSkill, 0, 0, -1, 0, 0, 0, 0);
+            uPlayerCreationUI_SelectedCharacter = param;
+            pKeyActionMap->EnterText(0, 15, pGUIWindow_CurrentMenu);
+            pGUIWindow_CurrentMenu->ptr_1C = (void *)param;
+            break;
+        case UIMSG_Escape:
+            if (pModalWindow)
+            {
+                pModalWindow->Release();
+                pModalWindow = nullptr;
+                break;
+            }
+            if (!(dword_6BE364_game_settings_1 & GAME_SETTINGS_4000))
+                break;
+            viewparams->bRedrawGameUI = true;
+            viewparams->field_48 = 1;
+            if (GetCurrentMenuID() == MENU_MAIN || GetCurrentMenuID() == MENU_MMT_MAIN_MENU
+                || GetCurrentMenuID() == MENU_CREATEPARTY || GetCurrentMenuID() == MENU_NAMEPANELESC)
+            {
+                //if ( current_screen_type == SCREEN_VIDEO )
+                //pVideoPlayer->FastForwardToFrame(pVideoPlayer->pResetflag);			  
+                pMessageQueue_50CBD0->AddGUIMessage(UIMSG_ChangeGameState, 0, 0);
+            }
+            break;
+        case UIMSG_ChangeGameState:
+            uGameState = GAME_FINISHED;
+            break;
+        }
+    }
+}
+
+bool CreateParty_Loop()
+{
+// -------------------------------------------------------
+// 00462C94 bool MM_Main(const wchar_t *pCmdLine) --- part
+    extern bool use_music_folder;
+    if (use_music_folder)
+        alSourceStop(mSourceID);
+    else
+    {
+        if (pAudioPlayer->hAILRedbook)
+            AIL_redbook_stop(pAudioPlayer->hAILRedbook);
+    }
+    pParty->Reset();
+    pOtherOverlayList->Reset();
+    strcpy(pCurrentMapName, pStartingMapName);
+    pParty->CreateDefaultParty(0);
+
+    pGUIWindow_CurrentMenu = new GUIWindow_PartyCreation();//PlayerCreationUI_Initialize();
+    if (PlayerCreationUI_Loop())
+    {
+        DeleteCCharFont();
+        return false;
+    }
+    else
+    {
+        DeleteCCharFont();
+        return true;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Game/CreateParty.h	Wed May 13 20:09:12 2015 +0600
@@ -0,0 +1,6 @@
+#pragma once
+
+
+
+bool CreateParty_Loop();
+void CreateParty_EventLoop();
\ No newline at end of file
--- a/Game/Game.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/Game/Game.cpp	Wed May 13 20:09:12 2015 +0600
@@ -53,6 +53,7 @@
 #include "GUI/UI/Books/JournalBook.h"
 
 #include "Game/Game.h"
+#include "Game/GameMenu.h"
 
 
 void DoThatMessageThing()
@@ -111,58 +112,38 @@
 }
 
 
-void Game_StartNewGameWhilePlaying(bool force_start)
+
+void Game_CloseTargetedSpellWindow()
 {
-    if (dword_6BE138 == 124 || force_start)
+    if (pGUIWindow_CastTargetedSpell)
     {
-        pIcons_LOD->SyncLoadedFilesCount();
-        pIcons_LOD->RemoveTexturesPackFromTextureList();
-        DoThatMessageThing();
-        pGUIWindow_CurrentMenu->Release();
-        uGameState = GAME_STATE_NEWGAME_OUT_GAMEMENU;
-        current_screen_type = SCREEN_GAME;
-        viewparams->bRedrawGameUI = 1;
+        if (current_screen_type == SCREEN_CHARACTERS)
+            pMouse->SetCursorBitmap("MICON2");
+        else
+        {
+            pGUIWindow_CastTargetedSpell->Release();
+            pGUIWindow_CastTargetedSpell = nullptr;
+            pMouse->SetCursorBitmap("MICON1");
+            GameUI_Footer_TimeLeft = 0;
+            _50C9A0_IsEnchantingInProgress = 0;
+            back_to_game();
+        }
     }
-    else
-    {
-        ShowStatusBarString(pGlobalTXT_LocalizationStrings[201], 2);// "Are you sure?  Click again to start a New Game"
-        pAudioPlayer->PlaySound(SOUND_quest, 0, 0, -1, 0, 0, 0, 0);
-        dword_6BE138 = 124;
-    }
-    stru_506E40.Release();
 }
 
-void Game_QuitGameWhilePlaying(bool force_quit)
+void Game_OnEscape()
 {
-    if (dword_6BE138 == 132 || force_quit)
-    {
-        pIcons_LOD->SyncLoadedFilesCount();
-        pIcons_LOD->RemoveTexturesPackFromTextureList();
-        DoThatMessageThing();
-        pGUIWindow_CurrentMenu->Release();
-        current_screen_type = SCREEN_GAME;
-        viewparams->bRedrawGameUI = 1;
-        pAudioPlayer->PlaySound(SOUND_WoodDoorClosing, 0, 0, -1, 0, 0, 0, 0);
-        uGameState = GAME_STATE_GAME_QUITTING_TO_MAIN_MENU;
-    }
-    else
-    {
-        ShowStatusBarString(pGlobalTXT_LocalizationStrings[82], 2);// "Are you sure?  Click again to quit"
-        pAudioPlayer->PlaySound(SOUND_quest, 0, 0, -1, 0, 0, 0, 0);
-        dword_6BE138 = 132;
-    }
-    stru_506E40.Release();
-}
-
-void Game_OpenLoadGameDialog()
-{
-    pIcons_LOD->SyncLoadedFilesCount();
-    pIcons_LOD->RemoveTexturesPackFromTextureList();
-    DoThatMessageThing();
+    Game_CloseTargetedSpellWindow();
+    if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
+        uActiveCharacter = pParty->GetNextActiveCharacter();
     pGUIWindow_CurrentMenu->Release();
-
-    //LoadUI_Load(1);
-    pGUIWindow_CurrentMenu = new GUIWindow_Load(true);
+    if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
+        window_SpeakInHouse = 0;
+    pGUIWindow_CurrentMenu = 0;
+    pEventTimer->Resume();
+    current_screen_type = SCREEN_GAME;
+    viewparams->bRedrawGameUI = true;
+    pIcons_LOD->RemoveTexturesFromTextureList();
 }
 
 
@@ -334,9 +315,9 @@
             case UIMSG_SelectShopDialogueOption:  OnSelectShopDialogueOption(uMessageParam); continue;
             case UIMSG_SelectNPCDialogueOption:   OnSelectNPCDialogueOption((DIALOGUE_TYPE)uMessageParam); continue;
             case UIMSG_ClickHouseNPCPortrait:     _4B4224_UpdateNPCTopics(uMessageParam); continue;
-            case UIMSG_StartNewGame:              Game_StartNewGameWhilePlaying(uMessageParam); continue;
-            case UIMSG_Game_OpenLoadGameDialog:   Game_OpenLoadGameDialog(); continue;
-            case UIMSG_Quit:                      Game_QuitGameWhilePlaying(uMessageParam); continue;
+            //case UIMSG_StartNewGame:              Game_StartNewGameWhilePlaying(uMessageParam); continue;
+            //case UIMSG_Game_OpenLoadGameDialog:   Game_OpenLoadGameDialog(); continue;
+            //case UIMSG_Quit:                      Game_QuitGameWhilePlaying(uMessageParam); continue;
             case UIMSG_80:
                 __debugbreak();
                 pIcons_LOD->SyncLoadedFilesCount();
@@ -345,7 +326,7 @@
                 current_screen_type = SCREEN_OPTIONS;
                 __debugbreak();//pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_8, 0, 0);
                 continue;
-            case UIMSG_ArrowUp:
+            /*case UIMSG_ArrowUp:
                 --pSaveListPosition;
                 if (pSaveListPosition < 0)
                     pSaveListPosition = 0;
@@ -356,11 +337,11 @@
                 if (pSaveListPosition >= uMessageParam)
                     pSaveListPosition = uMessageParam - 1;
                 new OnButtonClick2(215, 323, 17, 17, (int)pBtnDownArrow, 0);
-                continue;
+                continue;*/
             case UIMSG_Cancel:
                 new OnCancel(350, 302, 106, 42, (int)pBtnCancel, 0);
                 continue;
-            case UIMSG_SaveLoadBtn:
+            /*case UIMSG_SaveLoadBtn:
                 new OnSaveLoad(241, 302, 106, 42, (int)pBtnLoadSlot, 0);
                 continue;
             case UIMSG_SelectLoadSlot:
@@ -405,6 +386,8 @@
             case UIMSG_Game_OpenSaveGameDialog:
             {
                 pGUIWindow_CurrentMenu->Release();
+
+                current_screen_type = SCREEN_SAVEGAME;
                 pGUIWindow_CurrentMenu = new GUIWindow_Save(); //SaveUI_Load(current_screen_type = SCREEN_SAVEGAME);
                 continue;
             }
@@ -664,27 +647,27 @@
                 continue;
 
             case UIMSG_SetGraphicsMode:
-                /*if ( !bUseLoResSprites )
-                {
-                byte_6BE388_graphicsmode = uMessageParam;
-                MM7Initialization();
-                continue;
-                }
-                if ( uMessageParam )
-                {
-                if ( uMessageParam == 1 )
-                {
-                byte_6BE388_graphicsmode = 0;
-                }
-                else
-                {
-                if ( uMessageParam != 2 )
-                continue;
-                byte_6BE388_graphicsmode = 1;
-                }
-                MM7Initialization();
-                continue;
-                }*/
+                //if ( !bUseLoResSprites )
+                //{
+                //    byte_6BE388_graphicsmode = uMessageParam;
+                //    MM7Initialization();
+                //    continue;
+                //}
+                //if ( uMessageParam )
+                //{
+                //    if ( uMessageParam == 1 )
+                //    {
+                //    byte_6BE388_graphicsmode = 0;
+                //    }
+                //    else
+                //    {
+                //        if ( uMessageParam != 2 )
+                //            continue;
+                //        byte_6BE388_graphicsmode = 1;
+                //    }
+                //    MM7Initialization();
+                //    continue;
+                //}
                 pModalWindow = new GUIWindow_Modal(pNPCTopics[453].pText, UIMSG_0);
                 __debugbreak(); // Nomad: graphicsmode as it was now removed
                 continue;
@@ -695,7 +678,7 @@
                 current_screen_type = SCREEN_GAME;
                 viewparams->bRedrawGameUI = 1;
                 stru_506E40.Release();
-                continue;
+                continue;*/
             case UIMSG_OpenQuestBook:
                 DoThatMessageThing();
                 if (current_screen_type != SCREEN_GAME)
@@ -753,42 +736,142 @@
                     }
                     break;
                 }
-                if (!pModalWindow)
+                if (pModalWindow)
                 {
+                    pModalWindow->Release();
+                    pModalWindow = nullptr;
+                    continue;
+                }
                     pRenderer->ClearZBuffer(0, 479);
-                    viewparams->bRedrawGameUI = 1;
+                    viewparams->bRedrawGameUI = true;
                     viewparams->field_48 = 1;
-                    if (current_screen_type != SCREEN_GAME)
+                    if (current_screen_type == SCREEN_GAME)
+                    {
+                        if (!pGUIWindow_CastTargetedSpell)//Draw Menu
+                        {
+                            dword_6BE138 = -1;
+                            new OnButtonClick2(0x25Au, 0x1C2u, 0, 0, (int)pBtn_GameSettings, (char *)1);
+
+                            DoThatMessageThing();
+                            GameMenu_Loop();
+                        }
+                        else
+                        {
+                            pGUIWindow_CastTargetedSpell->Release();
+                            pGUIWindow_CastTargetedSpell = 0;
+                            pMouse->SetCursorBitmap("MICON1");
+                            GameUI_Footer_TimeLeft = 0;
+                            _50C9A0_IsEnchantingInProgress = 0;
+                            back_to_game();
+                        }
+                        continue;
+                    }
+                    else if (current_screen_type == SCREEN_MENU)
+                    {/*
+                        pIcons_LOD->SyncLoadedFilesCount();
+                        pIcons_LOD->RemoveTexturesPackFromTextureList();
+                        pIcons_LOD->SyncLoadedFilesCount();
+                        pIcons_LOD->RemoveTexturesPackFromTextureList();
+                        stru_506E40.Release();
+                        Game_OnEscape();*/
+                        break;
+                    }
+                    else if (current_screen_type == SCREEN_SAVEGAME || current_screen_type == SCREEN_LOADGAME)
+                    {/*
+                        pIcons_LOD->RemoveTexturesPackFromTextureList();
+                        //crt_deconstruct_ptr_6A0118();
+                        stru_506E40.Release();
+                        Game_OnEscape();*/
+                        break;
+                    }
+                    else if (current_screen_type == SCREEN_OPTIONS)
+                    {/*
+                        options_menu_skin.Relaease();
+                        pIcons_LOD->SyncLoadedFilesCount();
+                        WriteWindowsRegistryInt("soundflag", (char)uSoundVolumeMultiplier);
+                        WriteWindowsRegistryInt("musicflag", (char)uMusicVolimeMultiplier);
+                        WriteWindowsRegistryInt("CharVoices", (char)uVoicesVolumeMultiplier);
+                        WriteWindowsRegistryInt("WalkSound", bWalkSound);
+                        WriteWindowsRegistryInt("ShowDamage", bShowDamage);
+                        //WriteWindowsRegistryInt("graphicsmode", (unsigned __int8)byte_6BE388_graphicsmode);
+                        WriteWindowsRegistryInt("valAlwaysRun", bAlwaysRun);
+                        WriteWindowsRegistryInt("FlipOnExit", bFlipOnExit);
+                        if (uTurnSpeed == 0)
+                            WriteWindowsRegistryInt("TurnDelta", 3);
+                        else if (uTurnSpeed == 64)
+                            WriteWindowsRegistryInt("TurnDelta", 2);
+                        else if (uTurnSpeed == 128)
+                            WriteWindowsRegistryInt("TurnDelta", 1);
+                        stru_506E40.Release();
+                        Game_OnEscape();*/
+                        break;
+                    }
+                    else if (current_screen_type == SCREEN_VIDEO_OPTIONS)
+                    {/*
+                        //if ( pRenderer->pRenderD3D )
+                        {
+                            WriteWindowsRegistryInt("Colored Lights", pRenderer->bUseColoredLights);
+                            WriteWindowsRegistryInt("Tinting", pRenderer->bTinting);
+                            WriteWindowsRegistryInt("Bloodsplats", (LOBYTE(pEngine->uFlags2) >> 5) & 1);
+                        }
+
+                        stru_506E40.Release();
+                        Game_OnEscape();*/
+                        break;
+                    }
+                    else if (current_screen_type == SCREEN_KEYBOARD_OPTIONS)
+                    {
+                        /*v197 = 1;
+                        pKeyBindingFlag = false;
+                        for (uint i = 0; i < 28; ++i)
+                        {
+                            if (GameMenuUI_InvaligKeyBindingsFlags[i])
+                                pKeyBindingFlag = true;
+                        }
+                        if (!pKeyBindingFlag)
+                        {
+                            for (uint i = 0; i < 5; i++)
+                            {
+                                if (uTextureID_Optkb[i])
+                                    pIcons_LOD->pTextures[uTextureID_Optkb[i]].Release();
+                            }
+                            memset(&uTextureID_Optkb, 0, 20);
+                            pIcons_LOD->SyncLoadedFilesCount();
+                            for (uint i = 0; i < 28; ++i)
+                            {
+                                if (pKeyActionMap->GetActionVKey((enum InputAction)i) != pPrevVirtualCidesMapping[i])
+                                {
+                                    if (v197)
+                                    {
+                                        GUI_ReplaceHotkey(pKeyActionMap->GetActionVKey((enum InputAction)i), LOBYTE(pPrevVirtualCidesMapping[i]), 1);
+                                        v197 = 0;
+                                    }
+                                    else
+                                        GUI_ReplaceHotkey(pKeyActionMap->GetActionVKey((enum InputAction)i), LOBYTE(pPrevVirtualCidesMapping[i]), 0);
+                                }
+                                if (i > 3 && i != 25 && i != 26)
+                                    pKeyToggleType = TOGGLE_OneTimePress;
+                                else
+                                    pKeyToggleType = TOGGLE_Continuously;
+                                pKeyActionMap->SetKeyMapping(i, pPrevVirtualCidesMapping[i], pKeyToggleType);
+                            }
+                            pKeyActionMap->StoreMappings();
+                            stru_506E40.Release();
+                        }
+                        else
+                            pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
+
+                        Game_OnEscape();*/
+                        break;
+                    }
+                    else
                     {
                         if (current_screen_type > SCREEN_67)
                         {
                             if (current_screen_type == SCREEN_QUICK_REFERENCE)
                             {
                                 pIcons_LOD->RemoveTexturesPackFromTextureList();
-                                if (pGUIWindow_Settings)
-                                {
-                                    if (current_screen_type == SCREEN_CHARACTERS)
-                                        pMouse->SetCursorBitmap("MICON2");
-                                    else
-                                    {
-                                        pGUIWindow_Settings->Release();
-                                        pGUIWindow_Settings = 0;
-                                        pMouse->SetCursorBitmap("MICON1");
-                                        GameUI_Footer_TimeLeft = 0;
-                                        _50C9A0_IsEnchantingInProgress = 0;
-                                        back_to_game();
-                                    }
-                                }
-                                if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
-                                    uActiveCharacter = pParty->GetNextActiveCharacter();
-                                pGUIWindow_CurrentMenu->Release();
-                                if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
-                                    window_SpeakInHouse = 0;
-                                pGUIWindow_CurrentMenu = 0;
-                                pEventTimer->Resume();
-                                current_screen_type = SCREEN_GAME;
-                                viewparams->bRedrawGameUI = 1;
-                                pIcons_LOD->RemoveTexturesFromTextureList();
+                                Game_OnEscape();
                                 continue;
                             }
                         }
@@ -817,67 +900,15 @@
                                         _50C9A8_item_enchantment_timer = 0;
                                         ptr_50C9A4_ItemToEnchant = nullptr;
                                     }
-                                    if (pGUIWindow_Settings)
-                                    {
-                                        if (current_screen_type == SCREEN_CHARACTERS)
-                                            pMouse->SetCursorBitmap("MICON2");
-                                        else
-                                        {
-                                            pGUIWindow_Settings->Release();
-                                            pGUIWindow_Settings = 0;
-                                            pMouse->SetCursorBitmap("MICON1");
-                                            GameUI_Footer_TimeLeft = 0;
-                                            _50C9A0_IsEnchantingInProgress = 0;
-                                            back_to_game();
-                                        }
-                                    }
-                                    if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
-                                        uActiveCharacter = pParty->GetNextActiveCharacter();
-                                    pGUIWindow_CurrentMenu->Release();
-                                    if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
-                                        window_SpeakInHouse = 0;
-                                    pGUIWindow_CurrentMenu = 0;
-                                    pEventTimer->Resume();
-                                    current_screen_type = SCREEN_GAME;
-                                    viewparams->bRedrawGameUI = 1;
-                                    pIcons_LOD->RemoveTexturesFromTextureList();
+                                    Game_OnEscape();
                                     continue;
                                 case SCREEN_BOOKS:
                                     pBooksButtonOverlay->Release();
                                     //crt_deconstruct_ptr_6A0118();
                                     pBooksButtonOverlay = 0;
                                     pEventTimer->Resume();
-                                    if (pGUIWindow_Settings)
-                                    {
-                                        if (current_screen_type == SCREEN_CHARACTERS)
-                                            pMouse->SetCursorBitmap("MICON2");
-                                        else
-                                        {
-                                            pGUIWindow_Settings->Release();
-                                            pGUIWindow_Settings = 0;
-                                            pMouse->SetCursorBitmap("MICON1");
-                                            GameUI_Footer_TimeLeft = 0;
-                                            _50C9A0_IsEnchantingInProgress = 0;
-                                            back_to_game();
-                                        }
-                                    }
-                                    if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
-                                        uActiveCharacter = pParty->GetNextActiveCharacter();
-                                    pGUIWindow_CurrentMenu->Release();
-                                    if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
-                                        window_SpeakInHouse = 0;
-                                    pGUIWindow_CurrentMenu = 0;
-                                    pEventTimer->Resume();
-                                    current_screen_type = SCREEN_GAME;
-                                    viewparams->bRedrawGameUI = 1;
-                                    pIcons_LOD->RemoveTexturesFromTextureList();
+                                    Game_OnEscape();
                                     continue;
-                                case SCREEN_SAVEGAME:
-                                case SCREEN_LOADGAME:
-                                    pIcons_LOD->RemoveTexturesPackFromTextureList();
-                                    //crt_deconstruct_ptr_6A0118();
-                                    stru_506E40.Release();
-                                    break;
                                 case SCREEN_CHEST_INVENTORY:
                                     current_screen_type = SCREEN_CHEST;
                                     continue;
@@ -898,96 +929,6 @@
                                     viewparams->bRedrawGameUI = 1;
                                     pEventTimer->Resume();
                                     continue;
-                                case SCREEN_OPTIONS://Close
-                                    options_menu_skin.Relaease();
-                                    pIcons_LOD->SyncLoadedFilesCount();
-                                    WriteWindowsRegistryInt("soundflag", (char)uSoundVolumeMultiplier);
-                                    WriteWindowsRegistryInt("musicflag", (char)uMusicVolimeMultiplier);
-                                    WriteWindowsRegistryInt("CharVoices", (char)uVoicesVolumeMultiplier);
-                                    WriteWindowsRegistryInt("WalkSound", bWalkSound);
-                                    WriteWindowsRegistryInt("ShowDamage", bShowDamage);
-                                    //WriteWindowsRegistryInt("graphicsmode", (unsigned __int8)byte_6BE388_graphicsmode);
-                                    WriteWindowsRegistryInt("valAlwaysRun", bAlwaysRun);
-                                    WriteWindowsRegistryInt("FlipOnExit", bFlipOnExit);
-                                    if (!uTurnSpeed)
-                                    {
-                                        WriteWindowsRegistryInt("TurnDelta", 3);
-                                        stru_506E40.Release();
-                                        break;
-                                    }
-                                    if (uTurnSpeed == 64)
-                                    {
-                                        WriteWindowsRegistryInt("TurnDelta", 2);
-                                        stru_506E40.Release();
-                                        break;
-                                    }
-                                    if (uTurnSpeed != 128)
-                                    {
-                                        stru_506E40.Release();
-                                        break;
-                                    }
-                                    WriteWindowsRegistryInt("TurnDelta", 1);
-                                    stru_506E40.Release();
-                                    break;
-                                case SCREEN_MENU:
-                                    pIcons_LOD->SyncLoadedFilesCount();
-                                    pIcons_LOD->RemoveTexturesPackFromTextureList();
-                                    pIcons_LOD->SyncLoadedFilesCount();
-                                    pIcons_LOD->RemoveTexturesPackFromTextureList();
-                                    stru_506E40.Release();
-                                    break;
-                                case SCREEN_VIDEO_OPTIONS:
-                                    //if ( pRenderer->pRenderD3D )
-                                {
-                                    WriteWindowsRegistryInt("Colored Lights", pRenderer->bUseColoredLights);
-                                    WriteWindowsRegistryInt("Tinting", pRenderer->bTinting);
-                                    WriteWindowsRegistryInt("Bloodsplats", (LOBYTE(pEngine->uFlags2) >> 5) & 1);
-                                }
-
-                                    stru_506E40.Release();
-                                    break;
-
-                                case SCREEN_KEYBOARD_OPTIONS://Return to game
-                                    v197 = 1;
-                                    pKeyBindingFlag = false;
-                                    for (uint i = 0; i < 28; ++i)
-                                    {
-                                        if (GameMenuUI_InvaligKeyBindingsFlags[i])
-                                            pKeyBindingFlag = true;
-                                    }
-                                    if (!pKeyBindingFlag)
-                                    {
-                                        for (uint i = 0; i < 5; i++)
-                                        {
-                                            if (uTextureID_Optkb[i])
-                                                pIcons_LOD->pTextures[uTextureID_Optkb[i]].Release();
-                                        }
-                                        memset(&uTextureID_Optkb, 0, 20);
-                                        pIcons_LOD->SyncLoadedFilesCount();
-                                        for (uint i = 0; i < 28; ++i)
-                                        {
-                                            if (pKeyActionMap->GetActionVKey((enum InputAction)i) != pPrevVirtualCidesMapping[i])
-                                            {
-                                                if (v197)
-                                                {
-                                                    GUI_ReplaceHotkey(pKeyActionMap->GetActionVKey((enum InputAction)i), LOBYTE(pPrevVirtualCidesMapping[i]), 1);
-                                                    v197 = 0;
-                                                }
-                                                else
-                                                    GUI_ReplaceHotkey(pKeyActionMap->GetActionVKey((enum InputAction)i), LOBYTE(pPrevVirtualCidesMapping[i]), 0);
-                                            }
-                                            if (i > 3 && i != 25 && i != 26)
-                                                pKeyToggleType = TOGGLE_OneTimePress;
-                                            else
-                                                pKeyToggleType = TOGGLE_Continuously;
-                                            pKeyActionMap->SetKeyMapping(i, pPrevVirtualCidesMapping[i], pKeyToggleType);
-                                        }
-                                        pKeyActionMap->StoreMappings();
-                                        stru_506E40.Release();
-                                        break;
-                                    }
-                                    pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
-                                    break;
                                 case SCREEN_REST://close rest screen
                                     if (_506F14_resting_stage)
                                     {
@@ -1010,30 +951,7 @@
                                     }
                                     _506F18_num_minutes_to_sleep = 0;
                                     _506F14_resting_stage = 0;
-                                    if (pGUIWindow_Settings)
-                                    {
-                                        if (current_screen_type == SCREEN_CHARACTERS)
-                                            pMouse->SetCursorBitmap("MICON2");
-                                        else
-                                        {
-                                            pGUIWindow_Settings->Release();
-                                            pGUIWindow_Settings = 0;
-                                            pMouse->SetCursorBitmap("MICON1");
-                                            GameUI_Footer_TimeLeft = 0;
-                                            _50C9A0_IsEnchantingInProgress = 0;
-                                            back_to_game();
-                                        }
-                                    }
-                                    if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
-                                        uActiveCharacter = pParty->GetNextActiveCharacter();
-                                    pGUIWindow_CurrentMenu->Release();
-                                    if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
-                                        window_SpeakInHouse = 0;
-                                    pGUIWindow_CurrentMenu = 0;
-                                    pEventTimer->Resume();
-                                    current_screen_type = SCREEN_GAME;
-                                    viewparams->bRedrawGameUI = 1;
-                                    pIcons_LOD->RemoveTexturesFromTextureList();
+                                    Game_OnEscape();
                                     continue;
                                 case SCREEN_E:
                                     __debugbreak();
@@ -1058,30 +976,7 @@
                                     pAudioPlayer->PlaySound(SOUND_WoodDoorClosing, 814, 0, -1, 0, 0, 0, 0);
                                     pMediaPlayer->Unload();
                                     pGUIWindow_CurrentMenu = window_SpeakInHouse;
-                                    if (pGUIWindow_Settings)
-                                    {
-                                        if (current_screen_type == SCREEN_CHARACTERS)
-                                            pMouse->SetCursorBitmap("MICON2");
-                                        else
-                                        {
-                                            pGUIWindow_Settings->Release();
-                                            pGUIWindow_Settings = 0;
-                                            pMouse->SetCursorBitmap("MICON1");
-                                            GameUI_Footer_TimeLeft = 0;
-                                            _50C9A0_IsEnchantingInProgress = 0;
-                                            back_to_game();
-                                        }
-                                    }
-                                    if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
-                                        uActiveCharacter = pParty->GetNextActiveCharacter();
-                                    pGUIWindow_CurrentMenu->Release();
-                                    if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
-                                        window_SpeakInHouse = 0;
-                                    pGUIWindow_CurrentMenu = 0;
-                                    pEventTimer->Resume();
-                                    current_screen_type = SCREEN_GAME;
-                                    viewparams->bRedrawGameUI = true;
-                                    pIcons_LOD->RemoveTexturesFromTextureList();
+                                    Game_OnEscape();
                                     continue;
                                 case SCREEN_INPUT_BLV://click escape
                                     if (uCurrentHouse_Animation == 153)
@@ -1140,146 +1035,26 @@
                                     CharacterUI_ReleaseButtons();
                                     ReleaseAwardsScrollBar();
                                     pIcons_LOD->RemoveTexturesPackFromTextureList();
-                                    if (pGUIWindow_Settings)
-                                    {
-                                        if (current_screen_type == SCREEN_CHARACTERS)
-                                            pMouse->SetCursorBitmap("MICON2");
-                                        else
-                                        {
-                                            pGUIWindow_Settings->Release();
-                                            pGUIWindow_Settings = 0;
-                                            pMouse->SetCursorBitmap("MICON1");
-                                            GameUI_Footer_TimeLeft = 0;
-                                            _50C9A0_IsEnchantingInProgress = 0;
-                                            back_to_game();
-                                        }
-                                    }
-                                    if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
-                                        uActiveCharacter = pParty->GetNextActiveCharacter();
-                                    pGUIWindow_CurrentMenu->Release();
-                                    if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
-                                        window_SpeakInHouse = 0;
-                                    pGUIWindow_CurrentMenu = 0;
-                                    pEventTimer->Resume();
-                                    current_screen_type = SCREEN_GAME;
-                                    viewparams->bRedrawGameUI = true;
-                                    pIcons_LOD->RemoveTexturesFromTextureList();
+                                    Game_OnEscape();
                                     continue;
                                 default:
-                                    if (pGUIWindow_Settings)
-                                    {
-                                        if (current_screen_type == SCREEN_CHARACTERS)
-                                            pMouse->SetCursorBitmap("MICON2");
-                                        else
-                                        {
-                                            pGUIWindow_Settings->Release();
-                                            pGUIWindow_Settings = 0;
-                                            pMouse->SetCursorBitmap("MICON1");
-                                            GameUI_Footer_TimeLeft = 0;
-                                            _50C9A0_IsEnchantingInProgress = 0;
-                                            back_to_game();
-                                        }
-                                    }
-                                    if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
-                                        uActiveCharacter = pParty->GetNextActiveCharacter();
-                                    pGUIWindow_CurrentMenu->Release();
-                                    if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
-                                        window_SpeakInHouse = 0;
-                                    pGUIWindow_CurrentMenu = 0;
-                                    pEventTimer->Resume();
-                                    current_screen_type = SCREEN_GAME;
-                                    viewparams->bRedrawGameUI = 1;
-                                    pIcons_LOD->RemoveTexturesFromTextureList();
+                                    __debugbreak(); // which GAME_MENU is this?
+                                    Game_OnEscape();
                                     continue;
                                 }
-                                if (pGUIWindow_Settings)
-                                {
-                                    if (current_screen_type == SCREEN_CHARACTERS)
-                                        pMouse->SetCursorBitmap("MICON2");
-                                    else
-                                    {
-                                        pGUIWindow_Settings->Release();
-                                        pGUIWindow_Settings = 0;
-                                        pMouse->SetCursorBitmap("MICON1");
-                                        GameUI_Footer_TimeLeft = 0;
-                                        _50C9A0_IsEnchantingInProgress = 0;
-                                        back_to_game();
-                                    }
-                                }
-                                if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
-                                    uActiveCharacter = pParty->GetNextActiveCharacter();
-                                pGUIWindow_CurrentMenu->Release();
-                                if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
-                                    window_SpeakInHouse = 0;
-                                pGUIWindow_CurrentMenu = 0;
-                                pEventTimer->Resume();
-                                current_screen_type = SCREEN_GAME;
-                                viewparams->bRedrawGameUI = true;
-                                pIcons_LOD->RemoveTexturesFromTextureList();
+                                __debugbreak(); // which GAME_MENU is this?
+                                Game_OnEscape();
                                 continue;
                             }
+                            __debugbreak(); // which GAME_MENU is this?
                             CharacterUI_ReleaseButtons();
                             ReleaseAwardsScrollBar();
                             pIcons_LOD->RemoveTexturesPackFromTextureList();
                         }
-                        if (pGUIWindow_Settings)
-                        {
-                            if (current_screen_type == SCREEN_CHARACTERS)
-                                pMouse->SetCursorBitmap("MICON2");
-                            else
-                            {
-                                pGUIWindow_Settings->Release();
-                                pGUIWindow_Settings = 0;
-                                pMouse->SetCursorBitmap("MICON1");
-                                GameUI_Footer_TimeLeft = 0;
-                                _50C9A0_IsEnchantingInProgress = 0;
-                                back_to_game();
-                            }
-                        }
-                        if ((signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4)
-                            uActiveCharacter = pParty->GetNextActiveCharacter();
-                        pGUIWindow_CurrentMenu->Release();
-                        if (pGUIWindow_CurrentMenu == window_SpeakInHouse)
-                            window_SpeakInHouse = 0;
-                        pGUIWindow_CurrentMenu = 0;
-                        pEventTimer->Resume();
-                        current_screen_type = SCREEN_GAME;
-                        viewparams->bRedrawGameUI = true;
-                        pIcons_LOD->RemoveTexturesFromTextureList();
+                        __debugbreak(); // which GAME_MENU is this?
+                        Game_OnEscape();
                         continue;
                     }
-                    if (!pGUIWindow_Settings)//Draw Menu
-                    {
-                        dword_6BE138 = -1;
-                        new OnButtonClick2(0x25Au, 0x1C2u, 0, 0, (int)pBtn_GameSettings, (char *)1);
-                        pEventTimer->Pause();
-                        pAudioPlayer->StopChannels(-1, -1);
-                        current_screen_type = SCREEN_MENU;
-
-                        ++pIcons_LOD->uTexturePacksCount;
-                        if (!pIcons_LOD->uNumPrevLoadedFiles)
-                            pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
-
-                        pGUIWindow_CurrentMenu = new GUIWindow_GameMenu();
-
-                        viewparams->field_48 = 1;
-
-                        stru_506E40.Release();
-                        pRenderer->SaveScreenshot("gamma.pcx", 155, 117);
-                        stru_506E40.LoadPCXFile("gamma.pcx", 0);
-
-                        continue;
-                    }
-                    pGUIWindow_Settings->Release();
-                    pGUIWindow_Settings = 0;
-                    pMouse->SetCursorBitmap("MICON1");
-                    GameUI_Footer_TimeLeft = 0;
-                    _50C9A0_IsEnchantingInProgress = 0;
-                    back_to_game();
-                    continue;
-                }
-                pModalWindow->Release();
-                pModalWindow = nullptr;
                 continue;
 
             case UIMSG_ScrollNPCPanel://Right and Left button for NPCPanel
@@ -1501,13 +1276,13 @@
                     v47 = pActors[v46].uAIState == Dead;
                     if (!v47)
                         continue;
-                    pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C;
+                    pSpellInfo = (CastSpellInfo *)pGUIWindow_CastTargetedSpell->ptr_1C;
                     pSpellInfo->uFlags &= ~0x40u;
                     pSpellInfo->uPlayerID_2 = uMessageParam;
                     pSpellInfo->spell_target_pid = v44;
                     pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300);
-                    pGUIWindow_Settings->Release();
-                    pGUIWindow_Settings = 0;
+                    pGUIWindow_CastTargetedSpell->Release();
+                    pGUIWindow_CastTargetedSpell = 0;
                     pMouse->SetCursorBitmap("MICON1");
                     GameUI_Footer_TimeLeft = 0;
                     _50C9A0_IsEnchantingInProgress = 0;
@@ -1519,13 +1294,13 @@
                     v47 = (pObjectList->pObjects[pSpriteObjects[v46].uObjectDescID].uFlags & 0x10) == 0;
                     if (!v47)
                         continue;
-                    pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C;
+                    pSpellInfo = (CastSpellInfo *)pGUIWindow_CastTargetedSpell->ptr_1C;
                     pSpellInfo->uFlags &= ~0x40u;
                     pSpellInfo->uPlayerID_2 = uMessageParam;
                     pSpellInfo->spell_target_pid = v44;
                     pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300);
-                    pGUIWindow_Settings->Release();
-                    pGUIWindow_Settings = 0;
+                    pGUIWindow_CastTargetedSpell->Release();
+                    pGUIWindow_CastTargetedSpell = 0;
                     pMouse->SetCursorBitmap("MICON1");
                     GameUI_Footer_TimeLeft = 0;
                     _50C9A0_IsEnchantingInProgress = 0;
@@ -1546,13 +1321,13 @@
                         if (!pODMFace->Clickable() || !pODMFace->sCogTriggeredID)
                             continue;
                         v44 = uNumSeconds;
-                        pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C;
+                        pSpellInfo = (CastSpellInfo *)pGUIWindow_CastTargetedSpell->ptr_1C;
                         pSpellInfo->uFlags &= ~0x40u;
                         pSpellInfo->uPlayerID_2 = uMessageParam;
                         pSpellInfo->spell_target_pid = v44;
                         pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300);
-                        pGUIWindow_Settings->Release();
-                        pGUIWindow_Settings = 0;
+                        pGUIWindow_CastTargetedSpell->Release();
+                        pGUIWindow_CastTargetedSpell = 0;
                         pMouse->SetCursorBitmap("MICON1");
                         GameUI_Footer_TimeLeft = 0;
                         _50C9A0_IsEnchantingInProgress = 0;
@@ -1566,13 +1341,13 @@
                 }
                 if (v48)
                     continue;
-                pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C;
+                pSpellInfo = (CastSpellInfo *)pGUIWindow_CastTargetedSpell->ptr_1C;
                 pSpellInfo->uFlags &= ~0x40u;
                 pSpellInfo->uPlayerID_2 = uMessageParam;
                 pSpellInfo->spell_target_pid = v44;
                 pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300);
-                pGUIWindow_Settings->Release();
-                pGUIWindow_Settings = 0;
+                pGUIWindow_CastTargetedSpell->Release();
+                pGUIWindow_CastTargetedSpell = 0;
                 pMouse->SetCursorBitmap("MICON1");
                 GameUI_Footer_TimeLeft = 0;
                 _50C9A0_IsEnchantingInProgress = 0;
@@ -1589,9 +1364,9 @@
                 }
                 else
                 {
-                    if (pGUIWindow_Settings)
+                    if (pGUIWindow_CastTargetedSpell)
                     {
-                        pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C;
+                        pSpellInfo = (CastSpellInfo *)pGUIWindow_CastTargetedSpell->ptr_1C;
                         switch (uMessage)
                         {
                         case UIMSG_CastSpell_Character_Big_Improvement:
@@ -1606,8 +1381,8 @@
                         }
                         pSpellInfo->uPlayerID_2 = uMessageParam;
                         pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300);
-                        pGUIWindow_Settings->Release();
-                        pGUIWindow_Settings = 0;
+                        pGUIWindow_CastTargetedSpell->Release();
+                        pGUIWindow_CastTargetedSpell = 0;
                         pEventTimer->Resume();
                         pMouse->SetCursorBitmap("MICON1");
                         GameUI_Footer_TimeLeft = 0;
@@ -2056,7 +1831,7 @@
                 v84 = v83 >> 16;
                 if (PID_TYPE(v44) != 3 || v84 >= 5120)
                     continue;
-                pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C;
+                pSpellInfo = (CastSpellInfo *)pGUIWindow_CastTargetedSpell->ptr_1C;
                 if (uMessage == UIMSG_CastSpell_Shoot_Monster)
                 {
                     pSpellInfo->uFlags &= ~0x08;
@@ -2071,8 +1846,8 @@
                 pSpellInfo->uPlayerID_2 = uMessageParam;
                 pSpellInfo->spell_target_pid = v44;
                 pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300);
-                pGUIWindow_Settings->Release();
-                pGUIWindow_Settings = 0;
+                pGUIWindow_CastTargetedSpell->Release();
+                pGUIWindow_CastTargetedSpell = 0;
                 pMouse->SetCursorBitmap("MICON1");
                 GameUI_Footer_TimeLeft = 0;
                 _50C9A0_IsEnchantingInProgress = 0;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Game/GameMenu.cpp	Wed May 13 20:09:12 2015 +0600
@@ -0,0 +1,637 @@
+#include "Engine/Engine.h"
+#include "Engine/Timer.h"
+#include "Engine/LOD.h"
+#include "Engine/Party.h"
+#include "Engine/SaveLoad.h"
+#include "Engine/Registry.h"
+#include "Engine/texts.h"
+#include "Engine/Graphics/IRender.h"
+#include "Engine/Graphics/Viewport.h"
+
+#include "IO/Keyboard.h"
+#include "IO/Mouse.h"
+
+#include "GUI/UI/UIGame.h"
+#include "GUI/UI/UISaveLoad.h"
+#include "GUI/UI/UIModal.h"
+
+#include "Media/Audio/AudioPlayer.h"
+#include "Media/Audio/AIL.h"
+
+
+
+extern void DoThatMessageThing();
+
+
+void Game_StartNewGameWhilePlaying(bool force_start)
+{
+    if (dword_6BE138 == 124 || force_start)
+    {
+        pIcons_LOD->SyncLoadedFilesCount();
+        pIcons_LOD->RemoveTexturesPackFromTextureList();
+        DoThatMessageThing();
+        //pGUIWindow_CurrentMenu->Release();
+        uGameState = GAME_STATE_NEWGAME_OUT_GAMEMENU;
+        current_screen_type = SCREEN_GAME;
+        viewparams->bRedrawGameUI = 1;
+    }
+    else
+    {
+        ShowStatusBarString(pGlobalTXT_LocalizationStrings[201], 2);// "Are you sure?  Click again to start a New Game"
+        pAudioPlayer->PlaySound(SOUND_quest, 0, 0, -1, 0, 0, 0, 0);
+        dword_6BE138 = 124;
+    }
+}
+
+void Game_QuitGameWhilePlaying(bool force_quit)
+{
+    if (dword_6BE138 == 132 || force_quit)
+    {
+        pIcons_LOD->SyncLoadedFilesCount();
+        pIcons_LOD->RemoveTexturesPackFromTextureList();
+        DoThatMessageThing();
+        //pGUIWindow_CurrentMenu->Release();
+        current_screen_type = SCREEN_GAME;
+        viewparams->bRedrawGameUI = 1;
+        pAudioPlayer->PlaySound(SOUND_WoodDoorClosing, 0, 0, -1, 0, 0, 0, 0);
+        uGameState = GAME_STATE_GAME_QUITTING_TO_MAIN_MENU;
+    }
+    else
+    {
+        ShowStatusBarString(pGlobalTXT_LocalizationStrings[82], 2);// "Are you sure?  Click again to quit"
+        pAudioPlayer->PlaySound(SOUND_quest, 0, 0, -1, 0, 0, 0, 0);
+        dword_6BE138 = 132;
+    }
+}
+
+void Game_OpenLoadGameDialog()
+{
+    pIcons_LOD->SyncLoadedFilesCount();
+    pIcons_LOD->RemoveTexturesPackFromTextureList();
+
+    DoThatMessageThing();
+    pGUIWindow_CurrentMenu->Release();
+    pGUIWindow_CurrentMenu = nullptr;
+
+    //LoadUI_Load(1);
+    current_screen_type = SCREEN_LOADGAME;
+    pGUIWindow_CurrentMenu = new GUIWindow_Load(true);
+}
+
+
+
+
+void GameMenu_EventLoop()
+{
+    while (pMessageQueue_50CBD0->uNumMessages)
+    {
+        UIMessageType msg;
+        int param, param2;
+        pMessageQueue_50CBD0->PopMessage(&msg, &param, &param2);
+
+        switch (msg)
+        {
+            case UIMSG_StartNewGame:              Game_StartNewGameWhilePlaying(param); continue;
+            case UIMSG_Quit:                      Game_QuitGameWhilePlaying(param); continue;
+            case UIMSG_Game_OpenLoadGameDialog:   Game_OpenLoadGameDialog(); continue;
+
+            case UIMSG_ArrowUp:
+                --pSaveListPosition;
+                if (pSaveListPosition < 0)
+                    pSaveListPosition = 0;
+                new OnButtonClick2(215, 199, 17, 17, (int)pBtnArrowUp, 0);
+                continue;
+
+            case UIMSG_DownArrow:
+                ++pSaveListPosition;
+                if (pSaveListPosition >= param)
+                    pSaveListPosition = param - 1;
+                new OnButtonClick2(215, 323, 17, 17, (int)pBtnDownArrow, 0);
+                continue;
+
+            case UIMSG_Cancel:
+                new OnCancel(350, 302, 106, 42, (int)pBtnCancel, 0);
+                continue;
+
+            case UIMSG_SaveLoadBtn:
+                new OnSaveLoad(241, 302, 106, 42, (int)pBtnLoadSlot, 0);
+                continue;
+            case UIMSG_SelectLoadSlot:
+            {
+                if (pGUIWindow_CurrentMenu->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS)
+                    pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_NONE);
+
+                int v10 = pSaveListPosition + param;
+                if (current_screen_type != SCREEN_SAVEGAME || uLoadGameUI_SelectedSlot != v10)
+                {
+                    if (dword_6BE138 == pSaveListPosition + param)
+                    {
+                        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_SaveLoadBtn, 0, 0);
+                        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_LoadGame, 0, 0);
+                    }
+                    uLoadGameUI_SelectedSlot = v10;
+                    dword_6BE138 = v10;
+                }
+                else
+                {
+                    pKeyActionMap->EnterText(0, 19, pGUIWindow_CurrentMenu);
+                    if (strcmp(pSavegameHeader[uLoadGameUI_SelectedSlot].pName, pGlobalTXT_LocalizationStrings[72]))// "Empty"
+                        strcpy(pKeyActionMap->pPressedKeysBuffer, pSavegameHeader[uLoadGameUI_SelectedSlot].pName);
+                    pKeyActionMap->uNumKeysPressed = strlen(pKeyActionMap->pPressedKeysBuffer);
+                }
+            }
+            continue;
+            case UIMSG_LoadGame:
+                if (pSavegameUsedSlots[uLoadGameUI_SelectedSlot])
+                {
+                    LoadGame(uLoadGameUI_SelectedSlot);
+                    uGameState = GAME_STATE_LOADING_GAME;
+                }
+                continue;
+            case UIMSG_SaveGame:
+                if (pGUIWindow_CurrentMenu->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS)
+                {
+                    pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_NONE);
+                    strcpy((char *)&pSavegameHeader[uLoadGameUI_SelectedSlot], pKeyActionMap->pPressedKeysBuffer);
+                }
+                DoSavegame(uLoadGameUI_SelectedSlot);
+                continue;
+            case UIMSG_Game_OpenSaveGameDialog:
+            {
+                pGUIWindow_CurrentMenu->Release();
+
+                current_screen_type = SCREEN_SAVEGAME;
+                pGUIWindow_CurrentMenu = new GUIWindow_Save(); //SaveUI_Load(current_screen_type = SCREEN_SAVEGAME);
+                continue;
+            }
+            case UIMSG_Game_OpenOptionsDialog://Open
+            {
+                DoThatMessageThing();
+
+                pGUIWindow_CurrentMenu->Release();
+                pGUIWindow_CurrentMenu = new GUIWindow_GameOptions();//GameMenuUI_Options_Load();
+
+                viewparams->field_48 = 1;
+                current_screen_type = SCREEN_OPTIONS;
+
+                continue;
+            }
+
+            case UIMSG_OpenKeyMappingOptions://Open
+            {
+                DoThatMessageThing();
+
+                pGUIWindow_CurrentMenu->Release();
+                pGUIWindow_CurrentMenu = new GUIWindow_GameKeyBindings();//GameMenuUI_OptionsKeymapping_Load();
+
+                viewparams->field_48 = 1;
+                current_screen_type = SCREEN_KEYBOARD_OPTIONS;
+
+                continue;
+            }
+
+            case UIMSG_ChangeKeyButton:
+            {
+                if (uGameMenuUI_CurentlySelectedKeyIdx != -1)
+                {
+                    pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
+                }
+                else
+                {
+                    uGameMenuUI_CurentlySelectedKeyIdx = param;
+                    if (KeyboardPageNum != 1)
+                        uGameMenuUI_CurentlySelectedKeyIdx += 14;
+                    pKeyActionMap->EnterText(0, 1, pGUIWindow_CurrentMenu);
+                }
+                continue;
+            }
+
+            case UIMSG_ResetKeyMapping:
+            {
+                int v197 = 1;
+                pKeyActionMap->SetDefaultMapping();
+                for (uint i = 0; i < 28; i++)
+                {
+                    if (pKeyActionMap->GetActionVKey((enum InputAction)i) != pPrevVirtualCidesMapping[i])
+                    {
+                        if (v197)
+                        {
+                            GUI_ReplaceHotkey(LOBYTE(pPrevVirtualCidesMapping[i]), pKeyActionMap->GetActionVKey((enum InputAction)i), 1);
+                            v197 = 0;
+                        }
+                        else
+                            GUI_ReplaceHotkey(LOBYTE(pPrevVirtualCidesMapping[i]), pKeyActionMap->GetActionVKey((enum InputAction)i), 0);
+                    }
+                    pPrevVirtualCidesMapping[i] = pKeyActionMap->GetActionVKey((enum InputAction)i);
+                    GameMenuUI_InvaligKeyBindingsFlags[i] = false;
+                }
+                pAudioPlayer->PlaySound(SOUND_chimes, 0, 0, -1, 0, 0, 0, 0);
+                continue;
+            }
+
+            case UIMSG_SelectKeyPage1:
+                KeyboardPageNum = 1;
+                continue;
+            case UIMSG_SelectKeyPage2:
+                KeyboardPageNum = 2;
+                continue;
+
+            case UIMSG_OpenVideoOptions:
+            {
+                DoThatMessageThing();
+
+                pGUIWindow_CurrentMenu->Release();
+                pGUIWindow_CurrentMenu = new GUIWindow_GameVideoOptions();//GameMenuUI_OptionsVideo_Load();
+                viewparams->field_48 = 1;
+                current_screen_type = SCREEN_VIDEO_OPTIONS;
+
+                continue;
+            }
+
+            case UIMSG_1A9:
+                __debugbreak();
+                if (param == 4)
+                {
+                    //--uGammaPos;
+                    if ((uGammaPos-- - 1) < 0)
+                    {
+                        uGammaPos = 0;
+                        pAudioPlayer->PlaySound(SOUND_ClickMovingSelector, 0, 0, -1, 0, 0, 0, 0);
+                        continue;
+                    }
+                    double v19 = (double)(signed int)uGammaPos * 0.1 + 0.6;
+                    //pEngine->pGammaController->Initialize(v19);
+                    new OnButtonClick2(21, 161, 0, 0, (int)pBtn_SliderLeft, (char *)1);
+                    pAudioPlayer->PlaySound(SOUND_ClickMovingSelector, 0, 0, -1, 0, 0, 0, 0);
+                    continue;
+                }
+                if (param == 5)
+                {
+                    ++uGammaPos;
+                    if ((signed int)uGammaPos <= 9)
+                    {
+                        double v21 = (double)(signed int)uGammaPos * 0.1 + 0.6;
+                        //pEngine->pGammaController->Initialize(v21);
+                        new OnButtonClick2(213, 161, 0, 0, (int)pBtn_SliderRight, (char *)1);
+                        pAudioPlayer->PlaySound(SOUND_ClickMovingSelector, 0, 0, -1, 0, 0, 0, 0);
+                        continue;
+                    }
+                    uGammaPos = 9;
+                }
+                else
+                {
+                    POINT a2;
+                    uGammaPos = (pMouse->GetCursorPos(&a2)->x - 42) / 17;
+                    double v22 = (double)(signed int)uGammaPos * 0.1 + 0.6;
+                    //pEngine->pGammaController->Initialize(v22);
+                }
+                pAudioPlayer->PlaySound(SOUND_ClickMovingSelector, 0, 0, -1, 0, 0, 0, 0);
+                continue;
+            case UIMSG_ToggleBloodsplats:
+                pEngine->ToggleFlags2(0x20u);
+                continue;
+            case UIMSG_ToggleColoredLights:
+                pRenderer->ToggleColoredLights();
+                continue;
+            case UIMSG_ToggleTint:
+                pRenderer->ToggleTint();
+                continue;
+            case UIMSG_ChangeMusicVolume:
+                extern bool use_music_folder;
+                if (param == 4)//-
+                {
+                    --uMusicVolimeMultiplier;
+                    if ((char)uMusicVolimeMultiplier < 1)
+                        uMusicVolimeMultiplier = 0;
+                    new OnButtonClick2(243, 216, 0, 0, (int)pBtn_SliderLeft, (char *)1);
+                    if (uMusicVolimeMultiplier)
+                        pAudioPlayer->PlaySound(SOUND_hurp, -1, 0, -1, 0, 0, pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f, 0);
+
+                    if (use_music_folder)
+                        alSourcef(mSourceID, AL_GAIN, pSoundVolumeLevels[uMusicVolimeMultiplier]);
+                    else
+                        pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f);
+
+                    continue;
+                }
+                if (param == 5)//+
+                {
+                    ++uMusicVolimeMultiplier;
+                    if ((char)uMusicVolimeMultiplier > 9)
+                        uMusicVolimeMultiplier = 9;
+                    new OnButtonClick2(435, 216, 0, 0, (int)pBtn_SliderRight, (char *)1);
+                    if (uMusicVolimeMultiplier)
+                        pAudioPlayer->PlaySound(SOUND_hurp, -1, 0, -1, 0, 0, pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f, 0);
+                    if (use_music_folder)
+                        alSourcef(mSourceID, AL_GAIN, pSoundVolumeLevels[uMusicVolimeMultiplier]);
+                    else
+                        pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f);
+                    continue;
+                }
+
+                POINT v202;
+                uMusicVolimeMultiplier = (pMouse->GetCursorPos(&v202)->x - 263) / 17;//for mouse
+                if ((char)uMusicVolimeMultiplier > 9)
+                    uMusicVolimeMultiplier = 9;
+                if (uMusicVolimeMultiplier)
+                    pAudioPlayer->PlaySound(SOUND_hurp, -1, 0, -1, 0, 0, pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f, 0);
+                if (use_music_folder)
+                    alSourcef(mSourceID, AL_GAIN, pSoundVolumeLevels[uMusicVolimeMultiplier]);
+                else
+                    pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f);
+                continue;
+            case UIMSG_ChangeSoundVolume:
+                if (param == 4)//reduce sound level button left
+                {
+                    --uSoundVolumeMultiplier;
+                    if ((char)uSoundVolumeMultiplier < 1)
+                        uSoundVolumeMultiplier = 0;
+                    new OnButtonClick2(243, 162, 0, 0, (int)pBtn_SliderLeft, (char *)1);
+                    pAudioPlayer->SetMasterVolume(pSoundVolumeLevels[uSoundVolumeMultiplier] * 128.0f);
+                    pAudioPlayer->PlaySound(SOUND_church, -1, 0, -1, 0, 0, 0, 0);
+                    int v = AIL_redbook_volume(pAudioPlayer->hAILRedbook);
+                    //v = v+1;
+                    if (v)
+                        __debugbreak();
+                    continue;
+                }
+                if (param == 5)//Increase sound level button right
+                {
+                    ++uSoundVolumeMultiplier;
+                    if ((char)uSoundVolumeMultiplier > 8)
+                        uSoundVolumeMultiplier = 9;
+                    //v168 = 1;
+                    //v154 = (int)pBtn_SliderRight;
+                    new OnButtonClick2(435, 162, 0, 0, (int)pBtn_SliderRight, (char *)1);
+                    pAudioPlayer->SetMasterVolume(pSoundVolumeLevels[uSoundVolumeMultiplier] * 128.0f);
+                    pAudioPlayer->PlaySound(SOUND_church, -1, 0, -1, 0, 0, 0, 0);
+                    continue;
+                }
+
+                POINT v207;
+                uSoundVolumeMultiplier = (pMouse->GetCursorPos(&v207)->x - 263) / 17;
+                if ((char)uSoundVolumeMultiplier > 8)
+                    uSoundVolumeMultiplier = 9;
+                pAudioPlayer->SetMasterVolume(pSoundVolumeLevels[uSoundVolumeMultiplier] * 128.0f);
+                pAudioPlayer->PlaySound(SOUND_church, -1, 0, -1, 0, 0, 0, 0);
+                continue;
+            case UIMSG_ToggleFlipOnExit:
+                bFlipOnExit = bFlipOnExit == 0;
+                continue;
+            case UIMSG_ToggleAlwaysRun:
+                bAlwaysRun = bAlwaysRun == 0;
+                continue;
+            case UIMSG_ToggleWalkSound:
+                bWalkSound = bWalkSound == 0;
+                continue;
+            case UIMSG_ToggleShowDamage:
+                bShowDamage = bShowDamage == 0;
+                continue;
+            case UIMSG_ChangeVoiceVolume:
+                if (param == 4)
+                {
+                    --uVoicesVolumeMultiplier;
+                    if ((char)uVoicesVolumeMultiplier < 1)
+                        uVoicesVolumeMultiplier = 0;
+                    new OnButtonClick2(243, 270, 0, 0, (int)pBtn_SliderLeft, (char *)1);
+                    if (!uVoicesVolumeMultiplier)
+                        continue;
+                    pAudioPlayer->PlaySound(SOUND_hf445a, -1, 0, -1, 0, 0, pSoundVolumeLevels[uVoicesVolumeMultiplier] * 128.0f, 0);
+                    continue;
+                }
+                if (param == 5)
+                {
+                    ++uVoicesVolumeMultiplier;
+                    if ((char)uVoicesVolumeMultiplier > 8)
+                        uVoicesVolumeMultiplier = 9;
+                    new OnButtonClick2(435, 270, 0, 0, (int)pBtn_SliderRight, (char *)1);
+                    if (!uVoicesVolumeMultiplier)
+                        continue;
+                    pAudioPlayer->PlaySound(SOUND_hf445a, -1, 0, -1, 0, 0, pSoundVolumeLevels[uVoicesVolumeMultiplier] * 128.0f, 0);
+                    continue;
+                }
+
+                POINT v205;
+                uVoicesVolumeMultiplier = (pMouse->GetCursorPos(&v205)->x - 263) / 17;
+                if ((char)uVoicesVolumeMultiplier > 8)
+                    uVoicesVolumeMultiplier = 9;
+                if (!uVoicesVolumeMultiplier)
+                    continue;
+                pAudioPlayer->PlaySound(SOUND_hf445a, -1, 0, -1, 0, 0, pSoundVolumeLevels[uVoicesVolumeMultiplier] * 128.0f, 0);
+                continue;
+            case UIMSG_SetTurnSpeed:
+                if (param)
+                    pParty->sRotationY = param * pParty->sRotationY / param;
+                uTurnSpeed = param;
+                continue;
+
+            case UIMSG_SetGraphicsMode:
+                //if ( !bUseLoResSprites )
+                //{
+                //    byte_6BE388_graphicsmode = uMessageParam;
+                //    MM7Initialization();
+                //    continue;
+                //}
+                //if ( uMessageParam )
+                //{
+                //    if ( uMessageParam == 1 )
+                //    {
+                //    byte_6BE388_graphicsmode = 0;
+                //    }
+                //    else
+                //    {
+                //        if ( uMessageParam != 2 )
+                //            continue;
+                //        byte_6BE388_graphicsmode = 1;
+                //    }
+                //    MM7Initialization();
+                //    continue;
+                //}
+                pModalWindow = new GUIWindow_Modal(pNPCTopics[453].pText, UIMSG_0);
+                __debugbreak(); // Nomad: graphicsmode as it was now removed
+                continue;
+
+            case UIMSG_GameMenu_ReturnToGame:
+                //pGUIWindow_CurrentMenu->Release();
+                pEventTimer->Resume();
+                current_screen_type = SCREEN_GAME;
+                viewparams->bRedrawGameUI = true;
+                continue;
+
+
+
+
+            case UIMSG_Escape:
+                if (pModalWindow)
+                {
+                    pModalWindow->Release();
+                    pModalWindow = nullptr;
+                    continue;
+                }
+                pRenderer->ClearZBuffer(0, 479);
+                viewparams->bRedrawGameUI = true;
+                viewparams->field_48 = 1;
+
+                if (current_screen_type == SCREEN_MENU)
+                {
+                    pIcons_LOD->SyncLoadedFilesCount();
+                    pIcons_LOD->RemoveTexturesPackFromTextureList();
+                    pIcons_LOD->SyncLoadedFilesCount();
+                    pIcons_LOD->RemoveTexturesPackFromTextureList();
+
+                    current_screen_type = SCREEN_GAME;
+                }
+                else if (current_screen_type == SCREEN_SAVEGAME || current_screen_type == SCREEN_LOADGAME)
+                {
+                    pIcons_LOD->RemoveTexturesPackFromTextureList();
+                    //crt_deconstruct_ptr_6A0118();
+
+                    pGUIWindow_CurrentMenu->Release();
+                    current_screen_type = SCREEN_MENU;
+                    pGUIWindow_CurrentMenu = new GUIWindow_GameMenu();
+                }
+                else if (current_screen_type == SCREEN_OPTIONS)
+                {
+                    options_menu_skin.Relaease();
+                    pIcons_LOD->SyncLoadedFilesCount();
+                    WriteWindowsRegistryInt("soundflag", (char)uSoundVolumeMultiplier);
+                    WriteWindowsRegistryInt("musicflag", (char)uMusicVolimeMultiplier);
+                    WriteWindowsRegistryInt("CharVoices", (char)uVoicesVolumeMultiplier);
+                    WriteWindowsRegistryInt("WalkSound", bWalkSound);
+                    WriteWindowsRegistryInt("ShowDamage", bShowDamage);
+                    //WriteWindowsRegistryInt("graphicsmode", (unsigned __int8)byte_6BE388_graphicsmode);
+                    WriteWindowsRegistryInt("valAlwaysRun", bAlwaysRun);
+                    WriteWindowsRegistryInt("FlipOnExit", bFlipOnExit);
+                    if (!uTurnSpeed)
+                        WriteWindowsRegistryInt("TurnDelta", 3);
+                    else if (uTurnSpeed == 64)
+                        WriteWindowsRegistryInt("TurnDelta", 2);
+                    else if (uTurnSpeed == 128)
+                        WriteWindowsRegistryInt("TurnDelta", 1);
+
+                    pGUIWindow_CurrentMenu->Release();
+                    current_screen_type = SCREEN_MENU;
+                    pGUIWindow_CurrentMenu = new GUIWindow_GameMenu();
+                }
+                else if (current_screen_type == SCREEN_VIDEO_OPTIONS)
+                {
+                    //if ( pRenderer->pRenderD3D )
+                    {
+                        WriteWindowsRegistryInt("Colored Lights", pRenderer->bUseColoredLights);
+                        WriteWindowsRegistryInt("Tinting", pRenderer->bTinting);
+                        WriteWindowsRegistryInt("Bloodsplats", (LOBYTE(pEngine->uFlags2) >> 5) & 1);
+                    }
+
+                    pGUIWindow_CurrentMenu->Release();
+                    current_screen_type = SCREEN_MENU;
+                    pGUIWindow_CurrentMenu = new GUIWindow_GameMenu();
+                }
+                else if (current_screen_type == SCREEN_KEYBOARD_OPTIONS)
+                {
+                    KeyToggleType pKeyToggleType; // [sp+0h] [bp-5FCh]@287
+                    int v197 = 1;
+                    bool pKeyBindingFlag = false;
+
+                    for (uint i = 0; i < 28; ++i)
+                    {
+                        if (GameMenuUI_InvaligKeyBindingsFlags[i])
+                            pKeyBindingFlag = true;
+                    }
+                    if (!pKeyBindingFlag)
+                    {
+                        for (uint i = 0; i < 5; i++)
+                        {
+                            if (uTextureID_Optkb[i])
+                                pIcons_LOD->pTextures[uTextureID_Optkb[i]].Release();
+                        }
+                        memset(uTextureID_Optkb.data(), 0, 20);
+                        pIcons_LOD->SyncLoadedFilesCount();
+                        for (uint i = 0; i < 28; ++i)
+                        {
+                            if (pKeyActionMap->GetActionVKey((enum InputAction)i) != pPrevVirtualCidesMapping[i])
+                            {
+                                if (v197)
+                                {
+                                    GUI_ReplaceHotkey(pKeyActionMap->GetActionVKey((enum InputAction)i), LOBYTE(pPrevVirtualCidesMapping[i]), 1);
+                                    v197 = 0;
+                                }
+                                else
+                                    GUI_ReplaceHotkey(pKeyActionMap->GetActionVKey((enum InputAction)i), LOBYTE(pPrevVirtualCidesMapping[i]), 0);
+                            }
+                            if (i > 3 && i != 25 && i != 26)
+                                pKeyToggleType = TOGGLE_OneTimePress;
+                            else
+                                pKeyToggleType = TOGGLE_Continuously;
+                            pKeyActionMap->SetKeyMapping(i, pPrevVirtualCidesMapping[i], pKeyToggleType);
+                        }
+                        pKeyActionMap->StoreMappings();
+                    }
+                    else
+                        pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0);
+
+                    pGUIWindow_CurrentMenu->Release();
+                    current_screen_type = SCREEN_MENU;
+                    pGUIWindow_CurrentMenu = new GUIWindow_GameMenu();
+                }
+                continue;
+        }
+    }
+}
+
+void GameMenu_Loop()
+{
+    pEventTimer->Pause();
+    pAudioPlayer->StopChannels(-1, -1);
+    current_screen_type = SCREEN_MENU;
+
+    ++pIcons_LOD->uTexturePacksCount;
+    if (!pIcons_LOD->uNumPrevLoadedFiles)
+        pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
+
+    pGUIWindow_CurrentMenu = new GUIWindow_GameMenu();
+
+    viewparams->field_48 = 1;
+
+    stru_506E40.Release();
+    pRenderer->SaveScreenshot("gamma.pcx", 155, 117);
+    stru_506E40.LoadPCXFile("gamma.pcx", 0);
+
+    while (uGameState == GAME_STATE_PLAYING
+        && (
+            current_screen_type == SCREEN_MENU
+            || current_screen_type == SCREEN_SAVEGAME
+            || current_screen_type == SCREEN_LOADGAME
+            || current_screen_type == SCREEN_OPTIONS
+            || current_screen_type == SCREEN_VIDEO_OPTIONS
+            || current_screen_type == SCREEN_KEYBOARD_OPTIONS
+        )
+    )
+    {
+        MSG msg;
+        while (PeekMessageW(&msg, 0, 0, 0, PM_REMOVE))
+        {
+            if (msg.message == WM_QUIT)
+                Engine_DeinitializeAndTerminate(0);
+            TranslateMessage(&msg);
+            DispatchMessageW(&msg);
+        }
+        if (dword_6BE364_game_settings_1 & GAME_SETTINGS_APP_INACTIVE)
+        {
+            WaitMessage();
+            continue;
+        }
+
+        pRenderer->BeginScene();
+        {
+            GameMenu_EventLoop();
+            GUI_UpdateWindows();
+        }
+        pRenderer->EndScene();
+        pRenderer->Present();
+    }
+
+    pGUIWindow_CurrentMenu->Release();
+    pGUIWindow_CurrentMenu = nullptr;
+
+    stru_506E40.Release();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Game/GameMenu.h	Wed May 13 20:09:12 2015 +0600
@@ -0,0 +1,3 @@
+#pragma once
+
+void GameMenu_Loop();
\ No newline at end of file
--- a/Game/MainMenu.cpp	Wed May 13 20:09:00 2015 +0600
+++ b/Game/MainMenu.cpp	Wed May 13 20:09:12 2015 +0600
@@ -17,6 +17,7 @@
 #include "Media/Audio/AudioPlayer.h"
 
 #include "Game/MainMenu.h"
+#include "Game/MainMenuLoad.h"
 
 
 RGBTexture main_menu_background;
@@ -71,7 +72,7 @@
                 new OnButtonClick2(495, 337, 0, 0, (int)pMainMenu_BtnExit, 0);
                 SetCurrentMenuID(MENU_EXIT_GAME);
                 break;
-            case UIMSG_PlayerCreation_SelectAttribute:
+            /*case UIMSG_PlayerCreation_SelectAttribute:
                 pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem)
                     % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * pParam;
                 uPlayerCreationUI_SelectedCharacter = pParam;
@@ -183,17 +184,18 @@
                 uPlayerCreationUI_SelectedCharacter = pParam;
                 pKeyActionMap->EnterText(0, 15, pGUIWindow_CurrentMenu);
                 pGUIWindow_CurrentMenu->ptr_1C = v3;
-                break;
+                break;*/
             case UIMSG_ChangeGameState:
                 uGameState = GAME_FINISHED;
                 break;
             case UIMSG_ChangeCursor:
                 pMouse->SetCursorBitmap("MICON2");
                 break;
-            case UIMSG_3A:
+            case UIMSG_DebugBlv:
+                __debugbreak();//some debugging tool
                 SetCurrentMenuID(MENU_DebugBLVLevel);
                 break;
-            case UIMSG_LoadGame:
+            /*case UIMSG_LoadGame:
                 if (!pSavegameUsedSlots[uLoadGameUI_SelectedSlot])
                     break;
                 SetCurrentMenuID(MENU_LoadingProcInMainMenu);
@@ -233,22 +235,24 @@
                     pSaveListPosition = 0;
                 pWindow = pGUIWindow_CurrentMenu;
                 new OnButtonClick2(pWindow->uFrameX + 215, pGUIWindow_CurrentMenu->uFrameY + 323, 0, 0, (int)pBtnDownArrow, 0);
-                break;
+                break;*/
             case UIMSG_Cancel:
                 new OnCancel3(pGUIWindow_CurrentMenu->uFrameX + 350, pGUIWindow_CurrentMenu->uFrameY + 302, 61, 28, (int)pBtnCancel, 0);
                 break;
-            case UIMSG_ArrowUp:
+            /*case UIMSG_ArrowUp:
                 --pSaveListPosition;
                 if (pSaveListPosition < 0)
                     pSaveListPosition = 0;
                 pWindow = pGUIWindow_CurrentMenu;
                 new OnButtonClick2(pWindow->uFrameX + 215, pGUIWindow_CurrentMenu->uFrameY + 197, 0, 0, (int)pBtnArrowUp, 0);
-                break;
+                break;*/
             case UIMSG_AD:
+                __debugbreak();//some debugging tool
                 new OnButtonClick2(pMainMenu_BtnNew->uX, pMainMenu_BtnNew->uY, 0, 0, (int)pMainMenu_BtnNew, 0);
                 SetCurrentMenuID(MENU_LoadingProcInMainMenu);
                 break;
-            case UIMSG_AE:
+            case UIMSG_DebugBlv2:
+                __debugbreak();//some debugging tool
                 new OnButtonClick2(pMainMenu_BtnExit->uX, pMainMenu_BtnExit->uY, 0, 0, (int)pMainMenu_BtnExit, 0);
                 SetCurrentMenuID(MENU_DebugBLVLevel);
                 break;
@@ -283,7 +287,7 @@
                     pMessageQueue_50CBD0->AddGUIMessage(UIMSG_ChangeGameState, 0, 0);
                     break;
                 }
-                if (GetCurrentMenuID() == MENU_CREDITSPROC && !current_screen_type)
+                if (GetCurrentMenuID() == MENU_CREDITSPROC && current_screen_type == SCREEN_GAME)
                 {
                     //if ( current_screen_type == SCREEN_VIDEO )
                     //pVideoPlayer->FastForwardToFrame(pVideoPlayer->pResetflag);
@@ -300,7 +304,7 @@
                     pMessageQueue_50CBD0->AddGUIMessage(UIMSG_ChangeGameState, 0, 0);
                     break;
                 }
-                if (current_screen_type == SCREEN_LOADGAME)
+                /*if (current_screen_type == SCREEN_LOADGAME)
                 {
                     pIcons_LOD->RemoveTexturesPackFromTextureList();
                     //crt_deconstruct_ptr_6A0118();
@@ -315,7 +319,7 @@
                     current_screen_type = SCREEN_GAME;
                     viewparams->bRedrawGameUI = v15;
                     break;
-                }
+                }*/
                 if (current_screen_type == SCREEN_VIDEO)
                 {
                     //pVideoPlayer->Unload();
@@ -323,10 +327,17 @@
                 else
                 {
                     if (current_screen_type != SCREEN_1B)
-                    {
-                        pGUIWindow_CurrentMenu->Release();
-                        pGUIWindow2->Release();
-                        pGUIWindow2 = 0;
+                    { // MENU_CREDITSCLOSE  for example
+                        if (pGUIWindow_CurrentMenu)
+                        {
+                            pGUIWindow_CurrentMenu->Release();
+                            pGUIWindow_CurrentMenu = nullptr;
+                        }
+                        if (pGUIWindow2)
+                        {
+                            pGUIWindow2->Release();
+                            pGUIWindow2 = 0;
+                        }
                         pEventTimer->Resume();
                         current_screen_type = SCREEN_GAME;
                         viewparams->bRedrawGameUI = v15;
@@ -368,12 +379,14 @@
     SetCurrentMenuID(MENU_MAIN);
     SetForegroundWindow(window->GetApiHandle());
     SendMessageW(window->GetApiHandle(), WM_ACTIVATEAPP, 1, 0);
-    while (GetCurrentMenuID() == MENU_MAIN || GetCurrentMenuID() == MENU_SAVELOAD)
+
+    //while (GetCurrentMenuID() == MENU_MAIN || GetCurrentMenuID() == MENU_SAVELOAD)
+    while (GetCurrentMenuID() == MENU_MAIN)
     {
         POINT pt;
         pMouse->GetCursorPos(&pt);
         pWindow = pWindow_MainMenu;
-        if (GetCurrentMenuID() == MENU_SAVELOAD)
+        /*if (GetCurrentMenuID() == MENU_SAVELOAD)
         {
             if (current_screen_type != SCREEN_LOADGAME)
             {
@@ -385,7 +398,7 @@
                 pGUIWindow_CurrentMenu = new GUIWindow_Load(false);
             }
             pWindow = pGUIWindow_CurrentMenu;
-        }
+        }*/
 
         while (PeekMessageW(&msg, 0, 0, 0, PM_REMOVE))
         {
@@ -417,11 +430,11 @@
     pRenderer->EndScene();
     pRenderer->Present();
     main_menu_background.Release();
-    if (pGUIWindow2)
+    /*if (pGUIWindow2)
     {
         pGUIWindow2->Release();
         pGUIWindow2 = 0;
-    }
+    }*/
     pWindow_MainMenu->Release();
     pIcons_LOD->RemoveTexturesPackFromTextureList();
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Game/MainMenuLoad.cpp	Wed May 13 20:09:12 2015 +0600
@@ -0,0 +1,151 @@
+#include "Engine/Engine.h"
+#include "Engine/SaveLoad.h"
+#include "Engine/LOD.h"
+#include "Engine/Timer.h"
+#include "Engine/Graphics/IRender.h"
+#include "Engine/Graphics/Viewport.h"
+
+#include "IO/Keyboard.h"
+
+#include "GUI/UI/UISaveLoad.h"
+
+#include "Game/MainMenu.h"
+#include "Game/MainMenuLoad.h"
+
+void MainMenuLoad_EventLoop()
+{
+    while (pMessageQueue_50CBD0->uNumMessages)
+    {
+        UIMessageType msg;
+        int param, param2;
+        pMessageQueue_50CBD0->PopMessage(&msg, &param, &param2);
+
+        switch (msg)
+        {
+            case UIMSG_LoadGame:
+            {
+                if (!pSavegameUsedSlots[uLoadGameUI_SelectedSlot])
+                    break;
+                SetCurrentMenuID(MENU_LoadingProcInMainMenu);
+            }
+            break;
+
+            case UIMSG_SelectLoadSlot:
+            {
+                //main menu save/load wnd   clicking on savegame lines
+                if (pGUIWindow_CurrentMenu->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS)
+                    pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_NONE);
+                if (current_screen_type != SCREEN_SAVEGAME || uLoadGameUI_SelectedSlot != param + pSaveListPosition)
+                {
+                    //load clicked line
+                    int v26 = param + pSaveListPosition;
+                    if (dword_6BE138 == v26)
+                    {
+                        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_SaveLoadBtn, 0, 0);
+                        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_LoadGame, 0, 0);
+                    }
+                    uLoadGameUI_SelectedSlot = v26;
+                    dword_6BE138 = v26;
+                }
+                else
+                {
+                    //typing in the line
+                    pKeyActionMap->EnterText(0, 19, pGUIWindow_CurrentMenu);
+                    strcpy(pKeyActionMap->pPressedKeysBuffer, pSavegameHeader[uLoadGameUI_SelectedSlot].pName);
+                    pKeyActionMap->uNumKeysPressed = strlen(pKeyActionMap->pPressedKeysBuffer);
+                }
+            }
+            break;
+
+            case UIMSG_SaveLoadBtn:
+                new OnSaveLoad(pGUIWindow_CurrentMenu->uFrameX + 241, pGUIWindow_CurrentMenu->uFrameY + 302, 61, 28, (int)pBtnLoadSlot, 0);
+            break;
+
+
+            case UIMSG_DownArrow:
+            {
+                ++pSaveListPosition;
+                if (pSaveListPosition >= param)
+                    pSaveListPosition = param - 1;
+                if (pSaveListPosition < 1)
+                    pSaveListPosition = 0;
+                new OnButtonClick2(pGUIWindow_CurrentMenu->uFrameX + 215, pGUIWindow_CurrentMenu->uFrameY + 323, 0, 0, (int)pBtnDownArrow, 0);
+            }
+            break;
+
+
+            case UIMSG_ArrowUp:
+            {
+                --pSaveListPosition;
+                if (pSaveListPosition < 0)
+                    pSaveListPosition = 0;
+                new OnButtonClick2(pGUIWindow_CurrentMenu->uFrameX + 215, pGUIWindow_CurrentMenu->uFrameY + 197, 0, 0, (int)pBtnArrowUp, 0);
+            }
+            break;
+
+            case UIMSG_Cancel:
+                new OnCancel3(pGUIWindow_CurrentMenu->uFrameX + 350, pGUIWindow_CurrentMenu->uFrameY + 302, 61, 28, (int)pBtnCancel, 0);
+            break;
+
+
+            case UIMSG_Escape:
+            {
+                viewparams->field_48 = 1;
+                //if (current_screen_type == SCREEN_LOADGAME)
+                {
+                    pIcons_LOD->RemoveTexturesPackFromTextureList();
+                    //crt_deconstruct_ptr_6A0118();
+                    main_menu_background.Release();
+                    main_menu_background.Load("title.pcx", 0);
+                    SetCurrentMenuID(MENU_MAIN);
+                    current_screen_type = SCREEN_GAME;
+                    pEventTimer->Resume();
+                    viewparams->bRedrawGameUI = true;
+                    break;
+                }
+            }
+            break;
+        }
+    }
+}
+
+void MainMenuLoad_Loop()
+{
+    current_screen_type = SCREEN_LOADGAME;
+
+    main_menu_background.Release();
+    main_menu_background.Load("lsave640.pcx", 0);
+
+        //LoadUI_Load(0);
+    pGUIWindow_CurrentMenu = new GUIWindow_Load(false);
+
+
+    while (GetCurrentMenuID() == MENU_SAVELOAD && current_screen_type == SCREEN_LOADGAME)
+    {
+        MSG msg;
+        while (PeekMessageW(&msg, 0, 0, 0, PM_REMOVE))
+        {
+            if (msg.message == WM_QUIT)
+                Engine_DeinitializeAndTerminate(0);
+            TranslateMessage(&msg);
+            DispatchMessageW(&msg);
+        }
+        if (dword_6BE364_game_settings_1 & GAME_SETTINGS_APP_INACTIVE)
+        {
+            WaitMessage();
+            continue;
+        }
+
+        pRenderer->BeginScene();
+        pRenderer->DrawTextureNew(0, 0, &main_menu_background);
+
+        MainMenuLoad_EventLoop();
+        GUI_UpdateWindows();
+
+        pRenderer->EndScene();
+        pRenderer->Present();
+    }
+
+    pGUIWindow_CurrentMenu->Release();
+    pGUIWindow_CurrentMenu = nullptr;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Game/MainMenuLoad.h	Wed May 13 20:09:12 2015 +0600
@@ -0,0 +1,5 @@
+#pragma once
+
+
+void MainMenuLoad_Loop();
+void MainMenuLoad_EventLoop();
\ No newline at end of file