78 lines
3.3 KiB
GDScript
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)
|