139 lines
4.0 KiB
GDScript
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)
|