diff --git a/src/games/cc/backlogmenu.cpp b/src/games/cc/backlogmenu.cpp index 928259470..00b5f556a 100644 --- a/src/games/cc/backlogmenu.cpp +++ b/src/games/cc/backlogmenu.cpp @@ -27,10 +27,7 @@ void BacklogMenu::MenuButtonOnClick(Widgets::BacklogEntry* target) { } void BacklogMenu::Show() { - if (State == Hidden) { - CommonMenu::OnShow(FadeInDuration, FadeOutDuration, FadeAnimation); - } - + CommonMenu::OnShow(FadeInDuration, FadeOutDuration, FadeAnimation); UI::BacklogMenu::Show(); } @@ -40,10 +37,12 @@ void BacklogMenu::Hide() { } void BacklogMenu::UpdateVisibility() { - if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown) { + if (LastSubMenuCt > ScrWork[SW_SYSSUBMENUCT] && + ScrWork[SW_SYSSUBMENUCT] < 32 && State != Hidden && State != Hiding) { Hide(); - } else if (ScrWork[SW_SYSSUBMENUCT] > 0 && State == Hidden && - ScrWork[SW_SYSSUBMENUNO] == 1) { + } else if (LastSubMenuCt < ScrWork[SW_SYSSUBMENUCT] && + ScrWork[SW_SYSSUBMENUCT] > 0 && ScrWork[SW_SYSSUBMENUNO] == 1 && + State != Shown && State != Showing) { Show(); } @@ -60,6 +59,7 @@ void BacklogMenu::UpdateVisibility() { entry.Hide(); } } + LastSubMenuCt = ScrWork[SW_SYSSUBMENUCT]; } void BacklogMenu::Update(float dt) { diff --git a/src/games/cc/backlogmenu.h b/src/games/cc/backlogmenu.h index 9b861ab48..51dbd84b9 100644 --- a/src/games/cc/backlogmenu.h +++ b/src/games/cc/backlogmenu.h @@ -21,6 +21,7 @@ class BacklogMenu : public UI::BacklogMenu, private: void UpdateVisibility() override; + int LastSubMenuCt = 0; }; } // namespace CC diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 992a3e48c..482ae2e98 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -246,10 +246,12 @@ void OptionsMenu::Hide() { } void OptionsMenu::UpdateVisibility() { - if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown) { + if (LastSubMenuCt > ScrWork[SW_SYSSUBMENUCT] && + ScrWork[SW_SYSSUBMENUCT] < 32 && State != Hidden && State != Hiding) { Hide(); - } else if (ScrWork[SW_SYSSUBMENUCT] > 0 && State == Hidden && - ScrWork[SW_SYSSUBMENUNO] == 5) { + } else if (LastSubMenuCt < ScrWork[SW_SYSSUBMENUCT] && + ScrWork[SW_SYSSUBMENUCT] > 0 && ScrWork[SW_SYSSUBMENUNO] == 5 && + State != Shown && State != Showing) { Show(); } @@ -261,6 +263,7 @@ void OptionsMenu::UpdateVisibility() { Pages[CurrentPage]->Hide(); if (OpenedAsDirect) PoleAnimation.Finish(AnimationDirection::Out); } + LastSubMenuCt = ScrWork[SW_SYSSUBMENUCT]; } void OptionsMenu::Update(float dt) { diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index 8548da807..dfc394eff 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -60,6 +60,7 @@ class OptionsMenu : public UI::OptionsMenu, public CommonMenu { SpriteAnimation PoleAnimation; std::vector PageButtons; + int LastSubMenuCt = 0; }; } // namespace CCLCC diff --git a/src/games/cclcc/savemenu.cpp b/src/games/cclcc/savemenu.cpp index ff93642ee..fa7d30dfa 100644 --- a/src/games/cclcc/savemenu.cpp +++ b/src/games/cclcc/savemenu.cpp @@ -56,6 +56,7 @@ SaveMenu::SaveMenu() : UI::SaveMenu(), CommonMenu(FadeAnimation) { } void SaveMenu::Show() { + if (State == Shown) return; auto onClick = [this](auto* btn) { return MenuButtonOnClick(btn); }; OpenedAsDirect = GetFlag(SF_SYSTEMMENUDIRECT); @@ -188,7 +189,7 @@ void SaveMenu::Show() { } } void SaveMenu::Hide() { - if (State != Hiding) { + if (State != Hidden) { State = Hiding; FadeAnimation.StartOut(); if (LastFocusedMenu != 0) { @@ -252,14 +253,16 @@ void SaveMenu::UpdateInput(float dt) { } void SaveMenu::Update(float dt) { - if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown) { + if (LastSubMenuCt > ScrWork[SW_SYSSUBMENUCT] && + ScrWork[SW_SYSSUBMENUCT] < 32 && State != Hidden && State != Hiding) { Hide(); - } else if (ScrWork[SW_SYSSUBMENUCT] > 0 && State == Hidden && + } else if (LastSubMenuCt < ScrWork[SW_SYSSUBMENUCT] && + ScrWork[SW_SYSSUBMENUCT] > 0 && State != Shown && + State != Showing && (ScrWork[SW_SYSSUBMENUNO] == 0 || ScrWork[SW_SYSSUBMENUNO] == 3 || ScrWork[SW_SYSSUBMENUNO] == 4)) { Show(); } - if (State != Hidden) { FadeAnimation.Update(dt); PageAnimation.Update(dt); @@ -314,6 +317,7 @@ void SaveMenu::Update(float dt) { IsFocused = true; if (CurrentlyFocusedElement) CurrentlyFocusedElement->HasFocus = true; } + LastSubMenuCt = ScrWork[SW_SYSSUBMENUCT]; } void SaveMenu::Render() { diff --git a/src/games/cclcc/savemenu.h b/src/games/cclcc/savemenu.h index 37a60c5bb..56cdf57e4 100644 --- a/src/games/cclcc/savemenu.h +++ b/src/games/cclcc/savemenu.h @@ -32,6 +32,7 @@ class SaveMenu : public UI::SaveMenu, public CommonMenu { Animation FadeAnimation; Animation PageAnimation; bool HasCleared = true; + int LastSubMenuCt = 0; }; } // namespace CCLCC diff --git a/src/games/cclcc/systemmenu.cpp b/src/games/cclcc/systemmenu.cpp index ec8f82cbc..bf3636977 100644 --- a/src/games/cclcc/systemmenu.cpp +++ b/src/games/cclcc/systemmenu.cpp @@ -44,8 +44,7 @@ void SystemMenu::UpdateInput(float dt) { PADinputButtonWentDown = 0; PADinputMouseWentDown = 0; } - - if (!IsFocused) return; + if (!IsFocused || ScrWork[SW_SYSSUBMENUCT] > 0) return; const auto* const prevSelected = CurrentlyFocusedElement; Menu::UpdateInput(dt); MainItems->UpdateInput(dt); @@ -90,10 +89,10 @@ SystemMenu::SystemMenu() : CommonMenu(FadeAnimation) { void SystemMenu::Show() { if (State != Shown) { OpenedAsDirect = GetFlag(SF_SYSTEMMENUDIRECT); - State = Showing; - CommonMenu::OnShow(FadeInDuration, FadeOutDuration, FadeAnimation); - FadeAnimation.StartIn(); + + if (State != Showing) FadeAnimation.StartIn(); + // If the function was called due to a submenu opening directly, // then don't take over focus if (!((ScrWork[SW_SYSMENUCT] == 32 && ScrWork[SW_SYSSUBMENUCT]) || @@ -104,7 +103,7 @@ void SystemMenu::Show() { } IsFocused = true; UI::FocusedMenu = this; - ItemsFade.StartIn(); + if (State != Showing) ItemsFade.StartIn(); MainItems->Show(); if (LastFocusedButtonId && *LastFocusedButtonId < MenuEntriesNum) { CurrentlyFocusedElement = MainItems->Children[*LastFocusedButtonId]; @@ -113,6 +112,7 @@ void SystemMenu::Show() { AdvanceFocus(FDIR_DOWN); } } + State = Showing; } } @@ -124,9 +124,11 @@ void SystemMenu::Hide() { LastFocusedButtonId = btn->Id; } } + if (State != Hiding) { + FadeAnimation.StartOut(); + ItemsFade.StartOut(); + } State = Hiding; - FadeAnimation.StartOut(); - ItemsFade.StartOut(); if (LastFocusedMenu != 0) { UI::FocusedMenu = LastFocusedMenu; LastFocusedMenu->IsFocused = true; @@ -141,27 +143,25 @@ void SystemMenu::Update(float dt) { CommonMenu::Update(dt); UpdateInput(dt); - if (State == Shown && - ((GetFlag(SF_TITLEMODE) || ScrWork[SW_SYSMENUCT] < 32) || + if (State != Hidden && State != Hiding && + (GetFlag(SF_TITLEMODE) || + (LastSysMenuCt > ScrWork[SW_SYSMENUCT] && ScrWork[SW_SYSMENUCT] < 32) || ScrWork[SW_SYSMENUALPHA] == 0)) { Hide(); - return; - } - if (State == Hidden && !GetFlag(SF_TITLEMODE) && - ((ScrWork[SW_SYSMENUCT] > 0) || ScrWork[SW_SYSMENUALPHA] > 0)) { + } else if (State != Shown && State != Showing && !GetFlag(SF_TITLEMODE) && + ((LastSysMenuCt < ScrWork[SW_SYSMENUCT] && + ScrWork[SW_SYSMENUCT] > 0))) { Show(); - return; } + if (State == Showing && ScrWork[SW_SYSMENUCT] == 32) { State = Shown; - return; - } - if (State == Hiding && FadeAnimation.IsOut() && ItemsFade.IsOut() && - ScrWork[SW_SYSMENUCT] == 0) { + } else if (State == Hiding && FadeAnimation.IsOut() && ItemsFade.IsOut() && + ScrWork[SW_SYSMENUCT] == 0) { State = Hidden; MainItems->Hide(); - return; } + LastSysMenuCt = ScrWork[SW_SYSMENUCT]; if (State != Hidden) { FadeAnimation.Update(dt); diff --git a/src/games/cclcc/systemmenu.h b/src/games/cclcc/systemmenu.h index 3cdbb499e..9f54135da 100644 --- a/src/games/cclcc/systemmenu.h +++ b/src/games/cclcc/systemmenu.h @@ -32,6 +32,7 @@ class SystemMenu : public Menu, public CommonMenu { Animation ItemsFade; bool ItemsFadeComplete = false; std::optional LastFocusedButtonId; + int LastSysMenuCt = 0; enum class MenuItems : size_t { Backlog, diff --git a/src/games/cclcc/tipsmenu.cpp b/src/games/cclcc/tipsmenu.cpp index b2997127f..cf2066405 100644 --- a/src/games/cclcc/tipsmenu.cpp +++ b/src/games/cclcc/tipsmenu.cpp @@ -167,10 +167,12 @@ void TipsMenu::UpdateInput(float dt) { void TipsMenu::Update(float dt) { if (!HasInitialized) return; - if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown) { + if (LastSubMenuCt > ScrWork[SW_SYSSUBMENUCT] && + ScrWork[SW_SYSSUBMENUCT] < 32 && State != Hidden && State != Hiding) { Hide(); - } else if (ScrWork[SW_SYSSUBMENUCT] > 0 && State == Hidden && - (ScrWork[SW_SYSSUBMENUNO] == 2)) { + } else if (LastSubMenuCt < ScrWork[SW_SYSSUBMENUCT] && + ScrWork[SW_SYSSUBMENUCT] > 0 && State != Shown && + State != Showing && (ScrWork[SW_SYSSUBMENUNO] == 2)) { Show(); } @@ -239,6 +241,7 @@ void TipsMenu::Update(float dt) { float move = -LastYPos; Move({0, move}); } + LastSubMenuCt = ScrWork[SW_SYSSUBMENUCT]; } void TipsMenu::Render() { diff --git a/src/games/cclcc/tipsmenu.h b/src/games/cclcc/tipsmenu.h index 18a871d16..234ed8473 100644 --- a/src/games/cclcc/tipsmenu.h +++ b/src/games/cclcc/tipsmenu.h @@ -69,6 +69,7 @@ class TipsMenu : public UI::TipsMenu, public CommonMenu { float LastYPos = 0.0f; Animation TransitionAnimation; + int LastSubMenuCt = 0; }; } // namespace CCLCC diff --git a/src/ui/backlogmenu.cpp b/src/ui/backlogmenu.cpp index c92722a87..a86c27e35 100644 --- a/src/ui/backlogmenu.cpp +++ b/src/ui/backlogmenu.cpp @@ -68,9 +68,9 @@ BacklogMenu::BacklogMenu() template void BacklogMenu::Show() { - if (State == Hidden) { + if (State != Shown) { + if (State != Showing) FadeAnimation.StartIn(); State = Showing; - FadeAnimation.StartIn(); for (auto& entry : Entries) { entry.Show(); @@ -104,9 +104,9 @@ void BacklogMenu::Show() { template void BacklogMenu::Hide() { - if (State == Shown) { + if (State != Hidden) { + if (State != Hiding) FadeAnimation.StartOut(); State = Hiding; - FadeAnimation.StartOut(); if (LastFocusedMenu != nullptr) { UI::FocusedMenu = LastFocusedMenu; diff --git a/src/vm/inst_dialogue.cpp b/src/vm/inst_dialogue.cpp index 84a0f0ebd..2a70ef823 100644 --- a/src/vm/inst_dialogue.cpp +++ b/src/vm/inst_dialogue.cpp @@ -799,6 +799,8 @@ VmInstruction(InstMesRev) { PopUint8(type); switch (type) { case 0: // DispInit + if (Profile::Vm::GameInstructionSet == InstructionSet::MO6TW) + UI::BacklogMenuPtr->Show(); ImpLogSlow(LogLevel::Warning, LogChannel::VMStub, "STUB instruction SetMesModeFormat(type: DispInit)\n"); break; @@ -807,6 +809,8 @@ VmInstruction(InstMesRev) { "STUB instruction SetMesModeFormat(type: Main)\n"); break; case 2: // AllCls + if (Profile::Vm::GameInstructionSet == InstructionSet::MO6TW) + UI::BacklogMenuPtr->Hide(); ImpLogSlow(LogLevel::Warning, LogChannel::VMStub, "STUB instruction SetMesModeFormat(type: AllCls)\n"); break;