feat: implement settings menu, audio management system, and lobby UI framework

This commit is contained in:
Yogi Wiguna
2026-03-31 21:36:26 +08:00
parent 193aae94ba
commit cc19c7852d
15 changed files with 221 additions and 6 deletions
+107
View File
@@ -0,0 +1,107 @@
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/freemode.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("[MusicManag
+1
View File
@@ -0,0 +1 @@
uid://d02o4qmj5ttcg
+9
View File
@@ -154,9 +154,18 @@ func apply_video_settings():
func apply_audio_settings():
var audio = settings.audio
print("[SettingsManager] Applying audio settings: ", audio)
set_bus_volume("Master", audio.master_volume)
set_bus_volume("Music", audio.music_volume)
set_bus_volume("SFX", audio.sfx_volume)
# Explicitly ensure Music and SFX are routed to Master if they exist
var master_idx = AudioServer.get_bus_index("Master")
if master_idx != -1:
var music_idx = AudioServer.get_bus_index("Music")
if music_idx != -1: AudioServer.set_bus_send(music_idx, "Master")
var sfx_idx = AudioServer.get_bus_index("SFX")
if sfx_idx != -1: AudioServer.set_bus_send(sfx_idx, "Master")
func set_bus_volume(bus_name: String, volume_linear: float):
var bus_idx = AudioServer.get_bus_index(bus_name)