diff --git a/profiles/chlcc/game.lua b/profiles/chlcc/game.lua index 90d9a500a..f86ba1267 100644 --- a/profiles/chlcc/game.lua +++ b/profiles/chlcc/game.lua @@ -24,6 +24,7 @@ root.Vm = { StartScript = 0, StartScriptBuffer = 0, GameInstructionSet = InstructionSet.CHLCC, + RestartMaskUsesThreadAlpha = true, UseReturnIds = false, ScrWorkChaStructSize = 20, diff --git a/profiles/chlcc/hud/titlemenu.lua b/profiles/chlcc/hud/titlemenu.lua index 78303cd1a..305ca2b9e 100644 --- a/profiles/chlcc/hud/titlemenu.lua +++ b/profiles/chlcc/hud/titlemenu.lua @@ -3,7 +3,6 @@ if root.Language == "Japanese" then languageSuffix = "" end root.TitleMenu = { Type = TitleMenuType.CHLCC, - DrawType = DrawComponentType.SystemMenu, PressToStartX = 72, PressToStartY = 595, PressToStartAnimDurationIn = 0.5, diff --git a/profiles/chlcc/scriptvars.lua b/profiles/chlcc/scriptvars.lua index efa6dc4d0..17a7c0cc0 100644 --- a/profiles/chlcc/scriptvars.lua +++ b/profiles/chlcc/scriptvars.lua @@ -7,6 +7,7 @@ sv.SW_TITLEDISPCT = 1014; sv.SW_TITLEMASKALPHA = 1033; sv.SW_TITLEMASKCOLOR = 1034; sv.SW_SYSSEL = 1028; +sv.SW_TITLE_PRI = 1037; sv.SW_SYSTEMMENUCHG = 1040; sv.SW_SYSTEMMENUALPHA = 1041; sv.SW_SYSMENUCT = 1042; diff --git a/profiles/common/scriptvars.lua b/profiles/common/scriptvars.lua index e8177126c..8d59aa763 100644 --- a/profiles/common/scriptvars.lua +++ b/profiles/common/scriptvars.lua @@ -417,6 +417,7 @@ root.ScriptVars = { SF_SOUNDMENU=1357, SF_MOVIEMENU=1358, SF_ACHIEVEMENTMENU=1359, + SF_RESTARTMASK = 1800, SF_RETURNTITLE=1805, SF_MOVIEPLAY=1823, SF_SUBMENUEXIT=1830, diff --git a/src/game.cpp b/src/game.cpp index 68d7e3d8a..8b364fbfc 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -280,6 +280,7 @@ void UpdateSystem(float dt) { } } + UI::GameSpecific::NonGameplayUpdate(UpdateSecondCounter); SaveIconDisplay::Update(UpdateSecondCounter); LoadingDisplay::Update(UpdateSecondCounter); DateDisplay::Update(UpdateSecondCounter); diff --git a/src/games/chlcc/savemenu.cpp b/src/games/chlcc/savemenu.cpp index 99a63a946..8acc85cbe 100644 --- a/src/games/chlcc/savemenu.cpp +++ b/src/games/chlcc/savemenu.cpp @@ -224,13 +224,22 @@ void SaveMenu::Show() { } void SaveMenu::Hide() { if (State != Hidden) { - if (State != Hiding) { - SaveEntryButton::FocusedAlphaFadeReset(); - MenuTransition.StartOut(); - FromSystemMenuTransition->StartOut(); + const bool isLoading = GetFlag(SF_RESTARTMASK); + if (isLoading) { + State = Hidden; + MenuTransition.Finish(AnimationDirection::Out); + FromSystemMenuTransition->Finish(AnimationDirection::Out); + CurrentlyFocusedElement->Hovered = false; + CurrentlyFocusedElement->HasFocus = false; + } else { + if (State != Hiding) { + SaveEntryButton::FocusedAlphaFadeReset(); + MenuTransition.StartOut(); + FromSystemMenuTransition->StartOut(); + } + State = Hiding; } SavePages->at(*CurrentPage)->HasFocus = false; - State = Hiding; if (LastFocusedMenu != 0) { UI::FocusedMenu = LastFocusedMenu; LastFocusedMenu->IsFocused = true; diff --git a/src/games/chlcc/systemmenu.cpp b/src/games/chlcc/systemmenu.cpp index d2f4168cd..036836d6e 100644 --- a/src/games/chlcc/systemmenu.cpp +++ b/src/games/chlcc/systemmenu.cpp @@ -93,9 +93,15 @@ void SystemMenu::Show() { void SystemMenu::Hide() { if (State != Hidden) { - State = Hiding; - MenuTransition.StartOut(); - SubItemsHide(); + const bool isLoading = GetFlag(SF_RESTARTMASK); + if (isLoading) { + State = Hidden; + MenuTransition.Finish(AnimationDirection::Out); + } else { + State = Hiding; + MenuTransition.StartOut(); + } + SubItemsHide(isLoading); if (LastFocusedMenu != 0) { UI::FocusedMenu = LastFocusedMenu; LastFocusedMenu->IsFocused = true; @@ -106,10 +112,15 @@ void SystemMenu::Hide() { } } -void SystemMenu::SubItemsHide() { +void SystemMenu::SubItemsHide(bool instantHide) { if (SubItemsState != Hidden) { - SubItemsState = Hiding; - SubItemsTransition.StartOut(); + if (instantHide) { + SubItemsState = Hidden; + SubItemsTransition.Finish(AnimationDirection::Out); + } else { + SubItemsState = Hiding; + SubItemsTransition.StartOut(true); + } } if (CurrentlyFocusedElement) { auto* btn = static_cast(CurrentlyFocusedElement); @@ -121,7 +132,7 @@ void SystemMenu::SubItemsHide() { void SystemMenu::SubItemShow() { if (SubItemsState != Shown) { SubItemsState = Showing; - SubItemsTransition.StartIn(); + SubItemsTransition.StartIn(true); MainItems->Show(); SelectAnimation.StartIn(true); } @@ -136,30 +147,32 @@ void SystemMenu::SubItemShow() { void SystemMenu::Update(float dt) { UpdateInput(dt); const bool isSysMenuOpen = GetFlag(SF_SYSTEMMENU); - if ((!isSysMenuOpen || ScrWork[SW_SYSMENUCT] < 10000) && State == Shown) { + const int sysMenuCt = ScrWork[SW_SYSMENUCT]; + if ((!isSysMenuOpen || sysMenuCt < 10000) && State == Shown) { Hide(); - } else if (isSysMenuOpen && ScrWork[SW_SYSMENUCT] > 0 && State == Hidden) { + } else if (isSysMenuOpen && sysMenuCt > 0 && State == Hidden) { Show(); } - if (isSysMenuOpen) { + // this branch is only for hiding sub items when menu is open + if (isSysMenuOpen && State == Shown) { if (UI::FocusedMenu != this && SubItemsState == Shown && UI::SysMesBoxPtr->State == UI::MenuState::Hidden) { - SubItemsHide(); + const bool isLoading = GetFlag(SF_RESTARTMASK); + SubItemsHide(isLoading); } else if (UI::FocusedMenu == this && SubItemsState == Hidden) { SubItemShow(); } } - if (MenuTransition.IsOut() && ScrWork[SW_SYSMENUCT] == 0 && State == Hiding) { + if (MenuTransition.IsOut() && sysMenuCt == 0 && State == Hiding) { MainItems->Hide(); State = Hidden; if (CurrentlyFocusedElement) { CurrentlyFocusedElement->HasFocus = false; CurrentlyFocusedElement = nullptr; } - } else if (MenuTransition.IsIn() && ScrWork[SW_SYSMENUCT] == 10000 && - State == Showing) { + } else if (MenuTransition.IsIn() && sysMenuCt == 10000 && State == Showing) { State = Shown; } diff --git a/src/games/chlcc/systemmenu.h b/src/games/chlcc/systemmenu.h index 84926110a..93af9aaa5 100644 --- a/src/games/chlcc/systemmenu.h +++ b/src/games/chlcc/systemmenu.h @@ -18,7 +18,7 @@ class SystemMenu : public Menu, public CommonMenu { void Show() override; void Hide() override; void SubItemShow(); - void SubItemsHide(); + void SubItemsHide(bool instantHide); void Update(float dt) override; void Render() override; @@ -54,7 +54,7 @@ class SystemMenu : public Menu, public CommonMenu { int IndexOfActiveButton = 0; std::optional LastFocusedButtonId; uint32_t CurrentColor; - MenuState SubItemsState; + MenuState SubItemsState = Hidden; }; } // namespace CHLCC diff --git a/src/games/chlcc/titlemenu.cpp b/src/games/chlcc/titlemenu.cpp index 9be00c650..20079139f 100644 --- a/src/games/chlcc/titlemenu.cpp +++ b/src/games/chlcc/titlemenu.cpp @@ -306,7 +306,7 @@ void TitleMenu::Update(float dt) { if (GetFlag(SF_TITLEMODE)) { Show(); - } else if (State == Shown && !IsFocused && + } else if (State == Shown && static_cast(ScrWork[SW_TITLEDISPCT]) != TitleDispCtState::ExtraSubEntriesControl) { // when loading/starting a game from a submenu diff --git a/src/profile/games/chlcc/titlemenu.cpp b/src/profile/games/chlcc/titlemenu.cpp index b7dd7ce03..779ebeb0c 100644 --- a/src/profile/games/chlcc/titlemenu.cpp +++ b/src/profile/games/chlcc/titlemenu.cpp @@ -203,10 +203,6 @@ void Configure() { AnimationLoopMode::ReverseDirection; UI::TitleMenuPtr = menu; - - auto drawType = EnsureGetMember("DrawType"); - - UI::Menus[drawType].push_back(UI::TitleMenuPtr); } } // namespace TitleMenu diff --git a/src/scriptvars.h b/src/scriptvars.h index 9c79793bf..5a1175d79 100644 --- a/src/scriptvars.h +++ b/src/scriptvars.h @@ -453,6 +453,7 @@ V(SF_CLR_AYASE) // CHLCC specific V(SF_CLR_SENA) // CHLCC specific V(SF_CLR_KOZUE) // CHLCC specific V(SF_CLR_SEIRA) // CHLCC specific +V(SW_TITLE_PRI) // CHLCC (or old version) specific V(SF_Pokecon_Open) V(SF_Pokecon_Cancel) V(SF_Pokecon_End) @@ -475,6 +476,7 @@ V(SF_MOVIEMENU) V(SF_RETURNTITLE) V(SF_MOVIEPLAY) V(SF_MOVIECANCEL) +V(SF_RESTARTMASK) V(SF_ACHIEVEMENTMENU) V(SF_SYSTEMMENUCAPTURE) V(SF_EXTRA_ENA) diff --git a/src/ui/gamespecific.cpp b/src/ui/gamespecific.cpp index 0e2387828..389d7f8e0 100644 --- a/src/ui/gamespecific.cpp +++ b/src/ui/gamespecific.cpp @@ -50,6 +50,23 @@ void Init() { } } +// Update that is run before and independently of ScrWork[SW_GAMESTATE] & 5 && +// !GetFlag(SF_GAMEPAUSE) +void NonGameplayUpdate(float dt) { + switch (Profile::GameSpecific::GameSpecificType) { + case GameSpecificType::CHLCC: { + if (UI ::TitleMenuPtr) UI::TitleMenuPtr->Update(dt); + } break; + case GameSpecificType::Dash: + case GameSpecificType::RNE: + case GameSpecificType::CC: + case GameSpecificType::CCLCC: + case GameSpecificType::None: + break; + } + return; +} + void Update(float dt) { switch (Profile::GameSpecific::GameSpecificType) { case GameSpecificType::CHLCC: { @@ -123,11 +140,12 @@ void RenderMain() { } void RenderLayer(uint32_t layer) { + int layerInt = static_cast(layer); switch (Profile::GameSpecific::GameSpecificType) { case GameSpecificType::CHLCC: { CHLCC::EyecatchEffect::GetInstance().RenderLayer(layer); if (ScrWork[SW_MONITOR_SCANLINE_ENABLED] && - static_cast(layer) == ScrWork[SW_MONITOR_SCANLINE_PRI]) { + layerInt == ScrWork[SW_MONITOR_SCANLINE_PRI]) { Renderer->DrawSprite( MonitorScanline, RectF{0.0f, 0.0f, Profile::DesignWidth, Profile::DesignHeight}, @@ -137,25 +155,28 @@ void RenderLayer(uint32_t layer) { glm::vec4{glm::vec3{0.0f}, 88 / 255.0f}); } if (ScrWork[SW_BUTTERFLY_ALPHA] && - static_cast(layer) == ScrWork[SW_BUTTERFLY_PRI]) { + layerInt == ScrWork[SW_BUTTERFLY_PRI]) { CHLCC::ButterflyEffect::GetInstance().Render(); } - if (ScrWork[SW_BUBBLES_ALPHA] && - static_cast(layer) == ScrWork[SW_BUBBLES_PRI]) { + if (ScrWork[SW_BUBBLES_ALPHA] && layerInt == ScrWork[SW_BUBBLES_PRI]) { CHLCC::BubblesEffect::GetInstance().Render(); } + + if (GetFlag(SF_TITLEMODE) && ScrWork[SW_TITLE_PRI] == layerInt) { + if (UI ::TitleMenuPtr) UI::TitleMenuPtr->Render(); + } + } break; case GameSpecificType::CC: { } break; case GameSpecificType::CCLCC: { - if (ScrWork[SW_MAP_PRI] == static_cast(layer) && - ScrWork[SW_MAP_ALPHA]) { + if (ScrWork[SW_MAP_PRI] == layerInt && ScrWork[SW_MAP_ALPHA]) { CCLCC::MapSystem::GetInstance().Render(); } - if (static_cast(ScrWork[SW_DELUSION_PRI]) == layer) + if (ScrWork[SW_DELUSION_PRI] == layerInt) CCLCC::DelusionTrigger::GetInstance().Render(); - if (static_cast(ScrWork[SW_YESNO_PRI]) == layer) { + if (ScrWork[SW_YESNO_PRI] == layerInt) { CCLCC::YesNoTrigger::GetInstance().Render(); } } break; diff --git a/src/ui/gamespecific.h b/src/ui/gamespecific.h index b5cd4287f..64857ccd6 100644 --- a/src/ui/gamespecific.h +++ b/src/ui/gamespecific.h @@ -3,6 +3,7 @@ namespace Impacto { namespace UI { namespace GameSpecific { void Init(); +void NonGameplayUpdate(float dt); void Update(float dt); void RenderEarlyMain(); void RenderMain();