From 9e16b3638c06c4551873fa597d3eaa420a588141 Mon Sep 17 00:00:00 2001 From: cornerloan Date: Mon, 2 Jun 2025 14:56:08 -0700 Subject: [PATCH 1/5] Very hardcoded, but mostly works Doesn't "live" update. all the changes are on load, so changing the icons in the middle of a battle won't apply any changes. changing outside of battle works perfectly though. --- Globals/SaveSystem.cs | 8 ++ Globals/Translations/Translations.csv | 2 + Scenes/ChartViewport/Scripts/ChartManager.cs | 8 +- Scenes/NoteManager/Assets/Arrow_Outline.png | Bin 0 -> 721 bytes .../Assets/Arrow_Outline.png.import | 34 ++++++++ Scenes/NoteManager/Assets/New_Arrow.png | Bin 0 -> 60584 bytes .../NoteManager/Assets/New_Arrow.png.import | 34 ++++++++ Scenes/NoteManager/NoteManager.tscn | 10 ++- Scenes/NoteManager/Scripts/HoldArrow.cs | 9 ++- Scenes/NoteManager/Scripts/InputHandler.cs | 75 ++++++++++++++++++ Scenes/NoteManager/Scripts/NoteArrow.cs | 36 ++++++++- Scenes/UI/Options/OptionsMenu.tscn | 14 +++- .../UI/Options/Scripts/NoteTypeSelection.cs | 35 ++++++++ .../Options/Scripts/NoteTypeSelection.cs.uid | 1 + Scenes/UI/Remapping/ControlSettings.cs | 65 +++++++++++++++ Scenes/UI/Remapping/Remap.tscn | 10 ++- 16 files changed, 333 insertions(+), 8 deletions(-) create mode 100644 Scenes/NoteManager/Assets/Arrow_Outline.png create mode 100644 Scenes/NoteManager/Assets/Arrow_Outline.png.import create mode 100644 Scenes/NoteManager/Assets/New_Arrow.png create mode 100644 Scenes/NoteManager/Assets/New_Arrow.png.import create mode 100644 Scenes/UI/Options/Scripts/NoteTypeSelection.cs create mode 100644 Scenes/UI/Options/Scripts/NoteTypeSelection.cs.uid diff --git a/Globals/SaveSystem.cs b/Globals/SaveSystem.cs index 63ea5acf..10667fc1 100644 --- a/Globals/SaveSystem.cs +++ b/Globals/SaveSystem.cs @@ -28,6 +28,7 @@ public static class SaveSystem private const int DefaultInputControllerSecondary = 10; //right bumper private const int DefaultInputControllerInventory = 4; //back button private const string DefaultLanguage = "en"; + private const bool DefaultTypeIsArrow = false; private const bool DefaultHighCon = false; private const bool DefaultFirstTime = true; private const bool DefaultHasWon = false; @@ -49,6 +50,7 @@ public enum ConfigSettings InputControllerSecondary, InputControllerInventory, LanguageKey, + TypeIsArrow, HighContrast, FirstTime, HasWon, @@ -75,6 +77,7 @@ private static void InitConfig() UpdateConfig(ConfigSettings.InputControllerSecondary, DefaultInputControllerSecondary); UpdateConfig(ConfigSettings.InputControllerInventory, DefaultInputControllerInventory); UpdateConfig(ConfigSettings.LanguageKey, DefaultLanguage); + UpdateConfig(ConfigSettings.TypeIsArrow, DefaultTypeIsArrow); UpdateConfig(ConfigSettings.HighContrast, DefaultHighCon); UpdateConfig(ConfigSettings.FirstTime, DefaultFirstTime); UpdateConfig(ConfigSettings.HasWon, DefaultHasWon); @@ -136,6 +139,9 @@ public static void UpdateConfig(ConfigSettings setting, Variant value) case ConfigSettings.LanguageKey: _curConfigData.SetValue("Options", "LanguageKey", value); break; + case ConfigSettings.TypeIsArrow: + _curConfigData.SetValue("Options", "TypeIsArrow", value); + break; case ConfigSettings.HighContrast: _curConfigData.SetValue("Options", "HighContrast", value); break; @@ -280,6 +286,8 @@ public static Variant GetConfigValue(ConfigSettings setting) ); case ConfigSettings.LanguageKey: return _curConfigData.GetValue("Options", "LanguageKey", DefaultLanguage); + case ConfigSettings.TypeIsArrow: + return _curConfigData.GetValue("Options", "TypeIsArrow", DefaultTypeIsArrow); case ConfigSettings.HighContrast: return _curConfigData.GetValue("Options", "HighContrast", DefaultHighCon); case ConfigSettings.FirstTime: diff --git a/Globals/Translations/Translations.csv b/Globals/Translations/Translations.csv index 6d214faa..cb1006b4 100644 --- a/Globals/Translations/Translations.csv +++ b/Globals/Translations/Translations.csv @@ -127,6 +127,8 @@ INVENTORY_TAB_NOTES,Notes,乐谱 INVENTORY_TAB_RELICS,Relics,遗物 OPTIONS_VOLUME_LABEL,Master Volume,最终音量设置 OPTIONS_CONTRAST_LABEL,High Contrast,高对比度模式 +OPTIONS_TYPE_SYMBOL,Icons,图标 +OPTIONS_TYPE_ARROW,Arrows,箭 HOW_TO_PLAY,How to Play,如何游玩 HOW_TO_PLAY_BLOCK1,Hit notes to\nbuild combo,点击音符\n以建立连击 HOW_TO_PLAY_BLOCK2,Place notes when\ncombo is full,当连击满\n时放置音符 diff --git a/Scenes/ChartViewport/Scripts/ChartManager.cs b/Scenes/ChartViewport/Scripts/ChartManager.cs index e4db9e61..813c332d 100644 --- a/Scenes/ChartViewport/Scripts/ChartManager.cs +++ b/Scenes/ChartViewport/Scripts/ChartManager.cs @@ -24,6 +24,9 @@ public partial class ChartManager : SubViewportContainer private readonly List[] _queuedArrows = { new(), new(), new(), new() }; private double _chartLength = 2500; //Play with this + + private bool _isTypeArrow; + #region Initialization public override void _Ready() { @@ -31,6 +34,8 @@ public override void _Ready() IH.Connect(nameof(InputHandler.NotePressed), new Callable(this, nameof(OnNotePressed))); IH.Connect(nameof(InputHandler.NoteReleased), new Callable(this, nameof(OnNoteReleased))); + + _isTypeArrow = SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow).As(); } public override void _Process(double delta) @@ -148,7 +153,8 @@ public void AddNoteArrow(ArrowData arrowData, bool preHit = false) noteArrow.Init( IH.Arrows[(int)arrowData.Type], arrowData, - TimeKeeper.GetTimeOfBeat(arrowData.Beat) + TimeKeeper.GetTimeOfBeat(arrowData.Beat), + _isTypeArrow ); if (arrowData.NoteRef.IsPlayerNote()) noteArrow.SelfModulate = PlayerPuppet.NoteColor; diff --git a/Scenes/NoteManager/Assets/Arrow_Outline.png b/Scenes/NoteManager/Assets/Arrow_Outline.png new file mode 100644 index 0000000000000000000000000000000000000000..d030bb58f0ac13ae2a8c15523902745281feab39 GIT binary patch literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1|+TAxeoy;#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=Digg?xt?MK!z{fEwB}Ln2Bde0{8v^KTBRz;GCL~=}}db8eHWUl3bOYY?-2N zZ^z4JQ(*-(Avd)oQK2F?C$HG5!d3}vuoaLE64qC;vnfhRvkG!?gQ@`XY?U%fN(!v> z^~=l4^~#O)@{7{-4J|D#^$m>ljf`}GDs+o0^GXscbn}Xpp$5357AF^F7L;V>=P7^; zOiaozEwNQ9EzL}^N=r;LO-e~I)lEt?PSG_qOi9#DOffdpO))l3F*h}|FiJB_Qi57v zl9`6EKd%@X48Q=<2g&Fg>KTBX3}RdP7iFdbT>-Mv&d>%dk0NHH4{`{S!|Wg;K)(W6 z@Q?uo6FhWN^MFBG4h%b;DKof%;eOfE#W5tp{q3}aTt^HzT-1O6|8G+rIX&U(j0C3E zJ&U)_Y+o7hps145S3FG7GnTpGT2!PPmv@WoubXCzHuRiv7cWz|E_`xImy4t1Oe3T4 z2`@Djg;TyxSv$>6qWS97x|fC0%4-66nslpXesI+n;9e+KFBy9wgw<_A%4=4?mZ%9! ztUD*$s42~v$Kz?oq-&Vi{@`)4tRQDnpwZrakv1n^{E1^S7M3*JTpP8B=ii0W?wR*8 zH?g}5E&Z=7sPrKAxZuQzEPfp+Dgj$f@9pJQ?mYc8w1#o-`SbIqNV|ZNDubu1pUXO@ GgeCyL)c1`5 literal 0 HcmV?d00001 diff --git a/Scenes/NoteManager/Assets/Arrow_Outline.png.import b/Scenes/NoteManager/Assets/Arrow_Outline.png.import new file mode 100644 index 00000000..355d468a --- /dev/null +++ b/Scenes/NoteManager/Assets/Arrow_Outline.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2j0nmuox6flp" +path="res://.godot/imported/Arrow_Outline.png-dbc89009df5f433f3228bbd1180824d6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Scenes/NoteManager/Assets/Arrow_Outline.png" +dest_files=["res://.godot/imported/Arrow_Outline.png-dbc89009df5f433f3228bbd1180824d6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Scenes/NoteManager/Assets/New_Arrow.png b/Scenes/NoteManager/Assets/New_Arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..31a28ae2d034e08f6840ab8cd683d78c1ae930cd GIT binary patch literal 60584 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�Kr7Q*u@sYh5N&!MSd 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 Data.Beat + Data.Length; private bool _isReleased; - public override void Init(CheckerData parentChecker, ArrowData arrowData, double beatTime) + public override void Init( + CheckerData parentChecker, + ArrowData arrowData, + double beatTime, + bool isTypeArrow + ) { - base.Init(parentChecker, arrowData, beatTime); + base.Init(parentChecker, arrowData, beatTime, isTypeArrow); _trail.Size = new Vector2( (float)(Length / TimeKeeper.BeatsPerLoop * TimeKeeper.ChartWidth), _trail.Size.Y diff --git a/Scenes/NoteManager/Scripts/InputHandler.cs b/Scenes/NoteManager/Scripts/InputHandler.cs index 682895b6..2d8ed000 100644 --- a/Scenes/NoteManager/Scripts/InputHandler.cs +++ b/Scenes/NoteManager/Scripts/InputHandler.cs @@ -12,6 +12,32 @@ public partial class InputHandler : Node2D [Signal] public delegate void NoteReleasedEventHandler(ArrowType arrowType); + [Export] + public Sprite2D leftArrowSprite; + + [Export] + public Sprite2D leftArrowOutlineSprite; + + [Export] + public Sprite2D upArrowSprite; + + [Export] + public Sprite2D upArrowOutlineSprite; + + [Export] + public Sprite2D downArrowSprite; + + [Export] + public Sprite2D downArrowOutlineSprite; + + [Export] + public Sprite2D rightArrowSprite; + + [Export] + public Sprite2D rightArrowOutlineSprite; + + private static readonly string _arrowFolderPath = "res://Scenes/NoteManager/Assets/"; + public readonly CheckerData[] Arrows = new CheckerData[] { new CheckerData() @@ -53,6 +79,7 @@ private void InitializeArrowCheckers() public override void _Ready() { InitializeArrowCheckers(); + UpdateArrowSprites(); } public override void _Process(double delta) @@ -113,4 +140,52 @@ public void FeedbackEffect(ArrowType arrow, Timing timed) particles.Emit(particleAmount); } + + private void UpdateArrowSprites() + { + if (SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow).As()) + { + leftArrowSprite.Texture = GD.Load(_arrowFolderPath + "New_Arrow.png"); + leftArrowOutlineSprite.Texture = GD.Load( + _arrowFolderPath + "Arrow_Outline.png" + ); + leftArrowSprite.RotationDegrees = 180f; + upArrowSprite.Texture = GD.Load(_arrowFolderPath + "New_Arrow.png"); + upArrowOutlineSprite.Texture = GD.Load( + _arrowFolderPath + "Arrow_Outline.png" + ); + upArrowSprite.RotationDegrees = 270f; + downArrowSprite.Texture = GD.Load(_arrowFolderPath + "New_Arrow.png"); + downArrowOutlineSprite.Texture = GD.Load( + _arrowFolderPath + "Arrow_Outline.png" + ); + downArrowSprite.RotationDegrees = 90f; + rightArrowSprite.Texture = GD.Load(_arrowFolderPath + "New_Arrow.png"); + rightArrowOutlineSprite.Texture = GD.Load( + _arrowFolderPath + "Arrow_Outline.png" + ); + } + else + { + leftArrowSprite.Texture = GD.Load(_arrowFolderPath + "Note.png"); + leftArrowOutlineSprite.Texture = GD.Load( + _arrowFolderPath + "LeftNoteOutline.png" + ); + leftArrowSprite.RotationDegrees = 0f; + upArrowSprite.Texture = GD.Load(_arrowFolderPath + "Note.png"); + upArrowOutlineSprite.Texture = GD.Load( + _arrowFolderPath + "TopNoteOutline.png" + ); + upArrowSprite.RotationDegrees = 0f; + downArrowSprite.Texture = GD.Load(_arrowFolderPath + "Note.png"); + downArrowOutlineSprite.Texture = GD.Load( + _arrowFolderPath + "BottomNoteOutline.png" + ); + downArrowSprite.RotationDegrees = 0f; + rightArrowSprite.Texture = GD.Load(_arrowFolderPath + "Note.png"); + rightArrowOutlineSprite.Texture = GD.Load( + _arrowFolderPath + "RightNoteOutline.png" + ); + } + } } diff --git a/Scenes/NoteManager/Scripts/NoteArrow.cs b/Scenes/NoteManager/Scripts/NoteArrow.cs index fe3b6c7e..4b265fba 100644 --- a/Scenes/NoteManager/Scripts/NoteArrow.cs +++ b/Scenes/NoteManager/Scripts/NoteArrow.cs @@ -29,13 +29,45 @@ public override void _Ready() ZIndex = 2; } - public virtual void Init(CheckerData parentChecker, ArrowData arrowData, double beatTime) + public virtual void Init( + CheckerData parentChecker, + ArrowData arrowData, + double beatTime, + bool isTypeArrow + ) { Data = arrowData; _beatTime = beatTime; Position = new Vector2(GetNewPosX(), parentChecker.Node.GlobalPosition.Y); - OutlineSprite.Texture = parentChecker.Node.Outline.Texture; + if (isTypeArrow) + { + Texture = GD.Load("res://Scenes/NoteManager/Assets/New_Arrow.png"); + OutlineSprite.Texture = GD.Load( + "res://Scenes/NoteManager/Assets/Arrow_Outline.png" + ); + var rotDeg = 0f; + switch (arrowData.Type) + { + case ArrowType.Right: + rotDeg = 0f; + break; + case ArrowType.Down: + rotDeg = 90f; + break; + case ArrowType.Left: + rotDeg = 180f; + break; + case ArrowType.Up: + rotDeg = 270f; + break; + } + RotationDegrees = rotDeg; + } + else + { + OutlineSprite.Texture = parentChecker.Node.Outline.Texture; + } IconSprite.Texture = arrowData.NoteRef.Texture; IconSprite.Rotation = -Rotation; OutlineSprite.Modulate = parentChecker.Color; diff --git a/Scenes/UI/Options/OptionsMenu.tscn b/Scenes/UI/Options/OptionsMenu.tscn index f883c248..718fcaa6 100644 --- a/Scenes/UI/Options/OptionsMenu.tscn +++ b/Scenes/UI/Options/OptionsMenu.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=6 format=3 uid="uid://buejv62lwtymc"] +[gd_scene load_steps=7 format=3 uid="uid://buejv62lwtymc"] [ext_resource type="Script" uid="uid://cery6g5ojnl16" path="res://Scenes/UI/Options/Scripts/LanguageSelection.cs" id="1_qyvkw"] [ext_resource type="Script" uid="uid://dkuui4eib1q3e" path="res://Scenes/UI/Options/Scripts/OptionsMenu.cs" id="1_yjq7i"] [ext_resource type="Texture2D" uid="uid://ck16vyh1q68ri" path="res://Scenes/UI/Assets/UI_ForestBackground.png" id="2_g354d"] [ext_resource type="Texture2D" uid="uid://djd6iw2g84bba" path="res://Scenes/UI/Assets/UI_CenterFrame.png" id="3_qydxi"] [ext_resource type="Theme" uid="uid://d37e3tpsbxwak" path="res://Scenes/UI/Assets/GeneralTheme.tres" id="4_r616m"] +[ext_resource type="Script" uid="uid://dohkhi0d0qiv5" path="res://Scenes/UI/Options/Scripts/NoteTypeSelection.cs" id="6_qydxi"] [node name="OptionsMenu" type="CanvasLayer" node_paths=PackedStringArray("_focused", "_volumeSlider", "_closeButton", "_controlsButton", "_highContrastToggle", "_howToPlayButton")] process_mode = 3 @@ -122,6 +123,17 @@ popup/item_1/text = "简体中文" popup/item_1/id = 1 script = ExtResource("1_qyvkw") +[node name="ArrowType" type="OptionButton" parent="Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme = ExtResource("4_r616m") +item_count = 2 +popup/item_0/text = "OPTIONS_TYPE_SYMBOL" +popup/item_0/id = 0 +popup/item_1/text = "OPTIONS_TYPE_ARROW" +popup/item_1/id = 1 +script = ExtResource("6_qydxi") + [node name="ControlsButton" type="Button" parent="Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer"] layout_mode = 2 theme = ExtResource("4_r616m") diff --git a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs new file mode 100644 index 00000000..9a185829 --- /dev/null +++ b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs @@ -0,0 +1,35 @@ +using System; +using Godot; + +public partial class NoteTypeSelection : OptionButton +{ + private bool _isTypeArrow; + + public override void _Ready() + { + _isTypeArrow = SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow).As(); + Connect("item_selected", new Callable(this, nameof(OnTypeChanged))); + PresetDropdown(_isTypeArrow); + } + + private void OnTypeChanged(int index) + { + switch (index) + { + case 0: + SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.TypeIsArrow, false); + break; + case 1: + SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.TypeIsArrow, true); + break; + } + } + + private void PresetDropdown(bool isTypeArrow) + { + if (isTypeArrow) + Selected = 1; + else + Selected = 0; + } +} diff --git a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs.uid b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs.uid new file mode 100644 index 00000000..bd451cdf --- /dev/null +++ b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs.uid @@ -0,0 +1 @@ +uid://dohkhi0d0qiv5 diff --git a/Scenes/UI/Remapping/ControlSettings.cs b/Scenes/UI/Remapping/ControlSettings.cs index b5714900..73328119 100644 --- a/Scenes/UI/Remapping/ControlSettings.cs +++ b/Scenes/UI/Remapping/ControlSettings.cs @@ -39,6 +39,32 @@ public partial class ControlSettings : Node2D, IFocusableMenu private JoyButton _tempJoyButton; private string _chosenKey = ""; + [Export] + private Sprite2D _keyboardUpSprite; + + [Export] + private Sprite2D _keyboardDownSprite; + + [Export] + private Sprite2D _keyboardLeftSprite; + + [Export] + private Sprite2D _keyboardRightSprite; + + [Export] + private Sprite2D _controllerUpSprite; + + [Export] + private Sprite2D _controllerDownSprite; + + [Export] + private Sprite2D _controllerLeftSprite; + + [Export] + private Sprite2D _controllerRightSprite; + + private static readonly string NotePath = "res://Scenes/NoteManager/Assets/"; + //These just don't play well with inputs private readonly HashSet _invalidKeys = new HashSet { @@ -137,6 +163,7 @@ public override void _Ready() _closeButton.Pressed += ReturnToPrev; InitInputSprites(); + InitNoteSprites(); } private void InitInputSprites() @@ -154,6 +181,44 @@ private void InitInputSprites() UpdateKeySprites(); } + + private void InitNoteSprites() + { + if (SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow).As()) + { + _keyboardUpSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _keyboardUpSprite.RotationDegrees = 270f; + _keyboardDownSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _keyboardDownSprite.RotationDegrees = 90f; + _keyboardLeftSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _keyboardLeftSprite.RotationDegrees = 180f; + _keyboardRightSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _controllerUpSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _controllerUpSprite.RotationDegrees = 270f; + _controllerDownSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _controllerDownSprite.RotationDegrees = 90f; + _controllerLeftSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _controllerLeftSprite.RotationDegrees = 180f; + _controllerRightSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + } + else + { + _keyboardUpSprite.Texture = GD.Load(NotePath + "TopNoteOutline.png"); + _keyboardUpSprite.RotationDegrees = 0f; + _keyboardDownSprite.Texture = GD.Load(NotePath + "BottomNoteOutline.png"); + _keyboardDownSprite.RotationDegrees = 0f; + _keyboardLeftSprite.Texture = GD.Load(NotePath + "LeftNoteOutline.png"); + _keyboardLeftSprite.RotationDegrees = 0f; + _keyboardRightSprite.Texture = GD.Load(NotePath + "RightNoteOutline.png"); + _controllerUpSprite.Texture = GD.Load(NotePath + "TopNoteOutline.png"); + _controllerUpSprite.RotationDegrees = 0f; + _controllerDownSprite.Texture = GD.Load(NotePath + "BottomNoteOutline.png"); + _controllerDownSprite.RotationDegrees = 0f; + _controllerLeftSprite.Texture = GD.Load(NotePath + "LeftNoteOutline.png"); + _controllerLeftSprite.RotationDegrees = 0f; + _controllerRightSprite.Texture = GD.Load(NotePath + "RightNoteOutline.png"); + } + } #endregion #region Focus and Menus diff --git a/Scenes/UI/Remapping/Remap.tscn b/Scenes/UI/Remapping/Remap.tscn index ef67fa30..6dacf5de 100644 --- a/Scenes/UI/Remapping/Remap.tscn +++ b/Scenes/UI/Remapping/Remap.tscn @@ -22,7 +22,7 @@ [ext_resource type="Texture2D" uid="uid://cpxcg12lovxu5" path="res://Scenes/UI/Remapping/Assets/Joypad Button 4 (Back, Sony Select, Xbox Back, Nintendo -).png" id="16_s0mtp"] [ext_resource type="Texture2D" uid="uid://djd6iw2g84bba" path="res://Scenes/UI/Assets/UI_CenterFrame.png" id="18_8iace"] -[node name="Remap" type="Node2D" node_paths=PackedStringArray("_closeButton", "_remapPopup", "_remapLabel", "_remapDescription", "_remapTimer", "_remapTabs")] +[node name="Remap" type="Node2D" node_paths=PackedStringArray("_closeButton", "_remapPopup", "_remapLabel", "_remapDescription", "_remapTimer", "_remapTabs", "_keyboardUpSprite", "_keyboardDownSprite", "_keyboardLeftSprite", "_keyboardRightSprite", "_controllerUpSprite", "_controllerDownSprite", "_controllerLeftSprite", "_controllerRightSprite")] process_mode = 3 script = ExtResource("1_ir12b") _closeButton = NodePath("Panel/TitleButton") @@ -31,6 +31,14 @@ _remapLabel = NodePath("RemapPopup/Label2") _remapDescription = NodePath("RemapPopup/Label3") _remapTimer = NodePath("RemapPopup/Timer") _remapTabs = NodePath("Panel/TabContainer") +_keyboardUpSprite = NodePath("Panel/TabContainer/CONTROLS_KEYBOARD/Up") +_keyboardDownSprite = NodePath("Panel/TabContainer/CONTROLS_KEYBOARD/Down") +_keyboardLeftSprite = NodePath("Panel/TabContainer/CONTROLS_KEYBOARD/Left") +_keyboardRightSprite = NodePath("Panel/TabContainer/CONTROLS_KEYBOARD/Right") +_controllerUpSprite = NodePath("Panel/TabContainer/CONTROLS_CONTROLLER/Up") +_controllerDownSprite = NodePath("Panel/TabContainer/CONTROLS_CONTROLLER/Down") +_controllerLeftSprite = NodePath("Panel/TabContainer/CONTROLS_CONTROLLER/Left") +_controllerRightSprite = NodePath("Panel/TabContainer/CONTROLS_CONTROLLER/Right") [node name="Background" type="NinePatchRect" parent="."] offset_right = 640.0 From 0f63b84ab2282f6128509b9dac589fb869fac65f Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Mon, 2 Jun 2025 18:21:16 -0700 Subject: [PATCH 2/5] Simplify Swap Arrow/Note Sprite Logic --- Globals/StageProducer.cs | 3 + Scenes/ChartViewport/Scripts/ChartManager.cs | 8 +- Scenes/NoteManager/NoteManager.tscn | 10 +- Scenes/NoteManager/Scripts/HoldArrow.cs | 9 +- Scenes/NoteManager/Scripts/InputHandler.cs | 106 ++++++------------ Scenes/NoteManager/Scripts/NoteArrow.cs | 38 +------ .../UI/Options/Scripts/NoteTypeSelection.cs | 2 + Scenes/UI/Remapping/ControlSettings.cs | 51 +++------ 8 files changed, 66 insertions(+), 161 deletions(-) diff --git a/Globals/StageProducer.cs b/Globals/StageProducer.cs index 60bdba74..b41dc123 100644 --- a/Globals/StageProducer.cs +++ b/Globals/StageProducer.cs @@ -59,6 +59,9 @@ public void InitFromCfg() .GetConfigValue(SaveSystem.ConfigSettings.HighContrast) .AsBool(); GetTree().Root.CallDeferred("add_child", ContrastFilter); + InputHandler.UseArrows = SaveSystem + .GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow) + .AsBool(); } private void GenerateMapConsistent() diff --git a/Scenes/ChartViewport/Scripts/ChartManager.cs b/Scenes/ChartViewport/Scripts/ChartManager.cs index 813c332d..e4db9e61 100644 --- a/Scenes/ChartViewport/Scripts/ChartManager.cs +++ b/Scenes/ChartViewport/Scripts/ChartManager.cs @@ -24,9 +24,6 @@ public partial class ChartManager : SubViewportContainer private readonly List[] _queuedArrows = { new(), new(), new(), new() }; private double _chartLength = 2500; //Play with this - - private bool _isTypeArrow; - #region Initialization public override void _Ready() { @@ -34,8 +31,6 @@ public override void _Ready() IH.Connect(nameof(InputHandler.NotePressed), new Callable(this, nameof(OnNotePressed))); IH.Connect(nameof(InputHandler.NoteReleased), new Callable(this, nameof(OnNoteReleased))); - - _isTypeArrow = SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow).As(); } public override void _Process(double delta) @@ -153,8 +148,7 @@ public void AddNoteArrow(ArrowData arrowData, bool preHit = false) noteArrow.Init( IH.Arrows[(int)arrowData.Type], arrowData, - TimeKeeper.GetTimeOfBeat(arrowData.Beat), - _isTypeArrow + TimeKeeper.GetTimeOfBeat(arrowData.Beat) ); if (arrowData.NoteRef.IsPlayerNote()) noteArrow.SelfModulate = PlayerPuppet.NoteColor; diff --git a/Scenes/NoteManager/NoteManager.tscn b/Scenes/NoteManager/NoteManager.tscn index ace482bd..2e5da20d 100644 --- a/Scenes/NoteManager/NoteManager.tscn +++ b/Scenes/NoteManager/NoteManager.tscn @@ -10,16 +10,8 @@ [ext_resource type="Texture2D" uid="uid://dslb58tkhgroj" path="res://Scenes/NoteManager/Assets/RightNoteOutline.png" id="9_osoy2"] [ext_resource type="Texture2D" uid="uid://bh68528ekvjbk" path="res://Scenes/NoteManager/Assets/BottomNoteOutline.png" id="11_ymppf"] -[node name="noteManager" type="Node2D" node_paths=PackedStringArray("leftArrowSprite", "leftArrowOutlineSprite", "upArrowSprite", "upArrowOutlineSprite", "downArrowSprite", "downArrowOutlineSprite", "rightArrowSprite", "rightArrowOutlineSprite")] +[node name="noteManager" type="Node2D"] script = ExtResource("1_2oeuf") -leftArrowSprite = NodePath("noteCheckers/arrowLeft") -leftArrowOutlineSprite = NodePath("noteCheckers/arrowLeft/Outline") -upArrowSprite = NodePath("noteCheckers/arrowUp") -upArrowOutlineSprite = NodePath("noteCheckers/arrowUp/Outline") -downArrowSprite = NodePath("noteCheckers/arrowDown") -downArrowOutlineSprite = NodePath("noteCheckers/arrowDown/Outline") -rightArrowSprite = NodePath("noteCheckers/arrowRight") -rightArrowOutlineSprite = NodePath("noteCheckers/arrowRight/Outline") [node name="noteCheckers" type="Node2D" parent="."] diff --git a/Scenes/NoteManager/Scripts/HoldArrow.cs b/Scenes/NoteManager/Scripts/HoldArrow.cs index 0ded2d04..1bde8924 100644 --- a/Scenes/NoteManager/Scripts/HoldArrow.cs +++ b/Scenes/NoteManager/Scripts/HoldArrow.cs @@ -13,14 +13,9 @@ public partial class HoldArrow : NoteArrow public Beat EndBeat => Data.Beat + Data.Length; private bool _isReleased; - public override void Init( - CheckerData parentChecker, - ArrowData arrowData, - double beatTime, - bool isTypeArrow - ) + public override void Init(CheckerData parentChecker, ArrowData arrowData, double beatTime) { - base.Init(parentChecker, arrowData, beatTime, isTypeArrow); + base.Init(parentChecker, arrowData, beatTime); _trail.Size = new Vector2( (float)(Length / TimeKeeper.BeatsPerLoop * TimeKeeper.ChartWidth), _trail.Size.Y diff --git a/Scenes/NoteManager/Scripts/InputHandler.cs b/Scenes/NoteManager/Scripts/InputHandler.cs index 2d8ed000..a1c50652 100644 --- a/Scenes/NoteManager/Scripts/InputHandler.cs +++ b/Scenes/NoteManager/Scripts/InputHandler.cs @@ -12,32 +12,6 @@ public partial class InputHandler : Node2D [Signal] public delegate void NoteReleasedEventHandler(ArrowType arrowType); - [Export] - public Sprite2D leftArrowSprite; - - [Export] - public Sprite2D leftArrowOutlineSprite; - - [Export] - public Sprite2D upArrowSprite; - - [Export] - public Sprite2D upArrowOutlineSprite; - - [Export] - public Sprite2D downArrowSprite; - - [Export] - public Sprite2D downArrowOutlineSprite; - - [Export] - public Sprite2D rightArrowSprite; - - [Export] - public Sprite2D rightArrowOutlineSprite; - - private static readonly string _arrowFolderPath = "res://Scenes/NoteManager/Assets/"; - public readonly CheckerData[] Arrows = new CheckerData[] { new CheckerData() @@ -66,6 +40,8 @@ public partial class InputHandler : Node2D }, }; + public static bool UseArrows = false; + private void InitializeArrowCheckers() { //Set the color of the arrows @@ -141,51 +117,41 @@ public void FeedbackEffect(ArrowType arrow, Timing timed) particles.Emit(particleAmount); } + private static readonly string ArrowFolderPath = "res://Scenes/NoteManager/Assets/"; + private void UpdateArrowSprites() { - if (SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow).As()) - { - leftArrowSprite.Texture = GD.Load(_arrowFolderPath + "New_Arrow.png"); - leftArrowOutlineSprite.Texture = GD.Load( - _arrowFolderPath + "Arrow_Outline.png" - ); - leftArrowSprite.RotationDegrees = 180f; - upArrowSprite.Texture = GD.Load(_arrowFolderPath + "New_Arrow.png"); - upArrowOutlineSprite.Texture = GD.Load( - _arrowFolderPath + "Arrow_Outline.png" - ); - upArrowSprite.RotationDegrees = 270f; - downArrowSprite.Texture = GD.Load(_arrowFolderPath + "New_Arrow.png"); - downArrowOutlineSprite.Texture = GD.Load( - _arrowFolderPath + "Arrow_Outline.png" - ); - downArrowSprite.RotationDegrees = 90f; - rightArrowSprite.Texture = GD.Load(_arrowFolderPath + "New_Arrow.png"); - rightArrowOutlineSprite.Texture = GD.Load( - _arrowFolderPath + "Arrow_Outline.png" - ); - } - else - { - leftArrowSprite.Texture = GD.Load(_arrowFolderPath + "Note.png"); - leftArrowOutlineSprite.Texture = GD.Load( - _arrowFolderPath + "LeftNoteOutline.png" - ); - leftArrowSprite.RotationDegrees = 0f; - upArrowSprite.Texture = GD.Load(_arrowFolderPath + "Note.png"); - upArrowOutlineSprite.Texture = GD.Load( - _arrowFolderPath + "TopNoteOutline.png" - ); - upArrowSprite.RotationDegrees = 0f; - downArrowSprite.Texture = GD.Load(_arrowFolderPath + "Note.png"); - downArrowOutlineSprite.Texture = GD.Load( - _arrowFolderPath + "BottomNoteOutline.png" - ); - downArrowSprite.RotationDegrees = 0f; - rightArrowSprite.Texture = GD.Load(_arrowFolderPath + "Note.png"); - rightArrowOutlineSprite.Texture = GD.Load( - _arrowFolderPath + "RightNoteOutline.png" - ); - } + if (!UseArrows) + return; + Arrows[(int)ArrowType.Left].Node.Texture = GD.Load( + ArrowFolderPath + "New_Arrow.png" + ); + Arrows[(int)ArrowType.Left].Node.Outline.Texture = GD.Load( + ArrowFolderPath + "Arrow_Outline.png" + ); + Arrows[(int)ArrowType.Left].Node.RotationDegrees = 180f; + + Arrows[(int)ArrowType.Up].Node.Texture = GD.Load( + ArrowFolderPath + "New_Arrow.png" + ); + Arrows[(int)ArrowType.Up].Node.Outline.Texture = GD.Load( + ArrowFolderPath + "Arrow_Outline.png" + ); + Arrows[(int)ArrowType.Up].Node.RotationDegrees = 270f; + + Arrows[(int)ArrowType.Down].Node.Texture = GD.Load( + ArrowFolderPath + "New_Arrow.png" + ); + Arrows[(int)ArrowType.Down].Node.Outline.Texture = GD.Load( + ArrowFolderPath + "Arrow_Outline.png" + ); + Arrows[(int)ArrowType.Down].Node.RotationDegrees = 90f; + + Arrows[(int)ArrowType.Right].Node.Texture = GD.Load( + ArrowFolderPath + "New_Arrow.png" + ); + Arrows[(int)ArrowType.Right].Node.Outline.Texture = GD.Load( + ArrowFolderPath + "Arrow_Outline.png" + ); } } diff --git a/Scenes/NoteManager/Scripts/NoteArrow.cs b/Scenes/NoteManager/Scripts/NoteArrow.cs index 4b265fba..58d0f3f1 100644 --- a/Scenes/NoteManager/Scripts/NoteArrow.cs +++ b/Scenes/NoteManager/Scripts/NoteArrow.cs @@ -29,45 +29,15 @@ public override void _Ready() ZIndex = 2; } - public virtual void Init( - CheckerData parentChecker, - ArrowData arrowData, - double beatTime, - bool isTypeArrow - ) + public virtual void Init(CheckerData parentChecker, ArrowData arrowData, double beatTime) { Data = arrowData; _beatTime = beatTime; Position = new Vector2(GetNewPosX(), parentChecker.Node.GlobalPosition.Y); - if (isTypeArrow) - { - Texture = GD.Load("res://Scenes/NoteManager/Assets/New_Arrow.png"); - OutlineSprite.Texture = GD.Load( - "res://Scenes/NoteManager/Assets/Arrow_Outline.png" - ); - var rotDeg = 0f; - switch (arrowData.Type) - { - case ArrowType.Right: - rotDeg = 0f; - break; - case ArrowType.Down: - rotDeg = 90f; - break; - case ArrowType.Left: - rotDeg = 180f; - break; - case ArrowType.Up: - rotDeg = 270f; - break; - } - RotationDegrees = rotDeg; - } - else - { - OutlineSprite.Texture = parentChecker.Node.Outline.Texture; - } + RotationDegrees = parentChecker.Node.RotationDegrees; + Texture = parentChecker.Node.Texture; + OutlineSprite.Texture = parentChecker.Node.Outline.Texture; IconSprite.Texture = arrowData.NoteRef.Texture; IconSprite.Rotation = -Rotation; OutlineSprite.Modulate = parentChecker.Color; diff --git a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs index 9a185829..4eeee78b 100644 --- a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs +++ b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs @@ -18,9 +18,11 @@ private void OnTypeChanged(int index) { case 0: SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.TypeIsArrow, false); + InputHandler.UseArrows = false; break; case 1: SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.TypeIsArrow, true); + InputHandler.UseArrows = true; break; } } diff --git a/Scenes/UI/Remapping/ControlSettings.cs b/Scenes/UI/Remapping/ControlSettings.cs index 73328119..5ae9746c 100644 --- a/Scenes/UI/Remapping/ControlSettings.cs +++ b/Scenes/UI/Remapping/ControlSettings.cs @@ -184,40 +184,23 @@ private void InitInputSprites() private void InitNoteSprites() { - if (SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow).As()) - { - _keyboardUpSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); - _keyboardUpSprite.RotationDegrees = 270f; - _keyboardDownSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); - _keyboardDownSprite.RotationDegrees = 90f; - _keyboardLeftSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); - _keyboardLeftSprite.RotationDegrees = 180f; - _keyboardRightSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); - _controllerUpSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); - _controllerUpSprite.RotationDegrees = 270f; - _controllerDownSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); - _controllerDownSprite.RotationDegrees = 90f; - _controllerLeftSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); - _controllerLeftSprite.RotationDegrees = 180f; - _controllerRightSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); - } - else - { - _keyboardUpSprite.Texture = GD.Load(NotePath + "TopNoteOutline.png"); - _keyboardUpSprite.RotationDegrees = 0f; - _keyboardDownSprite.Texture = GD.Load(NotePath + "BottomNoteOutline.png"); - _keyboardDownSprite.RotationDegrees = 0f; - _keyboardLeftSprite.Texture = GD.Load(NotePath + "LeftNoteOutline.png"); - _keyboardLeftSprite.RotationDegrees = 0f; - _keyboardRightSprite.Texture = GD.Load(NotePath + "RightNoteOutline.png"); - _controllerUpSprite.Texture = GD.Load(NotePath + "TopNoteOutline.png"); - _controllerUpSprite.RotationDegrees = 0f; - _controllerDownSprite.Texture = GD.Load(NotePath + "BottomNoteOutline.png"); - _controllerDownSprite.RotationDegrees = 0f; - _controllerLeftSprite.Texture = GD.Load(NotePath + "LeftNoteOutline.png"); - _controllerLeftSprite.RotationDegrees = 0f; - _controllerRightSprite.Texture = GD.Load(NotePath + "RightNoteOutline.png"); - } + if (!InputHandler.UseArrows) + return; + _keyboardUpSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _keyboardUpSprite.RotationDegrees = 270f; + _keyboardDownSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _keyboardDownSprite.RotationDegrees = 90f; + _keyboardLeftSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _keyboardLeftSprite.RotationDegrees = 180f; + _keyboardRightSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + + _controllerUpSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _controllerUpSprite.RotationDegrees = 270f; + _controllerDownSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _controllerDownSprite.RotationDegrees = 90f; + _controllerLeftSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); + _controllerLeftSprite.RotationDegrees = 180f; + _controllerRightSprite.Texture = GD.Load(NotePath + "New_Arrow.png"); } #endregion From 9a6ce3631fe575419043a562b2f7edaa7c462e04 Mon Sep 17 00:00:00 2001 From: cornerloan Date: Mon, 2 Jun 2025 18:32:59 -0700 Subject: [PATCH 3/5] Note symbol selection is now checkbox --- Globals/Translations/Translations.csv | 3 +- Scenes/UI/Options/OptionsMenu.tscn | 20 ++++++------- .../UI/Options/Scripts/NoteTypeSelection.cs | 29 ++++--------------- 3 files changed, 16 insertions(+), 36 deletions(-) diff --git a/Globals/Translations/Translations.csv b/Globals/Translations/Translations.csv index cb1006b4..801482f6 100644 --- a/Globals/Translations/Translations.csv +++ b/Globals/Translations/Translations.csv @@ -127,8 +127,7 @@ INVENTORY_TAB_NOTES,Notes,乐谱 INVENTORY_TAB_RELICS,Relics,遗物 OPTIONS_VOLUME_LABEL,Master Volume,最终音量设置 OPTIONS_CONTRAST_LABEL,High Contrast,高对比度模式 -OPTIONS_TYPE_SYMBOL,Icons,图标 -OPTIONS_TYPE_ARROW,Arrows,箭 +OPTIONS_NOTE_CHECKBOX,Use arrows?,使用箭头? HOW_TO_PLAY,How to Play,如何游玩 HOW_TO_PLAY_BLOCK1,Hit notes to\nbuild combo,点击音符\n以建立连击 HOW_TO_PLAY_BLOCK2,Place notes when\ncombo is full,当连击满\n时放置音符 diff --git a/Scenes/UI/Options/OptionsMenu.tscn b/Scenes/UI/Options/OptionsMenu.tscn index 718fcaa6..d4bf2f7d 100644 --- a/Scenes/UI/Options/OptionsMenu.tscn +++ b/Scenes/UI/Options/OptionsMenu.tscn @@ -123,17 +123,6 @@ popup/item_1/text = "简体中文" popup/item_1/id = 1 script = ExtResource("1_qyvkw") -[node name="ArrowType" type="OptionButton" parent="Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -theme = ExtResource("4_r616m") -item_count = 2 -popup/item_0/text = "OPTIONS_TYPE_SYMBOL" -popup/item_0/id = 0 -popup/item_1/text = "OPTIONS_TYPE_ARROW" -popup/item_1/id = 1 -script = ExtResource("6_qydxi") - [node name="ControlsButton" type="Button" parent="Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer"] layout_mode = 2 theme = ExtResource("4_r616m") @@ -148,3 +137,12 @@ text = "HOW_TO_PLAY" layout_mode = 2 theme = ExtResource("4_r616m") text = "CONTROLS_RETURN_BUTTON" + +[node name="NoteCheckbox" type="CheckBox" parent="Control"] +layout_mode = 0 +offset_left = 6.0 +offset_top = 57.0 +offset_right = 192.0 +offset_bottom = 81.0 +text = "OPTIONS_NOTE_CHECKBOX" +script = ExtResource("6_qydxi") diff --git a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs index 4eeee78b..c83dc897 100644 --- a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs +++ b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs @@ -1,37 +1,20 @@ using System; using Godot; -public partial class NoteTypeSelection : OptionButton +public partial class NoteTypeSelection : CheckBox { private bool _isTypeArrow; public override void _Ready() { _isTypeArrow = SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow).As(); - Connect("item_selected", new Callable(this, nameof(OnTypeChanged))); - PresetDropdown(_isTypeArrow); + ButtonPressed = _isTypeArrow; + Toggled += OnTypeChanged; } - private void OnTypeChanged(int index) + private void OnTypeChanged(bool pressed) { - switch (index) - { - case 0: - SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.TypeIsArrow, false); - InputHandler.UseArrows = false; - break; - case 1: - SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.TypeIsArrow, true); - InputHandler.UseArrows = true; - break; - } - } - - private void PresetDropdown(bool isTypeArrow) - { - if (isTypeArrow) - Selected = 1; - else - Selected = 0; + SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.TypeIsArrow, pressed); + InputHandler.UseArrows = pressed; } } From ae97c06488defb5e4f812d184f14a1e1f0367448 Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Sat, 31 May 2025 22:30:53 -0700 Subject: [PATCH 4/5] Vertical Scroll Putting this here for safe keeping --- Scenes/3DWizard/3DWizard.tscn | 49 ++++++++++++++++++++++++ Scenes/3DWizard/DimensionalWizard.cs | 8 ++++ Scenes/3DWizard/DimensionalWizard.cs.uid | 1 + Scenes/BattleDirector/BattleScene.tscn | 15 ++++++-- 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 Scenes/3DWizard/3DWizard.tscn create mode 100644 Scenes/3DWizard/DimensionalWizard.cs create mode 100644 Scenes/3DWizard/DimensionalWizard.cs.uid diff --git a/Scenes/3DWizard/3DWizard.tscn b/Scenes/3DWizard/3DWizard.tscn new file mode 100644 index 00000000..50a24a0f --- /dev/null +++ b/Scenes/3DWizard/3DWizard.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=7 format=3 uid="uid://dyd2nc2sgt0qw"] + +[ext_resource type="Script" uid="uid://b07ivt3coc3lm" path="res://Scenes/3DWizard/DimensionalWizard.cs" id="1_7ax4h"] +[ext_resource type="PackedScene" uid="uid://dfevfib11kou1" path="res://Scenes/ChartViewport/ChartViewport.tscn" id="1_7h5n6"] +[ext_resource type="Shader" uid="uid://dp36iuuy414k1" path="res://SharedAssets/StarryNight.gdshader" id="2_xxbq6"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_xxbq6"] +shader = ExtResource("2_xxbq6") +shader_parameter/bg_top_color = Vector4(0.18, 0.08, 0.12, 0) +shader_parameter/bg_bottom_color = Vector4(0.028, 0.008, 0.184, 0) +shader_parameter/gradient_ratio = 1.0 +shader_parameter/time_scale = 1.0 + +[sub_resource type="ViewportTexture" id="ViewportTexture_xxbq6"] +viewport_path = NodePath("SubViewport") + +[sub_resource type="Environment" id="Environment_7h5n6"] +ambient_light_source = 1 +reflected_light_source = 1 + +[node name="3DWizard" type="Node3D" node_paths=PackedStringArray("CM")] +script = ExtResource("1_7ax4h") +CM = NodePath("SubViewport/VPContainer") + +[node name="SubViewport" type="SubViewport" parent="."] +size = Vector2i(680, 940) + +[node name="VPContainer" parent="SubViewport" instance=ExtResource("1_7h5n6")] +offset_top = 380.0 +offset_bottom = 560.0 + +[node name="StarShader" type="ColorRect" parent="SubViewport"] +z_index = -1 +material = SubResource("ShaderMaterial_xxbq6") +offset_left = -60.0 +offset_top = -35.0 +offset_right = 415.0 +offset_bottom = 465.0 +scale = Vector2(2.18, 2.18) +color = Color(0, 0, 0, 1) + +[node name="Sprite3D" type="Sprite3D" parent="."] +transform = Transform3D(-4.37114e-08, -1, 0, 0.617036, -2.69715e-08, 0.786935, -0.786935, 3.4398e-08, 0.617036, 0, 0, 0.138215) +texture = SubResource("ViewportTexture_xxbq6") + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.999729, -0.023298, 0, 0.023298, 0.999729, 0, -1.55715, 3.51069) +environment = SubResource("Environment_7h5n6") +fov = 53.5 diff --git a/Scenes/3DWizard/DimensionalWizard.cs b/Scenes/3DWizard/DimensionalWizard.cs new file mode 100644 index 00000000..8c1de5e4 --- /dev/null +++ b/Scenes/3DWizard/DimensionalWizard.cs @@ -0,0 +1,8 @@ +using System; +using Godot; + +public partial class DimensionalWizard : Node3D +{ + [Export] + public ChartManager CM; +} diff --git a/Scenes/3DWizard/DimensionalWizard.cs.uid b/Scenes/3DWizard/DimensionalWizard.cs.uid new file mode 100644 index 00000000..090d7a10 --- /dev/null +++ b/Scenes/3DWizard/DimensionalWizard.cs.uid @@ -0,0 +1 @@ +uid://b07ivt3coc3lm diff --git a/Scenes/BattleDirector/BattleScene.tscn b/Scenes/BattleDirector/BattleScene.tscn index c135a47e..a3c7f3d2 100644 --- a/Scenes/BattleDirector/BattleScene.tscn +++ b/Scenes/BattleDirector/BattleScene.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" uid="uid://pl57giqyhckb" path="res://Scenes/UI/Scripts/MenuModule.cs" id="2_ka0ws"] [ext_resource type="Script" uid="uid://tg14hkh1n7iv" path="res://Scenes/BattleDirector/Scripts/Conductor.cs" id="3_elcaj"] [ext_resource type="PackedScene" uid="uid://duhiilcv4tat3" path="res://Scenes/BattleDirector/NotePlacementBar.tscn" id="4_qk7om"] -[ext_resource type="PackedScene" uid="uid://dfevfib11kou1" path="res://Scenes/ChartViewport/ChartViewport.tscn" id="5_r2xh0"] +[ext_resource type="PackedScene" uid="uid://dyd2nc2sgt0qw" path="res://Scenes/3DWizard/3DWizard.tscn" id="5_e25q1"] [ext_resource type="Texture2D" uid="uid://qhwve7fik4do" path="res://SharedAssets/BackGround_Full.png" id="6_0jtpx"] [ext_resource type="Script" uid="uid://cp6t6haqyef7o" path="res://Scenes/AreaBasedBackground.cs" id="7_6k2qj"] [ext_resource type="Texture2D" uid="uid://dbjotl0v1ymia" path="res://SharedAssets/BattleFrame1.png" id="7_klvil"] @@ -25,7 +25,7 @@ script = ExtResource("1_jmdo1") PuppetMarkers = [NodePath("PlayerMarker"), NodePath("Enemy1Marker"), NodePath("Enemy2Marker"), NodePath("Enemy3Marker")] _countdownLabel = NodePath("CountInControl/Countdown") CD = NodePath("Conductor") -CM = NodePath("SubViewport") +CM = NodePath("3D/SubViewport/3DWizard/SubViewport/VPContainer") NPB = NodePath("NotePlacementBar") Audio = NodePath("AudioStreamPlayer") FocusedButton = NodePath("StartButton") @@ -39,7 +39,7 @@ CurSceneNode = NodePath("..") [node name="Conductor" type="Node" parent="." node_paths=PackedStringArray("CM")] script = ExtResource("3_elcaj") -CM = NodePath("../SubViewport") +CM = NodePath("../3D/SubViewport/3DWizard/SubViewport/VPContainer") [node name="PlayerMarker" type="Marker2D" parent="."] position = Vector2(158, 125) @@ -64,12 +64,19 @@ offset_right = 81.0 offset_bottom = 175.0 texture = SubResource("GradientTexture2D_bajwn") -[node name="SubViewport" parent="." instance=ExtResource("5_r2xh0")] +[node name="3D" type="SubViewportContainer" parent="."] offset_left = 80.0 offset_top = 180.0 offset_right = 560.0 offset_bottom = 360.0 +[node name="SubViewport" type="SubViewport" parent="3D"] +handle_input_locally = false +size = Vector2i(480, 180) +render_target_update_mode = 4 + +[node name="3DWizard" parent="3D/SubViewport" instance=ExtResource("5_e25q1")] + [node name="BackGround" type="TextureRect" parent="."] z_index = -1 offset_right = 640.0 From fc0388978cfe424ba38504e6c4300b19c4fa9af5 Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Mon, 2 Jun 2025 21:40:49 -0700 Subject: [PATCH 5/5] Integrate Vertical Scroll Toggle Add new config setting Attempt to swap between normal CM and DW.CM based on setting Split Lane Lines into separate sprite Attempt to adjust sprites and combo text based on setting --- Globals/SaveSystem.cs | 8 ++ Globals/StageProducer.cs | 3 + Globals/Translations/Translations.csv | 3 +- Scenes/3DWizard/3DWizard.tscn | 30 +++--- Scenes/BattleDirector/BattleScene.tscn | 19 +++- .../BattleDirector/Scripts/BattleDirector.cs | 14 ++- Scenes/BattleDirector/Scripts/Conductor.cs | 9 +- Scenes/BattleDirector/Tutorial/Toriel.tscn | 2 +- Scenes/ChartViewport/ChartViewport.tscn | 10 +- Scenes/ChartViewport/LaneLines.png | Bin 0 -> 283 bytes Scenes/ChartViewport/LaneLines.png.import | 34 +++++++ Scenes/ChartViewport/Scripts/ChartManager.cs | 5 + Scenes/Maps/Scripts/Cartographer.cs | 4 + Scenes/NoteManager/Scripts/InputHandler.cs | 4 + Scenes/NoteManager/Scripts/NoteArrow.cs | 2 + Scenes/UI/Options/OptionsMenu.tscn | 90 +++++++++++++++--- .../UI/Options/Scripts/NoteTypeSelection.cs | 20 ---- .../Options/Scripts/NoteTypeSelection.cs.uid | 1 - Scenes/UI/Options/Scripts/OptionsMenu.cs | 27 ++++++ SharedAssets/BattleFrame1.png | Bin 14770 -> 14713 bytes 20 files changed, 230 insertions(+), 55 deletions(-) create mode 100644 Scenes/ChartViewport/LaneLines.png create mode 100644 Scenes/ChartViewport/LaneLines.png.import delete mode 100644 Scenes/UI/Options/Scripts/NoteTypeSelection.cs delete mode 100644 Scenes/UI/Options/Scripts/NoteTypeSelection.cs.uid diff --git a/Globals/SaveSystem.cs b/Globals/SaveSystem.cs index 10667fc1..274c920b 100644 --- a/Globals/SaveSystem.cs +++ b/Globals/SaveSystem.cs @@ -29,6 +29,7 @@ public static class SaveSystem private const int DefaultInputControllerInventory = 4; //back button private const string DefaultLanguage = "en"; private const bool DefaultTypeIsArrow = false; + private const bool DefaultVerticalScroll = false; private const bool DefaultHighCon = false; private const bool DefaultFirstTime = true; private const bool DefaultHasWon = false; @@ -54,6 +55,7 @@ public enum ConfigSettings HighContrast, FirstTime, HasWon, + VerticalScroll, } /** @@ -81,6 +83,7 @@ private static void InitConfig() UpdateConfig(ConfigSettings.HighContrast, DefaultHighCon); UpdateConfig(ConfigSettings.FirstTime, DefaultFirstTime); UpdateConfig(ConfigSettings.HasWon, DefaultHasWon); + UpdateConfig(ConfigSettings.VerticalScroll, DefaultVerticalScroll); } private static void SaveConfig() @@ -142,6 +145,9 @@ public static void UpdateConfig(ConfigSettings setting, Variant value) case ConfigSettings.TypeIsArrow: _curConfigData.SetValue("Options", "TypeIsArrow", value); break; + case ConfigSettings.VerticalScroll: + _curConfigData.SetValue("Options", "VerticalScroll", value); + break; case ConfigSettings.HighContrast: _curConfigData.SetValue("Options", "HighContrast", value); break; @@ -288,6 +294,8 @@ public static Variant GetConfigValue(ConfigSettings setting) return _curConfigData.GetValue("Options", "LanguageKey", DefaultLanguage); case ConfigSettings.TypeIsArrow: return _curConfigData.GetValue("Options", "TypeIsArrow", DefaultTypeIsArrow); + case ConfigSettings.VerticalScroll: + return _curConfigData.GetValue("Options", "VerticalScroll", DefaultVerticalScroll); case ConfigSettings.HighContrast: return _curConfigData.GetValue("Options", "HighContrast", DefaultHighCon); case ConfigSettings.FirstTime: diff --git a/Globals/StageProducer.cs b/Globals/StageProducer.cs index b41dc123..8ed9ffe4 100644 --- a/Globals/StageProducer.cs +++ b/Globals/StageProducer.cs @@ -62,6 +62,9 @@ public void InitFromCfg() InputHandler.UseArrows = SaveSystem .GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow) .AsBool(); + BattleDirector.VerticalScroll = SaveSystem + .GetConfigValue(SaveSystem.ConfigSettings.VerticalScroll) + .AsBool(); } private void GenerateMapConsistent() diff --git a/Globals/Translations/Translations.csv b/Globals/Translations/Translations.csv index 801482f6..70685c9c 100644 --- a/Globals/Translations/Translations.csv +++ b/Globals/Translations/Translations.csv @@ -127,7 +127,8 @@ INVENTORY_TAB_NOTES,Notes,乐谱 INVENTORY_TAB_RELICS,Relics,遗物 OPTIONS_VOLUME_LABEL,Master Volume,最终音量设置 OPTIONS_CONTRAST_LABEL,High Contrast,高对比度模式 -OPTIONS_NOTE_CHECKBOX,Use arrows?,使用箭头? +OPTIONS_NOTE_SWAP,Use arrows?,使用箭头? +OPTIONS_VERT_SCROLL,Vertical Scroll?,垂直滚动? HOW_TO_PLAY,How to Play,如何游玩 HOW_TO_PLAY_BLOCK1,Hit notes to\nbuild combo,点击音符\n以建立连击 HOW_TO_PLAY_BLOCK2,Place notes when\ncombo is full,当连击满\n时放置音符 diff --git a/Scenes/3DWizard/3DWizard.tscn b/Scenes/3DWizard/3DWizard.tscn index 50a24a0f..60ae9079 100644 --- a/Scenes/3DWizard/3DWizard.tscn +++ b/Scenes/3DWizard/3DWizard.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=7 format=3 uid="uid://dyd2nc2sgt0qw"] +[gd_scene load_steps=8 format=3 uid="uid://dyd2nc2sgt0qw"] [ext_resource type="Script" uid="uid://b07ivt3coc3lm" path="res://Scenes/3DWizard/DimensionalWizard.cs" id="1_7ax4h"] [ext_resource type="PackedScene" uid="uid://dfevfib11kou1" path="res://Scenes/ChartViewport/ChartViewport.tscn" id="1_7h5n6"] @@ -14,6 +14,9 @@ shader_parameter/time_scale = 1.0 [sub_resource type="ViewportTexture" id="ViewportTexture_xxbq6"] viewport_path = NodePath("SubViewport") +[sub_resource type="ViewportTexture" id="ViewportTexture_7ax4h"] +viewport_path = NodePath("BG") + [sub_resource type="Environment" id="Environment_7h5n6"] ambient_light_source = 1 reflected_light_source = 1 @@ -22,27 +25,32 @@ reflected_light_source = 1 script = ExtResource("1_7ax4h") CM = NodePath("SubViewport/VPContainer") +[node name="BG" type="SubViewport" parent="."] +size = Vector2i(1200, 500) + +[node name="StarShader" type="ColorRect" parent="BG"] +z_index = -1 +material = SubResource("ShaderMaterial_xxbq6") +offset_right = 1200.0 +offset_bottom = 500.0 +color = Color(0, 0, 0, 1) + [node name="SubViewport" type="SubViewport" parent="."] +transparent_bg = true size = Vector2i(680, 940) [node name="VPContainer" parent="SubViewport" instance=ExtResource("1_7h5n6")] offset_top = 380.0 offset_bottom = 560.0 -[node name="StarShader" type="ColorRect" parent="SubViewport"] -z_index = -1 -material = SubResource("ShaderMaterial_xxbq6") -offset_left = -60.0 -offset_top = -35.0 -offset_right = 415.0 -offset_bottom = 465.0 -scale = Vector2(2.18, 2.18) -color = Color(0, 0, 0, 1) - [node name="Sprite3D" type="Sprite3D" parent="."] transform = Transform3D(-4.37114e-08, -1, 0, 0.617036, -2.69715e-08, 0.786935, -0.786935, 3.4398e-08, 0.617036, 0, 0, 0.138215) texture = SubResource("ViewportTexture_xxbq6") +[node name="BGSprite" type="Sprite3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.581, -1.032) +texture = SubResource("ViewportTexture_7ax4h") + [node name="Camera3D" type="Camera3D" parent="."] transform = Transform3D(1, 0, 0, 0, 0.999729, -0.023298, 0, 0.023298, 0.999729, 0, -1.55715, 3.51069) environment = SubResource("Environment_7h5n6") diff --git a/Scenes/BattleDirector/BattleScene.tscn b/Scenes/BattleDirector/BattleScene.tscn index a3c7f3d2..5d2b6970 100644 --- a/Scenes/BattleDirector/BattleScene.tscn +++ b/Scenes/BattleDirector/BattleScene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=12 format=3 uid="uid://b0mrgr7h0ty1y"] +[gd_scene load_steps=13 format=3 uid="uid://b0mrgr7h0ty1y"] [ext_resource type="Script" uid="uid://bttu0wmy2fp64" path="res://Scenes/BattleDirector/Scripts/BattleDirector.cs" id="1_jmdo1"] [ext_resource type="Script" uid="uid://pl57giqyhckb" path="res://Scenes/UI/Scripts/MenuModule.cs" id="2_ka0ws"] @@ -6,6 +6,7 @@ [ext_resource type="PackedScene" uid="uid://duhiilcv4tat3" path="res://Scenes/BattleDirector/NotePlacementBar.tscn" id="4_qk7om"] [ext_resource type="PackedScene" uid="uid://dyd2nc2sgt0qw" path="res://Scenes/3DWizard/3DWizard.tscn" id="5_e25q1"] [ext_resource type="Texture2D" uid="uid://qhwve7fik4do" path="res://SharedAssets/BackGround_Full.png" id="6_0jtpx"] +[ext_resource type="PackedScene" uid="uid://dfevfib11kou1" path="res://Scenes/ChartViewport/ChartViewport.tscn" id="6_e25q1"] [ext_resource type="Script" uid="uid://cp6t6haqyef7o" path="res://Scenes/AreaBasedBackground.cs" id="7_6k2qj"] [ext_resource type="Texture2D" uid="uid://dbjotl0v1ymia" path="res://SharedAssets/BattleFrame1.png" id="7_klvil"] [ext_resource type="Theme" uid="uid://d37e3tpsbxwak" path="res://Scenes/UI/Assets/GeneralTheme.tres" id="8_62qim"] @@ -19,13 +20,14 @@ gradient = SubResource("Gradient_8uy3a") fill_from = Vector2(1, 0) fill_to = Vector2(0.738532, 1) -[node name="ProtoBattleDirector" type="Node2D" node_paths=PackedStringArray("PuppetMarkers", "_countdownLabel", "CD", "CM", "NPB", "Audio", "FocusedButton")] +[node name="ProtoBattleDirector" type="Node2D" node_paths=PackedStringArray("PuppetMarkers", "_countdownLabel", "CD", "CM", "DW", "NPB", "Audio", "FocusedButton")] process_mode = 1 script = ExtResource("1_jmdo1") PuppetMarkers = [NodePath("PlayerMarker"), NodePath("Enemy1Marker"), NodePath("Enemy2Marker"), NodePath("Enemy3Marker")] _countdownLabel = NodePath("CountInControl/Countdown") CD = NodePath("Conductor") -CM = NodePath("3D/SubViewport/3DWizard/SubViewport/VPContainer") +CM = NodePath("VPContainer") +DW = NodePath("3D/SubViewport/3DWizard") NPB = NodePath("NotePlacementBar") Audio = NodePath("AudioStreamPlayer") FocusedButton = NodePath("StartButton") @@ -37,9 +39,8 @@ metadata/_edit_lock_ = true script = ExtResource("2_ka0ws") CurSceneNode = NodePath("..") -[node name="Conductor" type="Node" parent="." node_paths=PackedStringArray("CM")] +[node name="Conductor" type="Node" parent="."] script = ExtResource("3_elcaj") -CM = NodePath("../3D/SubViewport/3DWizard/SubViewport/VPContainer") [node name="PlayerMarker" type="Marker2D" parent="."] position = Vector2(158, 125) @@ -76,6 +77,14 @@ size = Vector2i(480, 180) render_target_update_mode = 4 [node name="3DWizard" parent="3D/SubViewport" instance=ExtResource("5_e25q1")] +process_mode = 4 +visible = false + +[node name="VPContainer" parent="." instance=ExtResource("6_e25q1")] +offset_left = 80.0 +offset_top = 180.0 +offset_right = 560.0 +offset_bottom = 360.0 [node name="BackGround" type="TextureRect" parent="."] z_index = -1 diff --git a/Scenes/BattleDirector/Scripts/BattleDirector.cs b/Scenes/BattleDirector/Scripts/BattleDirector.cs index 55c17661..aface55c 100644 --- a/Scenes/BattleDirector/Scripts/BattleDirector.cs +++ b/Scenes/BattleDirector/Scripts/BattleDirector.cs @@ -25,6 +25,9 @@ public partial class BattleDirector : Node2D [Export] private ChartManager CM; + [Export] + private DimensionalWizard DW; + [Export] public NotePlacementBar NPB; @@ -40,6 +43,7 @@ public partial class BattleDirector : Node2D public static bool AutoPlay = false; public static bool PlayerDisabled = false; + public static bool VerticalScroll = false; #endregion @@ -110,7 +114,15 @@ public override void _Ready() InitPlayer(); InitEnemies(); InitScoringGuide(); - CD.Initialize(curChart, songLen, _enemies); + if (VerticalScroll) + { + CM.ProcessMode = ProcessModeEnum.Disabled; + CM.Visible = false; + CM = DW.CM; + DW.Visible = true; + DW.ProcessMode = ProcessModeEnum.Inherit; + } + CD.Initialize(CM, curChart, songLen, _enemies); CD.NoteInputEvent += OnTimedInput; diff --git a/Scenes/BattleDirector/Scripts/Conductor.cs b/Scenes/BattleDirector/Scripts/Conductor.cs index ddbd59f0..034d7acf 100644 --- a/Scenes/BattleDirector/Scripts/Conductor.cs +++ b/Scenes/BattleDirector/Scripts/Conductor.cs @@ -7,7 +7,6 @@ */ public partial class Conductor : Node { - [Export] private ChartManager CM; private MidiMaestro MM; @@ -19,11 +18,17 @@ public partial class Conductor : Node private bool _initialized; #region Initialization - public void Initialize(NoteChart curSong, double songLen, EnemyPuppet[] enemies = null) + public void Initialize( + ChartManager cm, + NoteChart curSong, + double songLen, + EnemyPuppet[] enemies = null + ) { if (_initialized) return; + CM = cm; MM = new MidiMaestro(curSong); CM.ArrowFromInput += ReceiveNoteInput; diff --git a/Scenes/BattleDirector/Tutorial/Toriel.tscn b/Scenes/BattleDirector/Tutorial/Toriel.tscn index 12a97537..4b5ce332 100644 --- a/Scenes/BattleDirector/Tutorial/Toriel.tscn +++ b/Scenes/BattleDirector/Tutorial/Toriel.tscn @@ -115,7 +115,7 @@ position = Vector2(35, 202) position = Vector2(59, 266) [node name="NoteMarker" type="Marker2D" parent="."] -position = Vector2(364, 294) +position = Vector2(392, 246) [node name="LoopMarker" type="Marker2D" parent="."] position = Vector2(129, 270) diff --git a/Scenes/ChartViewport/ChartViewport.tscn b/Scenes/ChartViewport/ChartViewport.tscn index f65b608e..573c3212 100644 --- a/Scenes/ChartViewport/ChartViewport.tscn +++ b/Scenes/ChartViewport/ChartViewport.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=7 format=3 uid="uid://dfevfib11kou1"] +[gd_scene load_steps=8 format=3 uid="uid://dfevfib11kou1"] [ext_resource type="Script" uid="uid://btgmfxqoe2wqx" path="res://Scenes/ChartViewport/Scripts/ChartManager.cs" id="1_ruh2l"] +[ext_resource type="Texture2D" uid="uid://3kimu20ebgtu" path="res://Scenes/ChartViewport/LaneLines.png" id="2_543sd"] [ext_resource type="Texture2D" uid="uid://cp78odda2doab" path="res://Scenes/ChartViewport/LoopMarker.png" id="2_q5cjc"] [ext_resource type="Script" uid="uid://cf58ep1c2o0q2" path="res://Scenes/ChartViewport/Scripts/Loopable.cs" id="3_5u57h"] [ext_resource type="PackedScene" uid="uid://bn8txx53xlguw" path="res://Scenes/NoteManager/NoteManager.tscn" id="4_fd5fw"] @@ -29,6 +30,13 @@ render_target_update_mode = 4 position = Vector2(-50, 0) anchor_mode = 0 +[node name="LaneLines" type="TextureRect" parent="SubViewport"] +offset_left = -50.0 +offset_top = 45.0 +offset_right = 480.0 +offset_bottom = 135.0 +texture = ExtResource("2_543sd") + [node name="StarShader" type="ColorRect" parent="SubViewport"] z_index = -1 material = SubResource("ShaderMaterial_5uw0y") diff --git a/Scenes/ChartViewport/LaneLines.png b/Scenes/ChartViewport/LaneLines.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3d6bcfd48d69efe8a6a4c859989befd9ad0a47 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0y~yV7vrmM{%$LNuDp)&4CnSage(c!@6@aFM*t^o-U3d z6?5L6YverOz`?TN^561p)*^C(lQ@Gs)ff)w@0A5Aq8?~4*E*S_&hTK>JwECg3N-0} l^wgAX!VCqW`Roi2Hu0a(WoGYMq-_GS!_(EzWt~$(69BAwCrbbT literal 0 HcmV?d00001 diff --git a/Scenes/ChartViewport/LaneLines.png.import b/Scenes/ChartViewport/LaneLines.png.import new file mode 100644 index 00000000..e59de181 --- /dev/null +++ b/Scenes/ChartViewport/LaneLines.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3kimu20ebgtu" +path="res://.godot/imported/LaneLines.png-fa4c66b9892f799286e4b25955ab6fae.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Scenes/ChartViewport/LaneLines.png" +dest_files=["res://.godot/imported/LaneLines.png-fa4c66b9892f799286e4b25955ab6fae.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Scenes/ChartViewport/Scripts/ChartManager.cs b/Scenes/ChartViewport/Scripts/ChartManager.cs index e4db9e61..71c96b5d 100644 --- a/Scenes/ChartViewport/Scripts/ChartManager.cs +++ b/Scenes/ChartViewport/Scripts/ChartManager.cs @@ -281,6 +281,11 @@ public void ComboText(Timing timed, ArrowType arrow, int currentCombo) TextParticle newText = new TextParticle(); AddChild(newText); newText.Position = IH.Arrows[(int)arrow].Node.Position - newText.Size / 2; + if (BattleDirector.VerticalScroll) + { + newText.RotationDegrees += 90f; + newText.Position += Vector2.Right * 70; + } IH.FeedbackEffect(arrow, timed); newText.Text = Tr("BATTLE_ROOM_" + timed.ToString().ToUpper()) + $" {currentCombo}"; } diff --git a/Scenes/Maps/Scripts/Cartographer.cs b/Scenes/Maps/Scripts/Cartographer.cs index def841d0..f54fc0fa 100644 --- a/Scenes/Maps/Scripts/Cartographer.cs +++ b/Scenes/Maps/Scripts/Cartographer.cs @@ -74,6 +74,10 @@ public override void _Process(double delta) public override void _EnterTree() { BgAudioPlayer.LiveInstance.PlayLevelMusic(); + if (!SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.FirstTime).AsBool()) + return; + BattleDirector.VerticalScroll = false; + SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.VerticalScroll, false); } private Vector2 GetPosition(int x, int y) diff --git a/Scenes/NoteManager/Scripts/InputHandler.cs b/Scenes/NoteManager/Scripts/InputHandler.cs index a1c50652..c61dfdb2 100644 --- a/Scenes/NoteManager/Scripts/InputHandler.cs +++ b/Scenes/NoteManager/Scripts/InputHandler.cs @@ -56,6 +56,10 @@ public override void _Ready() { InitializeArrowCheckers(); UpdateArrowSprites(); + if (!BattleDirector.VerticalScroll) + return; + foreach (CheckerData data in Arrows) + data.Node.RotationDegrees += 90f; } public override void _Process(double delta) diff --git a/Scenes/NoteManager/Scripts/NoteArrow.cs b/Scenes/NoteManager/Scripts/NoteArrow.cs index 58d0f3f1..8c58ad58 100644 --- a/Scenes/NoteManager/Scripts/NoteArrow.cs +++ b/Scenes/NoteManager/Scripts/NoteArrow.cs @@ -40,6 +40,8 @@ public virtual void Init(CheckerData parentChecker, ArrowData arrowData, double OutlineSprite.Texture = parentChecker.Node.Outline.Texture; IconSprite.Texture = arrowData.NoteRef.Texture; IconSprite.Rotation = -Rotation; + if (BattleDirector.VerticalScroll) + IconSprite.RotationDegrees += 90f; OutlineSprite.Modulate = parentChecker.Color; } diff --git a/Scenes/UI/Options/OptionsMenu.tscn b/Scenes/UI/Options/OptionsMenu.tscn index d4bf2f7d..48e8fd10 100644 --- a/Scenes/UI/Options/OptionsMenu.tscn +++ b/Scenes/UI/Options/OptionsMenu.tscn @@ -1,13 +1,12 @@ -[gd_scene load_steps=7 format=3 uid="uid://buejv62lwtymc"] +[gd_scene load_steps=6 format=3 uid="uid://buejv62lwtymc"] [ext_resource type="Script" uid="uid://cery6g5ojnl16" path="res://Scenes/UI/Options/Scripts/LanguageSelection.cs" id="1_qyvkw"] [ext_resource type="Script" uid="uid://dkuui4eib1q3e" path="res://Scenes/UI/Options/Scripts/OptionsMenu.cs" id="1_yjq7i"] [ext_resource type="Texture2D" uid="uid://ck16vyh1q68ri" path="res://Scenes/UI/Assets/UI_ForestBackground.png" id="2_g354d"] [ext_resource type="Texture2D" uid="uid://djd6iw2g84bba" path="res://Scenes/UI/Assets/UI_CenterFrame.png" id="3_qydxi"] [ext_resource type="Theme" uid="uid://d37e3tpsbxwak" path="res://Scenes/UI/Assets/GeneralTheme.tres" id="4_r616m"] -[ext_resource type="Script" uid="uid://dohkhi0d0qiv5" path="res://Scenes/UI/Options/Scripts/NoteTypeSelection.cs" id="6_qydxi"] -[node name="OptionsMenu" type="CanvasLayer" node_paths=PackedStringArray("_focused", "_volumeSlider", "_closeButton", "_controlsButton", "_highContrastToggle", "_howToPlayButton")] +[node name="OptionsMenu" type="CanvasLayer" node_paths=PackedStringArray("_focused", "_volumeSlider", "_closeButton", "_controlsButton", "_highContrastToggle", "_howToPlayButton", "_titleScreenOptions", "_noteSpriteToggle", "_verticalScrollToggle")] process_mode = 3 script = ExtResource("1_yjq7i") _focused = NodePath("Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/CheckBox") @@ -16,6 +15,9 @@ _closeButton = NodePath("Control/CenterContainer/MarginContainer/MarginContainer _controlsButton = NodePath("Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer/ControlsButton") _highContrastToggle = NodePath("Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/CheckBox") _howToPlayButton = NodePath("Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer/HowToPlayButton") +_titleScreenOptions = NodePath("Control/MarginContainer2") +_noteSpriteToggle = NodePath("Control/MarginContainer2/CenterContainer/MarginContainer/VBoxContainer/NoteCheckbox") +_verticalScrollToggle = NodePath("Control/MarginContainer2/CenterContainer/MarginContainer/VBoxContainer/VerticalScroll") [node name="Control" type="Control" parent="."] layout_mode = 3 @@ -40,6 +42,77 @@ patch_margin_top = 100 patch_margin_right = 105 patch_margin_bottom = 100 +[node name="MarginContainer2" type="MarginContainer" parent="Control"] +layout_mode = 1 +offset_right = 162.0 +offset_bottom = 105.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +theme_override_constants/margin_left = 7 +theme_override_constants/margin_top = 7 + +[node name="OptionsBackground" type="NinePatchRect" parent="Control/MarginContainer2"] +layout_mode = 2 +texture = ExtResource("3_qydxi") +patch_margin_left = 5 +patch_margin_top = 5 +patch_margin_right = 5 +patch_margin_bottom = 5 + +[node name="MoreOpaque" type="NinePatchRect" parent="Control/MarginContainer2"] +layout_mode = 2 +texture = ExtResource("3_qydxi") +patch_margin_left = 5 +patch_margin_top = 5 +patch_margin_right = 5 +patch_margin_bottom = 5 + +[node name="MoreMoreOpaque" type="NinePatchRect" parent="Control/MarginContainer2"] +layout_mode = 2 +texture = ExtResource("3_qydxi") +patch_margin_left = 5 +patch_margin_top = 5 +patch_margin_right = 5 +patch_margin_bottom = 5 + +[node name="CenterContainer" type="CenterContainer" parent="Control/MarginContainer2"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="Control/MarginContainer2/CenterContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +theme_override_constants/margin_left = 7 +theme_override_constants/margin_top = 7 +theme_override_constants/margin_right = 7 +theme_override_constants/margin_bottom = 7 + +[node name="VBoxContainer" type="VBoxContainer" parent="Control/MarginContainer2/CenterContainer/MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 + +[node name="NoteLabel" type="Label" parent="Control/MarginContainer2/CenterContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "OPTIONS_NOTE_SWAP" +horizontal_alignment = 1 + +[node name="NoteCheckbox" type="CheckBox" parent="Control/MarginContainer2/CenterContainer/MarginContainer/VBoxContainer"] +self_modulate = Color(2, 3, 2, 1) +layout_mode = 2 +size_flags_horizontal = 4 +focus_neighbor_right = NodePath("../../../../../CenterContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/CheckBox") + +[node name="VerticalLabel" type="Label" parent="Control/MarginContainer2/CenterContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "OPTIONS_VERT_SCROLL" +horizontal_alignment = 1 + +[node name="VerticalScroll" type="CheckBox" parent="Control/MarginContainer2/CenterContainer/MarginContainer/VBoxContainer"] +modulate = Color(2, 3, 2, 1) +layout_mode = 2 +size_flags_horizontal = 4 +focus_neighbor_right = NodePath("../../../../../CenterContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/CheckBox") + [node name="CenterContainer" type="CenterContainer" parent="Control"] layout_mode = 1 anchors_preset = 15 @@ -47,6 +120,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 [node name="MarginContainer" type="MarginContainer" parent="Control/CenterContainer"] layout_mode = 2 @@ -88,6 +162,7 @@ alignment = 1 [node name="CheckBox" type="CheckBox" parent="Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"] self_modulate = Color(2, 3, 2, 1) layout_mode = 2 +focus_neighbor_left = NodePath("../../../../../../MarginContainer2/CenterContainer/MarginContainer/VBoxContainer/NoteCheckbox") [node name="Label" type="Label" parent="Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 @@ -137,12 +212,3 @@ text = "HOW_TO_PLAY" layout_mode = 2 theme = ExtResource("4_r616m") text = "CONTROLS_RETURN_BUTTON" - -[node name="NoteCheckbox" type="CheckBox" parent="Control"] -layout_mode = 0 -offset_left = 6.0 -offset_top = 57.0 -offset_right = 192.0 -offset_bottom = 81.0 -text = "OPTIONS_NOTE_CHECKBOX" -script = ExtResource("6_qydxi") diff --git a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs deleted file mode 100644 index c83dc897..00000000 --- a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Godot; - -public partial class NoteTypeSelection : CheckBox -{ - private bool _isTypeArrow; - - public override void _Ready() - { - _isTypeArrow = SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.TypeIsArrow).As(); - ButtonPressed = _isTypeArrow; - Toggled += OnTypeChanged; - } - - private void OnTypeChanged(bool pressed) - { - SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.TypeIsArrow, pressed); - InputHandler.UseArrows = pressed; - } -} diff --git a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs.uid b/Scenes/UI/Options/Scripts/NoteTypeSelection.cs.uid deleted file mode 100644 index bd451cdf..00000000 --- a/Scenes/UI/Options/Scripts/NoteTypeSelection.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dohkhi0d0qiv5 diff --git a/Scenes/UI/Options/Scripts/OptionsMenu.cs b/Scenes/UI/Options/Scripts/OptionsMenu.cs index b709adc5..09beea6d 100644 --- a/Scenes/UI/Options/Scripts/OptionsMenu.cs +++ b/Scenes/UI/Options/Scripts/OptionsMenu.cs @@ -26,6 +26,15 @@ public partial class OptionsMenu : CanvasLayer, IFocusableMenu [Export] private Button _howToPlayButton; + [Export] + private MarginContainer _titleScreenOptions; + + [Export] + private CheckBox _noteSpriteToggle; + + [Export] + private CheckBox _verticalScrollToggle; + private const float MinVolumeVal = 0f; public override void _Ready() @@ -46,6 +55,12 @@ public override void _Ready() _controlsButton.Pressed += OpenControls; _highContrastToggle.Toggled += HighContrastChanged; _howToPlayButton.Pressed += OpenHowToPlay; + + _titleScreenOptions.Visible = !StageProducer.IsInitialized; + _noteSpriteToggle.ButtonPressed = InputHandler.UseArrows; + _noteSpriteToggle.Toggled += ArrowSpritesToggled; + _verticalScrollToggle.ButtonPressed = BattleDirector.VerticalScroll; + _verticalScrollToggle.Toggled += VerticalScrollToggled; } public override void _Input(InputEvent @event) @@ -112,6 +127,18 @@ public static void ChangeVolume(double value) ); } + private void ArrowSpritesToggled(bool value) + { + InputHandler.UseArrows = value; + SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.TypeIsArrow, value); + } + + private void VerticalScrollToggled(bool value) + { + BattleDirector.VerticalScroll = value; + SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.VerticalScroll, value); + } + private void HighContrastChanged(bool toggled) { StageProducer.ContrastFilter.Visible = toggled; diff --git a/SharedAssets/BattleFrame1.png b/SharedAssets/BattleFrame1.png index 2e51248133cefe0a4388eed414b34f6c25dc1084..005729fdb4662e16fbae24be48eccfb64450e754 100644 GIT binary patch delta 10724 zcmX9^by!qi6TZ7FvY>7VzeUvV!k}a<3`8kH}2cq8cZA3BK*Eai`n5Pl9m9(0X z9r#)iPZEq8&+_zgWhmY1JvxIIi(=Ed*?n{+Yg}nbTJ+vU)7=s(u0|%MuYWvh;PUrc zxcoteNTfJ=e$PJ%-}`#g8Y1dPAO@!i=*8`~e(&?&$1S$|35$J!dh3|nmXHQUcx{f+&aPCOKfLFNdO@_sA2#12 z^ML;T;*S9BNMR2e%zzUuPzgXST8&y9+v0oATrW~ToD(kccfWo6S8m3+?zZpvwT8oW z<6m0~-0+&bEhgUI*pR*R$f6WmSD@u)CbhAW)UT%1zPemQm8z^QC> z)`Fc_`~@nDEU$$MPMN8JKa)4Z!qF?Qb~$v*+)T69?n~ypmCvPZ4a=#KK{l)Bn>4W* z50ZD(3^4gdkJC?>fCn}!9&^ZX70h)bTR>!wEvzqM_z#`Uzx`C?i(_ z^U+V{qgMlxpLonw_%@nHtvb^=owX-*s6=VC5t69(X@qMZxW7pQ(HXN^Bz^-8bWSCE z!KVr@6R~UW5D3&RHVYjz_jpjNu0+&YeaI|xBjis{&;RQAiKugxjao=*Qd9c@1d zolHABI9q&CZiCnuk~{fZI5Ba?3XsPaWa6r-kLaaHRm)fWjHT|osrjyqV@cwjMlv3g zgC}9qX~KxTfgEOVG!nYl$!~PI78($^NMLviwaZc@T)PfEKWBH+c3qghUvYe~TIWV1 zkYPppR#Kix>s=Hj@yy3i815(ED|SkY56{f8wFL91Iw3Xwi|@atPGyG+6mg&)qcgm} zxnGI=2`j~!pW-WxbDIlskwMyFMln`7ZgNN(DI9EYQ2VXCQP3Kub#=*bt$lKIZ+x2} zb{>d)L?rqv4as!xBmDhD6U(g2KWAj(y?%13#?d^~Ya4=B#66)IA&Ay5vrB>E+q*;G z%fgVpSSAAXd7*ZFp0?ZMsu@b&^n?A>{LVvWh`H)sZ^*n?C!z5m{bbMicZY={R{QD7 zHH4DgzLGmDnTsm7=db8Df#6Y7AZ< zFO_M{LsxW}cB7EL;csXMlflL2)sF4q-bbD$jZ`?9sr*5R2qMW5$6QN{P*&p@A1Cc`XP>IVXjDT`12HAR7Kv0l+V9X zI3$!ksgtszB`dMl1Kv!XRTd_@G98jrO});V8kkIuRC~u237@hjK3gRfM9#{H?-o&bkIX^yv2NM*Hu<;+oGTB}ZwKf)WpfZaY|5wA`mMFc7n8TAK#bhQO$06)QxxZ&yywjfs|9KX7-aG_vIy*x?@J^Gr;k;5@VQ&J7-Kz z@fG{asYA8Tg)?&p&-Sy@;~xr>*GSJ()8RWBc`2`HtUSIS2i3qE>iF=nJBmXLcLMit z!}+JZT9#bqO|eWPP2U**;j! ziNw%&jR$Tj_(E}^m{>d{%pjE7V1TeUjD=>T;c?1m#gTlT>vQ% zFW&dd-cV3JyZ-}z(aKB~S3S1)6ifWV(sTZ- zG|9{=23R>aoD>I@MduG(n)pD5F4(_~Ol*yiK3pd2&)Au;J&}`-hcNb}= z4CjoU45zZeF99@$Q)!Pb8X+6jX~R-~!d(k|9wei7UGS2pi9awM67~K0U`SZO3$zLH zoigsnA?NS{Ah=b=`1lZ*zr`F8(uF`3hBe@&itHy)f}y!G07>&O7~`AQ8)WfA3kWlk z1mOXe4}wVrphYn!%z?3!L<)yrWf_7%t1Eh9_OprIFzVdfsaIR7S8{ZjQ_}LuN^ZT_{h<1a1`HrTEDpt$ zVSBO7m^N}p>(7<&mA{w@ioz2FX06{}0P}0-7L84uY_Tnt_sVX+``ES_t@3Uz%#C)f zhcM&7;m){>=rgOVIlgS@QH&;i^A+}p=?N|4A0^vdLP-dN50iS5kqla_CZe+|ZmDce zBX0S2^WP$73=jXsktq~}Uf<-23{c`*Gx|^5)bCZ>K^d~~s1eXIT&bI@7QgnkJALc6 z=7=houyDoDs{>ld_vS;)X_jq!BkpUrKO~>HKi|@7Voew!2&183r{Xf#!t#rv#*9L* zONuw0nb~H2!u*6E`sr~*t*-$G%I2G(v{9EY5pC}|lEC{2e5c(KpmvvUq}2Nif}&?% ziSWp*pKZZt1Dn?<-blYJkt&~?D=%fdXQRcRoXqrB@X58-xj?He%XFx4@V_j$352KLW9BeP0X^1FUm`7F>yh-}6U(eS~yl85rs; zxA^H){YsA5)AG>wIi(zszL#I&OR(msb@ux&r)nNHO+b{NV8uZq0Mkn29i0aU6l#4- zhe)4jl?q0*(1ZuwlA{wT%1$3v{OwG0oiFA7Sz4jL^#;KQ7pJa6hEXq>u*K=YNOJSjir>P4m9i+$Z-J98Gf3+rXtn?>+MZKCfI7i`F;7 z(lgO!q`y1*Wo-o2>qK5h(B=9N;Bh#Ro7cX)(YL1e;k#f(VIp!{^ZM#(weq!QPU?ZJboxT^ta3s(lfdSu0hThvPUj znDkevA}y9%%XW8}?Y8YK^dP-Xp{aNxO1bXYaQx@ko}cXUkV$Tx?^a9{CN;<_^aM>8 zV&K94H`P;Vl)-?71!q8H@0U7$|K{gc6R7ahBQrvu(LAV&NC=Y_b?53q9Ppb2a%u5MRK2Bo`#%;g`tb|`Q1 zE!`(=$X8dA2Od|kMi@up-+hI!7I7+j$1}W%@44Gk*XK^$v(OM*TmFJ9XJPy)i={BZ zBw3`P1(~&#VR5tTj?%e9AUa?yt+xEK*Ow>e#lzQVfZvab5XpZGwhUz+&coq$%$^(L zn+uVIStj@XqkoazhJC#p1qIPco3>sJAG+**D#5|PhZWd`_?R4hrXTLyAP@_{SU>R~ z|DmVikP^40B{9BI*uaHVKBCt)Vm4`+^gEJDhy&8x<-$L8lH$GYes^p)dV=qng>LF; zy$LTFY&t+w#hHfKPQ4bBA?Wx_ze+ZN_sN%Cg{$S9VDIp@J2U_lTP#YjXBMrzRPaJ5 zjsb)|Tc7sZ<^@yUxTUpRR&_|mIbY}<^@};jY)!Jt&|L3*?V5XzdWiNAE6zsflz1T+ zf*Ei`ax0ut9mTT;R~OH3B=yjHx54ZiKmdwKr<%5LImv9wcr*K8p7j?O$LDEr(||65 z*GUvb57Bn*ZKHUkOGy;#o|EGi{Gq14TJ^h7c_by9IiqK2HlBKhAWi!`bAo_9f%C5& z>#;C^;ZSr0lg!dRZ+f6@uj@zrumZwRw(Y+#26w8RYqPO{{GmOw3fG`FE%JdNmO*24 zh>OT|eckPD`sDToI#D#2$xIoS*-?9g>uh51mlcizVOtbBknpVd+&NUsHF)W2vdoQx zt{~%Cw~Zg1_aRs+IMR=Q`YZ5Z}Ljw(L{_@9~Ry~AtcJq>;7mj#0iq!Be{TEYzI2J%Oc&JWCWN5|!*`_Vi3 zZVu}&&c&=~vwwV-$497QS*Ip8ZN$Db4Q<*OI&FWQDV>J+sJ7k(-dM?Qa~=P@HJ)0Y z0n+kNL!atw;BgZxF8)Gn!OEOc^KoNc-3vqdD0KYch2hjEtLI@r+wFb8FQ+9o=wS=A zVR?<^qg?mpk@nnu;A{fC)TrB$9${}3k!3*hgWJFH6p`n4DZ2VpnW$qAjA9WUs0JmD zflL4)L%#P)cYRwY)#V9YVVNAEID>aaUG}fu_h_daT1)dq=ocVQSM^~4+ng;0APNV4 z^=vTGB1G=Z+X_ZB_7~S7|DY=gC|Ht>3A|X2p1gc7E}|oRNaz9uC~p?^Ypj2|AJ!vI z-|VCN4v*5b{YY>wmcj9K*n$9O9bwU{VkXGvGXhIgPO0oBx6(4Z?SmHDf+}tS(~pbQ z&!@@Aq`p1Kz~}TP2W&ezJ>>zaVzBA1D*kwjpPj0)ux%P2>BxfQt*?h=tM00KecY}` zp_w`3;~Sh(?me?Y}~Dqk*JLDfEFfln)!RnY5_0j|nEHnyOP?2u7hv1@_VC zy0GHP@!{247L}3XT?-hBGPTh^8xm!Kxi|Xm`XQnSqQpew`~B#AOjzr*6>n)HEfj?v zmUTl$S|~pLBz)U4(6lc^seOk}9Q2Bl@cme@k{=kf-K^J*^zsqG$RgTb96E$xob%L1A>?NP=toCH$?yu0Z-ySpZN`DwiCje2`xA=yY*i#(cIpG-rK?L zPE?-jkw8bjM}6Ike-Eh8xs}GgvI8hiGz)w*2)XhDQX=xS!-Q^UiWzhKq>?$n6d$xC zARvD|IN%^y_oY25>NUaO?dnTPfwZrC+&L`Ec0uvnKoVABIE%-{;ibMe>1p#7*G>Da zJEae&UqYA`DYh{o7urIMLhVT9w>h%Q{x&`rpqD8R~?(4d96&*Ka1j%ThA3->rp<6P4I?&?mrPj*sO%MKgv@1> zwvWbN>K7{yJBt8s(Eq<;GNus%?ErjxLz?AGATNsP!i)#!XTjWUd%oc!pf^pnFd|~7 z#QZr{6deWne@SMy^s_ZjpM(b`0Qj~l$zDRAReBoY`Jyo<*SQ)##gJb6w~+h(e&PRE zO;BM|*lAe^S@vP$&MQL+SqKZgdn1T@>t;J}1WelB)<|i`?SSds4gpvN68lFEw@Jy_ zL*}D2Y_~*xsUz#lGZARWC%wOFg706l6;jec|M-_4+Kl}+27t#*GUBh_Z4?iL(AoTu zf%>5K%&tgr7l%Z3H)`0b{wqUzD%O7!J8W4KC?BFBpTU};3=1?tT!Te-3_*fpkkhpm z`z37dC7~=eL5P9$Uc!R;1EyaY2}gf5)jn{$AR+?w;t?oI@fDqA*65?f;AX`h57X=eS=r! zt-p3tLnx3#rnavvaZZd+XunJJ!P_8NcR-QJg+G!`<+tmze!trC4-g$GHL>D5O+*yf zieK1k=1?kXGmCqMTA2SH?A5_l{YC ze|;@(DWK4-q+FGaVUb#>wx0D%uMD=B+xIZpJDGyWUmtg=$8qqN08Z6)zISKo9Pt#h zT1+uhi(=nN*FQV+aD0Mc{c1;f0B(=r5~(S9T@>HaKs#y8859W)2%fggR$8HVGEP`? zjCV#`l3;@}hZm}KaPU^{iX&~tE}02&?<}oEKQp5wV7;NIwoTfsT;0Vhk2(tO`BeXm zVOnwZ!V9glx=L6UcW�+d7-~Bb7*Ir5rL8%I+w53)2xhcCQ5GN?fbnFX#4;_4Lt? z7ZLbZY+zuA$#*in$3pcv3bFM=LvKDHTeKDDn08%PTvYVU2*s41$|Q(1o|72-M>E;V zMvFz*gf)_jAyxsV*tc8p8B)DUV@Dzho{UFi(1=~nYP1Ky~MK=N^D2vZ;+wh!juH?pyXkT>9qk) z?->@-rWQ@aoF~(dFrQ-usQa0P8pNDARZojBF;}^6|3`TWl>5(q?4KP2fKrG41;*8z z7jem|k7BaHvhehm$}xsWk?*syqQ5$uZ%+|`Uc=&CCQ7U0C-;kVg);$3DSX0i^ym@g zW=wWIVwVVLusB467>V@Y#he26y8|p>!fRU<@TqOM&=vF=X%6K*Ac)81{D|kp^<3s?BU7JkQiouXtg&Az`-#A<<*?M`| zv@7FB8lrX1dn7Vc|L0(2TDi!W^?bhGaVP9*X~@H{Odr&Av&-%+Ewy^CqYs_nJc0l- z*3^FayU6gnvEk*~wEcx}$j8HRm@N(Iqk90y5!S+D?bT9rrCN#wLze zvdP0ingHgbR1d(GKWa+e*0QZu`y50IJci-lGf!n_*D^w8ukN4ui|bF5y=KpN<<2SW za-@eAUb(RZt<7w)55AS*8*awI?O|^rP*n#!wZ0 zLPq(I$yd#^hi8xCL?vP#Or2%%>FQOVk&@_Nb2On-F?xA%(Rcf30M_0-ZNGAAgkn7> zq#QKAc=#^scMxQ78E5^$pl2anQyl#|i>BbS^v zBRw80ErIsnJ@L;6-rEDh&nj-Ez?G8_Xrf;k&c7wWOW=eyn~E`zV!@q@HcXa7XL zWP5!v#Z}<@a1t3ILR}q;D1OSRbmdj|okDj0;zF`c2z{PPaE|Nn+VXs_@y3+jdB-+! zXnJ$#!c>72!j^pdUh*pM3v^|<|Mo;dFcj6k`jMv~7yomz2SlGoO2?1-+B9G}M7l@5zII5hS( z8fP9@DQ7I|>iTU5T^1iMJ-(UhyU#@s5Vi=OgKE6z>g>Ljt_XauSf#X|@-j6B*U$6C+~5IZFiEuU@eP`0N2Jp4%FFO}rG4%E;yzOCgiqj`wpG9_A*tpv;Yn0t=Ux} z;y{VS&@R3TR=AO`urU9zpGW_Qfzd1cfqFNz++(B}Qe}fv6V2cYWQG|$ChODswj#dR zaF94EFaHqTV0h##-_%bo4aB4WgSf~~j$#0!X}tA*Eq3(ExmCdDUn$NqW#}l7V2?d> zZqCm3`G|mv)1K{vx24E3HY(Wl@5n#MVKybmA(EDz5kj0JgVv9)6fdaU)sf{lf)>d& ztY6F6&{NL8#aoW9*C}jU%^2 z-&gz7x;jq2i-d|c*M@j=rG_;nPS$8@d;KNhrorLt>6tKeJJ*75>o=d`Tr|En+(Z-X zLbi5B?2uUZLvpy*0OshBiLy*)Y0hU3us&p#MtpZ`h~M5M`wACh-vL;9@{L(ML39A# zC%c|eU*ze@$|pIfaMs5NF!W$BLVq&Q;ixjJ`#} zG6(se10`M@e9n47TaZ?tQ!3}3=EtbR!r;D{vgUlnxUftJPW;>2kb8L|UerR=l-sNd z!%m7Q*-iADtN3fb`Q@~W_Me&c$T}P2O3D2{@35;ws6@|ER*x!|lsbuCGx)9$uw5K# zIs;v8u`P3>?pGVBf*;oVn|R%_l?W;1OSGdpnfwN8s2Y1HRZO!}7Z{$C1($+Gl$mKR z=6tyg36DalkuSKJ(Mn8@TL>zZi%jE|K#QzfP_r>91n#f0$M@ ztGcq9wf!r8BtNG|zk+4vpUp4ct0c|Y=LcBIKu`R8S-|(q)mIik=9at= z-9Zo|?Zl8{f22aj;05f!G-7k&C#z?wOY?`-n0dJzjzlHK&pPy80?|Ox#rY7AFVlPH z+w7EJ7g7?@W8=nJh&D`FNOt3T=DEOjfq!O1nfo=HwX6rbOSd}JGp8(h-OAZrYl-r1 zWs|hSQO-!$uV0gi3d=Mzs=Zbp>$YBf`wLDgJnR*?8IiV$8|u&9%@4U?OYYOkhM9Kh zt3R`+ORT_2Bx)&I!p{Wa*~_W{s2#REvZ>)bXry1^0lnP(u9r6jP(GV+B}SjtYZ^Jj z^MkO96hWGLW=iN(36~6(h=gvGy&r0DVM|ef-dN;t8dLj-1(lIhSbaUYHE%=|fi`{2 zpVoRl=_n{vsG*qMTL&?bO#aQz{0%S&cA3GKl$|97*4Zl>!mqFJYZW{ths>gmB}xT8 zSrp4nMKYmYzIUXmIq2JMQ*2N|HteD#lP>bcO4soJvRUrZ74B$eXh&OowJK4iI20(k zFENF$ii({6=>2D^o8{5No?sSPH*n)qaSBlv&!=wnXLY-dD7g<7BZbHb=x6WeoAM6$ z?=tjjw|l<1;d40XU(4Va6dste`bY>Q=ElwJaG2s4B&wSCW}H|w592PEO`rmZ_G?qF zd8?k&UmR68n7x9z(Lm7GV0=2rmgBc!Jwj}QbdZoGrqcD@ z{t1#QI$b%2WUMEei=MrSq*3r#S~qnBraX3e{C0m}1RKYRiT2S-MToeQO4A_~XP~?O z1(xR5C&a`}^ar0at@KyUt;l%_x2`7Ky^7qMd1E$`Ru5TNz1+%V+=4P?Uo~wA#Jo%3 znUJKB_=JT)oHac6CI&vG%?JKliY`XQix~beHAV7eMoGp$$ZPC8zLDITig|i5RTAiT zPrh59__R?nhnL3Jq~|LT|FjGNf&F`1&)PA-hGO)Uz345-am?-;C6T#3u>SHpa5EEh zGh^^Iwb2{XN#pR_-%Mm}ccvjBKubVU6_RL2ovVTb-TWBXATNI96lkO~c{OpLML7`I z$T&2wqi9mcRi)1LA-cIq{?dNa%ZbS_I8-!`EyPMX_B;O6Fy{D|s*QFdQ&l=)baae; zE|OkMb20Gm29iNnW^MHcYkl`=!LzoWLcEl-(7s1*+~lus0M$mZwJM?vfO zx{Gyy;&>7C!yMmQk;V9*>Gz+#rJY=7qg5hteI{UDNvP0PpA zOJeqsm9Z4d?dYm$dc5@v!L9aFKDx~kvUSY6;Oav{p2*Fi;SRcOWPjZ#>&a07FpWun zJ*D-{16Y%-De}fmmYWkx^)JlW{I(BA`v1?6cfmERTL@1Zu|OQ?tGf)H??C4R^-d zcV!sXG7LIbNngHb`gxM@dvg&w$;VNm@~6Dtbmt2ZPyAwDSg-;>!9ueT@K96{gC3BZ{8=BWxMwoUeVQbx>v)r$uby%3B)bcD_fOA zb~y7p31Dp*OnLiFG@~~TgO8h1&CDZF2P$`b3yVg^>`Epk39Y%j&p=T>l`L@h z`O{oERdrg@E2O3 zi~y@%OmQ&yn7VD0c?VEqy{(8JAh|uiezd$bI5t?A9d4Lh~8~t zr)EBpd8mLkUoq`cB3OFLq7x<^8P)%@N#dK4iHHb=F3_hQ#MZl}p;FCh5&lXo9??=B z#~eGC^v87xExgtQB421XoW#_}^FYp4Js_>(3PRU#a{6sYfw< zs8iJI568zdm((%8L{Ue4TY7ggo~ZLkA~?7_6YW%6=L$!+WkBoZlpv7ObY9NAhn$Md zQ`IBIW==9KZF(ru9T)57xWN;lBZ~?g&l>2b9Dmfa`(vP`?e&kBmkE3Ht$dOyBCtJr zu!uVxr>oVQdtofE-%JJkxp@pAZ8`C#IyRA<2{wOsBcjrdirdVY1q@E~P&7M$M*wW> z1>hz$V}g^nZMi9QfvJ!TloT4jBn6Nr%}Nh14PF3?cbY1_q^`K4n#`J69j7JGCnNi& zn{`%O<`SoJizmjN{JT;CSJq>jbzo5Nap2d}uYdRqpG}HwKTbsZ?E@Z_uX;V+R!#qk zUi;IDshe;KpNrX)COw>j+o!LG3AZgJn@x)xw|RcxiD~NuRlY5w!MvndGk*PdpQ^Q! zisHiZWp_?&8HXuwe^c@@bImFWoUW@}@mdCXj-@mz{ijm1uPos#ig~uM*YD3}~P1eQ>!Uj($ zX`zp5A3YMhsZL10mp&46!Q(kywHE!CTxc9G{&z~q;0Z4ZYUTl4`Ko}7Jg2=U<7Gb6 z6e;!fk+p7V&+t}hEsSlZF$zr4wv~^PD)MeisKKS_jWM7bN-fTyRr}Q?I{xe4uESZD zq5g%x^ys*`Xey6(r#DBtyED#;~vCAPu$Q5!nU6r{Qw17m%uk)%>$y&@gU+{*gxt0@kB z<%r|YCT8a&#?Lwx`j=i?p5BabcE!>>zz0`|yUdzW4cP!#{Nm|2_9be4L+1*YolmmtrFV;LbxiX;b(0Fl0q$$NZnu{jJ?#cqL0a>@cB!%cspR)gblZj5dDYH zsY^FJ_nWmX5_+t<0dJ_H4LBX1ZNy~R(_Hr?vIW)a6cHQ+c3fShG(2f?-wB=Yz4n-C zf@Ss#C9p9Sl0M;3iHq71P<(%GDiN-K>`yN5l z>e=yG3bFxOes^F>xGdS{G!mtbe2p8=n)h~#Tgh7UV3V8v{i?jC$q=LW=_l`S>Z3bj z+bl`*pg3|enU0sp$9Ej@Q^$WW%myqHBR}5xL#5O_QaCN^1`~hK6O|na{~0s89ICLr zJ6Ky0i44NC6$>wndfn&mu)U?9tsTfb@P}T+YtSA(SJN8^p8wlPYBRt*(Q{twu~5SC zX69RZ`GfnJmv(1Ta{*T_NP7GiI3lNONC2Oa#jTOE)Py-y2Lv|POFGh6Eh*^9mWvxP zWC?J*)M0dpTK)TYHwpO*U!HL<9auu2w$lvtlKcBK)7{PaBoYRXB~u!Ho9_&_3(W0r zLvj*m<7N4AjDJ7OLIx2yg2j+q1j4|NL|nqg$*=l52*EzC0}mVZTrT@t2-*WmF&<+#E29MzRd6k*o*cG z_Oq5ys-_I^p+^q{(pXPN`=4h0d!95hiT?#tJ=o95V9U;+4}ZqGc-i5ht$l5r4*y7= zY%nO@LJO|3yd-7~pe1X06OsK^94?~)q7Z-bX&l~6^)(tjYkiQK+L$`Wj<-O-Ay4A` zT+DZZxoV+-GFHi<-t}lpfC0q|L^1lN{GlJjOl799`mN;VpF$HFRF7(vcFoz}OZU7W z5n*BQC3S96kbLHVZYn(vMDnauutoZWh^7e*8HEV2j}%m_J9*yOa-{K&7a!N^EFZUa zB=$*PvS~$eCqOdX9(^yaP9mYdz7F)+?n=uN-W3fr{pUgP@x$+AmSR;Ypgb?Cgpl{| zzV;@U^-{EGo||Knk?QCDC3(pwO#VX72`#cpwClevat5k;`N=tOE2(oM+lG=DUWPpS zO0_z={dT29E>-5*2DJB(ltQUi@z2T)bBPg1m4?upP68KD29Le4ok1BG^oe7{ev z^efZhRXULUiIYetY8y0L1pHuQPpWe>m^0hgD?^V(&TLKPjDS=8B$I8)di;?>U#`%HUx*~Lunk$x zZKyJ5Hs37z1}DhEAnJp}b5mJkxHm3tCD~_C3EOxg`L%v)^&Bp2j|G5LhWGWs>eyQv zK&+lzk?GMZ?cRuzG@qxxgEB&|(q>BEO!rpOAj10%nJiC3T8o*i;+WY2@+p1tGB?`J zmpk29wP$V3Hq`TUpu(N;az4z@iH3-ldw!NN3g&RxD)N?6ydgOX))nAzEbUAsjyRh1 z-rYCl@1J4@_a1gsMglpAmK8TYBaB)iLHnpIX(c>^N^1s2Dnl?2>3`Y3 zwDO@zD?dn4+TA((*3G|Rtj2wlLg!qHl_;L_Mrr^BBcIu zS=@Tg#?xvl7l;XAu$sywzi0+;x@Hb3|Nh`zkGPjUz59+heddAX<3qB(-{ZNdIi&$zgooqZOWu%rk8|2P zWqRI=|BPDsH6hQS$OFc)lSL5QYo?kdnz0Fo+*>}E*n^)s+(FJ3rhQP!suhG zU^zktt7sDnI-dBXpMyohqyTLFRQTHG#M_Mbk>nW^G%0t+*hwa6D}VLiTWLuNM=KVkhd&KzPL59vSY-4EP%k=Lp$hF<1zc z9f5`Lca6Z-j;qmv%t8x^PLF#N5!7Qc(0Ya8kvefc%<@lm$X*^$GzDQTyNz0!M8idh zP9}SS`+$3f?i{Ml5w${NBiLTX!_3`d;wvk(kaEtwY_V3(5 z1Olp$>0-;l(|wgTen9>YrZCzO6*v*z<10B~&} za*p{mKk#bhHI&#=;A##VNYE<=;}@PC{c7mR7cILQG;j68@f%Ckv$Ai4dIVkg@eD;n zT)f)A9saBofh+y$LC3c&f6U=X3bi+=PKilmz)o}j^2s@lG$Fx8kH9eKHZj<-iOb}@ zR@?|a;}1C+yKH=s7c4IU;KgqWqX_>~p{hK#T;HDis z4E07!f))%)hLPK4!WyV85m>%d5hWkdVf_Fhmv41jIRae1A4xn>c7W4iRzTf02#BZ$w=kh+VO?)DMO%t3sTUwNYh#`aYJ#7Dde=Mg5hNd@*#=zAqqw$X)lE zZQ<*oV|)exTd`H>U&-npmWieDc&N=r^nGgZVUKG@^yK1}HD(qlFkJO+&1IbRgcDy= zhGt;d0JfUc&%(DGd+#Cz)59fefv6~;6<&-VYipEG&ZNjWl1d-Ck;&eM@*neLm0_aX z#ezB#?O1oqKw^$L{~h(#`#5*;H+V1sLXH4~?L0|YgqGjalcp~tx{%vU5$OxD+)Nxp zUg>}c_cD#1J<+VSlEduyUkr;IFk#1Co~O5sH{to@?kMy~CqY)`tRMHdfGajhrm?yG zPnqaG3$GYS<2DPv2+Vz8tNDc*h7uQxAYZ@4`4t6jNU&EC?tOd;)IwM^Ud~^@aobh# zK1eHXq2Fr%UN|D{?)?^DfOOaU0(tg(PO@rx6dNeH6G3gMQy+$f&%?$cus2p4Z^mii#PgK#Upt!5;rR3yJHhQeg;E7NafpPLRyAFsY!SR9K;xSb@Q z@BKvf8V>~jh6jWn3(j`OUWVLIaZ~>IlP@jKya)($p>R zrrpIWAOPVyzDrbw`HgSk!-ilX(MtMsvB9}ZOb47z$L0Uv)`TUW1^kO5=Qqbjx)&D( zWCfx_@X9^`B%n(FHct?U0qWaK^i~W*iD=swIT5Q^)M7l;n}y^ga;lPVrYc+Qnv-0+ zpC4(@;DXM&>2AJx4v%KcW!2L~VH;7r&tgi(ERQ6pbj|GExX;f_oxjGC1TyX67SpsY zh9+@79Bx6@AadEvn8By&R7C{~V*`N58{0E~@BL{ILL69VgPge^kKPjXgsBx>p=N3P zIB!kwVj7<~@mYFk`5>hxD%RBXLh-ye?M9ADV}5;*s=UZ_3hcM6y_7hP9f~aoYl{z_ z^&RF>d7$~aY5i*nvvv#)TmH@Sxk7A876<>AlD%NA-|inJ&ki>MB)S<#@Rno5AlZC3 z+wD-^lA*Hkw&PVVJLmwrC{IM1zA(?q6Hv>T!>5L)s!DerFEasG>Q$>|RBh37#OVMQ zM;L_Oc`4IjOtAAWewI4Jl4geu2YD+F_fNZdc+*w?4U5@WmifDr^S>pxW#=1ExpL#U z)wd>hmn$2nr=6P%DxtAiWZK{@{>Dpp^YgA0COA3rm?x{@>B*<>0M@k#T*0{v_gq{? zllwvC+v<(RZ8!uTAoX~mvFt}Z+7v(U(_B1NGP-qy$noSPl#VD#E@zzTjGGNi0A`2U zY;cJ{o)^AvTsh)7s9#+kHk!>8A(}}j6eq#G0N#a`$_P6Ns5%E7ipk)tvVCBd? z@u2tvE*(ra!~OG{n`$R%*jK+fbpT2)^>@0XoJ7h?kR(kL~z=$A-ck_Vwoh14A%<&P~6E#9J}-1#2Nt zs=cMiBW(fj+?xxE75@I$B9v5`sIVt4+!ik}QU~P~A#pd`+A|T_W}f#0Pu;S@hxa7K z9U!a!iR;C7E8o9bJq?4v*aRKw;}R$(ycto{k|aaV4S@C|xYQd?jcxh1mS$9YK_zV9P zM$FHG|b1yu#b^l%a^4Wk#bQGq5B-WIS zx@Qj%Q6uT1L%fr`78eN^zV3Z-d!Af4PiZ>L5nPx`YI?|nuy9wSV{dln$cVd{=fZNc zy2^#eHD+MfP3OOE!Ii(pLp(35#g$J@)fYKKxLy?r3rv z$+?^9Poz(QMG(fRcUOgBaLeVaKiIDjuO;OYB{@~{_T#Lq1_<=fLRCT5;O5XEi%CM} zNmNnxW&a3Sj8Y!4<$00A>L)FpU9Ve+nifwLBj)T?k10uHXq_{S%zU%}YM)_EIA|tJ zda2WaGVac%9;zUw=$3f#R$n5_8>>Ui+;H?1aO9?yfUn>C)J{qnoemAm*bp(SdHO=! zfomFUK{Cwm8Gf3F0$VNY}g4feoF}?kYMunO^gw84%6cSw2FZJ8Y zA~|fVE#aGekBq2C*q*!JmRYNCKB-ZiOv}Pt6j}R;cRDi*ur(g%m$(MjtiY}U?=TA4m zh$D)ktnYkU{HjQ@pTaDV7mDr_?XScRS7Zf1K`LI;(6(aI5zs`qTLD<39l4 zu=-xl$-{Sel>*?)7tf|M*%!RT#(A_o_LMO@3w!%+S4+d8r-L*0!&@ZSSoncoLRciW zgv>h1lMnT>>VfWNMc0@m$-sj6`m$$jJ$d%;Y9ikVi}|uS!@YYpE>|-9ue3I|oaMf( zK{pSIgl{0u5LWE;WUriG2wJv|IY?B+3~()E|2@zb*RR5fvhJqKNq_%tOw&srGjsyH zc1k)+k2YoUUw1=GRGFU-=)(1N)-P~qcwy74td#_bQZ~l2BZVN4L5@Qr}Y{rh| za*o!e@1+l6pD$4z8-3(iYd_}IzwhZJ%mn(FTRZq?LUVZM)Dvna)ZW#13RX;^G6cv> z%=`UO)Dw$^AY`J9P9x~yjm5$C7;tveku{x*SVat|?P-u`z|pZOmupa4@(M}pNZ-(1 zOo6Pzv}jt;eB_xrfB?P}>Ung_=^gE^4D#ct={X-1jb*^UoUNbUm_b^i-(jfUnnpk0 z?XbtKA~5eMy$5NRuP6J>9#E3~joVMI=K*(k7n?~%RA_g?yP!R|L?G+mRh%R!w zFd9^%ZA~CE9C}qD+~V#{fGwNU#KPNeul&PIT@TQp{!i!fSzWgTd;jeK543en^mdw> ztAXR>1ITRV(SpiwdD9HnIX_CD@od`dOm|@96Crf)ocr_kUWufHjCoJYGA6WZ(2ix7Y_>NeNJSHVJ9aa@dJ9 zkV(1LhgShVq#{)5TkI^cb0~aXo54Y}1&!FfwVdry80$-X zaEmG7(FILxjYIafVNz=vucg{Bwi2avqP{>m5^V;4-EUqv$nEIFcKdhx^Hp^^yIW4e zH{uec_io-lrC#~%j5wY$~vKssP4$1s636$MKATvp1Vw&&wX(5*xIpU%91oqY}>bJS!I^Wr-^z~6YhVD8|oR!hjXCN;Sz5h4JKz_Js zX>v|>cfFa?)n)1MMj+}$FkMjKZ^)#y7zQz*r&jjW-)V8Tt$bSt0*sFfw{G7q=sGNI z*S;rw_gJ{C$|Jn(!>U=_n6OhTzQy1bnr~6qg^ZWy-Sw&4yzUH%lr~b9B|v6mhVU%$ zd~o-sxvBn`12o?Zoa2EI{j|+I9yblWlgm8OsM&QOAuBNJ{Pwi%gxgoYB5G%&++=kQ zL7gBCZXro(0Uq)jetYpi7o8d3@+*N847zXQT;#1|TJZ)GxK5P1q&>CU>dtANU!%gT z9S1q_%^V>12zK0(8PNmuTsJ2BjDpHr1HUWmv z7&Pa9KfX2DDa;W}`vA%of?cu~amH1e)%d`hB~4W>HH{0(hh<5)7N>;(j@=xYGm|<5 ztSLkBlTRSM_C;T(&&t!{w2zEfZDEr#5$09ZmHh;Jd2ysI$e<2ll)q|<>Woao>I9OO zY3*5_>=&981f%?3=-ga{BOG6W@oeyBuMg?PMF&0pb-x>##-$DRKyGlcf^G9)Pr%Q& zA79^>ELD9DWC?1TCJz~Qnm;!c z`kCHi%e>q#qY37{I{nk0qCel{Z>7(xjbowm160F7Insff6^dyMw?`&&tAbx3XSnl# zsWD2uZg=C|WGZJQR#p968>8Ayg~*^$k%7FQqJMmxs53UbPT{eVBQr}$t>`#7sD(|T z19xqY{CGOYh_EtL5hcZ*7n;N*1gps+{F2v`lPF`VO!5-rMcOPMF*}*}dbwNSoa)Zv z8tAv^3*89rpe&N~btYBE?_MkYWJaVUtQPUEvR!55Bv6|IEMV)ogkuvvO+*r8;wrUmj^}nDq7{4&@p#ryD z#>ThpNGmlVh5?Do+9ZV0ua-&VofLG$-zl4>UWwsq*6XPqjR_BKpJ}%CJO;jYOpd0$ z`4?#r#O|*O6yd}9XpHBc;-amqS8kC|Z10~b95&YIHKvF!hC7f-BMwm0TsB?VvFz{F zAbkwakJhUHff7U6gV4ptXQQG%twWgsE(Z$PtYROZqv+$bp`Tr(eN!d#dlf|6)Exwf zO>cfl$cUqyg!7wH$)o6zSG;UkMaJ?}5`tHNw0WwCRbwSjr2#kdXB0dSex-W9vb~A2 z)(g=lu&5A5Z0{Ps6;~(CKGBMpcl|psTsi7kF_(YHr+L(EQxvN>*^p9hZ#a}18mKu# zxMuudEket1m;LZ?;KZtDV|Z|-Vj{_PA7w>_>E&{JbdJM@u?)u~&v1 zzvxEJoBPYHn*nqX_7o}gY-57C@)5*`zw_AXF=W=0`E9gQ<0YGZ zYT0R{DM=Zhf$^HeaSxN3V==4ZrqkGCmpLCLBVM$V5a6W`t&Y7B7&5i3;orD)%$16^ zt4?7HGCoKh{V;=XR|a9lt>pOsB|JgMynqbn^SJ$3sPQ1h>4Km6Wt-xG%1$4nVXBX- zC#_K$I|_VZ&^wQROe$n@y&tq3%tKsk84B#4*jB5y04_(N_nfW3lGX(4`(*1c4SD~}%Y7U1wWyu8XFtwgPDGwMCY}aNv+2*(G(5Ow$OzpIU>=p+^5A?^UK8V4 zVr>@g`B~-C^3`R6c;9_vQ_&7at8-pOc5UFLizkxNSV?p8)t%E!S3h=V7ctKR6VPCs zU8dts(B|P*UBIN^?oZpDQfXB%m*K1iZlwwyvgX_L-wqA%J&(IF=fi>9Mh%~@j(s!Y z88KefKv%B`L@>x{%nI#)plTrnZgM%tOxTX05ozH9@RrJ>JxgXp<{!f;Cq{6u2f(PP zM;^y9`}!bwh*a$$*H;uCmfvxjn_5I$9PN<~D)B`NabSGJWIyjHw6{tKC4AB9eur5q z(AibLp)XC!%WX|nz}~%Y_eh{!sYnnm91i`1Zql)1~y(X3T?; zPfsuQZK493QxmUgz_)x(f@=vQTcdMY&q5!xW3Qaqu~v_;*|qJ+#3_ zkPq64IpCmZDOu58TaI+vTi(QBRK3zj!uJx3{ymI4`++$9p90eTAH~-};|}ikUf>ZF z1@+2yS`KWf!o4?_Ye^66^*TI1JBwmZOuip*kjk{Awiw^V-foDsaA#Up zA5|5+I4GKMA*lJwH53?A@%1`%|Dqmr5<^%@##dII=EoHJVWoa!(UMd~SxrU65;{PN zSRznaK;PE~wfTCICom(fXYC{)AL$WMuJ$BwnTk_B(8JPdO#pO!nzsfL`fK7!paGX* z2=&xZy2gu89l~uGHoNE4s8`9PlVG+JW!$Zu;!v27d`I_-@sox6-p%Ie-<+E=wIpZ( zt*m<1@gE1Ssdy~F{;uK={G8d>47`5nb}yH$02>L}M-7?q5{Z08m3MkNp2h0Z zakST*rgZw4BPR{Gqvj7EJCw@BXZqT2y+;Wg>>L^~N_{33kzf9GsV0n}*clNehvD!R ziChyUNGVwh#{jOAS$C-c=pCV{4R2zbmFT`P1iu%e3d=eW zM^Zb0Jsndg$T7~kD4nyEv#{M}x&42l2Vst}-2=$SR0)W~*nPIK-Wi7x`h38HgAuV= z+xSF;RZXDecd`Cj;2=Zd$<$Nu5L15jSGR<%=ac=~$`mry$qa=2Vkuo$Ok$4BfepD5; K6u!z?y#GH(?tota