From 49d4167499817dd979a678e5ed6f954ee8b1dc96 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 19 Jul 2025 22:40:07 +0400 Subject: [PATCH] Setttings added --- scripts/Main.gd | 30 ++++++++- scripts/MainMenu.gd | 3 + scripts/SettingsManager.gd | 37 ++++++++++- scripts/SettingsMenu.gd | 60 +++++++++++++++++ scripts/SettingsMenu.gd.uid | 1 + ui/MainMenu.tscn | 2 +- ui/SettingsMenu.tscn | 128 ++++++++++++++++++++++++++++++++++++ 7 files changed, 256 insertions(+), 5 deletions(-) create mode 100644 scripts/SettingsMenu.gd create mode 100644 scripts/SettingsMenu.gd.uid create mode 100644 ui/SettingsMenu.tscn diff --git a/scripts/Main.gd b/scripts/Main.gd index 982e733..ffa581c 100644 --- a/scripts/Main.gd +++ b/scripts/Main.gd @@ -1,16 +1,40 @@ extends Control @onready var press_any_key_screen = $PressAnyKeyScreen +var current_menu = null func _ready(): print("Main scene ready") - # Connect the press any key signal press_any_key_screen.any_key_pressed.connect(_on_any_key_pressed) func _on_any_key_pressed(): print("Transitioning to main menu") - # Remove the press any key screen press_any_key_screen.queue_free() - # Load and add the main menu + show_main_menu() + +func show_main_menu(): + clear_current_menu() var main_menu = preload("res://ui/MainMenu.tscn").instantiate() + main_menu.open_settings.connect(_on_open_settings) add_child(main_menu) + current_menu = main_menu + +func show_settings_menu(): + clear_current_menu() + var settings_menu = preload("res://ui/SettingsMenu.tscn").instantiate() + settings_menu.back_to_main_menu.connect(_on_back_to_main_menu) + add_child(settings_menu) + current_menu = settings_menu + +func clear_current_menu(): + if current_menu: + current_menu.queue_free() + current_menu = null + +func _on_open_settings(): + print("Opening settings menu") + show_settings_menu() + +func _on_back_to_main_menu(): + print("Back to main menu") + show_main_menu() diff --git a/scripts/MainMenu.gd b/scripts/MainMenu.gd index 10feaca..9666396 100644 --- a/scripts/MainMenu.gd +++ b/scripts/MainMenu.gd @@ -1,5 +1,7 @@ extends Control +signal open_settings + func _ready(): print("MainMenu ready") @@ -8,6 +10,7 @@ func _on_new_game_button_pressed(): func _on_settings_button_pressed(): print("Settings pressed") + open_settings.emit() func _on_exit_button_pressed(): print("Exit pressed") diff --git a/scripts/SettingsManager.gd b/scripts/SettingsManager.gd index 38c4d54..5af10fd 100644 --- a/scripts/SettingsManager.gd +++ b/scripts/SettingsManager.gd @@ -1,4 +1,39 @@ extends Node +const SETTINGS_FILE = "user://settings.cfg" +# dev `user://`=`%APPDATA%\Godot\app_userdata\Skelly` +# prod `user://`=`%APPDATA%\Skelly\` + +var settings = { + "master_volume": 0.50, + "music_volume": 0.40, + "sfx_volume": 0.50, + "language": "en" +} + func _ready(): - pass + print("SettingsManager ready") + load_settings() + +func load_settings(): + var config = ConfigFile.new() + if config.load(SETTINGS_FILE) == OK: + for key in settings.keys(): + settings[key] = config.get_value("settings", key, settings[key]) + print("Settings loaded: ", settings) + else: + print("No settings file found, using defaults") + +func save_settings(): + var config = ConfigFile.new() + for key in settings.keys(): + config.set_value("settings", key, settings[key]) + config.save(SETTINGS_FILE) + print("Settings saved: ", settings) + +func get_setting(key: String): + return settings.get(key) + +func set_setting(key: String, value): + settings[key] = value + save_settings() diff --git a/scripts/SettingsMenu.gd b/scripts/SettingsMenu.gd new file mode 100644 index 0000000..83b9aaa --- /dev/null +++ b/scripts/SettingsMenu.gd @@ -0,0 +1,60 @@ +extends Control + +signal back_to_main_menu + +@onready var master_slider = $SettingsContainer/MasterVolumeContainer/MasterVolumeSlider +@onready var music_slider = $SettingsContainer/MusicVolumeContainer/MusicVolumeSlider +@onready var sfx_slider = $SettingsContainer/SFXVolumeContainer/SFXVolumeSlider +@onready var language_selector = $SettingsContainer/LanguageContainer/LanguageSelector + +func _ready(): + print("SettingsMenu ready") + # Load current settings into sliders + master_slider.value = SettingsManager.get_setting("master_volume") + music_slider.value = SettingsManager.get_setting("music_volume") + sfx_slider.value = SettingsManager.get_setting("sfx_volume") + + # Connect slider signals + master_slider.value_changed.connect(_on_master_volume_changed) + music_slider.value_changed.connect(_on_music_volume_changed) + sfx_slider.value_changed.connect(_on_sfx_volume_changed) + + # Load language setting + var current_lang = SettingsManager.get_setting("language") + var lang_index = get_language_index(current_lang) + language_selector.selected = lang_index + +func _on_master_volume_changed(value: float): + SettingsManager.set_setting("master_volume", value) + print("Master volume changed to: ", value) + +func _on_music_volume_changed(value: float): + SettingsManager.set_setting("music_volume", value) + print("Music volume changed to: ", value) + +func _on_sfx_volume_changed(value: float): + SettingsManager.set_setting("sfx_volume", value) + print("SFX volume changed to: ", value) + +func _input(event): + if event.is_action_pressed("ui_cancel") or event.is_action_pressed("ui_menu_toggle"): + print("ESC pressed in settings") + back_to_main_menu.emit() + get_viewport().set_input_as_handled() + +func _on_back_button_pressed(): + print("Back button pressed") + back_to_main_menu.emit() + +func get_language_index(lang_code: String) -> int: + match lang_code: + "en": return 0 + "es": return 1 + "fr": return 2 + "de": return 3 + _: return 0 + +func _on_language_selector_item_selected(index: int): + var lang_codes = ["en", "es", "fr", "de"] + SettingsManager.set_setting("language", lang_codes[index]) + print("Language changed to: ", lang_codes[index]) diff --git a/scripts/SettingsMenu.gd.uid b/scripts/SettingsMenu.gd.uid new file mode 100644 index 0000000..3d2dc32 --- /dev/null +++ b/scripts/SettingsMenu.gd.uid @@ -0,0 +1 @@ +uid://c8mlvlerv4y03 diff --git a/ui/MainMenu.tscn b/ui/MainMenu.tscn index b58eefc..2e3d732 100644 --- a/ui/MainMenu.tscn +++ b/ui/MainMenu.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://m8lf3eh3al5j"] -[ext_resource type="Script" uid="uid://ctu58xq7btp1n" path="res://scripts/MainMenu.gd" id="1_b00nv"] +[ext_resource type="Script" uid="uid://cjymuibtoi0tk" path="res://scripts/MainMenu.gd" id="1_b00nv"] [node name="MainMenu" type="Control"] layout_mode = 3 diff --git a/ui/SettingsMenu.tscn b/ui/SettingsMenu.tscn new file mode 100644 index 0000000..b89cb1a --- /dev/null +++ b/ui/SettingsMenu.tscn @@ -0,0 +1,128 @@ +[gd_scene load_steps=2 format=3 uid="uid://57obmcwyos2g"] + +[ext_resource type="Script" uid="uid://c8mlvlerv4y03" path="res://scripts/SettingsMenu.gd" id="1_oqkcn"] + +[node name="SettingsMenu" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_oqkcn") + +[node name="Background" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.209, 0.5159, 0.55, 1) + +[node name="SettingsContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -34.5 +offset_top = -20.0 +offset_right = 34.5 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="SettingsTitle" type="Label" parent="SettingsContainer"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +text = "Settings" + +[node name="MasterVolumeContainer" type="HBoxContainer" parent="SettingsContainer"] +layout_mode = 2 + +[node name="MasterVolume" type="Label" parent="SettingsContainer/MasterVolumeContainer"] +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +text = "Master Volume" + +[node name="MasterVolumeSlider" type="HSlider" parent="SettingsContainer/MasterVolumeContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1.0 +step = 0.1 +value = 0.5 + +[node name="MusicVolumeContainer" type="HBoxContainer" parent="SettingsContainer"] +layout_mode = 2 + +[node name="MusicVolume" type="Label" parent="SettingsContainer/MusicVolumeContainer"] +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +text = "Music Volume" + +[node name="MusicVolumeSlider" type="HSlider" parent="SettingsContainer/MusicVolumeContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1.0 +step = 0.1 +value = 0.5 + +[node name="SFXVolumeContainer" type="HBoxContainer" parent="SettingsContainer"] +layout_mode = 2 + +[node name="SFXVolume" type="Label" parent="SettingsContainer/SFXVolumeContainer"] +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +text = "SFX Volume" + +[node name="SFXVolumeSlider" type="HSlider" parent="SettingsContainer/SFXVolumeContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1.0 +step = 0.1 +value = 0.5 + +[node name="LanguageContainer" type="HBoxContainer" parent="SettingsContainer"] +layout_mode = 2 +size_flags_vertical = 4 + +[node name="LanguageLabel" type="Label" parent="SettingsContainer/LanguageContainer"] +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +text = "Language" + +[node name="LanguageSelector" type="OptionButton" parent="SettingsContainer/LanguageContainer"] +layout_mode = 2 +size_flags_horizontal = 4 +selected = 0 +item_count = 5 +popup/item_0/text = "English" +popup/item_0/id = 0 +popup/item_1/text = "Español" +popup/item_1/id = 1 +popup/item_2/text = "Français" +popup/item_2/id = 2 +popup/item_3/text = "Deutsch" +popup/item_3/id = 3 +popup/item_4/text = "Русский" +popup/item_4/id = 4 + +[node name="BackButtonContainer" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="Button" type="Button" parent="BackButtonContainer"] +layout_mode = 0 +offset_right = 8.0 +offset_bottom = 8.0 +text = "back" + +[connection signal="value_changed" from="SettingsContainer/MasterVolumeContainer/MasterVolumeSlider" to="." method="_on_master_volume_changed"] +[connection signal="value_changed" from="SettingsContainer/MusicVolumeContainer/MusicVolumeSlider" to="." method="_on_music_volume_changed"] +[connection signal="value_changed" from="SettingsContainer/SFXVolumeContainer/SFXVolumeSlider" to="." method="_on_sfx_volume_changed"] +[connection signal="item_selected" from="SettingsContainer/LanguageContainer/LanguageSelector" to="." method="_on_language_selector_item_selected"] +[connection signal="pressed" from="BackButtonContainer/Button" to="." method="_on_back_button_pressed"]