extends Node const MIN_VOLUME = -60. const MAX_VOLUME = 24. @onready var settings : SettingsData = GameInfo.game_data.settings @export var default_fade_time = 1.0 @export var garden_phase = 0 @export var garden_phases_scores : Array[int] @export var playing_soundtracks : Array[AudioStreamPlayer] = [] var default_volumes := {} func _ready(): GameInfo.game_data.current_planet_data_updated.connect(_on_current_planet_data_updated) fetch_default_volumes() setup_volume() settings.sound_changed.connect( func(_s) : setup_volume() ) for player in get_all_soundtrack_players(): player.play() func fetch_default_volumes(): var all_players := get_all_soundtrack_players() all_players.append_array(get_all_sfx_players()) for player in all_players: default_volumes[player] = player.volume_db func setup_volume(): for player in get_all_soundtrack_players(): player.volume_db = get_volume_from_parent(player) if ( playing_soundtracks.find(player) != -1 ) else MIN_VOLUME setup_phase(player) for player in get_all_sfx_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 update_phase(): for player in get_all_soundtrack_players(): var playing : bool = player.volume_db != MIN_VOLUME if playing: await set_volume(player, MIN_VOLUME).finished setup_phase(player) if playing: set_volume(player, get_volume_from_parent(player)) func get_all_soundtrack_players() -> Array[AudioStreamPlayer]: var players : Array[AudioStreamPlayer] = [] players.append_array(get_players_from_node(%Musics)) players.append_array(get_players_from_node(%Ambiance)) return players func get_all_sfx_players() -> Array[AudioStreamPlayer]: return get_players_from_node(%Sfx) 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 _on_current_planet_data_updated(planet_data : PlanetData): if planet_data: update_garden_phase(planet_data) planet_data.updated.connect(update_garden_phase) func update_garden_phase(planet_data : PlanetData): var phase : int = garden_phase for i in range(len(garden_phases_scores)): if planet_data.garden_score >= garden_phases_scores[i] and i > garden_phase: phase = i if garden_phase != phase: update_phase() garden_phase = phase func enter_planet(): play_music(%Planet, true) stop_music(%Truck, true) func enter_truck(): play_music(%Truck, true) stop_music(%Planet, true) func stop_music(music : AudioStreamPlayer, with_fade = false): if playing_soundtracks.find(music) != -1: playing_soundtracks.remove_at(playing_soundtracks.find(music)) set_volume(music, MIN_VOLUME, with_fade) func play_music(player : AudioStreamPlayer, with_fade = false): playing_soundtracks.append(player) set_volume(player, get_volume_from_parent(player), with_fade) func setup_phase(music : AudioStreamPlayer): if music.stream is AudioStreamSynchronized: var sync_stream = music.stream as AudioStreamSynchronized var phase_stream_id = min(garden_phase, sync_stream.stream_count - 1) for i in range(sync_stream.stream_count): sync_stream.set_sync_stream_volume( i, 0. if i == phase_stream_id else MIN_VOLUME ) func set_volume(music : AudioStreamPlayer, to : float, fade_time = default_fade_time) -> Tween: var fade_tween : Tween = get_tree().create_tween() fade_tween.tween_property(music, "volume_db", to, fade_time) return fade_tween func play_sfx(name : String): var player := %Sfx.find_child(name) as AudioStreamPlayer if player: player.play() else: printerr("Sfx %s not found" % name)