Explosion_der_Spiele/scripts/autoload/settings.gd

85 lines
2.1 KiB
GDScript3
Raw Normal View History

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()