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

105 lines
2.9 KiB
GDScript

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