diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 0000000..715ca52 --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,9 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://bgs4iykhuoux0"] + +[resource] +bus/1/name = &"Sounds" +bus/1/solo = false +bus/1/mute = false +bus/1/bypass_fx = false +bus/1/volume_db = 0.00282288 +bus/1/send = &"Master" diff --git a/elements/gravity.tscn b/elements/gravity.tscn index 533c7a3..533369c 100644 --- a/elements/gravity.tscn +++ b/elements/gravity.tscn @@ -58,8 +58,10 @@ func _input(ev: InputEvent) -> void: if $AnimationPlayer.is_playing(): $AnimationPlayer.stop() - $AudioStreamPlayer.play() $AnimationPlayer.play(\"grow_fadeout\") + + if Settings.sound_on_gravity_change: + $AudioStreamPlayer.play() " [sub_resource type="Animation" id="Animation_6rwl4"] @@ -161,3 +163,4 @@ libraries = { stream = ExtResource("2_5uwlw") volume_db = -6.0 mix_target = 2 +bus = &"Sounds" diff --git a/elements/ring.tscn b/elements/ring.tscn index 3244ec2..7e5786d 100644 --- a/elements/ring.tscn +++ b/elements/ring.tscn @@ -31,5 +31,6 @@ shape = SubResource("CylinderShape3D_tgirv") [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] stream = SubResource("AudioStreamRandomizer_251sn") +bus = &"Sounds" [connection signal="body_entered" from="Area3D" to="." method="_on_area_3d_body_entered"] diff --git a/levels/music.gd b/levels/music.gd index a98710a..1d14740 100644 --- a/levels/music.gd +++ b/levels/music.gd @@ -15,6 +15,7 @@ func _ready() -> void: AudioServer.add_bus() AudioServer.set_bus_name(AudioServer.bus_count - 1, self.name) bus_index = AudioServer.get_bus_index(self.name) + changeVolume(0) var current_effects = AudioServer.get_bus_effect_count(bus_index) for i in current_effects: @@ -36,7 +37,8 @@ func _ready() -> void: instrument.play() func changeVolume(db: float) -> void: - AudioServer.set_bus_volume_db(bus_index, db) + AudioServer.set_bus_volume_db(bus_index, db + Settings.volume_music) + AudioServer.set_bus_mute(bus_index, Settings.volume_music <= -15.0) func adaptInstrumentsToVelocity(velocity: float, delta: float) -> void: var instruments_needed = floor(velocity / 8) diff --git a/menus/main/area.tscn b/menus/main/area.tscn index 731bf77..d7a6b56 100644 --- a/menus/main/area.tscn +++ b/menus/main/area.tscn @@ -7,6 +7,7 @@ script/source = "extends Node3D var start_menu = preload(\"res://menus/main/start_menu.tscn\") var save_file_manager = preload(\"res://menus/main/save_file_manager.tscn\") +var settings_menu = preload(\"res://menus/main/settings_menu.tscn\") func _ready() -> void: var sm = start_menu.instantiate() @@ -20,6 +21,8 @@ func start() -> void: rotate_cube(90) func settings() -> void: + var sm = settings_menu.instantiate() + $Menus/Panel2.change_menu(sm) rotate_cube(90) func rotate_cube(degrees: int) -> void: diff --git a/menus/main/settings_menu.tscn b/menus/main/settings_menu.tscn new file mode 100644 index 0000000..285436f --- /dev/null +++ b/menus/main/settings_menu.tscn @@ -0,0 +1,96 @@ +[gd_scene load_steps=2 format=3 uid="uid://opwiiusu80nu"] + +[sub_resource type="GDScript" id="GDScript_wbybg"] +script/source = "extends Control + +func _ready() -> void: + $VBoxContainer/Fullscreen/CheckButton.button_pressed = Settings.fullscreen + $VBoxContainer/SoundGravity/CheckButton.button_pressed = Settings.sound_on_gravity_change + $VBoxContainer/VolumeMusic/HSlider.value = Settings.volume_music + $VBoxContainer/VolumeSounds/HSlider.value = Settings.volume_sounds + +func _on_fullscreen_check_button_toggled(toggled_on: bool) -> void: + Settings.fullscreen = toggled_on + +func _on_soundgravity_check_button_toggled(toggled_on: bool) -> void: + Settings.sound_on_gravity_change = toggled_on + +func _on_volumemusic_h_slider_value_changed(value: float) -> void: + Settings.volume_music = int(value) + +func _on_volumesounds_h_slider_value_changed(value: float) -> void: + Settings.volume_sounds = int(value) +" + +[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 = SubResource("GDScript_wbybg") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +alignment = 1 + +[node name="Fullscreen" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Label" type="Label" parent="VBoxContainer/Fullscreen"] +layout_mode = 2 +text = "Fullscreen" + +[node name="CheckButton" type="CheckButton" parent="VBoxContainer/Fullscreen"] +layout_mode = 2 + +[node name="SoundGravity" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Label" type="Label" parent="VBoxContainer/SoundGravity"] +layout_mode = 2 +text = "Play sound on gravity change" + +[node name="CheckButton" type="CheckButton" parent="VBoxContainer/SoundGravity"] +layout_mode = 2 + +[node name="VolumeMusic" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Label" type="Label" parent="VBoxContainer/VolumeMusic"] +layout_mode = 2 +text = "Music volume" + +[node name="HSlider" type="HSlider" parent="VBoxContainer/VolumeMusic"] +custom_minimum_size = Vector2(200, 28) +layout_mode = 2 +min_value = -15.0 +max_value = 15.0 + +[node name="VolumeSounds" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Label" type="Label" parent="VBoxContainer/VolumeSounds"] +layout_mode = 2 +text = "Sound volume" + +[node name="HSlider" type="HSlider" parent="VBoxContainer/VolumeSounds"] +custom_minimum_size = Vector2(200, 28) +layout_mode = 2 +min_value = -15.0 +max_value = 15.0 + +[connection signal="toggled" from="VBoxContainer/Fullscreen/CheckButton" to="." method="_on_fullscreen_check_button_toggled"] +[connection signal="toggled" from="VBoxContainer/SoundGravity/CheckButton" to="." method="_on_soundgravity_check_button_toggled"] +[connection signal="value_changed" from="VBoxContainer/VolumeMusic/HSlider" to="." method="_on_volumemusic_h_slider_value_changed"] +[connection signal="value_changed" from="VBoxContainer/VolumeSounds/HSlider" to="." method="_on_volumesounds_h_slider_value_changed"] diff --git a/project.godot b/project.godot index 6595a5a..3a26eb9 100644 --- a/project.godot +++ b/project.godot @@ -20,9 +20,9 @@ boot_splash/show_image=false config/icon="res://icon.png" config/windows_native_icon="res://icon.ico" -[audio] +[autoload] -buses/default_bus_layout="" +Settings="*res://settings.gd" [physics] diff --git a/settings.gd b/settings.gd new file mode 100644 index 0000000..012d467 --- /dev/null +++ b/settings.gd @@ -0,0 +1,78 @@ +extends Node + +const settings_file_name := "user://settings.save" + +var fullscreen := false : set = _set_fullscreen, get = _get_fullscreen +func _get_fullscreen() -> bool: + return fullscreen +func _set_fullscreen(new_fullscreen: bool) -> void: + fullscreen = new_fullscreen + var new_state := DisplayServer.WindowMode.WINDOW_MODE_FULLSCREEN if new_fullscreen else DisplayServer.WindowMode.WINDOW_MODE_WINDOWED + DisplayServer.window_set_mode(new_state) + save_settings() + +var sound_on_gravity_change := true : set = _set_sound_on_gravity_change, get = _get_sound_on_gravity_change +func _get_sound_on_gravity_change() -> bool: + return sound_on_gravity_change +func _set_sound_on_gravity_change(new_sound_on_gravity_change: bool) -> void: + sound_on_gravity_change = new_sound_on_gravity_change + save_settings() + +var volume_music := 0.0 : set = _set_volume_music, get = _get_volume_music +func _get_volume_music() -> float: + return volume_music +func _set_volume_music(new_volume_music: float) -> void: + volume_music = new_volume_music + for i in AudioServer.bus_count: + var bus_name := AudioServer.get_bus_name(i) + if bus_name != "Master" and bus_name != "Sounds": + AudioServer.set_bus_volume_db(i, volume_music) + AudioServer.set_bus_mute(i, volume_music <= -15.0) + save_settings() + +var volume_sounds := 0.0 : set = _set_volume_sounds, get = _get_volume_sounds +func _get_volume_sounds() -> float: + return volume_sounds +func _set_volume_sounds(new_volume_sounds: float) -> void: + var bus_index := AudioServer.get_bus_index("Sounds") + if bus_index == -1: + print("The Sounds audio bus is missing, can't set new volume!") + return + + volume_sounds = new_volume_sounds + AudioServer.set_bus_mute(bus_index, volume_sounds <= -15.0) + AudioServer.set_bus_volume_db(bus_index, volume_sounds) + save_settings() + +func _ready() -> void: + if not FileAccess.file_exists(settings_file_name): + print("The settings file has not been found, not reading from it") + return + + var settings_file := FileAccess.open(settings_file_name, FileAccess.READ) + var json := JSON.new() + var json_string := settings_file.get_line() + + if json.parse(json_string) != OK: + print("(SETTINGS) JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line()) + return + + if json.data.has("fullscreen") and typeof(json.data["fullscreen"]) == TYPE_BOOL: + fullscreen = json.data["fullscreen"] + if json.data.has("sound_on_gravity_change") and typeof(json.data["sound_on_gravity_change"]) == TYPE_BOOL: + sound_on_gravity_change = json.data["sound_on_gravity_change"] + if json.data.has("volume_music") and typeof(json.data["volume_music"]) == TYPE_FLOAT: + volume_music = json.data["volume_music"] + if json.data.has("volume_sounds") and typeof(json.data["volume_sounds"]) == TYPE_FLOAT: + volume_sounds = json.data["volume_sounds"] + +func save_settings() -> void: + var settings_file := FileAccess.open(settings_file_name, FileAccess.WRITE) + var json_string := JSON.stringify({ + "fullscreen": fullscreen, + "sound_on_gravity_change": sound_on_gravity_change, + "volume_music": volume_music, + "volume_sounds": volume_sounds, + }) + settings_file.store_line(json_string) + settings_file.store_line("FOR YOUR SAFETY, ALWAYS CHECK IF THE DATA OF THE FILES YOU DOWNLOAD LOOKS OKAY") diff --git a/settings.gd.uid b/settings.gd.uid new file mode 100644 index 0000000..6ac33eb --- /dev/null +++ b/settings.gd.uid @@ -0,0 +1 @@ +uid://6or7tnhtbqe6