# HG changeset patch
# User a.parshin
# Date 1431473600 -7200
# Node ID ac16f4a3a91e04bb0de11f2e64bf525ccfc6748f
# Parent 4008b2f34be0b222ce29b60f23cf44739652efd4
Load from MainMenu logic separated from MainMenu window
diff -r 4008b2f34be0 -r ac16f4a3a91e Build/Visual Studio 2013/World of Might and Magic.vcxproj
--- a/Build/Visual Studio 2013/World of Might and Magic.vcxproj Tue May 12 12:03:30 2015 +0200
+++ b/Build/Visual Studio 2013/World of Might and Magic.vcxproj Wed May 13 01:33:20 2015 +0200
@@ -154,6 +154,7 @@
+
@@ -333,6 +334,7 @@
+
diff -r 4008b2f34be0 -r ac16f4a3a91e Build/Visual Studio 2013/World of Might and Magic.vcxproj.filters
--- a/Build/Visual Studio 2013/World of Might and Magic.vcxproj.filters Tue May 12 12:03:30 2015 +0200
+++ b/Build/Visual Studio 2013/World of Might and Magic.vcxproj.filters Wed May 13 01:33:20 2015 +0200
@@ -601,6 +601,9 @@
GUI\UI
+
+ Game
+
@@ -1369,6 +1372,9 @@
GUI\UI
+
+ Game
+
diff -r 4008b2f34be0 -r ac16f4a3a91e Engine/Engine.cpp
--- a/Engine/Engine.cpp Tue May 12 12:03:30 2015 +0200
+++ b/Engine/Engine.cpp Wed May 13 01:33:20 2015 +0200
@@ -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)
diff -r 4008b2f34be0 -r ac16f4a3a91e Engine/SaveLoad.cpp
--- a/Engine/SaveLoad.cpp Tue May 12 12:03:30 2015 +0200
+++ b/Engine/SaveLoad.cpp Wed May 13 01:33:20 2015 +0200
@@ -179,7 +179,11 @@
}
}
- pGUIWindow_CurrentMenu->Release();
+ if (pGUIWindow_CurrentMenu)
+ {
+ pGUIWindow_CurrentMenu->Release();
+ pGUIWindow_CurrentMenu = nullptr;
+ }
current_screen_type = SCREEN_GAME;
viewparams->bRedrawGameUI = true;
diff -r 4008b2f34be0 -r ac16f4a3a91e GUI/GUIWindow.cpp
--- a/GUI/GUIWindow.cpp Tue May 12 12:03:30 2015 +0200
+++ b/GUI/GUIWindow.cpp Wed May 13 01:33:20 2015 +0200
@@ -64,7 +64,7 @@
enum WindowType current_character_screen_window;
struct GUIWindow *pWindow_MMT_MainMenu;
struct GUIWindow *pWindow_MainMenu;
-std::array pWindowList;
+std::array pWindowList;
struct GUIMessageQueue *pMessageQueue_50CBD0 = new GUIMessageQueue;
struct GUIMessageQueue *pMessageQueue_50C9E8 = new GUIMessageQueue;
diff -r 4008b2f34be0 -r ac16f4a3a91e GUI/GUIWindow.h
--- a/GUI/GUIWindow.h Tue May 12 12:03:30 2015 +0200
+++ b/GUI/GUIWindow.h Wed May 13 01:33:20 2015 +0200
@@ -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 pWindowList;
+extern std::array pWindowList;
diff -r 4008b2f34be0 -r ac16f4a3a91e GUI/UI/UIMainMenu.cpp
--- a/GUI/UI/UIMainMenu.cpp Tue May 12 12:03:30 2015 +0200
+++ b/GUI/UI/UIMainMenu.cpp Wed May 13 01:33:20 2015 +0200
@@ -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)
diff -r 4008b2f34be0 -r ac16f4a3a91e Game/MainMenu.cpp
--- a/Game/MainMenu.cpp Tue May 12 12:03:30 2015 +0200
+++ b/Game/MainMenu.cpp Wed May 13 01:33:20 2015 +0200
@@ -17,6 +17,7 @@
#include "Media/Audio/AudioPlayer.h"
#include "Game/MainMenu.h"
+#include "Game/MainMenuLoad.h"
RGBTexture main_menu_background;
@@ -61,7 +62,8 @@
break;
case UIMSG_MainMenu_ShowLoadWindow:
new OnButtonClick2(495, 227, 0, 0, (int)pMainMenu_BtnLoad, 0);
- SetCurrentMenuID(MENU_SAVELOAD);
+ //SetCurrentMenuID(MENU_SAVELOAD);
+ MainMenuLoad_Loop();
break;
case UIMSG_ShowCredits:
new OnButtonClick2(495, 282, 0, 0, (int)pMainMenu_BtnCredits, 0);
@@ -190,10 +192,11 @@
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 +236,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 +288,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 +305,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 +320,7 @@
current_screen_type = SCREEN_GAME;
viewparams->bRedrawGameUI = v15;
break;
- }
+ }*/
if (current_screen_type == SCREEN_VIDEO)
{
//pVideoPlayer->Unload();
@@ -323,10 +328,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 +380,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 +399,7 @@
pGUIWindow_CurrentMenu = new GUIWindow_Load(false);
}
pWindow = pGUIWindow_CurrentMenu;
- }
+ }*/
while (PeekMessageW(&msg, 0, 0, 0, PM_REMOVE))
{
@@ -417,11 +431,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
diff -r 4008b2f34be0 -r ac16f4a3a91e Game/MainMenuLoad.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Game/MainMenuLoad.cpp Wed May 13 01:33:20 2015 +0200
@@ -0,0 +1,152 @@
+#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, ¶m, ¶m2);
+
+ 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()
+{
+ SetCurrentMenuID(MENU_SAVELOAD);
+ 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
diff -r 4008b2f34be0 -r ac16f4a3a91e Game/MainMenuLoad.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Game/MainMenuLoad.h Wed May 13 01:33:20 2015 +0200
@@ -0,0 +1,5 @@
+#pragma once
+
+
+void MainMenuLoad_Loop();
+void MainMenuLoad_EventLoop();
\ No newline at end of file