From cdcd4fc06e43187fcd818a0882e6c666d65aa224 Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Mon, 3 Mar 2025 14:19:30 -0800 Subject: [PATCH 1/6] Generalized options menu Options menu can be overlayed on other screens Remap can be access from options Input should still be consistently navigable with arrow keys --- Globals/BgAudioPlayer.cs | 1 + Globals/StageProducer.cs | 6 -- Globals/translations.cn.translation | Bin 2753 -> 2765 bytes Globals/translations.csv | 3 +- Globals/translations.en.translation | Bin 2546 -> 2562 bytes default_bus_layout.tres | 3 + scenes/Options/OptionsMenu.cs | 81 ++++++++++++++ scenes/Options/OptionsMenu.tscn | 99 +++++++++++++++--- scenes/Remapping/ControlSettings.cs | 30 ++++++ scenes/Remapping/Remap.tscn | 15 ++- scenes/SceneTransitions/TitleScreen.tscn | 8 +- .../SceneTransitions/scripts/TitleScreen.cs | 20 ++++ scenes/UI/Pause.tscn | 20 ++-- scenes/UI/scripts/PauseMenu.cs | 21 +++- 14 files changed, 267 insertions(+), 40 deletions(-) create mode 100644 default_bus_layout.tres create mode 100644 scenes/Options/OptionsMenu.cs diff --git a/Globals/BgAudioPlayer.cs b/Globals/BgAudioPlayer.cs index 95fae32a..35f17e75 100644 --- a/Globals/BgAudioPlayer.cs +++ b/Globals/BgAudioPlayer.cs @@ -7,6 +7,7 @@ public partial class BgAudioPlayer : AudioStreamPlayer private void PlayMusic(AudioStream music, float volume) { + ProcessMode = ProcessModeEnum.Always; if (Playing && music.Equals(Stream)) { return; diff --git a/Globals/StageProducer.cs b/Globals/StageProducer.cs index b2578a9b..c8965570 100644 --- a/Globals/StageProducer.cs +++ b/Globals/StageProducer.cs @@ -63,12 +63,6 @@ public void TransitionStage(Stages nextStage, int nextRoomIdx = -1) Config = MakeConfig(nextStage, nextRoomIdx); GetTree().ChangeSceneToFile("res://scenes/BattleDirector/test_battle_scene.tscn"); break; - case Stages.Controls: - GetTree().ChangeSceneToFile("res://scenes/Remapping/Remap.tscn"); - break; - case Stages.Options: - GetTree().ChangeSceneToFile("res://scenes/Options/OptionsMenu.tscn"); - break; case Stages.Chest: Config = MakeConfig(nextStage, nextRoomIdx); GetTree().ChangeSceneToFile("res://scenes/ChestScene/ChestScene.tscn"); diff --git a/Globals/translations.cn.translation b/Globals/translations.cn.translation index 73c6810dc4af07d87c019f06a6a0ea7df8d117a5..a976314c29d896bfe2b9f99d9709b3fe3ae90207 100644 GIT binary patch delta 790 zcmX>odRBCUG$U(uTO7^bF?g>C8P$#Kl$n)87&>`?qV z_|1)9KqZnuJ_y597seY--8Xq2v$$k4P?Q&nVY0Q48OwK1J_nRdWMW_t1ImIhOjbwW z+QyTU|1s+`ex0nxqAuA0lt4GZvixOU%j7&3aY<01ib65Wgqg34{v4V-k42pE?c{AN z>W-&@5=uZdAPlq+Y}12jpI)T^*<4V}yXMCmU1o&OU}pU@@@(;#%*QIuC_Gt>)t#|- zavrO=<_w@NSQx-ewBfwoUxOqb#&yXjYVtZ(bxAd#5)+^d2*b>cV>=XeVe&gxX;!c~ zllj=>8D%HyvFQtj0+nb3Rf6!&Uz>tfPR?UfXB3z`jZI%t4T}pmzMjJMWb!>WamiAk z4w$Q8_S|#1pvp9vk6m1|9Ow#IIKtfQYxVOcCr~L&S0(eCY4Vf(*u_OB0L|inVm2Tx g55y*utJupo|6rdQfzOG$X4;ajv1^W(7uB#`+cp28J#m{tpBbpfrdL0@Hx}IY7J!D!u|ueiM+t z2P$?5NS}bRF9GQrK>P^Ge*>iLQF_-nElv%cgzptt}O!_+jgur1v)IgVLe6Xbk$D1IIM<_0qp z1A`=x55h3jh4F?{k58V*EH2pt6y=3tm~8E1#_}VR&jDq#fO^G%vLFnT)e*S1@zUgf z%=(P~ChM`NOLhV!&`q!`f0@@iIgdqLay?L|C=|m?nEATs&*{nYSi~8>P2R?$Zg>SK zp#)R|!Z0-trhR&q0_1Z+F--iQk!MTbWI0xGMw!WGtnQ4{CfBiwYc2$;g83QfWUwhV zoY(tXk;KEeF8L%+-p8sgsSi|Q0+az^n7MImhoWvy{>LiK3J%%Ha%}R9YLo5Q^abO9 zO0sfRvZmdb>_2$YbXinIqakPHf;cEJ#m3YqDD-Fsnhm>=if^Z%c7?%Y}0cscT< zf!U{zp6kty#aNhK95M{!I`Huft0>pe}?^p%DqK=r`9uwb6`R3 zf2pYJWLz%icKa)9#1J!#bs!9+F@m@W*zm=`7Oe5EQg}4MCTTGwSQ|NJ%6*UgdWH5} zviN<24w@oCP#i_Eqcl4NOEvcOK)cUmw%+KXyeZs4WH*3tK)vvdG)JYUnL8%F- zE!8uluW8Xtu~~{*akmv7*+Ker|F+zZ{yEB6!j+d>tI+DL;=syt%3Fe+r-xR2*Kr6D zcs7F&kiM@YOFz31^>r}RO3APTqLGZpubn2x_#T<&))-8 zgJx;uFzs|i?Nwwe6dW-Ma&*!;!PCdGX9xPn795Y&d+o^=hS$mKn)DU|Ns9y=l!_dP^_PB zV%CM!<$V|DnpqvYIihLW7}&;jS5~nWR|fqf@I>lU75*&xMX4>JF3a@_>MHmq`@F2B zsips7N$c9)tS~+FCet(@5YYf?2w2dY1z6+vpBFFRuq+jH&W?~{#N9RM)e@DtW!leb zsK?;3$8a1;E}35)M0wl*pYp97e@CyZ zs5=dN2b>5HNx?aL>CAg7SWQ+vI!=B&tTRS??6zP8z6)_TnBSUB=sI1ocd_3zVaMHm z9H-v4nl+Of_jS@2o4Z5UQt5s^oQ>qj@9@|sY*5dq?)pUMpS53QyM~N>CPh6CZ@dS! tN@Ami!8N+>q=H^TH!|t--pTlB%}efV>G0+@9FO6XinGOCC6b9l{{YX#$~*u7 diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 00000000..8642299c --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,3 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://du4webutvd0f2"] + +[resource] diff --git a/scenes/Options/OptionsMenu.cs b/scenes/Options/OptionsMenu.cs new file mode 100644 index 00000000..9353a21c --- /dev/null +++ b/scenes/Options/OptionsMenu.cs @@ -0,0 +1,81 @@ +using System; +using Godot; + +public partial class OptionsMenu : CanvasLayer +{ + private Node _previousScene; + + [Export] + private Control _focused; + private ProcessModeEnum _previousProcessMode; + + [Export] + private HSlider _volumeSlider; + + [Export] + private Button _closeButton; + + [Export] + private Button _controlsButton; + + public override void _Ready() + { + _focused.GrabFocus(); + _volumeSlider.Value = AudioServer.GetBusVolumeDb(AudioServer.GetBusIndex("Master")) + 80; + _volumeSlider.DragEnded += ChangeVolume; + _closeButton.Pressed += CloseMenu; + _controlsButton.Pressed += OpenControls; + } + + public override void _Process(double delta) //TODO: Better method for returning focus + { + if (GetViewport().GuiGetFocusOwner() == null) + { + _focused.GrabFocus(); + } + } + + public override void _Input(InputEvent @event) + { + if (@event.IsActionPressed("Pause")) + { + CloseMenu(); + GetViewport().SetInputAsHandled(); + } + } + + public void OpenMenu(Node prevScene) + { + _previousScene = prevScene; + _previousProcessMode = _previousScene.GetProcessMode(); + prevScene.ProcessMode = ProcessModeEnum.Disabled; + } + + private void CloseMenu() + { + _previousScene.ProcessMode = _previousProcessMode; + QueueFree(); + } + + private void OpenControls() + { + ControlSettings controlSettings = GD.Load("res://scenes/Remapping/Remap.tscn") + .Instantiate(); + AddChild(controlSettings); + controlSettings.OpenMenu(this); + } + + private void ChangeVolume(bool valueChanged) + { + if (!valueChanged) + return; + AudioServer.SetBusVolumeDb( + AudioServer.GetBusIndex("Master"), + (float)_volumeSlider.Value - 80 + ); + AudioServer.SetBusMute( + AudioServer.GetBusIndex("Master"), + _volumeSlider.Value == _volumeSlider.MinValue + ); + } +} diff --git a/scenes/Options/OptionsMenu.tscn b/scenes/Options/OptionsMenu.tscn index 32c68a8f..65c372d8 100644 --- a/scenes/Options/OptionsMenu.tscn +++ b/scenes/Options/OptionsMenu.tscn @@ -1,32 +1,97 @@ [gd_scene load_steps=3 format=3 uid="uid://buejv62lwtymc"] [ext_resource type="Script" path="res://scenes/Options/scripts/LanguageSelection.cs" id="1_qyvkw"] -[ext_resource type="Script" path="res://scenes/SceneTransitions/scripts/SceneChange.cs" id="2_3o1oo"] +[ext_resource type="Script" path="res://scenes/Options/OptionsMenu.cs" id="1_yjq7i"] -[node name="OptionsMenu" type="Node2D"] +[node name="OptionsMenu" type="CanvasLayer" node_paths=PackedStringArray("_focused", "_volumeSlider", "_closeButton", "_controlsButton")] +process_mode = 3 +script = ExtResource("1_yjq7i") +_focused = NodePath("Control/CenterContainer/MarginContainer/VBoxContainer/LanguageSelection") +_volumeSlider = NodePath("Control/CenterContainer/MarginContainer/VBoxContainer/Container/Volume") +_closeButton = NodePath("Control/CenterContainer/MarginContainer/VBoxContainer/TitleButton") +_controlsButton = NodePath("Control/CenterContainer/MarginContainer/VBoxContainer/ControlsButton") -[node name="Title" type="Label" parent="."] -offset_top = 9.0 -offset_right = 642.0 -offset_bottom = 32.0 +[node name="Control" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ColorRect" type="ColorRect" parent="Control"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.133, 0.133, 0.133, 1) + +[node name="CenterContainer" type="CenterContainer" parent="Control"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="MarginContainer" type="MarginContainer" parent="Control/CenterContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 5 + +[node name="ColorRect" type="ColorRect" parent="Control/CenterContainer/MarginContainer"] +layout_mode = 2 +color = Color(0.24, 0.24, 0.24, 0.854902) + +[node name="VBoxContainer" type="VBoxContainer" parent="Control/CenterContainer/MarginContainer"] +custom_minimum_size = Vector2(240, 0) +layout_mode = 2 +size_flags_horizontal = 0 +theme_override_constants/separation = 25 +alignment = 1 + +[node name="Title" type="Label" parent="Control/CenterContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 text = "TITLE_OPTIONS" horizontal_alignment = 1 -[node name="LanguageSelection" type="OptionButton" parent="."] -offset_left = 225.0 -offset_top = 122.0 -offset_right = 451.0 -offset_bottom = 159.0 +[node name="HSeparator" type="HSeparator" parent="Control/CenterContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Container" type="VBoxContainer" parent="Control/CenterContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 0 + +[node name="Label" type="Label" parent="Control/CenterContainer/MarginContainer/VBoxContainer/Container"] +layout_mode = 2 +text = "OPTIONS_VOLUME_LABEL" +horizontal_alignment = 1 + +[node name="Volume" type="HSlider" parent="Control/CenterContainer/MarginContainer/VBoxContainer/Container"] +layout_mode = 2 +tooltip_text = "OPTIONS_VOLUME_LABEL" +min_value = 50.0 +max_value = 80.0 +value = 60.0 + +[node name="LanguageSelection" type="OptionButton" parent="Control/CenterContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 item_count = 2 popup/item_0/text = "English" popup/item_1/text = "中文" popup/item_1/id = 1 script = ExtResource("1_qyvkw") -[node name="TitleButton" type="Button" parent="."] -offset_left = 232.0 -offset_top = 320.0 -offset_right = 408.0 -offset_bottom = 351.0 +[node name="ControlsButton" type="Button" parent="Control/CenterContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "TITLE_CONTROLS" + +[node name="TitleButton" type="Button" parent="Control/CenterContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 text = "CONTROLS_RETURN_BUTTON" -script = ExtResource("2_3o1oo") diff --git a/scenes/Remapping/ControlSettings.cs b/scenes/Remapping/ControlSettings.cs index f35dcacc..08c3dfc5 100644 --- a/scenes/Remapping/ControlSettings.cs +++ b/scenes/Remapping/ControlSettings.cs @@ -15,6 +15,12 @@ public partial class ControlSettings : Node2D [Export] public Sprite2D downKey; + private Node _previousScene; + private ProcessModeEnum _previousProcessMode; + + [Export] + private Button _closeButton; + public override void _Ready() { GetNode