diff options
Diffstat (limited to 'client/global.gd')
-rw-r--r-- | client/global.gd | 249 |
1 files changed, 33 insertions, 216 deletions
diff --git a/client/global.gd b/client/global.gd index d62f5413..e5ae0ed6 100644 --- a/client/global.gd +++ b/client/global.gd @@ -19,7 +19,6 @@ class_name G extends Node -signal settings_changed() signal using_joypad_change(using: bool) signal using_touch_change(using: bool) @@ -43,86 +42,12 @@ var languages := language_array() var using_joypad := false var using_touch := false -@onready var default_settings := [ - SettingsCategory.new(tr("Gameplay"), "gameplay", { - "touch_controls": DropdownSetting.new(tr("Enable touch screen controls"), 0, [tr("Automatic"), tr("Enabled"), tr("Disabled")]), - "interpolate_camera_rotation": ToggleSetting.new(tr("Smooth camera rotation"), false), - "invert_camera": ToggleSetting.new(tr("Invert camera movement"), false), - "usernames": ToggleSetting.new(tr("Show username tags"), true), - "setup_complete": ToggleSetting.new(tr("Initial setup complete. (Uncheck and restart to reenter)"), false), - "tutorial_started": ToggleSetting.new(tr("Tutorial started"), false), - "latch_boost": ToggleSetting.new(tr("Always extend boost to maximum duration"), true), - }), - SettingsCategory.new(tr("Graphics"), "graphics", { - "fullscreen": DropdownSetting.new(tr("Fullscreen"), 0, [tr("Keep"), tr("Always"), tr("Never")]), - "aa": DropdownSetting.new(tr("Anti-aliasing"), 2 if on_high_end() else 0, [tr("Disabled"), "FXAA", "MSAA 2x", "MSAA 4x"]), - "ssao": ToggleSetting.new(tr("Ambient occlusion"), true if on_high_end() else false), - "taa": ToggleSetting.new(tr("Temporal Anti-Aliasing"), false), - "gi": DropdownSetting.new(tr("Global illumination"), 0, [tr("Disabled"), tr("SDFGI"), tr("Voxel GI")]), - "shadows": ToggleSetting.new(tr("Enable shadows"), true if on_high_end() else false), - "glow": ToggleSetting.new(tr("Enable glow"), true if on_high_end() else false), - "grass_amount": RangeSetting.new(tr("3D grass amount per grass tile"), 16 if on_high_end() else 0, 0, 32, false), - "lq_trees": ToggleSetting.new(tr("Low-poly trees"), false if on_high_end() else true), - "ui_blur": ToggleSetting.new(tr("Enable UI blur"), true) - }, [ - Preset.new(tr("Graphics"), { - tr("Low"): { - "ui_blur": true, - "aa": 0, - "ssao": false, - "taa": false, - "shadows": false, - "glow": false, - "grass_amount": 0, - "lq_trees": true - }, - tr("Medium"): { - "ui_blur": true, - "aa": 1, - "ssao": false, - "taa": false, - "shadows": true, - "glow": false, - "grass_amount": 0, - "lq_trees": false - }, - tr("High"): { - "ui_blur": true, - "aa": 2, - "ssao": true, - "taa": false, - "shadows": true, - "glow": true, - "grass_amount": 16, - "lq_trees": false - } - }) - ]), - SettingsCategory.new(tr("Audio"), "audio", { - "master_volume": RangeSetting.new(tr("Master Volume"), 0, -30, 0), - "music_volume": RangeSetting.new(tr("Music Volume"), 0, -30, 0), - "sfx_volume": RangeSetting.new(tr("SFX Volume"), 0, -30, 0), - }), - SettingsCategory.new(tr("User interface"), "ui", { - "language": DropdownSetting.new(tr("Language"), 0, languages.map(func(e): return e[1])), - "ui_scale_mode": DropdownSetting.new(tr("UI scale mode"), 0, [tr("Resize"), tr("Disabled")]), - "ui_scale_factor": RangeSetting.new(tr("UI scale factor"), 1. if not on_mobile() else 1.5, 0.5, 1.5, 3), - }), - SettingsCategory.new(tr("Controls"), "input", - InputManager.input_map_to_settings_dictionary(InputManager.default_input_map) - ), - SettingsCategory.new(tr("Other"), "other", { - "server_binary": TextSetting.new(tr("Server binary (leave empty to search PATH)"), "", tr("Enter path")), - "server_data": TextSetting.new(tr("Server data directory (leave empty to auto-detect)"), "", tr("Enter path")), - "debug_info": ToggleSetting.new(tr("Display debug info (Framerate, etc.)"), false), - }) - ] - -# Profile and settings are stored in a Dictionary[String, GameSetting] -# Unlike the default settings, the settings dictionary is not split into categories. +# profile and settings are stored in a Dictionary[String, Any] var profile: Dictionary var settings: Dictionary +var settings_tree: GameSetting + var server_url = "" var error_message = "" @@ -130,29 +55,22 @@ var focused_node: Control func _ready(): profile = load_dict("user://profile", default_profile) + settings_tree = Settings.get_root() load_settings("user://settings") - apply_settings() get_viewport().gui_focus_changed.connect(Sound.play_hover_maybe) get_viewport().gui_focus_changed.connect(func(node): focused_node = node) func _input(event): if Input.is_action_just_pressed("fullscreen"): - match Global.get_setting("fullscreen"): - 0: - # Keep setting + match Global.get_setting("graphics.fullscreen"): + "keep": if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) else: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) - 1: - # Always - set_setting("fullscreen", 2) # Set to never - update_fullscreen() - 2: - # Never - set_setting("fullscreen", 1) # Set to always - update_fullscreen() + "always": set_setting("graphics.fullscreen", "never") + "never": set_setting("graphics.fullscreen", "always") # Update using_joypad variable if event is InputEventMouseButton or event is InputEventKey: @@ -165,7 +83,7 @@ func _input(event): using_joypad_change.emit(using_joypad) # Update using_touch variable - if get_setting("touch_controls") == 0: # Only if set to automatic + if get_setting("ui.touch_controls") == 0: # Only if set to automatic if event is InputEventScreenTouch or event is InputEventScreenDrag: if not using_touch: using_touch = true @@ -175,89 +93,11 @@ func _input(event): using_touch = false using_touch_change.emit(using_touch) -func apply_settings(): - update_fullscreen() - update_language() - - # Anti-aliasing - match get_setting("aa"): - 0: - get_viewport().msaa_2d = Viewport.MSAA_DISABLED - get_viewport().msaa_3d = Viewport.MSAA_DISABLED - get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED - 1: - get_viewport().msaa_2d = Viewport.MSAA_DISABLED - get_viewport().msaa_3d = Viewport.MSAA_DISABLED - get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA - 2: - get_viewport().msaa_2d = Viewport.MSAA_2X - get_viewport().msaa_3d = Viewport.MSAA_2X - get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED - 3: - get_viewport().msaa_2d = Viewport.MSAA_4X - get_viewport().msaa_3d = Viewport.MSAA_4X - get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED - - # Temporal Anti-aliasing - get_viewport().use_taa = get_setting("taa") - - # UI scale mode - match get_setting("ui_scale_mode"): - 0: - get_tree().root.content_scale_mode = Window.CONTENT_SCALE_MODE_CANVAS_ITEMS - 1: - get_tree().root.content_scale_mode = Window.CONTENT_SCALE_MODE_DISABLED - - # UI scale factor - get_tree().root.content_scale_factor = get_setting("ui_scale_factor") - - # Hints - if not get_setting("tutorial_started"): - for k in profile["hints"].keys(): - set_hint(k, false) - - # Sets all volumes - Sound.set_volume(0, get_setting("master_volume")) - Sound.set_volume(1, get_setting("music_volume")) - Sound.set_volume(2, get_setting("sfx_volume")) - - # Touch controls - match get_setting("touch_controls"): - # 0: Automatically adjusted - 1: # Enabled - using_touch = true - 2: # Disabled - using_touch = false - using_touch_change.emit() - - # Input settings - InputManager.apply_input_map(InputManager.settings_dictionary_to_input_map(get_category_settings("input"))) - - settings_changed.emit() - -func update_language(): - var language = languages[get_setting("language")][0] - if language == "system": language = OS.get_locale_language() - TranslationServer.set_locale(language) - -func update_fullscreen(): - match get_setting("fullscreen"): - 0: pass - 1: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) - 2: if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) - func save_profile(): save_dict("user://profile", profile) func save_settings(): - for v in settings.values(): - v.fetch_setting() - var dict := {} - for k in settings.keys(): - var setting: GameSetting = settings[k] - dict[k] = setting.get_value() - save_dict("user://settings", dict) + save_dict("user://settings", settings) func save_dict(path: String, dict: Dictionary): var f = FileAccess.open(path, FileAccess.WRITE) @@ -271,29 +111,17 @@ func load_dict(path: String, default: Dictionary) -> Dictionary: return default var f = FileAccess.open(path, FileAccess.READ) var saved_dict = f.get_var(true) - - if saved_dict != null and saved_dict is Dictionary: - add_missing_keys(saved_dict, default) - return saved_dict func load_settings(path: String): - for category: SettingsCategory in default_settings.duplicate(true): - for k: String in category.settings.keys(): - settings[k] = category.settings[k] - - if not FileAccess.file_exists(path): - print("Skip settings load") - return - var f = FileAccess.open(path, FileAccess.READ) - var saved_dict = f.get_var(true) - - if saved_dict != null and saved_dict is Dictionary: - for k in settings.keys(): - if saved_dict.has(k) and typeof(settings[k].get_value()) == typeof(saved_dict[k]): - settings[k].set_value(saved_dict[k]) - - save_settings() # Save updated keys + if FileAccess.file_exists(path): + var f = FileAccess.open(path, FileAccess.READ) + settings = f.get_var(true) + else: + print("No settings file found.") + settings = {} + settings_tree.check() + save_settings() func on_mobile() -> bool: var os_name := OS.get_name() @@ -307,36 +135,25 @@ func on_high_end() -> bool: func on_vulkan() -> bool: return ProjectSettings.get_setting("rendering/rendering_device/driver") == "vulkan" -func add_missing_keys(dict: Dictionary, reference: Dictionary): - for k in reference.keys(): - if !dict.has(k): - dict[k] = reference[k] - else: - if dict[k] is Dictionary: - add_missing_keys(dict[k], reference[k]) - func get_setting(key: String): - if settings.has(key): - return settings[key].get_value() - else: + if !Global.settings.has(key): push_error("Tried to access setting \"%s\", which does not exist (missing key)" % key) return null + return Global.settings[key] -func get_category_settings(category_id: String): - for c: SettingsCategory in default_settings: - if c.id == category_id: - return c.settings - push_error("Category %s not found" % category_id) - return null +func set_setting_unchecked(key: String, value): + if value is Array: + Global.settings[key] = value.duplicate(true) + else: + Global.settings[key] = value + Global.save_settings() func set_setting(key: String, value): - if !settings.has(key): + if !Global.settings.has(key): push_error("Tried to set setting \"%s\", which does not yet exist (missing key)" % key) return - if get_setting(key) != value: - settings[key].set_value(value) - save_settings() - + else: set_setting_unchecked(key, value) + func get_profile(key: String): if profile.has(key): return profile[key] @@ -411,7 +228,7 @@ const NATIVE_LANGUAGE_NAMES = { func language_display(l: String): return "%s (%s)" % [NATIVE_LANGUAGE_NAMES[l], l] func language_array() -> Array: var lang: Array = [["system", tr("System default")]] - var to_order : Array = [] + var to_order: Array = [] for l in TranslationServer.get_loaded_locales(): to_order.append([l, language_display(l)]) to_order.append(["en", language_display("en")]) @@ -420,9 +237,9 @@ func language_array() -> Array: lang.append(i) return lang -func sort_language_array(lang : Array) -> Array: - var sorting_array : Array = [] - var sorted_lang : Array = [] +func sort_language_array(lang: Array) -> Array: + var sorting_array: Array = [] + var sorted_lang: Array = [] for i in lang.size(): sorting_array.append(lang[i][0]) sorting_array.sort() |