diff --git a/profiles/cclcc/hud/systemmenu.lua b/profiles/cclcc/hud/systemmenu.lua index a81298375..8879887b8 100644 --- a/profiles/cclcc/hud/systemmenu.lua +++ b/profiles/cclcc/hud/systemmenu.lua @@ -47,6 +47,19 @@ root.SystemMenu = { SystemMenuFrame = "SystemMenuFrame", SystemMenuMask = "SystemMenuMask", + SmokeX = 0, + SmokeY = 580, + SmokeBoundsX = 20, + SmokeBoundsY = 1550, + SmokeBoundsWidth = 1920, + SmokeBoundsHeight = 500, + SmokeAnimationBoundsXOffset = 20, + SmokeAnimationBoundsXMax = 1919, + SmokeOpacityNormal = 0.15, + SmokeAnimationDurationIn = 32, + SmokeAnimationDurationOut = 32, + SmokeSprite = "SystemMenuSmoke", + BGDispOffsetTopLeft = {X=-1200, Y= -330}, BGDispOffsetBottomLeft = {X=-1200, Y= 2080}, BGDispOffsetTopRight = {X=2520, Y= -330}, @@ -148,5 +161,10 @@ root.Sprites["SystemMenuFrame"] = { root.Sprites["SystemMenuMask"] = { Sheet = "MenuChip", - Bounds = { X = 154, Y = 140, Width = 1900, Height = 1061 }, + Bounds = { X = 154, Y = 141, Width = 1900, Height = 1060 }, +}; + +root.Sprites["SystemMenuSmoke"] = { + Sheet = "MenuChip", + Bounds = { X = 0, Y = 1638, Width = 2000, Height = 410 }, }; \ No newline at end of file diff --git a/profiles/cclcc/hud/titlemenu.lua b/profiles/cclcc/hud/titlemenu.lua index c83bace49..e2475f308 100644 --- a/profiles/cclcc/hud/titlemenu.lua +++ b/profiles/cclcc/hud/titlemenu.lua @@ -181,7 +181,7 @@ root.Sprites["TitleMenuMenu"] = { root.Sprites["TitleMenuOverlay"] = { Sheet = "MenuChip", - Bounds = { X = 154, Y = 140, Width = 1900, Height = 1061 }, + Bounds = { X = 154, Y = 141, Width = 1900, Height = 1060 }, }; root.Sprites["TitleMenuSmoke"] = { diff --git a/src/games/cclcc/systemmenu.cpp b/src/games/cclcc/systemmenu.cpp index 01ccce8ed..3d8bc6e05 100644 --- a/src/games/cclcc/systemmenu.cpp +++ b/src/games/cclcc/systemmenu.cpp @@ -68,6 +68,9 @@ SystemMenu::SystemMenu() { ItemsFade.DurationIn = ItemsFadeInDuration; ItemsFade.DurationOut = ItemsFadeOutDuration; + SmokeAnimation.DurationIn = SmokeAnimationDurationIn; + SmokeAnimation.DurationOut = SmokeAnimationDurationOut; + auto onClick = [this](auto* btn) { return MenuButtonOnClick(btn); }; MainItems = new Widgets::Group(this); @@ -98,6 +101,7 @@ void SystemMenu::Show() { State = Showing; MenuTransition.StartIn(); MenuFade.StartIn(); + SmokeAnimation.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]) || @@ -132,6 +136,7 @@ void SystemMenu::Hide() { MenuFade.StartOut(); MenuTransition.StartOut(); ItemsFade.StartOut(); + SmokeAnimation.StartOut(); if (LastFocusedMenu != 0) { UI::FocusedMenu = LastFocusedMenu; LastFocusedMenu->IsFocused = true; @@ -144,6 +149,7 @@ void SystemMenu::Hide() { void SystemMenu::Update(float dt) { UpdateInput(dt); + SmokeAnimation.Update(dt); if (State == Shown && ((GetFlag(SF_TITLEMODE) || ScrWork[SW_SYSMENUCT] < 32) || @@ -292,12 +298,39 @@ void SystemMenu::Render() { RectF{0, 0, Profile::DesignWidth, Profile::DesignHeight}, glm::vec4{tint, alpha}); + DrawSmoke(ScrWork[SW_SYSMENUCT] / 128.0f); + MainItems->Tint = glm::vec4(tint, glm::smoothstep(0.0f, 1.0f, ItemsFade.Progress)); MainItems->Render(); } } +void SystemMenu::DrawSmoke(float opacity) { + Renderer->SetBlendMode(RendererBlendMode::Additive); + glm::vec4 col = glm::vec4(1.0f); + col.a = opacity; + SmokeSprite.Bounds = RectF( + SmokeBoundsWidth - (SmokeAnimationBoundsXMax * SmokeAnimation.Progress) + + SmokeAnimationBoundsXOffset, + SmokeBoundsY, + SmokeBoundsWidth - + (SmokeAnimationBoundsXMax * (1.0f - SmokeAnimation.Progress)), + SmokeBoundsHeight); + Renderer->DrawSprite(SmokeSprite, glm::vec2(SmokeX, SmokeY), col); + SmokeSprite.Bounds = RectF( + SmokeBoundsX, SmokeBoundsY, + SmokeBoundsWidth - (SmokeAnimationBoundsXMax * SmokeAnimation.Progress), + SmokeBoundsHeight); + Renderer->DrawSprite( + SmokeSprite, + glm::vec2(SmokeBoundsWidth - (SmokeAnimationBoundsXMax * + (1.0f - SmokeAnimation.Progress)), + SmokeY), + col); + Renderer->SetBlendMode(RendererBlendMode::Normal); +} + void SystemMenu::Init() { BGPosition = {CALCrnd((int)BGRandPosRange.x), CALCrnd((int)BGRandPosRange.y)}; SetFlag(SF_SYSTEMMENUCAPTURE, true); diff --git a/src/games/cclcc/systemmenu.h b/src/games/cclcc/systemmenu.h index 2ebf03ce5..59c6c1fb3 100644 --- a/src/games/cclcc/systemmenu.h +++ b/src/games/cclcc/systemmenu.h @@ -26,6 +26,9 @@ class SystemMenu : public Menu { void UpdateInput(float dt) override; void Update(float dt) override; void Render() override; + void DrawSmoke(float opacity); + + Animation SmokeAnimation; void MenuButtonOnClick(Widgets::Button* target); Sprite ScreenCap; diff --git a/src/games/cclcc/titlemenu.cpp b/src/games/cclcc/titlemenu.cpp index e995e8efd..e4402c16f 100644 --- a/src/games/cclcc/titlemenu.cpp +++ b/src/games/cclcc/titlemenu.cpp @@ -653,6 +653,7 @@ void TitleMenu::DrawMainMenuBackGraphics() { } void TitleMenu::DrawSmoke(float opacity) { + Renderer->SetBlendMode(RendererBlendMode::Additive); glm::vec4 col = glm::vec4(1.0f); col.a = opacity; SmokeSprite.Bounds = RectF( @@ -673,6 +674,7 @@ void TitleMenu::DrawSmoke(float opacity) { (1.0f - SmokeAnimation.Progress)), SmokeY), col); + Renderer->SetBlendMode(RendererBlendMode::Normal); } void TitleMenu::ShowContinueItems() { diff --git a/src/profile/games/cclcc/systemmenu.cpp b/src/profile/games/cclcc/systemmenu.cpp index 102e29c98..47ae5c14d 100644 --- a/src/profile/games/cclcc/systemmenu.cpp +++ b/src/profile/games/cclcc/systemmenu.cpp @@ -17,6 +17,20 @@ void Configure() { ItemsFadeInDuration = EnsureGetMember("ItemsFadeInDuration"); ItemsFadeOutDuration = EnsureGetMember("ItemsFadeOutDuration"); + SmokeOpacityNormal = EnsureGetMember("SmokeOpacityNormal"); + SmokeX = EnsureGetMember("SmokeX"); + SmokeY = EnsureGetMember("SmokeY"); + SmokeBoundsX = EnsureGetMember("SmokeBoundsX"); + SmokeBoundsY = EnsureGetMember("SmokeBoundsY"); + SmokeBoundsWidth = EnsureGetMember("SmokeBoundsWidth"); + SmokeBoundsHeight = EnsureGetMember("SmokeBoundsHeight"); + SmokeAnimationBoundsXOffset = + EnsureGetMember("SmokeAnimationBoundsXOffset"); + SmokeAnimationBoundsXMax = EnsureGetMember("SmokeAnimationBoundsXMax"); + SmokeAnimationDurationIn = EnsureGetMember("SmokeAnimationDurationIn"); + SmokeAnimationDurationOut = + EnsureGetMember("SmokeAnimationDurationOut"); + GetMemberArray( std::span(MenuEntriesPositions, Profile::SystemMenu::MenuEntriesNum), "MenuEntriesPositions"); @@ -29,6 +43,7 @@ void Configure() { SystemMenuFrame = EnsureGetMember("SystemMenuFrame"); MenuButtonGuide = EnsureGetMember("MenuButtonGuide"); SystemMenuMask = EnsureGetMember("SystemMenuMask"); + SmokeSprite = EnsureGetMember("SmokeSprite"); BGDispOffsetTopLeft = EnsureGetMember("BGDispOffsetTopLeft"); BGDispOffsetBottomLeft = EnsureGetMember("BGDispOffsetBottomLeft"); @@ -45,6 +60,12 @@ void Configure() { BGTranslationOffset = EnsureGetMember("BGTranslationOffset"); + UI::CCLCC::SystemMenu* menu = new UI::CCLCC::SystemMenu(); + + menu->SmokeAnimation.LoopMode = AnimationLoopMode::Loop; + menu->SmokeAnimation.DurationIn = SmokeAnimationDurationIn; + menu->SmokeAnimation.DurationOut = SmokeAnimationDurationOut; + auto drawType = Game::DrawComponentType::_from_integral_unchecked( EnsureGetMember("DrawType")); diff --git a/src/profile/games/cclcc/systemmenu.h b/src/profile/games/cclcc/systemmenu.h index 5f42a602d..86eca998e 100644 --- a/src/profile/games/cclcc/systemmenu.h +++ b/src/profile/games/cclcc/systemmenu.h @@ -14,6 +14,7 @@ inline Sprite SystemMenuBG; inline Sprite MenuButtonGuide; inline Sprite SystemMenuFrame; inline Sprite SystemMenuMask; +inline Sprite SmokeSprite; inline float MoveInDuration; inline float MoveOutDuration; inline float ItemsFadeInDuration; @@ -21,6 +22,18 @@ inline float ItemsFadeOutDuration; inline glm::vec2 MenuEntriesPositions[MenuEntriesNumMax]; inline RectF MenuEntriesButtonBounds[MenuEntriesNumMax]; +inline float SmokeOpacityNormal; +inline float SmokeX; +inline float SmokeY; +inline float SmokeBoundsX; +inline float SmokeBoundsY; +inline float SmokeBoundsWidth; +inline float SmokeBoundsHeight; +inline float SmokeAnimationBoundsXOffset; +inline float SmokeAnimationBoundsXMax; +inline float SmokeAnimationDurationIn; +inline float SmokeAnimationDurationOut; + inline glm::vec2 BGDispOffsetTopLeft; inline glm::vec2 BGDispOffsetBottomLeft; inline glm::vec2 BGDispOffsetTopRight;