From 7287039b912bcfafff6fdb10c2a98674f16769cc Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 17 Oct 2024 00:21:36 +0200 Subject: [PATCH 01/59] Added all sprites to cclcc optionsmenu profile --- profiles/cclcc/hud/optionsmenu.lua | 207 ++++++++++++++++++++++++++++- 1 file changed, 200 insertions(+), 7 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 6e7d87a39..4c8a82696 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -1,15 +1,208 @@ root.OptionsMenu = { Type = OptionsMenuType.CCLCC, DrawType = DrawComponentType.SystemMenu, - BackgroundSprite = "OptionsBackground", + FadeInDuration = 0.2, FadeOutDuration = 0.2, - SliderTrackSprite = "OptionsBackground", - SliderFillSprite = "OptionsBackground", - SliderThumbSprite = "OptionsBackground" + + BackgroundSprite = "OptionsBackground", + + PointerSprite = "OptionsPointer", + + HeaderSprite = "OptionsHeader", + PageHeaderSprites = {}, + + PagePanelSprite = "OptionsPagePanel", + PagePanelSprites = {}, + PoleAnimation = "OptionsPoleAnimation", + + SliderTrackSprite = "OptionsSliderTrack", + VoiceSliderTrackSprite = "OptionsVoiceSliderTrack", + BinaryBoxSprite = "OptionsBinaryBox", + + SkipReadSprite = "OptionsSkipRead", + SkipAllSprite = "OptionsSkipAll", + OnSprite = "OptionsOn", + OffSprite = "OptionsOff", + YesSprite = "OptionsYes", + NoSprite = "OptionsNo", + + GuideSprite = "OptionsGuide", + VoiceGuideSprite = "OptionsVoiceGuide", + + LabelSprites = {}, + NametagSprites = {}, + PortraitSprites = {} }; root.Sprites["OptionsBackground"] = { - Sheet = "Title", - Bounds = { X = 0, Y = 0, Width = 1920, Height = 1080 } -}; \ No newline at end of file + Sheet = "Config", + Bounds = { X = 0, Y = 0, Width = 1571, Height = 1089 } +}; + +root.Sprites["OptionsSliderTrack"] = { + Sheet = "Config", + Bounds = { X = 684, Y = 1291, Width = 446, Height = 50 } +}; + +root.Sprites["OptionsVoiceSliderTrack"] = { + Sheet = "Config", + Bounds = { X = 951, Y = 1239, Width = 250, Height = 35 } +}; + +root.Sprites["OptionsBinaryBox"] = { + Sheet = "Config", + Bounds = { X = 684, Y = 1343, Width = 298, Height = 50 } +}; + +root.Sprites["OptionsPointer"] = { + Sheet = "Config", + Bounds = { X = 697, Y = 1241, Width = 71, Height = 43 } +}; + +root.Sprites["OptionsHeader"] = { + Sheet = "Config", + Bounds = { X = 5, Y = 1243, Width = 663, Height = 267 } +}; + +root.Sprites["OptionsPagePanel"] = { + Sheet = "Config", + Bounds = { X = 1571, Y = 0, Width = 477, Height = 1080 } +}; + +root.Sprites["OptionsSkipRead"] = { + Sheet = "Config", + Bounds = { X = 952, Y = 1394, Width = 148, Height = 50 } +}; + +root.Sprites["OptionsSkipAll"] = { + Sheet = "Config", + Bounds = { X = 952, Y = 1448, Width = 148, Height = 50 } +}; + +root.Sprites["OptionsOn"] = { + Sheet = "Config", + Bounds = { X = 952, Y = 1499, Width = 148, Height = 50 } +}; + +root.Sprites["OptionsOff"] = { + Sheet = "Config", + Bounds = { X = 952, Y = 1551, Width = 148, Height = 50 } +}; + +root.Sprites["OptionsYes"] = { + Sheet = "Config", + Bounds = { X = 952, Y = 1603, Width = 148, Height = 50 } +}; + +root.Sprites["OptionsNo"] = { + Sheet = "Config", + Bounds = { X = 952, Y = 1655, Width = 148, Height = 50 } +}; + +root.Sprites["OptionsGuide"] = { + Sheet = "Config", + Bounds = { X = 0, Y = 2416, Width = 1926, Height = 57 } +}; + +root.Sprites["OptionsVoiceGuide"] = { + Sheet = "Config", + Bounds = { X = 0, Y = 2476, Width = 1926, Height = 57 } +}; + +for i = 1, 4 do + height = 80; + + root.Sprites["OptionsPageHeader" .. i] = { + Sheet = "Config", + Bounds = { + X = 0, + Y = 1510 + height * i, + Width = 942, + Height = height + } + }; + + root.OptionsMenu.PageHeaderSprites[#root.OptionsMenu.PageHeaderSprites + 1] = "OptionsPageHeader" .. i; +end + +for i = 1, 16 do + offset = ((i > 12) and {104} or {0})[1]; + height = 52; + + root.Sprites["OptionsLabel" .. i] = { + Sheet = "Config", + Bounds = { + X = 1239, + Y = 1237 + height * i + offset, + Width = 809, + Height = height + } + }; + root.OptionsMenu.LabelSprites[#root.OptionsMenu.LabelSprites + 1] = "OptionsLabel" .. i; +end + +for i = 1, 13 do + width = 218; + height = 53; + + root.Sprites["OptionsNametag" .. i] = { + Sheet = "Config", + Bounds = { + X = width * ((i - 1) % 6), + Y = height * ((i - 1) // 6), + Width = width, + Height = height + } + }; + root.OptionsMenu.NametagSprites[#root.OptionsMenu.NametagSprites + 1] = "OptionsNametag" .. i; +end + +for i = 1, 8 do + -- Interweave highlighted and non-highlighted variants + width = 224; + offset = ((i % 2 == 0) and {width * 4} or {0})[1]; + + root.Sprites["OptionsPagePanel" .. i] = { + Sheet = "Config", + Bounds = { + X = offset + width * ((i - 1) // 2), + Y = 2205, + Width = width, + Height = 195 + } + }; + root.OptionsMenu.PagePanelSprites[#root.OptionsMenu.PagePanelSprites + 1] = "OptionsPagePanel" .. i; +end + +for i = 1, 26 do + -- Interweave on and muted variants + width = 100; + + root.Sprites["OptionsPortrait" .. i] = { + Sheet = "ConfigEx", + Bounds = { + X = 768 + (width + 1) * (i - 1), + Y = ((i % 2 == 1) and {2256} or {2357})[1], + Width = width, + Height = width + } + }; + root.OptionsMenu.PortraitSprites[#root.OptionsMenu.PortraitSprites + 1] = "OptionsPortrait" .. i; +end + +MakeAnimation({ + Name = "OptionsPoleAnimation", + Sheet = "ConfigEx", + FirstFrameX = 0, + FirstFrameY = 0, + FrameWidth = 539, + ColWidth = 539, + FrameHeight = 1080, + RowHeight = 1096, + Frames = 15, + Duration = 1, + Rows = 3, + Columns = 7, + PrimaryDirection = AnimationDirections.Right +}); \ No newline at end of file From b2f882e8a67f5c71d859a7499627f54c12e526eb Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 17 Oct 2024 20:19:41 +0200 Subject: [PATCH 02/59] Moved config slider profile settings to derived classes --- src/profile/games/mo6tw/optionsmenu.cpp | 4 ++++ src/profile/games/mo6tw/optionsmenu.h | 4 ++++ src/profile/games/mo8/optionsmenu.cpp | 4 ++++ src/profile/games/mo8/optionsmenu.h | 4 ++++ src/profile/ui/optionsmenu.cpp | 3 --- src/profile/ui/optionsmenu.h | 3 --- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/profile/games/mo6tw/optionsmenu.cpp b/src/profile/games/mo6tw/optionsmenu.cpp index b0a5e6169..0ce964351 100644 --- a/src/profile/games/mo6tw/optionsmenu.cpp +++ b/src/profile/games/mo6tw/optionsmenu.cpp @@ -27,6 +27,10 @@ void Configure() { GetMemberSpriteArray(SectionHeaderSprites, SectionHeaderSpriteCount, "SectionHeaderSprites"); + SliderTrackSprite = EnsureGetMemberSprite("SliderTrackSprite"); + SliderFillSprite = EnsureGetMemberSprite("SliderFillSprite"); + SliderThumbSprite = EnsureGetMemberSprite("SliderThumbSprite"); + CheckboxBoxSprite = EnsureGetMemberSprite("CheckboxBoxSprite"); CheckboxTickSprite = EnsureGetMemberSprite("CheckboxTickSprite"); GetMemberSpriteArray(CheckboxLabelSprites, CheckboxLabelCount, diff --git a/src/profile/games/mo6tw/optionsmenu.h b/src/profile/games/mo6tw/optionsmenu.h index ce6c8a52d..7e9b7abc7 100644 --- a/src/profile/games/mo6tw/optionsmenu.h +++ b/src/profile/games/mo6tw/optionsmenu.h @@ -22,6 +22,10 @@ inline int VoiceTogglePerLine; inline Sprite SectionHeaderSprites[SectionHeaderSpriteCount]; +inline Sprite SliderTrackSprite; +inline Sprite SliderFillSprite; +inline Sprite SliderThumbSprite; + inline Sprite CheckboxBoxSprite; inline Sprite CheckboxTickSprite; inline Sprite CheckboxLabelSprites[CheckboxLabelCount]; diff --git a/src/profile/games/mo8/optionsmenu.cpp b/src/profile/games/mo8/optionsmenu.cpp index 806779219..5589f1dc3 100644 --- a/src/profile/games/mo8/optionsmenu.cpp +++ b/src/profile/games/mo8/optionsmenu.cpp @@ -26,6 +26,10 @@ void Configure() { EnsureGetMemberSprite("BackButtonHighlightedSprite"); BackButtonPosition = EnsureGetMemberVec2("BackButtonPosition"); + SliderTrackSprite = EnsureGetMemberSprite("SliderTrackSprite"); + SliderFillSprite = EnsureGetMemberSprite("SliderFillSprite"); + SliderThumbSprite = EnsureGetMemberSprite("SliderThumbSprite"); + ButtonHighlight = EnsureGetMemberSprite("ButtonHighlight"); PageLabelPosition = EnsureGetMemberVec2("PageLabelPosition"); ListStartingPosition = EnsureGetMemberVec2("ListStartingPosition"); diff --git a/src/profile/games/mo8/optionsmenu.h b/src/profile/games/mo8/optionsmenu.h index 53a758339..e13b17e39 100644 --- a/src/profile/games/mo8/optionsmenu.h +++ b/src/profile/games/mo8/optionsmenu.h @@ -14,6 +14,10 @@ inline Sprite BackButtonSprite; inline Sprite BackButtonHighlightedSprite; inline glm::vec2 BackButtonPosition; +inline Sprite SliderTrackSprite; +inline Sprite SliderFillSprite; +inline Sprite SliderThumbSprite; + inline Sprite ButtonHighlight; inline glm::vec2 PageLabelPosition; inline glm::vec2 ListStartingPosition; diff --git a/src/profile/ui/optionsmenu.cpp b/src/profile/ui/optionsmenu.cpp index 389a782f3..9d215c5ee 100644 --- a/src/profile/ui/optionsmenu.cpp +++ b/src/profile/ui/optionsmenu.cpp @@ -25,9 +25,6 @@ void Configure() { FadeOutDuration = EnsureGetMemberFloat("FadeOutDuration"); BackgroundSprite = EnsureGetMemberSprite("BackgroundSprite"); - SliderTrackSprite = EnsureGetMemberSprite("SliderTrackSprite"); - SliderFillSprite = EnsureGetMemberSprite("SliderFillSprite"); - SliderThumbSprite = EnsureGetMemberSprite("SliderThumbSprite"); }; if (Type == +OptionsMenuType::MO6TW) { diff --git a/src/profile/ui/optionsmenu.h b/src/profile/ui/optionsmenu.h index 728a93876..f89564d22 100644 --- a/src/profile/ui/optionsmenu.h +++ b/src/profile/ui/optionsmenu.h @@ -10,9 +10,6 @@ namespace OptionsMenu { inline Impacto::UI::OptionsMenuType Type = Impacto::UI::OptionsMenuType::None; inline Sprite BackgroundSprite; -inline Sprite SliderTrackSprite; -inline Sprite SliderFillSprite; -inline Sprite SliderThumbSprite; inline float FadeInDuration; inline float FadeOutDuration; From 659479525f6a53c393fe4f8b16f731b72cae4a84 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 17 Oct 2024 20:44:04 +0200 Subject: [PATCH 03/59] Added cclcc config sprites to cpp profile --- src/profile/games/cclcc/optionsmenu.cpp | 23 ++++++++++++++++++ src/profile/games/cclcc/optionsmenu.h | 31 +++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index 7db282729..a55637d96 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -13,6 +13,29 @@ namespace CCLCC { namespace OptionsMenu { void Configure() { + HeaderSprite = EnsureGetMemberSprite("HeaderSprite"); + GetMemberSpriteArray(PageHeaderSprites, PageHeaderSpriteCount, + "PageHeaderSprites"); + PoleAnimation = EnsureGetMemberAnimation("PoleAnimation"); + + SliderTrackSprite = EnsureGetMemberSprite("SliderTrackSprite"); + VoiceSliderTrackSprite = EnsureGetMemberSprite("VoiceSliderTrackSprite"); + BinaryBoxSprite = EnsureGetMemberSprite("BinaryBoxSprite"); + + SkipReadSprite = EnsureGetMemberSprite("SkipReadSprite"); + SkipAllSprite = EnsureGetMemberSprite("SkipAllSprite"); + OnSprite = EnsureGetMemberSprite("OnSprite"); + OffSprite = EnsureGetMemberSprite("OffSprite"); + YesSprite = EnsureGetMemberSprite("YesSprite"); + NoSprite = EnsureGetMemberSprite("NoSprite"); + + GuideSprite = EnsureGetMemberSprite("GuideSprite"); + VoiceGuideSprite = EnsureGetMemberSprite("VoiceGuideSprite"); + + GetMemberSpriteArray(LabelSprites, LabelSpriteCount, "LabelSprites"); + GetMemberSpriteArray(NametagSprites, NametagSpriteCount, "NametagSprites"); + GetMemberSpriteArray(PortraitSprites, PortraitSpriteCount, "PortraitSprites"); + auto drawType = Game::DrawComponentType::_from_integral_unchecked( EnsureGetMemberInt("DrawType")); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 1c1ad53d6..907f151a7 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -1,12 +1,43 @@ #pragma once #include "../../../spritesheet.h" +#include "../../../spriteanimation.h" namespace Impacto { namespace Profile { namespace CCLCC { namespace OptionsMenu { +int constexpr PageHeaderSpriteCount = 4; +int constexpr PagePanelSpriteCount = 8; +int constexpr LabelSpriteCount = 16; +int constexpr NametagSpriteCount = 13; +int constexpr PortraitSpriteCount = 26; + +inline Sprite PointerSprite; + +inline Sprite HeaderSprite; +inline Sprite PageHeaderSprites[PageHeaderSpriteCount]; +inline SpriteAnimationDef PoleAnimation; + +inline Sprite SliderTrackSprite; +inline Sprite VoiceSliderTrackSprite; +inline Sprite BinaryBoxSprite; + +inline Sprite SkipReadSprite; +inline Sprite SkipAllSprite; +inline Sprite OnSprite; +inline Sprite OffSprite; +inline Sprite YesSprite; +inline Sprite NoSprite; + +inline Sprite GuideSprite; +inline Sprite VoiceGuideSprite; + +inline Sprite LabelSprites[LabelSpriteCount]; +inline Sprite NametagSprites[NametagSpriteCount]; +inline Sprite PortraitSprites[PortraitSpriteCount]; + void Configure(); } // namespace OptionsMenu From c2bda62c4c3bb4b69c66937567a0b04606890bcd Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 17 Oct 2024 21:37:11 +0200 Subject: [PATCH 04/59] Added positioning info to cclcc options profile --- profiles/cclcc/hud/optionsmenu.lua | 29 ++++++++++++++++++++----- src/profile/games/cclcc/optionsmenu.cpp | 24 ++++++++++++++++++++ src/profile/games/cclcc/optionsmenu.h | 21 ++++++++++++++++++ 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 4c8a82696..febea3878 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -6,19 +6,27 @@ root.OptionsMenu = { FadeOutDuration = 0.2, BackgroundSprite = "OptionsBackground", + BackgroundPosition = { X = 179, Y = 0 }, PointerSprite = "OptionsPointer", + PointerOffset = { X = 89, Y = 5 }, HeaderSprite = "OptionsHeader", + HeaderPosition = { X = 10, Y = 10 }, PageHeaderSprites = {}, + PageHeaderPosition = { X = 696, Y = 182 }, PagePanelSprite = "OptionsPagePanel", + PagePanelPosition = { X = 0, Y = -8 }, PagePanelSprites = {}, PoleAnimation = "OptionsPoleAnimation", SliderTrackSprite = "OptionsSliderTrack", + SliderTrackOffset = { X = 664, Y = 2 }, VoiceSliderTrackSprite = "OptionsVoiceSliderTrack", + VoiceSliderOffset = { X = 111, Y = 56 }, BinaryBoxSprite = "OptionsBinaryBox", + BinaryBoxOffset = { X = 812, Y = 2 }, SkipReadSprite = "OptionsSkipRead", SkipAllSprite = "OptionsSkipAll", @@ -29,10 +37,19 @@ root.OptionsMenu = { GuideSprite = "OptionsGuide", VoiceGuideSprite = "OptionsVoiceGuide", + GuidePosition = { X = 0, Y = 986 }, + + EntriesStartPosition = { X = 521, Y = 311 }, + EntriesVerticalOffset = 126, + SoundEntriesStartPosition = { X = 521, Y = 331 }, + SoundEntriesVerticalOffset = 70, + VoiceEntriesOffset = { X = 408, Y = 160 }, LabelSprites = {}, NametagSprites = {}, - PortraitSprites = {} + NametagOffset = { X = 112, Y = 2 }, + PortraitSprites = {}, + VoicePosition = { X = 458, Y = 312 }, }; root.Sprites["OptionsBackground"] = { @@ -102,12 +119,12 @@ root.Sprites["OptionsNo"] = { root.Sprites["OptionsGuide"] = { Sheet = "Config", - Bounds = { X = 0, Y = 2416, Width = 1926, Height = 57 } + Bounds = { X = 0, Y = 2476, Width = 1926, Height = 57 } }; root.Sprites["OptionsVoiceGuide"] = { Sheet = "Config", - Bounds = { X = 0, Y = 2476, Width = 1926, Height = 57 } + Bounds = { X = 0, Y = 2416, Width = 1926, Height = 57 } }; for i = 1, 4 do @@ -117,7 +134,7 @@ for i = 1, 4 do Sheet = "Config", Bounds = { X = 0, - Y = 1510 + height * i, + Y = 1510 + height * (i - 1), Width = 942, Height = height } @@ -134,7 +151,7 @@ for i = 1, 16 do Sheet = "Config", Bounds = { X = 1239, - Y = 1237 + height * i + offset, + Y = 1237 + height * (i - 1) + offset, Width = 809, Height = height } @@ -150,7 +167,7 @@ for i = 1, 13 do Sheet = "Config", Bounds = { X = width * ((i - 1) % 6), - Y = height * ((i - 1) // 6), + Y = 1863 + height * ((i - 1) // 6), Width = width, Height = height } diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index a55637d96..c157912e9 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -13,14 +13,29 @@ namespace CCLCC { namespace OptionsMenu { void Configure() { + BackgroundPosition = EnsureGetMemberVec2("BackgroundPosition"); + + PointerSprite = EnsureGetMemberSprite("PointerSprite"); + PointerOffset = EnsureGetMemberVec2("PointerOffset"); + HeaderSprite = EnsureGetMemberSprite("HeaderSprite"); + HeaderPosition = EnsureGetMemberVec2("HeaderPosition"); GetMemberSpriteArray(PageHeaderSprites, PageHeaderSpriteCount, "PageHeaderSprites"); + PageHeaderPosition = EnsureGetMemberVec2("PageHeaderPosition"); + + PagePanelSprite = EnsureGetMemberSprite("PagePanelSprite"); + PagePanelPosition = EnsureGetMemberVec2("PagePanelPosition"); + GetMemberSpriteArray(PagePanelSprites, PagePanelSpriteCount, + "PagePanelSprites"); PoleAnimation = EnsureGetMemberAnimation("PoleAnimation"); SliderTrackSprite = EnsureGetMemberSprite("SliderTrackSprite"); + SliderTrackOffset = EnsureGetMemberVec2("SliderTrackOffset"); VoiceSliderTrackSprite = EnsureGetMemberSprite("VoiceSliderTrackSprite"); + VoiceSliderOffset = EnsureGetMemberVec2("VoiceSliderOffset"); BinaryBoxSprite = EnsureGetMemberSprite("BinaryBoxSprite"); + BinaryBoxOffset = EnsureGetMemberVec2("BinaryBoxOffset"); SkipReadSprite = EnsureGetMemberSprite("SkipReadSprite"); SkipAllSprite = EnsureGetMemberSprite("SkipAllSprite"); @@ -31,10 +46,19 @@ void Configure() { GuideSprite = EnsureGetMemberSprite("GuideSprite"); VoiceGuideSprite = EnsureGetMemberSprite("VoiceGuideSprite"); + GuidePosition = EnsureGetMemberVec2("GuidePosition"); + + EntriesStartPosition = EnsureGetMemberVec2("EntriesStartPosition"); + EntriesVerticalOffset = EnsureGetMemberInt("EntriesVerticalOffset"); + SoundEntriesStartPosition = EnsureGetMemberVec2("SoundEntriesStartPosition"); + SoundEntriesVerticalOffset = EnsureGetMemberInt("SoundEntriesVerticalOffset"); + VoiceEntriesOffset = EnsureGetMemberVec2("VoiceEntriesOffset"); GetMemberSpriteArray(LabelSprites, LabelSpriteCount, "LabelSprites"); GetMemberSpriteArray(NametagSprites, NametagSpriteCount, "NametagSprites"); + NametagOffset = EnsureGetMemberVec2("NametagOffset"); GetMemberSpriteArray(PortraitSprites, PortraitSpriteCount, "PortraitSprites"); + VoicePosition = EnsureGetMemberVec2("VoicePosition"); auto drawType = Game::DrawComponentType::_from_integral_unchecked( EnsureGetMemberInt("DrawType")); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 907f151a7..266a3300c 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -14,15 +14,27 @@ int constexpr LabelSpriteCount = 16; int constexpr NametagSpriteCount = 13; int constexpr PortraitSpriteCount = 26; +inline glm::vec2 BackgroundPosition; + inline Sprite PointerSprite; +inline glm::vec2 PointerOffset; inline Sprite HeaderSprite; +inline glm::vec2 HeaderPosition; inline Sprite PageHeaderSprites[PageHeaderSpriteCount]; +inline glm::vec2 PageHeaderPosition; + +inline Sprite PagePanelSprite; +inline glm::vec2 PagePanelPosition; +inline Sprite PagePanelSprites[PagePanelSpriteCount]; inline SpriteAnimationDef PoleAnimation; inline Sprite SliderTrackSprite; +inline glm::vec2 SliderTrackOffset; inline Sprite VoiceSliderTrackSprite; +inline glm::vec2 VoiceSliderOffset; inline Sprite BinaryBoxSprite; +inline glm::vec2 BinaryBoxOffset; inline Sprite SkipReadSprite; inline Sprite SkipAllSprite; @@ -33,10 +45,19 @@ inline Sprite NoSprite; inline Sprite GuideSprite; inline Sprite VoiceGuideSprite; +inline glm::vec2 GuidePosition; + +inline glm::vec2 EntriesStartPosition; +inline int EntriesVerticalOffset; +inline glm::vec2 SoundEntriesStartPosition; +inline int SoundEntriesVerticalOffset; +inline glm::vec2 VoiceEntriesOffset; inline Sprite LabelSprites[LabelSpriteCount]; inline Sprite NametagSprites[NametagSpriteCount]; +inline glm::vec2 NametagOffset; inline Sprite PortraitSprites[PortraitSpriteCount]; +inline glm::vec2 VoicePosition; void Configure(); From ab8b33fabfe9c8989c19f0e5178dc8c8b6caf319 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 17 Oct 2024 22:56:15 +0200 Subject: [PATCH 05/59] Implemented static cclcc config ui mockup --- profiles/cclcc/hud/optionsmenu.lua | 46 ++++++++++++++++++------------ src/games/cclcc/optionsmenu.cpp | 35 +++++++++++++++++++++-- src/games/cclcc/optionsmenu.h | 2 ++ 3 files changed, 63 insertions(+), 20 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index febea3878..734e3c79d 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -17,7 +17,7 @@ root.OptionsMenu = { PageHeaderPosition = { X = 696, Y = 182 }, PagePanelSprite = "OptionsPagePanel", - PagePanelPosition = { X = 0, Y = -8 }, + PagePanelPosition = { X = -114, Y = 0 }, PagePanelSprites = {}, PoleAnimation = "OptionsPoleAnimation", @@ -127,14 +127,14 @@ root.Sprites["OptionsVoiceGuide"] = { Bounds = { X = 0, Y = 2416, Width = 1926, Height = 57 } }; -for i = 1, 4 do +for i = 0, 3 do height = 80; root.Sprites["OptionsPageHeader" .. i] = { Sheet = "Config", Bounds = { X = 0, - Y = 1510 + height * (i - 1), + Y = 1510 + height * i, Width = 942, Height = height } @@ -143,31 +143,36 @@ for i = 1, 4 do root.OptionsMenu.PageHeaderSprites[#root.OptionsMenu.PageHeaderSprites + 1] = "OptionsPageHeader" .. i; end -for i = 1, 16 do - offset = ((i > 12) and {104} or {0})[1]; - height = 52; +-- Rearange the labels in the array so they're in order of appearance +labelIndices = {5, 6, 7, 1, + 2, 3, 8, + 9, 10, 11, 12, 13, 4, 15, 14, + 16}; +height = 52; +for i = 0, 15 do + offset = ((i > 11) and {104} or {0})[1]; root.Sprites["OptionsLabel" .. i] = { Sheet = "Config", Bounds = { X = 1239, - Y = 1237 + height * (i - 1) + offset, + Y = 1237 + height * i + offset, Width = 809, Height = height } }; - root.OptionsMenu.LabelSprites[#root.OptionsMenu.LabelSprites + 1] = "OptionsLabel" .. i; + root.OptionsMenu.LabelSprites[labelIndices[i + 1]] = "OptionsLabel" .. i; end -for i = 1, 13 do +for i = 0, 12 do width = 218; height = 53; root.Sprites["OptionsNametag" .. i] = { Sheet = "Config", Bounds = { - X = width * ((i - 1) % 6), - Y = 1863 + height * ((i - 1) // 6), + X = width * (i % 6), + Y = 1863 + height * (i // 6), Width = width, Height = height } @@ -175,15 +180,15 @@ for i = 1, 13 do root.OptionsMenu.NametagSprites[#root.OptionsMenu.NametagSprites + 1] = "OptionsNametag" .. i; end -for i = 1, 8 do +for i = 0, 7 do -- Interweave highlighted and non-highlighted variants width = 224; - offset = ((i % 2 == 0) and {width * 4} or {0})[1]; + offset = ((i % 2 == 1) and {width * 4} or {0})[1]; root.Sprites["OptionsPagePanel" .. i] = { Sheet = "Config", Bounds = { - X = offset + width * ((i - 1) // 2), + X = offset + width * (i // 2), Y = 2205, Width = width, Height = 195 @@ -192,15 +197,15 @@ for i = 1, 8 do root.OptionsMenu.PagePanelSprites[#root.OptionsMenu.PagePanelSprites + 1] = "OptionsPagePanel" .. i; end -for i = 1, 26 do +for i = 0, 25 do -- Interweave on and muted variants width = 100; root.Sprites["OptionsPortrait" .. i] = { Sheet = "ConfigEx", Bounds = { - X = 768 + (width + 1) * (i - 1), - Y = ((i % 2 == 1) and {2256} or {2357})[1], + X = 768 + (width + 1) * i, + Y = ((i % 2 == 0) and {2256} or {2357})[1], Width = width, Height = width } @@ -211,15 +216,20 @@ end MakeAnimation({ Name = "OptionsPoleAnimation", Sheet = "ConfigEx", + FirstFrameX = 0, FirstFrameY = 0, + FrameWidth = 539, ColWidth = 539, FrameHeight = 1080, RowHeight = 1096, + Frames = 15, Duration = 1, Rows = 3, Columns = 7, - PrimaryDirection = AnimationDirections.Right + + PrimaryDirection = AnimationDirections.Right, + SecondaryDirection = AnimationDirections.Down }); \ No newline at end of file diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 67184740a..6d5b6e9f5 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -25,12 +25,15 @@ OptionsMenu::OptionsMenu() { FadeAnimation.LoopMode = AnimationLoopMode::Stop; FadeAnimation.DurationIn = FadeInDuration; FadeAnimation.DurationOut = FadeOutDuration; + + PoleAnimation = Profile::CCLCC::OptionsMenu::PoleAnimation.Instantiate(); } void OptionsMenu::Show() { if (State != Shown) { State = Showing; FadeAnimation.StartIn(); + PoleAnimation.StartIn(); // FirstPage->Show(); if (UI::FocusedMenu != 0) { LastFocusedMenu = UI::FocusedMenu; @@ -44,6 +47,7 @@ void OptionsMenu::Hide() { if (State != Hidden) { State = Hiding; FadeAnimation.StartOut(); + PoleAnimation.StartOut(); if (LastFocusedMenu != 0) { UI::FocusedMenu = LastFocusedMenu; LastFocusedMenu->IsFocused = true; @@ -58,6 +62,7 @@ void OptionsMenu::Update(float dt) { UpdateInput(); FadeAnimation.Update(dt); + PoleAnimation.Update(dt); if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown && ScrWork[SW_SYSSUBMENUNO] == 5) { Hide(); @@ -70,8 +75,34 @@ void OptionsMenu::Update(float dt) { void OptionsMenu::Render() { if (State != Hidden && ScrWork[SW_SYSSUBMENUCT] >= 32 && ScrWork[SW_SYSSUBMENUNO] == 5) { - // glm::vec4 col(1.0f, 1.0f, 1.0f, FadeAnimation.Progress); - Renderer->DrawSprite(BackgroundSprite, glm::vec2(0.0f)); + glm::vec4 col(1.0f, 1.0f, 1.0f, FadeAnimation.Progress); + + Renderer->DrawSprite(BackgroundSprite, BackgroundPosition, col); + Renderer->DrawSprite(HeaderSprite, HeaderPosition, col); + + Renderer->DrawSprite(PageHeaderSprites[2], PageHeaderPosition, col); + for (int i = 7; i < 15; i++) { + glm::vec2 pos = SoundEntriesStartPosition; + pos.y += SoundEntriesVerticalOffset * (i - 7); + + Renderer->DrawSprite(LabelSprites[i], pos, col); + + if (11 <= i && i <= 13) { + glm::vec2 boxPos = pos + BinaryBoxOffset; + + Renderer->DrawSprite(BinaryBoxSprite, boxPos, col); + Renderer->DrawSprite(YesSprite, boxPos, col); + Renderer->DrawSprite( + NoSprite, boxPos + glm::vec2(BinaryBoxSprite.ScaledWidth() / 2, 0), + col); + } else { + Renderer->DrawSprite(SliderTrackSprite, pos + SliderTrackOffset, col); + } + } + + Renderer->DrawSprite(PoleAnimation.CurrentSprite(), PagePanelPosition, col); + + Renderer->DrawSprite(GuideSprite, GuidePosition, col); } } diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index ce951260a..f7b888ba4 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -1,6 +1,7 @@ #pragma once #include "../../ui/menu.h" +#include "../../spriteanimation.h" namespace Impacto { namespace UI { @@ -17,6 +18,7 @@ class OptionsMenu : public Menu { private: Animation FadeAnimation; + SpriteAnimation PoleAnimation; }; } // namespace CCLCC From aa2482af8d54f2d77934c55ea9e095f4af3e48d5 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sun, 20 Oct 2024 22:44:57 +0200 Subject: [PATCH 06/59] Implemented pages and binary buttons --- CMakeLists.txt | 2 + src/games/cclcc/optionsmenu.cpp | 105 ++++++++++++++++--- src/games/cclcc/optionsmenu.h | 11 ++ src/ui/widgets/cclcc/optionsbinarybutton.cpp | 69 ++++++++++++ src/ui/widgets/cclcc/optionsbinarybutton.h | 37 +++++++ src/util.h | 3 + 6 files changed, 213 insertions(+), 14 deletions(-) create mode 100644 src/ui/widgets/cclcc/optionsbinarybutton.cpp create mode 100644 src/ui/widgets/cclcc/optionsbinarybutton.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8273d8505..4560cdaf7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,6 +244,7 @@ set(Impacto_Src src/ui/widgets/cc/backlogentry.cpp src/ui/widgets/cc/titlebutton.cpp src/ui/widgets/cclcc/titlebutton.cpp + src/ui/widgets/cclcc/optionsbinarybutton.cpp src/ui/widgets/cclcc/saveentrybutton.cpp src/ui/widgets/cclcc/sysmenubutton.cpp src/ui/widgets/cclcc/tipsentrybutton.cpp @@ -556,6 +557,7 @@ set(Impacto_Header src/ui/widgets/cc/backlogentry.h src/ui/widgets/cc/titlebutton.h src/ui/widgets/cclcc/titlebutton.h + src/ui/widgets/cclcc/optionsbinarybutton.h src/renderer/3d/camera.h src/renderer/3d/model.h diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 6d5b6e9f5..722ba04b0 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -2,14 +2,9 @@ #include "../../profile/ui/optionsmenu.h" #include "../../profile/games/cclcc/optionsmenu.h" -#include "../../renderer/renderer.h" -#include "../../mem.h" -#include "../../profile/scriptvars.h" -#include "../../inputsystem.h" +#include "../../profile/scriptinput.h" #include "../../vm/interface/input.h" -#include "../../ui/widgets/button.h" -#include "../../vm/vm.h" -#include "../../audio/audiochannel.h" +#include "../../ui/widgets/cclcc/optionsbinarybutton.h" namespace Impacto { namespace UI { @@ -18,6 +13,8 @@ namespace CCLCC { using namespace Impacto::Profile::OptionsMenu; using namespace Impacto::Profile::CCLCC::OptionsMenu; using namespace Impacto::Profile::ScriptVars; +using namespace Impacto::UI::Widgets; +using namespace Impacto::UI::Widgets::CCLCC; using namespace Impacto::Vm::Interface; OptionsMenu::OptionsMenu() { @@ -27,6 +24,56 @@ OptionsMenu::OptionsMenu() { FadeAnimation.DurationOut = FadeOutDuration; PoleAnimation = Profile::CCLCC::OptionsMenu::PoleAnimation.Instantiate(); + + Pages.reserve(4); + + BasicPage = new Group(this); + BasicPage->FocusLock = false; + for (int i = 0; i < 4; i++) { + glm::vec2 pos = EntriesStartPosition; + pos.y += EntriesVerticalOffset * i; + + BasicPage->Add(new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, + LabelSprites[i], pos), + FDIR_DOWN); + } + Pages.push_back(BasicPage); + + TextPage = new Group(this); + TextPage->FocusLock = false; + for (int i = 4; i < 7; i++) { + glm::vec2 pos = EntriesStartPosition; + pos.y += EntriesVerticalOffset * (i - 4); + + TextPage->Add(new OptionsBinaryButton(BinaryBoxSprite, YesSprite, NoSprite, + LabelSprites[i], pos), + FDIR_DOWN); + } + Pages.push_back(TextPage); + + SoundPage = new Group(this); + SoundPage->FocusLock = false; + for (int i = 7; i < 15; i++) { + glm::vec2 pos = SoundEntriesStartPosition; + pos.y += SoundEntriesVerticalOffset * (i - 7); + + SoundPage->Add(new OptionsBinaryButton(BinaryBoxSprite, YesSprite, NoSprite, + LabelSprites[i], pos), + FDIR_DOWN); + } + Pages.push_back(SoundPage); + + VoicePage = new Group(this); + VoicePage->FocusLock = false; + for (int i = 0; i < 12; i++) { + glm::vec2 pos = VoicePosition; + pos += VoiceEntriesOffset * glm::vec2(i % 3, i / 3); + + VoicePage->Add(new Label(NametagSprites[i], pos), FDIR_RIGHT); + } + Pages.push_back(VoicePage); + + CurrentPage = 0; } void OptionsMenu::Show() { @@ -34,25 +81,32 @@ void OptionsMenu::Show() { State = Showing; FadeAnimation.StartIn(); PoleAnimation.StartIn(); - // FirstPage->Show(); - if (UI::FocusedMenu != 0) { + + Pages.at(CurrentPage)->Show(); + + if (UI::FocusedMenu != nullptr) { LastFocusedMenu = UI::FocusedMenu; LastFocusedMenu->IsFocused = false; } IsFocused = true; UI::FocusedMenu = this; + + CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); + CurrentlyFocusedElement->HasFocus = true; } } + void OptionsMenu::Hide() { if (State != Hidden) { State = Hiding; FadeAnimation.StartOut(); PoleAnimation.StartOut(); - if (LastFocusedMenu != 0) { + + if (LastFocusedMenu != nullptr) { UI::FocusedMenu = LastFocusedMenu; LastFocusedMenu->IsFocused = true; } else { - UI::FocusedMenu = 0; + UI::FocusedMenu = nullptr; } IsFocused = false; } @@ -70,6 +124,10 @@ void OptionsMenu::Update(float dt) { ScrWork[SW_SYSSUBMENUNO] == 5) { Show(); } + + int newPageOffset = -(int)(bool)(PADinputButtonWentDown & PAD1L1) + + (int)(bool)(PADinputButtonWentDown & PAD1R1); + GoToPage((CurrentPage + newPageOffset) % Pages.size()); } void OptionsMenu::Render() { @@ -80,7 +138,10 @@ void OptionsMenu::Render() { Renderer->DrawSprite(BackgroundSprite, BackgroundPosition, col); Renderer->DrawSprite(HeaderSprite, HeaderPosition, col); - Renderer->DrawSprite(PageHeaderSprites[2], PageHeaderPosition, col); + Renderer->DrawSprite(PageHeaderSprites[+CurrentPage], PageHeaderPosition, + col); + Pages.at(CurrentPage)->Render(); + /* for (int i = 7; i < 15; i++) { glm::vec2 pos = SoundEntriesStartPosition; pos.y += SoundEntriesVerticalOffset * (i - 7); @@ -93,12 +154,13 @@ void OptionsMenu::Render() { Renderer->DrawSprite(BinaryBoxSprite, boxPos, col); Renderer->DrawSprite(YesSprite, boxPos, col); Renderer->DrawSprite( - NoSprite, boxPos + glm::vec2(BinaryBoxSprite.ScaledWidth() / 2, 0), - col); + NoSprite, boxPos + glm::vec2(BinaryBoxSprite.ScaledWidth() / 2, 0), + col); } else { Renderer->DrawSprite(SliderTrackSprite, pos + SliderTrackOffset, col); } } + */ Renderer->DrawSprite(PoleAnimation.CurrentSprite(), PagePanelPosition, col); @@ -106,6 +168,21 @@ void OptionsMenu::Render() { } } +void OptionsMenu::GoToPage(int pageNumber) { + if (CurrentPage == pageNumber) return; + + Pages.at(CurrentPage)->HasFocus = false; + + CurrentPage = pageNumber; + Group& page = *Pages.at(CurrentPage); + + page.HasFocus = true; + page.Show(); + + CurrentlyFocusedElement = page.GetFirstFocusableChild(); + CurrentlyFocusedElement->HasFocus = true; +} + } // namespace CCLCC } // namespace UI } // namespace Impacto \ No newline at end of file diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index f7b888ba4..5cfb59f4a 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -2,6 +2,7 @@ #include "../../ui/menu.h" #include "../../spriteanimation.h" +#include "../../ui/widgets/group.h" namespace Impacto { namespace UI { @@ -17,8 +18,18 @@ class OptionsMenu : public Menu { void Render(); private: + void GoToPage(int pageNumber); + Animation FadeAnimation; SpriteAnimation PoleAnimation; + + Widgets::Group* BasicPage; + Widgets::Group* TextPage; + Widgets::Group* SoundPage; + Widgets::Group* VoicePage; + + int CurrentPage; + std::vector Pages; }; } // namespace CCLCC diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp new file mode 100644 index 000000000..7ef5beae5 --- /dev/null +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -0,0 +1,69 @@ +#include "optionsbinarybutton.h" + +#include "../../../profile/games/cclcc/optionsmenu.h" +#include "../../../renderer/renderer.h" + +using namespace Impacto::Profile::CCLCC::OptionsMenu; + +namespace Impacto { +namespace UI { +namespace Widgets { +namespace CCLCC { + +OptionsBinaryButton::OptionsBinaryButton(const Sprite& box, + const Sprite& trueLabel, + const Sprite& falseLabel, + const Sprite& label, glm::vec2 pos) + : BoxSprite(box), + TrueSprite(trueLabel), + FalseSprite(falseLabel), + LabelSprite(label) { + Bounds = RectF(pos.x, pos.y, BinaryBoxOffset.x + BoxSprite.ScaledWidth(), + LabelSprite.ScaledHeight()); +} + +inline glm::vec2 OptionsBinaryButton::GetTruePos() const { + return Bounds.GetPos() + BinaryBoxOffset; +} + +inline glm::vec2 OptionsBinaryButton::GetFalsePos() const { + return Bounds.GetPos() + BinaryBoxOffset + + glm::vec2(BoxSprite.ScaledWidth() / 2, 0.0f); +} + +void OptionsBinaryButton::Render() { + HighlightTint.a = Tint.a; + glm::vec4 black = glm::vec4(0.0f, 0.0f, 0.0f, Tint.a); + + glm::vec4 trueTint; + glm::vec4 falseTint; + glm::vec2 highlightPos; + RectF highlightBounds(0.0f, 0.0f, BoxSprite.ScaledWidth() / 2, + BoxSprite.ScaledHeight()); + if (State) { + trueTint = Tint; + falseTint = black; + highlightPos = GetTruePos(); + } else { + trueTint = black; + falseTint = Tint; + highlightPos = GetFalsePos(); + } + highlightBounds.X = highlightPos.x; + highlightBounds.Y = highlightPos.y; + + Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), black); + + Renderer->DrawRect(highlightBounds, HighlightTint); + Renderer->DrawSprite(BoxSprite, GetTruePos(), Tint); + + Renderer->DrawSprite(TrueSprite, GetTruePos(), trueTint); + Renderer->DrawSprite(FalseSprite, GetFalsePos(), falseTint); +} + +void OptionsBinaryButton::UpdateInput() {} + +} // namespace CCLCC +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.h b/src/ui/widgets/cclcc/optionsbinarybutton.h new file mode 100644 index 000000000..03f0c5dd6 --- /dev/null +++ b/src/ui/widgets/cclcc/optionsbinarybutton.h @@ -0,0 +1,37 @@ +#pragma once + +#include "../../widget.h" +#include "../../../spritesheet.h" + +namespace Impacto { +namespace UI { +namespace Widgets { +namespace CCLCC { + +class OptionsBinaryButton : public Widget { + public: + OptionsBinaryButton(const Sprite& box, const Sprite& trueLabel, + const Sprite& falseLabel, const Sprite& label, + glm::vec2 pos); + + void Render() override; + void UpdateInput() override; + + private: + inline glm::vec2 GetTruePos() const; + inline glm::vec2 GetFalsePos() const; + + const Sprite& BoxSprite; + const Sprite& TrueSprite; + const Sprite& FalseSprite; + const Sprite& LabelSprite; + + glm::vec4 HighlightTint = glm::vec4(0.94f, 0.49f, 0.59f, 1.0f); + + bool State = true; +}; + +} // namespace CCLCC +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file diff --git a/src/util.h b/src/util.h index 96ecbeeb8..4bc53701f 100644 --- a/src/util.h +++ b/src/util.h @@ -80,6 +80,9 @@ struct RectF { return !(*this == other); } + constexpr glm::vec2 GetPos() const { return glm::vec2(X, Y); } + constexpr glm::vec2 GetSize() const { return glm::vec2(Width, Height); } + static RectF Coalesce(const RectF& first, const RectF& second); }; From 9956597528a2140ddf9da4624a2a3827897f034f Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sun, 20 Oct 2024 23:11:29 +0200 Subject: [PATCH 07/59] Added options slider --- CMakeLists.txt | 2 ++ src/games/cclcc/optionsmenu.cpp | 36 ++++++++++++++---------- src/ui/widgets/cclcc/optionsslider.cpp | 39 ++++++++++++++++++++++++++ src/ui/widgets/cclcc/optionsslider.h | 30 ++++++++++++++++++++ 4 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 src/ui/widgets/cclcc/optionsslider.cpp create mode 100644 src/ui/widgets/cclcc/optionsslider.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4560cdaf7..a0fa78cfc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -245,6 +245,7 @@ set(Impacto_Src src/ui/widgets/cc/titlebutton.cpp src/ui/widgets/cclcc/titlebutton.cpp src/ui/widgets/cclcc/optionsbinarybutton.cpp + src/ui/widgets/cclcc/optionsslider.cpp src/ui/widgets/cclcc/saveentrybutton.cpp src/ui/widgets/cclcc/sysmenubutton.cpp src/ui/widgets/cclcc/tipsentrybutton.cpp @@ -558,6 +559,7 @@ set(Impacto_Header src/ui/widgets/cc/titlebutton.h src/ui/widgets/cclcc/titlebutton.h src/ui/widgets/cclcc/optionsbinarybutton.h + src/ui/widgets/cclcc/optionsslider.h src/renderer/3d/camera.h src/renderer/3d/model.h diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 722ba04b0..c23107b58 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -5,6 +5,7 @@ #include "../../profile/scriptinput.h" #include "../../vm/interface/input.h" #include "../../ui/widgets/cclcc/optionsbinarybutton.h" +#include "../../ui/widgets/cclcc/optionsslider.h" namespace Impacto { namespace UI { @@ -26,40 +27,45 @@ OptionsMenu::OptionsMenu() { PoleAnimation = Profile::CCLCC::OptionsMenu::PoleAnimation.Instantiate(); Pages.reserve(4); + glm::vec2 pos = EntriesStartPosition; BasicPage = new Group(this); BasicPage->FocusLock = false; for (int i = 0; i < 4; i++) { - glm::vec2 pos = EntriesStartPosition; - pos.y += EntriesVerticalOffset * i; - BasicPage->Add(new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, LabelSprites[i], pos), FDIR_DOWN); + + pos.y += EntriesVerticalOffset; } Pages.push_back(BasicPage); + pos = EntriesStartPosition; TextPage = new Group(this); TextPage->FocusLock = false; - for (int i = 4; i < 7; i++) { - glm::vec2 pos = EntriesStartPosition; - pos.y += EntriesVerticalOffset * (i - 4); - - TextPage->Add(new OptionsBinaryButton(BinaryBoxSprite, YesSprite, NoSprite, - LabelSprites[i], pos), + for (int i = 4; i < 6; i++) { + TextPage->Add(new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos), FDIR_DOWN); + + pos.y += EntriesVerticalOffset; } + TextPage->Add(new OptionsBinaryButton(BinaryBoxSprite, YesSprite, NoSprite, + LabelSprites[6], pos), + FDIR_DOWN); Pages.push_back(TextPage); + pos = SoundEntriesStartPosition; SoundPage = new Group(this); SoundPage->FocusLock = false; for (int i = 7; i < 15; i++) { - glm::vec2 pos = SoundEntriesStartPosition; - pos.y += SoundEntriesVerticalOffset * (i - 7); - - SoundPage->Add(new OptionsBinaryButton(BinaryBoxSprite, YesSprite, NoSprite, - LabelSprites[i], pos), - FDIR_DOWN); + Widget* widget = + (i < 11 || i == 14) + ? new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos) + : widget = new OptionsBinaryButton(BinaryBoxSprite, YesSprite, + NoSprite, LabelSprites[i], pos); + SoundPage->Add(widget, FDIR_DOWN); + + pos.y += SoundEntriesVerticalOffset; } Pages.push_back(SoundPage); diff --git a/src/ui/widgets/cclcc/optionsslider.cpp b/src/ui/widgets/cclcc/optionsslider.cpp new file mode 100644 index 000000000..7dabe4161 --- /dev/null +++ b/src/ui/widgets/cclcc/optionsslider.cpp @@ -0,0 +1,39 @@ +#include "optionsslider.h" + +#include "../../../profile/games/cclcc/optionsmenu.h" +#include "../../../renderer/renderer.h" + +using namespace Impacto::Profile::CCLCC::OptionsMenu; + +namespace Impacto { +namespace UI { +namespace Widgets { +namespace CCLCC { + +OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, + glm::vec2 pos) + : BoxSprite(box), LabelSprite(label) { + Bounds = RectF(pos.x, pos.y, SliderTrackOffset.x + box.ScaledWidth(), + LabelSprite.ScaledHeight()); +} + +void OptionsSlider::Render() { + HighlightTint.a = Tint.a; + glm::vec4 black = glm::vec4(0.0f, 0.0f, 0.0f, Tint.a); + + Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), black); + + RectF highlightBounds( + Bounds.X + SliderTrackOffset.x, Bounds.Y + SliderTrackOffset.y, + Progress * BoxSprite.ScaledWidth(), BoxSprite.ScaledHeight()); + Renderer->DrawRect(highlightBounds, HighlightTint); + + Renderer->DrawSprite(BoxSprite, Bounds.GetPos() + SliderTrackOffset, Tint); +} + +void OptionsSlider::UpdateInput() {} + +} // namespace CCLCC +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file diff --git a/src/ui/widgets/cclcc/optionsslider.h b/src/ui/widgets/cclcc/optionsslider.h new file mode 100644 index 000000000..a00ee00d7 --- /dev/null +++ b/src/ui/widgets/cclcc/optionsslider.h @@ -0,0 +1,30 @@ +#pragma once + +#include "../../widget.h" +#include "../../../spritesheet.h" + +namespace Impacto { +namespace UI { +namespace Widgets { +namespace CCLCC { + +class OptionsSlider : public Widget { + public: + OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos); + + void Render() override; + void UpdateInput() override; + + private: + const Sprite& BoxSprite; + const Sprite& LabelSprite; + + glm::vec4 HighlightTint = glm::vec4(0.94f, 0.49f, 0.59f, 1.0f); + + float Progress = 0.0f; +}; + +} // namespace CCLCC +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file From 4e8c6450586a4a16226459e3d95c35831de55278 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sun, 20 Oct 2024 23:23:28 +0200 Subject: [PATCH 08/59] Added highlight color to profile --- profiles/cclcc/hud/optionsmenu.lua | 2 ++ src/games/cclcc/optionsmenu.cpp | 19 +++++++------ src/profile/games/cclcc/optionsmenu.cpp | 2 ++ src/profile/games/cclcc/optionsmenu.h | 2 ++ src/ui/widgets/cclcc/optionsbinarybutton.cpp | 29 ++++++++------------ src/ui/widgets/cclcc/optionsbinarybutton.h | 4 +-- src/ui/widgets/cclcc/optionsslider.cpp | 8 +++--- src/ui/widgets/cclcc/optionsslider.h | 5 ++-- 8 files changed, 37 insertions(+), 34 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 734e3c79d..33a81aadd 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -5,6 +5,8 @@ root.OptionsMenu = { FadeInDuration = 0.2, FadeOutDuration = 0.2, + HighlightColor = { X = 0.94, Y = 0.49, Z = 0.59 }, + BackgroundSprite = "OptionsBackground", BackgroundPosition = { X = 179, Y = 0 }, diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index c23107b58..273977651 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -28,12 +28,13 @@ OptionsMenu::OptionsMenu() { Pages.reserve(4); glm::vec2 pos = EntriesStartPosition; + glm::vec4 highlightTint(HighlightColor, 1.0f); BasicPage = new Group(this); BasicPage->FocusLock = false; for (int i = 0; i < 4; i++) { BasicPage->Add(new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, - LabelSprites[i], pos), + LabelSprites[i], pos, highlightTint), FDIR_DOWN); pos.y += EntriesVerticalOffset; @@ -44,13 +45,14 @@ OptionsMenu::OptionsMenu() { TextPage = new Group(this); TextPage->FocusLock = false; for (int i = 4; i < 6; i++) { - TextPage->Add(new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos), + TextPage->Add(new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos, + highlightTint), FDIR_DOWN); pos.y += EntriesVerticalOffset; } TextPage->Add(new OptionsBinaryButton(BinaryBoxSprite, YesSprite, NoSprite, - LabelSprites[6], pos), + LabelSprites[6], pos, highlightTint), FDIR_DOWN); Pages.push_back(TextPage); @@ -58,11 +60,12 @@ OptionsMenu::OptionsMenu() { SoundPage = new Group(this); SoundPage->FocusLock = false; for (int i = 7; i < 15; i++) { - Widget* widget = - (i < 11 || i == 14) - ? new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos) - : widget = new OptionsBinaryButton(BinaryBoxSprite, YesSprite, - NoSprite, LabelSprites[i], pos); + Widget* widget = (i < 11 || i == 14) + ? new OptionsSlider(SliderTrackSprite, LabelSprites[i], + pos, highlightTint) + : widget = new OptionsBinaryButton( + BinaryBoxSprite, YesSprite, NoSprite, + LabelSprites[i], pos, highlightTint); SoundPage->Add(widget, FDIR_DOWN); pos.y += SoundEntriesVerticalOffset; diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index c157912e9..216d5e031 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -15,6 +15,8 @@ namespace OptionsMenu { void Configure() { BackgroundPosition = EnsureGetMemberVec2("BackgroundPosition"); + HighlightColor = EnsureGetMemberVec3("HighlightColor"); + PointerSprite = EnsureGetMemberSprite("PointerSprite"); PointerOffset = EnsureGetMemberVec2("PointerOffset"); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 266a3300c..78f174ad3 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -16,6 +16,8 @@ int constexpr PortraitSpriteCount = 26; inline glm::vec2 BackgroundPosition; +inline glm::vec3 HighlightColor; + inline Sprite PointerSprite; inline glm::vec2 PointerOffset; diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index 7ef5beae5..790055a97 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -13,11 +13,13 @@ namespace CCLCC { OptionsBinaryButton::OptionsBinaryButton(const Sprite& box, const Sprite& trueLabel, const Sprite& falseLabel, - const Sprite& label, glm::vec2 pos) + const Sprite& label, glm::vec2 pos, + glm::vec4 highlightTint) : BoxSprite(box), TrueSprite(trueLabel), FalseSprite(falseLabel), - LabelSprite(label) { + LabelSprite(label), + HighlightTint(highlightTint) { Bounds = RectF(pos.x, pos.y, BinaryBoxOffset.x + BoxSprite.ScaledWidth(), LabelSprite.ScaledHeight()); } @@ -33,32 +35,23 @@ inline glm::vec2 OptionsBinaryButton::GetFalsePos() const { void OptionsBinaryButton::Render() { HighlightTint.a = Tint.a; - glm::vec4 black = glm::vec4(0.0f, 0.0f, 0.0f, Tint.a); - glm::vec4 trueTint; - glm::vec4 falseTint; - glm::vec2 highlightPos; RectF highlightBounds(0.0f, 0.0f, BoxSprite.ScaledWidth() / 2, BoxSprite.ScaledHeight()); - if (State) { - trueTint = Tint; - falseTint = black; - highlightPos = GetTruePos(); - } else { - trueTint = black; - falseTint = Tint; - highlightPos = GetFalsePos(); - } + glm::vec2 highlightPos = (State) ? GetTruePos() : GetFalsePos(); highlightBounds.X = highlightPos.x; highlightBounds.Y = highlightPos.y; - Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), black); + Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), + {0.0f, 0.0f, 0.0f, Tint.a}); Renderer->DrawRect(highlightBounds, HighlightTint); Renderer->DrawSprite(BoxSprite, GetTruePos(), Tint); - Renderer->DrawSprite(TrueSprite, GetTruePos(), trueTint); - Renderer->DrawSprite(FalseSprite, GetFalsePos(), falseTint); + Renderer->DrawSprite(TrueSprite, GetTruePos(), Tint, glm::vec2(1.0f), 0.0f, + !State); + Renderer->DrawSprite(FalseSprite, GetFalsePos(), Tint, glm::vec2(1.0f), 0.0f, + State); } void OptionsBinaryButton::UpdateInput() {} diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.h b/src/ui/widgets/cclcc/optionsbinarybutton.h index 03f0c5dd6..365c9de1e 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.h +++ b/src/ui/widgets/cclcc/optionsbinarybutton.h @@ -12,7 +12,7 @@ class OptionsBinaryButton : public Widget { public: OptionsBinaryButton(const Sprite& box, const Sprite& trueLabel, const Sprite& falseLabel, const Sprite& label, - glm::vec2 pos); + glm::vec2 pos, glm::vec4 highlightTint); void Render() override; void UpdateInput() override; @@ -26,7 +26,7 @@ class OptionsBinaryButton : public Widget { const Sprite& FalseSprite; const Sprite& LabelSprite; - glm::vec4 HighlightTint = glm::vec4(0.94f, 0.49f, 0.59f, 1.0f); + glm::vec4 HighlightTint; bool State = true; }; diff --git a/src/ui/widgets/cclcc/optionsslider.cpp b/src/ui/widgets/cclcc/optionsslider.cpp index 7dabe4161..ea5a8d87a 100644 --- a/src/ui/widgets/cclcc/optionsslider.cpp +++ b/src/ui/widgets/cclcc/optionsslider.cpp @@ -11,17 +11,17 @@ namespace Widgets { namespace CCLCC { OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, - glm::vec2 pos) - : BoxSprite(box), LabelSprite(label) { + glm::vec2 pos, glm::vec4 highlightTint) + : BoxSprite(box), LabelSprite(label), HighlightTint(highlightTint) { Bounds = RectF(pos.x, pos.y, SliderTrackOffset.x + box.ScaledWidth(), LabelSprite.ScaledHeight()); } void OptionsSlider::Render() { HighlightTint.a = Tint.a; - glm::vec4 black = glm::vec4(0.0f, 0.0f, 0.0f, Tint.a); - Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), black); + Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), + {0.0f, 0.0f, 0.0f, Tint.a}); RectF highlightBounds( Bounds.X + SliderTrackOffset.x, Bounds.Y + SliderTrackOffset.y, diff --git a/src/ui/widgets/cclcc/optionsslider.h b/src/ui/widgets/cclcc/optionsslider.h index a00ee00d7..243411ef2 100644 --- a/src/ui/widgets/cclcc/optionsslider.h +++ b/src/ui/widgets/cclcc/optionsslider.h @@ -10,7 +10,8 @@ namespace CCLCC { class OptionsSlider : public Widget { public: - OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos); + OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, + glm::vec4 highlightTint); void Render() override; void UpdateInput() override; @@ -19,7 +20,7 @@ class OptionsSlider : public Widget { const Sprite& BoxSprite; const Sprite& LabelSprite; - glm::vec4 HighlightTint = glm::vec4(0.94f, 0.49f, 0.59f, 1.0f); + glm::vec4 HighlightTint; float Progress = 0.0f; }; From 1910453f77ce69aa688d30f32cdf9965cd3f83bd Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Tue, 12 Nov 2024 22:11:51 +0100 Subject: [PATCH 09/59] Implemented base of config movement --- CMakeLists.txt | 2 + profiles/cclcc/hud/optionsmenu.lua | 2 +- src/games/cclcc/optionsmenu.cpp | 43 ++++++++---------- src/games/cclcc/optionsmenu.h | 9 ++-- src/games/chlcc/optionsmenu.cpp | 4 ++ src/games/mo6tw/optionsmenu.cpp | 4 ++ src/ui/widgets/cclcc/optionsbinarybutton.cpp | 25 ++++++----- src/ui/widgets/cclcc/optionsbinarybutton.h | 7 +-- src/ui/widgets/cclcc/optionsentry.cpp | 46 ++++++++++++++++++++ src/ui/widgets/cclcc/optionsentry.h | 29 ++++++++++++ src/ui/widgets/cclcc/optionsslider.cpp | 12 ++--- src/ui/widgets/cclcc/optionsslider.h | 7 +-- src/vm/inst_misc.cpp | 8 ---- 13 files changed, 130 insertions(+), 68 deletions(-) create mode 100644 src/ui/widgets/cclcc/optionsentry.cpp create mode 100644 src/ui/widgets/cclcc/optionsentry.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a0fa78cfc..d01f83920 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,6 +244,7 @@ set(Impacto_Src src/ui/widgets/cc/backlogentry.cpp src/ui/widgets/cc/titlebutton.cpp src/ui/widgets/cclcc/titlebutton.cpp + src/ui/widgets/cclcc/optionsentry.cpp src/ui/widgets/cclcc/optionsbinarybutton.cpp src/ui/widgets/cclcc/optionsslider.cpp src/ui/widgets/cclcc/saveentrybutton.cpp @@ -558,6 +559,7 @@ set(Impacto_Header src/ui/widgets/cc/backlogentry.h src/ui/widgets/cc/titlebutton.h src/ui/widgets/cclcc/titlebutton.h + src/ui/widgets/cclcc/optionsentry.h src/ui/widgets/cclcc/optionsbinarybutton.h src/ui/widgets/cclcc/optionsslider.h diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 33a81aadd..b8c223319 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -11,7 +11,7 @@ root.OptionsMenu = { BackgroundPosition = { X = 179, Y = 0 }, PointerSprite = "OptionsPointer", - PointerOffset = { X = 89, Y = 5 }, + PointerOffset = { X = -89, Y = 5 }, HeaderSprite = "OptionsHeader", HeaderPosition = { X = 10, Y = 10 }, diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 273977651..6c2f31c50 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -31,7 +31,6 @@ OptionsMenu::OptionsMenu() { glm::vec4 highlightTint(HighlightColor, 1.0f); BasicPage = new Group(this); - BasicPage->FocusLock = false; for (int i = 0; i < 4; i++) { BasicPage->Add(new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, LabelSprites[i], pos, highlightTint), @@ -43,7 +42,6 @@ OptionsMenu::OptionsMenu() { pos = EntriesStartPosition; TextPage = new Group(this); - TextPage->FocusLock = false; for (int i = 4; i < 6; i++) { TextPage->Add(new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos, highlightTint), @@ -58,7 +56,6 @@ OptionsMenu::OptionsMenu() { pos = SoundEntriesStartPosition; SoundPage = new Group(this); - SoundPage->FocusLock = false; for (int i = 7; i < 15; i++) { Widget* widget = (i < 11 || i == 14) ? new OptionsSlider(SliderTrackSprite, LabelSprites[i], @@ -73,7 +70,6 @@ OptionsMenu::OptionsMenu() { Pages.push_back(SoundPage); VoicePage = new Group(this); - VoicePage->FocusLock = false; for (int i = 0; i < 12; i++) { glm::vec2 pos = VoicePosition; pos += VoiceEntriesOffset * glm::vec2(i % 3, i / 3); @@ -123,6 +119,7 @@ void OptionsMenu::Hide() { void OptionsMenu::Update(float dt) { UpdateInput(); + Pages.at(CurrentPage)->Update(dt); FadeAnimation.Update(dt); PoleAnimation.Update(dt); @@ -139,6 +136,19 @@ void OptionsMenu::Update(float dt) { GoToPage((CurrentPage + newPageOffset) % Pages.size()); } +void OptionsMenu::UpdateInput() { + bool nothingSelected = + CurrentlyFocusedElement == nullptr || + !static_cast(CurrentlyFocusedElement)->Selected; + if (nothingSelected && GetControlState(CT_Back)) { + SetFlag(SF_SUBMENUEXIT, true); + return; + } + + // Only able to move up and down if nothing is selected + if (nothingSelected) Menu::UpdateInput(); +} + void OptionsMenu::Render() { if (State != Hidden && ScrWork[SW_SYSSUBMENUCT] >= 32 && ScrWork[SW_SYSSUBMENUNO] == 5) { @@ -147,29 +157,9 @@ void OptionsMenu::Render() { Renderer->DrawSprite(BackgroundSprite, BackgroundPosition, col); Renderer->DrawSprite(HeaderSprite, HeaderPosition, col); - Renderer->DrawSprite(PageHeaderSprites[+CurrentPage], PageHeaderPosition, + Renderer->DrawSprite(PageHeaderSprites[CurrentPage], PageHeaderPosition, col); Pages.at(CurrentPage)->Render(); - /* - for (int i = 7; i < 15; i++) { - glm::vec2 pos = SoundEntriesStartPosition; - pos.y += SoundEntriesVerticalOffset * (i - 7); - - Renderer->DrawSprite(LabelSprites[i], pos, col); - - if (11 <= i && i <= 13) { - glm::vec2 boxPos = pos + BinaryBoxOffset; - - Renderer->DrawSprite(BinaryBoxSprite, boxPos, col); - Renderer->DrawSprite(YesSprite, boxPos, col); - Renderer->DrawSprite( - NoSprite, boxPos + glm::vec2(BinaryBoxSprite.ScaledWidth() / 2, 0), - col); - } else { - Renderer->DrawSprite(SliderTrackSprite, pos + SliderTrackOffset, col); - } - } - */ Renderer->DrawSprite(PoleAnimation.CurrentSprite(), PagePanelPosition, col); @@ -180,7 +170,7 @@ void OptionsMenu::Render() { void OptionsMenu::GoToPage(int pageNumber) { if (CurrentPage == pageNumber) return; - Pages.at(CurrentPage)->HasFocus = false; + Pages.at(CurrentPage)->Hide(); CurrentPage = pageNumber; Group& page = *Pages.at(CurrentPage); @@ -188,6 +178,7 @@ void OptionsMenu::GoToPage(int pageNumber) { page.HasFocus = true; page.Show(); + if (CurrentlyFocusedElement) CurrentlyFocusedElement->Hide(); CurrentlyFocusedElement = page.GetFirstFocusableChild(); CurrentlyFocusedElement->HasFocus = true; } diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index 5cfb59f4a..3022992a4 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -12,10 +12,11 @@ class OptionsMenu : public Menu { public: OptionsMenu(); - void Show(); - void Hide(); - void Update(float dt); - void Render(); + void Show() override; + void Hide() override; + void Update(float dt) override; + void UpdateInput() override; + void Render() override; private: void GoToPage(int pageNumber); diff --git a/src/games/chlcc/optionsmenu.cpp b/src/games/chlcc/optionsmenu.cpp index f5fe40a8b..5025ad195 100644 --- a/src/games/chlcc/optionsmenu.cpp +++ b/src/games/chlcc/optionsmenu.cpp @@ -131,6 +131,10 @@ void OptionsMenu::Update(float dt) { TitleFade.Update(dt); UpdateTitles(); } + + if (GetControlState(CT_Back)) { + SetFlag(SF_SUBMENUEXIT, true); + } } inline void OptionsMenu::DrawCircles() { diff --git a/src/games/mo6tw/optionsmenu.cpp b/src/games/mo6tw/optionsmenu.cpp index 2b854b105..d4490b13c 100644 --- a/src/games/mo6tw/optionsmenu.cpp +++ b/src/games/mo6tw/optionsmenu.cpp @@ -377,6 +377,10 @@ void OptionsMenu::Update(float dt) { } } } + + if (GetControlState(CT_Back)) { + SetFlag(SF_SUBMENUEXIT, true); + } } void OptionsMenu::Render() { diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index 790055a97..9ca1a9914 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -2,8 +2,10 @@ #include "../../../profile/games/cclcc/optionsmenu.h" #include "../../../renderer/renderer.h" +#include "../../../vm/interface/input.h" using namespace Impacto::Profile::CCLCC::OptionsMenu; +using namespace Impacto::Vm::Interface; namespace Impacto { namespace UI { @@ -15,13 +17,11 @@ OptionsBinaryButton::OptionsBinaryButton(const Sprite& box, const Sprite& falseLabel, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint) - : BoxSprite(box), + : OptionsEntry(label, pos, highlightTint), + BoxSprite(box), TrueSprite(trueLabel), - FalseSprite(falseLabel), - LabelSprite(label), - HighlightTint(highlightTint) { - Bounds = RectF(pos.x, pos.y, BinaryBoxOffset.x + BoxSprite.ScaledWidth(), - LabelSprite.ScaledHeight()); + FalseSprite(falseLabel) { + Bounds.Width = BinaryBoxOffset.x + BoxSprite.ScaledWidth(); } inline glm::vec2 OptionsBinaryButton::GetTruePos() const { @@ -34,7 +34,7 @@ inline glm::vec2 OptionsBinaryButton::GetFalsePos() const { } void OptionsBinaryButton::Render() { - HighlightTint.a = Tint.a; + OptionsEntry::Render(); RectF highlightBounds(0.0f, 0.0f, BoxSprite.ScaledWidth() / 2, BoxSprite.ScaledHeight()); @@ -42,9 +42,6 @@ void OptionsBinaryButton::Render() { highlightBounds.X = highlightPos.x; highlightBounds.Y = highlightPos.y; - Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), - {0.0f, 0.0f, 0.0f, Tint.a}); - Renderer->DrawRect(highlightBounds, HighlightTint); Renderer->DrawSprite(BoxSprite, GetTruePos(), Tint); @@ -54,7 +51,13 @@ void OptionsBinaryButton::Render() { State); } -void OptionsBinaryButton::UpdateInput() {} +void OptionsBinaryButton::UpdateInput() { + OptionsEntry::UpdateInput(); + if (!Selected) return; + + if (PADinputButtonWentDown & (PAD1LEFT | PAD1RIGHT)) + State = PADinputButtonWentDown & PAD1LEFT; +} } // namespace CCLCC } // namespace Widgets diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.h b/src/ui/widgets/cclcc/optionsbinarybutton.h index 365c9de1e..1460acd2f 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.h +++ b/src/ui/widgets/cclcc/optionsbinarybutton.h @@ -1,6 +1,6 @@ #pragma once -#include "../../widget.h" +#include "./optionsentry.h" #include "../../../spritesheet.h" namespace Impacto { @@ -8,7 +8,7 @@ namespace UI { namespace Widgets { namespace CCLCC { -class OptionsBinaryButton : public Widget { +class OptionsBinaryButton : public OptionsEntry { public: OptionsBinaryButton(const Sprite& box, const Sprite& trueLabel, const Sprite& falseLabel, const Sprite& label, @@ -24,9 +24,6 @@ class OptionsBinaryButton : public Widget { const Sprite& BoxSprite; const Sprite& TrueSprite; const Sprite& FalseSprite; - const Sprite& LabelSprite; - - glm::vec4 HighlightTint; bool State = true; }; diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp new file mode 100644 index 000000000..6af022132 --- /dev/null +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -0,0 +1,46 @@ +#include "optionsentry.h" + +#include "../../../profile/games/cclcc/optionsmenu.h" +#include "../../../renderer/renderer.h" +#include "../../../vm/interface/input.h" + +using namespace Impacto::Profile::CCLCC::OptionsMenu; +using namespace Impacto::Vm::Interface; + +namespace Impacto { +namespace UI { +namespace Widgets { +namespace CCLCC { + +OptionsEntry::OptionsEntry(const Sprite& label, glm::vec2 pos, + glm::vec4 highlightTint) + : LabelSprite(label), HighlightTint(highlightTint) { + Bounds = RectF(pos.x, pos.y, LabelSprite.ScaledWidth(), + LabelSprite.ScaledHeight()); +} + +void OptionsEntry::Render() { + HighlightTint.a = Tint.a; + + Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), + Selected ? Tint : glm::vec4(0.0f, 0.0f, 0.0f, Tint.a)); + if (HasFocus) + Renderer->DrawSprite(PointerSprite, Bounds.GetPos() + PointerOffset, Tint); +} + +void OptionsEntry::UpdateInput() { + if (!HasFocus) return; + + if (PADinputButtonWentDown & PAD1A) { + Selected = true; + } else if (PADinputButtonWentDown & PAD1B) { + Selected = false; + } +} + +void OptionsEntry::Hide() { Selected = false; } + +} // namespace CCLCC +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file diff --git a/src/ui/widgets/cclcc/optionsentry.h b/src/ui/widgets/cclcc/optionsentry.h new file mode 100644 index 000000000..018c16108 --- /dev/null +++ b/src/ui/widgets/cclcc/optionsentry.h @@ -0,0 +1,29 @@ +#pragma once + +#include "../../widget.h" +#include "../../../spritesheet.h" + +namespace Impacto { +namespace UI { +namespace Widgets { +namespace CCLCC { + +class OptionsEntry : public Widget { + public: + OptionsEntry(const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint); + + void Render() override; + void UpdateInput() override; + void Hide() override; + + bool Selected = false; + + protected: + const Sprite& LabelSprite; + glm::vec4 HighlightTint; +}; + +} // namespace CCLCC +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file diff --git a/src/ui/widgets/cclcc/optionsslider.cpp b/src/ui/widgets/cclcc/optionsslider.cpp index ea5a8d87a..ffd0bde84 100644 --- a/src/ui/widgets/cclcc/optionsslider.cpp +++ b/src/ui/widgets/cclcc/optionsslider.cpp @@ -12,16 +12,12 @@ namespace CCLCC { OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint) - : BoxSprite(box), LabelSprite(label), HighlightTint(highlightTint) { - Bounds = RectF(pos.x, pos.y, SliderTrackOffset.x + box.ScaledWidth(), - LabelSprite.ScaledHeight()); + : OptionsEntry(label, pos, highlightTint), BoxSprite(box) { + Bounds.Width = SliderTrackOffset.x + BoxSprite.ScaledWidth(); } void OptionsSlider::Render() { - HighlightTint.a = Tint.a; - - Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), - {0.0f, 0.0f, 0.0f, Tint.a}); + OptionsEntry::Render(); RectF highlightBounds( Bounds.X + SliderTrackOffset.x, Bounds.Y + SliderTrackOffset.y, @@ -31,7 +27,7 @@ void OptionsSlider::Render() { Renderer->DrawSprite(BoxSprite, Bounds.GetPos() + SliderTrackOffset, Tint); } -void OptionsSlider::UpdateInput() {} +void OptionsSlider::UpdateInput() { OptionsEntry::UpdateInput(); } } // namespace CCLCC } // namespace Widgets diff --git a/src/ui/widgets/cclcc/optionsslider.h b/src/ui/widgets/cclcc/optionsslider.h index 243411ef2..9dc1f3d37 100644 --- a/src/ui/widgets/cclcc/optionsslider.h +++ b/src/ui/widgets/cclcc/optionsslider.h @@ -1,6 +1,6 @@ #pragma once -#include "../../widget.h" +#include "./optionsentry.h" #include "../../../spritesheet.h" namespace Impacto { @@ -8,7 +8,7 @@ namespace UI { namespace Widgets { namespace CCLCC { -class OptionsSlider : public Widget { +class OptionsSlider : public OptionsEntry { public: OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint); @@ -18,9 +18,6 @@ class OptionsSlider : public Widget { private: const Sprite& BoxSprite; - const Sprite& LabelSprite; - - glm::vec4 HighlightTint; float Progress = 0.0f; }; diff --git a/src/vm/inst_misc.cpp b/src/vm/inst_misc.cpp index f3cb62caa..9d27f859e 100644 --- a/src/vm/inst_misc.cpp +++ b/src/vm/inst_misc.cpp @@ -212,14 +212,6 @@ VmInstruction(InstOption) { "STUB instruction Option(type: Init)\n"); break; case 1: - if (!((Interface::PADinputButtonWentDown & Interface::PAD1B) || - (Interface::PADinputMouseWentDown & Interface::PAD1B))) { - ResetInstruction; - BlockThread; - } else { - SetFlag(SF_SUBMENUEXIT, true); - Interface::PADinputButtonWentDown |= Interface::PAD1A; - } ImpLogSlow(LL_Warning, LC_VMStub, "STUB instruction Option(type: Main)\n"); break; From dd4e6fc27109528a9edf313faf547099324f1b7a Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Tue, 12 Nov 2024 22:54:04 +0100 Subject: [PATCH 10/59] Implemented config slider movement --- profiles/cclcc/hud/optionsmenu.lua | 1 + src/games/cclcc/optionsmenu.cpp | 4 ++-- src/profile/games/cclcc/optionsmenu.cpp | 1 + src/profile/games/cclcc/optionsmenu.h | 1 + src/ui/widgets/cclcc/optionsslider.cpp | 19 ++++++++++++++++--- src/ui/widgets/cclcc/optionsslider.h | 5 +++-- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index b8c223319..884e949cf 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -29,6 +29,7 @@ root.OptionsMenu = { VoiceSliderOffset = { X = 111, Y = 56 }, BinaryBoxSprite = "OptionsBinaryBox", BinaryBoxOffset = { X = 812, Y = 2 }, + SliderSpeed = 1.0, SkipReadSprite = "OptionsSkipRead", SkipAllSprite = "OptionsSkipAll", diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 6c2f31c50..823f55ae9 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -44,7 +44,7 @@ OptionsMenu::OptionsMenu() { TextPage = new Group(this); for (int i = 4; i < 6; i++) { TextPage->Add(new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos, - highlightTint), + highlightTint, SliderSpeed), FDIR_DOWN); pos.y += EntriesVerticalOffset; @@ -59,7 +59,7 @@ OptionsMenu::OptionsMenu() { for (int i = 7; i < 15; i++) { Widget* widget = (i < 11 || i == 14) ? new OptionsSlider(SliderTrackSprite, LabelSprites[i], - pos, highlightTint) + pos, highlightTint, SliderSpeed) : widget = new OptionsBinaryButton( BinaryBoxSprite, YesSprite, NoSprite, LabelSprites[i], pos, highlightTint); diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index 216d5e031..93b2f671e 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -38,6 +38,7 @@ void Configure() { VoiceSliderOffset = EnsureGetMemberVec2("VoiceSliderOffset"); BinaryBoxSprite = EnsureGetMemberSprite("BinaryBoxSprite"); BinaryBoxOffset = EnsureGetMemberVec2("BinaryBoxOffset"); + SliderSpeed = EnsureGetMemberFloat("SliderSpeed"); SkipReadSprite = EnsureGetMemberSprite("SkipReadSprite"); SkipAllSprite = EnsureGetMemberSprite("SkipAllSprite"); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 78f174ad3..0b0d72fac 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -37,6 +37,7 @@ inline Sprite VoiceSliderTrackSprite; inline glm::vec2 VoiceSliderOffset; inline Sprite BinaryBoxSprite; inline glm::vec2 BinaryBoxOffset; +inline float SliderSpeed; inline Sprite SkipReadSprite; inline Sprite SkipAllSprite; diff --git a/src/ui/widgets/cclcc/optionsslider.cpp b/src/ui/widgets/cclcc/optionsslider.cpp index ffd0bde84..1c15b5468 100644 --- a/src/ui/widgets/cclcc/optionsslider.cpp +++ b/src/ui/widgets/cclcc/optionsslider.cpp @@ -2,8 +2,10 @@ #include "../../../profile/games/cclcc/optionsmenu.h" #include "../../../renderer/renderer.h" +#include "../../../vm/interface/input.h" using namespace Impacto::Profile::CCLCC::OptionsMenu; +using namespace Impacto::Vm::Interface; namespace Impacto { namespace UI { @@ -11,8 +13,11 @@ namespace Widgets { namespace CCLCC { OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, - glm::vec2 pos, glm::vec4 highlightTint) - : OptionsEntry(label, pos, highlightTint), BoxSprite(box) { + glm::vec2 pos, glm::vec4 highlightTint, + float sliderSpeed) + : OptionsEntry(label, pos, highlightTint), + BoxSprite(box), + SliderSpeed(sliderSpeed) { Bounds.Width = SliderTrackOffset.x + BoxSprite.ScaledWidth(); } @@ -27,7 +32,15 @@ void OptionsSlider::Render() { Renderer->DrawSprite(BoxSprite, Bounds.GetPos() + SliderTrackOffset, Tint); } -void OptionsSlider::UpdateInput() { OptionsEntry::UpdateInput(); } +void OptionsSlider::Update(float dt) { + OptionsEntry::Update(dt); + if (!Selected) return; + + int slideDirection = (bool)(PADinputButtonIsDown & PAD1RIGHT) - + (bool)(PADinputButtonIsDown & PAD1LEFT); + Progress = + std::clamp(Progress + slideDirection * SliderSpeed * dt, 0.0f, 1.0f); +} } // namespace CCLCC } // namespace Widgets diff --git a/src/ui/widgets/cclcc/optionsslider.h b/src/ui/widgets/cclcc/optionsslider.h index 9dc1f3d37..9333d2169 100644 --- a/src/ui/widgets/cclcc/optionsslider.h +++ b/src/ui/widgets/cclcc/optionsslider.h @@ -11,15 +11,16 @@ namespace CCLCC { class OptionsSlider : public OptionsEntry { public: OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, - glm::vec4 highlightTint); + glm::vec4 highlightTint, float sliderSpeed); void Render() override; - void UpdateInput() override; + void Update(float dt) override; private: const Sprite& BoxSprite; float Progress = 0.0f; + float SliderSpeed = 1.0f; }; } // namespace CCLCC From 73a344d27ac388c80be473324f3a1b7f28ff7541 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Wed, 13 Nov 2024 01:01:09 +0100 Subject: [PATCH 11/59] Added character voice page --- CMakeLists.txt | 2 + profiles/cclcc/hud/optionsmenu.lua | 4 +- src/games/cclcc/optionsmenu.cpp | 46 ++++++++++++++++++-- src/ui/widgets/cclcc/optionsslider.h | 2 +- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 48 +++++++++++++++++++++ src/ui/widgets/cclcc/optionsvoiceslider.h | 29 +++++++++++++ 6 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 src/ui/widgets/cclcc/optionsvoiceslider.cpp create mode 100644 src/ui/widgets/cclcc/optionsvoiceslider.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d01f83920..61bb515de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,6 +247,7 @@ set(Impacto_Src src/ui/widgets/cclcc/optionsentry.cpp src/ui/widgets/cclcc/optionsbinarybutton.cpp src/ui/widgets/cclcc/optionsslider.cpp + src/ui/widgets/cclcc/optionsvoiceslider.cpp src/ui/widgets/cclcc/saveentrybutton.cpp src/ui/widgets/cclcc/sysmenubutton.cpp src/ui/widgets/cclcc/tipsentrybutton.cpp @@ -562,6 +563,7 @@ set(Impacto_Header src/ui/widgets/cclcc/optionsentry.h src/ui/widgets/cclcc/optionsbinarybutton.h src/ui/widgets/cclcc/optionsslider.h + src/ui/widgets/cclcc/optionsvoiceslider.h src/renderer/3d/camera.h src/renderer/3d/model.h diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 884e949cf..0987145bf 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -26,7 +26,7 @@ root.OptionsMenu = { SliderTrackSprite = "OptionsSliderTrack", SliderTrackOffset = { X = 664, Y = 2 }, VoiceSliderTrackSprite = "OptionsVoiceSliderTrack", - VoiceSliderOffset = { X = 111, Y = 56 }, + VoiceSliderOffset = { X = 110, Y = 55 }, BinaryBoxSprite = "OptionsBinaryBox", BinaryBoxOffset = { X = 812, Y = 2 }, SliderSpeed = 1.0, @@ -207,7 +207,7 @@ for i = 0, 25 do root.Sprites["OptionsPortrait" .. i] = { Sheet = "ConfigEx", Bounds = { - X = 768 + (width + 1) * i, + X = 768 + (width + 1) * (i // 2), Y = ((i % 2 == 0) and {2256} or {2357})[1], Width = width, Height = width diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 823f55ae9..3fde5d48f 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -6,6 +6,7 @@ #include "../../vm/interface/input.h" #include "../../ui/widgets/cclcc/optionsbinarybutton.h" #include "../../ui/widgets/cclcc/optionsslider.h" +#include "../../ui/widgets/cclcc/optionsvoiceslider.h" namespace Impacto { namespace UI { @@ -70,12 +71,47 @@ OptionsMenu::OptionsMenu() { Pages.push_back(SoundPage); VoicePage = new Group(this); - for (int i = 0; i < 12; i++) { + constexpr int columns = 3; + constexpr int entries = 12; + for (int i = 0; i < entries; i++) { glm::vec2 pos = VoicePosition; - pos += VoiceEntriesOffset * glm::vec2(i % 3, i / 3); + pos += VoiceEntriesOffset * glm::vec2(i % columns, i / columns); - VoicePage->Add(new Label(NametagSprites[i], pos), FDIR_RIGHT); + Widget* widget = new OptionsVoiceSlider( + VoiceSliderTrackSprite, NametagSprites[i], PortraitSprites[2 * i], + PortraitSprites[2 * i + 1], pos, highlightTint, SliderSpeed); + VoicePage->Add(widget, FDIR_RIGHT); } + + // Loop separately to overwrite the direction set at initial adding + // First entry won't set anything; skip + for (int i = 1; i < entries; i++) { + Widget* const widget = VoicePage->Children.at(i); + + if (i % columns != 0) { // Not on first column + Widget* const leftWidget = VoicePage->Children.at(i - 1); + widget->SetFocus(leftWidget, FDIR_LEFT); + leftWidget->SetFocus(widget, FDIR_RIGHT); + + if (i % columns == columns - 1) { // On last column + Widget* const rowStart = VoicePage->Children.at(i - columns + 1); + widget->SetFocus(rowStart, FDIR_RIGHT); + rowStart->SetFocus(widget, FDIR_LEFT); + } + } + if (i >= columns) { // Not on first row + Widget* const upWidget = VoicePage->Children.at(i - columns); + widget->SetFocus(upWidget, FDIR_UP); + upWidget->SetFocus(widget, FDIR_DOWN); + + if (i >= entries - columns) { // On last layer + Widget* const columnStart = VoicePage->Children.at(i % columns); + widget->SetFocus(columnStart, FDIR_DOWN); + columnStart->SetFocus(widget, FDIR_UP); + } + } + } + Pages.push_back(VoicePage); CurrentPage = 0; @@ -163,7 +199,9 @@ void OptionsMenu::Render() { Renderer->DrawSprite(PoleAnimation.CurrentSprite(), PagePanelPosition, col); - Renderer->DrawSprite(GuideSprite, GuidePosition, col); + const Sprite& guideSprite = + CurrentPage == 3 ? VoiceGuideSprite : GuideSprite; + Renderer->DrawSprite(guideSprite, GuidePosition, col); } } diff --git a/src/ui/widgets/cclcc/optionsslider.h b/src/ui/widgets/cclcc/optionsslider.h index 9333d2169..627734fb0 100644 --- a/src/ui/widgets/cclcc/optionsslider.h +++ b/src/ui/widgets/cclcc/optionsslider.h @@ -16,7 +16,7 @@ class OptionsSlider : public OptionsEntry { void Render() override; void Update(float dt) override; - private: + protected: const Sprite& BoxSprite; float Progress = 0.0f; diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp new file mode 100644 index 000000000..a7c75f18b --- /dev/null +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -0,0 +1,48 @@ +#include "optionsvoiceslider.h" + +#include "../../../profile/games/cclcc/optionsmenu.h" +#include "../../../renderer/renderer.h" +#include "../../../vm/interface/input.h" + +using namespace Impacto::Profile::CCLCC::OptionsMenu; +using namespace Impacto::Vm::Interface; + +namespace Impacto { +namespace UI { +namespace Widgets { +namespace CCLCC { + +OptionsVoiceSlider::OptionsVoiceSlider(const Sprite& box, const Sprite& label, + const Sprite& portrait, + const Sprite& mutedPortrait, + glm::vec2 pos, glm::vec4 highlightTint, + float sliderSpeed) + : OptionsSlider(box, label, pos, highlightTint, sliderSpeed), + Portrait(portrait), + MutedPortrait(mutedPortrait) {} + +void OptionsVoiceSlider::Render() { + HighlightTint.a = Tint.a; + + Renderer->DrawSprite(Muted ? MutedPortrait : Portrait, Bounds.GetPos(), Tint); + Renderer->DrawSprite(LabelSprite, Bounds.GetPos() + NametagOffset, + Selected ? Tint : glm::vec4(0.0f, 0.0f, 0.0f, Tint.a)); + + RectF highlightBounds( + Bounds.X + VoiceSliderOffset.x, Bounds.Y + VoiceSliderOffset.y, + Progress * BoxSprite.ScaledWidth(), BoxSprite.ScaledHeight()); + Renderer->DrawRect(highlightBounds, HighlightTint); + Renderer->DrawSprite(BoxSprite, Bounds.GetPos() + VoiceSliderOffset, Tint); +} + +void OptionsVoiceSlider::UpdateInput() { + OptionsEntry::UpdateInput(); + if (!Selected) return; + + Muted ^= (bool)(PADinputButtonWentDown & PAD1Y); +} + +} // namespace CCLCC +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.h b/src/ui/widgets/cclcc/optionsvoiceslider.h new file mode 100644 index 000000000..a49543c42 --- /dev/null +++ b/src/ui/widgets/cclcc/optionsvoiceslider.h @@ -0,0 +1,29 @@ +#pragma once + +#include "./optionsslider.h" +#include "../../../spritesheet.h" + +namespace Impacto { +namespace UI { +namespace Widgets { +namespace CCLCC { + +class OptionsVoiceSlider : public OptionsSlider { + public: + OptionsVoiceSlider(const Sprite& box, const Sprite& label, + const Sprite& portrait, const Sprite& mutedPortrait, + glm::vec2 pos, glm::vec4 highlightTint, float sliderSpeed); + void Render() override; + void UpdateInput() override; + + private: + const Sprite& Portrait; + const Sprite& MutedPortrait; + + bool Muted = false; +}; + +} // namespace CCLCC +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file From 0bd03d2fcdf33338621b03fea710a93dac49958b Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Wed, 13 Nov 2024 23:38:50 +0100 Subject: [PATCH 12/59] Added highlight boxes --- profiles/cclcc/hud/optionsmenu.lua | 22 +++++++++++-------- src/profile/games/cclcc/optionsmenu.cpp | 4 ++++ src/profile/games/cclcc/optionsmenu.h | 4 ++++ src/ui/widgets/cclcc/optionsentry.cpp | 21 +++++++++++------- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 11 +++++++++- src/util.h | 24 +++++++++++++++++++++ 6 files changed, 68 insertions(+), 18 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 0987145bf..edd28275f 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -11,7 +11,7 @@ root.OptionsMenu = { BackgroundPosition = { X = 179, Y = 0 }, PointerSprite = "OptionsPointer", - PointerOffset = { X = -89, Y = 5 }, + PointerOffset = { X = 13, Y = 2 }, HeaderSprite = "OptionsHeader", HeaderPosition = { X = 10, Y = 10 }, @@ -24,11 +24,11 @@ root.OptionsMenu = { PoleAnimation = "OptionsPoleAnimation", SliderTrackSprite = "OptionsSliderTrack", - SliderTrackOffset = { X = 664, Y = 2 }, + SliderTrackOffset = { X = 766, Y = 0 }, VoiceSliderTrackSprite = "OptionsVoiceSliderTrack", - VoiceSliderOffset = { X = 110, Y = 55 }, + VoiceSliderOffset = { X = 114, Y = 57 }, BinaryBoxSprite = "OptionsBinaryBox", - BinaryBoxOffset = { X = 812, Y = 2 }, + BinaryBoxOffset = { X = 914, Y = 0 }, SliderSpeed = 1.0, SkipReadSprite = "OptionsSkipRead", @@ -42,17 +42,21 @@ root.OptionsMenu = { VoiceGuideSprite = "OptionsVoiceGuide", GuidePosition = { X = 0, Y = 986 }, - EntriesStartPosition = { X = 521, Y = 311 }, + EntriesStartPosition = { X = 419, Y = 313 }, EntriesVerticalOffset = 126, - SoundEntriesStartPosition = { X = 521, Y = 331 }, + SoundEntriesStartPosition = { X = 419, Y = 333 }, SoundEntriesVerticalOffset = 70, VoiceEntriesOffset = { X = 408, Y = 160 }, + EntryDimensions = { X = 1212, Y = 50 }, + VoiceEntryDimensions = { X = 374, Y = 104 }, LabelSprites = {}, + LabelOffset = { X = 102, Y = -2 }, NametagSprites = {}, - NametagOffset = { X = 112, Y = 2 }, + NametagOffset = { X = 116, Y = 4 }, PortraitSprites = {}, - VoicePosition = { X = 458, Y = 312 }, + PortraitOffset = { X = 3, Y = 2 }, + VoicePosition = { X = 454, Y = 310 }, }; root.Sprites["OptionsBackground"] = { @@ -77,7 +81,7 @@ root.Sprites["OptionsBinaryBox"] = { root.Sprites["OptionsPointer"] = { Sheet = "Config", - Bounds = { X = 697, Y = 1241, Width = 71, Height = 43 } + Bounds = { X = 697, Y = 1241, Width = 71, Height = 45 } }; root.Sprites["OptionsHeader"] = { diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index 93b2f671e..e5897fa68 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -56,11 +56,15 @@ void Configure() { SoundEntriesStartPosition = EnsureGetMemberVec2("SoundEntriesStartPosition"); SoundEntriesVerticalOffset = EnsureGetMemberInt("SoundEntriesVerticalOffset"); VoiceEntriesOffset = EnsureGetMemberVec2("VoiceEntriesOffset"); + EntryDimensions = EnsureGetMemberVec2("EntryDimensions"); + VoiceEntryDimensions = EnsureGetMemberVec2("VoiceEntryDimensions"); GetMemberSpriteArray(LabelSprites, LabelSpriteCount, "LabelSprites"); + LabelOffset = EnsureGetMemberVec2("LabelOffset"); GetMemberSpriteArray(NametagSprites, NametagSpriteCount, "NametagSprites"); NametagOffset = EnsureGetMemberVec2("NametagOffset"); GetMemberSpriteArray(PortraitSprites, PortraitSpriteCount, "PortraitSprites"); + PortraitOffset = EnsureGetMemberVec2("PortraitOffset"); VoicePosition = EnsureGetMemberVec2("VoicePosition"); auto drawType = Game::DrawComponentType::_from_integral_unchecked( diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 0b0d72fac..526c67b68 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -55,11 +55,15 @@ inline int EntriesVerticalOffset; inline glm::vec2 SoundEntriesStartPosition; inline int SoundEntriesVerticalOffset; inline glm::vec2 VoiceEntriesOffset; +inline glm::vec2 EntryDimensions; +inline glm::vec2 VoiceEntryDimensions; inline Sprite LabelSprites[LabelSpriteCount]; +inline glm::vec2 LabelOffset; inline Sprite NametagSprites[NametagSpriteCount]; inline glm::vec2 NametagOffset; inline Sprite PortraitSprites[PortraitSpriteCount]; +inline glm::vec2 PortraitOffset; inline glm::vec2 VoicePosition; void Configure(); diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index 6af022132..338f271ef 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -22,20 +22,25 @@ OptionsEntry::OptionsEntry(const Sprite& label, glm::vec2 pos, void OptionsEntry::Render() { HighlightTint.a = Tint.a; - Renderer->DrawSprite(LabelSprite, Bounds.GetPos(), - Selected ? Tint : glm::vec4(0.0f, 0.0f, 0.0f, Tint.a)); - if (HasFocus) + if (HasFocus) { + RectF highlightBoundBox(Bounds.X, Bounds.Y, EntryDimensions.x, + EntryDimensions.y); + Renderer->DrawRect(highlightBoundBox, HighlightTint); + Renderer->DrawRect(highlightBoundBox + RectF(2.0f, 2.0f, -4.0f, -4.0f), + glm::vec4(1.0f, 1.0f, 1.0f, Tint.a)); + Renderer->DrawSprite(PointerSprite, Bounds.GetPos() + PointerOffset, Tint); + } + + Renderer->DrawSprite(LabelSprite, Bounds.GetPos() + LabelOffset, + Selected ? Tint : glm::vec4(0.0f, 0.0f, 0.0f, Tint.a)); } void OptionsEntry::UpdateInput() { if (!HasFocus) return; - if (PADinputButtonWentDown & PAD1A) { - Selected = true; - } else if (PADinputButtonWentDown & PAD1B) { - Selected = false; - } + Selected ^= (bool)(PADinputButtonWentDown & PAD1A); + if (PADinputButtonWentDown & PAD1B) Selected = false; } void OptionsEntry::Hide() { Selected = false; } diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index a7c75f18b..efd3cbf52 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -24,7 +24,16 @@ OptionsVoiceSlider::OptionsVoiceSlider(const Sprite& box, const Sprite& label, void OptionsVoiceSlider::Render() { HighlightTint.a = Tint.a; - Renderer->DrawSprite(Muted ? MutedPortrait : Portrait, Bounds.GetPos(), Tint); + if (HasFocus) { + RectF highlightBoundBox(Bounds.X, Bounds.Y, VoiceEntryDimensions.x, + VoiceEntryDimensions.y); + Renderer->DrawRect(highlightBoundBox, HighlightTint); + Renderer->DrawRect(highlightBoundBox + RectF(2.0f, 2.0f, -4.0f, -4.0f), + glm::vec4(1.0f, 1.0f, 1.0f, Tint.a)); + } + + Renderer->DrawSprite(Muted ? MutedPortrait : Portrait, + Bounds.GetPos() + PortraitOffset, Tint); Renderer->DrawSprite(LabelSprite, Bounds.GetPos() + NametagOffset, Selected ? Tint : glm::vec4(0.0f, 0.0f, 0.0f, Tint.a)); diff --git a/src/util.h b/src/util.h index 4bc53701f..0d1f4c5f9 100644 --- a/src/util.h +++ b/src/util.h @@ -72,6 +72,30 @@ struct RectF { rect.Y + rect.Height <= Y + Height); } + constexpr RectF operator+(RectF const& other) const { + return RectF(X + other.X, Y + other.Y, Width + other.Width, + Height + other.Height); + } + + constexpr RectF operator-(RectF const& other) const { + return RectF(X - other.X, Y - other.Y, Width - other.Width, + Height - other.Height); + } + + constexpr void operator+=(RectF const& other) { + X += other.X; + Y += other.Y; + Width += other.Width; + Height += other.Height; + } + + constexpr void operator-=(RectF const& other) { + X -= other.X; + Y -= other.Y; + Width -= other.Width; + Height -= other.Height; + } + constexpr bool operator==(RectF const& other) const { return X == other.X && Y == other.Y && Width == other.Width && Height == other.Height; From d8fdd2a52b480e1fd19948a0f920ee8350e9c43e Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 16 Nov 2024 23:03:52 +0100 Subject: [PATCH 13/59] Allow for muting characters on hover --- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index efd3cbf52..f8d2ea67f 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -46,9 +46,8 @@ void OptionsVoiceSlider::Render() { void OptionsVoiceSlider::UpdateInput() { OptionsEntry::UpdateInput(); - if (!Selected) return; - Muted ^= (bool)(PADinputButtonWentDown & PAD1Y); + if (HasFocus) Muted ^= (bool)(PADinputButtonWentDown & PAD1Y); } } // namespace CCLCC From 6f5bd264fbba2cf2ad79004405aadfb36fc5eb5c Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 16 Nov 2024 23:33:53 +0100 Subject: [PATCH 14/59] Added page indicator lights --- profiles/cclcc/hud/optionsmenu.lua | 5 +++++ src/games/cclcc/optionsmenu.cpp | 5 +++++ src/profile/games/cclcc/optionsmenu.cpp | 6 ++++++ src/profile/games/cclcc/optionsmenu.h | 1 + 4 files changed, 17 insertions(+) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index edd28275f..6b7a7df26 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -22,6 +22,11 @@ root.OptionsMenu = { PagePanelPosition = { X = -114, Y = 0 }, PagePanelSprites = {}, PoleAnimation = "OptionsPoleAnimation", + -- TODO: Replace this once array fetching is implemented + PagePanelIconOffsets0 = { X = 259, Y = 73 }, + PagePanelIconOffsets1 = { X = 235, Y = 333 }, + PagePanelIconOffsets2 = { X = 261, Y = 585 }, + PagePanelIconOffsets3 = { X = 238, Y = 831 }, SliderTrackSprite = "OptionsSliderTrack", SliderTrackOffset = { X = 766, Y = 0 }, diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 3fde5d48f..28b82620f 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -198,6 +198,11 @@ void OptionsMenu::Render() { Pages.at(CurrentPage)->Render(); Renderer->DrawSprite(PoleAnimation.CurrentSprite(), PagePanelPosition, col); + if (PoleAnimation.IsIn()) { + Renderer->DrawSprite( + PagePanelSprites[2 * CurrentPage + !(bool)CurrentlyFocusedElement], + PagePanelPosition + PagePanelIconOffsets[CurrentPage], col); + } const Sprite& guideSprite = CurrentPage == 3 ? VoiceGuideSprite : GuideSprite; diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index e5897fa68..1eb554195 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -32,6 +32,12 @@ void Configure() { "PagePanelSprites"); PoleAnimation = EnsureGetMemberAnimation("PoleAnimation"); + // TODO: Replace this once array fetching is implemented + for (int i = 0; i < PagePanelSpriteCount / 2; i++) { + PagePanelIconOffsets[i] = EnsureGetMemberVec2( + ("PagePanelIconOffsets" + std::to_string(i)).c_str()); + } + SliderTrackSprite = EnsureGetMemberSprite("SliderTrackSprite"); SliderTrackOffset = EnsureGetMemberVec2("SliderTrackOffset"); VoiceSliderTrackSprite = EnsureGetMemberSprite("VoiceSliderTrackSprite"); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 526c67b68..6a9b692b0 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -29,6 +29,7 @@ inline glm::vec2 PageHeaderPosition; inline Sprite PagePanelSprite; inline glm::vec2 PagePanelPosition; inline Sprite PagePanelSprites[PagePanelSpriteCount]; +inline glm::vec2 PagePanelIconOffsets[PagePanelSpriteCount]; inline SpriteAnimationDef PoleAnimation; inline Sprite SliderTrackSprite; From 7b44293d802bb1b7d18d0d92eaeb19ecf2f315e6 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Tue, 17 Dec 2024 20:21:32 +0100 Subject: [PATCH 15/59] Fixed options entry highlighting and selecting behaviour --- src/games/cclcc/optionsmenu.cpp | 46 ++++++++++++++++----------- src/games/cclcc/optionsmenu.h | 3 ++ src/ui/widgets/cclcc/optionsentry.cpp | 5 ++- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 28b82620f..a6058ab6e 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -131,9 +131,6 @@ void OptionsMenu::Show() { } IsFocused = true; UI::FocusedMenu = this; - - CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; } } @@ -166,23 +163,40 @@ void OptionsMenu::Update(float dt) { ScrWork[SW_SYSSUBMENUNO] == 5) { Show(); } - - int newPageOffset = -(int)(bool)(PADinputButtonWentDown & PAD1L1) + - (int)(bool)(PADinputButtonWentDown & PAD1R1); - GoToPage((CurrentPage + newPageOffset) % Pages.size()); } void OptionsMenu::UpdateInput() { - bool nothingSelected = - CurrentlyFocusedElement == nullptr || - !static_cast(CurrentlyFocusedElement)->Selected; - if (nothingSelected && GetControlState(CT_Back)) { - SetFlag(SF_SUBMENUEXIT, true); + if (CurrentlyFocusedElement == nullptr) { + if (GetControlState(CT_Back)) { + SetFlag(SF_SUBMENUEXIT, true); + return; + } + + const int direction = (bool)(PADinputButtonWentDown & PAD1DOWN) - + (bool)(PADinputButtonWentDown & PAD1UP); + if (direction) GoToPage((CurrentPage + direction) % Pages.size()); + + if (PADinputButtonWentDown & PAD1A) { + // Don't have anything else consume the confirmation + PADinputButtonWentDown &= ~PAD1A; + + CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); + CurrentlyFocusedElement->HasFocus = true; + } + + return; + } + + // If something is selected, the option entry takes full control + if (static_cast(CurrentlyFocusedElement)->Selected) return; + + if (GetControlState(CT_Back)) { + static_cast(CurrentlyFocusedElement)->Hide(); + CurrentlyFocusedElement = nullptr; return; } - // Only able to move up and down if nothing is selected - if (nothingSelected) Menu::UpdateInput(); + Menu::UpdateInput(); } void OptionsMenu::Render() { @@ -220,10 +234,6 @@ void OptionsMenu::GoToPage(int pageNumber) { page.HasFocus = true; page.Show(); - - if (CurrentlyFocusedElement) CurrentlyFocusedElement->Hide(); - CurrentlyFocusedElement = page.GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; } } // namespace CCLCC diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index 3022992a4..58e2c06b3 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -3,6 +3,9 @@ #include "../../ui/menu.h" #include "../../spriteanimation.h" #include "../../ui/widgets/group.h" +#include "../../ui/widgets/cclcc/optionsentry.h" + +using namespace Impacto::UI::Widgets::CCLCC; namespace Impacto { namespace UI { diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index 338f271ef..a4f79bbbe 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -43,7 +43,10 @@ void OptionsEntry::UpdateInput() { if (PADinputButtonWentDown & PAD1B) Selected = false; } -void OptionsEntry::Hide() { Selected = false; } +void OptionsEntry::Hide() { + Widget::Hide(); + Selected = false; +} } // namespace CCLCC } // namespace Widgets From 681e186dcbf42c94a18809f7615a4e970dd6b1da Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Wed, 18 Dec 2024 02:28:53 +0100 Subject: [PATCH 16/59] Implemented mouse input for OptionsEntry --- CMakeLists.txt | 2 + src/games/cclcc/optionsmenu.cpp | 44 +++++++++++----- src/games/cclcc/optionsmenu.h | 1 + src/ui/widget.h | 2 +- src/ui/widgets/cclcc/optionsbinarybutton.cpp | 54 ++++++++++++-------- src/ui/widgets/cclcc/optionsbinarybutton.h | 14 +++-- src/ui/widgets/cclcc/optionsentry.cpp | 17 ++++-- src/ui/widgets/cclcc/optionsentry.h | 10 +++- src/ui/widgets/cclcc/optionsslider.cpp | 6 ++- src/ui/widgets/cclcc/optionsslider.h | 3 +- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 17 +++--- src/ui/widgets/cclcc/optionsvoiceslider.h | 3 +- src/ui/widgets/clickbutton.cpp | 34 ++++++++++++ src/ui/widgets/clickbutton.h | 26 ++++++++++ 14 files changed, 178 insertions(+), 55 deletions(-) create mode 100644 src/ui/widgets/clickbutton.cpp create mode 100644 src/ui/widgets/clickbutton.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 61bb515de..d88a6e522 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -226,6 +226,7 @@ set(Impacto_Src src/ui/widgets/group.cpp src/ui/widgets/carousel.cpp src/ui/widgets/cgviewer.cpp + src/ui/widgets/clickbutton.cpp src/ui/widgets/mo6tw/titlebutton.cpp src/ui/widgets/mo6tw/saveentrybutton.cpp src/ui/widgets/mo6tw/tipsentrybutton.cpp @@ -542,6 +543,7 @@ set(Impacto_Header src/ui/widgets/group.h src/ui/widgets/carousel.h src/ui/widgets/cgviewer.h + src/ui/widgets/clickbutton.h src/ui/widgets/mo6tw/titlebutton.h src/ui/widgets/mo6tw/saveentrybutton.h src/ui/widgets/mo6tw/tipsentrybutton.h diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index a6058ab6e..875031882 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -30,12 +30,15 @@ OptionsMenu::OptionsMenu() { Pages.reserve(4); glm::vec2 pos = EntriesStartPosition; glm::vec4 highlightTint(HighlightColor, 1.0f); + std::function select = + std::bind(&OptionsMenu::Select, this, std::placeholders::_1); BasicPage = new Group(this); for (int i = 0; i < 4; i++) { - BasicPage->Add(new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, - LabelSprites[i], pos, highlightTint), - FDIR_DOWN); + BasicPage->Add( + new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, + LabelSprites[i], pos, highlightTint, select), + FDIR_DOWN); pos.y += EntriesVerticalOffset; } @@ -45,25 +48,27 @@ OptionsMenu::OptionsMenu() { TextPage = new Group(this); for (int i = 4; i < 6; i++) { TextPage->Add(new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos, - highlightTint, SliderSpeed), + highlightTint, SliderSpeed, select), FDIR_DOWN); pos.y += EntriesVerticalOffset; } - TextPage->Add(new OptionsBinaryButton(BinaryBoxSprite, YesSprite, NoSprite, - LabelSprites[6], pos, highlightTint), - FDIR_DOWN); + TextPage->Add( + new OptionsBinaryButton(BinaryBoxSprite, YesSprite, NoSprite, + LabelSprites[6], pos, highlightTint, select), + FDIR_DOWN); Pages.push_back(TextPage); pos = SoundEntriesStartPosition; SoundPage = new Group(this); for (int i = 7; i < 15; i++) { - Widget* widget = (i < 11 || i == 14) - ? new OptionsSlider(SliderTrackSprite, LabelSprites[i], - pos, highlightTint, SliderSpeed) - : widget = new OptionsBinaryButton( - BinaryBoxSprite, YesSprite, NoSprite, - LabelSprites[i], pos, highlightTint); + Widget* widget = + (i < 11 || i == 14) + ? new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos, + highlightTint, SliderSpeed, select) + : widget = new OptionsBinaryButton(BinaryBoxSprite, YesSprite, + NoSprite, LabelSprites[i], pos, + highlightTint, select); SoundPage->Add(widget, FDIR_DOWN); pos.y += SoundEntriesVerticalOffset; @@ -79,7 +84,7 @@ OptionsMenu::OptionsMenu() { Widget* widget = new OptionsVoiceSlider( VoiceSliderTrackSprite, NametagSprites[i], PortraitSprites[2 * i], - PortraitSprites[2 * i + 1], pos, highlightTint, SliderSpeed); + PortraitSprites[2 * i + 1], pos, highlightTint, SliderSpeed, select); VoicePage->Add(widget, FDIR_RIGHT); } @@ -236,6 +241,17 @@ void OptionsMenu::GoToPage(int pageNumber) { page.Show(); } +void OptionsMenu::Select(OptionsEntry* toSelect) { + for (Widget* entry : Pages.at(CurrentPage)->Children) { + const bool select = entry == toSelect; + + static_cast(entry)->Selected = select; + entry->HasFocus = select; + } + + CurrentlyFocusedElement = toSelect; +} + } // namespace CCLCC } // namespace UI } // namespace Impacto \ No newline at end of file diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index 58e2c06b3..df51a2994 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -23,6 +23,7 @@ class OptionsMenu : public Menu { private: void GoToPage(int pageNumber); + void Select(OptionsEntry* entry); Animation FadeAnimation; SpriteAnimation PoleAnimation; diff --git a/src/ui/widget.h b/src/ui/widget.h index f08f4f25c..e18ac8c0d 100644 --- a/src/ui/widget.h +++ b/src/ui/widget.h @@ -24,7 +24,7 @@ class Widget { virtual void Update(float dt); virtual void UpdateInput() = 0; - virtual void Render() = 0; + virtual void Render() {} virtual void Show(); virtual void Hide(); diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index 9ca1a9914..b7255136c 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -3,6 +3,7 @@ #include "../../../profile/games/cclcc/optionsmenu.h" #include "../../../renderer/renderer.h" #include "../../../vm/interface/input.h" +#include "../../../inputsystem.h" using namespace Impacto::Profile::CCLCC::OptionsMenu; using namespace Impacto::Vm::Interface; @@ -12,25 +13,28 @@ namespace UI { namespace Widgets { namespace CCLCC { -OptionsBinaryButton::OptionsBinaryButton(const Sprite& box, - const Sprite& trueLabel, - const Sprite& falseLabel, - const Sprite& label, glm::vec2 pos, - glm::vec4 highlightTint) - : OptionsEntry(label, pos, highlightTint), +OptionsBinaryButton::OptionsBinaryButton( + const Sprite& box, const Sprite& trueLabel, const Sprite& falseLabel, + const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, + std::function select) + : OptionsEntry(label, pos, highlightTint, select), BoxSprite(box), TrueSprite(trueLabel), FalseSprite(falseLabel) { Bounds.Width = BinaryBoxOffset.x + BoxSprite.ScaledWidth(); -} - -inline glm::vec2 OptionsBinaryButton::GetTruePos() const { - return Bounds.GetPos() + BinaryBoxOffset; -} + EntryButton.Bounds.Width = Bounds.Width; -inline glm::vec2 OptionsBinaryButton::GetFalsePos() const { - return Bounds.GetPos() + BinaryBoxOffset + - glm::vec2(BoxSprite.ScaledWidth() / 2, 0.0f); + glm::vec2 truePosition = pos + BinaryBoxOffset; + TrueButton = + ClickButton(0, + RectF(truePosition.x, truePosition.y, + TrueSprite.ScaledWidth(), TrueSprite.ScaledHeight()), + std::bind(&OptionsBinaryButton::TrueOnClick, this, + std::placeholders::_1)); + FalseButton = ClickButton( + 0, TrueButton.Bounds + RectF(box.ScaledWidth() / 2.0f, 0.0f, 0.0f, 0.0f), + std::bind(&OptionsBinaryButton::FalseOnClick, this, + std::placeholders::_1)); } void OptionsBinaryButton::Render() { @@ -38,27 +42,37 @@ void OptionsBinaryButton::Render() { RectF highlightBounds(0.0f, 0.0f, BoxSprite.ScaledWidth() / 2, BoxSprite.ScaledHeight()); - glm::vec2 highlightPos = (State) ? GetTruePos() : GetFalsePos(); + glm::vec2 highlightPos = ((State) ? TrueButton : FalseButton).Bounds.GetPos(); highlightBounds.X = highlightPos.x; highlightBounds.Y = highlightPos.y; Renderer->DrawRect(highlightBounds, HighlightTint); - Renderer->DrawSprite(BoxSprite, GetTruePos(), Tint); + Renderer->DrawSprite(BoxSprite, TrueButton.Bounds.GetPos(), Tint); - Renderer->DrawSprite(TrueSprite, GetTruePos(), Tint, glm::vec2(1.0f), 0.0f, - !State); - Renderer->DrawSprite(FalseSprite, GetFalsePos(), Tint, glm::vec2(1.0f), 0.0f, - State); + Renderer->DrawSprite(TrueSprite, TrueButton.Bounds.GetPos(), Tint, + glm::vec2(1.0f), 0.0f, !State); + Renderer->DrawSprite(FalseSprite, FalseButton.Bounds.GetPos(), Tint, + glm::vec2(1.0f), 0.0f, State); } void OptionsBinaryButton::UpdateInput() { OptionsEntry::UpdateInput(); + + // Handle mouse/touch input + TrueButton.UpdateInput(); + FalseButton.UpdateInput(); + if (!Selected) return; + // Handle keyboard/controller input if (PADinputButtonWentDown & (PAD1LEFT | PAD1RIGHT)) State = PADinputButtonWentDown & PAD1LEFT; } +void OptionsBinaryButton::TrueOnClick(ClickButton* target) { State = true; } + +void OptionsBinaryButton::FalseOnClick(ClickButton* target) { State = false; } + } // namespace CCLCC } // namespace Widgets } // namespace UI diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.h b/src/ui/widgets/cclcc/optionsbinarybutton.h index 1460acd2f..4751e6372 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.h +++ b/src/ui/widgets/cclcc/optionsbinarybutton.h @@ -1,6 +1,7 @@ #pragma once #include "./optionsentry.h" +#include "../clickbutton.h" #include "../../../spritesheet.h" namespace Impacto { @@ -12,19 +13,24 @@ class OptionsBinaryButton : public OptionsEntry { public: OptionsBinaryButton(const Sprite& box, const Sprite& trueLabel, const Sprite& falseLabel, const Sprite& label, - glm::vec2 pos, glm::vec4 highlightTint); + glm::vec2 pos, glm::vec4 highlightTint, + std::function select); void Render() override; void UpdateInput() override; private: - inline glm::vec2 GetTruePos() const; - inline glm::vec2 GetFalsePos() const; + ClickButton TrueButton; + ClickButton FalseButton; - const Sprite& BoxSprite; const Sprite& TrueSprite; const Sprite& FalseSprite; + void TrueOnClick(ClickButton* target); + void FalseOnClick(ClickButton* target); + + const Sprite& BoxSprite; + bool State = true; }; diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index a4f79bbbe..3db76e52f 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -13,10 +13,15 @@ namespace Widgets { namespace CCLCC { OptionsEntry::OptionsEntry(const Sprite& label, glm::vec2 pos, - glm::vec4 highlightTint) - : LabelSprite(label), HighlightTint(highlightTint) { - Bounds = RectF(pos.x, pos.y, LabelSprite.ScaledWidth(), - LabelSprite.ScaledHeight()); + glm::vec4 highlightTint, + std::function select) + : LabelSprite(label), HighlightTint(highlightTint), Select(select) { + Bounds = RectF(pos.x, pos.y, LabelOffset.x + LabelSprite.ScaledWidth(), + LabelOffset.y + LabelSprite.ScaledHeight()); + + std::function onClick = + std::bind(&OptionsEntry::EntryButtonOnClick, this, std::placeholders::_1); + EntryButton = ClickButton(0, Bounds, onClick); } void OptionsEntry::Render() { @@ -37,6 +42,8 @@ void OptionsEntry::Render() { } void OptionsEntry::UpdateInput() { + EntryButton.UpdateInput(); + if (!HasFocus) return; Selected ^= (bool)(PADinputButtonWentDown & PAD1A); @@ -48,6 +55,8 @@ void OptionsEntry::Hide() { Selected = false; } +void OptionsEntry::EntryButtonOnClick(ClickButton* target) { Select(this); } + } // namespace CCLCC } // namespace Widgets } // namespace UI diff --git a/src/ui/widgets/cclcc/optionsentry.h b/src/ui/widgets/cclcc/optionsentry.h index 018c16108..8221b5a25 100644 --- a/src/ui/widgets/cclcc/optionsentry.h +++ b/src/ui/widgets/cclcc/optionsentry.h @@ -1,5 +1,8 @@ #pragma once +#include + +#include "../clickbutton.h" #include "../../widget.h" #include "../../../spritesheet.h" @@ -10,7 +13,8 @@ namespace CCLCC { class OptionsEntry : public Widget { public: - OptionsEntry(const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint); + OptionsEntry(const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, + std::function select); void Render() override; void UpdateInput() override; @@ -19,6 +23,10 @@ class OptionsEntry : public Widget { bool Selected = false; protected: + ClickButton EntryButton; + std::function Select; + void EntryButtonOnClick(ClickButton* target); + const Sprite& LabelSprite; glm::vec4 HighlightTint; }; diff --git a/src/ui/widgets/cclcc/optionsslider.cpp b/src/ui/widgets/cclcc/optionsslider.cpp index 1c15b5468..5cf58e22d 100644 --- a/src/ui/widgets/cclcc/optionsslider.cpp +++ b/src/ui/widgets/cclcc/optionsslider.cpp @@ -14,11 +14,13 @@ namespace CCLCC { OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, - float sliderSpeed) - : OptionsEntry(label, pos, highlightTint), + float sliderSpeed, + std::function select) + : OptionsEntry(label, pos, highlightTint, select), BoxSprite(box), SliderSpeed(sliderSpeed) { Bounds.Width = SliderTrackOffset.x + BoxSprite.ScaledWidth(); + EntryButton.Bounds.Width = Bounds.Width; } void OptionsSlider::Render() { diff --git a/src/ui/widgets/cclcc/optionsslider.h b/src/ui/widgets/cclcc/optionsslider.h index 627734fb0..676aac486 100644 --- a/src/ui/widgets/cclcc/optionsslider.h +++ b/src/ui/widgets/cclcc/optionsslider.h @@ -11,7 +11,8 @@ namespace CCLCC { class OptionsSlider : public OptionsEntry { public: OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, - glm::vec4 highlightTint, float sliderSpeed); + glm::vec4 highlightTint, float sliderSpeed, + std::function select); void Render() override; void Update(float dt) override; diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index f8d2ea67f..a9e34968f 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -12,14 +12,17 @@ namespace UI { namespace Widgets { namespace CCLCC { -OptionsVoiceSlider::OptionsVoiceSlider(const Sprite& box, const Sprite& label, - const Sprite& portrait, - const Sprite& mutedPortrait, - glm::vec2 pos, glm::vec4 highlightTint, - float sliderSpeed) - : OptionsSlider(box, label, pos, highlightTint, sliderSpeed), +OptionsVoiceSlider::OptionsVoiceSlider( + const Sprite& box, const Sprite& label, const Sprite& portrait, + const Sprite& mutedPortrait, glm::vec2 pos, glm::vec4 highlightTint, + float sliderSpeed, std::function select) + : OptionsSlider(box, label, pos, highlightTint, sliderSpeed, select), Portrait(portrait), - MutedPortrait(mutedPortrait) {} + MutedPortrait(mutedPortrait) { + Bounds = + RectF(Bounds.X, Bounds.Y, VoiceEntryDimensions.x, VoiceEntryDimensions.y); + EntryButton.Bounds = Bounds; +} void OptionsVoiceSlider::Render() { HighlightTint.a = Tint.a; diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.h b/src/ui/widgets/cclcc/optionsvoiceslider.h index a49543c42..123e718c2 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.h +++ b/src/ui/widgets/cclcc/optionsvoiceslider.h @@ -12,7 +12,8 @@ class OptionsVoiceSlider : public OptionsSlider { public: OptionsVoiceSlider(const Sprite& box, const Sprite& label, const Sprite& portrait, const Sprite& mutedPortrait, - glm::vec2 pos, glm::vec4 highlightTint, float sliderSpeed); + glm::vec2 pos, glm::vec4 highlightTint, float sliderSpeed, + std::function select); void Render() override; void UpdateInput() override; diff --git a/src/ui/widgets/clickbutton.cpp b/src/ui/widgets/clickbutton.cpp new file mode 100644 index 000000000..31759d1d8 --- /dev/null +++ b/src/ui/widgets/clickbutton.cpp @@ -0,0 +1,34 @@ +#include "clickbutton.h" + +#include "../../inputsystem.h" +#include "../../vm/interface/input.h" + +namespace Impacto { +namespace UI { +namespace Widgets { + +ClickButton::ClickButton(int id, RectF bounds, + std::function onClickHandler) + : Id(id), OnClickHandler(onClickHandler) { + Bounds = bounds; +} + +void ClickButton::UpdateInput() { + if (!Enabled) return; + + if (Input::CurrentInputDevice == Input::Device::Mouse && + Input::PrevMousePos != Input::CurMousePos) { + Hovered = Bounds.ContainsPoint(Input::CurMousePos); + } else if (Input::CurrentInputDevice == Input::Device::Touch && + Input::TouchIsDown[0] && + Input::PrevTouchPos != Input::CurTouchPos) { + Hovered = Bounds.ContainsPoint(Input::CurTouchPos); + } + + if (Hovered && Vm::Interface::PADinputMouseWentDown & Vm::Interface::PAD1A) + OnClickHandler(this); +} + +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file diff --git a/src/ui/widgets/clickbutton.h b/src/ui/widgets/clickbutton.h new file mode 100644 index 000000000..0d6a27c6a --- /dev/null +++ b/src/ui/widgets/clickbutton.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +#include "../widget.h" + +namespace Impacto { +namespace UI { +namespace Widgets { + +class ClickButton : public Widget { + public: + ClickButton() {} + ClickButton(int id, RectF bounds, + std::function onClickHandler); + + virtual void UpdateInput() override; + + int Id; + + std::function OnClickHandler; +}; + +} // namespace Widgets +} // namespace UI +} // namespace Impacto \ No newline at end of file From d652432b61465278832f32e22bbb7c9d2d238a47 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 19 Dec 2024 00:29:59 +0100 Subject: [PATCH 17/59] Implemented mouse input for OptionsSlider --- src/ui/widgets/cclcc/optionsslider.cpp | 25 ++++++++++++++------- src/ui/widgets/cclcc/optionsslider.h | 9 ++++++-- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 8 +++++-- src/ui/widgets/scrollbar.cpp | 19 +++++++++++++++- src/ui/widgets/scrollbar.h | 2 ++ 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/ui/widgets/cclcc/optionsslider.cpp b/src/ui/widgets/cclcc/optionsslider.cpp index 5cf58e22d..02a4c8a15 100644 --- a/src/ui/widgets/cclcc/optionsslider.cpp +++ b/src/ui/widgets/cclcc/optionsslider.cpp @@ -18,11 +18,22 @@ OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, std::function select) : OptionsEntry(label, pos, highlightTint, select), BoxSprite(box), - SliderSpeed(sliderSpeed) { + Slider(0, pos + SliderTrackOffset, 0.0f, 1.0f, &Progress, + SBDIR_HORIZONTAL, + glm::vec2(BoxSprite.ScaledWidth(), BoxSprite.ScaledHeight())) { Bounds.Width = SliderTrackOffset.x + BoxSprite.ScaledWidth(); EntryButton.Bounds.Width = Bounds.Width; } +OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, + glm::vec2 pos, glm::vec4 highlightTint, + RectF sliderBounds, float sliderSpeed, + std::function select) + : OptionsEntry(label, pos, highlightTint, select), + BoxSprite(box), + Slider(0, sliderBounds.GetPos(), 0.0f, 1.0f, &Progress, SBDIR_HORIZONTAL, + sliderBounds.GetSize()) {} + void OptionsSlider::Render() { OptionsEntry::Render(); @@ -34,14 +45,12 @@ void OptionsSlider::Render() { Renderer->DrawSprite(BoxSprite, Bounds.GetPos() + SliderTrackOffset, Tint); } -void OptionsSlider::Update(float dt) { - OptionsEntry::Update(dt); - if (!Selected) return; +void OptionsSlider::UpdateInput() { + OptionsEntry::UpdateInput(); - int slideDirection = (bool)(PADinputButtonIsDown & PAD1RIGHT) - - (bool)(PADinputButtonIsDown & PAD1LEFT); - Progress = - std::clamp(Progress + slideDirection * SliderSpeed * dt, 0.0f, 1.0f); + Slider.HasFocus = Selected; + Slider.UpdateInput(); + Slider.ClampValue(); } } // namespace CCLCC diff --git a/src/ui/widgets/cclcc/optionsslider.h b/src/ui/widgets/cclcc/optionsslider.h index 676aac486..66335c0c6 100644 --- a/src/ui/widgets/cclcc/optionsslider.h +++ b/src/ui/widgets/cclcc/optionsslider.h @@ -1,6 +1,7 @@ #pragma once #include "./optionsentry.h" +#include "../scrollbar.h" #include "../../../spritesheet.h" namespace Impacto { @@ -15,13 +16,17 @@ class OptionsSlider : public OptionsEntry { std::function select); void Render() override; - void Update(float dt) override; + void UpdateInput() override; protected: + OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, + glm::vec4 highlightTint, RectF sliderBounds, float sliderSpeed, + std::function select); + const Sprite& BoxSprite; + Scrollbar Slider; float Progress = 0.0f; - float SliderSpeed = 1.0f; }; } // namespace CCLCC diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index a9e34968f..5ded91e7e 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -16,7 +16,11 @@ OptionsVoiceSlider::OptionsVoiceSlider( const Sprite& box, const Sprite& label, const Sprite& portrait, const Sprite& mutedPortrait, glm::vec2 pos, glm::vec4 highlightTint, float sliderSpeed, std::function select) - : OptionsSlider(box, label, pos, highlightTint, sliderSpeed, select), + : OptionsSlider( + box, label, pos, highlightTint, + RectF(pos.x + VoiceSliderOffset.x, pos.y + VoiceSliderOffset.y, + box.ScaledWidth(), box.ScaledHeight()), + sliderSpeed, select), Portrait(portrait), MutedPortrait(mutedPortrait) { Bounds = @@ -48,7 +52,7 @@ void OptionsVoiceSlider::Render() { } void OptionsVoiceSlider::UpdateInput() { - OptionsEntry::UpdateInput(); + OptionsSlider::UpdateInput(); if (HasFocus) Muted ^= (bool)(PADinputButtonWentDown & PAD1Y); } diff --git a/src/ui/widgets/scrollbar.cpp b/src/ui/widgets/scrollbar.cpp index f1027d306..05f5a1019 100644 --- a/src/ui/widgets/scrollbar.cpp +++ b/src/ui/widgets/scrollbar.cpp @@ -10,6 +10,23 @@ namespace Widgets { using namespace Impacto::Profile::ScriptVars; using namespace Impacto::Vm::Interface; +Scrollbar::Scrollbar(int id, glm::vec2 pos, float start, float end, + float* value, ScrollbarDirection dir, + glm::vec2 trackBounds) + : Id(id), + StartValue(start), + EndValue(end), + Value(value), + Direction(dir), + TrackBounds(pos.x, pos.y, trackBounds.x, trackBounds.y), + Step((end - start) * 0.01f), + Length(dir == SBDIR_VERTICAL ? trackBounds.y : trackBounds.x), + ThumbBounds(0.0f, 0.0f, 0.0f, 0.0f), + ThumbLength(0.0f), + HasTrack(false) { + UpdatePosition(); +} + Scrollbar::Scrollbar(int id, glm::vec2 pos, float start, float end, float* value, ScrollbarDirection dir, Sprite const& thumb, glm::vec2 trackBounds, float thumbLength, @@ -104,7 +121,7 @@ void Scrollbar::UpdateInput() { ThumbBounds.ContainsPoint(Input::CurMousePos); HoveredWheelBounds = ScrollWheelBounds.ContainsPoint(Input::CurMousePos); } - if (Hovered && Input::MouseButtonIsDown[SDL_BUTTON_LEFT]) { + if (Hovered && Input::MouseButtonWentDown[SDL_BUTTON_LEFT]) { ScrollHeld = true; } if (Input::MouseButtonIsDown[SDL_BUTTON_LEFT] && ScrollHeld) { diff --git a/src/ui/widgets/scrollbar.h b/src/ui/widgets/scrollbar.h index 85bb284fb..a33a0538d 100644 --- a/src/ui/widgets/scrollbar.h +++ b/src/ui/widgets/scrollbar.h @@ -11,6 +11,8 @@ enum ScrollbarDirection { SBDIR_VERTICAL, SBDIR_HORIZONTAL }; class Scrollbar : public Widget { public: + Scrollbar(int id, glm::vec2 pos, float start, float end, float* value, + ScrollbarDirection dir, glm::vec2 trackBounds); Scrollbar(int id, glm::vec2 pos, float start, float end, float* value, ScrollbarDirection dir, Sprite const& thumb, glm::vec2 trackBounds, float thumbLength, RectF wheelBounds = RectF(), From bbeca2cc06f67bf3eae14573aa8745df52d3d461 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 19 Dec 2024 00:40:23 +0100 Subject: [PATCH 18/59] Implemented backing out with right-mouse --- src/games/cclcc/optionsmenu.cpp | 2 +- src/ui/widgets/cclcc/optionsentry.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 875031882..1182a2aef 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -195,7 +195,7 @@ void OptionsMenu::UpdateInput() { // If something is selected, the option entry takes full control if (static_cast(CurrentlyFocusedElement)->Selected) return; - if (GetControlState(CT_Back)) { + if (GetControlState(CT_Back) || PADinputMouseWentDown & PAD1B) { static_cast(CurrentlyFocusedElement)->Hide(); CurrentlyFocusedElement = nullptr; return; diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index 3db76e52f..c8a5ee986 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -47,7 +47,8 @@ void OptionsEntry::UpdateInput() { if (!HasFocus) return; Selected ^= (bool)(PADinputButtonWentDown & PAD1A); - if (PADinputButtonWentDown & PAD1B) Selected = false; + if (PADinputButtonWentDown & PAD1B || PADinputMouseWentDown & PAD1B) + Selected = false; } void OptionsEntry::Hide() { From 5d281011e4d330684315ee7adfa898a8f4a2a149 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Tue, 24 Dec 2024 00:28:29 +0100 Subject: [PATCH 19/59] Implemented mouse input for options tabs --- profiles/cclcc/hud/optionsmenu.lua | 4 ++++ src/games/cclcc/optionsmenu.cpp | 30 +++++++++++++++++++++---- src/games/cclcc/optionsmenu.h | 5 ++++- src/profile/games/cclcc/optionsmenu.cpp | 13 ++++++----- src/profile/games/cclcc/optionsmenu.h | 19 ++++++++-------- 5 files changed, 51 insertions(+), 20 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 6b7a7df26..715c19b9b 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -27,6 +27,10 @@ root.OptionsMenu = { PagePanelIconOffsets1 = { X = 235, Y = 333 }, PagePanelIconOffsets2 = { X = 261, Y = 585 }, PagePanelIconOffsets3 = { X = 238, Y = 831 }, + PagePanelHoverBounds0 = { X = 168, Y = 79, Width = 150, Height = 183 }, + PagePanelHoverBounds1 = { X = 147, Y = 343, Width = 154, Height = 177 }, + PagePanelHoverBounds2 = { X = 169, Y = 591, Width = 146, Height = 181 }, + PagePanelHoverBounds3 = { X = 149, Y = 837, Width = 150, Height = 179 }, SliderTrackSprite = "OptionsSliderTrack", SliderTrackOffset = { X = 766, Y = 0 }, diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 1182a2aef..fc2c997e4 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -27,12 +27,20 @@ OptionsMenu::OptionsMenu() { PoleAnimation = Profile::CCLCC::OptionsMenu::PoleAnimation.Instantiate(); - Pages.reserve(4); + Pages.reserve(PageCount); glm::vec2 pos = EntriesStartPosition; glm::vec4 highlightTint(HighlightColor, 1.0f); std::function select = std::bind(&OptionsMenu::Select, this, std::placeholders::_1); + PageButtons.reserve(PageCount); + std::function pageButtonOnClick = + std::bind(&OptionsMenu::PageButtonOnClick, this, std::placeholders::_1); + for (int i = 0; i < PageCount; i++) { + PageButtons.push_back( + ClickButton(i, PagePanelHoverBounds[i], pageButtonOnClick)); + } + BasicPage = new Group(this); for (int i = 0; i < 4; i++) { BasicPage->Add( @@ -171,6 +179,8 @@ void OptionsMenu::Update(float dt) { } void OptionsMenu::UpdateInput() { + for (ClickButton& button : PageButtons) button.UpdateInput(); + if (CurrentlyFocusedElement == nullptr) { if (GetControlState(CT_Back)) { SetFlag(SF_SUBMENUEXIT, true); @@ -218,9 +228,15 @@ void OptionsMenu::Render() { Renderer->DrawSprite(PoleAnimation.CurrentSprite(), PagePanelPosition, col); if (PoleAnimation.IsIn()) { - Renderer->DrawSprite( - PagePanelSprites[2 * CurrentPage + !(bool)CurrentlyFocusedElement], - PagePanelPosition + PagePanelIconOffsets[CurrentPage], col); + for (ClickButton& panel : PageButtons) { + if (panel.Id == CurrentPage || panel.Hovered) { + const bool highlighted = + panel.Id == CurrentPage && (bool)CurrentlyFocusedElement; + Renderer->DrawSprite( + PagePanelSprites[2 * panel.Id + !highlighted], + PagePanelPosition + PagePanelIconOffsets[panel.Id], col); + } + } } const Sprite& guideSprite = @@ -252,6 +268,12 @@ void OptionsMenu::Select(OptionsEntry* toSelect) { CurrentlyFocusedElement = toSelect; } +void OptionsMenu::PageButtonOnClick(ClickButton* target) { + GoToPage(target->Id); + CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); + CurrentlyFocusedElement->HasFocus = true; +} + } // namespace CCLCC } // namespace UI } // namespace Impacto \ No newline at end of file diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index df51a2994..830b3839a 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -3,6 +3,7 @@ #include "../../ui/menu.h" #include "../../spriteanimation.h" #include "../../ui/widgets/group.h" +#include "../../ui/widgets/clickbutton.h" #include "../../ui/widgets/cclcc/optionsentry.h" using namespace Impacto::UI::Widgets::CCLCC; @@ -24,6 +25,7 @@ class OptionsMenu : public Menu { private: void GoToPage(int pageNumber); void Select(OptionsEntry* entry); + void PageButtonOnClick(Widgets::ClickButton* target); Animation FadeAnimation; SpriteAnimation PoleAnimation; @@ -34,7 +36,8 @@ class OptionsMenu : public Menu { Widgets::Group* VoicePage; int CurrentPage; - std::vector Pages; + std::vector Pages; + std::vector PageButtons; }; } // namespace CCLCC diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index 1eb554195..0ef274fd0 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -22,8 +22,7 @@ void Configure() { HeaderSprite = EnsureGetMemberSprite("HeaderSprite"); HeaderPosition = EnsureGetMemberVec2("HeaderPosition"); - GetMemberSpriteArray(PageHeaderSprites, PageHeaderSpriteCount, - "PageHeaderSprites"); + GetMemberSpriteArray(PageHeaderSprites, PageCount, "PageHeaderSprites"); PageHeaderPosition = EnsureGetMemberVec2("PageHeaderPosition"); PagePanelSprite = EnsureGetMemberSprite("PagePanelSprite"); @@ -33,9 +32,11 @@ void Configure() { PoleAnimation = EnsureGetMemberAnimation("PoleAnimation"); // TODO: Replace this once array fetching is implemented - for (int i = 0; i < PagePanelSpriteCount / 2; i++) { + for (int i = 0; i < PageCount; i++) { PagePanelIconOffsets[i] = EnsureGetMemberVec2( ("PagePanelIconOffsets" + std::to_string(i)).c_str()); + PagePanelHoverBounds[i] = EnsureGetMemberRectF( + ("PagePanelHoverBounds" + std::to_string(i)).c_str()); } SliderTrackSprite = EnsureGetMemberSprite("SliderTrackSprite"); @@ -65,11 +66,11 @@ void Configure() { EntryDimensions = EnsureGetMemberVec2("EntryDimensions"); VoiceEntryDimensions = EnsureGetMemberVec2("VoiceEntryDimensions"); - GetMemberSpriteArray(LabelSprites, LabelSpriteCount, "LabelSprites"); + GetMemberSpriteArray(LabelSprites, LabelCount, "LabelSprites"); LabelOffset = EnsureGetMemberVec2("LabelOffset"); - GetMemberSpriteArray(NametagSprites, NametagSpriteCount, "NametagSprites"); + GetMemberSpriteArray(NametagSprites, NametagCount, "NametagSprites"); NametagOffset = EnsureGetMemberVec2("NametagOffset"); - GetMemberSpriteArray(PortraitSprites, PortraitSpriteCount, "PortraitSprites"); + GetMemberSpriteArray(PortraitSprites, PortraitCount, "PortraitSprites"); PortraitOffset = EnsureGetMemberVec2("PortraitOffset"); VoicePosition = EnsureGetMemberVec2("VoicePosition"); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 6a9b692b0..f5e9ab888 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -8,11 +8,11 @@ namespace Profile { namespace CCLCC { namespace OptionsMenu { -int constexpr PageHeaderSpriteCount = 4; -int constexpr PagePanelSpriteCount = 8; -int constexpr LabelSpriteCount = 16; -int constexpr NametagSpriteCount = 13; -int constexpr PortraitSpriteCount = 26; +int constexpr PageCount = 4; +int constexpr PagePanelSpriteCount = PageCount * 2; +int constexpr LabelCount = 16; +int constexpr NametagCount = 13; +int constexpr PortraitCount = NametagCount * 2; inline glm::vec2 BackgroundPosition; @@ -23,7 +23,7 @@ inline glm::vec2 PointerOffset; inline Sprite HeaderSprite; inline glm::vec2 HeaderPosition; -inline Sprite PageHeaderSprites[PageHeaderSpriteCount]; +inline Sprite PageHeaderSprites[PageCount]; inline glm::vec2 PageHeaderPosition; inline Sprite PagePanelSprite; @@ -31,6 +31,7 @@ inline glm::vec2 PagePanelPosition; inline Sprite PagePanelSprites[PagePanelSpriteCount]; inline glm::vec2 PagePanelIconOffsets[PagePanelSpriteCount]; inline SpriteAnimationDef PoleAnimation; +inline RectF PagePanelHoverBounds[PageCount]; inline Sprite SliderTrackSprite; inline glm::vec2 SliderTrackOffset; @@ -59,11 +60,11 @@ inline glm::vec2 VoiceEntriesOffset; inline glm::vec2 EntryDimensions; inline glm::vec2 VoiceEntryDimensions; -inline Sprite LabelSprites[LabelSpriteCount]; +inline Sprite LabelSprites[LabelCount]; inline glm::vec2 LabelOffset; -inline Sprite NametagSprites[NametagSpriteCount]; +inline Sprite NametagSprites[NametagCount]; inline glm::vec2 NametagOffset; -inline Sprite PortraitSprites[PortraitSpriteCount]; +inline Sprite PortraitSprites[PortraitCount]; inline glm::vec2 PortraitOffset; inline glm::vec2 VoicePosition; From fb9676403b144217b7d84a568f1d29544ead5da5 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Fri, 27 Dec 2024 21:21:54 +0100 Subject: [PATCH 20/59] Implemented bumper tab switching for options menu --- src/games/cclcc/optionsmenu.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index fc2c997e4..21b9ba431 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -181,6 +181,19 @@ void OptionsMenu::Update(float dt) { void OptionsMenu::UpdateInput() { for (ClickButton& button : PageButtons) button.UpdateInput(); + // Tab cycling + if (PADinputButtonWentDown & (PAD1L1 | PAD1R1)) { + const bool focusedElement = CurrentlyFocusedElement; + const int direction = (bool)(PADinputButtonWentDown & PAD1R1) - + (bool)(PADinputButtonWentDown & PAD1L1); + GoToPage((CurrentPage + direction) % Pages.size()); + + if (focusedElement) { + CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); + CurrentlyFocusedElement->HasFocus = true; + } + } + if (CurrentlyFocusedElement == nullptr) { if (GetControlState(CT_Back)) { SetFlag(SF_SUBMENUEXIT, true); From fb9267d522c570c11911fbbcf7382e82c934a264 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Fri, 27 Dec 2024 21:29:16 +0100 Subject: [PATCH 21/59] Added mouse highlights to option entries --- src/ui/widgets/cclcc/optionsentry.cpp | 2 +- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index c8a5ee986..c6326f4e4 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -27,7 +27,7 @@ OptionsEntry::OptionsEntry(const Sprite& label, glm::vec2 pos, void OptionsEntry::Render() { HighlightTint.a = Tint.a; - if (HasFocus) { + if (HasFocus || EntryButton.Hovered) { RectF highlightBoundBox(Bounds.X, Bounds.Y, EntryDimensions.x, EntryDimensions.y); Renderer->DrawRect(highlightBoundBox, HighlightTint); diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index 5ded91e7e..757887f98 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -31,7 +31,7 @@ OptionsVoiceSlider::OptionsVoiceSlider( void OptionsVoiceSlider::Render() { HighlightTint.a = Tint.a; - if (HasFocus) { + if (HasFocus || EntryButton.Hovered) { RectF highlightBoundBox(Bounds.X, Bounds.Y, VoiceEntryDimensions.x, VoiceEntryDimensions.y); Renderer->DrawRect(highlightBoundBox, HighlightTint); From 224ae9eb99bfb95ef36693f4327882149fae7ef5 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Fri, 27 Dec 2024 21:49:10 +0100 Subject: [PATCH 22/59] Improved click button reliability --- src/ui/widgets/cclcc/optionsentry.cpp | 3 +++ src/ui/widgets/cclcc/optionsentry.h | 2 ++ src/ui/widgets/clickbutton.cpp | 21 ++++++++++++++++++++- src/ui/widgets/clickbutton.h | 3 +++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index c6326f4e4..098ebaddf 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -51,8 +51,11 @@ void OptionsEntry::UpdateInput() { Selected = false; } +void OptionsEntry::Show() { EntryButton.Show(); } + void OptionsEntry::Hide() { Widget::Hide(); + EntryButton.Hide(); Selected = false; } diff --git a/src/ui/widgets/cclcc/optionsentry.h b/src/ui/widgets/cclcc/optionsentry.h index 8221b5a25..f9b802e91 100644 --- a/src/ui/widgets/cclcc/optionsentry.h +++ b/src/ui/widgets/cclcc/optionsentry.h @@ -18,6 +18,8 @@ class OptionsEntry : public Widget { void Render() override; void UpdateInput() override; + + void Show() override; void Hide() override; bool Selected = false; diff --git a/src/ui/widgets/clickbutton.cpp b/src/ui/widgets/clickbutton.cpp index 31759d1d8..c0756a680 100644 --- a/src/ui/widgets/clickbutton.cpp +++ b/src/ui/widgets/clickbutton.cpp @@ -17,7 +17,8 @@ void ClickButton::UpdateInput() { if (!Enabled) return; if (Input::CurrentInputDevice == Input::Device::Mouse && - Input::PrevMousePos != Input::CurMousePos) { + (Input::PrevMousePos != Input::CurMousePos || + Vm::Interface::PADinputMouseWentDown)) { Hovered = Bounds.ContainsPoint(Input::CurMousePos); } else if (Input::CurrentInputDevice == Input::Device::Touch && Input::TouchIsDown[0] && @@ -29,6 +30,24 @@ void ClickButton::UpdateInput() { OnClickHandler(this); } +void ClickButton::Show() { + Enabled = true; + + switch (Input::CurrentInputDevice) { + case Input::Device::Mouse: + Hovered = Bounds.ContainsPoint(Input::CurMousePos); + break; + case Input::Device::Touch: + Hovered = Bounds.ContainsPoint(Input::CurTouchPos); + break; + } +} + +void ClickButton::Hide() { + Enabled = false; + Hovered = false; +} + } // namespace Widgets } // namespace UI } // namespace Impacto \ No newline at end of file diff --git a/src/ui/widgets/clickbutton.h b/src/ui/widgets/clickbutton.h index 0d6a27c6a..d844a04cf 100644 --- a/src/ui/widgets/clickbutton.h +++ b/src/ui/widgets/clickbutton.h @@ -16,6 +16,9 @@ class ClickButton : public Widget { virtual void UpdateInput() override; + virtual void Show(); + virtual void Hide(); + int Id; std::function OnClickHandler; From 4f6beb0ce6e83ea1cc4ffb04a06b79e01e5fc980 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Fri, 27 Dec 2024 22:02:23 +0100 Subject: [PATCH 23/59] Improved page panel spritesheet location --- profiles/cclcc/hud/optionsmenu.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 715c19b9b..1c3555575 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -201,6 +201,11 @@ for i = 0, 7 do width = 224; offset = ((i % 2 == 1) and {width * 4} or {0})[1]; + -- Non-highlighted Text and Sound panels are poorly placed in the spritesheet, for some reason + if (i == 3 or i == 5) then + offset = offset - 1; + end + root.Sprites["OptionsPagePanel" .. i] = { Sheet = "Config", Bounds = { From 952c43134305eeaf19d9a914ded5980701ce72a6 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Fri, 27 Dec 2024 22:13:51 +0100 Subject: [PATCH 24/59] Converted two profile settings to use vec2-arrays and RectF-arrays instead --- profiles/cclcc/hud/optionsmenu.lua | 21 ++++++++++++--------- src/profile/games/cclcc/optionsmenu.cpp | 10 ++-------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 1c3555575..69914089e 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -21,16 +21,19 @@ root.OptionsMenu = { PagePanelSprite = "OptionsPagePanel", PagePanelPosition = { X = -114, Y = 0 }, PagePanelSprites = {}, + PagePanelIconOffsets = { + { X = 259, Y = 73 }, + { X = 235, Y = 333 }, + { X = 261, Y = 585 }, + { X = 238, Y = 831 } + }, + PagePanelHoverBounds = { + { X = 168, Y = 79, Width = 150, Height = 183 }, + { X = 147, Y = 343, Width = 154, Height = 177 }, + { X = 169, Y = 591, Width = 146, Height = 181 }, + { X = 149, Y = 837, Width = 150, Height = 179 }, + }, PoleAnimation = "OptionsPoleAnimation", - -- TODO: Replace this once array fetching is implemented - PagePanelIconOffsets0 = { X = 259, Y = 73 }, - PagePanelIconOffsets1 = { X = 235, Y = 333 }, - PagePanelIconOffsets2 = { X = 261, Y = 585 }, - PagePanelIconOffsets3 = { X = 238, Y = 831 }, - PagePanelHoverBounds0 = { X = 168, Y = 79, Width = 150, Height = 183 }, - PagePanelHoverBounds1 = { X = 147, Y = 343, Width = 154, Height = 177 }, - PagePanelHoverBounds2 = { X = 169, Y = 591, Width = 146, Height = 181 }, - PagePanelHoverBounds3 = { X = 149, Y = 837, Width = 150, Height = 179 }, SliderTrackSprite = "OptionsSliderTrack", SliderTrackOffset = { X = 766, Y = 0 }, diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index 0ef274fd0..0c45eba4e 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -29,16 +29,10 @@ void Configure() { PagePanelPosition = EnsureGetMemberVec2("PagePanelPosition"); GetMemberSpriteArray(PagePanelSprites, PagePanelSpriteCount, "PagePanelSprites"); + GetMemberVec2Array(PagePanelIconOffsets, PageCount, "PagePanelIconOffsets"); + GetMemberRectFArray(PagePanelHoverBounds, PageCount, "PagePanelHoverBounds"); PoleAnimation = EnsureGetMemberAnimation("PoleAnimation"); - // TODO: Replace this once array fetching is implemented - for (int i = 0; i < PageCount; i++) { - PagePanelIconOffsets[i] = EnsureGetMemberVec2( - ("PagePanelIconOffsets" + std::to_string(i)).c_str()); - PagePanelHoverBounds[i] = EnsureGetMemberRectF( - ("PagePanelHoverBounds" + std::to_string(i)).c_str()); - } - SliderTrackSprite = EnsureGetMemberSprite("SliderTrackSprite"); SliderTrackOffset = EnsureGetMemberVec2("SliderTrackOffset"); VoiceSliderTrackSprite = EnsureGetMemberSprite("VoiceSliderTrackSprite"); From b94425aaddb268323d1b0cb0baf0adde15b49c45 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Fri, 27 Dec 2024 23:17:34 +0100 Subject: [PATCH 25/59] Fixed options menu exiting --- src/games/cclcc/optionsmenu.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 21b9ba431..6266223ba 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -164,8 +164,7 @@ void OptionsMenu::Hide() { } void OptionsMenu::Update(float dt) { - UpdateInput(); - Pages.at(CurrentPage)->Update(dt); + const bool wasOut = FadeAnimation.IsOut(); FadeAnimation.Update(dt); PoleAnimation.Update(dt); @@ -176,6 +175,21 @@ void OptionsMenu::Update(float dt) { ScrWork[SW_SYSSUBMENUNO] == 5) { Show(); } + + if (State != Hidden) { + UpdateInput(); + Pages.at(CurrentPage)->Update(dt); + } + + if (FadeAnimation.IsIn()) + State = Shown; + else if (!wasOut && FadeAnimation.IsOut()) { + State = Hidden; + + Pages.at(CurrentPage)->Hide(); + CurrentPage = 0; + CurrentlyFocusedElement = nullptr; + } } void OptionsMenu::UpdateInput() { From 75b9f7c3ea5140dbf54a5ea8420f2f9678819ebb Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Fri, 27 Dec 2024 23:32:09 +0100 Subject: [PATCH 26/59] Implemented muting voice with mouse --- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 22 +++++++++++++++++++++ src/ui/widgets/cclcc/optionsvoiceslider.h | 5 +++++ 2 files changed, 27 insertions(+) diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index 757887f98..f2fbab021 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -26,6 +26,13 @@ OptionsVoiceSlider::OptionsVoiceSlider( Bounds = RectF(Bounds.X, Bounds.Y, VoiceEntryDimensions.x, VoiceEntryDimensions.y); EntryButton.Bounds = Bounds; + + std::function onClick = std::bind( + &OptionsVoiceSlider::MuteButtonOnClick, this, std::placeholders::_1); + const RectF muteButtonBounds(Bounds.GetPos().x + PortraitOffset.x, + Bounds.GetPos().y + PortraitOffset.y, + portrait.ScaledWidth(), portrait.ScaledHeight()); + MuteButton = ClickButton(0, muteButtonBounds, onClick); } void OptionsVoiceSlider::Render() { @@ -53,10 +60,25 @@ void OptionsVoiceSlider::Render() { void OptionsVoiceSlider::UpdateInput() { OptionsSlider::UpdateInput(); + MuteButton.UpdateInput(); if (HasFocus) Muted ^= (bool)(PADinputButtonWentDown & PAD1Y); } +void OptionsVoiceSlider::Show() { + OptionsSlider::Show(); + MuteButton.Show(); +} + +void OptionsVoiceSlider::Hide() { + OptionsSlider::Hide(); + MuteButton.Hide(); +} + +void OptionsVoiceSlider::MuteButtonOnClick(ClickButton* target) { + Muted = !Muted; +} + } // namespace CCLCC } // namespace Widgets } // namespace UI diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.h b/src/ui/widgets/cclcc/optionsvoiceslider.h index 123e718c2..932ba0113 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.h +++ b/src/ui/widgets/cclcc/optionsvoiceslider.h @@ -17,11 +17,16 @@ class OptionsVoiceSlider : public OptionsSlider { void Render() override; void UpdateInput() override; + void Show() override; + void Hide() override; + private: const Sprite& Portrait; const Sprite& MutedPortrait; bool Muted = false; + ClickButton MuteButton; + void MuteButtonOnClick(ClickButton* target); }; } // namespace CCLCC From 8e48a57ec9db0fa8fbfbd049faa6fa6419825bea Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 28 Dec 2024 00:24:24 +0100 Subject: [PATCH 27/59] Added sysse to options menu --- src/games/cclcc/optionsmenu.cpp | 28 ++++++++++++++++++-- src/ui/widgets/cclcc/optionsbinarybutton.cpp | 28 +++++++++++++++----- src/ui/widgets/cclcc/optionsentry.cpp | 20 +++++++++++--- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 14 +++++++++- 4 files changed, 78 insertions(+), 12 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 6266223ba..d82497e3b 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -193,10 +193,17 @@ void OptionsMenu::Update(float dt) { } void OptionsMenu::UpdateInput() { - for (ClickButton& button : PageButtons) button.UpdateInput(); + for (ClickButton& button : PageButtons) { + const bool wasHovered = button.Hovered; + button.UpdateInput(); + if (!wasHovered && button.Hovered) + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + } // Tab cycling if (PADinputButtonWentDown & (PAD1L1 | PAD1R1)) { + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + const bool focusedElement = CurrentlyFocusedElement; const int direction = (bool)(PADinputButtonWentDown & PAD1R1) - (bool)(PADinputButtonWentDown & PAD1L1); @@ -210,18 +217,26 @@ void OptionsMenu::UpdateInput() { if (CurrentlyFocusedElement == nullptr) { if (GetControlState(CT_Back)) { + if (!GetFlag(SF_SUBMENUEXIT)) + Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); + SetFlag(SF_SUBMENUEXIT, true); return; } const int direction = (bool)(PADinputButtonWentDown & PAD1DOWN) - (bool)(PADinputButtonWentDown & PAD1UP); - if (direction) GoToPage((CurrentPage + direction) % Pages.size()); + if (direction) { + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + GoToPage((CurrentPage + direction) % Pages.size()); + } if (PADinputButtonWentDown & PAD1A) { // Don't have anything else consume the confirmation PADinputButtonWentDown &= ~PAD1A; + Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); CurrentlyFocusedElement->HasFocus = true; } @@ -233,12 +248,16 @@ void OptionsMenu::UpdateInput() { if (static_cast(CurrentlyFocusedElement)->Selected) return; if (GetControlState(CT_Back) || PADinputMouseWentDown & PAD1B) { + Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); + static_cast(CurrentlyFocusedElement)->Hide(); CurrentlyFocusedElement = nullptr; return; } Menu::UpdateInput(); + if (PADinputButtonWentDown & (PAD1DOWN | PAD1UP)) + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); } void OptionsMenu::Render() { @@ -296,6 +315,11 @@ void OptionsMenu::Select(OptionsEntry* toSelect) { } void OptionsMenu::PageButtonOnClick(ClickButton* target) { + if (target->Id != CurrentPage || !CurrentlyFocusedElement) + Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + + if (target->Id == CurrentPage && CurrentlyFocusedElement) return; + GoToPage(target->Id); CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); CurrentlyFocusedElement->HasFocus = true; diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index b7255136c..7cd606e2c 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -56,22 +56,38 @@ void OptionsBinaryButton::Render() { } void OptionsBinaryButton::UpdateInput() { - OptionsEntry::UpdateInput(); - // Handle mouse/touch input TrueButton.UpdateInput(); FalseButton.UpdateInput(); + OptionsEntry::UpdateInput(); + if (!Selected) return; // Handle keyboard/controller input - if (PADinputButtonWentDown & (PAD1LEFT | PAD1RIGHT)) - State = PADinputButtonWentDown & PAD1LEFT; + if (PADinputButtonWentDown & (PAD1LEFT | PAD1RIGHT)) { + const bool newState = PADinputButtonWentDown & PAD1LEFT; + + if (State != newState) + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + + State = newState; + } } -void OptionsBinaryButton::TrueOnClick(ClickButton* target) { State = true; } +void OptionsBinaryButton::TrueOnClick(ClickButton* target) { + if (Selected && State != true) + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + + State = true; +} -void OptionsBinaryButton::FalseOnClick(ClickButton* target) { State = false; } +void OptionsBinaryButton::FalseOnClick(ClickButton* target) { + if (Selected && State != false) + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + + State = false; +} } // namespace CCLCC } // namespace Widgets diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index 098ebaddf..596f55b58 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -42,13 +42,22 @@ void OptionsEntry::Render() { } void OptionsEntry::UpdateInput() { + const bool wasHovered = EntryButton.Hovered; EntryButton.UpdateInput(); + if (!wasHovered && EntryButton.Hovered) + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); if (!HasFocus) return; - Selected ^= (bool)(PADinputButtonWentDown & PAD1A); - if (PADinputButtonWentDown & PAD1B || PADinputMouseWentDown & PAD1B) + if (PADinputButtonWentDown & PAD1A) { + Selected = !Selected; + Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + } + + if (PADinputButtonWentDown & PAD1B || PADinputMouseWentDown & PAD1B) { Selected = false; + Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); + } } void OptionsEntry::Show() { EntryButton.Show(); } @@ -59,7 +68,12 @@ void OptionsEntry::Hide() { Selected = false; } -void OptionsEntry::EntryButtonOnClick(ClickButton* target) { Select(this); } +void OptionsEntry::EntryButtonOnClick(ClickButton* target) { + if (Selected) return; + + Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + Select(this); +} } // namespace CCLCC } // namespace Widgets diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index f2fbab021..00b54e7f8 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -62,7 +62,17 @@ void OptionsVoiceSlider::UpdateInput() { OptionsSlider::UpdateInput(); MuteButton.UpdateInput(); - if (HasFocus) Muted ^= (bool)(PADinputButtonWentDown & PAD1Y); + if (!HasFocus) return; + + if (PADinputButtonWentDown & PAD1Y) { + Muted = !Muted; + Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + } + + if ((bool)(PADinputButtonWentDown & (PAD1LEFT | PAD1RIGHT)) && + !(bool)(PADinputButtonWentDown & (PAD1UP | PAD1DOWN))) { + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + } } void OptionsVoiceSlider::Show() { @@ -76,6 +86,8 @@ void OptionsVoiceSlider::Hide() { } void OptionsVoiceSlider::MuteButtonOnClick(ClickButton* target) { + if (HasFocus) Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + Muted = !Muted; } From 605e5aedaed8ba375c0aa6df4f3ada4688a2fc4f Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 28 Dec 2024 17:32:31 +0100 Subject: [PATCH 28/59] Gave skip mode option 'read' and 'all' sprites --- src/games/cclcc/optionsmenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index d82497e3b..fd64214c6 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -62,7 +62,7 @@ OptionsMenu::OptionsMenu() { pos.y += EntriesVerticalOffset; } TextPage->Add( - new OptionsBinaryButton(BinaryBoxSprite, YesSprite, NoSprite, + new OptionsBinaryButton(BinaryBoxSprite, SkipReadSprite, SkipAllSprite, LabelSprites[6], pos, highlightTint, select), FDIR_DOWN); Pages.push_back(TextPage); From dffe207983bedc26ac42700e77348a5329fb0964 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 28 Dec 2024 17:42:30 +0100 Subject: [PATCH 29/59] Properly enabled and disabled OptionsBinaryButton true/false buttons --- src/ui/widgets/cclcc/optionsbinarybutton.cpp | 14 ++++++++++++++ src/ui/widgets/cclcc/optionsbinarybutton.h | 3 +++ 2 files changed, 17 insertions(+) diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index 7cd606e2c..8f6288b22 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -75,6 +75,20 @@ void OptionsBinaryButton::UpdateInput() { } } +void OptionsBinaryButton::Show() { + OptionsEntry::Show(); + + TrueButton.Show(); + FalseButton.Show(); +} + +void OptionsBinaryButton::Hide() { + OptionsEntry::Hide(); + + TrueButton.Hide(); + FalseButton.Hide(); +} + void OptionsBinaryButton::TrueOnClick(ClickButton* target) { if (Selected && State != true) Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.h b/src/ui/widgets/cclcc/optionsbinarybutton.h index 4751e6372..0069934cc 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.h +++ b/src/ui/widgets/cclcc/optionsbinarybutton.h @@ -19,6 +19,9 @@ class OptionsBinaryButton : public OptionsEntry { void Render() override; void UpdateInput() override; + void Show() override; + void Hide() override; + private: ClickButton TrueButton; ClickButton FalseButton; From dea6332f59b779b17acd186309b63a8fb22e3a12 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 28 Dec 2024 20:05:13 +0100 Subject: [PATCH 30/59] Implemented options menu fade animation --- profiles/cclcc/hud/optionsmenu.lua | 9 ++-- src/games/cclcc/optionsmenu.cpp | 46 +++++++++++++++----- src/profile/games/cclcc/optionsmenu.cpp | 5 +++ src/profile/games/cclcc/optionsmenu.h | 3 ++ src/ui/widget.cpp | 4 +- src/ui/widgets/cclcc/optionsbinarybutton.cpp | 20 +++++++++ src/ui/widgets/cclcc/optionsbinarybutton.h | 4 ++ src/ui/widgets/cclcc/optionsentry.cpp | 17 ++++++++ src/ui/widgets/cclcc/optionsentry.h | 4 ++ src/ui/widgets/cclcc/optionsslider.cpp | 17 ++++++++ src/ui/widgets/cclcc/optionsslider.h | 4 ++ src/ui/widgets/cclcc/optionsvoiceslider.cpp | 17 ++++++++ src/ui/widgets/cclcc/optionsvoiceslider.h | 4 ++ 13 files changed, 138 insertions(+), 16 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 69914089e..72eff68b3 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -2,13 +2,14 @@ root.OptionsMenu = { Type = OptionsMenuType.CCLCC, DrawType = DrawComponentType.SystemMenu, - FadeInDuration = 0.2, - FadeOutDuration = 0.2, + FadeInDuration = 0.5, + FadeOutDuration = 0.5, HighlightColor = { X = 0.94, Y = 0.49, Z = 0.59 }, BackgroundSprite = "OptionsBackground", BackgroundPosition = { X = 179, Y = 0 }, + BackgroundFadeStartPosition = { X = 179, Y = -375 }, PointerSprite = "OptionsPointer", PointerOffset = { X = 13, Y = 2 }, @@ -20,6 +21,7 @@ root.OptionsMenu = { PagePanelSprite = "OptionsPagePanel", PagePanelPosition = { X = -114, Y = 0 }, + PagePanelFadeStartPosition = { X = -464, Y = 0 }, PagePanelSprites = {}, PagePanelIconOffsets = { { X = 259, Y = 73 }, @@ -53,6 +55,7 @@ root.OptionsMenu = { GuideSprite = "OptionsGuide", VoiceGuideSprite = "OptionsVoiceGuide", GuidePosition = { X = 0, Y = 986 }, + GuideFadeStartPosition = { X = 0, Y = 1375 }, EntriesStartPosition = { X = 419, Y = 313 }, EntriesVerticalOffset = 126, @@ -250,7 +253,7 @@ MakeAnimation({ RowHeight = 1096, Frames = 15, - Duration = 1, + Duration = 0.5, Rows = 3, Columns = 7, diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index fd64214c6..9ec48f184 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -164,7 +164,7 @@ void OptionsMenu::Hide() { } void OptionsMenu::Update(float dt) { - const bool wasOut = FadeAnimation.IsOut(); + const bool wasAnimating = !FadeAnimation.IsOut() && !FadeAnimation.IsIn(); FadeAnimation.Update(dt); PoleAnimation.Update(dt); @@ -181,14 +181,24 @@ void OptionsMenu::Update(float dt) { Pages.at(CurrentPage)->Update(dt); } - if (FadeAnimation.IsIn()) + if (!FadeAnimation.IsIn() && !FadeAnimation.IsOut()) { + const glm::vec2 backgroundPosition = + glm::vec2(0.0f, glm::mix(BackgroundFadeStartPosition.y, + BackgroundPosition.y, FadeAnimation.Progress)); + Pages.at(CurrentPage)->MoveTo(backgroundPosition); + } + + if (FadeAnimation.IsIn()) { State = Shown; - else if (!wasOut && FadeAnimation.IsOut()) { + Pages.at(CurrentPage)->MoveTo(glm::vec2(0.0f, BackgroundPosition.y)); + } else if (wasAnimating && FadeAnimation.IsOut()) { State = Hidden; Pages.at(CurrentPage)->Hide(); CurrentPage = 0; CurrentlyFocusedElement = nullptr; + + SetFlag(SF_SUBMENUEXIT, true); } } @@ -220,7 +230,7 @@ void OptionsMenu::UpdateInput() { if (!GetFlag(SF_SUBMENUEXIT)) Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); - SetFlag(SF_SUBMENUEXIT, true); + Hide(); return; } @@ -265,14 +275,28 @@ void OptionsMenu::Render() { ScrWork[SW_SYSSUBMENUNO] == 5) { glm::vec4 col(1.0f, 1.0f, 1.0f, FadeAnimation.Progress); - Renderer->DrawSprite(BackgroundSprite, BackgroundPosition, col); - Renderer->DrawSprite(HeaderSprite, HeaderPosition, col); - - Renderer->DrawSprite(PageHeaderSprites[CurrentPage], PageHeaderPosition, - col); + const glm::vec2 backgroundAnimationOffset = + glm::vec2(0.0f, FadeAnimation.Progress * BackgroundPosition.y + + (1.0f - FadeAnimation.Progress) * + BackgroundFadeStartPosition.y); + const glm::vec2 pagePanelPosition = + PagePanelPosition * FadeAnimation.Progress + + (1.0f - FadeAnimation.Progress) * PagePanelFadeStartPosition; + const glm::vec2 guidePosition = + GuidePosition * FadeAnimation.Progress + + (1.0f - FadeAnimation.Progress) * GuideFadeStartPosition; + + Renderer->DrawSprite(BackgroundSprite, + BackgroundPosition + backgroundAnimationOffset, col); + Renderer->DrawSprite(HeaderSprite, + HeaderPosition + backgroundAnimationOffset, col); + + Renderer->DrawSprite(PageHeaderSprites[CurrentPage], + PageHeaderPosition + backgroundAnimationOffset, col); + Pages.at(CurrentPage)->Tint = col; Pages.at(CurrentPage)->Render(); - Renderer->DrawSprite(PoleAnimation.CurrentSprite(), PagePanelPosition, col); + Renderer->DrawSprite(PoleAnimation.CurrentSprite(), pagePanelPosition, col); if (PoleAnimation.IsIn()) { for (ClickButton& panel : PageButtons) { if (panel.Id == CurrentPage || panel.Hovered) { @@ -287,7 +311,7 @@ void OptionsMenu::Render() { const Sprite& guideSprite = CurrentPage == 3 ? VoiceGuideSprite : GuideSprite; - Renderer->DrawSprite(guideSprite, GuidePosition, col); + Renderer->DrawSprite(guideSprite, guidePosition, col); } } diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index 0c45eba4e..73c26f20b 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -14,6 +14,8 @@ namespace OptionsMenu { void Configure() { BackgroundPosition = EnsureGetMemberVec2("BackgroundPosition"); + BackgroundFadeStartPosition = + EnsureGetMemberVec2("BackgroundFadeStartPosition"); HighlightColor = EnsureGetMemberVec3("HighlightColor"); @@ -27,6 +29,8 @@ void Configure() { PagePanelSprite = EnsureGetMemberSprite("PagePanelSprite"); PagePanelPosition = EnsureGetMemberVec2("PagePanelPosition"); + PagePanelFadeStartPosition = + EnsureGetMemberVec2("PagePanelFadeStartPosition"); GetMemberSpriteArray(PagePanelSprites, PagePanelSpriteCount, "PagePanelSprites"); GetMemberVec2Array(PagePanelIconOffsets, PageCount, "PagePanelIconOffsets"); @@ -51,6 +55,7 @@ void Configure() { GuideSprite = EnsureGetMemberSprite("GuideSprite"); VoiceGuideSprite = EnsureGetMemberSprite("VoiceGuideSprite"); GuidePosition = EnsureGetMemberVec2("GuidePosition"); + GuideFadeStartPosition = EnsureGetMemberVec2("GuideFadeStartPosition"); EntriesStartPosition = EnsureGetMemberVec2("EntriesStartPosition"); EntriesVerticalOffset = EnsureGetMemberInt("EntriesVerticalOffset"); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index f5e9ab888..66cfaafc2 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -15,6 +15,7 @@ int constexpr NametagCount = 13; int constexpr PortraitCount = NametagCount * 2; inline glm::vec2 BackgroundPosition; +inline glm::vec2 BackgroundFadeStartPosition; inline glm::vec3 HighlightColor; @@ -28,6 +29,7 @@ inline glm::vec2 PageHeaderPosition; inline Sprite PagePanelSprite; inline glm::vec2 PagePanelPosition; +inline glm::vec2 PagePanelFadeStartPosition; inline Sprite PagePanelSprites[PagePanelSpriteCount]; inline glm::vec2 PagePanelIconOffsets[PagePanelSpriteCount]; inline SpriteAnimationDef PoleAnimation; @@ -51,6 +53,7 @@ inline Sprite NoSprite; inline Sprite GuideSprite; inline Sprite VoiceGuideSprite; inline glm::vec2 GuidePosition; +inline glm::vec2 GuideFadeStartPosition; inline glm::vec2 EntriesStartPosition; inline int EntriesVerticalOffset; diff --git a/src/ui/widget.cpp b/src/ui/widget.cpp index 1f400fbd7..4c07a7114 100644 --- a/src/ui/widget.cpp +++ b/src/ui/widget.cpp @@ -22,7 +22,7 @@ void Widget::Hide() { WidgetType Widget::GetType() { return WT_NORMAL; } void Widget::Move(glm::vec2 relativePosition, float duration) { - MoveOrigin = glm::vec2(Bounds.X, Bounds.Y); + MoveOrigin = Bounds.GetPos(); MoveTarget = MoveOrigin + relativePosition; MoveAnimation.Progress = 0.0f; MoveAnimation.Direction = AnimationDirection::In; @@ -36,7 +36,7 @@ void Widget::Move(glm::vec2 relativePosition) { } void Widget::MoveTo(glm::vec2 pos, float duration) { - MoveOrigin = glm::vec2(Bounds.X, Bounds.Y); + MoveOrigin = Bounds.GetPos(); MoveTarget = pos; MoveAnimation.Progress = 0.0f; MoveAnimation.Direction = AnimationDirection::In; diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index 8f6288b22..f4278a628 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -55,6 +55,13 @@ void OptionsBinaryButton::Render() { glm::vec2(1.0f), 0.0f, State); } +void OptionsBinaryButton::Update(float dt) { + OptionsEntry::Update(dt); + + TrueButton.Update(dt); + FalseButton.Update(dt); +} + void OptionsBinaryButton::UpdateInput() { // Handle mouse/touch input TrueButton.UpdateInput(); @@ -89,6 +96,19 @@ void OptionsBinaryButton::Hide() { FalseButton.Hide(); } +void OptionsBinaryButton::Move(glm::vec2 relativePos) { + OptionsEntry::Move(relativePos); + TrueButton.Move(relativePos); + FalseButton.Move(relativePos); +} + +void OptionsBinaryButton::MoveTo(glm::vec2 pos) { + const glm::vec2 relativePosition = pos - Bounds.GetPos(); + OptionsEntry::MoveTo(pos); + TrueButton.Move(relativePosition); + FalseButton.Move(relativePosition); +} + void OptionsBinaryButton::TrueOnClick(ClickButton* target) { if (Selected && State != true) Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.h b/src/ui/widgets/cclcc/optionsbinarybutton.h index 0069934cc..74cdb6dae 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.h +++ b/src/ui/widgets/cclcc/optionsbinarybutton.h @@ -17,11 +17,15 @@ class OptionsBinaryButton : public OptionsEntry { std::function select); void Render() override; + void Update(float dt) override; void UpdateInput() override; void Show() override; void Hide() override; + void Move(glm::vec2 relativePos) override; + void MoveTo(glm::vec2 pos) override; + private: ClickButton TrueButton; ClickButton FalseButton; diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index 596f55b58..892992a77 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -41,6 +41,12 @@ void OptionsEntry::Render() { Selected ? Tint : glm::vec4(0.0f, 0.0f, 0.0f, Tint.a)); } +void OptionsEntry::Update(float dt) { + Widget::Update(dt); + + EntryButton.Update(dt); +} + void OptionsEntry::UpdateInput() { const bool wasHovered = EntryButton.Hovered; EntryButton.UpdateInput(); @@ -68,6 +74,17 @@ void OptionsEntry::Hide() { Selected = false; } +void OptionsEntry::Move(glm::vec2 relativePos) { + Widget::Move(relativePos); + EntryButton.Move(relativePos); +} + +void OptionsEntry::MoveTo(glm::vec2 pos) { + const glm::vec2 relativePosition = pos - Bounds.GetPos(); + Widget::MoveTo(pos); + EntryButton.Move(relativePosition); +} + void OptionsEntry::EntryButtonOnClick(ClickButton* target) { if (Selected) return; diff --git a/src/ui/widgets/cclcc/optionsentry.h b/src/ui/widgets/cclcc/optionsentry.h index f9b802e91..00751b76f 100644 --- a/src/ui/widgets/cclcc/optionsentry.h +++ b/src/ui/widgets/cclcc/optionsentry.h @@ -17,11 +17,15 @@ class OptionsEntry : public Widget { std::function select); void Render() override; + void Update(float dt) override; void UpdateInput() override; void Show() override; void Hide() override; + void Move(glm::vec2 relativePos) override; + void MoveTo(glm::vec2 pos) override; + bool Selected = false; protected: diff --git a/src/ui/widgets/cclcc/optionsslider.cpp b/src/ui/widgets/cclcc/optionsslider.cpp index 02a4c8a15..cfec4b330 100644 --- a/src/ui/widgets/cclcc/optionsslider.cpp +++ b/src/ui/widgets/cclcc/optionsslider.cpp @@ -45,6 +45,12 @@ void OptionsSlider::Render() { Renderer->DrawSprite(BoxSprite, Bounds.GetPos() + SliderTrackOffset, Tint); } +void OptionsSlider::Update(float dt) { + OptionsEntry::Update(dt); + + Slider.Update(dt); +} + void OptionsSlider::UpdateInput() { OptionsEntry::UpdateInput(); @@ -53,6 +59,17 @@ void OptionsSlider::UpdateInput() { Slider.ClampValue(); } +void OptionsSlider::Move(glm::vec2 relativePos) { + OptionsEntry::Move(relativePos); + Slider.Move(relativePos); +} + +void OptionsSlider::MoveTo(glm::vec2 pos) { + const glm::vec2 relativePosition = pos - Bounds.GetPos(); + OptionsEntry::MoveTo(pos); + Slider.Move(relativePosition); +} + } // namespace CCLCC } // namespace Widgets } // namespace UI diff --git a/src/ui/widgets/cclcc/optionsslider.h b/src/ui/widgets/cclcc/optionsslider.h index 66335c0c6..b71bd5768 100644 --- a/src/ui/widgets/cclcc/optionsslider.h +++ b/src/ui/widgets/cclcc/optionsslider.h @@ -16,8 +16,12 @@ class OptionsSlider : public OptionsEntry { std::function select); void Render() override; + void Update(float dt) override; void UpdateInput() override; + void Move(glm::vec2 relativePos) override; + void MoveTo(glm::vec2 pos) override; + protected: OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, RectF sliderBounds, float sliderSpeed, diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index 00b54e7f8..42cd96aab 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -58,6 +58,12 @@ void OptionsVoiceSlider::Render() { Renderer->DrawSprite(BoxSprite, Bounds.GetPos() + VoiceSliderOffset, Tint); } +void OptionsVoiceSlider::Update(float dt) { + OptionsSlider::Update(dt); + + MuteButton.Update(dt); +} + void OptionsVoiceSlider::UpdateInput() { OptionsSlider::UpdateInput(); MuteButton.UpdateInput(); @@ -85,6 +91,17 @@ void OptionsVoiceSlider::Hide() { MuteButton.Hide(); } +void OptionsVoiceSlider::Move(glm::vec2 relativePos) { + OptionsSlider::Move(relativePos); + MuteButton.Move(relativePos); +} + +void OptionsVoiceSlider::MoveTo(glm::vec2 pos) { + const glm::vec2 relativePosition = pos - Bounds.GetPos(); + OptionsSlider::MoveTo(pos); + MuteButton.Move(relativePosition); +} + void OptionsVoiceSlider::MuteButtonOnClick(ClickButton* target) { if (HasFocus) Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.h b/src/ui/widgets/cclcc/optionsvoiceslider.h index 932ba0113..ecac36d49 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.h +++ b/src/ui/widgets/cclcc/optionsvoiceslider.h @@ -15,11 +15,15 @@ class OptionsVoiceSlider : public OptionsSlider { glm::vec2 pos, glm::vec4 highlightTint, float sliderSpeed, std::function select); void Render() override; + void Update(float dt) override; void UpdateInput() override; void Show() override; void Hide() override; + void Move(glm::vec2 relativePos) override; + void MoveTo(glm::vec2 pos) override; + private: const Sprite& Portrait; const Sprite& MutedPortrait; From c1454caf28091cb68fef0f651654b98706d5e36e Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 28 Dec 2024 21:00:04 +0100 Subject: [PATCH 31/59] Implemented button holding logic for options menu --- profiles/cclcc/hud/optionsmenu.lua | 3 + src/games/cclcc/optionsmenu.cpp | 115 ++++++++++++++++---- src/games/cclcc/optionsmenu.h | 11 +- src/profile/games/cclcc/optionsmenu.cpp | 3 + src/profile/games/cclcc/optionsmenu.h | 3 + src/ui/backlogmenu.cpp | 2 +- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 5 - 7 files changed, 112 insertions(+), 30 deletions(-) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index 72eff68b3..e1113c3f2 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -72,6 +72,9 @@ root.OptionsMenu = { PortraitSprites = {}, PortraitOffset = { X = 3, Y = 2 }, VoicePosition = { X = 454, Y = 310 }, + + MinButtonHoldTime = 0.5, + ButtonHoldTimeInterval = 0.05, }; root.Sprites["OptionsBackground"] = { diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 9ec48f184..a73bccff1 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -177,7 +177,7 @@ void OptionsMenu::Update(float dt) { } if (State != Hidden) { - UpdateInput(); + UpdateInput(dt); Pages.at(CurrentPage)->Update(dt); } @@ -202,7 +202,8 @@ void OptionsMenu::Update(float dt) { } } -void OptionsMenu::UpdateInput() { +void OptionsMenu::UpdatePageInput(float dt) { + // Mouse input for (ClickButton& button : PageButtons) { const bool wasHovered = button.Hovered; button.UpdateInput(); @@ -210,20 +211,97 @@ void OptionsMenu::UpdateInput() { Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); } - // Tab cycling - if (PADinputButtonWentDown & (PAD1L1 | PAD1R1)) { - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + const bool pagePanelHighlighted = CurrentlyFocusedElement == nullptr; - const bool focusedElement = CurrentlyFocusedElement; - const int direction = (bool)(PADinputButtonWentDown & PAD1R1) - - (bool)(PADinputButtonWentDown & PAD1L1); - GoToPage((CurrentPage + direction) % Pages.size()); + // Button input - if (focusedElement) { - CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; - } + int direction = + (bool)(PADinputButtonIsDown & + (PAD1R1 | (PAD1DOWN * pagePanelHighlighted))) - + (bool)(PADinputButtonIsDown & (PAD1L1 | (PAD1UP * pagePanelHighlighted))); + + if (direction == 0) { + PageDirectionButtonHeldTime = 0.0f; + PageDirectionButtonWaitTime = 0.0f; + return; + } + + if (0.0f < PageDirectionButtonHeldTime && + PageDirectionButtonHeldTime < MinButtonHoldTime) { + PageDirectionButtonHeldTime += dt; + PageDirectionButtonWaitTime = 0.0f; + return; + } + + if (PageDirectionButtonWaitTime > 0.0f) { + PageDirectionButtonWaitTime -= dt; + return; + } + + // Page advancement fired + + PageDirectionButtonHeldTime += dt; + PageDirectionButtonWaitTime = ButtonHoldTimeInterval; + + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + + const bool focusedElement = CurrentlyFocusedElement; + GoToPage((CurrentPage + direction) % Pages.size()); + + if (focusedElement) { + CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); + CurrentlyFocusedElement->HasFocus = true; + } +} + +void OptionsMenu::UpdateEntryMovementInput(float dt) { + const int verticalMovement = (bool)(PADinputButtonIsDown & PAD1DOWN) - + (bool)(PADinputButtonIsDown & PAD1UP); + const int horizontalMovement = (bool)(PADinputButtonIsDown & PAD1RIGHT) - + (bool)(PADinputButtonIsDown & PAD1LEFT); + const bool moving = + verticalMovement || (CurrentPage == 3 && horizontalMovement); + + if (!moving) { + DirectionButtonHeldTime = 0.0f; + DirectionButtonWaitTime = 0.0f; + return; + } + + if (0.0f < DirectionButtonHeldTime && + DirectionButtonHeldTime < MinButtonHoldTime) { + DirectionButtonHeldTime += dt; + DirectionButtonWaitTime = 0.0f; + return; + } + + if (DirectionButtonWaitTime > 0.0f) { + DirectionButtonWaitTime -= dt; + return; + } + + // Advance entry + + DirectionButtonHeldTime += dt; + DirectionButtonWaitTime = ButtonHoldTimeInterval; + + const Widget* const lastHighlight = CurrentlyFocusedElement; + if (horizontalMovement != 0) { + const FocusDirection horizontalDirection = + horizontalMovement == -1 ? FDIR_LEFT : FDIR_RIGHT; + AdvanceFocus(horizontalDirection); + } + if (verticalMovement != 0) { + const FocusDirection verticalDirection = + verticalMovement == -1 ? FDIR_UP : FDIR_DOWN; + AdvanceFocus(verticalDirection); } + if (CurrentlyFocusedElement != lastHighlight) + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); +} + +void OptionsMenu::UpdateInput(float dt) { + UpdatePageInput(dt); if (CurrentlyFocusedElement == nullptr) { if (GetControlState(CT_Back)) { @@ -234,13 +312,6 @@ void OptionsMenu::UpdateInput() { return; } - const int direction = (bool)(PADinputButtonWentDown & PAD1DOWN) - - (bool)(PADinputButtonWentDown & PAD1UP); - if (direction) { - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); - GoToPage((CurrentPage + direction) % Pages.size()); - } - if (PADinputButtonWentDown & PAD1A) { // Don't have anything else consume the confirmation PADinputButtonWentDown &= ~PAD1A; @@ -265,9 +336,7 @@ void OptionsMenu::UpdateInput() { return; } - Menu::UpdateInput(); - if (PADinputButtonWentDown & (PAD1DOWN | PAD1UP)) - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + UpdateEntryMovementInput(dt); } void OptionsMenu::Render() { diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index 830b3839a..96b845434 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -19,7 +19,7 @@ class OptionsMenu : public Menu { void Show() override; void Hide() override; void Update(float dt) override; - void UpdateInput() override; + void UpdateInput(float dt); void Render() override; private: @@ -27,6 +27,9 @@ class OptionsMenu : public Menu { void Select(OptionsEntry* entry); void PageButtonOnClick(Widgets::ClickButton* target); + void UpdatePageInput(float dt); + void UpdateEntryMovementInput(float dt); + Animation FadeAnimation; SpriteAnimation PoleAnimation; @@ -38,6 +41,12 @@ class OptionsMenu : public Menu { int CurrentPage; std::vector Pages; std::vector PageButtons; + + float DirectionButtonHeldTime = 0.0f; + float DirectionButtonWaitTime = 0.0f; + + float PageDirectionButtonHeldTime = 0.0f; + float PageDirectionButtonWaitTime = 0.0f; }; } // namespace CCLCC diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index 73c26f20b..005178c3b 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -73,6 +73,9 @@ void Configure() { PortraitOffset = EnsureGetMemberVec2("PortraitOffset"); VoicePosition = EnsureGetMemberVec2("VoicePosition"); + MinButtonHoldTime = EnsureGetMemberFloat("MinButtonHoldTime"); + ButtonHoldTimeInterval = EnsureGetMemberFloat("ButtonHoldTimeInterval"); + auto drawType = Game::DrawComponentType::_from_integral_unchecked( EnsureGetMemberInt("DrawType")); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 66cfaafc2..76192d33a 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -71,6 +71,9 @@ inline Sprite PortraitSprites[PortraitCount]; inline glm::vec2 PortraitOffset; inline glm::vec2 VoicePosition; +inline float MinButtonHoldTime; +inline float ButtonHoldTimeInterval; + void Configure(); } // namespace OptionsMenu diff --git a/src/ui/backlogmenu.cpp b/src/ui/backlogmenu.cpp index a2da99fea..ac51345db 100644 --- a/src/ui/backlogmenu.cpp +++ b/src/ui/backlogmenu.cpp @@ -173,7 +173,7 @@ void BacklogMenu::UpdateScrollingInput(float dt) { if (!padScrolling) { DirectionalButtonHeldTime = 0.0f; return; - }; + } FocusDirection dir = (PADinputButtonIsDown & PAD1DOWN) ? FDIR_DOWN : FDIR_UP; diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index 42cd96aab..9c47d02ba 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -74,11 +74,6 @@ void OptionsVoiceSlider::UpdateInput() { Muted = !Muted; Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); } - - if ((bool)(PADinputButtonWentDown & (PAD1LEFT | PAD1RIGHT)) && - !(bool)(PADinputButtonWentDown & (PAD1UP | PAD1DOWN))) { - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); - } } void OptionsVoiceSlider::Show() { From 55a5285495270786bc121341ed541d4a93279e95 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 28 Dec 2024 21:11:35 +0100 Subject: [PATCH 32/59] Added menu mask overlay to config menu --- profiles/cclcc/hud/optionsmenu.lua | 7 +++++++ src/games/cclcc/optionsmenu.cpp | 9 +++++++++ src/profile/games/cclcc/optionsmenu.cpp | 2 ++ src/profile/games/cclcc/optionsmenu.h | 2 ++ 4 files changed, 20 insertions(+) diff --git a/profiles/cclcc/hud/optionsmenu.lua b/profiles/cclcc/hud/optionsmenu.lua index e1113c3f2..ad6c0800e 100644 --- a/profiles/cclcc/hud/optionsmenu.lua +++ b/profiles/cclcc/hud/optionsmenu.lua @@ -75,6 +75,8 @@ root.OptionsMenu = { MinButtonHoldTime = 0.5, ButtonHoldTimeInterval = 0.05, + + MenuMask = "MenuMask", }; root.Sprites["OptionsBackground"] = { @@ -152,6 +154,11 @@ root.Sprites["OptionsVoiceGuide"] = { Bounds = { X = 0, Y = 2416, Width = 1926, Height = 57 } }; +root.Sprites["MenuMask"] = { + Sheet = "MenuChip", + Bounds = { X = 154, Y = 140, Width = 1900, Height = 1061 }, +}; + for i = 0, 3 do height = 80; diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index a73bccff1..03333cceb 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -1,5 +1,6 @@ #include "optionsmenu.h" +#include "../../profile/game.h" #include "../../profile/ui/optionsmenu.h" #include "../../profile/games/cclcc/optionsmenu.h" #include "../../profile/scriptinput.h" @@ -344,6 +345,9 @@ void OptionsMenu::Render() { ScrWork[SW_SYSSUBMENUNO] == 5) { glm::vec4 col(1.0f, 1.0f, 1.0f, FadeAnimation.Progress); + glm::vec4 maskTint = col; + maskTint.a *= (float)0xa0 / 0x100; + const glm::vec2 backgroundAnimationOffset = glm::vec2(0.0f, FadeAnimation.Progress * BackgroundPosition.y + (1.0f - FadeAnimation.Progress) * @@ -378,6 +382,11 @@ void OptionsMenu::Render() { } } + Renderer->DrawSprite( + MenuMaskSprite, + RectF(0.0f, 0.0f, Profile::DesignWidth, Profile::DesignHeight), + maskTint); + const Sprite& guideSprite = CurrentPage == 3 ? VoiceGuideSprite : GuideSprite; Renderer->DrawSprite(guideSprite, guidePosition, col); diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index 005178c3b..bc9805aac 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -76,6 +76,8 @@ void Configure() { MinButtonHoldTime = EnsureGetMemberFloat("MinButtonHoldTime"); ButtonHoldTimeInterval = EnsureGetMemberFloat("ButtonHoldTimeInterval"); + MenuMaskSprite = EnsureGetMemberSprite("MenuMask"); + auto drawType = Game::DrawComponentType::_from_integral_unchecked( EnsureGetMemberInt("DrawType")); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 76192d33a..7db6b6f3e 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -74,6 +74,8 @@ inline glm::vec2 VoicePosition; inline float MinButtonHoldTime; inline float ButtonHoldTimeInterval; +inline Sprite MenuMaskSprite; + void Configure(); } // namespace OptionsMenu From 4c3a4169cc96dc84c4eb919aadcf4953984a027a Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 28 Dec 2024 21:24:41 +0100 Subject: [PATCH 33/59] Fixed options menu sometimes getting stuck upon quick reentry --- src/games/cclcc/optionsmenu.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 03333cceb..f36e8892f 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -165,8 +165,6 @@ void OptionsMenu::Hide() { } void OptionsMenu::Update(float dt) { - const bool wasAnimating = !FadeAnimation.IsOut() && !FadeAnimation.IsIn(); - FadeAnimation.Update(dt); PoleAnimation.Update(dt); if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown && @@ -192,14 +190,16 @@ void OptionsMenu::Update(float dt) { if (FadeAnimation.IsIn()) { State = Shown; Pages.at(CurrentPage)->MoveTo(glm::vec2(0.0f, BackgroundPosition.y)); - } else if (wasAnimating && FadeAnimation.IsOut()) { - State = Hidden; - - Pages.at(CurrentPage)->Hide(); - CurrentPage = 0; - CurrentlyFocusedElement = nullptr; + } else if (State == Hiding && FadeAnimation.IsOut()) { + if (ScrWork[SW_SYSSUBMENUCT] == 0) { + State = Hidden; - SetFlag(SF_SUBMENUEXIT, true); + Pages.at(CurrentPage)->Hide(); + CurrentPage = 0; + CurrentlyFocusedElement = nullptr; + } else { + SetFlag(SF_SUBMENUEXIT, true); + } } } From f207a12dd69466179b29dffb778d9806d55058d6 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Mon, 30 Dec 2024 15:55:42 +0100 Subject: [PATCH 34/59] Added hover-only constructor to ClickButton --- src/ui/widgets/clickbutton.cpp | 9 +++++++-- src/ui/widgets/clickbutton.h | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ui/widgets/clickbutton.cpp b/src/ui/widgets/clickbutton.cpp index c0756a680..29b2c137d 100644 --- a/src/ui/widgets/clickbutton.cpp +++ b/src/ui/widgets/clickbutton.cpp @@ -7,9 +7,13 @@ namespace Impacto { namespace UI { namespace Widgets { +ClickButton::ClickButton(int id, RectF bounds) : Id(id), Clickable(false) { + Bounds = bounds; +} + ClickButton::ClickButton(int id, RectF bounds, std::function onClickHandler) - : Id(id), OnClickHandler(onClickHandler) { + : Id(id), OnClickHandler(onClickHandler), Clickable(true) { Bounds = bounds; } @@ -26,7 +30,8 @@ void ClickButton::UpdateInput() { Hovered = Bounds.ContainsPoint(Input::CurTouchPos); } - if (Hovered && Vm::Interface::PADinputMouseWentDown & Vm::Interface::PAD1A) + if (Clickable && Hovered && + Vm::Interface::PADinputMouseWentDown & Vm::Interface::PAD1A) OnClickHandler(this); } diff --git a/src/ui/widgets/clickbutton.h b/src/ui/widgets/clickbutton.h index d844a04cf..ea6a7ef6d 100644 --- a/src/ui/widgets/clickbutton.h +++ b/src/ui/widgets/clickbutton.h @@ -11,6 +11,7 @@ namespace Widgets { class ClickButton : public Widget { public: ClickButton() {} + ClickButton(int id, RectF bounds); ClickButton(int id, RectF bounds, std::function onClickHandler); @@ -21,6 +22,8 @@ class ClickButton : public Widget { int Id; + private: + bool Clickable = false; std::function OnClickHandler; }; From 19da4bdb047a86867212a161a674f8dc84ace962 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Mon, 30 Dec 2024 15:55:56 +0100 Subject: [PATCH 35/59] Changed options page buttons to switch on hover --- src/games/cclcc/optionsmenu.cpp | 50 ++++++++++++++++----------------- src/games/cclcc/optionsmenu.h | 2 +- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index f36e8892f..9b2a3c934 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -35,11 +35,8 @@ OptionsMenu::OptionsMenu() { std::bind(&OptionsMenu::Select, this, std::placeholders::_1); PageButtons.reserve(PageCount); - std::function pageButtonOnClick = - std::bind(&OptionsMenu::PageButtonOnClick, this, std::placeholders::_1); for (int i = 0; i < PageCount; i++) { - PageButtons.push_back( - ClickButton(i, PagePanelHoverBounds[i], pageButtonOnClick)); + PageButtons.push_back(ClickButton(i, PagePanelHoverBounds[i])); } BasicPage = new Group(this); @@ -203,13 +200,23 @@ void OptionsMenu::Update(float dt) { } } +void OptionsMenu::PageButtonOnHover(int pageNumber) { + if (pageNumber != CurrentPage || !CurrentlyFocusedElement) + Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + + if (pageNumber == CurrentPage && CurrentlyFocusedElement) return; + + GoToPage(pageNumber); + CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); + CurrentlyFocusedElement->HasFocus = true; +} + void OptionsMenu::UpdatePageInput(float dt) { // Mouse input for (ClickButton& button : PageButtons) { const bool wasHovered = button.Hovered; button.UpdateInput(); - if (!wasHovered && button.Hovered) - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + if (!wasHovered && button.Hovered) PageButtonOnHover(button.Id); } const bool pagePanelHighlighted = CurrentlyFocusedElement == nullptr; @@ -304,15 +311,16 @@ void OptionsMenu::UpdateEntryMovementInput(float dt) { void OptionsMenu::UpdateInput(float dt) { UpdatePageInput(dt); - if (CurrentlyFocusedElement == nullptr) { - if (GetControlState(CT_Back)) { - if (!GetFlag(SF_SUBMENUEXIT)) - Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); + if (PADinputMouseWentDown & PAD1B || + CurrentlyFocusedElement == nullptr && GetControlState(CT_Back)) { + if (!GetFlag(SF_SUBMENUEXIT)) + Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); - Hide(); - return; - } + Hide(); + return; + } + if (CurrentlyFocusedElement == nullptr) { if (PADinputButtonWentDown & PAD1A) { // Don't have anything else consume the confirmation PADinputButtonWentDown &= ~PAD1A; @@ -373,8 +381,8 @@ void OptionsMenu::Render() { if (PoleAnimation.IsIn()) { for (ClickButton& panel : PageButtons) { if (panel.Id == CurrentPage || panel.Hovered) { - const bool highlighted = - panel.Id == CurrentPage && (bool)CurrentlyFocusedElement; + const bool highlighted = panel.Id == CurrentPage && + (CurrentlyFocusedElement || panel.Hovered); Renderer->DrawSprite( PagePanelSprites[2 * panel.Id + !highlighted], PagePanelPosition + PagePanelIconOffsets[panel.Id], col); @@ -401,6 +409,7 @@ void OptionsMenu::GoToPage(int pageNumber) { CurrentPage = pageNumber; Group& page = *Pages.at(CurrentPage); + CurrentlyFocusedElement = nullptr; page.HasFocus = true; page.Show(); } @@ -416,17 +425,6 @@ void OptionsMenu::Select(OptionsEntry* toSelect) { CurrentlyFocusedElement = toSelect; } -void OptionsMenu::PageButtonOnClick(ClickButton* target) { - if (target->Id != CurrentPage || !CurrentlyFocusedElement) - Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); - - if (target->Id == CurrentPage && CurrentlyFocusedElement) return; - - GoToPage(target->Id); - CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; -} - } // namespace CCLCC } // namespace UI } // namespace Impacto \ No newline at end of file diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index 96b845434..d52841d0d 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -25,7 +25,7 @@ class OptionsMenu : public Menu { private: void GoToPage(int pageNumber); void Select(OptionsEntry* entry); - void PageButtonOnClick(Widgets::ClickButton* target); + void PageButtonOnHover(int pageNumber); void UpdatePageInput(float dt); void UpdateEntryMovementInput(float dt); From fa9a4666fa6c4af50e5115058bd0812bbd8a681c Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Tue, 31 Dec 2024 22:17:31 +0100 Subject: [PATCH 36/59] Removed page selection layer in favour of directly cycling with Q and E --- src/games/cclcc/optionsmenu.cpp | 71 ++++++++++----------------------- src/games/cclcc/optionsmenu.h | 3 +- 2 files changed, 23 insertions(+), 51 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 9b2a3c934..dbc90da86 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -125,7 +125,7 @@ OptionsMenu::OptionsMenu() { Pages.push_back(VoicePage); - CurrentPage = 0; + Highlight(Pages.at(CurrentPage)->GetFirstFocusableChild()); } void OptionsMenu::Show() { @@ -134,7 +134,9 @@ void OptionsMenu::Show() { FadeAnimation.StartIn(); PoleAnimation.StartIn(); + CurrentPage = 0; Pages.at(CurrentPage)->Show(); + Highlight(Pages.at(CurrentPage)->GetFirstFocusableChild()); if (UI::FocusedMenu != nullptr) { LastFocusedMenu = UI::FocusedMenu; @@ -192,8 +194,6 @@ void OptionsMenu::Update(float dt) { State = Hidden; Pages.at(CurrentPage)->Hide(); - CurrentPage = 0; - CurrentlyFocusedElement = nullptr; } else { SetFlag(SF_SUBMENUEXIT, true); } @@ -207,8 +207,7 @@ void OptionsMenu::PageButtonOnHover(int pageNumber) { if (pageNumber == CurrentPage && CurrentlyFocusedElement) return; GoToPage(pageNumber); - CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; + Highlight(Pages.at(CurrentPage)->GetFirstFocusableChild()); } void OptionsMenu::UpdatePageInput(float dt) { @@ -219,14 +218,10 @@ void OptionsMenu::UpdatePageInput(float dt) { if (!wasHovered && button.Hovered) PageButtonOnHover(button.Id); } - const bool pagePanelHighlighted = CurrentlyFocusedElement == nullptr; - // Button input - int direction = - (bool)(PADinputButtonIsDown & - (PAD1R1 | (PAD1DOWN * pagePanelHighlighted))) - - (bool)(PADinputButtonIsDown & (PAD1L1 | (PAD1UP * pagePanelHighlighted))); + const int direction = (bool)(PADinputButtonIsDown & PAD1R1) - + (bool)(PADinputButtonIsDown & PAD1L1); if (direction == 0) { PageDirectionButtonHeldTime = 0.0f; @@ -253,13 +248,7 @@ void OptionsMenu::UpdatePageInput(float dt) { Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); - const bool focusedElement = CurrentlyFocusedElement; GoToPage((CurrentPage + direction) % Pages.size()); - - if (focusedElement) { - CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; - } } void OptionsMenu::UpdateEntryMovementInput(float dt) { @@ -312,7 +301,8 @@ void OptionsMenu::UpdateInput(float dt) { UpdatePageInput(dt); if (PADinputMouseWentDown & PAD1B || - CurrentlyFocusedElement == nullptr && GetControlState(CT_Back)) { + !static_cast(CurrentlyFocusedElement)->Selected && + GetControlState(CT_Back)) { if (!GetFlag(SF_SUBMENUEXIT)) Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); @@ -320,31 +310,9 @@ void OptionsMenu::UpdateInput(float dt) { return; } - if (CurrentlyFocusedElement == nullptr) { - if (PADinputButtonWentDown & PAD1A) { - // Don't have anything else consume the confirmation - PADinputButtonWentDown &= ~PAD1A; - - Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); - - CurrentlyFocusedElement = Pages.at(CurrentPage)->GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; - } - - return; - } - // If something is selected, the option entry takes full control if (static_cast(CurrentlyFocusedElement)->Selected) return; - if (GetControlState(CT_Back) || PADinputMouseWentDown & PAD1B) { - Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); - - static_cast(CurrentlyFocusedElement)->Hide(); - CurrentlyFocusedElement = nullptr; - return; - } - UpdateEntryMovementInput(dt); } @@ -379,15 +347,9 @@ void OptionsMenu::Render() { Renderer->DrawSprite(PoleAnimation.CurrentSprite(), pagePanelPosition, col); if (PoleAnimation.IsIn()) { - for (ClickButton& panel : PageButtons) { - if (panel.Id == CurrentPage || panel.Hovered) { - const bool highlighted = panel.Id == CurrentPage && - (CurrentlyFocusedElement || panel.Hovered); - Renderer->DrawSprite( - PagePanelSprites[2 * panel.Id + !highlighted], - PagePanelPosition + PagePanelIconOffsets[panel.Id], col); - } - } + Renderer->DrawSprite( + PagePanelSprites[2 * CurrentPage], + PagePanelPosition + PagePanelIconOffsets[CurrentPage], col); } Renderer->DrawSprite( @@ -409,9 +371,9 @@ void OptionsMenu::GoToPage(int pageNumber) { CurrentPage = pageNumber; Group& page = *Pages.at(CurrentPage); - CurrentlyFocusedElement = nullptr; page.HasFocus = true; page.Show(); + Highlight(page.GetFirstFocusableChild()); } void OptionsMenu::Select(OptionsEntry* toSelect) { @@ -425,6 +387,15 @@ void OptionsMenu::Select(OptionsEntry* toSelect) { CurrentlyFocusedElement = toSelect; } +void OptionsMenu::Highlight(Widget* toHighlight) { + for (Widget* entry : Pages.at(CurrentPage)->Children) { + entry->HasFocus = false; + } + + toHighlight->HasFocus = true; + CurrentlyFocusedElement = toHighlight; +} + } // namespace CCLCC } // namespace UI } // namespace Impacto \ No newline at end of file diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index d52841d0d..2e92091ba 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -25,6 +25,7 @@ class OptionsMenu : public Menu { private: void GoToPage(int pageNumber); void Select(OptionsEntry* entry); + void Highlight(Widget* entry); void PageButtonOnHover(int pageNumber); void UpdatePageInput(float dt); @@ -38,7 +39,7 @@ class OptionsMenu : public Menu { Widgets::Group* SoundPage; Widgets::Group* VoicePage; - int CurrentPage; + int CurrentPage = 0; std::vector Pages; std::vector PageButtons; From fddc3526386b25b010bf054f83f9a3ccf6feebee Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 2 Jan 2025 23:17:57 +0100 Subject: [PATCH 37/59] Mouse hovering now deselects the entry and moves the highlighted one --- src/games/cclcc/optionsmenu.cpp | 62 ++++++++++++-------- src/games/cclcc/optionsmenu.h | 7 ++- src/ui/widgets/cclcc/optionsbinarybutton.cpp | 5 +- src/ui/widgets/cclcc/optionsbinarybutton.h | 3 +- src/ui/widgets/cclcc/optionsentry.cpp | 18 ++++-- src/ui/widgets/cclcc/optionsentry.h | 4 +- src/ui/widgets/cclcc/optionsslider.cpp | 10 ++-- src/ui/widgets/cclcc/optionsslider.h | 6 +- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 7 ++- src/ui/widgets/cclcc/optionsvoiceslider.h | 3 +- 10 files changed, 81 insertions(+), 44 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index dbc90da86..af120705f 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -33,6 +33,8 @@ OptionsMenu::OptionsMenu() { glm::vec4 highlightTint(HighlightColor, 1.0f); std::function select = std::bind(&OptionsMenu::Select, this, std::placeholders::_1); + std::function highlight = + std::bind(&OptionsMenu::Highlight, this, std::placeholders::_1); PageButtons.reserve(PageCount); for (int i = 0; i < PageCount; i++) { @@ -41,10 +43,10 @@ OptionsMenu::OptionsMenu() { BasicPage = new Group(this); for (int i = 0; i < 4; i++) { - BasicPage->Add( - new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, - LabelSprites[i], pos, highlightTint, select), - FDIR_DOWN); + BasicPage->Add(new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, + LabelSprites[i], pos, highlightTint, + select, highlight), + FDIR_DOWN); pos.y += EntriesVerticalOffset; } @@ -53,16 +55,17 @@ OptionsMenu::OptionsMenu() { pos = EntriesStartPosition; TextPage = new Group(this); for (int i = 4; i < 6; i++) { - TextPage->Add(new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos, - highlightTint, SliderSpeed, select), - FDIR_DOWN); + TextPage->Add( + new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos, + highlightTint, SliderSpeed, select, highlight), + FDIR_DOWN); pos.y += EntriesVerticalOffset; } - TextPage->Add( - new OptionsBinaryButton(BinaryBoxSprite, SkipReadSprite, SkipAllSprite, - LabelSprites[6], pos, highlightTint, select), - FDIR_DOWN); + TextPage->Add(new OptionsBinaryButton(BinaryBoxSprite, SkipReadSprite, + SkipAllSprite, LabelSprites[6], pos, + highlightTint, select, highlight), + FDIR_DOWN); Pages.push_back(TextPage); pos = SoundEntriesStartPosition; @@ -71,10 +74,10 @@ OptionsMenu::OptionsMenu() { Widget* widget = (i < 11 || i == 14) ? new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos, - highlightTint, SliderSpeed, select) - : widget = new OptionsBinaryButton(BinaryBoxSprite, YesSprite, - NoSprite, LabelSprites[i], pos, - highlightTint, select); + highlightTint, SliderSpeed, select, highlight) + : widget = new OptionsBinaryButton( + BinaryBoxSprite, YesSprite, NoSprite, LabelSprites[i], pos, + highlightTint, select, highlight); SoundPage->Add(widget, FDIR_DOWN); pos.y += SoundEntriesVerticalOffset; @@ -90,7 +93,8 @@ OptionsMenu::OptionsMenu() { Widget* widget = new OptionsVoiceSlider( VoiceSliderTrackSprite, NametagSprites[i], PortraitSprites[2 * i], - PortraitSprites[2 * i + 1], pos, highlightTint, SliderSpeed, select); + PortraitSprites[2 * i + 1], pos, highlightTint, SliderSpeed, select, + highlight); VoicePage->Add(widget, FDIR_RIGHT); } @@ -160,6 +164,12 @@ void OptionsMenu::Hide() { UI::FocusedMenu = nullptr; } IsFocused = false; + + if (CurrentlyFocusedElement) { + static_cast(CurrentlyFocusedElement)->Selected = false; + CurrentlyFocusedElement->HasFocus = false; + CurrentlyFocusedElement = nullptr; + } } } @@ -293,16 +303,17 @@ void OptionsMenu::UpdateEntryMovementInput(float dt) { verticalMovement == -1 ? FDIR_UP : FDIR_DOWN; AdvanceFocus(verticalDirection); } - if (CurrentlyFocusedElement != lastHighlight) + if (CurrentlyFocusedElement != lastHighlight) { Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + Highlight(CurrentlyFocusedElement); + } } void OptionsMenu::UpdateInput(float dt) { UpdatePageInput(dt); if (PADinputMouseWentDown & PAD1B || - !static_cast(CurrentlyFocusedElement)->Selected && - GetControlState(CT_Back)) { + !AnyEntrySelected() && GetControlState(CT_Back)) { if (!GetFlag(SF_SUBMENUEXIT)) Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); @@ -311,7 +322,7 @@ void OptionsMenu::UpdateInput(float dt) { } // If something is selected, the option entry takes full control - if (static_cast(CurrentlyFocusedElement)->Selected) return; + if (AnyEntrySelected()) return; UpdateEntryMovementInput(dt); } @@ -378,18 +389,21 @@ void OptionsMenu::GoToPage(int pageNumber) { void OptionsMenu::Select(OptionsEntry* toSelect) { for (Widget* entry : Pages.at(CurrentPage)->Children) { - const bool select = entry == toSelect; - - static_cast(entry)->Selected = select; - entry->HasFocus = select; + static_cast(entry)->Selected = false; + entry->HasFocus = false; } + toSelect->Selected = true; + toSelect->HasFocus = true; CurrentlyFocusedElement = toSelect; } void OptionsMenu::Highlight(Widget* toHighlight) { + if (CurrentlyFocusedElement == toHighlight) return; + for (Widget* entry : Pages.at(CurrentPage)->Children) { entry->HasFocus = false; + static_cast(entry)->Selected = false; } toHighlight->HasFocus = true; diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index 2e92091ba..f94b3236a 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -24,9 +24,14 @@ class OptionsMenu : public Menu { private: void GoToPage(int pageNumber); + void PageButtonOnHover(int pageNumber); + void Select(OptionsEntry* entry); void Highlight(Widget* entry); - void PageButtonOnHover(int pageNumber); + inline bool AnyEntrySelected() { + return CurrentlyFocusedElement && + static_cast(CurrentlyFocusedElement)->Selected; + } void UpdatePageInput(float dt); void UpdateEntryMovementInput(float dt); diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index f4278a628..711dda106 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -16,8 +16,9 @@ namespace CCLCC { OptionsBinaryButton::OptionsBinaryButton( const Sprite& box, const Sprite& trueLabel, const Sprite& falseLabel, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, - std::function select) - : OptionsEntry(label, pos, highlightTint, select), + std::function select, + std::function highlight) + : OptionsEntry(label, pos, highlightTint, select, highlight), BoxSprite(box), TrueSprite(trueLabel), FalseSprite(falseLabel) { diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.h b/src/ui/widgets/cclcc/optionsbinarybutton.h index 74cdb6dae..b4c2e1a08 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.h +++ b/src/ui/widgets/cclcc/optionsbinarybutton.h @@ -14,7 +14,8 @@ class OptionsBinaryButton : public OptionsEntry { OptionsBinaryButton(const Sprite& box, const Sprite& trueLabel, const Sprite& falseLabel, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, - std::function select); + std::function select, + std::function highlight); void Render() override; void Update(float dt) override; diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index 892992a77..ff465d8ca 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -14,8 +14,12 @@ namespace CCLCC { OptionsEntry::OptionsEntry(const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, - std::function select) - : LabelSprite(label), HighlightTint(highlightTint), Select(select) { + std::function select, + std::function highlight) + : LabelSprite(label), + HighlightTint(highlightTint), + Select(select), + Highlight(highlight) { Bounds = RectF(pos.x, pos.y, LabelOffset.x + LabelSprite.ScaledWidth(), LabelOffset.y + LabelSprite.ScaledHeight()); @@ -27,7 +31,7 @@ OptionsEntry::OptionsEntry(const Sprite& label, glm::vec2 pos, void OptionsEntry::Render() { HighlightTint.a = Tint.a; - if (HasFocus || EntryButton.Hovered) { + if (HasFocus) { RectF highlightBoundBox(Bounds.X, Bounds.Y, EntryDimensions.x, EntryDimensions.y); Renderer->DrawRect(highlightBoundBox, HighlightTint); @@ -50,19 +54,23 @@ void OptionsEntry::Update(float dt) { void OptionsEntry::UpdateInput() { const bool wasHovered = EntryButton.Hovered; EntryButton.UpdateInput(); - if (!wasHovered && EntryButton.Hovered) + if (!HasFocus && !wasHovered && EntryButton.Hovered) { Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + Highlight(this); + } if (!HasFocus) return; if (PADinputButtonWentDown & PAD1A) { Selected = !Selected; Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + return; } - if (PADinputButtonWentDown & PAD1B || PADinputMouseWentDown & PAD1B) { + if (Selected && PADinputButtonWentDown & PAD1B) { Selected = false; Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); + return; } } diff --git a/src/ui/widgets/cclcc/optionsentry.h b/src/ui/widgets/cclcc/optionsentry.h index 00751b76f..8c1c85b81 100644 --- a/src/ui/widgets/cclcc/optionsentry.h +++ b/src/ui/widgets/cclcc/optionsentry.h @@ -14,7 +14,8 @@ namespace CCLCC { class OptionsEntry : public Widget { public: OptionsEntry(const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, - std::function select); + std::function select, + std::function highlight); void Render() override; void Update(float dt) override; @@ -31,6 +32,7 @@ class OptionsEntry : public Widget { protected: ClickButton EntryButton; std::function Select; + std::function Highlight; void EntryButtonOnClick(ClickButton* target); const Sprite& LabelSprite; diff --git a/src/ui/widgets/cclcc/optionsslider.cpp b/src/ui/widgets/cclcc/optionsslider.cpp index cfec4b330..ba1938e33 100644 --- a/src/ui/widgets/cclcc/optionsslider.cpp +++ b/src/ui/widgets/cclcc/optionsslider.cpp @@ -15,8 +15,9 @@ namespace CCLCC { OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, float sliderSpeed, - std::function select) - : OptionsEntry(label, pos, highlightTint, select), + std::function select, + std::function highlight) + : OptionsEntry(label, pos, highlightTint, select, highlight), BoxSprite(box), Slider(0, pos + SliderTrackOffset, 0.0f, 1.0f, &Progress, SBDIR_HORIZONTAL, @@ -28,8 +29,9 @@ OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, OptionsSlider::OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, RectF sliderBounds, float sliderSpeed, - std::function select) - : OptionsEntry(label, pos, highlightTint, select), + std::function select, + std::function highlight) + : OptionsEntry(label, pos, highlightTint, select, highlight), BoxSprite(box), Slider(0, sliderBounds.GetPos(), 0.0f, 1.0f, &Progress, SBDIR_HORIZONTAL, sliderBounds.GetSize()) {} diff --git a/src/ui/widgets/cclcc/optionsslider.h b/src/ui/widgets/cclcc/optionsslider.h index b71bd5768..ec89a6f47 100644 --- a/src/ui/widgets/cclcc/optionsslider.h +++ b/src/ui/widgets/cclcc/optionsslider.h @@ -13,7 +13,8 @@ class OptionsSlider : public OptionsEntry { public: OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, float sliderSpeed, - std::function select); + std::function select, + std::function highlight); void Render() override; void Update(float dt) override; @@ -25,7 +26,8 @@ class OptionsSlider : public OptionsEntry { protected: OptionsSlider(const Sprite& box, const Sprite& label, glm::vec2 pos, glm::vec4 highlightTint, RectF sliderBounds, float sliderSpeed, - std::function select); + std::function select, + std::function highlight); const Sprite& BoxSprite; diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index 9c47d02ba..74220681f 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -15,12 +15,13 @@ namespace CCLCC { OptionsVoiceSlider::OptionsVoiceSlider( const Sprite& box, const Sprite& label, const Sprite& portrait, const Sprite& mutedPortrait, glm::vec2 pos, glm::vec4 highlightTint, - float sliderSpeed, std::function select) + float sliderSpeed, std::function select, + std::function highlight) : OptionsSlider( box, label, pos, highlightTint, RectF(pos.x + VoiceSliderOffset.x, pos.y + VoiceSliderOffset.y, box.ScaledWidth(), box.ScaledHeight()), - sliderSpeed, select), + sliderSpeed, select, highlight), Portrait(portrait), MutedPortrait(mutedPortrait) { Bounds = @@ -38,7 +39,7 @@ OptionsVoiceSlider::OptionsVoiceSlider( void OptionsVoiceSlider::Render() { HighlightTint.a = Tint.a; - if (HasFocus || EntryButton.Hovered) { + if (HasFocus) { RectF highlightBoundBox(Bounds.X, Bounds.Y, VoiceEntryDimensions.x, VoiceEntryDimensions.y); Renderer->DrawRect(highlightBoundBox, HighlightTint); diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.h b/src/ui/widgets/cclcc/optionsvoiceslider.h index ecac36d49..4bc9fc93c 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.h +++ b/src/ui/widgets/cclcc/optionsvoiceslider.h @@ -13,7 +13,8 @@ class OptionsVoiceSlider : public OptionsSlider { OptionsVoiceSlider(const Sprite& box, const Sprite& label, const Sprite& portrait, const Sprite& mutedPortrait, glm::vec2 pos, glm::vec4 highlightTint, float sliderSpeed, - std::function select); + std::function select, + std::function highlight); void Render() override; void Update(float dt) override; void UpdateInput() override; From 3ebf47b9aa4b03dae7cceb3a8df3e81fc642d20b Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Tue, 14 Jan 2025 22:49:27 +0100 Subject: [PATCH 38/59] Changed options menu to hold unique pointers to pages --- src/games/cclcc/optionsmenu.cpp | 36 ++++++++++++++++----------------- src/games/cclcc/optionsmenu.h | 7 +------ 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index af120705f..416fc931b 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -41,35 +41,35 @@ OptionsMenu::OptionsMenu() { PageButtons.push_back(ClickButton(i, PagePanelHoverBounds[i])); } - BasicPage = new Group(this); + std::unique_ptr basicPage = std::make_unique(this); for (int i = 0; i < 4; i++) { - BasicPage->Add(new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, + basicPage->Add(new OptionsBinaryButton(BinaryBoxSprite, OnSprite, OffSprite, LabelSprites[i], pos, highlightTint, select, highlight), FDIR_DOWN); pos.y += EntriesVerticalOffset; } - Pages.push_back(BasicPage); + Pages.push_back(std::move(basicPage)); pos = EntriesStartPosition; - TextPage = new Group(this); + std::unique_ptr textPage = std::make_unique(this); for (int i = 4; i < 6; i++) { - TextPage->Add( + textPage->Add( new OptionsSlider(SliderTrackSprite, LabelSprites[i], pos, highlightTint, SliderSpeed, select, highlight), FDIR_DOWN); pos.y += EntriesVerticalOffset; } - TextPage->Add(new OptionsBinaryButton(BinaryBoxSprite, SkipReadSprite, + textPage->Add(new OptionsBinaryButton(BinaryBoxSprite, SkipReadSprite, SkipAllSprite, LabelSprites[6], pos, highlightTint, select, highlight), FDIR_DOWN); - Pages.push_back(TextPage); + Pages.push_back(std::move(textPage)); pos = SoundEntriesStartPosition; - SoundPage = new Group(this); + std::unique_ptr soundPage = std::make_unique(this); for (int i = 7; i < 15; i++) { Widget* widget = (i < 11 || i == 14) @@ -78,13 +78,13 @@ OptionsMenu::OptionsMenu() { : widget = new OptionsBinaryButton( BinaryBoxSprite, YesSprite, NoSprite, LabelSprites[i], pos, highlightTint, select, highlight); - SoundPage->Add(widget, FDIR_DOWN); + soundPage->Add(widget, FDIR_DOWN); pos.y += SoundEntriesVerticalOffset; } - Pages.push_back(SoundPage); + Pages.push_back(std::move(soundPage)); - VoicePage = new Group(this); + std::unique_ptr voicePage = std::make_unique(this); constexpr int columns = 3; constexpr int entries = 12; for (int i = 0; i < entries; i++) { @@ -95,39 +95,39 @@ OptionsMenu::OptionsMenu() { VoiceSliderTrackSprite, NametagSprites[i], PortraitSprites[2 * i], PortraitSprites[2 * i + 1], pos, highlightTint, SliderSpeed, select, highlight); - VoicePage->Add(widget, FDIR_RIGHT); + voicePage->Add(widget, FDIR_RIGHT); } // Loop separately to overwrite the direction set at initial adding // First entry won't set anything; skip for (int i = 1; i < entries; i++) { - Widget* const widget = VoicePage->Children.at(i); + Widget* const widget = voicePage->Children.at(i); if (i % columns != 0) { // Not on first column - Widget* const leftWidget = VoicePage->Children.at(i - 1); + Widget* const leftWidget = voicePage->Children.at(i - 1); widget->SetFocus(leftWidget, FDIR_LEFT); leftWidget->SetFocus(widget, FDIR_RIGHT); if (i % columns == columns - 1) { // On last column - Widget* const rowStart = VoicePage->Children.at(i - columns + 1); + Widget* const rowStart = voicePage->Children.at(i - columns + 1); widget->SetFocus(rowStart, FDIR_RIGHT); rowStart->SetFocus(widget, FDIR_LEFT); } } if (i >= columns) { // Not on first row - Widget* const upWidget = VoicePage->Children.at(i - columns); + Widget* const upWidget = voicePage->Children.at(i - columns); widget->SetFocus(upWidget, FDIR_UP); upWidget->SetFocus(widget, FDIR_DOWN); if (i >= entries - columns) { // On last layer - Widget* const columnStart = VoicePage->Children.at(i % columns); + Widget* const columnStart = voicePage->Children.at(i % columns); widget->SetFocus(columnStart, FDIR_DOWN); columnStart->SetFocus(widget, FDIR_UP); } } } - Pages.push_back(VoicePage); + Pages.push_back(std::move(voicePage)); Highlight(Pages.at(CurrentPage)->GetFirstFocusableChild()); } diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index f94b3236a..d5dff79a1 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -39,13 +39,8 @@ class OptionsMenu : public Menu { Animation FadeAnimation; SpriteAnimation PoleAnimation; - Widgets::Group* BasicPage; - Widgets::Group* TextPage; - Widgets::Group* SoundPage; - Widgets::Group* VoicePage; - int CurrentPage = 0; - std::vector Pages; + std::vector> Pages; std::vector PageButtons; float DirectionButtonHeldTime = 0.0f; From b049a0b4c0fdd2ed3963ab3d11cff45ea29c6443 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Tue, 14 Jan 2025 22:55:54 +0100 Subject: [PATCH 39/59] Changed several 'at' calls to direct indexing --- src/games/cclcc/optionsmenu.cpp | 38 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 416fc931b..3db922187 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -101,26 +101,26 @@ OptionsMenu::OptionsMenu() { // Loop separately to overwrite the direction set at initial adding // First entry won't set anything; skip for (int i = 1; i < entries; i++) { - Widget* const widget = voicePage->Children.at(i); + Widget* const widget = voicePage->Children[i]; if (i % columns != 0) { // Not on first column - Widget* const leftWidget = voicePage->Children.at(i - 1); + Widget* const leftWidget = voicePage->Children[i - 1]; widget->SetFocus(leftWidget, FDIR_LEFT); leftWidget->SetFocus(widget, FDIR_RIGHT); if (i % columns == columns - 1) { // On last column - Widget* const rowStart = voicePage->Children.at(i - columns + 1); + Widget* const rowStart = voicePage->Children[i - columns + 1]; widget->SetFocus(rowStart, FDIR_RIGHT); rowStart->SetFocus(widget, FDIR_LEFT); } } if (i >= columns) { // Not on first row - Widget* const upWidget = voicePage->Children.at(i - columns); + Widget* const upWidget = voicePage->Children[i - columns]; widget->SetFocus(upWidget, FDIR_UP); upWidget->SetFocus(widget, FDIR_DOWN); if (i >= entries - columns) { // On last layer - Widget* const columnStart = voicePage->Children.at(i % columns); + Widget* const columnStart = voicePage->Children[i % columns]; widget->SetFocus(columnStart, FDIR_DOWN); columnStart->SetFocus(widget, FDIR_UP); } @@ -129,7 +129,7 @@ OptionsMenu::OptionsMenu() { Pages.push_back(std::move(voicePage)); - Highlight(Pages.at(CurrentPage)->GetFirstFocusableChild()); + Highlight(Pages[CurrentPage]->GetFirstFocusableChild()); } void OptionsMenu::Show() { @@ -139,8 +139,8 @@ void OptionsMenu::Show() { PoleAnimation.StartIn(); CurrentPage = 0; - Pages.at(CurrentPage)->Show(); - Highlight(Pages.at(CurrentPage)->GetFirstFocusableChild()); + Pages[CurrentPage]->Show(); + Highlight(Pages[CurrentPage]->GetFirstFocusableChild()); if (UI::FocusedMenu != nullptr) { LastFocusedMenu = UI::FocusedMenu; @@ -186,24 +186,24 @@ void OptionsMenu::Update(float dt) { if (State != Hidden) { UpdateInput(dt); - Pages.at(CurrentPage)->Update(dt); + Pages[CurrentPage]->Update(dt); } if (!FadeAnimation.IsIn() && !FadeAnimation.IsOut()) { const glm::vec2 backgroundPosition = glm::vec2(0.0f, glm::mix(BackgroundFadeStartPosition.y, BackgroundPosition.y, FadeAnimation.Progress)); - Pages.at(CurrentPage)->MoveTo(backgroundPosition); + Pages[CurrentPage]->MoveTo(backgroundPosition); } if (FadeAnimation.IsIn()) { State = Shown; - Pages.at(CurrentPage)->MoveTo(glm::vec2(0.0f, BackgroundPosition.y)); + Pages[CurrentPage]->MoveTo(glm::vec2(0.0f, BackgroundPosition.y)); } else if (State == Hiding && FadeAnimation.IsOut()) { if (ScrWork[SW_SYSSUBMENUCT] == 0) { State = Hidden; - Pages.at(CurrentPage)->Hide(); + Pages[CurrentPage]->Hide(); } else { SetFlag(SF_SUBMENUEXIT, true); } @@ -217,7 +217,7 @@ void OptionsMenu::PageButtonOnHover(int pageNumber) { if (pageNumber == CurrentPage && CurrentlyFocusedElement) return; GoToPage(pageNumber); - Highlight(Pages.at(CurrentPage)->GetFirstFocusableChild()); + Highlight(Pages[CurrentPage]->GetFirstFocusableChild()); } void OptionsMenu::UpdatePageInput(float dt) { @@ -353,8 +353,8 @@ void OptionsMenu::Render() { Renderer->DrawSprite(PageHeaderSprites[CurrentPage], PageHeaderPosition + backgroundAnimationOffset, col); - Pages.at(CurrentPage)->Tint = col; - Pages.at(CurrentPage)->Render(); + Pages[CurrentPage]->Tint = col; + Pages[CurrentPage]->Render(); Renderer->DrawSprite(PoleAnimation.CurrentSprite(), pagePanelPosition, col); if (PoleAnimation.IsIn()) { @@ -377,10 +377,10 @@ void OptionsMenu::Render() { void OptionsMenu::GoToPage(int pageNumber) { if (CurrentPage == pageNumber) return; - Pages.at(CurrentPage)->Hide(); + Pages[CurrentPage]->Hide(); CurrentPage = pageNumber; - Group& page = *Pages.at(CurrentPage); + Group& page = *Pages[CurrentPage]; page.HasFocus = true; page.Show(); @@ -388,7 +388,7 @@ void OptionsMenu::GoToPage(int pageNumber) { } void OptionsMenu::Select(OptionsEntry* toSelect) { - for (Widget* entry : Pages.at(CurrentPage)->Children) { + for (Widget* entry : Pages[CurrentPage]->Children) { static_cast(entry)->Selected = false; entry->HasFocus = false; } @@ -401,7 +401,7 @@ void OptionsMenu::Select(OptionsEntry* toSelect) { void OptionsMenu::Highlight(Widget* toHighlight) { if (CurrentlyFocusedElement == toHighlight) return; - for (Widget* entry : Pages.at(CurrentPage)->Children) { + for (Widget* entry : Pages[CurrentPage]->Children) { entry->HasFocus = false; static_cast(entry)->Selected = false; } From e2c46d06e7b2cf7c0e42789773516004c87fa64a Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Tue, 14 Jan 2025 22:57:24 +0100 Subject: [PATCH 40/59] Removed superfluous inline --- src/games/cclcc/optionsmenu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index d5dff79a1..b6c533b01 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -28,7 +28,7 @@ class OptionsMenu : public Menu { void Select(OptionsEntry* entry); void Highlight(Widget* entry); - inline bool AnyEntrySelected() { + bool AnyEntrySelected() { return CurrentlyFocusedElement && static_cast(CurrentlyFocusedElement)->Selected; } From 45a0bd28638ee28b634c43eed6a3f1f44e01cbcd Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Tue, 14 Jan 2025 23:01:13 +0100 Subject: [PATCH 41/59] Reverted to explicit opt-out for widget rendering --- src/ui/widget.h | 2 +- src/ui/widgets/clickbutton.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/widget.h b/src/ui/widget.h index e18ac8c0d..f08f4f25c 100644 --- a/src/ui/widget.h +++ b/src/ui/widget.h @@ -24,7 +24,7 @@ class Widget { virtual void Update(float dt); virtual void UpdateInput() = 0; - virtual void Render() {} + virtual void Render() = 0; virtual void Show(); virtual void Hide(); diff --git a/src/ui/widgets/clickbutton.h b/src/ui/widgets/clickbutton.h index ea6a7ef6d..194cb34fb 100644 --- a/src/ui/widgets/clickbutton.h +++ b/src/ui/widgets/clickbutton.h @@ -19,6 +19,7 @@ class ClickButton : public Widget { virtual void Show(); virtual void Hide(); + virtual void Render() {} int Id; From 01f2e0ed8628e498dbdd87803f5bd4313b30219c Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Wed, 15 Jan 2025 02:27:29 +0100 Subject: [PATCH 42/59] Changed options menu sound effects to play from the correct channel --- src/games/cclcc/optionsmenu.cpp | 8 ++++---- src/ui/widgets/cclcc/optionsbinarybutton.cpp | 6 +++--- src/ui/widgets/cclcc/optionsentry.cpp | 8 ++++---- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 3db922187..29983ae50 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -212,7 +212,7 @@ void OptionsMenu::Update(float dt) { void OptionsMenu::PageButtonOnHover(int pageNumber) { if (pageNumber != CurrentPage || !CurrentlyFocusedElement) - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); if (pageNumber == CurrentPage && CurrentlyFocusedElement) return; @@ -256,7 +256,7 @@ void OptionsMenu::UpdatePageInput(float dt) { PageDirectionButtonHeldTime += dt; PageDirectionButtonWaitTime = ButtonHoldTimeInterval; - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); GoToPage((CurrentPage + direction) % Pages.size()); } @@ -304,7 +304,7 @@ void OptionsMenu::UpdateEntryMovementInput(float dt) { AdvanceFocus(verticalDirection); } if (CurrentlyFocusedElement != lastHighlight) { - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); Highlight(CurrentlyFocusedElement); } } @@ -315,7 +315,7 @@ void OptionsMenu::UpdateInput(float dt) { if (PADinputMouseWentDown & PAD1B || !AnyEntrySelected() && GetControlState(CT_Back)) { if (!GetFlag(SF_SUBMENUEXIT)) - Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 3, false, 0.0f); Hide(); return; diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index 711dda106..a23009aa2 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -77,7 +77,7 @@ void OptionsBinaryButton::UpdateInput() { const bool newState = PADinputButtonWentDown & PAD1LEFT; if (State != newState) - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); State = newState; } @@ -112,14 +112,14 @@ void OptionsBinaryButton::MoveTo(glm::vec2 pos) { void OptionsBinaryButton::TrueOnClick(ClickButton* target) { if (Selected && State != true) - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); State = true; } void OptionsBinaryButton::FalseOnClick(ClickButton* target) { if (Selected && State != false) - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); State = false; } diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index ff465d8ca..7225cb805 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -55,7 +55,7 @@ void OptionsEntry::UpdateInput() { const bool wasHovered = EntryButton.Hovered; EntryButton.UpdateInput(); if (!HasFocus && !wasHovered && EntryButton.Hovered) { - Audio::Channels[Audio::AC_REV]->Play("sysse", 1, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); Highlight(this); } @@ -63,13 +63,13 @@ void OptionsEntry::UpdateInput() { if (PADinputButtonWentDown & PAD1A) { Selected = !Selected; - Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 2, false, 0.0f); return; } if (Selected && PADinputButtonWentDown & PAD1B) { Selected = false; - Audio::Channels[Audio::AC_REV]->Play("sysse", 3, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 3, false, 0.0f); return; } } @@ -96,7 +96,7 @@ void OptionsEntry::MoveTo(glm::vec2 pos) { void OptionsEntry::EntryButtonOnClick(ClickButton* target) { if (Selected) return; - Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 2, false, 0.0f); Select(this); } diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index 74220681f..5db862f5b 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -73,7 +73,7 @@ void OptionsVoiceSlider::UpdateInput() { if (PADinputButtonWentDown & PAD1Y) { Muted = !Muted; - Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + Audio::Channels[Audio::AC_SSE]->Play("sysse", 2, false, 0.0f); } } @@ -99,7 +99,7 @@ void OptionsVoiceSlider::MoveTo(glm::vec2 pos) { } void OptionsVoiceSlider::MuteButtonOnClick(ClickButton* target) { - if (HasFocus) Audio::Channels[Audio::AC_REV]->Play("sysse", 2, false, 0.0f); + if (HasFocus) Audio::Channels[Audio::AC_SSE]->Play("sysse", 2, false, 0.0f); Muted = !Muted; } From f89e00085f49ec31436580362e14bc1f8e943d2a Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Wed, 15 Jan 2025 02:40:15 +0100 Subject: [PATCH 43/59] Added glm to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7ba2fdefe..2f3c3c06e 100644 --- a/.gitignore +++ b/.gitignore @@ -287,6 +287,7 @@ vendor/imgui vendor/fmtlib vendor/pugixml vendor/utf8-cpp +vendor/glm games/*/gamedata games/*/savedata From 6db864de2253348e4cb1a4ace1c5da9d503835bd Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Wed, 15 Jan 2025 02:47:47 +0100 Subject: [PATCH 44/59] Partially re-added InstOption --- src/vm/inst_misc.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vm/inst_misc.cpp b/src/vm/inst_misc.cpp index 9d27f859e..33db91163 100644 --- a/src/vm/inst_misc.cpp +++ b/src/vm/inst_misc.cpp @@ -212,6 +212,10 @@ VmInstruction(InstOption) { "STUB instruction Option(type: Init)\n"); break; case 1: + if (!GetFlag(SF_SUBMENUEXIT)) { + ResetInstruction; + BlockThread; + } ImpLogSlow(LL_Warning, LC_VMStub, "STUB instruction Option(type: Main)\n"); break; From 6e506cb901dd51d9d1954f99a84fa97f5f63f3de Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Wed, 15 Jan 2025 21:09:35 +0100 Subject: [PATCH 45/59] Fixed backlog menu blank page after loading a save --- src/ui/backlogmenu.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/backlogmenu.cpp b/src/ui/backlogmenu.cpp index ac51345db..2f85ffbf5 100644 --- a/src/ui/backlogmenu.cpp +++ b/src/ui/backlogmenu.cpp @@ -345,11 +345,12 @@ void BacklogMenu::AddMessage(uint8_t* str, int audioId) { void BacklogMenu::Clear() { MainItems->Clear(); + MainItems->MoveTo(EntriesStart); PageY = 0.0f; CurrentId = 0; ItemsHeight = 0.0f; MainScrollbar->StartValue = 0.0f; - MainScrollbar->EndValue = 0.0f; + MainScrollbar->EndValue = 1.0f; MainScrollbar->Enabled = false; CurrentEntryPos = EntriesStart; } From b7131e4be608e8a3da4f77e9c5f26e4e5418b516 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Wed, 15 Jan 2025 21:21:49 +0100 Subject: [PATCH 46/59] Changed RectF addition overload to take glm::vec2 instead of another RectF --- src/ui/widgets/cclcc/optionsbinarybutton.cpp | 2 +- src/ui/widgets/cclcc/optionsentry.cpp | 6 +++-- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 6 +++-- src/util.h | 26 ++++++++------------ 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index a23009aa2..bfa1562b4 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -33,7 +33,7 @@ OptionsBinaryButton::OptionsBinaryButton( std::bind(&OptionsBinaryButton::TrueOnClick, this, std::placeholders::_1)); FalseButton = ClickButton( - 0, TrueButton.Bounds + RectF(box.ScaledWidth() / 2.0f, 0.0f, 0.0f, 0.0f), + 0, TrueButton.Bounds + glm::vec2(box.ScaledWidth() / 2.0f, 0.0f), std::bind(&OptionsBinaryButton::FalseOnClick, this, std::placeholders::_1)); } diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index 7225cb805..fe5546039 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -35,8 +35,10 @@ void OptionsEntry::Render() { RectF highlightBoundBox(Bounds.X, Bounds.Y, EntryDimensions.x, EntryDimensions.y); Renderer->DrawRect(highlightBoundBox, HighlightTint); - Renderer->DrawRect(highlightBoundBox + RectF(2.0f, 2.0f, -4.0f, -4.0f), - glm::vec4(1.0f, 1.0f, 1.0f, Tint.a)); + Renderer->DrawRect( + RectF(highlightBoundBox.X + 2.0f, highlightBoundBox.Y + 2.0f, + highlightBoundBox.Width - 4.0f, highlightBoundBox.Height - 4.0f), + glm::vec4(1.0f, 1.0f, 1.0f, Tint.a)); Renderer->DrawSprite(PointerSprite, Bounds.GetPos() + PointerOffset, Tint); } diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index 5db862f5b..24a86550c 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -43,8 +43,10 @@ void OptionsVoiceSlider::Render() { RectF highlightBoundBox(Bounds.X, Bounds.Y, VoiceEntryDimensions.x, VoiceEntryDimensions.y); Renderer->DrawRect(highlightBoundBox, HighlightTint); - Renderer->DrawRect(highlightBoundBox + RectF(2.0f, 2.0f, -4.0f, -4.0f), - glm::vec4(1.0f, 1.0f, 1.0f, Tint.a)); + Renderer->DrawRect( + RectF(highlightBoundBox.X + 2.0f, highlightBoundBox.Y + 2.0f, + highlightBoundBox.Width - 4.0f, highlightBoundBox.Height - 4.0f), + glm::vec4(1.0f, 1.0f, 1.0f, Tint.a)); } Renderer->DrawSprite(Muted ? MutedPortrait : Portrait, diff --git a/src/util.h b/src/util.h index 0d1f4c5f9..342a9a503 100644 --- a/src/util.h +++ b/src/util.h @@ -72,28 +72,22 @@ struct RectF { rect.Y + rect.Height <= Y + Height); } - constexpr RectF operator+(RectF const& other) const { - return RectF(X + other.X, Y + other.Y, Width + other.Width, - Height + other.Height); + constexpr RectF operator+(const glm::vec2 movementVector) const { + return RectF(X + movementVector.x, Y + movementVector.y, Width, Height); } - constexpr RectF operator-(RectF const& other) const { - return RectF(X - other.X, Y - other.Y, Width - other.Width, - Height - other.Height); + constexpr RectF operator-(const glm::vec2 movementVector) const { + return RectF(X - movementVector.x, Y - movementVector.y, Width, Height); } - constexpr void operator+=(RectF const& other) { - X += other.X; - Y += other.Y; - Width += other.Width; - Height += other.Height; + constexpr void operator+=(const glm::vec2 movementVector) { + X += movementVector.x; + Y += movementVector.y; } - constexpr void operator-=(RectF const& other) { - X -= other.X; - Y -= other.Y; - Width -= other.Width; - Height -= other.Height; + constexpr void operator-=(const glm::vec2 movementVector) { + X -= movementVector.x; + Y -= movementVector.y; } constexpr bool operator==(RectF const& other) const { From 12b0dadbca68104a6c53fe16bc5bf7bacfd88be7 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Wed, 15 Jan 2025 21:30:02 +0100 Subject: [PATCH 47/59] Renamed ClickButton to ClickArea --- CMakeLists.txt | 4 ++-- src/games/cclcc/optionsmenu.cpp | 4 ++-- src/games/cclcc/optionsmenu.h | 4 ++-- src/ui/widgets/cclcc/optionsbinarybutton.cpp | 16 ++++++++-------- src/ui/widgets/cclcc/optionsbinarybutton.h | 10 +++++----- src/ui/widgets/cclcc/optionsentry.cpp | 6 +++--- src/ui/widgets/cclcc/optionsentry.h | 6 +++--- src/ui/widgets/cclcc/optionsvoiceslider.cpp | 6 +++--- src/ui/widgets/cclcc/optionsvoiceslider.h | 4 ++-- .../widgets/{clickbutton.cpp => clickarea.cpp} | 14 +++++++------- src/ui/widgets/{clickbutton.h => clickarea.h} | 12 ++++++------ 11 files changed, 43 insertions(+), 43 deletions(-) rename src/ui/widgets/{clickbutton.cpp => clickarea.cpp} (79%) rename src/ui/widgets/{clickbutton.h => clickarea.h} (59%) diff --git a/CMakeLists.txt b/CMakeLists.txt index d88a6e522..d0c3d39fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -226,7 +226,7 @@ set(Impacto_Src src/ui/widgets/group.cpp src/ui/widgets/carousel.cpp src/ui/widgets/cgviewer.cpp - src/ui/widgets/clickbutton.cpp + src/ui/widgets/clickarea.cpp src/ui/widgets/mo6tw/titlebutton.cpp src/ui/widgets/mo6tw/saveentrybutton.cpp src/ui/widgets/mo6tw/tipsentrybutton.cpp @@ -543,7 +543,7 @@ set(Impacto_Header src/ui/widgets/group.h src/ui/widgets/carousel.h src/ui/widgets/cgviewer.h - src/ui/widgets/clickbutton.h + src/ui/widgets/clickarea.h src/ui/widgets/mo6tw/titlebutton.h src/ui/widgets/mo6tw/saveentrybutton.h src/ui/widgets/mo6tw/tipsentrybutton.h diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 29983ae50..b902430cf 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -38,7 +38,7 @@ OptionsMenu::OptionsMenu() { PageButtons.reserve(PageCount); for (int i = 0; i < PageCount; i++) { - PageButtons.push_back(ClickButton(i, PagePanelHoverBounds[i])); + PageButtons.push_back(ClickArea(i, PagePanelHoverBounds[i])); } std::unique_ptr basicPage = std::make_unique(this); @@ -222,7 +222,7 @@ void OptionsMenu::PageButtonOnHover(int pageNumber) { void OptionsMenu::UpdatePageInput(float dt) { // Mouse input - for (ClickButton& button : PageButtons) { + for (ClickArea& button : PageButtons) { const bool wasHovered = button.Hovered; button.UpdateInput(); if (!wasHovered && button.Hovered) PageButtonOnHover(button.Id); diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index b6c533b01..5f33f2e50 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -3,7 +3,7 @@ #include "../../ui/menu.h" #include "../../spriteanimation.h" #include "../../ui/widgets/group.h" -#include "../../ui/widgets/clickbutton.h" +#include "../../ui/widgets/clickarea.h" #include "../../ui/widgets/cclcc/optionsentry.h" using namespace Impacto::UI::Widgets::CCLCC; @@ -41,7 +41,7 @@ class OptionsMenu : public Menu { int CurrentPage = 0; std::vector> Pages; - std::vector PageButtons; + std::vector PageButtons; float DirectionButtonHeldTime = 0.0f; float DirectionButtonWaitTime = 0.0f; diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.cpp b/src/ui/widgets/cclcc/optionsbinarybutton.cpp index bfa1562b4..f63051fac 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.cpp +++ b/src/ui/widgets/cclcc/optionsbinarybutton.cpp @@ -27,12 +27,12 @@ OptionsBinaryButton::OptionsBinaryButton( glm::vec2 truePosition = pos + BinaryBoxOffset; TrueButton = - ClickButton(0, - RectF(truePosition.x, truePosition.y, - TrueSprite.ScaledWidth(), TrueSprite.ScaledHeight()), - std::bind(&OptionsBinaryButton::TrueOnClick, this, - std::placeholders::_1)); - FalseButton = ClickButton( + ClickArea(0, + RectF(truePosition.x, truePosition.y, TrueSprite.ScaledWidth(), + TrueSprite.ScaledHeight()), + std::bind(&OptionsBinaryButton::TrueOnClick, this, + std::placeholders::_1)); + FalseButton = ClickArea( 0, TrueButton.Bounds + glm::vec2(box.ScaledWidth() / 2.0f, 0.0f), std::bind(&OptionsBinaryButton::FalseOnClick, this, std::placeholders::_1)); @@ -110,14 +110,14 @@ void OptionsBinaryButton::MoveTo(glm::vec2 pos) { FalseButton.Move(relativePosition); } -void OptionsBinaryButton::TrueOnClick(ClickButton* target) { +void OptionsBinaryButton::TrueOnClick(ClickArea* target) { if (Selected && State != true) Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); State = true; } -void OptionsBinaryButton::FalseOnClick(ClickButton* target) { +void OptionsBinaryButton::FalseOnClick(ClickArea* target) { if (Selected && State != false) Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); diff --git a/src/ui/widgets/cclcc/optionsbinarybutton.h b/src/ui/widgets/cclcc/optionsbinarybutton.h index b4c2e1a08..4595f8201 100644 --- a/src/ui/widgets/cclcc/optionsbinarybutton.h +++ b/src/ui/widgets/cclcc/optionsbinarybutton.h @@ -1,7 +1,7 @@ #pragma once #include "./optionsentry.h" -#include "../clickbutton.h" +#include "../clickarea.h" #include "../../../spritesheet.h" namespace Impacto { @@ -28,14 +28,14 @@ class OptionsBinaryButton : public OptionsEntry { void MoveTo(glm::vec2 pos) override; private: - ClickButton TrueButton; - ClickButton FalseButton; + ClickArea TrueButton; + ClickArea FalseButton; const Sprite& TrueSprite; const Sprite& FalseSprite; - void TrueOnClick(ClickButton* target); - void FalseOnClick(ClickButton* target); + void TrueOnClick(ClickArea* target); + void FalseOnClick(ClickArea* target); const Sprite& BoxSprite; diff --git a/src/ui/widgets/cclcc/optionsentry.cpp b/src/ui/widgets/cclcc/optionsentry.cpp index fe5546039..53af8e409 100644 --- a/src/ui/widgets/cclcc/optionsentry.cpp +++ b/src/ui/widgets/cclcc/optionsentry.cpp @@ -23,9 +23,9 @@ OptionsEntry::OptionsEntry(const Sprite& label, glm::vec2 pos, Bounds = RectF(pos.x, pos.y, LabelOffset.x + LabelSprite.ScaledWidth(), LabelOffset.y + LabelSprite.ScaledHeight()); - std::function onClick = + std::function onClick = std::bind(&OptionsEntry::EntryButtonOnClick, this, std::placeholders::_1); - EntryButton = ClickButton(0, Bounds, onClick); + EntryButton = ClickArea(0, Bounds, onClick); } void OptionsEntry::Render() { @@ -95,7 +95,7 @@ void OptionsEntry::MoveTo(glm::vec2 pos) { EntryButton.Move(relativePosition); } -void OptionsEntry::EntryButtonOnClick(ClickButton* target) { +void OptionsEntry::EntryButtonOnClick(ClickArea* target) { if (Selected) return; Audio::Channels[Audio::AC_SSE]->Play("sysse", 2, false, 0.0f); diff --git a/src/ui/widgets/cclcc/optionsentry.h b/src/ui/widgets/cclcc/optionsentry.h index 8c1c85b81..e6eebbef8 100644 --- a/src/ui/widgets/cclcc/optionsentry.h +++ b/src/ui/widgets/cclcc/optionsentry.h @@ -2,7 +2,7 @@ #include -#include "../clickbutton.h" +#include "../clickarea.h" #include "../../widget.h" #include "../../../spritesheet.h" @@ -30,10 +30,10 @@ class OptionsEntry : public Widget { bool Selected = false; protected: - ClickButton EntryButton; + ClickArea EntryButton; std::function Select; std::function Highlight; - void EntryButtonOnClick(ClickButton* target); + void EntryButtonOnClick(ClickArea* target); const Sprite& LabelSprite; glm::vec4 HighlightTint; diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.cpp b/src/ui/widgets/cclcc/optionsvoiceslider.cpp index 24a86550c..40406627f 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.cpp +++ b/src/ui/widgets/cclcc/optionsvoiceslider.cpp @@ -28,12 +28,12 @@ OptionsVoiceSlider::OptionsVoiceSlider( RectF(Bounds.X, Bounds.Y, VoiceEntryDimensions.x, VoiceEntryDimensions.y); EntryButton.Bounds = Bounds; - std::function onClick = std::bind( + std::function onClick = std::bind( &OptionsVoiceSlider::MuteButtonOnClick, this, std::placeholders::_1); const RectF muteButtonBounds(Bounds.GetPos().x + PortraitOffset.x, Bounds.GetPos().y + PortraitOffset.y, portrait.ScaledWidth(), portrait.ScaledHeight()); - MuteButton = ClickButton(0, muteButtonBounds, onClick); + MuteButton = ClickArea(0, muteButtonBounds, onClick); } void OptionsVoiceSlider::Render() { @@ -100,7 +100,7 @@ void OptionsVoiceSlider::MoveTo(glm::vec2 pos) { MuteButton.Move(relativePosition); } -void OptionsVoiceSlider::MuteButtonOnClick(ClickButton* target) { +void OptionsVoiceSlider::MuteButtonOnClick(ClickArea* target) { if (HasFocus) Audio::Channels[Audio::AC_SSE]->Play("sysse", 2, false, 0.0f); Muted = !Muted; diff --git a/src/ui/widgets/cclcc/optionsvoiceslider.h b/src/ui/widgets/cclcc/optionsvoiceslider.h index 4bc9fc93c..7ee30c48e 100644 --- a/src/ui/widgets/cclcc/optionsvoiceslider.h +++ b/src/ui/widgets/cclcc/optionsvoiceslider.h @@ -30,8 +30,8 @@ class OptionsVoiceSlider : public OptionsSlider { const Sprite& MutedPortrait; bool Muted = false; - ClickButton MuteButton; - void MuteButtonOnClick(ClickButton* target); + ClickArea MuteButton; + void MuteButtonOnClick(ClickArea* target); }; } // namespace CCLCC diff --git a/src/ui/widgets/clickbutton.cpp b/src/ui/widgets/clickarea.cpp similarity index 79% rename from src/ui/widgets/clickbutton.cpp rename to src/ui/widgets/clickarea.cpp index 29b2c137d..bd7657199 100644 --- a/src/ui/widgets/clickbutton.cpp +++ b/src/ui/widgets/clickarea.cpp @@ -1,4 +1,4 @@ -#include "clickbutton.h" +#include "clickarea.h" #include "../../inputsystem.h" #include "../../vm/interface/input.h" @@ -7,17 +7,17 @@ namespace Impacto { namespace UI { namespace Widgets { -ClickButton::ClickButton(int id, RectF bounds) : Id(id), Clickable(false) { +ClickArea::ClickArea(int id, RectF bounds) : Id(id), Clickable(false) { Bounds = bounds; } -ClickButton::ClickButton(int id, RectF bounds, - std::function onClickHandler) +ClickArea::ClickArea(int id, RectF bounds, + std::function onClickHandler) : Id(id), OnClickHandler(onClickHandler), Clickable(true) { Bounds = bounds; } -void ClickButton::UpdateInput() { +void ClickArea::UpdateInput() { if (!Enabled) return; if (Input::CurrentInputDevice == Input::Device::Mouse && @@ -35,7 +35,7 @@ void ClickButton::UpdateInput() { OnClickHandler(this); } -void ClickButton::Show() { +void ClickArea::Show() { Enabled = true; switch (Input::CurrentInputDevice) { @@ -48,7 +48,7 @@ void ClickButton::Show() { } } -void ClickButton::Hide() { +void ClickArea::Hide() { Enabled = false; Hovered = false; } diff --git a/src/ui/widgets/clickbutton.h b/src/ui/widgets/clickarea.h similarity index 59% rename from src/ui/widgets/clickbutton.h rename to src/ui/widgets/clickarea.h index 194cb34fb..5e52b14b3 100644 --- a/src/ui/widgets/clickbutton.h +++ b/src/ui/widgets/clickarea.h @@ -8,12 +8,12 @@ namespace Impacto { namespace UI { namespace Widgets { -class ClickButton : public Widget { +class ClickArea : public Widget { public: - ClickButton() {} - ClickButton(int id, RectF bounds); - ClickButton(int id, RectF bounds, - std::function onClickHandler); + ClickArea() {} + ClickArea(int id, RectF bounds); + ClickArea(int id, RectF bounds, + std::function onClickHandler); virtual void UpdateInput() override; @@ -25,7 +25,7 @@ class ClickButton : public Widget { private: bool Clickable = false; - std::function OnClickHandler; + std::function OnClickHandler; }; } // namespace Widgets From bf3e97ce95e519bb6e94b33d3d8e966904fa2d94 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 16 Jan 2025 02:46:59 +0100 Subject: [PATCH 48/59] Set up generic OptionsMenu class --- CMakeLists.txt | 2 + profiles/chlcc/hud/optionsmenu.lua | 3 + profiles/mo6tw/hud/optionsmenu.lua | 5 +- profiles/mo8/hud/optionsmenu.lua | 5 +- src/games/cclcc/optionsmenu.cpp | 170 ++------------------ src/games/cclcc/optionsmenu.h | 23 +-- src/profile/games/cclcc/optionsmenu.cpp | 3 - src/profile/games/cclcc/optionsmenu.h | 3 - src/profile/ui/optionsmenu.cpp | 3 + src/profile/ui/optionsmenu.h | 3 + src/ui/optionsmenu.cpp | 205 ++++++++++++++++++++++++ src/ui/optionsmenu.h | 38 +++++ 12 files changed, 285 insertions(+), 178 deletions(-) create mode 100644 src/ui/optionsmenu.cpp create mode 100644 src/ui/optionsmenu.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d0c3d39fb..011b7556d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,6 +217,7 @@ set(Impacto_Src src/ui/sysmesbox.cpp src/ui/backlogmenu.cpp src/ui/tipsmenu.cpp + src/ui/optionsmenu.cpp src/ui/widgets/label.cpp src/ui/widgets/button.cpp src/ui/widgets/backlogentry.cpp @@ -533,6 +534,7 @@ set(Impacto_Header src/ui/sysmesbox.h src/ui/backlogmenu.h src/ui/tipsmenu.h + src/ui/optionsmenu.h src/ui/widget.h src/ui/widgets/label.h src/ui/widgets/button.h diff --git a/profiles/chlcc/hud/optionsmenu.lua b/profiles/chlcc/hud/optionsmenu.lua index 4c201c633..6f294c209 100644 --- a/profiles/chlcc/hud/optionsmenu.lua +++ b/profiles/chlcc/hud/optionsmenu.lua @@ -36,6 +36,9 @@ root.OptionsMenu = { { X = 213, Y = 51 }, { X = 228, Y = 51 } }, + + MinButtonHoldTime = 0.5, + ButtonHoldTimeInterval = 0.05, }; root.Sprites["CircleConfig"] = { diff --git a/profiles/mo6tw/hud/optionsmenu.lua b/profiles/mo6tw/hud/optionsmenu.lua index 6f97940e0..22ba23d51 100644 --- a/profiles/mo6tw/hud/optionsmenu.lua +++ b/profiles/mo6tw/hud/optionsmenu.lua @@ -30,7 +30,10 @@ root.OptionsMenu = { FirstPageSectionHeaderPos = { X = 79, Y = 47 }, SecondPageSectionHeaderPos = { X = 79, Y = 31 }, FadeInDuration = 0.2, - FadeOutDuration = 0.2 + FadeOutDuration = 0.2, + + MinButtonHoldTime = 0.5, + ButtonHoldTimeInterval = 0.05, }; root.Sprites["OptionsBackground"] = { diff --git a/profiles/mo8/hud/optionsmenu.lua b/profiles/mo8/hud/optionsmenu.lua index 1c532be95..0cf759332 100644 --- a/profiles/mo8/hud/optionsmenu.lua +++ b/profiles/mo8/hud/optionsmenu.lua @@ -73,7 +73,10 @@ root.OptionsMenu = { QuickSaveOptionsHSprites = {}, FadeInDuration = 0.33, - FadeOutDuration = 0.33 + FadeOutDuration = 0.33, + + MinButtonHoldTime = 0.5, + ButtonHoldTimeInterval = 0.05, }; root.Sprites["OptionsBackground"] = { diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index b902430cf..dbf786686 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -20,12 +20,7 @@ using namespace Impacto::UI::Widgets; using namespace Impacto::UI::Widgets::CCLCC; using namespace Impacto::Vm::Interface; -OptionsMenu::OptionsMenu() { - FadeAnimation.Direction = AnimationDirection::In; - FadeAnimation.LoopMode = AnimationLoopMode::Stop; - FadeAnimation.DurationIn = FadeInDuration; - FadeAnimation.DurationOut = FadeOutDuration; - +OptionsMenu::OptionsMenu() : UI::OptionsMenu() { PoleAnimation = Profile::CCLCC::OptionsMenu::PoleAnimation.Instantiate(); Pages.reserve(PageCount); @@ -133,61 +128,26 @@ OptionsMenu::OptionsMenu() { } void OptionsMenu::Show() { - if (State != Shown) { - State = Showing; - FadeAnimation.StartIn(); - PoleAnimation.StartIn(); - - CurrentPage = 0; - Pages[CurrentPage]->Show(); - Highlight(Pages[CurrentPage]->GetFirstFocusableChild()); - - if (UI::FocusedMenu != nullptr) { - LastFocusedMenu = UI::FocusedMenu; - LastFocusedMenu->IsFocused = false; - } - IsFocused = true; - UI::FocusedMenu = this; - } + UI::OptionsMenu::Show(); + + if (State != Shown) PoleAnimation.StartIn(); } void OptionsMenu::Hide() { if (State != Hidden) { - State = Hiding; - FadeAnimation.StartOut(); PoleAnimation.StartOut(); - if (LastFocusedMenu != nullptr) { - UI::FocusedMenu = LastFocusedMenu; - LastFocusedMenu->IsFocused = true; - } else { - UI::FocusedMenu = nullptr; - } - IsFocused = false; - - if (CurrentlyFocusedElement) { + if (CurrentlyFocusedElement) static_cast(CurrentlyFocusedElement)->Selected = false; - CurrentlyFocusedElement->HasFocus = false; - CurrentlyFocusedElement = nullptr; - } } + + UI::OptionsMenu::Hide(); } void OptionsMenu::Update(float dt) { - FadeAnimation.Update(dt); - PoleAnimation.Update(dt); - if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown && - ScrWork[SW_SYSSUBMENUNO] == 5) { - Hide(); - } else if (ScrWork[SW_SYSSUBMENUCT] >= 32 && State == Hidden && - ScrWork[SW_SYSSUBMENUNO] == 5) { - Show(); - } + UI::OptionsMenu::Update(dt); - if (State != Hidden) { - UpdateInput(dt); - Pages[CurrentPage]->Update(dt); - } + PoleAnimation.Update(dt); if (!FadeAnimation.IsIn() && !FadeAnimation.IsOut()) { const glm::vec2 backgroundPosition = @@ -195,19 +155,6 @@ void OptionsMenu::Update(float dt) { BackgroundPosition.y, FadeAnimation.Progress)); Pages[CurrentPage]->MoveTo(backgroundPosition); } - - if (FadeAnimation.IsIn()) { - State = Shown; - Pages[CurrentPage]->MoveTo(glm::vec2(0.0f, BackgroundPosition.y)); - } else if (State == Hiding && FadeAnimation.IsOut()) { - if (ScrWork[SW_SYSSUBMENUCT] == 0) { - State = Hidden; - - Pages[CurrentPage]->Hide(); - } else { - SetFlag(SF_SUBMENUEXIT, true); - } - } } void OptionsMenu::PageButtonOnHover(int pageNumber) { @@ -228,85 +175,19 @@ void OptionsMenu::UpdatePageInput(float dt) { if (!wasHovered && button.Hovered) PageButtonOnHover(button.Id); } - // Button input - - const int direction = (bool)(PADinputButtonIsDown & PAD1R1) - - (bool)(PADinputButtonIsDown & PAD1L1); - - if (direction == 0) { - PageDirectionButtonHeldTime = 0.0f; - PageDirectionButtonWaitTime = 0.0f; - return; - } - - if (0.0f < PageDirectionButtonHeldTime && - PageDirectionButtonHeldTime < MinButtonHoldTime) { - PageDirectionButtonHeldTime += dt; - PageDirectionButtonWaitTime = 0.0f; - return; - } + const int lastPage = CurrentPage; + UI::OptionsMenu::UpdatePageInput(dt); - if (PageDirectionButtonWaitTime > 0.0f) { - PageDirectionButtonWaitTime -= dt; - return; - } - - // Page advancement fired - - PageDirectionButtonHeldTime += dt; - PageDirectionButtonWaitTime = ButtonHoldTimeInterval; - - Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); - - GoToPage((CurrentPage + direction) % Pages.size()); + if (CurrentPage != lastPage) + Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); } void OptionsMenu::UpdateEntryMovementInput(float dt) { - const int verticalMovement = (bool)(PADinputButtonIsDown & PAD1DOWN) - - (bool)(PADinputButtonIsDown & PAD1UP); - const int horizontalMovement = (bool)(PADinputButtonIsDown & PAD1RIGHT) - - (bool)(PADinputButtonIsDown & PAD1LEFT); - const bool moving = - verticalMovement || (CurrentPage == 3 && horizontalMovement); - - if (!moving) { - DirectionButtonHeldTime = 0.0f; - DirectionButtonWaitTime = 0.0f; - return; - } - - if (0.0f < DirectionButtonHeldTime && - DirectionButtonHeldTime < MinButtonHoldTime) { - DirectionButtonHeldTime += dt; - DirectionButtonWaitTime = 0.0f; - return; - } - - if (DirectionButtonWaitTime > 0.0f) { - DirectionButtonWaitTime -= dt; - return; - } - - // Advance entry - - DirectionButtonHeldTime += dt; - DirectionButtonWaitTime = ButtonHoldTimeInterval; - const Widget* const lastHighlight = CurrentlyFocusedElement; - if (horizontalMovement != 0) { - const FocusDirection horizontalDirection = - horizontalMovement == -1 ? FDIR_LEFT : FDIR_RIGHT; - AdvanceFocus(horizontalDirection); - } - if (verticalMovement != 0) { - const FocusDirection verticalDirection = - verticalMovement == -1 ? FDIR_UP : FDIR_DOWN; - AdvanceFocus(verticalDirection); - } - if (CurrentlyFocusedElement != lastHighlight) { + UI::OptionsMenu::UpdateEntryMovementInput(dt); + + if (CurrentlyFocusedElement != lastHighlight) Audio::Channels[Audio::AC_SSE]->Play("sysse", 1, false, 0.0f); - Highlight(CurrentlyFocusedElement); - } } void OptionsMenu::UpdateInput(float dt) { @@ -374,19 +255,6 @@ void OptionsMenu::Render() { } } -void OptionsMenu::GoToPage(int pageNumber) { - if (CurrentPage == pageNumber) return; - - Pages[CurrentPage]->Hide(); - - CurrentPage = pageNumber; - Group& page = *Pages[CurrentPage]; - - page.HasFocus = true; - page.Show(); - Highlight(page.GetFirstFocusableChild()); -} - void OptionsMenu::Select(OptionsEntry* toSelect) { for (Widget* entry : Pages[CurrentPage]->Children) { static_cast(entry)->Selected = false; @@ -399,15 +267,11 @@ void OptionsMenu::Select(OptionsEntry* toSelect) { } void OptionsMenu::Highlight(Widget* toHighlight) { - if (CurrentlyFocusedElement == toHighlight) return; + UI::OptionsMenu::Highlight(toHighlight); for (Widget* entry : Pages[CurrentPage]->Children) { - entry->HasFocus = false; static_cast(entry)->Selected = false; } - - toHighlight->HasFocus = true; - CurrentlyFocusedElement = toHighlight; } } // namespace CCLCC diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index 5f33f2e50..ce61e71ac 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -1,8 +1,7 @@ #pragma once -#include "../../ui/menu.h" +#include "../../ui/optionsmenu.h" #include "../../spriteanimation.h" -#include "../../ui/widgets/group.h" #include "../../ui/widgets/clickarea.h" #include "../../ui/widgets/cclcc/optionsentry.h" @@ -12,42 +11,32 @@ namespace Impacto { namespace UI { namespace CCLCC { -class OptionsMenu : public Menu { +class OptionsMenu : public UI::OptionsMenu { public: OptionsMenu(); void Show() override; void Hide() override; void Update(float dt) override; - void UpdateInput(float dt); + void UpdateInput(float dt) override; void Render() override; private: - void GoToPage(int pageNumber); void PageButtonOnHover(int pageNumber); void Select(OptionsEntry* entry); - void Highlight(Widget* entry); + void Highlight(Widget* entry) override; bool AnyEntrySelected() { return CurrentlyFocusedElement && static_cast(CurrentlyFocusedElement)->Selected; } - void UpdatePageInput(float dt); - void UpdateEntryMovementInput(float dt); + void UpdatePageInput(float dt) override; + void UpdateEntryMovementInput(float dt) override; - Animation FadeAnimation; SpriteAnimation PoleAnimation; - int CurrentPage = 0; - std::vector> Pages; std::vector PageButtons; - - float DirectionButtonHeldTime = 0.0f; - float DirectionButtonWaitTime = 0.0f; - - float PageDirectionButtonHeldTime = 0.0f; - float PageDirectionButtonWaitTime = 0.0f; }; } // namespace CCLCC diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index bc9805aac..7a6b93aa5 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -73,9 +73,6 @@ void Configure() { PortraitOffset = EnsureGetMemberVec2("PortraitOffset"); VoicePosition = EnsureGetMemberVec2("VoicePosition"); - MinButtonHoldTime = EnsureGetMemberFloat("MinButtonHoldTime"); - ButtonHoldTimeInterval = EnsureGetMemberFloat("ButtonHoldTimeInterval"); - MenuMaskSprite = EnsureGetMemberSprite("MenuMask"); auto drawType = Game::DrawComponentType::_from_integral_unchecked( diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 7db6b6f3e..397433fee 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -71,9 +71,6 @@ inline Sprite PortraitSprites[PortraitCount]; inline glm::vec2 PortraitOffset; inline glm::vec2 VoicePosition; -inline float MinButtonHoldTime; -inline float ButtonHoldTimeInterval; - inline Sprite MenuMaskSprite; void Configure(); diff --git a/src/profile/ui/optionsmenu.cpp b/src/profile/ui/optionsmenu.cpp index 9d215c5ee..ce293caff 100644 --- a/src/profile/ui/optionsmenu.cpp +++ b/src/profile/ui/optionsmenu.cpp @@ -20,6 +20,9 @@ void Configure() { Type = OptionsMenuType::_from_integral_unchecked(EnsureGetMemberInt("Type")); + MinButtonHoldTime = EnsureGetMemberFloat("MinButtonHoldTime"); + ButtonHoldTimeInterval = EnsureGetMemberFloat("ButtonHoldTimeInterval"); + if (Type != +OptionsMenuType::CHLCC) { FadeInDuration = EnsureGetMemberFloat("FadeInDuration"); FadeOutDuration = EnsureGetMemberFloat("FadeOutDuration"); diff --git a/src/profile/ui/optionsmenu.h b/src/profile/ui/optionsmenu.h index f89564d22..ef42c611b 100644 --- a/src/profile/ui/optionsmenu.h +++ b/src/profile/ui/optionsmenu.h @@ -14,6 +14,9 @@ inline Sprite BackgroundSprite; inline float FadeInDuration; inline float FadeOutDuration; +inline float MinButtonHoldTime; +inline float ButtonHoldTimeInterval; + void Configure(); } // namespace OptionsMenu diff --git a/src/ui/optionsmenu.cpp b/src/ui/optionsmenu.cpp new file mode 100644 index 000000000..824d9440e --- /dev/null +++ b/src/ui/optionsmenu.cpp @@ -0,0 +1,205 @@ +#include "optionsmenu.h" + +#include "../profile/game.h" +#include "../profile/ui/optionsmenu.h" +#include "../profile/scriptinput.h" +#include "../vm/interface/input.h" + +namespace Impacto { +namespace UI { + +using namespace Impacto::Profile::OptionsMenu; +using namespace Impacto::Profile::ScriptVars; +using namespace Impacto::UI::Widgets; +using namespace Impacto::Vm::Interface; + +OptionsMenu::OptionsMenu() { + FadeAnimation.Direction = AnimationDirection::In; + FadeAnimation.LoopMode = AnimationLoopMode::Stop; + FadeAnimation.DurationIn = FadeInDuration; + FadeAnimation.DurationOut = FadeOutDuration; +} + +void OptionsMenu::Show() { + if (State != Shown) { + State = Showing; + FadeAnimation.StartIn(); + + CurrentPage = 0; + Pages[CurrentPage]->Show(); + Highlight(Pages[CurrentPage]->GetFirstFocusableChild()); + + if (UI::FocusedMenu != nullptr) { + LastFocusedMenu = UI::FocusedMenu; + LastFocusedMenu->IsFocused = false; + } + IsFocused = true; + UI::FocusedMenu = this; + } +} + +void OptionsMenu::Hide() { + if (State != Hidden) { + State = Hiding; + FadeAnimation.StartOut(); + + if (LastFocusedMenu != nullptr) { + UI::FocusedMenu = LastFocusedMenu; + LastFocusedMenu->IsFocused = true; + } else { + UI::FocusedMenu = nullptr; + } + IsFocused = false; + + if (CurrentlyFocusedElement) { + CurrentlyFocusedElement->HasFocus = false; + CurrentlyFocusedElement = nullptr; + } + } +} + +void OptionsMenu::Update(float dt) { + FadeAnimation.Update(dt); + if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown && + ScrWork[SW_SYSSUBMENUNO] == 5) { + Hide(); + } else if (ScrWork[SW_SYSSUBMENUCT] >= 32 && State == Hidden && + ScrWork[SW_SYSSUBMENUNO] == 5) { + Show(); + } + + if (State != Hidden) { + UpdateInput(dt); + Pages[CurrentPage]->Update(dt); + } + + if (FadeAnimation.IsIn()) { + State = Shown; + } else if (State == Hiding && FadeAnimation.IsOut()) { + if (ScrWork[SW_SYSSUBMENUCT] == 0) { + State = Hidden; + + Pages[CurrentPage]->Hide(); + } else { + SetFlag(SF_SUBMENUEXIT, true); + } + } +} + +void OptionsMenu::UpdatePageInput(float dt) { + // Button input + const int direction = (bool)(PADinputButtonIsDown & PAD1R1) - + (bool)(PADinputButtonIsDown & PAD1L1); + + if (direction == 0) { + PageDirectionButtonHeldTime = 0.0f; + PageDirectionButtonWaitTime = 0.0f; + return; + } + + if (0.0f < PageDirectionButtonHeldTime && + PageDirectionButtonHeldTime < MinButtonHoldTime) { + PageDirectionButtonHeldTime += dt; + PageDirectionButtonWaitTime = 0.0f; + return; + } + + if (PageDirectionButtonWaitTime > 0.0f) { + PageDirectionButtonWaitTime -= dt; + return; + } + + // Page advancement fired + PageDirectionButtonHeldTime += dt; + PageDirectionButtonWaitTime = ButtonHoldTimeInterval; + + GoToPage((CurrentPage + direction) % Pages.size()); +} + +void OptionsMenu::UpdateEntryMovementInput(float dt) { + const int verticalMovement = (bool)(PADinputButtonIsDown & PAD1DOWN) - + (bool)(PADinputButtonIsDown & PAD1UP); + const FocusDirection verticalDirection = verticalMovement == -1 + ? FocusDirection::FDIR_UP + : FocusDirection::FDIR_DOWN; + const int horizontalMovement = (bool)(PADinputButtonIsDown & PAD1RIGHT) - + (bool)(PADinputButtonIsDown & PAD1LEFT); + const FocusDirection horizontalDirection = horizontalMovement == -1 + ? FocusDirection::FDIR_LEFT + : FocusDirection::FDIR_RIGHT; + + // Don't count towards holding the movement button if it is not + // in a valid movement direction + const bool moving = + (verticalMovement && + CurrentlyFocusedElement->GetFocus(verticalDirection) || + horizontalMovement && + CurrentlyFocusedElement->GetFocus(horizontalDirection)) || + ((verticalMovement || horizontalMovement) && !CurrentlyFocusedElement); + + if (!moving) { + DirectionButtonHeldTime = 0.0f; + DirectionButtonWaitTime = 0.0f; + return; + } + + if (0.0f < DirectionButtonHeldTime && + DirectionButtonHeldTime < MinButtonHoldTime) { + DirectionButtonHeldTime += dt; + DirectionButtonWaitTime = 0.0f; + return; + } + + if (DirectionButtonWaitTime > 0.0f) { + DirectionButtonWaitTime -= dt; + return; + } + + // Advance entry + + DirectionButtonHeldTime += dt; + DirectionButtonWaitTime = ButtonHoldTimeInterval; + + if (horizontalMovement != 0) AdvanceFocus(horizontalDirection); + if (verticalMovement != 0) AdvanceFocus(verticalDirection); + + Highlight(CurrentlyFocusedElement); +} + +void OptionsMenu::UpdateInput(float dt) { + UpdatePageInput(dt); + + if (GetControlState(CT_Back)) { + Hide(); + return; + } + + UpdateEntryMovementInput(dt); +} + +void OptionsMenu::GoToPage(int pageNumber) { + if (CurrentPage == pageNumber) return; + + Pages[CurrentPage]->Hide(); + + CurrentPage = pageNumber; + Group& page = *Pages[CurrentPage]; + + page.HasFocus = true; + page.Show(); + Highlight(page.GetFirstFocusableChild()); +} + +void OptionsMenu::Highlight(Widget* toHighlight) { + if (CurrentlyFocusedElement == toHighlight) return; + + for (Widget* entry : Pages[CurrentPage]->Children) { + entry->HasFocus = false; + } + + toHighlight->HasFocus = true; + CurrentlyFocusedElement = toHighlight; +} + +} // namespace UI +} // namespace Impacto \ No newline at end of file diff --git a/src/ui/optionsmenu.h b/src/ui/optionsmenu.h new file mode 100644 index 000000000..a89209137 --- /dev/null +++ b/src/ui/optionsmenu.h @@ -0,0 +1,38 @@ +#pragma once + +#include "menu.h" +#include "widgets/group.h" + +namespace Impacto { +namespace UI { + +class OptionsMenu : public Menu { + public: + virtual void Show() override; + virtual void Hide() override; + virtual void Update(float dt) override; + virtual void UpdateInput(float dt); + + protected: + OptionsMenu(); + + virtual void GoToPage(int pageNumber); + virtual void UpdatePageInput(float dt); + virtual void UpdateEntryMovementInput(float dt); + + virtual void Highlight(Widget* toHighlight); + + Animation FadeAnimation; + + int CurrentPage = 0; + std::vector> Pages; + + float DirectionButtonHeldTime = 0.0f; + float DirectionButtonWaitTime = 0.0f; + + float PageDirectionButtonHeldTime = 0.0f; + float PageDirectionButtonWaitTime = 0.0f; +}; + +} // namespace UI +} // namespace Impacto \ No newline at end of file From 62b7d5fe7b678523c47f3af0b9ba5b8aa97c2f5a Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 16 Jan 2025 03:09:23 +0100 Subject: [PATCH 49/59] Moved mo6tw's options menu over to new base class --- src/games/mo6tw/optionsmenu.cpp | 107 ++++++++++++-------------------- src/games/mo6tw/optionsmenu.h | 14 ++--- 2 files changed, 42 insertions(+), 79 deletions(-) diff --git a/src/games/mo6tw/optionsmenu.cpp b/src/games/mo6tw/optionsmenu.cpp index d4490b13c..b4d36f03b 100644 --- a/src/games/mo6tw/optionsmenu.cpp +++ b/src/games/mo6tw/optionsmenu.cpp @@ -80,14 +80,9 @@ void OptionsMenu::TipsNotificationsOnClick(Widgets::Toggle* target) { } } -OptionsMenu::OptionsMenu() { - FadeAnimation.Direction = AnimationDirection::In; - FadeAnimation.LoopMode = AnimationLoopMode::Stop; - FadeAnimation.DurationIn = FadeInDuration; - FadeAnimation.DurationOut = FadeOutDuration; - +OptionsMenu::OptionsMenu() : UI::OptionsMenu() { // First page - FirstPage = new Widgets::Group(this); + auto firstPage = std::make_unique(this); CharacterVoiceToggles = new Widgets::Group(this); CharacterVoiceToggles->FocusLock = false; CharacterVoiceToggles->WrapFocus = false; @@ -96,28 +91,28 @@ OptionsMenu::OptionsMenu() { 0, FirstPageSliderPos, 0.0f, 1.0f, &Audio::GroupVolumes[Audio::ACG_Voice], Widgets::SBDIR_HORIZONTAL, SliderTrackSprite, SliderThumbSprite, SliderFillSprite, SliderThumbOffset); - FirstPage->Add(VoiceVolumeSlider, FDIR_DOWN); + firstPage->Add(VoiceVolumeSlider, FDIR_DOWN); FirstPageSliderPos.y += FirstPageSliderMargin; BGMVolumeSlider = new Widgets::Scrollbar( 0, FirstPageSliderPos, 0.0f, 1.0f, &Audio::GroupVolumes[Audio::ACG_BGM], Widgets::SBDIR_HORIZONTAL, SliderTrackSprite, SliderThumbSprite, SliderFillSprite, SliderThumbOffset); - FirstPage->Add(BGMVolumeSlider, FDIR_DOWN); + firstPage->Add(BGMVolumeSlider, FDIR_DOWN); FirstPageSliderPos.y += FirstPageSliderMargin; SEVolumeSlider = new Widgets::Scrollbar( 0, FirstPageSliderPos, 0.0f, 1.0f, &Audio::GroupVolumes[Audio::ACG_SE], Widgets::SBDIR_HORIZONTAL, SliderTrackSprite, SliderThumbSprite, SliderFillSprite, SliderThumbOffset); - FirstPage->Add(SEVolumeSlider, FDIR_DOWN); + firstPage->Add(SEVolumeSlider, FDIR_DOWN); FirstPageSliderPos.y += FirstPageSliderMargin; MovieVolumeSlider = new Widgets::Scrollbar( 0, FirstPageSliderPos, 0.0f, 1.0f, &Audio::GroupVolumes[Audio::ACG_Movie], Widgets::SBDIR_HORIZONTAL, SliderTrackSprite, SliderThumbSprite, SliderFillSprite, SliderThumbOffset); - FirstPage->Add(MovieVolumeSlider, FDIR_DOWN); + firstPage->Add(MovieVolumeSlider, FDIR_DOWN); auto pos = VoiceToggleStart; int row = 1; @@ -166,10 +161,12 @@ OptionsMenu::OptionsMenu() { row += 1; } } - FirstPage->Add(CharacterVoiceToggles, FDIR_DOWN); + firstPage->Add(CharacterVoiceToggles, FDIR_DOWN); + + Pages.push_back(std::move(firstPage)); // Second page - SecondPage = new Widgets::Group(this); + auto secondPage = std::make_unique(this); int checkboxLabelIdx = 0; MessageSpeedToggles = new Widgets::Group(this); @@ -202,7 +199,7 @@ OptionsMenu::OptionsMenu() { toggle->SetFocus(TipsNotificationsToggles, FDIR_UP); MessageSpeedToggles->Add(toggle, FDIR_RIGHT); } - SecondPage->Add(MessageSpeedToggles, FDIR_DOWN); + secondPage->Add(MessageSpeedToggles, FDIR_DOWN); CheckboxFirstPos += CheckboxMargin; auto autoModeWaitTimeOnClick = std::bind( @@ -220,7 +217,7 @@ OptionsMenu::OptionsMenu() { toggle->SetFocus(MessageSpeedToggles, FDIR_UP); AutoModeWaitTimeToggles->Add(toggle, FDIR_RIGHT); } - SecondPage->Add(AutoModeWaitTimeToggles, FDIR_DOWN); + secondPage->Add(AutoModeWaitTimeToggles, FDIR_DOWN); CheckboxFirstPos += CheckboxMargin; auto syncTextSpeedToVoiceOnClick = std::bind( @@ -239,7 +236,7 @@ OptionsMenu::OptionsMenu() { SyncTextSpeedToVoiceToggles->Add(toggle, FDIR_RIGHT); } checkboxLabelIdx -= 2; - SecondPage->Add(SyncTextSpeedToVoiceToggles, FDIR_DOWN); + secondPage->Add(SyncTextSpeedToVoiceToggles, FDIR_DOWN); CheckboxFirstPos += CheckboxMargin; auto skipVoiceAtNextLineOnClick = std::bind( @@ -257,7 +254,7 @@ OptionsMenu::OptionsMenu() { toggle->SetFocus(SyncTextSpeedToVoiceToggles, FDIR_UP); SkipVoiceAtNextLineToggles->Add(toggle, FDIR_RIGHT); } - SecondPage->Add(SkipVoiceAtNextLineToggles, FDIR_DOWN); + secondPage->Add(SkipVoiceAtNextLineToggles, FDIR_DOWN); auto skipModeOnClick = std::bind(&OptionsMenu::SkipModeOnClick, this, std::placeholders::_1); @@ -275,7 +272,7 @@ OptionsMenu::OptionsMenu() { toggle->SetFocus(SkipVoiceAtNextLineToggles, FDIR_UP); SkipModeToggles->Add(toggle, FDIR_RIGHT); } - SecondPage->Add(SkipModeToggles, FDIR_DOWN); + secondPage->Add(SkipModeToggles, FDIR_DOWN); float dummy = 0.0f; ScreenSizeSlider = new Widgets::Scrollbar( @@ -299,10 +296,10 @@ OptionsMenu::OptionsMenu() { toggle->SetFocus(SkipModeToggles, FDIR_UP); AutoSaveTriggerToggles->Add(toggle, FDIR_RIGHT); } - SecondPage->Add(AutoSaveTriggerToggles, FDIR_DOWN); + secondPage->Add(AutoSaveTriggerToggles, FDIR_DOWN); ScreenSizeSlider->SetFocus(TipsNotificationsToggles, FDIR_DOWN); - SecondPage->Add(ScreenSizeSlider, FDIR_DOWN); + secondPage->Add(ScreenSizeSlider, FDIR_DOWN); auto tipsNotificationsOnClick = std::bind( &OptionsMenu::TipsNotificationsOnClick, this, std::placeholders::_1); @@ -319,42 +316,16 @@ OptionsMenu::OptionsMenu() { toggle->SetFocus(ScreenSizeSlider, FDIR_UP); TipsNotificationsToggles->Add(toggle, FDIR_RIGHT); } - SecondPage->Add(TipsNotificationsToggles, FDIR_DOWN); -} + secondPage->Add(TipsNotificationsToggles, FDIR_DOWN); -void OptionsMenu::Show() { - if (State != Shown) { - State = Showing; - FadeAnimation.StartIn(); - FirstPage->Show(); - if (UI::FocusedMenu != 0) { - LastFocusedMenu = UI::FocusedMenu; - LastFocusedMenu->IsFocused = false; - } - IsFocused = true; - UI::FocusedMenu = this; - } -} -void OptionsMenu::Hide() { - if (State != Hidden) { - State = Hiding; - FadeAnimation.StartOut(); - if (LastFocusedMenu != 0) { - UI::FocusedMenu = LastFocusedMenu; - LastFocusedMenu->IsFocused = true; - } else { - UI::FocusedMenu = 0; - } - IsFocused = false; - } + Pages.push_back(std::move(secondPage)); } void OptionsMenu::Update(float dt) { - UpdateInput(); + if (IsFocused) UpdateInput(dt); FadeAnimation.Update(dt); - FirstPage->Update(dt); - SecondPage->Update(dt); + Pages[CurrentPage]->Update(dt); if (ScrWork[SW_OPTIONALPHA] < 256 && State == Shown) { Hide(); } else if (ScrWork[SW_OPTIONALPHA] == 256 && State == Hidden) { @@ -367,15 +338,8 @@ void OptionsMenu::Update(float dt) { State = Hidden; if (State == Shown) { - if (PADinputButtonWentDown & PAD1X) { - if (FirstPage->IsShown) { - FirstPage->Hide(); - SecondPage->Show(); - } else if (SecondPage->IsShown) { - SecondPage->Hide(); - FirstPage->Show(); - } - } + if (PADinputButtonWentDown & PAD1X) + GoToPage((CurrentPage + 1) % Pages.size()); } if (GetControlState(CT_Back)) { @@ -384,11 +348,14 @@ void OptionsMenu::Update(float dt) { } void OptionsMenu::Render() { - if (State != Hidden) { - glm::vec4 col(1.0f, 1.0f, 1.0f, - glm::smoothstep(0.0f, 1.0f, FadeAnimation.Progress)); - Renderer->DrawSprite(BackgroundSprite, glm::vec2(0.0f, 0.0f), col); - if (FirstPage->IsShown) { + if (State == Hidden) return; + + glm::vec4 col(1.0f, 1.0f, 1.0f, + glm::smoothstep(0.0f, 1.0f, FadeAnimation.Progress)); + Renderer->DrawSprite(BackgroundSprite, glm::vec2(0.0f, 0.0f), col); + + switch (CurrentPage) { + case 0: { auto pos = FirstPageSectionHeaderPos; Renderer->DrawSprite( SectionHeaderSprites[0 + VoiceVolumeSlider->HasFocus], pos, col); @@ -405,9 +372,9 @@ void OptionsMenu::Render() { Renderer->DrawSprite( SectionHeaderSprites[8 + CharacterVoiceToggles->HasFocus], pos, col); - FirstPage->Tint = col; - FirstPage->Render(); - } else if (SecondPage->IsShown) { + break; + } + case 1: { auto pos = SecondPageSectionHeaderPos; Renderer->DrawSprite( SectionHeaderSprites[10 + MessageSpeedToggles->HasFocus], pos, col); @@ -439,10 +406,12 @@ void OptionsMenu::Render() { SectionHeaderSprites[24 + TipsNotificationsToggles->HasFocus], pos, col); - SecondPage->Tint = col; - SecondPage->Render(); + break; } } + + Pages[CurrentPage]->Tint = col; + Pages[CurrentPage]->Render(); } } // namespace MO6TW diff --git a/src/games/mo6tw/optionsmenu.h b/src/games/mo6tw/optionsmenu.h index 93bcfb71e..a3d91d75e 100644 --- a/src/games/mo6tw/optionsmenu.h +++ b/src/games/mo6tw/optionsmenu.h @@ -1,6 +1,6 @@ #pragma once -#include "../../ui/menu.h" +#include "../../ui/optionsmenu.h" #include "../../ui/widgets/group.h" #include "../../ui/widgets/button.h" #include "../../ui/widgets/scrollbar.h" @@ -10,14 +10,12 @@ namespace Impacto { namespace UI { namespace MO6TW { -class OptionsMenu : public Menu { +class OptionsMenu : public UI::OptionsMenu { public: OptionsMenu(); - void Show(); - void Hide(); - void Update(float dt); - void Render(); + void Update(float dt) override; + void Render() override; void MessageSpeedToggleOnClick(Widgets::Toggle* target); void AutoModeWaitTimeOnClick(Widgets::Toggle* target); @@ -28,18 +26,14 @@ class OptionsMenu : public Menu { void TipsNotificationsOnClick(Widgets::Toggle* target); private: - Animation FadeAnimation; - Widgets::Scrollbar* VoiceVolumeSlider; Widgets::Scrollbar* BGMVolumeSlider; Widgets::Scrollbar* SEVolumeSlider; Widgets::Scrollbar* MovieVolumeSlider; - Widgets::Group* FirstPage; Widgets::Group* CharacterVoiceToggles; bool VoiceTest[13] = {0}; Widgets::Scrollbar* ScreenSizeSlider; - Widgets::Group* SecondPage; Widgets::Group* MessageSpeedToggles; bool MessageSpeedValues[4] = {false}; Widgets::Group* AutoModeWaitTimeToggles; From a95841e52b90f111990b91e8c5ee40da35e43b01 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 16 Jan 2025 21:22:14 +0100 Subject: [PATCH 50/59] Moved chlcc's options menu to new base class --- profiles/chlcc/hud/optionsmenu.lua | 3 +- src/games/chlcc/optionsmenu.cpp | 92 +++++++++---------------- src/games/chlcc/optionsmenu.h | 11 ++- src/profile/games/chlcc/optionsmenu.cpp | 1 - src/profile/games/chlcc/optionsmenu.h | 1 - src/profile/ui/optionsmenu.cpp | 6 +- src/ui/optionsmenu.cpp | 6 +- 7 files changed, 45 insertions(+), 75 deletions(-) diff --git a/profiles/chlcc/hud/optionsmenu.lua b/profiles/chlcc/hud/optionsmenu.lua index 6f294c209..bb275df15 100644 --- a/profiles/chlcc/hud/optionsmenu.lua +++ b/profiles/chlcc/hud/optionsmenu.lua @@ -1,7 +1,8 @@ root.OptionsMenu = { DrawType = DrawComponentType.SystemMenu, Type = OptionsMenuType.CHLCC, - TransitionDuration = 64 / 60, + FadeInDuration = 64 / 60, + FadeOutDuration = 64 / 60, BackgroundColor = 0xa988e5, CircleSprite = "CircleConfig", CircleStartPosition = { X = 20, Y = 20 }, diff --git a/src/games/chlcc/optionsmenu.cpp b/src/games/chlcc/optionsmenu.cpp index 5025ad195..42a52df85 100644 --- a/src/games/chlcc/optionsmenu.cpp +++ b/src/games/chlcc/optionsmenu.cpp @@ -25,11 +25,7 @@ using namespace Impacto::Vm::Interface; using namespace Impacto::UI::Widgets; -OptionsMenu::OptionsMenu() { - MenuTransition.Direction = AnimationDirection::In; - MenuTransition.LoopMode = AnimationLoopMode::Stop; - MenuTransition.SetDuration(MenuTransitionDuration); - +OptionsMenu::OptionsMenu() : UI::OptionsMenu() { TitleFade.Direction = AnimationDirection::In; TitleFade.LoopMode = AnimationLoopMode::Stop; TitleFade.DurationIn = TitleFadeInDuration; @@ -37,39 +33,17 @@ OptionsMenu::OptionsMenu() { RedBarSprite = InitialRedBarSprite; RedBarPosition = InitialRedBarPosition; -} -void OptionsMenu::Show() { - if (State != Shown) { - if (State != Showing) MenuTransition.StartIn(); - State = Showing; - if (UI::FocusedMenu != 0) { - LastFocusedMenu = UI::FocusedMenu; - LastFocusedMenu->IsFocused = false; - } - IsFocused = true; - UI::FocusedMenu = this; - } -} -void OptionsMenu::Hide() { - if (State != Hidden) { - if (State != Hiding) { - MenuTransition.StartOut(); - } - State = Hiding; - if (LastFocusedMenu != 0) { - UI::FocusedMenu = LastFocusedMenu; - LastFocusedMenu->IsFocused = true; - } else { - UI::FocusedMenu = 0; - } - IsFocused = false; - } + // Push dummy group so Show and Hide don't access garbage + // Will be replaced when actually implemented + auto dummyPage = std::make_unique(this); + dummyPage->Add(new Label(), FDIR_DOWN); + Pages.push_back(std::move(dummyPage)); } void OptionsMenu::Render() { if (State != Hidden) { - if (MenuTransition.IsIn()) { + if (FadeAnimation.IsIn()) { Renderer->DrawRect(RectF(0.0f, 0.0f, 1280.0f, 720.0f), RgbIntToFloat(BackgroundColor)); } else { @@ -78,7 +52,7 @@ void OptionsMenu::Render() { DrawErin(); DrawRedBar(); } - if (MenuTransition.Progress > 0.34f) { + if (FadeAnimation.Progress > 0.34f) { Renderer->DrawSprite(RedBarLabel, RedTitleLabelPos); Renderer->DrawSprite(MenuTitleText, RightTitlePos, glm::vec4(1.0f), glm::vec2(1.0f), MenuTitleTextAngle); @@ -87,19 +61,19 @@ void OptionsMenu::Render() { glm::vec3 tint = {1.0f, 1.0f, 1.0f}; // Alpha goes from 0 to 1 in half the time float alpha = - MenuTransition.Progress < 0.5f ? MenuTransition.Progress * 2.0f : 1.0f; + FadeAnimation.Progress < 0.5f ? FadeAnimation.Progress * 2.0f : 1.0f; Renderer->DrawSprite(BackgroundFilter, RectF(0.0f, 0.0f, 1280.0f, 720.0f), glm::vec4(tint, alpha)); glm::vec2 offset(0.0f, 0.0f); - if (MenuTransition.Progress > 0.22f) { - if (MenuTransition.Progress < 0.72f) { + if (FadeAnimation.Progress > 0.22f) { + if (FadeAnimation.Progress < 0.72f) { // Approximated function from the original, another mess offset = glm::vec2( 0.0f, glm::mix(-720.0f, 0.0f, 1.00397f * std::sin(3.97161f - - 3.26438f * MenuTransition.Progress) - + 3.26438f * FadeAnimation.Progress) - 0.00295643f)); } DrawButtonPrompt(); @@ -114,17 +88,17 @@ void OptionsMenu::Update(float dt) { Show(); } - if (MenuTransition.IsOut() && State == Hiding) + if (FadeAnimation.IsOut() && State == Hiding) State = Hidden; - else if (MenuTransition.IsIn() && State == Showing) { + else if (FadeAnimation.IsIn() && State == Showing) { State = Shown; } if (State != Hidden) { - MenuTransition.Update(dt); - if (MenuTransition.Direction == -1.0f && MenuTransition.Progress <= 0.72f) { + FadeAnimation.Update(dt); + if (FadeAnimation.Direction == -1.0f && FadeAnimation.Progress <= 0.72f) { TitleFade.StartOut(); - } else if (MenuTransition.IsIn() && + } else if (FadeAnimation.IsIn() && (TitleFade.Direction == 1.0f || TitleFade.IsOut())) { TitleFade.StartIn(); } @@ -142,7 +116,7 @@ inline void OptionsMenu::DrawCircles() { int resetCounter = 0; // Give the whole range that mimics ScrWork[SW_SYSMENUCT] given that the // duration is totalframes/60 - float progress = MenuTransition.Progress * MenuTransitionDuration * 60.0f; + float progress = FadeAnimation.Progress * FadeInDuration * 60.0f; for (int line = 0; line < 4; line++) { int counter = resetCounter; float x = CircleStartPosition.x; @@ -166,26 +140,26 @@ inline void OptionsMenu::DrawCircles() { inline void OptionsMenu::DrawErin() { float y = ErinPosition.y; - if (MenuTransition.Progress < 0.78f) { + if (FadeAnimation.Progress < 0.78f) { y = 801.0f; - if (MenuTransition.Progress > 0.22f) { + if (FadeAnimation.Progress > 0.22f) { // Approximation from the original function, which was a bigger mess y = glm::mix( -19.0f, 721.0f, 0.998938f - - 0.998267f * sin(3.97835f - 3.27549f * MenuTransition.Progress)); + 0.998267f * sin(3.97835f - 3.27549f * FadeAnimation.Progress)); } } Renderer->DrawSprite(ErinSprite, glm::vec2(ErinPosition.x, y)); } inline void OptionsMenu::DrawRedBar() { - if (MenuTransition.IsIn()) { + if (FadeAnimation.IsIn()) { Renderer->DrawSprite(InitialRedBarSprite, InitialRedBarPosition); - } else if (MenuTransition.Progress > 0.70f) { + } else if (FadeAnimation.Progress > 0.70f) { // Give the whole range that mimics ScrWork[SW_SYSMENUCT] given that the // duration is totalframes/60 - float progress = MenuTransition.Progress * MenuTransitionDuration * 60.0f; + float progress = FadeAnimation.Progress * FadeInDuration * 60.0f; float pixelPerAdvanceLeft = RedBarBaseX * (progress - 47.0f) / 17.0f; RedBarSprite.Bounds.X = RedBarDivision - pixelPerAdvanceLeft; RedBarSprite.Bounds.Width = pixelPerAdvanceLeft; @@ -200,29 +174,29 @@ inline void OptionsMenu::DrawRedBar() { } inline void OptionsMenu::DrawButtonPrompt() { - if (MenuTransition.IsIn()) { + if (FadeAnimation.IsIn()) { Renderer->DrawSprite(ButtonPromptSprite, ButtonPromptPosition); - } else if (MenuTransition.Progress > 0.734f) { - float x = ButtonPromptPosition.x - 2560.0f * (MenuTransition.Progress - 1); + } else if (FadeAnimation.Progress > 0.734f) { + float x = ButtonPromptPosition.x - 2560.0f * (FadeAnimation.Progress - 1); Renderer->DrawSprite(ButtonPromptSprite, glm::vec2(x, ButtonPromptPosition.y)); } } void OptionsMenu::UpdateTitles() { - if (MenuTransition.Progress <= 0.34f) return; + if (FadeAnimation.Progress <= 0.34f) return; RedTitleLabelPos = RedBarLabelPosition; RightTitlePos = MenuTitleTextRightPosition; - if (MenuTransition.Progress >= 0.73f) return; + if (FadeAnimation.Progress >= 0.73f) return; RedTitleLabelPos += - glm::vec2(-572.0f * (MenuTransition.Progress * 4.0f - 3.0f), - 460.0f * (MenuTransition.Progress * 4.0f - 3.0f) / 3.0f); + glm::vec2(-572.0f * (FadeAnimation.Progress * 4.0f - 3.0f), + 460.0f * (FadeAnimation.Progress * 4.0f - 3.0f) / 3.0f); RightTitlePos += - glm::vec2(-572.0f * (MenuTransition.Progress * 4.0f - 3.0f), - 460.0f * (MenuTransition.Progress * 4.0f - 3.0f) / 3.0f); + glm::vec2(-572.0f * (FadeAnimation.Progress * 4.0f - 3.0f), + 460.0f * (FadeAnimation.Progress * 4.0f - 3.0f) / 3.0f); } } // namespace CHLCC diff --git a/src/games/chlcc/optionsmenu.h b/src/games/chlcc/optionsmenu.h index bc5e673d9..d378b426e 100644 --- a/src/games/chlcc/optionsmenu.h +++ b/src/games/chlcc/optionsmenu.h @@ -1,6 +1,6 @@ #pragma once -#include "../../ui/menu.h" +#include "../../ui/optionsmenu.h" #include "../../ui/widgets/group.h" #include "../../ui/widgets/button.h" #include "../../ui/widgets/carousel.h" @@ -10,16 +10,14 @@ namespace Impacto { namespace UI { namespace CHLCC { -class OptionsMenu : public UI::Menu { +class OptionsMenu : public UI::OptionsMenu { public: OptionsMenu(); void Init(); - void Show(); - void Hide(); - void Update(float dt); - void Render(); + void Update(float dt) override; + void Render() override; private: void DrawCircles(); @@ -28,7 +26,6 @@ class OptionsMenu : public UI::Menu { void DrawButtonPrompt(); void UpdateTitles(); - Animation MenuTransition; Animation TitleFade; glm::vec2 RedTitleLabelPos; diff --git a/src/profile/games/chlcc/optionsmenu.cpp b/src/profile/games/chlcc/optionsmenu.cpp index 7dae338aa..f7fd339f7 100644 --- a/src/profile/games/chlcc/optionsmenu.cpp +++ b/src/profile/games/chlcc/optionsmenu.cpp @@ -14,7 +14,6 @@ namespace CHLCC { namespace OptionsMenu { void Configure() { - MenuTransitionDuration = EnsureGetMemberFloat("TransitionDuration"); BackgroundColor = EnsureGetMemberUint("BackgroundColor"); CircleSprite = EnsureGetMemberSprite("CircleSprite"); CircleStartPosition = EnsureGetMemberVec2("CircleStartPosition"); diff --git a/src/profile/games/chlcc/optionsmenu.h b/src/profile/games/chlcc/optionsmenu.h index dc49bfeb4..abd19f5de 100644 --- a/src/profile/games/chlcc/optionsmenu.h +++ b/src/profile/games/chlcc/optionsmenu.h @@ -7,7 +7,6 @@ namespace Profile { namespace CHLCC { namespace OptionsMenu { -inline float MenuTransitionDuration; inline uint32_t BackgroundColor; inline Sprite CircleSprite; inline glm::vec2 CircleStartPosition; diff --git a/src/profile/ui/optionsmenu.cpp b/src/profile/ui/optionsmenu.cpp index ce293caff..ecbc27b9f 100644 --- a/src/profile/ui/optionsmenu.cpp +++ b/src/profile/ui/optionsmenu.cpp @@ -23,10 +23,10 @@ void Configure() { MinButtonHoldTime = EnsureGetMemberFloat("MinButtonHoldTime"); ButtonHoldTimeInterval = EnsureGetMemberFloat("ButtonHoldTimeInterval"); - if (Type != +OptionsMenuType::CHLCC) { - FadeInDuration = EnsureGetMemberFloat("FadeInDuration"); - FadeOutDuration = EnsureGetMemberFloat("FadeOutDuration"); + FadeInDuration = EnsureGetMemberFloat("FadeInDuration"); + FadeOutDuration = EnsureGetMemberFloat("FadeOutDuration"); + if (Type != +OptionsMenuType::CHLCC) { BackgroundSprite = EnsureGetMemberSprite("BackgroundSprite"); }; diff --git a/src/ui/optionsmenu.cpp b/src/ui/optionsmenu.cpp index 824d9440e..9ffdd15e8 100644 --- a/src/ui/optionsmenu.cpp +++ b/src/ui/optionsmenu.cpp @@ -22,8 +22,8 @@ OptionsMenu::OptionsMenu() { void OptionsMenu::Show() { if (State != Shown) { + if (State != Showing) FadeAnimation.StartIn(); State = Showing; - FadeAnimation.StartIn(); CurrentPage = 0; Pages[CurrentPage]->Show(); @@ -40,8 +40,8 @@ void OptionsMenu::Show() { void OptionsMenu::Hide() { if (State != Hidden) { + if (State != Hiding) FadeAnimation.StartOut(); State = Hiding; - FadeAnimation.StartOut(); if (LastFocusedMenu != nullptr) { UI::FocusedMenu = LastFocusedMenu; @@ -197,7 +197,7 @@ void OptionsMenu::Highlight(Widget* toHighlight) { entry->HasFocus = false; } - toHighlight->HasFocus = true; + if (toHighlight) toHighlight->HasFocus = true; CurrentlyFocusedElement = toHighlight; } From 9b5d51e1315130bd85baeb974b399eb084dce7fb Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 16 Jan 2025 22:02:26 +0100 Subject: [PATCH 51/59] Cleaned up optionsmenu profile config --- src/profile/games/cclcc/optionsmenu.cpp | 1 + src/profile/games/cclcc/optionsmenu.h | 1 + src/profile/games/mo6tw/optionsmenu.cpp | 2 ++ src/profile/games/mo6tw/optionsmenu.h | 2 ++ src/profile/games/mo8/optionsmenu.cpp | 2 ++ src/profile/games/mo8/optionsmenu.h | 2 ++ src/profile/ui/optionsmenu.cpp | 25 +++++++++++++------------ src/profile/ui/optionsmenu.h | 2 -- 8 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/profile/games/cclcc/optionsmenu.cpp b/src/profile/games/cclcc/optionsmenu.cpp index 7a6b93aa5..5ac38f1d0 100644 --- a/src/profile/games/cclcc/optionsmenu.cpp +++ b/src/profile/games/cclcc/optionsmenu.cpp @@ -13,6 +13,7 @@ namespace CCLCC { namespace OptionsMenu { void Configure() { + BackgroundSprite = EnsureGetMemberSprite("BackgroundSprite"); BackgroundPosition = EnsureGetMemberVec2("BackgroundPosition"); BackgroundFadeStartPosition = EnsureGetMemberVec2("BackgroundFadeStartPosition"); diff --git a/src/profile/games/cclcc/optionsmenu.h b/src/profile/games/cclcc/optionsmenu.h index 397433fee..da18fafc1 100644 --- a/src/profile/games/cclcc/optionsmenu.h +++ b/src/profile/games/cclcc/optionsmenu.h @@ -14,6 +14,7 @@ int constexpr LabelCount = 16; int constexpr NametagCount = 13; int constexpr PortraitCount = NametagCount * 2; +inline Sprite BackgroundSprite; inline glm::vec2 BackgroundPosition; inline glm::vec2 BackgroundFadeStartPosition; diff --git a/src/profile/games/mo6tw/optionsmenu.cpp b/src/profile/games/mo6tw/optionsmenu.cpp index 0ce964351..bf0e2569c 100644 --- a/src/profile/games/mo6tw/optionsmenu.cpp +++ b/src/profile/games/mo6tw/optionsmenu.cpp @@ -13,6 +13,8 @@ namespace MO6TW { namespace OptionsMenu { void Configure() { + BackgroundSprite = EnsureGetMemberSprite("BackgroundSprite"); + GetMemberSpriteArray(VoiceToggleEnabledSprites, VoiceToggleCount, "VoiceToggleEnabledSprites"); GetMemberSpriteArray(VoiceToggleDisabledSprites, VoiceToggleCount, diff --git a/src/profile/games/mo6tw/optionsmenu.h b/src/profile/games/mo6tw/optionsmenu.h index 7e9b7abc7..c5d6dd162 100644 --- a/src/profile/games/mo6tw/optionsmenu.h +++ b/src/profile/games/mo6tw/optionsmenu.h @@ -12,6 +12,8 @@ int constexpr SectionHeaderSpriteCount = 13 * 2; int constexpr CheckboxLabelCount = 14; int constexpr AutoSaveTriggerXPosCount = 4; +inline Sprite BackgroundSprite; + inline Sprite VoiceToggleEnabledSprites[VoiceToggleCount]; inline Sprite VoiceToggleDisabledSprites[VoiceToggleCount]; inline Sprite VoiceToggleHighlightSprite; diff --git a/src/profile/games/mo8/optionsmenu.cpp b/src/profile/games/mo8/optionsmenu.cpp index 5589f1dc3..f1299faa6 100644 --- a/src/profile/games/mo8/optionsmenu.cpp +++ b/src/profile/games/mo8/optionsmenu.cpp @@ -16,6 +16,8 @@ void Configure() { auto drawType = Game::DrawComponentType::_from_integral_unchecked( EnsureGetMemberInt("DrawType")); + BackgroundSprite = EnsureGetMemberSprite("BackgroundSprite"); + NextButtonSprite = EnsureGetMemberSprite("NextButtonSprite"); NextButtonHighlightedSprite = EnsureGetMemberSprite("NextButtonHighlightedSprite"); diff --git a/src/profile/games/mo8/optionsmenu.h b/src/profile/games/mo8/optionsmenu.h index e13b17e39..d08ee9233 100644 --- a/src/profile/games/mo8/optionsmenu.h +++ b/src/profile/games/mo8/optionsmenu.h @@ -7,6 +7,8 @@ namespace Profile { namespace MO8 { namespace OptionsMenu { +inline Sprite BackgroundSprite; + inline Sprite NextButtonSprite; inline Sprite NextButtonHighlightedSprite; inline glm::vec2 NextButtonPosition; diff --git a/src/profile/ui/optionsmenu.cpp b/src/profile/ui/optionsmenu.cpp index ecbc27b9f..8068874fb 100644 --- a/src/profile/ui/optionsmenu.cpp +++ b/src/profile/ui/optionsmenu.cpp @@ -26,18 +26,19 @@ void Configure() { FadeInDuration = EnsureGetMemberFloat("FadeInDuration"); FadeOutDuration = EnsureGetMemberFloat("FadeOutDuration"); - if (Type != +OptionsMenuType::CHLCC) { - BackgroundSprite = EnsureGetMemberSprite("BackgroundSprite"); - }; - - if (Type == +OptionsMenuType::MO6TW) { - MO6TW::OptionsMenu::Configure(); - } else if (Type == +OptionsMenuType::CHLCC) { - CHLCC::OptionsMenu::Configure(); - } else if (Type == +OptionsMenuType::CCLCC) { - CCLCC::OptionsMenu::Configure(); - } else if (Type == +OptionsMenuType::MO8) { - MO8::OptionsMenu::Configure(); + switch (Type) { + case OptionsMenuType::MO6TW: + MO6TW::OptionsMenu::Configure(); + break; + case OptionsMenuType::MO8: + MO8::OptionsMenu::Configure(); + break; + case OptionsMenuType::CHLCC: + CHLCC::OptionsMenu::Configure(); + break; + case OptionsMenuType::CCLCC: + CCLCC::OptionsMenu::Configure(); + break; } Pop(); diff --git a/src/profile/ui/optionsmenu.h b/src/profile/ui/optionsmenu.h index ef42c611b..603c6f21e 100644 --- a/src/profile/ui/optionsmenu.h +++ b/src/profile/ui/optionsmenu.h @@ -9,8 +9,6 @@ namespace OptionsMenu { inline Impacto::UI::OptionsMenuType Type = Impacto::UI::OptionsMenuType::None; -inline Sprite BackgroundSprite; - inline float FadeInDuration; inline float FadeOutDuration; From b1cf82492977e9ca0cee3666cafa218076d0b62d Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 16 Jan 2025 22:08:45 +0100 Subject: [PATCH 52/59] Applied cclcc optionsmenu move transition to all pages --- src/games/cclcc/optionsmenu.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index dbf786686..3ceea2e75 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -153,7 +153,9 @@ void OptionsMenu::Update(float dt) { const glm::vec2 backgroundPosition = glm::vec2(0.0f, glm::mix(BackgroundFadeStartPosition.y, BackgroundPosition.y, FadeAnimation.Progress)); - Pages[CurrentPage]->MoveTo(backgroundPosition); + for (std::unique_ptr& page : Pages) { + page->MoveTo(backgroundPosition); + } } } From bd21f39d7150568aa3271f4f76d4fe6d156123bf Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Thu, 16 Jan 2025 14:09:45 +0100 Subject: [PATCH 53/59] Moved mo8's options menu over to new base class --- src/games/mo8/optionsmenu.cpp | 186 ++++++++++++---------------------- src/games/mo8/optionsmenu.h | 25 ++--- src/ui/optionsmenu.cpp | 29 +++--- 3 files changed, 86 insertions(+), 154 deletions(-) diff --git a/src/games/mo8/optionsmenu.cpp b/src/games/mo8/optionsmenu.cpp index 0cd5cb65d..17fd0ec15 100644 --- a/src/games/mo8/optionsmenu.cpp +++ b/src/games/mo8/optionsmenu.cpp @@ -21,10 +21,12 @@ using namespace Impacto::UI::Widgets; static bool FalseValue = false; static float Test = 0.5f; -void OptionsMenu::NextPageOnClick(Widgets::Button* target) { GoToNextPage(); } +void OptionsMenu::NextPageOnClick(Widgets::Button* target) { + GoToPage((CurrentPage + 1) % Pages.size()); +} void OptionsMenu::PreviousPageOnClick(Widgets::Button* target) { - GoToPreviousPage(); + GoToPage((CurrentPage - 1) % Pages.size()); } void OptionsMenu::MessageSpeedToggleOnClick(Widgets::Toggle* target) { @@ -54,11 +56,7 @@ void OptionsMenu::SkipModeOnClick(Widgets::Toggle* target) { } } -OptionsMenu::OptionsMenu() { - FadeAnimation.Direction = AnimationDirection::In; - FadeAnimation.LoopMode = AnimationLoopMode::Stop; - FadeAnimation.DurationIn = FadeInDuration; - FadeAnimation.DurationOut = FadeOutDuration; +OptionsMenu::OptionsMenu() : UI::OptionsMenu() { PageFadeAnimation.Direction = AnimationDirection::In; PageFadeAnimation.LoopMode = AnimationLoopMode::Stop; PageFadeAnimation.DurationIn = FadeInDuration; @@ -87,9 +85,9 @@ OptionsMenu::OptionsMenu() { auto currentPos = ListStartingPosition; // --- Text page --- - TextPage = new Group(this); - TextPage->FocusLock = false; - TextPage->Add(new Label(TextPageLabel, PageLabelPosition)); + auto textPage = std::make_unique(this); + textPage->FocusLock = false; + textPage->Add(new Label(TextPageLabel, PageLabelPosition)); // Text speed auto textSpeedOnClick = std::bind(&OptionsMenu::MessageSpeedToggleOnClick, @@ -104,7 +102,7 @@ OptionsMenu::OptionsMenu() { toggle->OnClickHandler = textSpeedOnClick; textSpeedOptions->AddOption(toggle); } - TextPage->Add(textSpeedOptions, FDIR_DOWN); + textPage->Add(textSpeedOptions, FDIR_DOWN); currentPos += ListPadding; // Auto mode wait time @@ -120,7 +118,7 @@ OptionsMenu::OptionsMenu() { toggle->OnClickHandler = autoModeWaitTimeOnClick; autoModeOptions->AddOption(toggle); } - TextPage->Add(autoModeOptions, FDIR_DOWN); + textPage->Add(autoModeOptions, FDIR_DOWN); currentPos += ListPadding; // Skip mode @@ -136,14 +134,14 @@ OptionsMenu::OptionsMenu() { toggle->OnClickHandler = skipModeOnClick; skipModeOptions->AddOption(toggle); } - TextPage->Add(skipModeOptions, FDIR_DOWN); - Pages.push_back(TextPage); + textPage->Add(skipModeOptions, FDIR_DOWN); + Pages.push_back(std::move(textPage)); currentPos = ListStartingPosition; // --- Sound page 1 --- - SoundPage1 = new Group(this); - SoundPage1->FocusLock = false; - SoundPage1->Add(new Label(SoundPageLabel, PageLabelPosition)); + auto soundPage1 = std::make_unique(this); + soundPage1->FocusLock = false; + soundPage1->Add(new Label(SoundPageLabel, PageLabelPosition)); // Voice sync options auto voiceSyncOptions = @@ -154,7 +152,7 @@ OptionsMenu::OptionsMenu() { i, &FalseValue, SoundModeOptionsHSprites[i], SoundModeOptionsSprites[i], nullSprite, glm::vec2(0.0f), false)); } - SoundPage1->Add(voiceSyncOptions, FDIR_DOWN); + soundPage1->Add(voiceSyncOptions, FDIR_DOWN); currentPos += ListPadding; // Voice skip options @@ -166,7 +164,7 @@ OptionsMenu::OptionsMenu() { i, &FalseValue, SoundModeOptionsHSprites[i], SoundModeOptionsSprites[i], nullSprite, glm::vec2(0.0f), false)); } - SoundPage1->Add(voiceSkipOptions, FDIR_DOWN); + soundPage1->Add(voiceSkipOptions, FDIR_DOWN); currentPos += ListPadding; // Voice highlight options @@ -178,14 +176,14 @@ OptionsMenu::OptionsMenu() { i, &FalseValue, SoundModeOptionsHSprites[i], SoundModeOptionsSprites[i], nullSprite, glm::vec2(0.0f), false)); } - SoundPage1->Add(voiceHighlightOptions, FDIR_DOWN); - Pages.push_back(SoundPage1); + soundPage1->Add(voiceHighlightOptions, FDIR_DOWN); + Pages.push_back(std::move(soundPage1)); currentPos = ListStartingPosition; // --- Sound page 2 --- - SoundPage2 = new Group(this); - SoundPage2->FocusLock = false; - SoundPage2->Add(new Label(SoundPageLabel, PageLabelPosition)); + auto soundPage2 = std::make_unique(this); + soundPage2->FocusLock = false; + soundPage2->Add(new Label(SoundPageLabel, PageLabelPosition)); // BGM volume options auto bgmVolumeOptions = @@ -196,7 +194,7 @@ OptionsMenu::OptionsMenu() { SBDIR_HORIZONTAL, SliderTrackSprite, nullSprite, SliderFillSprite); bgmVolumeOptions->AddOption(bgmVolumeSlider); bgmVolumeSlider->FillBeforeTrack = true; - SoundPage2->Add(bgmVolumeOptions, FDIR_DOWN); + soundPage2->Add(bgmVolumeOptions, FDIR_DOWN); currentPos += ListPadding; // Voice volume options @@ -208,7 +206,7 @@ OptionsMenu::OptionsMenu() { SBDIR_HORIZONTAL, SliderTrackSprite, nullSprite, SliderFillSprite); voiceVolumeOptions->AddOption(voiceVolumeSlider); voiceVolumeSlider->FillBeforeTrack = true; - SoundPage2->Add(voiceVolumeOptions, FDIR_DOWN); + soundPage2->Add(voiceVolumeOptions, FDIR_DOWN); currentPos += ListPadding; // SE volume options @@ -220,7 +218,7 @@ OptionsMenu::OptionsMenu() { SBDIR_HORIZONTAL, SliderTrackSprite, nullSprite, SliderFillSprite); seVolumeOptions->AddOption(seVolumeSlider); seVolumeSlider->FillBeforeTrack = true; - SoundPage2->Add(seVolumeOptions, FDIR_DOWN); + soundPage2->Add(seVolumeOptions, FDIR_DOWN); currentPos += ListPadding; // SYSSE volume options @@ -232,19 +230,19 @@ OptionsMenu::OptionsMenu() { SBDIR_HORIZONTAL, SliderTrackSprite, nullSprite, SliderFillSprite); systemSeVolumeOptions->AddOption(systemSeVolumeSlider); systemSeVolumeSlider->FillBeforeTrack = true; - SoundPage2->Add(systemSeVolumeOptions, FDIR_DOWN); + soundPage2->Add(systemSeVolumeOptions, FDIR_DOWN); currentPos += ListPadding; auto characterVoiceButton = new Button(0, CharacterVoiceVolumeLabel, CharacterVoiceVolumeLabelH, nullSprite, currentPos); - SoundPage2->Add(characterVoiceButton, FDIR_DOWN); - Pages.push_back(SoundPage2); + soundPage2->Add(characterVoiceButton, FDIR_DOWN); + Pages.push_back(std::move(soundPage2)); currentPos = ListStartingPosition; // --- Other page --- - OtherPage = new Group(this); - OtherPage->FocusLock = false; - OtherPage->Add(new Label(OtherPageLabel, PageLabelPosition)); + auto otherPage = std::make_unique(this); + otherPage->FocusLock = false; + otherPage->Add(new Label(OtherPageLabel, PageLabelPosition)); // Quick save options auto quickSaveOptions = @@ -255,46 +253,26 @@ OptionsMenu::OptionsMenu() { i, &FalseValue, QuickSaveOptionsHSprites[i], QuickSaveOptionsSprites[i], nullSprite, glm::vec2(0.0f), false)); } - OtherPage->Add(quickSaveOptions, FDIR_DOWN); - Pages.push_back(OtherPage); - - CurrentPage = Pages.begin(); - PreviousPage = Pages.end(); + otherPage->Add(quickSaveOptions, FDIR_DOWN); + Pages.push_back(std::move(otherPage)); } -void OptionsMenu::Show() { - if (State != Shown) { - State = Showing; - FadeAnimation.StartIn(); - (*CurrentPage)->Show(); - if (UI::FocusedMenu != 0) { - LastFocusedMenu = UI::FocusedMenu; - LastFocusedMenu->IsFocused = false; - } - IsFocused = true; - UI::FocusedMenu = this; - CurrentlyFocusedElement = (*CurrentPage)->GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; - } +void OptionsMenu::UpdatePageInput(float dt) { + // Mouse controls + PageControls->Update(dt); + + UI::OptionsMenu::UpdatePageInput(dt); } + void OptionsMenu::Hide() { if (State != Hidden) { - State = Hiding; - FadeAnimation.StartOut(); - if (LastFocusedMenu != 0) { - UI::FocusedMenu = LastFocusedMenu; - LastFocusedMenu->IsFocused = true; - } else { - UI::FocusedMenu = 0; - } - IsFocused = false; + PreviousPage = -1; } + + UI::OptionsMenu::Hide(); } void OptionsMenu::Update(float dt) { - UpdateInput(); - - FadeAnimation.Update(dt); PageFadeAnimation.Update(dt); if (ScrWork[SW_SYSSUBMENUCT] < 16 && ScrWork[SW_SYSSUBMENUNO] == 5 && State == Shown) { @@ -304,36 +282,14 @@ void OptionsMenu::Update(float dt) { Show(); } - if (ScrWork[SW_SYSSUBMENUCT] == 16 && ScrWork[SW_SYSSUBMENUNO] == 5 && - FadeAnimation.IsIn()) - State = Shown; - else if (ScrWork[SW_SYSSUBMENUCT] == 0 && ScrWork[SW_SYSSUBMENUNO] == 5 && - FadeAnimation.IsOut()) - State = Hidden; - - if (State == Shown && IsFocused) { - PageControls->Update(dt); - - if (PADinputButtonWentDown & PAD1L2) { - GoToPreviousPage(); - } else if (PADinputButtonWentDown & PAD1R2) { - GoToNextPage(); - } + UI::OptionsMenu::Update(dt); + if (State != Hidden) { if (PageFadeAnimation.State == +AnimationState::Playing) { - (*PreviousPage)->Update(dt); - (*CurrentPage)->Update(dt); - } else { - if (PreviousPage != Pages.end() && (*PreviousPage)->IsShown) { - (*PreviousPage)->Hide(); - (*CurrentPage)->Show(); - } - - (*CurrentPage)->Update(dt); - } - - if (GetControlState(CT_Back)) { - SetFlag(SF_SUBMENUEXIT, true); + Pages[PreviousPage]->Update(dt); + } else if (PreviousPage != -1 && Pages[PreviousPage]->IsShown) { + Pages[PreviousPage]->Hide(); + Pages[CurrentPage]->Show(); } } } @@ -344,19 +300,22 @@ void OptionsMenu::Render() { glm::smoothstep(0.0f, 1.0f, FadeAnimation.Progress)); Renderer->DrawSprite(BackgroundSprite, glm::vec2(0.0f, 0.0f), col); + std::unique_ptr& currentPage = Pages[CurrentPage]; if (PageFadeAnimation.State == +AnimationState::Playing) { - (*CurrentPage)->Tint = col; - (*PreviousPage)->Tint = col; - (*CurrentPage)->Tint.a *= + std::unique_ptr& previousPage = Pages[PreviousPage]; + + currentPage->Tint = col; + previousPage->Tint = col; + currentPage->Tint.a *= glm::smoothstep(0.0f, 1.0f, PageFadeAnimation.Progress); - (*PreviousPage)->Tint.a *= + previousPage->Tint.a *= glm::smoothstep(1.0f, 0.0f, PageFadeAnimation.Progress); - (*PreviousPage)->Render(); - (*CurrentPage)->Render(); + previousPage->Render(); + currentPage->Render(); } else { - (*CurrentPage)->Tint = col; - (*CurrentPage)->Render(); + currentPage->Tint = col; + currentPage->Render(); } PageControls->Tint = col; @@ -364,31 +323,12 @@ void OptionsMenu::Render() { } } -void OptionsMenu::GoToNextPage() { - PreviousPage = CurrentPage; - (*CurrentPage)->HasFocus = false; - CurrentPage++; - if (CurrentPage == Pages.end()) { - CurrentPage = Pages.begin(); - } - (*CurrentPage)->HasFocus = true; - (*CurrentPage)->Show(); - CurrentlyFocusedElement = (*CurrentPage)->GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; - PageFadeAnimation.StartIn(true); -} +void OptionsMenu::GoToPage(int pageNumber) { + if (CurrentPage == pageNumber && Pages[CurrentPage]->IsShown) return; -void OptionsMenu::GoToPreviousPage() { PreviousPage = CurrentPage; - (*CurrentPage)->HasFocus = false; - if (CurrentPage == Pages.begin()) { - CurrentPage = Pages.end(); - } - CurrentPage--; - (*CurrentPage)->HasFocus = true; - (*CurrentPage)->Show(); - CurrentlyFocusedElement = (*CurrentPage)->GetFirstFocusableChild(); - CurrentlyFocusedElement->HasFocus = true; + UI::OptionsMenu::GoToPage(pageNumber); + PageFadeAnimation.StartIn(true); } diff --git a/src/games/mo8/optionsmenu.h b/src/games/mo8/optionsmenu.h index 3040a6184..44e735aa3 100644 --- a/src/games/mo8/optionsmenu.h +++ b/src/games/mo8/optionsmenu.h @@ -1,6 +1,6 @@ #pragma once -#include "../../ui/menu.h" +#include "../../ui/optionsmenu.h" #include "../../ui/widgets/group.h" #include "../../ui/widgets/button.h" #include "../../ui/widgets/scrollbar.h" @@ -11,14 +11,13 @@ namespace Impacto { namespace UI { namespace MO8 { -class OptionsMenu : public Menu { +class OptionsMenu : public UI::OptionsMenu { public: OptionsMenu(); - void Show(); - void Hide(); - void Update(float dt); - void Render(); + void Update(float dt) override; + void Render() override; + void Hide() override; void NextPageOnClick(Widgets::Button* target); void PreviousPageOnClick(Widgets::Button* target); @@ -27,21 +26,13 @@ class OptionsMenu : public Menu { void SkipModeOnClick(Widgets::Toggle* target); private: - void GoToNextPage(); - void GoToPreviousPage(); + void UpdatePageInput(float dt) override; - Animation FadeAnimation; + void GoToPage(int pageNumber) override; Animation PageFadeAnimation; + int PreviousPage = -1; Widgets::Group* PageControls; - Widgets::Group* TextPage; - Widgets::Group* SoundPage1; - Widgets::Group* SoundPage2; - Widgets::Group* OtherPage; - - std::vector Pages; - std::vector::iterator CurrentPage; - std::vector::iterator PreviousPage; bool MessageSpeedValues[4] = {false}; bool AutoModeWaitTimeValues[3] = {false}; diff --git a/src/ui/optionsmenu.cpp b/src/ui/optionsmenu.cpp index 9ffdd15e8..c1959ea69 100644 --- a/src/ui/optionsmenu.cpp +++ b/src/ui/optionsmenu.cpp @@ -25,9 +25,7 @@ void OptionsMenu::Show() { if (State != Showing) FadeAnimation.StartIn(); State = Showing; - CurrentPage = 0; - Pages[CurrentPage]->Show(); - Highlight(Pages[CurrentPage]->GetFirstFocusableChild()); + GoToPage(0); if (UI::FocusedMenu != nullptr) { LastFocusedMenu = UI::FocusedMenu; @@ -43,6 +41,8 @@ void OptionsMenu::Hide() { if (State != Hiding) FadeAnimation.StartOut(); State = Hiding; + Pages[CurrentPage]->Hide(); + if (LastFocusedMenu != nullptr) { UI::FocusedMenu = LastFocusedMenu; LastFocusedMenu->IsFocused = true; @@ -130,12 +130,13 @@ void OptionsMenu::UpdateEntryMovementInput(float dt) { // Don't count towards holding the movement button if it is not // in a valid movement direction - const bool moving = - (verticalMovement && - CurrentlyFocusedElement->GetFocus(verticalDirection) || - horizontalMovement && - CurrentlyFocusedElement->GetFocus(horizontalDirection)) || - ((verticalMovement || horizontalMovement) && !CurrentlyFocusedElement); + bool moving = CurrentlyFocusedElement && + (verticalMovement && + CurrentlyFocusedElement->GetFocus(verticalDirection) || + horizontalMovement && + CurrentlyFocusedElement->GetFocus(horizontalDirection)); + moving |= + !CurrentlyFocusedElement && (verticalMovement || horizontalMovement); if (!moving) { DirectionButtonHeldTime = 0.0f; @@ -178,16 +179,16 @@ void OptionsMenu::UpdateInput(float dt) { } void OptionsMenu::GoToPage(int pageNumber) { - if (CurrentPage == pageNumber) return; + if (CurrentPage == pageNumber && Pages[CurrentPage]->IsShown) return; Pages[CurrentPage]->Hide(); CurrentPage = pageNumber; - Group& page = *Pages[CurrentPage]; + std::unique_ptr& page = Pages[CurrentPage]; - page.HasFocus = true; - page.Show(); - Highlight(page.GetFirstFocusableChild()); + page->HasFocus = true; + page->Show(); + Highlight(page->GetFirstFocusableChild()); } void OptionsMenu::Highlight(Widget* toHighlight) { From 9fe52e74feddfcc3aead60dd67b3aaae61b5def3 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 18 Jan 2025 17:38:12 +0100 Subject: [PATCH 54/59] Decoupled UpdateVisibility from OptionsMenu UI --- src/games/cclcc/optionsmenu.cpp | 22 +++++++++++++++++++++- src/games/cclcc/optionsmenu.h | 1 + src/games/chlcc/optionsmenu.cpp | 6 +++++- src/games/chlcc/optionsmenu.h | 2 ++ src/games/mo6tw/optionsmenu.cpp | 10 +++++----- src/games/mo6tw/optionsmenu.h | 2 ++ src/games/mo8/optionsmenu.cpp | 21 +++++++++++++++++++-- src/games/mo8/optionsmenu.h | 4 +++- src/ui/optionsmenu.cpp | 20 +------------------- src/ui/optionsmenu.h | 1 + 10 files changed, 60 insertions(+), 29 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index 3ceea2e75..ae65a796c 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -144,11 +144,31 @@ void OptionsMenu::Hide() { UI::OptionsMenu::Hide(); } +void OptionsMenu::UpdateVisibility() { + if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown && + ScrWork[SW_SYSSUBMENUNO] == 5) { + Hide(); + } else if (ScrWork[SW_SYSSUBMENUCT] >= 32 && State == Hidden && + ScrWork[SW_SYSSUBMENUNO] == 5) { + Show(); + } + + if (FadeAnimation.IsIn()) { + State = Shown; + } else if (State == Hiding && FadeAnimation.IsOut() && + ScrWork[SW_SYSSUBMENUCT] == 0) { + State = Hidden; + Pages[CurrentPage]->Hide(); + } +} + void OptionsMenu::Update(float dt) { UI::OptionsMenu::Update(dt); - PoleAnimation.Update(dt); + if (State == Hiding && FadeAnimation.IsOut() && ScrWork[SW_SYSSUBMENUCT] != 0) + SetFlag(SF_SUBMENUEXIT, true); + if (!FadeAnimation.IsIn() && !FadeAnimation.IsOut()) { const glm::vec2 backgroundPosition = glm::vec2(0.0f, glm::mix(BackgroundFadeStartPosition.y, diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index ce61e71ac..ddc2c34bf 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -33,6 +33,7 @@ class OptionsMenu : public UI::OptionsMenu { void UpdatePageInput(float dt) override; void UpdateEntryMovementInput(float dt) override; + inline void UpdateVisibility() override; SpriteAnimation PoleAnimation; diff --git a/src/games/chlcc/optionsmenu.cpp b/src/games/chlcc/optionsmenu.cpp index 42a52df85..49b0cb706 100644 --- a/src/games/chlcc/optionsmenu.cpp +++ b/src/games/chlcc/optionsmenu.cpp @@ -80,7 +80,7 @@ void OptionsMenu::Render() { } } -void OptionsMenu::Update(float dt) { +void OptionsMenu::UpdateVisibility() { if (ScrWork[SW_SYSMENUCT] < 10000 && State == Shown) { Hide(); } else if (GetFlag(SF_OPTIONMENU) && ScrWork[SW_SYSMENUCT] > 0 && @@ -93,6 +93,10 @@ void OptionsMenu::Update(float dt) { else if (FadeAnimation.IsIn() && State == Showing) { State = Shown; } +} + +void OptionsMenu::Update(float dt) { + UpdateVisibility(); if (State != Hidden) { FadeAnimation.Update(dt); diff --git a/src/games/chlcc/optionsmenu.h b/src/games/chlcc/optionsmenu.h index d378b426e..644a195e6 100644 --- a/src/games/chlcc/optionsmenu.h +++ b/src/games/chlcc/optionsmenu.h @@ -24,7 +24,9 @@ class OptionsMenu : public UI::OptionsMenu { void DrawErin(); void DrawRedBar(); void DrawButtonPrompt(); + void UpdateTitles(); + inline void UpdateVisibility() override; Animation TitleFade; diff --git a/src/games/mo6tw/optionsmenu.cpp b/src/games/mo6tw/optionsmenu.cpp index b4d36f03b..fe1df6bf5 100644 --- a/src/games/mo6tw/optionsmenu.cpp +++ b/src/games/mo6tw/optionsmenu.cpp @@ -321,11 +321,7 @@ OptionsMenu::OptionsMenu() : UI::OptionsMenu() { Pages.push_back(std::move(secondPage)); } -void OptionsMenu::Update(float dt) { - if (IsFocused) UpdateInput(dt); - - FadeAnimation.Update(dt); - Pages[CurrentPage]->Update(dt); +void OptionsMenu::UpdateVisibility() { if (ScrWork[SW_OPTIONALPHA] < 256 && State == Shown) { Hide(); } else if (ScrWork[SW_OPTIONALPHA] == 256 && State == Hidden) { @@ -336,6 +332,10 @@ void OptionsMenu::Update(float dt) { State = Shown; else if (ScrWork[SW_OPTIONALPHA] == 0 && FadeAnimation.IsOut()) State = Hidden; +} + +void OptionsMenu::Update(float dt) { + UI::OptionsMenu::Update(dt); if (State == Shown) { if (PADinputButtonWentDown & PAD1X) diff --git a/src/games/mo6tw/optionsmenu.h b/src/games/mo6tw/optionsmenu.h index a3d91d75e..8d1f30b70 100644 --- a/src/games/mo6tw/optionsmenu.h +++ b/src/games/mo6tw/optionsmenu.h @@ -26,6 +26,8 @@ class OptionsMenu : public UI::OptionsMenu { void TipsNotificationsOnClick(Widgets::Toggle* target); private: + inline void UpdateVisibility() override; + Widgets::Scrollbar* VoiceVolumeSlider; Widgets::Scrollbar* BGMVolumeSlider; Widgets::Scrollbar* SEVolumeSlider; diff --git a/src/games/mo8/optionsmenu.cpp b/src/games/mo8/optionsmenu.cpp index 17fd0ec15..4a631a6e4 100644 --- a/src/games/mo8/optionsmenu.cpp +++ b/src/games/mo8/optionsmenu.cpp @@ -272,8 +272,7 @@ void OptionsMenu::Hide() { UI::OptionsMenu::Hide(); } -void OptionsMenu::Update(float dt) { - PageFadeAnimation.Update(dt); +void OptionsMenu::UpdateVisibility() { if (ScrWork[SW_SYSSUBMENUCT] < 16 && ScrWork[SW_SYSSUBMENUNO] == 5 && State == Shown) { Hide(); @@ -282,6 +281,24 @@ void OptionsMenu::Update(float dt) { Show(); } + if (ScrWork[SW_SYSSUBMENUCT] == 16 && ScrWork[SW_SYSSUBMENUNO] == 5 && + FadeAnimation.IsIn()) { + State = Shown; + } else if (ScrWork[SW_SYSSUBMENUCT] == 0 && ScrWork[SW_SYSSUBMENUNO] == 5 && + FadeAnimation.IsOut()) { + State = Hidden; + } +} + +void OptionsMenu::UpdateInput(float dt) { + UI::OptionsMenu::UpdateInput(dt); + + if (GetControlState(CT_Back)) SetFlag(SF_SUBMENUEXIT, true); +} + +void OptionsMenu::Update(float dt) { + PageFadeAnimation.Update(dt); + UI::OptionsMenu::Update(dt); if (State != Hidden) { diff --git a/src/games/mo8/optionsmenu.h b/src/games/mo8/optionsmenu.h index 44e735aa3..21753c87a 100644 --- a/src/games/mo8/optionsmenu.h +++ b/src/games/mo8/optionsmenu.h @@ -15,9 +15,10 @@ class OptionsMenu : public UI::OptionsMenu { public: OptionsMenu(); + void Hide() override; void Update(float dt) override; + void UpdateInput(float dt) override; void Render() override; - void Hide() override; void NextPageOnClick(Widgets::Button* target); void PreviousPageOnClick(Widgets::Button* target); @@ -27,6 +28,7 @@ class OptionsMenu : public UI::OptionsMenu { private: void UpdatePageInput(float dt) override; + inline void UpdateVisibility() override; void GoToPage(int pageNumber) override; Animation PageFadeAnimation; diff --git a/src/ui/optionsmenu.cpp b/src/ui/optionsmenu.cpp index c1959ea69..611e56a53 100644 --- a/src/ui/optionsmenu.cpp +++ b/src/ui/optionsmenu.cpp @@ -60,30 +60,12 @@ void OptionsMenu::Hide() { void OptionsMenu::Update(float dt) { FadeAnimation.Update(dt); - if (ScrWork[SW_SYSSUBMENUCT] < 32 && State == Shown && - ScrWork[SW_SYSSUBMENUNO] == 5) { - Hide(); - } else if (ScrWork[SW_SYSSUBMENUCT] >= 32 && State == Hidden && - ScrWork[SW_SYSSUBMENUNO] == 5) { - Show(); - } + UpdateVisibility(); if (State != Hidden) { UpdateInput(dt); Pages[CurrentPage]->Update(dt); } - - if (FadeAnimation.IsIn()) { - State = Shown; - } else if (State == Hiding && FadeAnimation.IsOut()) { - if (ScrWork[SW_SYSSUBMENUCT] == 0) { - State = Hidden; - - Pages[CurrentPage]->Hide(); - } else { - SetFlag(SF_SUBMENUEXIT, true); - } - } } void OptionsMenu::UpdatePageInput(float dt) { diff --git a/src/ui/optionsmenu.h b/src/ui/optionsmenu.h index a89209137..7623cef1f 100644 --- a/src/ui/optionsmenu.h +++ b/src/ui/optionsmenu.h @@ -19,6 +19,7 @@ class OptionsMenu : public Menu { virtual void GoToPage(int pageNumber); virtual void UpdatePageInput(float dt); virtual void UpdateEntryMovementInput(float dt); + virtual void UpdateVisibility() = 0; virtual void Highlight(Widget* toHighlight); From bc0aa142933ec5adb64b00d32358c5d46255d90d Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 18 Jan 2025 21:40:30 +0100 Subject: [PATCH 55/59] Fixed mo8 initial entry selection --- src/games/mo8/optionsmenu.cpp | 11 +++++------ src/games/mo8/optionsmenu.h | 2 +- src/ui/optionsmenu.cpp | 13 +++++++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/games/mo8/optionsmenu.cpp b/src/games/mo8/optionsmenu.cpp index 4a631a6e4..381a6d8cc 100644 --- a/src/games/mo8/optionsmenu.cpp +++ b/src/games/mo8/optionsmenu.cpp @@ -264,12 +264,12 @@ void OptionsMenu::UpdatePageInput(float dt) { UI::OptionsMenu::UpdatePageInput(dt); } -void OptionsMenu::Hide() { - if (State != Hidden) { +void OptionsMenu::Show() { + if (State != Showing) { PreviousPage = -1; } - UI::OptionsMenu::Hide(); + UI::OptionsMenu::Show(); } void OptionsMenu::UpdateVisibility() { @@ -281,8 +281,7 @@ void OptionsMenu::UpdateVisibility() { Show(); } - if (ScrWork[SW_SYSSUBMENUCT] == 16 && ScrWork[SW_SYSSUBMENUNO] == 5 && - FadeAnimation.IsIn()) { + if (FadeAnimation.IsIn()) { State = Shown; } else if (ScrWork[SW_SYSSUBMENUCT] == 0 && ScrWork[SW_SYSSUBMENUNO] == 5 && FadeAnimation.IsOut()) { @@ -341,7 +340,7 @@ void OptionsMenu::Render() { } void OptionsMenu::GoToPage(int pageNumber) { - if (CurrentPage == pageNumber && Pages[CurrentPage]->IsShown) return; + if (CurrentPage == pageNumber) return; PreviousPage = CurrentPage; UI::OptionsMenu::GoToPage(pageNumber); diff --git a/src/games/mo8/optionsmenu.h b/src/games/mo8/optionsmenu.h index 21753c87a..48893a845 100644 --- a/src/games/mo8/optionsmenu.h +++ b/src/games/mo8/optionsmenu.h @@ -15,7 +15,7 @@ class OptionsMenu : public UI::OptionsMenu { public: OptionsMenu(); - void Hide() override; + void Show() override; void Update(float dt) override; void UpdateInput(float dt) override; void Render() override; diff --git a/src/ui/optionsmenu.cpp b/src/ui/optionsmenu.cpp index 611e56a53..51f874515 100644 --- a/src/ui/optionsmenu.cpp +++ b/src/ui/optionsmenu.cpp @@ -22,10 +22,15 @@ OptionsMenu::OptionsMenu() { void OptionsMenu::Show() { if (State != Shown) { - if (State != Showing) FadeAnimation.StartIn(); - State = Showing; + if (State != Showing) { + FadeAnimation.StartIn(); - GoToPage(0); + CurrentPage = 0; + Pages[0]->HasFocus = true; + Pages[0]->Show(); + Highlight(Pages[0]->GetFirstFocusableChild()); + } + State = Showing; if (UI::FocusedMenu != nullptr) { LastFocusedMenu = UI::FocusedMenu; @@ -161,7 +166,7 @@ void OptionsMenu::UpdateInput(float dt) { } void OptionsMenu::GoToPage(int pageNumber) { - if (CurrentPage == pageNumber && Pages[CurrentPage]->IsShown) return; + if (CurrentPage == pageNumber) return; Pages[CurrentPage]->Hide(); From afa5700982cd79bc54983cb30dc9f6303a30bfc0 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 18 Jan 2025 21:56:36 +0100 Subject: [PATCH 56/59] Minor const correctness and shadowing fix --- src/games/cclcc/optionsmenu.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/games/cclcc/optionsmenu.cpp b/src/games/cclcc/optionsmenu.cpp index ae65a796c..3c5cab194 100644 --- a/src/games/cclcc/optionsmenu.cpp +++ b/src/games/cclcc/optionsmenu.cpp @@ -83,7 +83,7 @@ OptionsMenu::OptionsMenu() : UI::OptionsMenu() { constexpr int columns = 3; constexpr int entries = 12; for (int i = 0; i < entries; i++) { - glm::vec2 pos = VoicePosition; + pos = VoicePosition; pos += VoiceEntriesOffset * glm::vec2(i % columns, i / columns); Widget* widget = new OptionsVoiceSlider( @@ -233,10 +233,9 @@ void OptionsMenu::UpdateInput(float dt) { void OptionsMenu::Render() { if (State != Hidden && ScrWork[SW_SYSSUBMENUCT] >= 32 && ScrWork[SW_SYSSUBMENUNO] == 5) { - glm::vec4 col(1.0f, 1.0f, 1.0f, FadeAnimation.Progress); - - glm::vec4 maskTint = col; - maskTint.a *= (float)0xa0 / 0x100; + const glm::vec4 col(1.0f, 1.0f, 1.0f, FadeAnimation.Progress); + const glm::vec4 maskTint = + col * glm::vec4{glm::vec3{1.0f}, (float)0xa0 / 0x100}; const glm::vec2 backgroundAnimationOffset = glm::vec2(0.0f, FadeAnimation.Progress * BackgroundPosition.y + From ccce5709302a9e62e6b2f2a28eb4aaf6ec3ba377 Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 18 Jan 2025 22:06:28 +0100 Subject: [PATCH 57/59] Click area does not update hover on mouse held --- src/ui/widgets/clickarea.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/widgets/clickarea.cpp b/src/ui/widgets/clickarea.cpp index bd7657199..f540a3e46 100644 --- a/src/ui/widgets/clickarea.cpp +++ b/src/ui/widgets/clickarea.cpp @@ -21,7 +21,8 @@ void ClickArea::UpdateInput() { if (!Enabled) return; if (Input::CurrentInputDevice == Input::Device::Mouse && - (Input::PrevMousePos != Input::CurMousePos || + (Input::PrevMousePos != Input::CurMousePos && + !(Vm::Interface::PADinputMouseIsDown & Vm::Interface::PAD1A) || Vm::Interface::PADinputMouseWentDown)) { Hovered = Bounds.ContainsPoint(Input::CurMousePos); } else if (Input::CurrentInputDevice == Input::Device::Touch && From b471ab084a06235f18104f9530b3d03571c4d38d Mon Sep 17 00:00:00 2001 From: PringlesGang Date: Sat, 18 Jan 2025 22:07:09 +0100 Subject: [PATCH 58/59] Upped version --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b3afabe0e..d00ec3b78 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.4. \ No newline at end of file +0.2.0. \ No newline at end of file From 9d0f2864ae42ec41105b20f0a6f46d6025a272e8 Mon Sep 17 00:00:00 2001 From: Dextinfire <> Date: Sun, 19 Jan 2025 13:55:02 -0800 Subject: [PATCH 59/59] Remove unneeded inlines --- src/games/cclcc/optionsmenu.h | 2 +- src/games/chlcc/optionsmenu.h | 2 +- src/games/mo6tw/optionsmenu.h | 2 +- src/games/mo8/optionsmenu.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/games/cclcc/optionsmenu.h b/src/games/cclcc/optionsmenu.h index ddc2c34bf..f266ac612 100644 --- a/src/games/cclcc/optionsmenu.h +++ b/src/games/cclcc/optionsmenu.h @@ -33,7 +33,7 @@ class OptionsMenu : public UI::OptionsMenu { void UpdatePageInput(float dt) override; void UpdateEntryMovementInput(float dt) override; - inline void UpdateVisibility() override; + void UpdateVisibility() override; SpriteAnimation PoleAnimation; diff --git a/src/games/chlcc/optionsmenu.h b/src/games/chlcc/optionsmenu.h index 644a195e6..b3529fd99 100644 --- a/src/games/chlcc/optionsmenu.h +++ b/src/games/chlcc/optionsmenu.h @@ -26,7 +26,7 @@ class OptionsMenu : public UI::OptionsMenu { void DrawButtonPrompt(); void UpdateTitles(); - inline void UpdateVisibility() override; + void UpdateVisibility() override; Animation TitleFade; diff --git a/src/games/mo6tw/optionsmenu.h b/src/games/mo6tw/optionsmenu.h index 8d1f30b70..45a7f6750 100644 --- a/src/games/mo6tw/optionsmenu.h +++ b/src/games/mo6tw/optionsmenu.h @@ -26,7 +26,7 @@ class OptionsMenu : public UI::OptionsMenu { void TipsNotificationsOnClick(Widgets::Toggle* target); private: - inline void UpdateVisibility() override; + void UpdateVisibility() override; Widgets::Scrollbar* VoiceVolumeSlider; Widgets::Scrollbar* BGMVolumeSlider; diff --git a/src/games/mo8/optionsmenu.h b/src/games/mo8/optionsmenu.h index 48893a845..b56007e12 100644 --- a/src/games/mo8/optionsmenu.h +++ b/src/games/mo8/optionsmenu.h @@ -28,7 +28,7 @@ class OptionsMenu : public UI::OptionsMenu { private: void UpdatePageInput(float dt) override; - inline void UpdateVisibility() override; + void UpdateVisibility() override; void GoToPage(int pageNumber) override; Animation PageFadeAnimation;