extends Node ## Persistent settings. Music cannot be turned down (satire). signal settings_changed const MUSIC_BUS := "Music" const SFX_BUS := "SFX" const VOICE_BUS := "Voice" var language: String = "de" var sfx_volume: float = 1.0 ## Intentionally locked loud — slider is UI-disabled. var music_volume: float = 1.0 var language_chosen: bool = false func _ready() -> void: _ensure_buses() apply_audio() func needs_language_picker() -> bool: return not language_chosen func _ensure_buses() -> void: _ensure_bus(MUSIC_BUS) _ensure_bus(SFX_BUS) _ensure_bus(VOICE_BUS) func _ensure_bus(bus_name: String) -> void: if AudioServer.get_bus_index(bus_name) != -1: return AudioServer.add_bus() var idx := AudioServer.bus_count - 1 AudioServer.set_bus_name(idx, bus_name) AudioServer.set_bus_send(idx, "Master") func set_language(lang: String) -> void: if lang not in ["de", "en", "by"]: return language = lang language_chosen = true Locale.reload() AudioDirector.play_language_voice(lang) settings_changed.emit() GameState.save_game() func set_sfx_volume(value: float) -> void: sfx_volume = clampf(value, 0.0, 1.0) apply_audio() settings_changed.emit() GameState.save_game() func set_music_volume(_value: float) -> void: music_volume = 1.0 apply_audio() settings_changed.emit() func apply_audio() -> void: _set_bus_linear(MUSIC_BUS, music_volume) _set_bus_linear(SFX_BUS, sfx_volume) _set_bus_linear(VOICE_BUS, sfx_volume) func _set_bus_linear(bus_name: String, linear: float) -> void: var idx := AudioServer.get_bus_index(bus_name) if idx == -1: return var db := -80.0 if linear <= 0.0001 else 20.0 * log(linear) / log(10.0) AudioServer.set_bus_volume_db(idx, db) func serialize() -> Dictionary: return { "language": language, "sfx_volume": sfx_volume, "music_volume": 1.0, "language_chosen": language_chosen, } func deserialize(data: Dictionary) -> void: language = str(data.get("language", "de")) sfx_volume = float(data.get("sfx_volume", 1.0)) music_volume = 1.0 language_chosen = bool(data.get("language_chosen", false)) Locale.reload() apply_audio() settings_changed.emit()