extends Node # MusicManager - Persistent singleton for handling background music across scenes # Autoloaded as "MusicManager" var music_player: AudioStreamPlayer var current_track: String = "" func _ready(): process_mode = Node.PROCESS_MODE_ALWAYS # Ensure music plays during pause music_player = AudioStreamPlayer.new() music_player.name = "BackgroundMusicPlayer" music_player.bus = "Music" add_child(music_player) music_player.finished.connect(_on_music_finished) # Do NOT auto-start music here anymore as per user request # We will call start_music() from Main scene # Connect to LobbyManager signals if it exists if has_node("/root/LobbyManager"): get_node("/root/LobbyManager").game_mode_changed.connect(_on_game_mode_changed) func _on_game_mode_changed(_mode: String): start_music() func start_music(): var current_scene = get_tree().current_scene if not current_scene: return if current_scene.name == "Lobby": play_track("res://assets/sounds/lobby.wav") return if current_scene.name != "Main" and current_scene.name != "LoadingScreen": print("[MusicManager] Not in Main or Lobby scene (currently in ", current_scene.name, "), skipping music.") return var game_mode = "Freemode" if has_node("/root/LobbyManager"): game_mode = get_node("/root/LobbyManager").game_mode var track_path = "" match game_mode: "Stop n Go": track_path = "res://assets/sounds/stop_n_go.wav" "Freemode", "Tekton Doors", _: track_path = "res://assets/sounds/level_bridge.wav" play_track(track_path) func play_track(track_path: String): print("[MusicManager] Attempting to play track: ", track_path) if current_track == track_path and music_player.playing: print("[MusicManager] Already playing this track, skipping.") return if track_path == "": print("[MusicManager] Empty track path, stopping music.") music_player.stop() current_track = "" return if not ResourceLoader.exists(track_path): print("[MusicManager] ERROR: Track file not found: ", track_path) return var stream = load(track_path) if not stream: print("[MusicManager] ERROR: Failed to load stream from: ", track_path) return if stream is AudioStreamWAV: # Godot 4 looping settings for WAV stream.loop_mode = AudioStreamWAV.LOOP_FORWARD # Ensure loop end is at the very end of the file if not set if stream.loop_end == 0: stream.loop_end = stream.data.size() # This is a guess, but loop_mode 1 usually handles it print("[MusicManager] Configured WAV loop mode for: ", track_path) music_player.stream = stream # Verify bus exists before playing var bus_idx = AudioServer.get_bus_index("Music") if bus_idx == -1: print("[MusicManager] Warning: 'Music' bus not found, falling back to 'Master'") music_player.bus = "Master" else: music_player.bus = "Music" music_player.play() current_track = track_path print("[MusicManager] play() called successfully for: ", track_path, " on bus: ", music_player.bus) func stop_music(): music_player.stop() current_track = "" func _on_music_finished(): print("[MusicManager] Track finished: ", current_track) # Fallback looping if for some reason the native loop didn't work if current_track != "": print("[MusicManager] Restarting track (manual loop fallback): ", current_track) music_player.play()