109 lines
3.2 KiB
GDScript
109 lines
3.2 KiB
GDScript
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()
|