From a75ac6613ad1221205bf0ab7c2e5c14f6bd8ac9c Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sat, 22 Mar 2025 20:31:19 -0400 Subject: [PATCH 01/13] Setting default resolution to 1280x720 --- project.godot | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/project.godot b/project.godot index 398611d..0f0c81e 100644 --- a/project.godot +++ b/project.godot @@ -32,6 +32,11 @@ gdscript/warnings/untyped_declaration=1 gdscript/warnings/inferred_declaration=1 gdscript/warnings/unsafe_method_access=1 +[display] + +window/size/viewport_width=1280 +window/size/viewport_height=720 + [file_customization] folder_colors={ From cadb17f8863daa00d60b2ea56d48233e38396534 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sat, 22 Mar 2025 20:33:50 -0400 Subject: [PATCH 02/13] Cleaning up tabs and adding initial graphics options (not working) --- scenes/ui/menus/settings_menu.tscn | 110 +++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 15 deletions(-) diff --git a/scenes/ui/menus/settings_menu.tscn b/scenes/ui/menus/settings_menu.tscn index 7ae6428..6049544 100644 --- a/scenes/ui/menus/settings_menu.tscn +++ b/scenes/ui/menus/settings_menu.tscn @@ -1,8 +1,19 @@ -[gd_scene load_steps=3 format=3 uid="uid://4bdgwwx27m71"] +[gd_scene load_steps=4 format=3 uid="uid://4bdgwwx27m71"] [ext_resource type="Script" uid="uid://37ftrpj14msn" path="res://scenes/ui/menus/settings_menu.gd" id="1_qwcqe"] [ext_resource type="Theme" uid="uid://b5q8b0l6qp1dt" path="res://resources/pause_menu_theme.tres" id="2_mhswj"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_80b2v"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0, 0, 0, 0.27451) +corner_radius_top_left = 2 +corner_radius_top_right = 2 +corner_radius_bottom_right = 2 +corner_radius_bottom_left = 2 + [node name="SettingsMenu" type="Panel"] process_mode = 3 anchors_preset = 15 @@ -11,6 +22,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_qwcqe") +metadata/_edit_vertical_guides_ = [349.0] [node name="Background" type="ColorRect" parent="."] custom_minimum_size = Vector2(400, 0) @@ -35,47 +47,115 @@ theme_override_constants/margin_top = 10 theme_override_constants/margin_right = 10 theme_override_constants/margin_bottom = 10 -[node name="CenterContainer" type="VBoxContainer" parent="Background/MarginContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="Background/MarginContainer"] layout_mode = 2 size_flags_horizontal = 4 theme_override_constants/separation = 20 -[node name="Title" type="Label" parent="Background/MarginContainer/CenterContainer"] +[node name="Title" type="Label" parent="Background/MarginContainer/VBoxContainer"] layout_mode = 2 theme_override_font_sizes/font_size = 40 text = "Settings" horizontal_alignment = 1 -[node name="TabContainer" type="TabContainer" parent="Background/MarginContainer/CenterContainer"] +[node name="TabContainer" type="TabContainer" parent="Background/MarginContainer/VBoxContainer"] layout_mode = 2 -current_tab = 0 +theme_override_constants/side_margin = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_80b2v") +current_tab = 1 clip_tabs = false -[node name="Game" type="VBoxContainer" parent="Background/MarginContainer/CenterContainer/TabContainer"] +[node name="Game" type="VBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer"] +visible = false layout_mode = 2 metadata/_tab_index = 0 -[node name="BlockHighlighting" type="CheckButton" parent="Background/MarginContainer/CenterContainer/TabContainer/Game"] +[node name="BlockHighlight" type="HBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer/Game"] layout_mode = 2 -button_pressed = true + +[node name="Label" type="Label" parent="Background/MarginContainer/VBoxContainer/TabContainer/Game/BlockHighlight"] +layout_mode = 2 +size_flags_horizontal = 3 text = "Enable Block Highlighting" -[node name="EnableWaila" type="CheckButton" parent="Background/MarginContainer/CenterContainer/TabContainer/Game"] +[node name="CheckButton" type="CheckButton" parent="Background/MarginContainer/VBoxContainer/TabContainer/Game/BlockHighlight"] layout_mode = 2 button_pressed = true + +[node name="Waila" type="HBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer/Game"] +layout_mode = 2 + +[node name="Label" type="Label" parent="Background/MarginContainer/VBoxContainer/TabContainer/Game/Waila"] +layout_mode = 2 +size_flags_horizontal = 3 text = "Enable Waila" -[node name="Graphics" type="VBoxContainer" parent="Background/MarginContainer/CenterContainer/TabContainer"] -visible = false +[node name="CheckButton" type="CheckButton" parent="Background/MarginContainer/VBoxContainer/TabContainer/Game/Waila"] +layout_mode = 2 +button_pressed = true + +[node name="Graphics" type="VBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer"] layout_mode = 2 metadata/_tab_index = 1 -[node name="Audio" type="VBoxContainer" parent="Background/MarginContainer/CenterContainer/TabContainer"] +[node name="Resolution" type="HBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 + +[node name="Label" type="Label" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Resolution"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Resolution" + +[node name="OptionButton" type="OptionButton" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Resolution"] +layout_mode = 2 +selected = 0 +item_count = 3 +popup/item_0/text = "1280x720" +popup/item_0/id = 0 +popup/item_1/text = "1920x1080" +popup/item_1/id = 1 +popup/item_2/text = "2560x1440" +popup/item_2/id = 2 + +[node name="Fullscreen" type="HBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 + +[node name="Label" type="Label" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Fullscreen"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Fullscreen" + +[node name="CheckBox" type="CheckBox" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Fullscreen"] +layout_mode = 2 + +[node name="VSync" type="HBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 + +[node name="Label" type="Label" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/VSync"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "VSync" + +[node name="CheckBox" type="CheckBox" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/VSync"] +layout_mode = 2 + +[node name="HSeparator" type="HSeparator" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="CenterContainer" type="CenterContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 + +[node name="ApplyButton" type="Button" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/CenterContainer"] +layout_mode = 2 +text = "Apply" + +[node name="Audio" type="VBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer"] visible = false layout_mode = 2 metadata/_tab_index = 2 -[node name="Inputs" type="VBoxContainer" parent="Background/MarginContainer/CenterContainer/TabContainer"] +[node name="Inputs" type="VBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer"] visible = false layout_mode = 2 metadata/_tab_index = 3 @@ -100,6 +180,6 @@ layout_mode = 2 theme = ExtResource("2_mhswj") text = "Close Settings" -[connection signal="toggled" from="Background/MarginContainer/CenterContainer/TabContainer/Game/BlockHighlighting" to="." method="_on_block_highlighting_toggled"] -[connection signal="toggled" from="Background/MarginContainer/CenterContainer/TabContainer/Game/EnableWaila" to="." method="_on_enable_waila_toggled"] +[connection signal="toggled" from="Background/MarginContainer/VBoxContainer/TabContainer/Game/BlockHighlight/CheckButton" to="." method="_on_block_highlighting_toggled"] +[connection signal="toggled" from="Background/MarginContainer/VBoxContainer/TabContainer/Game/Waila/CheckButton" to="." method="_on_enable_waila_toggled"] [connection signal="pressed" from="Background/BottomRow/CloseButton" to="." method="_on_close_button_pressed"] From 9814dd88a0575cbcc60c8093c3037005272e99b4 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sat, 22 Mar 2025 21:14:03 -0400 Subject: [PATCH 03/13] Graphics settings can now be applied --- autoloads/globals.gd | 35 +++++++++++++++++++++++++++++- scenes/player/ray_cast_look.gd | 2 -- scenes/ui/menus/settings_menu.gd | 24 ++++++++++++++++++++ scenes/ui/menus/settings_menu.tscn | 26 +++++++++++++++------- 4 files changed, 76 insertions(+), 11 deletions(-) diff --git a/autoloads/globals.gd b/autoloads/globals.gd index d3c374a..3b540a1 100644 --- a/autoloads/globals.gd +++ b/autoloads/globals.gd @@ -1,6 +1,9 @@ extends Node +signal graphics_settings_changed(resolution: Vector2, fullscreen: bool, vsync: bool) + + const BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/block.tscn") const DROPPED_BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/dropped_block.tscn") @@ -8,4 +11,34 @@ const DROPPED_BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/dropped_b var enable_waila: bool = true ## Enable `What Am I Looking At` UI var enable_block_highlight: bool = true -var is_options_menu_active: bool = false +var graphics_settings: Dictionary[String, Variant] = { + "resolution": Vector2i.ZERO, + "fullscreen": false, + "vsync": false, +} + + +func _init() -> void: + graphics_settings_changed.connect(_on_graphics_settings_changed) + + +func apply_graphics_settings() -> void: + if graphics_settings.fullscreen: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) + else: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + + get_window().size = graphics_settings.resolution + + if graphics_settings.vsync: + DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED) + else: + DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) + + +func _on_graphics_settings_changed(resolution: Vector2i, fullscreen: bool, vsync: bool) -> void: + graphics_settings.resolution = resolution + graphics_settings.fullscreen = fullscreen + graphics_settings.vsync = vsync + + apply_graphics_settings() diff --git a/scenes/player/ray_cast_look.gd b/scenes/player/ray_cast_look.gd index e90bb34..515c8a1 100644 --- a/scenes/player/ray_cast_look.gd +++ b/scenes/player/ray_cast_look.gd @@ -2,8 +2,6 @@ extends RayCast3D func _process(_delta: float) -> void: - if Globals.is_options_menu_active: return - if is_colliding(): var collider: Object = get_collider() diff --git a/scenes/ui/menus/settings_menu.gd b/scenes/ui/menus/settings_menu.gd index 697b76e..50c5dfa 100644 --- a/scenes/ui/menus/settings_menu.gd +++ b/scenes/ui/menus/settings_menu.gd @@ -2,11 +2,35 @@ class_name SettingsMenu extends Panel +@export_group("Graphics Settings Nodes") +@export var resolution_input: OptionButton +@export var fullscreen_input: CheckBox +@export var vsync_input: CheckBox + + +#region Game Settings func _on_block_highlighting_toggled(toggled_on: bool) -> void: Globals.enable_block_highlight = toggled_on func _on_enable_waila_toggled(toggled_on: bool) -> void: Globals.enable_waila = toggled_on +#endregion + +#region Graphics Settings +func _on_graphics_apply_button_pressed() -> void: + var values: Array = resolution_input.text.split_floats("x") + Globals.graphics_settings_changed.emit( + Vector2(int(values[0]), int(values[1])), + fullscreen_input.button_pressed, + vsync_input.button_pressed + ) +#endregion + +#region Audio Settings +#endregion + +#region Input Settings +#endregion func _on_close_button_pressed() -> void: diff --git a/scenes/ui/menus/settings_menu.tscn b/scenes/ui/menus/settings_menu.tscn index 6049544..aeaf7fa 100644 --- a/scenes/ui/menus/settings_menu.tscn +++ b/scenes/ui/menus/settings_menu.tscn @@ -14,7 +14,7 @@ corner_radius_top_right = 2 corner_radius_bottom_right = 2 corner_radius_bottom_left = 2 -[node name="SettingsMenu" type="Panel"] +[node name="SettingsMenu" type="Panel" node_paths=PackedStringArray("resolution_input", "fullscreen_input", "vsync_input")] process_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -22,6 +22,9 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_qwcqe") +resolution_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Resolution/OptionButton") +fullscreen_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Fullscreen/CheckBox") +vsync_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/VSync/CheckBox") metadata/_edit_vertical_guides_ = [349.0] [node name="Background" type="ColorRect" parent="."] @@ -62,11 +65,10 @@ horizontal_alignment = 1 layout_mode = 2 theme_override_constants/side_margin = 0 theme_override_styles/panel = SubResource("StyleBoxFlat_80b2v") -current_tab = 1 +current_tab = 0 clip_tabs = false [node name="Game" type="VBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer"] -visible = false layout_mode = 2 metadata/_tab_index = 0 @@ -95,6 +97,7 @@ layout_mode = 2 button_pressed = true [node name="Graphics" type="VBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer"] +visible = false layout_mode = 2 metadata/_tab_index = 1 @@ -109,13 +112,19 @@ text = "Resolution" [node name="OptionButton" type="OptionButton" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Resolution"] layout_mode = 2 selected = 0 -item_count = 3 +item_count = 6 popup/item_0/text = "1280x720" popup/item_0/id = 0 -popup/item_1/text = "1920x1080" -popup/item_1/id = 1 -popup/item_2/text = "2560x1440" -popup/item_2/id = 2 +popup/item_1/text = "1280x800" +popup/item_1/id = 4 +popup/item_2/text = "1920x1080" +popup/item_2/id = 1 +popup/item_3/text = "2560x1440" +popup/item_3/id = 2 +popup/item_4/text = "3440x1440" +popup/item_4/id = 3 +popup/item_5/text = "3840 x 2160" +popup/item_5/id = 5 [node name="Fullscreen" type="HBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] layout_mode = 2 @@ -182,4 +191,5 @@ text = "Close Settings" [connection signal="toggled" from="Background/MarginContainer/VBoxContainer/TabContainer/Game/BlockHighlight/CheckButton" to="." method="_on_block_highlighting_toggled"] [connection signal="toggled" from="Background/MarginContainer/VBoxContainer/TabContainer/Game/Waila/CheckButton" to="." method="_on_enable_waila_toggled"] +[connection signal="pressed" from="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/CenterContainer/ApplyButton" to="." method="_on_graphics_apply_button_pressed"] [connection signal="pressed" from="Background/BottomRow/CloseButton" to="." method="_on_close_button_pressed"] From d0cce1b2dd5ed875c693482bd9eb784df3666d5e Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sat, 22 Mar 2025 21:39:06 -0400 Subject: [PATCH 04/13] Adding FOV setting --- autoloads/globals.gd | 7 +++++++ scenes/player/player.gd | 8 ++++++++ scenes/ui/menus/settings_menu.gd | 6 ++++++ scenes/ui/menus/settings_menu.tscn | 26 +++++++++++++++++++++++++- 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/autoloads/globals.gd b/autoloads/globals.gd index 3b540a1..8999c9c 100644 --- a/autoloads/globals.gd +++ b/autoloads/globals.gd @@ -2,6 +2,7 @@ extends Node signal graphics_settings_changed(resolution: Vector2, fullscreen: bool, vsync: bool) +signal graphics_fov_changed(fov: int) const BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/block.tscn") @@ -11,8 +12,10 @@ const DROPPED_BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/dropped_b var enable_waila: bool = true ## Enable `What Am I Looking At` UI var enable_block_highlight: bool = true +# TODO: Replace the following with a Resource var graphics_settings: Dictionary[String, Variant] = { "resolution": Vector2i.ZERO, + "fov": 75, "fullscreen": false, "vsync": false, } @@ -20,6 +23,7 @@ var graphics_settings: Dictionary[String, Variant] = { func _init() -> void: graphics_settings_changed.connect(_on_graphics_settings_changed) + graphics_fov_changed.connect(_on_graphics_fov_changed) func apply_graphics_settings() -> void: @@ -36,6 +40,9 @@ func apply_graphics_settings() -> void: DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) +func _on_graphics_fov_changed(fov: int) -> void: + graphics_settings.fov = fov + func _on_graphics_settings_changed(resolution: Vector2i, fullscreen: bool, vsync: bool) -> void: graphics_settings.resolution = resolution graphics_settings.fullscreen = fullscreen diff --git a/scenes/player/player.gd b/scenes/player/player.gd index cbc7c9d..e0e1387 100644 --- a/scenes/player/player.gd +++ b/scenes/player/player.gd @@ -17,6 +17,7 @@ extends CharacterBody3D @export var sprint_toggle: bool = false ## Enables toggle sprint instead of hold. When enabled, sprinting will also be disabled when velocity is zero @export var walk_speed: float = 5.0 +@onready var camera: Camera3D = $Head/Camera3D @onready var head: Node3D = $Head @onready var collision_shape_standing: CollisionShape3D = $CollisionShapeStanding @onready var collision_shape_crouching: CollisionShape3D = $CollisionShapeCrouching @@ -47,6 +48,9 @@ func _physics_process(delta: float) -> void: move_and_slide() +func _ready() -> void: + Globals.graphics_fov_changed.connect(_on_graphics_fov_changed) + func _apply_gravity(delta: float) -> void: if is_on_floor(): return @@ -115,3 +119,7 @@ func _set_is_sprinting() -> void: is_sprinting = false else: is_sprinting = Input.is_action_pressed("run") + + +func _on_graphics_fov_changed(fov: int) -> void: + camera.fov = fov diff --git a/scenes/ui/menus/settings_menu.gd b/scenes/ui/menus/settings_menu.gd index 50c5dfa..6a8cb91 100644 --- a/scenes/ui/menus/settings_menu.gd +++ b/scenes/ui/menus/settings_menu.gd @@ -6,6 +6,8 @@ extends Panel @export var resolution_input: OptionButton @export var fullscreen_input: CheckBox @export var vsync_input: CheckBox +@export var fov_slider: HSlider +@export var fov_value_label: Label #region Game Settings @@ -17,6 +19,9 @@ func _on_enable_waila_toggled(toggled_on: bool) -> void: #endregion #region Graphics Settings +func _on_fov_slider_changed(value: float) -> void: + fov_value_label.text = str(int(value)) + func _on_graphics_apply_button_pressed() -> void: var values: Array = resolution_input.text.split_floats("x") Globals.graphics_settings_changed.emit( @@ -24,6 +29,7 @@ func _on_graphics_apply_button_pressed() -> void: fullscreen_input.button_pressed, vsync_input.button_pressed ) + Globals.graphics_fov_changed.emit(int(fov_slider.value)) #endregion #region Audio Settings diff --git a/scenes/ui/menus/settings_menu.tscn b/scenes/ui/menus/settings_menu.tscn index aeaf7fa..cf91166 100644 --- a/scenes/ui/menus/settings_menu.tscn +++ b/scenes/ui/menus/settings_menu.tscn @@ -14,7 +14,7 @@ corner_radius_top_right = 2 corner_radius_bottom_right = 2 corner_radius_bottom_left = 2 -[node name="SettingsMenu" type="Panel" node_paths=PackedStringArray("resolution_input", "fullscreen_input", "vsync_input")] +[node name="SettingsMenu" type="Panel" node_paths=PackedStringArray("resolution_input", "fullscreen_input", "vsync_input", "fov_slider", "fov_value_label")] process_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -25,6 +25,8 @@ script = ExtResource("1_qwcqe") resolution_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Resolution/OptionButton") fullscreen_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Fullscreen/CheckBox") vsync_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/VSync/CheckBox") +fov_slider = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV/HSlider") +fov_value_label = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV/Value") metadata/_edit_vertical_guides_ = [349.0] [node name="Background" type="ColorRect" parent="."] @@ -148,6 +150,27 @@ text = "VSync" [node name="CheckBox" type="CheckBox" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/VSync"] layout_mode = 2 +[node name="FOV" type="HBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 + +[node name="Label" type="Label" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "FOV" + +[node name="HSlider" type="HSlider" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV"] +layout_mode = 2 +size_flags_horizontal = 3 +min_value = 60.0 +max_value = 120.0 +value = 75.0 +rounded = true +ticks_on_borders = true + +[node name="Value" type="Label" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV"] +layout_mode = 2 +text = "75" + [node name="HSeparator" type="HSeparator" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] layout_mode = 2 theme_override_constants/separation = 20 @@ -191,5 +214,6 @@ text = "Close Settings" [connection signal="toggled" from="Background/MarginContainer/VBoxContainer/TabContainer/Game/BlockHighlight/CheckButton" to="." method="_on_block_highlighting_toggled"] [connection signal="toggled" from="Background/MarginContainer/VBoxContainer/TabContainer/Game/Waila/CheckButton" to="." method="_on_enable_waila_toggled"] +[connection signal="value_changed" from="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV/HSlider" to="." method="_on_fov_slider_changed"] [connection signal="pressed" from="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/CenterContainer/ApplyButton" to="." method="_on_graphics_apply_button_pressed"] [connection signal="pressed" from="Background/BottomRow/CloseButton" to="." method="_on_close_button_pressed"] From 6e1b9ce7542dc394b58689d8780dd1130f444d30 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sat, 22 Mar 2025 21:40:21 -0400 Subject: [PATCH 05/13] Change FOV while changing slider --- scenes/ui/menus/settings_menu.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/ui/menus/settings_menu.gd b/scenes/ui/menus/settings_menu.gd index 6a8cb91..e66c70a 100644 --- a/scenes/ui/menus/settings_menu.gd +++ b/scenes/ui/menus/settings_menu.gd @@ -21,6 +21,7 @@ func _on_enable_waila_toggled(toggled_on: bool) -> void: #region Graphics Settings func _on_fov_slider_changed(value: float) -> void: fov_value_label.text = str(int(value)) + Globals.graphics_fov_changed.emit(int(fov_slider.value)) func _on_graphics_apply_button_pressed() -> void: var values: Array = resolution_input.text.split_floats("x") @@ -29,7 +30,6 @@ func _on_graphics_apply_button_pressed() -> void: fullscreen_input.button_pressed, vsync_input.button_pressed ) - Globals.graphics_fov_changed.emit(int(fov_slider.value)) #endregion #region Audio Settings From 7b114011cf2797e2331d94eacc1f75a5b9e90c1a Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sat, 22 Mar 2025 22:56:49 -0400 Subject: [PATCH 06/13] Removing unnecessary casting --- scenes/ui/menus/settings_menu.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/ui/menus/settings_menu.gd b/scenes/ui/menus/settings_menu.gd index e66c70a..bb37a85 100644 --- a/scenes/ui/menus/settings_menu.gd +++ b/scenes/ui/menus/settings_menu.gd @@ -26,7 +26,7 @@ func _on_fov_slider_changed(value: float) -> void: func _on_graphics_apply_button_pressed() -> void: var values: Array = resolution_input.text.split_floats("x") Globals.graphics_settings_changed.emit( - Vector2(int(values[0]), int(values[1])), + Vector2i(values[0], values[1]), fullscreen_input.button_pressed, vsync_input.button_pressed ) From f239bc1b164606b14af9418ef5833398e1c910a0 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sun, 23 Mar 2025 13:54:20 -0400 Subject: [PATCH 07/13] Creating GameSettingsManager autoload and migrated Graphics settings --- autoloads/game_settings_manager.gd | 82 +++++++++++++++++++ autoloads/game_settings_manager.gd.uid | 1 + autoloads/globals.gd | 44 +--------- project.godot | 1 + .../game_settings/game_settings_resource.gd | 8 ++ .../game_settings_resource.gd.uid | 1 + .../game_settings/game_settings_resource.tres | 9 ++ resources/game_settings/graphics_settings.gd | 9 ++ .../game_settings/graphics_settings.gd.uid | 1 + .../game_settings/graphics_settings.tres | 11 +++ scenes/player/player.gd | 2 +- scenes/ui/menus/settings_menu.gd | 13 +-- 12 files changed, 132 insertions(+), 50 deletions(-) create mode 100644 autoloads/game_settings_manager.gd create mode 100644 autoloads/game_settings_manager.gd.uid create mode 100644 resources/game_settings/game_settings_resource.gd create mode 100644 resources/game_settings/game_settings_resource.gd.uid create mode 100644 resources/game_settings/game_settings_resource.tres create mode 100644 resources/game_settings/graphics_settings.gd create mode 100644 resources/game_settings/graphics_settings.gd.uid create mode 100644 resources/game_settings/graphics_settings.tres diff --git a/autoloads/game_settings_manager.gd b/autoloads/game_settings_manager.gd new file mode 100644 index 0000000..e3b72e8 --- /dev/null +++ b/autoloads/game_settings_manager.gd @@ -0,0 +1,82 @@ +extends Node + + +#region Graphics Settings Signals +signal apply_graphics_settings +signal graphics_resolution_changed(resolution: Vector2i) +signal graphics_fullscreen_changed(fullscreen_enabled: bool) +signal graphics_vsync_changed(vsync_enabled: bool) +signal graphics_fov_changed(fov: int) +#endregion + +## See documentation to where this path is: https://docs.godotengine.org/en/stable/tutorials/io/data_paths.html#accessing-persistent-user-data-user[br][br] +## Default Paths:[br] +## * Windows: %APPDATA%\Godot\app_userdata\[project_name][br] +## * macOS: ~/Library/Application Support/Godot/app_userdata/[project_name][br] +## * Linux: ~/.local/share/godot/app_userdata/[project_name][br] +var save_data_path: String = "user://game_data/" +var settings_file_name: String = "game_settings.tres" + +var settings_file_path: String = save_data_path + settings_file_name +var settings: GameSettingsResource = GameSettingsResource.new() + + +func _init() -> void: + graphics_fov_changed.connect(_on_graphics_fov_changed) + graphics_fullscreen_changed.connect(_on_graphics_fullscreen_changed) + graphics_resolution_changed.connect(_on_graphics_resolution_changed) + graphics_vsync_changed.connect(_on_graphics_vsync_changed) + apply_graphics_settings.connect(_on_apply_graphics_settings) + + +#region Graphics Settings +func _on_apply_graphics_settings() -> void: + if settings.graphics.fullscreen: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) + else: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + + get_window().size = settings.graphics.resolution + + if settings.graphics.vsync: + DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED) + else: + DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) + + save_settings() + +func _on_graphics_fov_changed(fov: int) -> void: + settings.graphics.fov = fov + +func _on_graphics_fullscreen_changed(fullscreen_enabled: bool) -> void: + settings.graphics.fullscreen = fullscreen_enabled + +func _on_graphics_resolution_changed(resolution: Vector2i) -> void: + settings.graphics.resolution = resolution + +func _on_graphics_vsync_changed(vsync_enabled: bool) -> void: + settings.graphics.vsync = vsync_enabled +#endregion + +#region Saving and Loading Settings +func load_settings(apply_after_load: bool = true) -> void: + if !FileAccess.file_exists(settings_file_path): + printerr("Failed to load game settings. File does not exist: ", settings_file_path) + return + + settings = ResourceLoader.load(settings_file_path) + if settings == null: + printerr("Failed to load game settings. Unknown format? ", settings_file_path) + return + + if apply_after_load: + apply_graphics_settings.emit() + +func save_settings() -> void: + if !DirAccess.dir_exists_absolute(save_data_path): + DirAccess.make_dir_absolute(save_data_path) + + var result: int = ResourceSaver.save(settings, settings_file_path) + if result != OK: + printerr("Failed to save game settings: ", result) +#endregion diff --git a/autoloads/game_settings_manager.gd.uid b/autoloads/game_settings_manager.gd.uid new file mode 100644 index 0000000..bc62d5b --- /dev/null +++ b/autoloads/game_settings_manager.gd.uid @@ -0,0 +1 @@ +uid://dxe2y12f412lp diff --git a/autoloads/globals.gd b/autoloads/globals.gd index 8999c9c..32f5524 100644 --- a/autoloads/globals.gd +++ b/autoloads/globals.gd @@ -1,51 +1,9 @@ extends Node -signal graphics_settings_changed(resolution: Vector2, fullscreen: bool, vsync: bool) -signal graphics_fov_changed(fov: int) - - const BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/block.tscn") const DROPPED_BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/dropped_block.tscn") - +# TODO: Move the following into the GameSettingsManager var enable_waila: bool = true ## Enable `What Am I Looking At` UI var enable_block_highlight: bool = true - -# TODO: Replace the following with a Resource -var graphics_settings: Dictionary[String, Variant] = { - "resolution": Vector2i.ZERO, - "fov": 75, - "fullscreen": false, - "vsync": false, -} - - -func _init() -> void: - graphics_settings_changed.connect(_on_graphics_settings_changed) - graphics_fov_changed.connect(_on_graphics_fov_changed) - - -func apply_graphics_settings() -> void: - if graphics_settings.fullscreen: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) - else: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) - - get_window().size = graphics_settings.resolution - - if graphics_settings.vsync: - DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED) - else: - DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) - - -func _on_graphics_fov_changed(fov: int) -> void: - graphics_settings.fov = fov - -func _on_graphics_settings_changed(resolution: Vector2i, fullscreen: bool, vsync: bool) -> void: - graphics_settings.resolution = resolution - graphics_settings.fullscreen = fullscreen - graphics_settings.vsync = vsync - - apply_graphics_settings() diff --git a/project.godot b/project.godot index 0f0c81e..a8bb277 100644 --- a/project.godot +++ b/project.godot @@ -24,6 +24,7 @@ InventoryManager="*res://autoloads/inventory_manager.gd" DBItems="*res://autoloads/db_items.gd" SaveGameManager="*res://save_load/autoloads/save_game_manager.gd" SignalManager="*res://autoloads/signal_manager.gd" +GameSettingsManager="*res://autoloads/game_settings_manager.gd" [debug] diff --git a/resources/game_settings/game_settings_resource.gd b/resources/game_settings/game_settings_resource.gd new file mode 100644 index 0000000..5befa64 --- /dev/null +++ b/resources/game_settings/game_settings_resource.gd @@ -0,0 +1,8 @@ +## The resource for saving game settings. +## This should be not be saved with saves (for game syncing reasons) +class_name GameSettingsResource +extends Resource + + +@export var game_version: String = ProjectSettings.get_setting("application/config/version") +@export var graphics: GraphicsSettingsResource = GraphicsSettingsResource.new() diff --git a/resources/game_settings/game_settings_resource.gd.uid b/resources/game_settings/game_settings_resource.gd.uid new file mode 100644 index 0000000..1a87000 --- /dev/null +++ b/resources/game_settings/game_settings_resource.gd.uid @@ -0,0 +1 @@ +uid://cffw77d120p56 diff --git a/resources/game_settings/game_settings_resource.tres b/resources/game_settings/game_settings_resource.tres new file mode 100644 index 0000000..a100b47 --- /dev/null +++ b/resources/game_settings/game_settings_resource.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="GameSettingsResource" load_steps=2 format=3 uid="uid://b3kkeyyos7a7"] + +[ext_resource type="Script" uid="uid://cffw77d120p56" path="res://resources/game_settings/game_settings_resource.gd" id="1_fe7s4"] + +[resource] +script = ExtResource("1_fe7s4") +game_version = null +graphics = [] +metadata/_custom_type_script = "uid://cffw77d120p56" diff --git a/resources/game_settings/graphics_settings.gd b/resources/game_settings/graphics_settings.gd new file mode 100644 index 0000000..6a89209 --- /dev/null +++ b/resources/game_settings/graphics_settings.gd @@ -0,0 +1,9 @@ +## The resource for saving game settings. +## This should be not be saved with saves (for game syncing reasons) +class_name GraphicsSettingsResource +extends Resource + +@export var resolution: Vector2i = Vector2i(1280, 720) +@export var fullscreen: bool = false +@export var vsync: bool = false +@export var fov: int = 75 diff --git a/resources/game_settings/graphics_settings.gd.uid b/resources/game_settings/graphics_settings.gd.uid new file mode 100644 index 0000000..0e96168 --- /dev/null +++ b/resources/game_settings/graphics_settings.gd.uid @@ -0,0 +1 @@ +uid://mfghfem8im6o diff --git a/resources/game_settings/graphics_settings.tres b/resources/game_settings/graphics_settings.tres new file mode 100644 index 0000000..5898ec0 --- /dev/null +++ b/resources/game_settings/graphics_settings.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="GraphicsSettingsResource" load_steps=2 format=3 uid="uid://b07gyfa776057"] + +[ext_resource type="Script" uid="uid://mfghfem8im6o" path="res://resources/game_settings/graphics_settings.gd" id="1_3m2to"] + +[resource] +script = ExtResource("1_3m2to") +resolution = Vector2i(1280, 720) +fullscreen = false +vsync = false +fov = 75 +metadata/_custom_type_script = "uid://mfghfem8im6o" diff --git a/scenes/player/player.gd b/scenes/player/player.gd index e0e1387..bd9e58a 100644 --- a/scenes/player/player.gd +++ b/scenes/player/player.gd @@ -49,7 +49,7 @@ func _physics_process(delta: float) -> void: move_and_slide() func _ready() -> void: - Globals.graphics_fov_changed.connect(_on_graphics_fov_changed) + GameSettingsManager.graphics_fov_changed.connect(_on_graphics_fov_changed) func _apply_gravity(delta: float) -> void: diff --git a/scenes/ui/menus/settings_menu.gd b/scenes/ui/menus/settings_menu.gd index bb37a85..97b3e6e 100644 --- a/scenes/ui/menus/settings_menu.gd +++ b/scenes/ui/menus/settings_menu.gd @@ -21,15 +21,16 @@ func _on_enable_waila_toggled(toggled_on: bool) -> void: #region Graphics Settings func _on_fov_slider_changed(value: float) -> void: fov_value_label.text = str(int(value)) - Globals.graphics_fov_changed.emit(int(fov_slider.value)) + GameSettingsManager.graphics_fov_changed.emit(int(fov_slider.value)) func _on_graphics_apply_button_pressed() -> void: var values: Array = resolution_input.text.split_floats("x") - Globals.graphics_settings_changed.emit( - Vector2i(values[0], values[1]), - fullscreen_input.button_pressed, - vsync_input.button_pressed - ) + + GameSettingsManager.graphics_resolution_changed.emit(Vector2i(values[0], values[1])) + GameSettingsManager.graphics_fullscreen_changed.emit(fullscreen_input.button_pressed) + GameSettingsManager.graphics_vsync_changed.emit(vsync_input.button_pressed) + GameSettingsManager.apply_graphics_settings.emit() + #endregion #region Audio Settings From 12dbc451b22ea9c18730e53cffcd13775d38dba8 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sun, 23 Mar 2025 14:12:33 -0400 Subject: [PATCH 08/13] Migrating Game Settings into resource --- autoloads/game_settings_manager.gd | 19 +++++++++++++++++++ .../game_options_settings_resource.gd | 6 ++++++ .../game_options_settings_resource.gd.uid | 1 + .../game_options_settings_resource.tres | 9 +++++++++ .../game_settings/game_settings_resource.gd | 2 ++ ...tings.gd => graphics_settings_resource.gd} | 0 ....uid => graphics_settings_resource.gd.uid} | 0 ...s.tres => graphics_settings_resource.tres} | 2 +- scenes/blocks/block.gd | 2 +- scenes/ui/menus/settings_menu.gd | 4 ++-- scenes/ui/waila.gd | 2 +- 11 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 resources/game_settings/game_options_settings_resource.gd create mode 100644 resources/game_settings/game_options_settings_resource.gd.uid create mode 100644 resources/game_settings/game_options_settings_resource.tres rename resources/game_settings/{graphics_settings.gd => graphics_settings_resource.gd} (100%) rename resources/game_settings/{graphics_settings.gd.uid => graphics_settings_resource.gd.uid} (100%) rename resources/game_settings/{graphics_settings.tres => graphics_settings_resource.tres} (83%) diff --git a/autoloads/game_settings_manager.gd b/autoloads/game_settings_manager.gd index e3b72e8..b189866 100644 --- a/autoloads/game_settings_manager.gd +++ b/autoloads/game_settings_manager.gd @@ -1,6 +1,11 @@ extends Node +#region Game Options Signals +signal game_options_block_highlight_changed(block_highlight_enabled: bool) +signal game_options_waila_changed(waila_enabled: bool) +#endregion + #region Graphics Settings Signals signal apply_graphics_settings signal graphics_resolution_changed(resolution: Vector2i) @@ -9,6 +14,7 @@ signal graphics_vsync_changed(vsync_enabled: bool) signal graphics_fov_changed(fov: int) #endregion + ## See documentation to where this path is: https://docs.godotengine.org/en/stable/tutorials/io/data_paths.html#accessing-persistent-user-data-user[br][br] ## Default Paths:[br] ## * Windows: %APPDATA%\Godot\app_userdata\[project_name][br] @@ -22,6 +28,9 @@ var settings: GameSettingsResource = GameSettingsResource.new() func _init() -> void: + game_options_block_highlight_changed.connect(_on_game_options_block_highlight_changed) + game_options_waila_changed.connect(_on_game_options_waila_changed) + graphics_fov_changed.connect(_on_graphics_fov_changed) graphics_fullscreen_changed.connect(_on_graphics_fullscreen_changed) graphics_resolution_changed.connect(_on_graphics_resolution_changed) @@ -29,6 +38,16 @@ func _init() -> void: apply_graphics_settings.connect(_on_apply_graphics_settings) +#region Game Option Settings +func _on_game_options_block_highlight_changed(highlight_enabled: bool) -> void: + settings.game_options.enable_block_highlight = highlight_enabled + save_settings() + +func _on_game_options_waila_changed(waila_enabled: bool) -> void: + settings.game_options.enable_waila = waila_enabled + save_settings() +#endregion + #region Graphics Settings func _on_apply_graphics_settings() -> void: if settings.graphics.fullscreen: diff --git a/resources/game_settings/game_options_settings_resource.gd b/resources/game_settings/game_options_settings_resource.gd new file mode 100644 index 0000000..5b06441 --- /dev/null +++ b/resources/game_settings/game_options_settings_resource.gd @@ -0,0 +1,6 @@ +class_name GameOptionsSettingsResource +extends Resource + + +@export var enable_waila: bool = true ## Enable `What Am I Looking At` UI +@export var enable_block_highlight: bool = true diff --git a/resources/game_settings/game_options_settings_resource.gd.uid b/resources/game_settings/game_options_settings_resource.gd.uid new file mode 100644 index 0000000..d8bbb33 --- /dev/null +++ b/resources/game_settings/game_options_settings_resource.gd.uid @@ -0,0 +1 @@ +uid://7yv740somgqf diff --git a/resources/game_settings/game_options_settings_resource.tres b/resources/game_settings/game_options_settings_resource.tres new file mode 100644 index 0000000..24c323d --- /dev/null +++ b/resources/game_settings/game_options_settings_resource.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="GameOptionsSettingsResource" load_steps=2 format=3 uid="uid://cnpou521v2v8p"] + +[ext_resource type="Script" uid="uid://7yv740somgqf" path="res://resources/game_settings/game_options_settings_resource.gd" id="1_wnf6r"] + +[resource] +script = ExtResource("1_wnf6r") +enable_waila = true +enable_block_highlight = true +metadata/_custom_type_script = "uid://7yv740somgqf" diff --git a/resources/game_settings/game_settings_resource.gd b/resources/game_settings/game_settings_resource.gd index 5befa64..9ce9b62 100644 --- a/resources/game_settings/game_settings_resource.gd +++ b/resources/game_settings/game_settings_resource.gd @@ -5,4 +5,6 @@ extends Resource @export var game_version: String = ProjectSettings.get_setting("application/config/version") + +@export var game_options: GameOptionsSettingsResource = GameOptionsSettingsResource.new() @export var graphics: GraphicsSettingsResource = GraphicsSettingsResource.new() diff --git a/resources/game_settings/graphics_settings.gd b/resources/game_settings/graphics_settings_resource.gd similarity index 100% rename from resources/game_settings/graphics_settings.gd rename to resources/game_settings/graphics_settings_resource.gd diff --git a/resources/game_settings/graphics_settings.gd.uid b/resources/game_settings/graphics_settings_resource.gd.uid similarity index 100% rename from resources/game_settings/graphics_settings.gd.uid rename to resources/game_settings/graphics_settings_resource.gd.uid diff --git a/resources/game_settings/graphics_settings.tres b/resources/game_settings/graphics_settings_resource.tres similarity index 83% rename from resources/game_settings/graphics_settings.tres rename to resources/game_settings/graphics_settings_resource.tres index 5898ec0..18de223 100644 --- a/resources/game_settings/graphics_settings.tres +++ b/resources/game_settings/graphics_settings_resource.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="GraphicsSettingsResource" load_steps=2 format=3 uid="uid://b07gyfa776057"] -[ext_resource type="Script" uid="uid://mfghfem8im6o" path="res://resources/game_settings/graphics_settings.gd" id="1_3m2to"] +[ext_resource type="Script" uid="uid://mfghfem8im6o" path="res://resources/game_settings/graphics_settings_resource.gd" id="1_3m2to"] [resource] script = ExtResource("1_3m2to") diff --git a/scenes/blocks/block.gd b/scenes/blocks/block.gd index ef98bc7..2af5087 100644 --- a/scenes/blocks/block.gd +++ b/scenes/blocks/block.gd @@ -22,7 +22,7 @@ func get_id() -> String: return id func hook() -> void: - if not Globals.enable_block_highlight: return + if not GameSettingsManager.settings.game_options.enable_block_highlight: return highlight_mesh.visible = true diff --git a/scenes/ui/menus/settings_menu.gd b/scenes/ui/menus/settings_menu.gd index 97b3e6e..5cc8c46 100644 --- a/scenes/ui/menus/settings_menu.gd +++ b/scenes/ui/menus/settings_menu.gd @@ -12,10 +12,10 @@ extends Panel #region Game Settings func _on_block_highlighting_toggled(toggled_on: bool) -> void: - Globals.enable_block_highlight = toggled_on + GameSettingsManager.game_options_block_highlight_changed.emit(toggled_on) func _on_enable_waila_toggled(toggled_on: bool) -> void: - Globals.enable_waila = toggled_on + GameSettingsManager.game_options_waila_changed.emit(toggled_on) #endregion #region Graphics Settings diff --git a/scenes/ui/waila.gd b/scenes/ui/waila.gd index d70c0aa..cb9b19b 100644 --- a/scenes/ui/waila.gd +++ b/scenes/ui/waila.gd @@ -29,7 +29,7 @@ func get_target() -> Block: return _target func hook_target(id: String) -> void: - if not Globals.enable_waila: return + if not GameSettingsManager.settings.game_options.enable_waila: return if not id: return var item: ItemResource = DBItems.data[id] From 9ff3f4011433456425ae984644f94791bf60e445 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sun, 23 Mar 2025 14:12:41 -0400 Subject: [PATCH 09/13] Renaming button --- scenes/ui/menus/settings_menu.tscn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/ui/menus/settings_menu.tscn b/scenes/ui/menus/settings_menu.tscn index cf91166..cac1a44 100644 --- a/scenes/ui/menus/settings_menu.tscn +++ b/scenes/ui/menus/settings_menu.tscn @@ -180,7 +180,7 @@ layout_mode = 2 [node name="ApplyButton" type="Button" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/CenterContainer"] layout_mode = 2 -text = "Apply" +text = "Apply/Save" [node name="Audio" type="VBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer"] visible = false From adc42c7080ac419ad4df9d9243f723a5e40dae76 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sun, 23 Mar 2025 14:48:12 -0400 Subject: [PATCH 10/13] Moving saving_settings and load_settings to signals --- autoloads/game_settings_manager.gd | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/autoloads/game_settings_manager.gd b/autoloads/game_settings_manager.gd index b189866..ef03d49 100644 --- a/autoloads/game_settings_manager.gd +++ b/autoloads/game_settings_manager.gd @@ -14,6 +14,9 @@ signal graphics_vsync_changed(vsync_enabled: bool) signal graphics_fov_changed(fov: int) #endregion +signal load_settings +signal save_settings + ## See documentation to where this path is: https://docs.godotengine.org/en/stable/tutorials/io/data_paths.html#accessing-persistent-user-data-user[br][br] ## Default Paths:[br] @@ -37,15 +40,18 @@ func _init() -> void: graphics_vsync_changed.connect(_on_graphics_vsync_changed) apply_graphics_settings.connect(_on_apply_graphics_settings) + load_settings.connect(_on_load_settings) + save_settings.connect(_on_save_settings) + #region Game Option Settings func _on_game_options_block_highlight_changed(highlight_enabled: bool) -> void: settings.game_options.enable_block_highlight = highlight_enabled - save_settings() + _on_save_settings() func _on_game_options_waila_changed(waila_enabled: bool) -> void: settings.game_options.enable_waila = waila_enabled - save_settings() + _on_save_settings() #endregion #region Graphics Settings @@ -62,7 +68,7 @@ func _on_apply_graphics_settings() -> void: else: DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) - save_settings() + _on_save_settings() func _on_graphics_fov_changed(fov: int) -> void: settings.graphics.fov = fov @@ -78,7 +84,7 @@ func _on_graphics_vsync_changed(vsync_enabled: bool) -> void: #endregion #region Saving and Loading Settings -func load_settings(apply_after_load: bool = true) -> void: +func _on_load_settings(apply_after_load: bool = true) -> void: if !FileAccess.file_exists(settings_file_path): printerr("Failed to load game settings. File does not exist: ", settings_file_path) return @@ -91,7 +97,7 @@ func load_settings(apply_after_load: bool = true) -> void: if apply_after_load: apply_graphics_settings.emit() -func save_settings() -> void: +func _on_save_settings() -> void: if !DirAccess.dir_exists_absolute(save_data_path): DirAccess.make_dir_absolute(save_data_path) From 6cc3a68d00deae51c58fd3d9f7f0e1de8ceaf3d9 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sun, 23 Mar 2025 14:51:35 -0400 Subject: [PATCH 11/13] Adding resolution id to settings export (GraphicsSettingsResource) --- autoloads/game_settings_manager.gd | 6 ++++-- resources/game_settings/graphics_settings_resource.gd | 3 ++- scenes/ui/menus/settings_menu.gd | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/autoloads/game_settings_manager.gd b/autoloads/game_settings_manager.gd index ef03d49..c6d4eba 100644 --- a/autoloads/game_settings_manager.gd +++ b/autoloads/game_settings_manager.gd @@ -8,7 +8,7 @@ signal game_options_waila_changed(waila_enabled: bool) #region Graphics Settings Signals signal apply_graphics_settings -signal graphics_resolution_changed(resolution: Vector2i) +signal graphics_resolution_changed(resolution: Vector2i, id: int) signal graphics_fullscreen_changed(fullscreen_enabled: bool) signal graphics_vsync_changed(vsync_enabled: bool) signal graphics_fov_changed(fov: int) @@ -76,13 +76,15 @@ func _on_graphics_fov_changed(fov: int) -> void: func _on_graphics_fullscreen_changed(fullscreen_enabled: bool) -> void: settings.graphics.fullscreen = fullscreen_enabled -func _on_graphics_resolution_changed(resolution: Vector2i) -> void: +func _on_graphics_resolution_changed(resolution: Vector2i, id: int) -> void: settings.graphics.resolution = resolution + settings.graphics.resolution_id = id func _on_graphics_vsync_changed(vsync_enabled: bool) -> void: settings.graphics.vsync = vsync_enabled #endregion + #region Saving and Loading Settings func _on_load_settings(apply_after_load: bool = true) -> void: if !FileAccess.file_exists(settings_file_path): diff --git a/resources/game_settings/graphics_settings_resource.gd b/resources/game_settings/graphics_settings_resource.gd index 6a89209..3152aac 100644 --- a/resources/game_settings/graphics_settings_resource.gd +++ b/resources/game_settings/graphics_settings_resource.gd @@ -3,7 +3,8 @@ class_name GraphicsSettingsResource extends Resource -@export var resolution: Vector2i = Vector2i(1280, 720) +@export var resolution: Vector2i = Vector2i(1280, 720) ## Width, Height +@export var resolution_id: int = 0 ## The ID of the item in the OptionsButton list element @export var fullscreen: bool = false @export var vsync: bool = false @export var fov: int = 75 diff --git a/scenes/ui/menus/settings_menu.gd b/scenes/ui/menus/settings_menu.gd index 5cc8c46..014e71c 100644 --- a/scenes/ui/menus/settings_menu.gd +++ b/scenes/ui/menus/settings_menu.gd @@ -25,12 +25,12 @@ func _on_fov_slider_changed(value: float) -> void: func _on_graphics_apply_button_pressed() -> void: var values: Array = resolution_input.text.split_floats("x") + var id: int = resolution_input.get_selected_id() - GameSettingsManager.graphics_resolution_changed.emit(Vector2i(values[0], values[1])) + GameSettingsManager.graphics_resolution_changed.emit(Vector2i(values[0], values[1]), id) GameSettingsManager.graphics_fullscreen_changed.emit(fullscreen_input.button_pressed) GameSettingsManager.graphics_vsync_changed.emit(vsync_input.button_pressed) GameSettingsManager.apply_graphics_settings.emit() - #endregion #region Audio Settings From 89402721b2c66356388b6dc78f1fb022ed48ec68 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sun, 23 Mar 2025 14:53:01 -0400 Subject: [PATCH 12/13] Load saved settings on game run --- scenes/root.gd | 5 +++++ scenes/root.gd.uid | 1 + scenes/root.tscn | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 scenes/root.gd create mode 100644 scenes/root.gd.uid diff --git a/scenes/root.gd b/scenes/root.gd new file mode 100644 index 0000000..2037d63 --- /dev/null +++ b/scenes/root.gd @@ -0,0 +1,5 @@ +extends Node + + +func _enter_tree() -> void: + GameSettingsManager.load_settings.emit() diff --git a/scenes/root.gd.uid b/scenes/root.gd.uid new file mode 100644 index 0000000..254b197 --- /dev/null +++ b/scenes/root.gd.uid @@ -0,0 +1 @@ +uid://cnnx3qtqvpwgg diff --git a/scenes/root.tscn b/scenes/root.tscn index 2909961..c2deef4 100644 --- a/scenes/root.tscn +++ b/scenes/root.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=3 format=3 uid="uid://cgx0nawwjjj7g"] +[gd_scene load_steps=4 format=3 uid="uid://cgx0nawwjjj7g"] +[ext_resource type="Script" uid="uid://cnnx3qtqvpwgg" path="res://scenes/root.gd" id="1_lrqlo"] [ext_resource type="PackedScene" uid="uid://mkfitwqnerku" path="res://scenes/world/world.tscn" id="2_vvh5c"] [ext_resource type="PackedScene" uid="uid://c7fj7wla8bd70" path="res://scenes/ui/ui.tscn" id="3_vvh5c"] [node name="Root" type="Node"] +script = ExtResource("1_lrqlo") [node name="World" parent="." instance=ExtResource("2_vvh5c")] From 5082eeb39bafa81e739f6f619b871b6353034767 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Sun, 23 Mar 2025 14:53:30 -0400 Subject: [PATCH 13/13] Set the default value of the settings menu --- scenes/ui/menus/settings_menu.gd | 25 +++++++++++++++++++++++++ scenes/ui/menus/settings_menu.tscn | 4 +++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/scenes/ui/menus/settings_menu.gd b/scenes/ui/menus/settings_menu.gd index 014e71c..3b69e40 100644 --- a/scenes/ui/menus/settings_menu.gd +++ b/scenes/ui/menus/settings_menu.gd @@ -2,6 +2,10 @@ class_name SettingsMenu extends Panel +@export_group("Game Option Nodes") +@export var block_highlight_input: CheckButton +@export var waila_input: CheckButton + @export_group("Graphics Settings Nodes") @export var resolution_input: OptionButton @export var fullscreen_input: CheckBox @@ -10,6 +14,27 @@ extends Panel @export var fov_value_label: Label +func _ready() -> void: + apply_default_values() + + +func apply_default_values() -> void: + #region Game Options + block_highlight_input.set_pressed_no_signal(GameSettingsManager.settings.game_options.enable_block_highlight) + waila_input.set_pressed_no_signal(GameSettingsManager.settings.game_options.enable_waila) + #endregion + + #region Graphics Settings + # Changing the FOV value should trigger the value_changed signal which should update the camera and label automatically + fov_slider.value = GameSettingsManager.settings.graphics.fov + fullscreen_input.set_pressed_no_signal(GameSettingsManager.settings.graphics.fullscreen) + vsync_input.set_pressed_no_signal(GameSettingsManager.settings.graphics.vsync) + + var current_resolution_index: int = resolution_input.get_item_index(GameSettingsManager.settings.graphics.resolution_id) + resolution_input.select(current_resolution_index) + #endregion + + #region Game Settings func _on_block_highlighting_toggled(toggled_on: bool) -> void: GameSettingsManager.game_options_block_highlight_changed.emit(toggled_on) diff --git a/scenes/ui/menus/settings_menu.tscn b/scenes/ui/menus/settings_menu.tscn index cac1a44..79bfc88 100644 --- a/scenes/ui/menus/settings_menu.tscn +++ b/scenes/ui/menus/settings_menu.tscn @@ -14,7 +14,7 @@ corner_radius_top_right = 2 corner_radius_bottom_right = 2 corner_radius_bottom_left = 2 -[node name="SettingsMenu" type="Panel" node_paths=PackedStringArray("resolution_input", "fullscreen_input", "vsync_input", "fov_slider", "fov_value_label")] +[node name="SettingsMenu" type="Panel" node_paths=PackedStringArray("block_highlight_input", "waila_input", "resolution_input", "fullscreen_input", "vsync_input", "fov_slider", "fov_value_label")] process_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -22,6 +22,8 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_qwcqe") +block_highlight_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Game/BlockHighlight/CheckButton") +waila_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Game/Waila/CheckButton") resolution_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Resolution/OptionButton") fullscreen_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Fullscreen/CheckBox") vsync_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/VSync/CheckBox")