2026-09-14 18:36:02 +02:00
|
|
|
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
|
2026-09-14 19:08:00 +02:00
|
|
|
var language_chosen: bool = false
|
2026-09-14 18:36:02 +02:00
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
|
|
|
_ensure_buses()
|
|
|
|
|
apply_audio()
|
2026-09-14 19:08:00 +02:00
|
|
|
|
|
|
|
|
func needs_language_picker() -> bool:
|
|
|
|
|
return not language_chosen
|
2026-09-14 18:36:02 +02:00
|
|
|
|
|
|
|
|
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
|
2026-09-14 19:08:00 +02:00
|
|
|
language_chosen = true
|
2026-09-14 18:36:02 +02:00
|
|
|
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,
|
2026-09-14 19:08:00 +02:00
|
|
|
"language_chosen": language_chosen,
|
2026-09-14 18:36:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func deserialize(data: Dictionary) -> void:
|
|
|
|
|
language = str(data.get("language", "de"))
|
|
|
|
|
sfx_volume = float(data.get("sfx_volume", 1.0))
|
|
|
|
|
music_volume = 1.0
|
2026-09-14 19:08:00 +02:00
|
|
|
language_chosen = bool(data.get("language_chosen", false))
|
2026-09-14 18:36:02 +02:00
|
|
|
Locale.reload()
|
|
|
|
|
apply_audio()
|
|
|
|
|
settings_changed.emit()
|