extends Node ## Background music that carries on across scene changes. Scenes ask for a track; the ## player crossfades to it, or keeps playing if it is already on. ## Loaded on first use rather than preloaded, so this autoload never depends on the ## music having been imported yet. Looping is set in each track's .import file. const TRACKS := { menu = "res://assets/music/menu.ogg", game = "res://assets/music/game.ogg", } const VOLUME_DB := { menu = -6.0, game = -10.0 } const FADE_SECONDS := 0.8 const SILENT_DB := -40.0 var _player := AudioStreamPlayer.new() var _track := "" func _ready() -> void: process_mode = Node.PROCESS_MODE_ALWAYS add_child(_player) func play(track: String) -> void: if track == _track and _player.playing: return _track = track if not Progress.music_on(): return var tween := create_tween() if _player.playing: tween.tween_property(_player, "volume_db", SILENT_DB, FADE_SECONDS / 2.0) tween.tween_callback(_start.bind(track)) tween.tween_property(_player, "volume_db", VOLUME_DB[track], FADE_SECONDS / 2.0) func set_enabled(on: bool) -> void: Progress.set_music_on(on) if on: var track := _track _track = "" play(track if track != "" else "menu") else: _player.stop() func _start(track: String) -> void: _player.stream = load(TRACKS[track]) _player.volume_db = SILENT_DB _player.play()