feat: Implement powerup inventory UI, settings menu, and foundational managers for input and game settings.

This commit is contained in:
Yogi Wiguna
2026-03-10 12:52:53 +08:00
parent da7192ac07
commit e1e928389c
12 changed files with 723 additions and 98 deletions
+26 -1
View File
@@ -6,6 +6,7 @@ extends Control
@onready var create_room_btn = $MainMenuPanel/VBoxContainer/ButtonSection/CreateRoomBtn
@onready var browse_rooms_btn = $MainMenuPanel/VBoxContainer/ButtonSection/BrowseRoomsBtn
@onready var main_menu_profile_btn = $MainMenuPanel/VBoxContainer/ButtonSection/ProfileBtn
@onready var lobby_settings_btn = $MainMenuPanel/VBoxContainer/ButtonSection/SettingsBtn
# UI References - Server Selection
@onready var server_option = $MainMenuPanel/VBoxContainer/ServerSelectionSection/ServerOption
@@ -34,6 +35,7 @@ extends Control
@onready var copy_id_btn = $LobbyPanel/TopBar/MatchIdContainer/CopyIdBtn
@onready var duration_option = $LobbyPanel/TopBar/SettingsSection/DurationOption
@onready var duration_text_label = $LobbyPanel/TopBar/SettingsSection/DurationTextLabel
@onready var lobby_top_settings_btn = $LobbyPanel/TopBar/ProfileSection/LobbySettingsBtn
@onready var random_spawn_check = $LobbyPanel/TopBar/SettingsSection/RandomSpawnCheck
@onready var random_spawn_label = $LobbyPanel/TopBar/SettingsSection/RandomSpawnLabel
@onready var enable_timer_check = $LobbyPanel/TopBar/SettingsSection/EnableTimerCheck
@@ -114,6 +116,8 @@ func _ready():
browse_rooms_btn.pressed.connect(_on_browse_rooms_pressed)
if main_menu_profile_btn:
main_menu_profile_btn.pressed.connect(_on_profile_btn_pressed)
if lobby_settings_btn:
lobby_settings_btn.pressed.connect(_on_settings_pressed)
# Connect Server Selection signals
if server_option:
@@ -133,7 +137,10 @@ func _ready():
# Connect button signals - Lobby
profile_btn.pressed.connect(_on_profile_btn_pressed)
logout_btn.pressed.connect(_on_logout_pressed)
if logout_btn:
logout_btn.pressed.connect(_on_logout_pressed)
if lobby_top_settings_btn:
lobby_top_settings_btn.pressed.connect(_on_settings_pressed)
copy_id_btn.pressed.connect(_on_copy_id_pressed)
duration_option.item_selected.connect(_on_duration_selected)
random_spawn_check.toggled.connect(_on_random_spawn_toggled)
@@ -406,6 +413,24 @@ func _on_logout_pressed() -> void:
AuthManager.logout()
_go_to_login()
func _on_settings_pressed():
var settings_menu = get_node_or_null("SettingsMenu")
if not settings_menu:
var scene = load("res://scenes/ui/settings_menu.tscn")
if scene:
settings_menu = scene.instantiate()
settings_menu.name = "SettingsMenu"
add_child(settings_menu)
# Connect close button
var close_btn = settings_menu.get_node_or_null("PanelContainer/VBoxContainer/Header/CloseButton")
if close_btn:
# settings_menu.gd handles basic visibility, but we can override or add to it
pass
if settings_menu:
settings_menu.open()
func _go_to_login() -> void:
if get_tree():
get_tree().change_scene_to_file("res://scenes/ui/login_screen.tscn")
+13
View File
@@ -138,6 +138,12 @@ layout_mode = 2
theme_override_font_sizes/font_size = 16
text = "BROWSE ROOMS"
[node name="SettingsBtn" type="Button" parent="MainMenuPanel/VBoxContainer/ButtonSection" unique_id=123456789]
custom_minimum_size = Vector2(0, 48)
layout_mode = 2
theme_override_font_sizes/font_size = 16
text = "SETTINGS"
[node name="ProfileBtn" type="Button" parent="MainMenuPanel/VBoxContainer/ButtonSection" unique_id=1640960506]
custom_minimum_size = Vector2(0, 36)
layout_mode = 2
@@ -287,6 +293,13 @@ theme_override_fonts/font = ExtResource("5_pc087")
theme_override_font_sizes/font_size = 11
text = "Logout"
[node name="LobbySettingsBtn" type="Button" parent="LobbyPanel/TopBar/ProfileSection" unique_id=987654321]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
theme_override_fonts/font = ExtResource("5_pc087")
theme_override_font_sizes/font_size = 14
text = "⚙"
[node name="Spacer" type="Control" parent="LobbyPanel/TopBar" unique_id=379952578]
layout_mode = 2
size_flags_horizontal = 3
+33 -17
View File
@@ -60,6 +60,20 @@ func _ready():
# Setup global multiplayer spawners (Stands, etc.)
_setup_multiplayer_spawners()
# Connect HUD Settings button to pause menu toggle
var hud_settings = get_node_or_null("TouchControls/TouchControls/SettingsBtn")
if hud_settings:
if hud_settings.pressed.is_connected(_toggle_pause_menu):
hud_settings.pressed.disconnect(_toggle_pause_menu)
hud_settings.pressed.connect(_toggle_pause_menu)
# Programmatically connect Pause Menu Settings button to ensure it works
var pause_settings = get_node_or_null("PauseMenu/Panel/VBox/SettingsBtn")
if pause_settings:
if pause_settings.pressed.is_connected(_on_settings_pressed):
pause_settings.pressed.disconnect(_on_settings_pressed)
pause_settings.pressed.connect(_on_settings_pressed)
func _setup_multiplayer_spawners():
# Setup MultiplayerSpawner for Static Tekton Stands
@@ -2317,24 +2331,26 @@ func _on_how_to_play_back_pressed():
func _on_settings_pressed():
var pause_menu = get_node_or_null("PauseMenu")
var settings_panel = get_node_or_null("SettingsPanel")
if pause_menu:
pause_menu.visible = false
if settings_panel:
settings_panel.visible = true
# Sync settings UI with current state
var joystick_toggle = settings_panel.get_node_or_null("Panel/VBox/JoystickToggle")
if joystick_toggle and touch_controls:
joystick_toggle.set_pressed_no_signal(touch_controls.joystick_enabled)
var settings_menu = get_node_or_null("SettingsMenu")
if not settings_menu:
var scene = load("res://scenes/ui/settings_menu.tscn")
if scene:
settings_menu = scene.instantiate()
settings_menu.name = "SettingsMenu"
add_child(settings_menu)
var size_slider = settings_panel.get_node_or_null("Panel/VBox/ButtonSizeRow/ButtonSizeSlider")
if size_slider and touch_controls:
size_slider.set_value_no_signal(touch_controls.button_size)
var opacity_slider = settings_panel.get_node_or_null("Panel/VBox/OpacityRow/OpacitySlider")
if opacity_slider and touch_controls:
opacity_slider.set_value_no_signal(touch_controls.button_opacity)
# Connect close button
var close_btn = settings_menu.get_node_or_null("PanelContainer/VBoxContainer/Header/CloseButton")
if close_btn:
if close_btn.pressed.is_connected(_on_settings_back_pressed):
close_btn.pressed.disconnect(_on_settings_back_pressed)
close_btn.pressed.connect(_on_settings_back_pressed)
if settings_menu:
settings_menu.open()
func _on_quit_match_pressed():
get_tree().paused = false # Ensure unpaused when returning to menu
@@ -2345,9 +2361,9 @@ func _on_quit_match_pressed():
func _on_settings_back_pressed():
var pause_menu = get_node_or_null("PauseMenu")
var settings_panel = get_node_or_null("SettingsPanel")
if settings_panel:
settings_panel.visible = false
var settings_menu = get_node_or_null("SettingsMenu")
if settings_menu:
settings_menu.visible = false
if pause_menu:
pause_menu.visible = true
+322
View File
@@ -0,0 +1,322 @@
[gd_scene format=3 uid="uid://b1two2tvv5prx"]
[ext_resource type="Script" uid="uid://cdege6m8u5cp" path="res://scripts/ui/settings_menu.gd" id="1_script"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bg"]
bg_color = Color(0.05, 0.05, 0.08, 0.85)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.2, 0.8, 1, 0.5)
corner_radius_top_left = 20
corner_radius_top_right = 20
corner_radius_bottom_right = 20
corner_radius_bottom_left = 20
shadow_color = Color(0, 0, 0, 0.5)
shadow_size = 20
[sub_resource type="LabelSettings" id="LabelSettings_title"]
font_size = 32
font_color = Color(0.2, 0.9, 1, 1)
outline_size = 8
outline_color = Color(0, 0, 0, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_tab_bg"]
content_margin_left = 20.0
content_margin_top = 20.0
content_margin_right = 20.0
content_margin_bottom = 20.0
bg_color = Color(0.1, 0.1, 0.15, 0.6)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[sub_resource type="LabelSettings" id="LabelSettings_heading"]
font_size = 24
font_color = Color(0.9, 0.9, 0.9, 1)
[node name="SettingsMenu" type="CanvasLayer" unique_id=1319114632]
layer = 100
script = ExtResource("1_script")
[node name="ColorRect" type="ColorRect" parent="." unique_id=1754757020]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 0.4)
[node name="PanelContainer" type="PanelContainer" parent="." unique_id=1635225045]
custom_minimum_size = Vector2(800, 600)
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -400.0
offset_top = -300.0
offset_right = 400.0
offset_bottom = 300.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_bg")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer" unique_id=1608766484]
layout_mode = 2
theme_override_constants/separation = 20
[node name="Header" type="HBoxContainer" parent="PanelContainer/VBoxContainer" unique_id=1476625293]
custom_minimum_size = Vector2(0, 80)
layout_mode = 2
theme_override_constants/separation = 20
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/VBoxContainer/Header" unique_id=22122987]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/margin_left = 30
[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Header/MarginContainer" unique_id=1831070364]
layout_mode = 2
text = "SYSTEM SETTINGS"
label_settings = SubResource("LabelSettings_title")
[node name="CloseButton" type="Button" parent="PanelContainer/VBoxContainer/Header" unique_id=1345773906]
custom_minimum_size = Vector2(60, 60)
layout_mode = 2
size_flags_vertical = 4
theme_override_font_sizes/font_size = 32
text = "X"
flat = true
[node name="ContentSection" type="MarginContainer" parent="PanelContainer/VBoxContainer" unique_id=1702280876]
layout_mode = 2
size_flags_vertical = 3
theme_override_constants/margin_left = 20
theme_override_constants/margin_top = 0
theme_override_constants/margin_right = 20
theme_override_constants/margin_bottom = 30
[node name="TabContainer" type="TabContainer" parent="PanelContainer/VBoxContainer/ContentSection" unique_id=1795678842]
layout_mode = 2
theme_override_constants/side_margin = 20
theme_override_styles/panel = SubResource("StyleBoxFlat_tab_bg")
current_tab = 0
[node name="Video" type="ScrollContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer" unique_id=964480166]
layout_mode = 2
metadata/_tab_index = 0
[node name="VBox" type="VBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Video" unique_id=1271648419]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 15
[node name="Fullscreen" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Video/VBox" unique_id=683482011]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Video/VBox/Fullscreen" unique_id=2085318401]
layout_mode = 2
size_flags_horizontal = 3
text = "Fullscreen Mode"
label_settings = SubResource("LabelSettings_heading")
[node name="FullscreenToggle" type="CheckButton" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Video/VBox/Fullscreen" unique_id=1955016407]
unique_name_in_owner = true
layout_mode = 2
[node name="VSync" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Video/VBox" unique_id=1497653967]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Video/VBox/VSync" unique_id=76372424]
layout_mode = 2
size_flags_horizontal = 3
text = "V-Sync"
label_settings = SubResource("LabelSettings_heading")
[node name="VSyncToggle" type="CheckButton" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Video/VBox/VSync" unique_id=412645188]
unique_name_in_owner = true
layout_mode = 2
[node name="Audio" type="VBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer" unique_id=1585166620]
visible = false
layout_mode = 2
theme_override_constants/separation = 20
metadata/_tab_index = 1
[node name="Master" type="VBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Audio" unique_id=2083739941]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Audio/Master" unique_id=526445980]
layout_mode = 2
text = "Master Volume"
label_settings = SubResource("LabelSettings_heading")
[node name="MasterSlider" type="HSlider" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Audio/Master" unique_id=1787962533]
unique_name_in_owner = true
layout_mode = 2
max_value = 1.0
step = 0.05
value = 0.8
[node name="Music" type="VBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Audio" unique_id=81064625]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Audio/Music" unique_id=1985407106]
layout_mode = 2
text = "Music Volume"
label_settings = SubResource("LabelSettings_heading")
[node name="MusicSlider" type="HSlider" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Audio/Music" unique_id=750703557]
unique_name_in_owner = true
layout_mode = 2
max_value = 1.0
step = 0.05
value = 0.7
[node name="SFX" type="VBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Audio" unique_id=1147135370]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Audio/SFX" unique_id=1539898557]
layout_mode = 2
text = "SFX Volume"
label_settings = SubResource("LabelSettings_heading")
[node name="SFXSlider" type="HSlider" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Audio/SFX" unique_id=1301108449]
unique_name_in_owner = true
layout_mode = 2
max_value = 1.0
step = 0.05
value = 0.9
[node name="Controls" type="ScrollContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer" unique_id=1553036843]
visible = false
layout_mode = 2
metadata/_tab_index = 2
[node name="VBox" type="VBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls" unique_id=1592525164]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 10
[node name="P1" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox" unique_id=2065564199]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/P1" unique_id=85468293]
layout_mode = 2
size_flags_horizontal = 3
text = "PowerUp 1 (Speed)"
label_settings = SubResource("LabelSettings_heading")
[node name="Powerup1Btn" type="Button" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/P1" unique_id=643351652]
unique_name_in_owner = true
custom_minimum_size = Vector2(150, 40)
layout_mode = 2
text = "1"
[node name="P2" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox" unique_id=1529813635]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/P2" unique_id=1645306219]
layout_mode = 2
size_flags_horizontal = 3
text = "PowerUp 2 (Freeze)"
label_settings = SubResource("LabelSettings_heading")
[node name="Powerup2Btn" type="Button" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/P2" unique_id=937262208]
unique_name_in_owner = true
custom_minimum_size = Vector2(150, 40)
layout_mode = 2
text = "2"
[node name="P3" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox" unique_id=69920143]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/P3" unique_id=448782584]
layout_mode = 2
size_flags_horizontal = 3
text = "PowerUp 3 (Wall)"
label_settings = SubResource("LabelSettings_heading")
[node name="Powerup3Btn" type="Button" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/P3" unique_id=1817070904]
unique_name_in_owner = true
custom_minimum_size = Vector2(150, 40)
layout_mode = 2
text = "3"
[node name="P4" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox" unique_id=559680686]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/P4" unique_id=1049586584]
layout_mode = 2
size_flags_horizontal = 3
text = "PowerUp 4 (Ghost)"
label_settings = SubResource("LabelSettings_heading")
[node name="Powerup4Btn" type="Button" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/P4" unique_id=1027617123]
unique_name_in_owner = true
custom_minimum_size = Vector2(150, 40)
layout_mode = 2
text = "4"
[node name="Attack" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox" unique_id=1722218076]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/Attack" unique_id=1040943113]
layout_mode = 2
size_flags_horizontal = 3
text = "Attack Mode"
label_settings = SubResource("LabelSettings_heading")
[node name="AttackModeBtn" type="Button" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/Attack" unique_id=1913469674]
unique_name_in_owner = true
custom_minimum_size = Vector2(150, 40)
layout_mode = 2
text = "Q"
[node name="Grab" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox" unique_id=951480662]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/Grab" unique_id=1050214223]
layout_mode = 2
size_flags_horizontal = 3
text = "Grab"
label_settings = SubResource("LabelSettings_heading")
[node name="GrabBtn" type="Button" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/Grab" unique_id=1307913086]
unique_name_in_owner = true
custom_minimum_size = Vector2(150, 40)
layout_mode = 2
text = "Space"
[node name="SpawnBoost" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox" unique_id=1495993475]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/SpawnBoost" unique_id=1933746399]
layout_mode = 2
size_flags_horizontal = 3
text = "Spawn Boost"
label_settings = SubResource("LabelSettings_heading")
[node name="SpawnBoostBtn" type="Button" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/SpawnBoost" unique_id=1836762532]
unique_name_in_owner = true
custom_minimum_size = Vector2(150, 40)
layout_mode = 2
text = "E"
[node name="TektonGrab" type="HBoxContainer" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox" unique_id=263116515]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/TektonGrab" unique_id=1041049284]
layout_mode = 2
size_flags_horizontal = 3
text = "Grab Tekton"
label_settings = SubResource("LabelSettings_heading")
[node name="TektonGrabBtn" type="Button" parent="PanelContainer/VBoxContainer/ContentSection/TabContainer/Controls/VBox/TektonGrab" unique_id=1884439337]
unique_name_in_owner = true
custom_minimum_size = Vector2(150, 40)
layout_mode = 2
text = "G"