extends Node const MIN_VOLUME = -60. var is_ready = false @export var music_volume : float = 0. : set(v): music_volume = v if is_ready: setup_volume() @export var ambiance_volume : float = 0. : set(v): ambiance_volume = v if is_ready: setup_volume() @export var default_fade_time = 1.0 @export var garden_phase = 0 @export var garden_phases_scores : Array[int] @export var playing_musics : Array[AudioStreamPlayer] = [] @export var playing_ambiances : Array[AudioStreamPlayer] = [] func _ready(): GameInfo.game_data.current_planet_data_updated.connect(_on_current_planet_data_updated) setup_volume() is_ready = true func setup_volume(): for c in %Ambiance.get_children(): var player = c as AudioStreamPlayer player.volume_db = ambiance_volume if playing_ambiances.find(player) != -1 else MIN_VOLUME for c in %Musics.get_children(): var player = c as AudioStreamPlayer player.volume_db = music_volume if playing_musics.find(player) != -1 else MIN_VOLUME for player in get_all_audio_stream(): player.play() setup_phase(player) func update_phase(): for player in get_all_audio_stream(): setup_phase(player) func get_all_audio_stream() -> Array[AudioStreamPlayer]: var all_audio_stream : Array[AudioStreamPlayer] = [] var all_children = %Ambiance.get_children() all_children.append_array(%Musics.get_children()) for c in all_children: if c is AudioStreamPlayer: all_audio_stream.append(c) return all_audio_stream 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 update_phase() garden_phase = phase func enter_planet(): set_volume(%Planet, music_volume) set_volume(%Truck, MIN_VOLUME) func enter_truck(): set_volume(%Planet, MIN_VOLUME) set_volume(%Truck, music_volume) func stop_music(music : AudioStreamPlayer, with_fade = false): if playing_musics.find(music) != -1: playing_musics.remove_at(playing_musics.find(music)) set_volume(music, MIN_VOLUME, with_fade) func play_music(music : AudioStreamPlayer, with_fade = false): playing_musics.append(music) set_volume(music, music_volume, 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