diff options
Diffstat (limited to 'client/audio/sound.gd')
| -rw-r--r-- | client/audio/sound.gd | 72 |
1 files changed, 45 insertions, 27 deletions
diff --git a/client/audio/sound.gd b/client/audio/sound.gd index f44710bc..37ba39e1 100644 --- a/client/audio/sound.gd +++ b/client/audio/sound.gd @@ -22,37 +22,55 @@ extends Node var item_sounds: Dictionary = {} var item_id: int = 0 -var current_song = null -var dampen_music := false: - set(value): - AudioServer.set_bus_effect_enabled(1, 0, value) - AudioServer.set_bus_effect_enabled(1, 1, value) - AudioServer.set_bus_volume_db(1, -10. if value else 0.) +var current_music_player: AudioStreamPlayer +var current_music_filename = "" +var volume_target = 0. +var dampen_target = 0. +var dampen_value = 0. +const VOLUME_MIN = -30. +const FADE_SPEED = 20. +const EFFECT_FADE_SPEED = 1. -func play_music(music): - if music: - var song = music_node.get_node_or_null(music) - if song: - if song != current_song: - if current_song: - current_song.stop() - song.play() - current_song = song - else: - push_error("Song %s does not exist" % music) - else: - if current_song: - current_song.stop() - current_song = null +func set_music(filename, volume = 0., dampen = false): + if current_music_filename != filename: + var player = AudioStreamPlayer.new() + player.stream = load("res://audio/music/%s.ogg" % filename) + player.volume_db = VOLUME_MIN + 1. + player.autoplay = true + player.name = filename + player.bus = "Music" + current_music_player = player + current_music_filename = filename + $Music.add_child(player) -func set_volume(bus : int, value:float): + volume_target = volume + dampen_target = 1. if dampen else 0. + +func _process(dt: float): + for c in $Music.get_children(): + if c is AudioStreamPlayer: + if c == current_music_player: + if c.volume_db > volume_target: c.volume_db = max(volume_target, c.volume_db - dt * FADE_SPEED) + else: c.volume_db = min(volume_target, c.volume_db + dt * FADE_SPEED) + else: + c.volume_db -= dt * FADE_SPEED + if c.volume_db <= VOLUME_MIN: c.queue_free() + + var prev_dampen = dampen_value + dampen_value = G.interpolate_linear(dampen_value, dampen_target, dt * EFFECT_FADE_SPEED) + AudioServer.set_bus_effect_enabled(1, 0, dampen_value > 0.) + AudioServer.set_bus_effect_enabled(1, 1, dampen_value > 0.) + if dampen_value != prev_dampen: + var lowpass = AudioServer.get_bus_effect(1, 0) as AudioEffectFilter + var reverb = AudioServer.get_bus_effect(1, 1) as AudioEffectReverb + lowpass.cutoff_hz = lerp(3200., 400., pow(dampen_value, 10.)) + reverb.wet = dampen_value * 0.5 + +func set_volume(bus: int, value: float): AudioServer.set_bus_volume_db(bus, value) - - if value == -30: - AudioServer.set_bus_mute(bus, true) - else: - AudioServer.set_bus_mute(bus, false) + if value == -30: AudioServer.set_bus_mute(bus, true) + else: AudioServer.set_bus_mute(bus, false) func play_click(): click_sound.play() |