Randoloot/scripts/game/game_settings.gd
2026-10-27 22:20:01 +01:00

78 lines
3.3 KiB
GDScript

extends Node
signal settings_changed
const PATH := "user://settings.cfg"
const INTERFACE_TRANSLATION := preload("res://scripts/game/interface_translation.gd")
const LOCALES := ["pl", "de", "es", "en", "fr"]
const CATALOGS := {
"de": preload("res://resources/localization/de_catalog.gd").MESSAGES,
"es": preload("res://resources/localization/es_catalog.gd").MESSAGES,
"en": preload("res://resources/localization/en_catalog.gd").MESSAGES,
"fr": preload("res://resources/localization/fr_catalog.gd").MESSAGES,
}
const LANGUAGES := ["Polski", "Deutsch", "Español", "English", "Français"]
const RESOLUTIONS := [Vector2i(1024,576), Vector2i(1280,720), Vector2i(1600,900), Vector2i(1920,1080), Vector2i(2560,1440), Vector2i(3840,2160)]
var volume := 0.8
var music_volume := 0.8
var resolution := Vector2i(1280,720)
var fullscreen := false
var locale := "pl"
var _translations: Array[Translation] = []
func _ready() -> void:
process_mode = Node.PROCESS_MODE_ALWAYS
_load_translations()
var config := ConfigFile.new()
if config.load(PATH) == OK:
volume = clampf(float(config.get_value("audio", "master", 0.8)), 0, 1)
music_volume = clampf(float(config.get_value("audio", "music", 0.8)), 0, 1)
var stored: Variant = config.get_value("display", "resolution", Vector2i(1280,720))
if stored is Vector2i and stored in RESOLUTIONS: resolution = stored
fullscreen = bool(config.get_value("display", "fullscreen", false))
locale = str(config.get_value("language", "locale", "pl"))
if locale not in LOCALES: locale = "pl"
apply()
func _load_translations() -> void:
for code in LOCALES:
var catalog: Dictionary = CATALOGS.get(code, {})
var translation := INTERFACE_TRANSLATION.new()
translation.configure(code, catalog)
TranslationServer.add_translation(translation)
_translations.append(translation)
func _exit_tree() -> void:
# Unregister scripted callbacks before Godot tears down script resources.
for translation in _translations: TranslationServer.remove_translation(translation)
_translations.clear()
func apply() -> void:
AudioServer.set_bus_volume_db(0, linear_to_db(maxf(volume, 0.0001)))
AudioServer.set_bus_mute(0, volume <= 0.0)
var music_bus := AudioServer.get_bus_index("Music")
if music_bus < 0:
AudioServer.add_bus()
music_bus = AudioServer.bus_count - 1
AudioServer.set_bus_name(music_bus, "Music")
AudioServer.set_bus_send(music_bus, "Master")
AudioServer.set_bus_volume_db(music_bus, linear_to_db(maxf(music_volume, 0.0001)))
AudioServer.set_bus_mute(music_bus, music_volume <= 0.0)
TranslationServer.set_locale(locale)
if DisplayServer.get_name() != "headless":
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN if fullscreen else DisplayServer.WINDOW_MODE_WINDOWED)
if not fullscreen:
var available := DisplayServer.screen_get_usable_rect()
var actual := Vector2i(mini(resolution.x, available.size.x), mini(resolution.y, available.size.y))
DisplayServer.window_set_size(actual)
DisplayServer.window_set_position(available.position + (available.size - actual) / 2)
settings_changed.emit()
func save_settings() -> Error:
var config := ConfigFile.new()
config.set_value("audio", "master", volume)
config.set_value("audio", "music", music_volume)
config.set_value("display", "resolution", resolution)
config.set_value("display", "fullscreen", fullscreen)
config.set_value("language", "locale", locale)
return config.save(PATH)