summaryrefslogtreecommitdiff
path: root/client/global.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/global.gd')
-rw-r--r--client/global.gd249
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()