extends Node const MIN_VOLUME = -60. const MAX_VOLUME = 24. const DEFAULT_FADE_TIME : float = 0.5 @onready var settings : SettingsData = GameInfo.settings_data var music_action : AudioAction var ambiance_action : AudioAction var playing_music : AudioStreamPlayer = null var playing_ambiance : AudioStreamPlayer = null var default_volumes := {} func _ready(): for player in get_all_players(): player.stop() fetch_default_volumes() # setup_players_bus() settings.sound_changed.connect( func(_s) : setup_players_bus() ) SceneManager.scene_loaded.connect(_on_change_scene) Dialogic.timeline_started.connect(_on_timeline_started) Dialogic.timeline_ended.connect(_on_timeline_ended) func _process(_d): if music_action: playing_music = process_audio_action( music_action, %Musics, playing_music ) music_action = null if ambiance_action: playing_ambiance = process_audio_action( ambiance_action, %Ambiance, playing_ambiance ) ambiance_action = null func process_audio_action( audio_action : AudioAction, player_search_node: Node, current_player: AudioStreamPlayer = null ) -> AudioStreamPlayer: if audio_action is AudioLaunch: return process_audio_launch(audio_action, player_search_node, current_player) elif audio_action is AudioStop and current_player and current_player.playing: stop_player(current_player) return null func process_audio_launch( audio_launch : AudioLaunch, player_search_node: Node, current_player: AudioStreamPlayer = null, ) -> AudioStreamPlayer: var player = player_search_node.find_child(audio_launch.player_name) if not player: printerr("Player %s not found in category %s" % [audio_launch.player_name, player_search_node.name]) return null if current_player and current_player.playing and current_player.name == audio_launch.player_name: return current_player elif current_player: stop_player(current_player) start_player(player, audio_launch.from_random_time, audio_launch.fade_time) return player func _on_change_scene(scene : Scene): stop_ambiance() match scene.scene_id: "TITLE": play_music("Title", false, 0.0) "REGION": play_music("Region", true) play_ambiance("Exterior", true) "COCKPIT": play_music("Truck", true) func _on_timeline_started(): var timeline_name = Dialogic.current_timeline.resource_path.split("/")[-1].trim_suffix(".dtl") # Timeline name et le nom du fichier de timeline, par exemple demeter_intro # Amuse toi Nilou ;) func _on_timeline_ended(): _on_change_scene(SceneManager.actual_scene) func play_music(player_name : String = "", from_random_time := false, fade_time := DEFAULT_FADE_TIME): music_action = AudioLaunch.new( player_name, from_random_time, fade_time ) func stop_music(): music_action = AudioStop.new() func play_ambiance(player_name : String = "", from_random_time := false, fade_time := DEFAULT_FADE_TIME): ambiance_action = AudioLaunch.new( player_name, from_random_time, fade_time ) func stop_ambiance(): ambiance_action = AudioStop.new() func fetch_default_volumes(): var all_players := get_all_players() for player in all_players: default_volumes[player] = player.volume_db func setup_players_bus(): for player in get_all_players(): if player.get_parent() == %Musics: player.bus = (AudioServer.get_bus_name(SettingsData.MUSIC_BUS_ID)) elif player.get_parent() == %Sfx: player.bus = (AudioServer.get_bus_name(SettingsData.SFX_BUS_ID)) elif player.get_parent() == %Ambiance: player.bus = (AudioServer.get_bus_name(SettingsData.AMBIANCE_BUS_ID)) func get_volume(player : AudioStreamPlayer) -> float: return default_volumes[player] 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 := 0.0) -> Tween: var fade_tween : Tween = get_tree().create_tween() fade_tween.tween_property(player, "volume_db", to, fade_time) return fade_tween func start_player(player: AudioStreamPlayer, from_random_time = false, fade_time = DEFAULT_FADE_TIME): if player and not player.playing: player.play( 0.0 if not from_random_time else randf_range(0.0, player.stream.get_length()) ) if fade_time > 0.0: player.volume_db = MIN_VOLUME await set_volume(player, get_volume(player), fade_time).finished func stop_player(player : AudioStreamPlayer, fade_time = DEFAULT_FADE_TIME): if player and player.playing: if fade_time > 0.0: await set_volume(player, MIN_VOLUME, fade_time).finished player.stop() player.volume_db = get_volume(player) func reset_volume(player : AudioStreamPlayer): player.volume_db = get_volume(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) class AudioAction: pass class AudioLaunch extends AudioAction: var player_name : String var from_random_time : bool var fade_time : float func _init( _player_name : String, _from_random_time := false, _fade_time := DEFAULT_FADE_TIME, ): player_name = _player_name from_random_time = _from_random_time fade_time = _fade_time class AudioStop extends AudioAction: pass