diff --git a/audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav b/audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav new file mode 100644 index 0000000..5659fb2 Binary files /dev/null and b/audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav differ diff --git a/audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav.import b/audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav.import new file mode 100644 index 0000000..dcb021f --- /dev/null +++ b/audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dcpehnwdueyyo" +path="res://.godot/imported/Space Horror InGame Music (Exploration) _Clement Panchout.wav-9d35410fa91625c5f4d02f369a39bf2e.sample" + +[deps] + +source_file="res://audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav" +dest_files=["res://.godot/imported/Space Horror InGame Music (Exploration) _Clement Panchout.wav-9d35410fa91625c5f4d02f369a39bf2e.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sources.yaml b/audio/sources.yaml new file mode 100644 index 0000000..7a4d40d --- /dev/null +++ b/audio/sources.yaml @@ -0,0 +1,2 @@ +- fileName: Space Horror InGame Music (Exploration) _Clement Panchout + commonUrl: https://clement-panchout.itch.io/yet-another-free-music-pack diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 0000000..e6d519b --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,15 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://c4bwiq14nq074"] + +[resource] +bus/1/name = &"SFX" +bus/1/solo = false +bus/1/mute = false +bus/1/bypass_fx = false +bus/1/volume_db = 0.0 +bus/1/send = &"Master" +bus/2/name = &"Music" +bus/2/solo = false +bus/2/mute = false +bus/2/bypass_fx = false +bus/2/volume_db = 0.0 +bus/2/send = &"Master" diff --git a/scripts/AudioManager.gd b/scripts/AudioManager.gd index 38c4d54..b15cdf5 100644 --- a/scripts/AudioManager.gd +++ b/scripts/AudioManager.gd @@ -1,4 +1,61 @@ extends Node +const MUSIC_PATH := "res://audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav" + +var music_player: AudioStreamPlayer + func _ready(): - pass + music_player = AudioStreamPlayer.new() + add_child(music_player) + + var orig_stream = _load_stream() + if not orig_stream: + push_error("Failed to load music stream: %s" % MUSIC_PATH) + return + + var stream = orig_stream.duplicate(true) as AudioStream + + _configure_stream_loop(stream) + music_player.stream = stream + _configure_audio_bus() + + if SettingsManager.get_setting("music_volume") <= 0: + return + + _start_music() + +func _load_stream() -> AudioStream: + var res = load(MUSIC_PATH) + if not res or not res is AudioStream: + return null + return res + +func _configure_stream_loop(stream: AudioStream) -> void: + if stream is AudioStreamWAV: + stream.loop_mode = AudioStreamWAV.LOOP_FORWARD + elif stream is AudioStreamOggVorbis: + stream.loop = true + +func _configure_audio_bus() -> void: + music_player.bus = "Music" + music_player.volume_db = linear_to_db(SettingsManager.get_setting("music_volume")) + +func update_music_volume(volume: float) -> void: + var volume_db = linear_to_db(volume) + music_player.volume_db = volume_db + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Music"), volume_db) + + if volume > 0: + _start_music() + else: + _stop_music() + +func _start_music() -> void: + if music_player.playing: + return + music_player.play() + +func _stop_music() -> void: + if not music_player.playing: + return + music_player.stop() diff --git a/scripts/Main.gd b/scripts/Main.gd index ffa581c..cdb7458 100644 --- a/scripts/Main.gd +++ b/scripts/Main.gd @@ -3,6 +3,9 @@ extends Control @onready var press_any_key_screen = $PressAnyKeyScreen var current_menu = null +const MAIN_MENU_SCENE = preload("res://ui/MainMenu.tscn") +const SETTINGS_MENU_SCENE = preload("res://ui/SettingsMenu.tscn") + func _ready(): print("Main scene ready") press_any_key_screen.any_key_pressed.connect(_on_any_key_pressed) @@ -14,14 +17,14 @@ func _on_any_key_pressed(): func show_main_menu(): clear_current_menu() - var main_menu = preload("res://ui/MainMenu.tscn").instantiate() + var main_menu = MAIN_MENU_SCENE.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() + var settings_menu = SETTINGS_MENU_SCENE.instantiate() settings_menu.back_to_main_menu.connect(_on_back_to_main_menu) add_child(settings_menu) current_menu = settings_menu diff --git a/scripts/SettingsManager.gd b/scripts/SettingsManager.gd index 64369d8..c23b64b 100644 --- a/scripts/SettingsManager.gd +++ b/scripts/SettingsManager.gd @@ -1,5 +1,6 @@ extends Node +const LANGUAGES_JSON_PATH := "res://localization/languages.json" const SETTINGS_FILE = "user://settings.cfg" # dev `user://`=`%APPDATA%\Godot\app_userdata\Skelly` # prod `user://`=`%APPDATA%\Skelly\` @@ -31,7 +32,10 @@ func load_settings(): print("No settings file found, using defaults") print("Language is set to: ", settings["language"]) TranslationServer.set_locale(settings["language"]) - # TODO: Apply values for volume control + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), linear_to_db(settings["master_volume"])) + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Music"), linear_to_db(settings["music_volume"])) + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("SFX"), linear_to_db(settings["sfx_volume"])) + func save_settings(): var config = ConfigFile.new() @@ -45,22 +49,36 @@ func get_setting(key: String): func set_setting(key: String, value): settings[key] = value - save_settings() + _apply_setting_side_effect(key, value) + +func _apply_setting_side_effect(key: String, value) -> void: + match key: + "language": + TranslationServer.set_locale(value) + "master_volume": + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), linear_to_db(value)) + "music_volume": + AudioManager.update_music_volume(value) + "sfx_volume": + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("SFX"), linear_to_db(value)) func load_languages(): - var file = FileAccess.open("res://localization/languages.json", FileAccess.READ) - if file: - var json_string = file.get_as_text() - file.close() - var json = JSON.new() - var parse_result = json.parse(json_string) - if parse_result == OK: - languages_data = json.data - print("Languages loaded: ", languages_data.languages.keys()) - else: - print("Error parsing languages.json") - else: + var file = FileAccess.open(LANGUAGES_JSON_PATH, FileAccess.READ) + if not file: print("Could not open languages.json") + return + + var json_string = file.get_as_text() + file.close() + + var json = JSON.new() + if json.parse(json_string) != OK: + print("Error parsing languages.json") + return + + languages_data = json.data + if languages_data.has("languages"): + print("Languages loaded: ", languages_data.languages.keys()) func get_languages_data(): return languages_data diff --git a/scripts/SettingsMenu.gd b/scripts/SettingsMenu.gd index c78cf8f..595eedf 100644 --- a/scripts/SettingsMenu.gd +++ b/scripts/SettingsMenu.gd @@ -7,49 +7,48 @@ signal back_to_main_menu @onready var sfx_slider = $SettingsContainer/SFXVolumeContainer/SFXVolumeSlider @onready var language_selector = $SettingsContainer/LanguageContainer/LanguageSelector +@export var settings_manager: Node = SettingsManager +@export var localization_manager: Node = LocalizationManager + var language_codes = [] 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) + var volume_sliders = { + "master_volume": master_slider, + "music_volume": music_slider, + "sfx_volume": sfx_slider + } + + for setting_key in volume_sliders.keys(): + var slider = volume_sliders[setting_key] + slider.value = settings_manager.get_setting(setting_key) + slider.value_changed.connect(_on_volume_slider_changed.bind(setting_key)) - # Setup language selector from JSON data setup_language_selector() update_text() +func _on_volume_slider_changed(value, setting_key): + settings_manager.set_setting(setting_key, value) -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 _exit_settings(): + print("Exiting settings") + settings_manager.save_settings() + back_to_main_menu.emit() 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() + _exit_settings() get_viewport().set_input_as_handled() func _on_back_button_pressed(): print("Back button pressed") - back_to_main_menu.emit() + _exit_settings() func setup_language_selector(): - var languages_data = SettingsManager.get_languages_data() + var languages_data = settings_manager.get_languages_data() if languages_data.has("languages"): language_selector.clear() language_codes.clear() @@ -59,22 +58,19 @@ func setup_language_selector(): var display_name = languages_data.languages[lang_code]["display_name"] language_selector.add_item(display_name) - # Set current language selection - var current_lang = SettingsManager.get_setting("language") + var current_lang = settings_manager.get_setting("language") var lang_index = language_codes.find(current_lang) if lang_index >= 0: language_selector.selected = lang_index -# Remove the old get_language_index function and update this one: func _on_language_selector_item_selected(index: int): if index < language_codes.size(): var selected_lang = language_codes[index] - SettingsManager.set_setting("language", selected_lang) + settings_manager.set_setting("language", selected_lang) print("Language changed to: ", selected_lang) - LocalizationManager.change_language(selected_lang) + localization_manager.change_language(selected_lang) func update_text(): - # Update all the label texts when language changes $SettingsContainer/SettingsTitle.text = tr("settings_title") $SettingsContainer/MasterVolumeContainer/MasterVolume.text = tr("master_volume") $SettingsContainer/MusicVolumeContainer/MusicVolume.text = tr("music_volume")