Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions profiles/chlcc/game.lua
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ root.Vm = {
StartScript = 0,
StartScriptBuffer = 0,
GameInstructionSet = InstructionSet.CHLCC,
RestartMaskUsesThreadAlpha = true,
UseReturnIds = false,

ScrWorkChaStructSize = 20,
Expand Down
1 change: 0 additions & 1 deletion profiles/chlcc/hud/titlemenu.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions profiles/chlcc/scriptvars.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions profiles/common/scriptvars.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ void UpdateSystem(float dt) {
}
}

UI::GameSpecific::NonGameplayUpdate(UpdateSecondCounter);
SaveIconDisplay::Update(UpdateSecondCounter);
LoadingDisplay::Update(UpdateSecondCounter);
DateDisplay::Update(UpdateSecondCounter);
Expand Down
19 changes: 14 additions & 5 deletions src/games/chlcc/savemenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
41 changes: 27 additions & 14 deletions src/games/chlcc/systemmenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Widgets::Button*>(CurrentlyFocusedElement);
Expand All @@ -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);
}
Expand All @@ -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;
}

Expand Down
4 changes: 2 additions & 2 deletions src/games/chlcc/systemmenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -54,7 +54,7 @@ class SystemMenu : public Menu, public CommonMenu {
int IndexOfActiveButton = 0;
std::optional<int> LastFocusedButtonId;
uint32_t CurrentColor;
MenuState SubItemsState;
MenuState SubItemsState = Hidden;
};

} // namespace CHLCC
Expand Down
2 changes: 1 addition & 1 deletion src/games/chlcc/titlemenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ void TitleMenu::Update(float dt) {

if (GetFlag(SF_TITLEMODE)) {
Show();
} else if (State == Shown && !IsFocused &&
} else if (State == Shown &&
Copy link
Copy Markdown
Contributor Author

@Gunoshozo Gunoshozo Apr 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

!isFocused delayed the hidding of the TitleMenu until you open up SystemMenu, which in turn triggered weird state for SystemMenu and called SubItemsHide

static_cast<TitleDispCtState>(ScrWork[SW_TITLEDISPCT]) !=
TitleDispCtState::ExtraSubEntriesControl) {
// when loading/starting a game from a submenu
Expand Down
4 changes: 0 additions & 4 deletions src/profile/games/chlcc/titlemenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,10 +203,6 @@ void Configure() {
AnimationLoopMode::ReverseDirection;

UI::TitleMenuPtr = menu;

auto drawType = EnsureGetMember<Game::DrawComponentType>("DrawType");

UI::Menus[drawType].push_back(UI::TitleMenuPtr);
}

} // namespace TitleMenu
Expand Down
2 changes: 2 additions & 0 deletions src/scriptvars.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
37 changes: 29 additions & 8 deletions src/ui/gamespecific.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down Expand Up @@ -123,11 +140,12 @@ void RenderMain() {
}

void RenderLayer(uint32_t layer) {
int layerInt = static_cast<int>(layer);
switch (Profile::GameSpecific::GameSpecificType) {
case GameSpecificType::CHLCC: {
CHLCC::EyecatchEffect::GetInstance().RenderLayer(layer);
if (ScrWork[SW_MONITOR_SCANLINE_ENABLED] &&
static_cast<int>(layer) == ScrWork[SW_MONITOR_SCANLINE_PRI]) {
layerInt == ScrWork[SW_MONITOR_SCANLINE_PRI]) {
Renderer->DrawSprite(
MonitorScanline,
RectF{0.0f, 0.0f, Profile::DesignWidth, Profile::DesignHeight},
Expand All @@ -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<int>(layer) == ScrWork[SW_BUTTERFLY_PRI]) {
layerInt == ScrWork[SW_BUTTERFLY_PRI]) {
CHLCC::ButterflyEffect::GetInstance().Render();
}
if (ScrWork[SW_BUBBLES_ALPHA] &&
static_cast<int>(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<int>(layer) &&
ScrWork[SW_MAP_ALPHA]) {
if (ScrWork[SW_MAP_PRI] == layerInt && ScrWork[SW_MAP_ALPHA]) {
CCLCC::MapSystem::GetInstance().Render();
}

if (static_cast<uint32_t>(ScrWork[SW_DELUSION_PRI]) == layer)
if (ScrWork[SW_DELUSION_PRI] == layerInt)
CCLCC::DelusionTrigger::GetInstance().Render();
if (static_cast<uint32_t>(ScrWork[SW_YESNO_PRI]) == layer) {
if (ScrWork[SW_YESNO_PRI] == layerInt) {
CCLCC::YesNoTrigger::GetInstance().Render();
}
} break;
Expand Down
1 change: 1 addition & 0 deletions src/ui/gamespecific.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ namespace Impacto {
namespace UI {
namespace GameSpecific {
void Init();
void NonGameplayUpdate(float dt);
void Update(float dt);
void RenderEarlyMain();
void RenderMain();
Expand Down
Loading