seeding-planets/common/audio_manager/scripts/audio_manager.gd

139 lines
4.0 KiB
GDScript

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)