diff --git a/engines/m4/burger/burger.cpp b/engines/m4/burger/burger.cpp index bcf16e29491..26c5fb82292 100644 --- a/engines/m4/burger/burger.cpp +++ b/engines/m4/burger/burger.cpp @@ -807,15 +807,21 @@ void BurgerEngine::showSaveScreen() { } } -void BurgerEngine::showLoadScreen(bool fromMainMenu) { +void BurgerEngine::showLoadScreen(LoadDialogSource source) { if (_useOriginalSaveLoad) { - if (fromMainMenu) + switch (source) { + case kLoadFromMainMenu: GUI::CreateLoadMenuFromMain(_G(master_palette)); - else + break; + case kLoadFromGameDialog: + GUI::CreateLoadMenu(_G(master_palette)); + break; + case kLoadFromHotkey: GUI::CreateF3LoadMenu(_G(master_palette)); - + break; + } } else { - M4Engine::showLoadScreen(fromMainMenu); + M4Engine::showLoadScreen(source); } } diff --git a/engines/m4/burger/burger.h b/engines/m4/burger/burger.h index 3bc2ac7d668..4dfe945848c 100644 --- a/engines/m4/burger/burger.h +++ b/engines/m4/burger/burger.h @@ -84,7 +84,7 @@ public: void syncFlags(Common::Serializer &s) override; void showSaveScreen() override; - void showLoadScreen(bool fromMainMenu = false) override; + void showLoadScreen(LoadDialogSource source) override; bool canLoadGameStateCurrently(Common::U32String *msg = nullptr) override; void global_daemon() override; diff --git a/engines/m4/burger/gui/game_menu.cpp b/engines/m4/burger/gui/game_menu.cpp index 05a0f99b242..e72a95dd7e3 100644 --- a/engines/m4/burger/gui/game_menu.cpp +++ b/engines/m4/burger/gui/game_menu.cpp @@ -49,6 +49,8 @@ namespace GUI { #define LockMouseSprite mouse_lock_sprite #define UnlockMouseSprite mouse_unlock_sprite +static bool buttonClosesDialog; + void UpdateThumbNails(int32 firstSlot, guiMenu *myMenu); void CreateSaveMenu(RGB8 *myPalette); void CreateLoadMenu(RGB8 *myPalette); @@ -770,8 +772,13 @@ bool button_Handler(void *theItem, int32 eventType, int32 event, int32 x, int32 // digi_play(inv_click_snd, 2, 255, -1, inv_click_snd_room_lock); currMenu = (guiMenu *)myItem->myMenu; currTag = myItem->tag; + buttonClosesDialog = false; + (myItem->callback)((void *)myItem, (void *)myItem->myMenu); - myScreen = vmng_screen_find((void *)myItem->myMenu, &status); + + status = 0; + myScreen = buttonClosesDialog ? nullptr : vmng_screen_find((void *)myItem->myMenu, &status); + if ((!myScreen) || (status != SCRN_ACTIVE)) { *currItem = nullptr; } else { @@ -2632,6 +2639,7 @@ void cb_Game_Save(void *, void *) { // Destroy the game menu DestroyGameMenu(); menu_Shutdown(true); + buttonClosesDialog = true; // Create the save game menu g_engine->showSaveScreen(); @@ -2641,9 +2649,10 @@ void cb_Game_Load(void *, void *) { // Destroy the game menu DestroyGameMenu(); menu_Shutdown(true); + buttonClosesDialog = true; // Create the save game menu - g_engine->showLoadScreen(); + g_engine->showLoadScreen(M4Engine::kLoadFromGameDialog); } void cb_Game_Main(void *, void *) { @@ -2672,6 +2681,7 @@ void cb_Game_Main(void *, void *) { void cb_Game_Options(void *, void *) { // Destroy the game menu DestroyGameMenu(); + buttonClosesDialog = true; // Create the options menu CreateOptionsMenu(nullptr); @@ -2749,6 +2759,7 @@ void cb_Options_Game_Cancel(void *, void *) { // Destroy the options menu DestroyOptionsMenu(); + buttonClosesDialog = true; // Create the options menu CreateGameMenuMain(nullptr); @@ -2757,6 +2768,7 @@ void cb_Options_Game_Cancel(void *, void *) { void cb_Options_Game_Done(void *, void *) { // Destroy the options menu DestroyOptionsMenu(); + buttonClosesDialog = true; // Create the options menu CreateGameMenuMain(nullptr); @@ -3258,6 +3270,8 @@ void cb_SaveLoad_Cancel(void *, void *theMenu) { CreateGameMenuMain(nullptr); } } + + buttonClosesDialog = true; } diff --git a/engines/m4/burger/gui/game_menu.h b/engines/m4/burger/gui/game_menu.h index e8cec67114f..8e1ef57c8db 100644 --- a/engines/m4/burger/gui/game_menu.h +++ b/engines/m4/burger/gui/game_menu.h @@ -150,10 +150,11 @@ menuItem *menu_TextFieldAdd(guiMenu *myMenu, int32 tag, int32 x, int32 y, int32 const char *prompt = nullptr, int32 specialtag = 0, CALLBACK callback = nullptr, bool transparent = false); //GAME MENU FUNCTIONS -void CreateGameMenu(RGB8 *myPalette); -void CreateOptionsMenu(RGB8 *myPalette); -void CreateF2SaveMenu(RGB8 *myPalette); -void CreateF3LoadMenu(RGB8 *myPalette); +extern void CreateGameMenu(RGB8 *myPalette); +extern void CreateOptionsMenu(RGB8 *myPalette); +extern void CreateF2SaveMenu(RGB8 *myPalette); +extern void CreateLoadMenu(RGB8 *myPalette); +extern void CreateF3LoadMenu(RGB8 *myPalette); //routines used by the main menu void CreateLoadMenuFromMain(RGB8 *myPalette); diff --git a/engines/m4/burger/rooms/section9/room903.cpp b/engines/m4/burger/rooms/section9/room903.cpp index 97a3b1754a3..b5207d71ca6 100644 --- a/engines/m4/burger/rooms/section9/room903.cpp +++ b/engines/m4/burger/rooms/section9/room903.cpp @@ -127,7 +127,7 @@ void Room903::daemon() { break; case 7: - g_engine->showLoadScreen(true); + g_engine->showLoadScreen(M4Engine::kLoadFromMainMenu); break; case 8: diff --git a/engines/m4/gui/hotkeys.cpp b/engines/m4/gui/hotkeys.cpp index 18a8bbfdf16..50e3a7cf382 100644 --- a/engines/m4/gui/hotkeys.cpp +++ b/engines/m4/gui/hotkeys.cpp @@ -151,7 +151,7 @@ void Hotkeys::saveGame(void *, void *) { } void Hotkeys::loadGame(void *, void *) { - g_engine->showLoadScreen(); + g_engine->showLoadScreen(M4Engine::kLoadFromHotkey); } void Hotkeys::adv_hyperwalk_to_final_destination(void *a, void *b) { diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index e8d80b6c47e..cc8414b384e 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -149,7 +149,7 @@ void M4Engine::showSaveScreen() { saveGameDialog(); } -void M4Engine::showLoadScreen(bool fromMainMenu) { +void M4Engine::showLoadScreen(LoadDialogSource source) { loadGameDialog(); } diff --git a/engines/m4/m4.h b/engines/m4/m4.h index 216fbe31449..43e7baf9c7b 100644 --- a/engines/m4/m4.h +++ b/engines/m4/m4.h @@ -167,10 +167,11 @@ public: */ virtual void showSaveScreen(); + enum LoadDialogSource { kLoadFromMainMenu, kLoadFromGameDialog, kLoadFromHotkey }; /** * Show restore game dialog */ - virtual void showLoadScreen(bool fromMainMenu = false); + virtual void showLoadScreen(LoadDialogSource fromMainMenu); /** * Show the engine information