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)