extends Node const MIN_VOLUME = -60. const MAX_VOLUME = 24. @onready var settings : SettingsData = GameInfo.settings_data @export var default_fade_time = 0.5 @export var playing_music : AudioStreamPlayer = null @export var playing_ambiance : AudioStreamPlayer = null var default_volumes := {} func _ready(): for player in get_all_players(): player.stop() fetch_default_volumes() setup_volume() settings.sound_changed.connect( func(_s) : setup_volume() ) SceneManager.scene_loaded.connect(_on_change_scene) func _on_change_scene(scene : Scene): play_ambiance() match scene.scene_id: "TITLE": play_music("Title") "REGION": play_music("Region") play_ambiance("Exterior") "COCKPIT": play_music("Truck") func fetch_default_volumes(): var all_players := get_all_players() for player in all_players: default_volumes[player] = player.volume_db func setup_volume(): for player in get_all_players(): player.volume_db = get_volume_from_parent(player) func get_volume_from_parent(player : AudioStreamPlayer) -> float: var settings_volume = 0.5 if player.get_parent() == %Ambiance: settings_volume = settings.ambiance_volume elif player.get_parent() == %Sfx: settings_volume = settings.sfx_volume elif player.get_parent() == %Musics: settings_volume = settings.music_volume return default_volumes[player] + lerp(MIN_VOLUME, MAX_VOLUME, settings_volume) func get_all_players() -> Array[AudioStreamPlayer]: var players : Array[AudioStreamPlayer] = [] players.append_array(get_players_from_node(%Musics)) players.append_array(get_players_from_node(%Ambiance)) players.append_array(get_players_from_node(%Sfx)) return players func get_players_from_node(node : Node) -> Array[AudioStreamPlayer]: var streams : Array[AudioStreamPlayer] = [] for c in node.get_children(): if c is AudioStreamPlayer: streams.append(c) return streams func set_volume(player : AudioStreamPlayer, to : float, fade_time = default_fade_time) -> Tween: var fade_tween : Tween = get_tree().create_tween() fade_tween.tween_property(player, "volume_db", to, fade_time) return fade_tween func reset_volume(player : AudioStreamPlayer): player.volume_db = get_volume_from_parent(player) func play_sfx(sfx_name : String): var player := %Sfx.find_child(sfx_name) as AudioStreamPlayer if player: player.play() else: printerr("Sfx %s not found" % sfx_name) func play_music(music_name : String = ""): var old_music = playing_music playing_music = null if old_music: await set_volume(old_music, MIN_VOLUME).finished if old_music and old_music != playing_music: print(old_music) old_music.stop() reset_volume(old_music) if music_name: var player := %Musics.find_child(music_name) as AudioStreamPlayer if player: playing_music = player player.play() set_volume(player, get_volume_from_parent(player)) else: printerr("Music %s not found" % music_name) func play_ambiance(ambiance_name : String = ""): var old_ambiance = playing_ambiance playing_ambiance = null if old_ambiance: await set_volume(old_ambiance, MIN_VOLUME).finished if old_ambiance and old_ambiance != playing_ambiance: old_ambiance.stop() reset_volume(old_ambiance) if ambiance_name: var player := %Ambiance.find_child(ambiance_name) as AudioStreamPlayer if player: playing_ambiance = player player.play() set_volume(player, get_volume_from_parent(player)) else: printerr("Ambiance %s not found" % ambiance_name)