aboutsummaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-09-15 01:26:13 +0200
committermetamuffin <metamuffin@disroot.org>2025-09-15 01:38:34 +0200
commit676d4dcb6c439677b91b1b5cbc0bf08f98e2dd9d (patch)
tree5cd83591e230833735fbdacf41df5c1d69dd8c0e /client
parent4e196b83a42b9b217e3b7107b55a14cb1a005b84 (diff)
downloadhurrycurry-676d4dcb6c439677b91b1b5cbc0bf08f98e2dd9d.tar
hurrycurry-676d4dcb6c439677b91b1b5cbc0bf08f98e2dd9d.tar.bz2
hurrycurry-676d4dcb6c439677b91b1b5cbc0bf08f98e2dd9d.tar.zst
Refactor settings; store as JSON; input settings now broken
Diffstat (limited to 'client')
-rw-r--r--client/game.gd4
-rw-r--r--client/global.gd54
-rw-r--r--client/gui/components/blur_setup.gd2
-rw-r--r--client/gui/components/message/item/item_message.gd2
-rw-r--r--client/gui/menus/entry.gd2
-rw-r--r--client/gui/menus/game.gd2
-rw-r--r--client/gui/menus/main/play.gd10
-rw-r--r--client/gui/menus/settings/dropdown_setting.gd2
-rw-r--r--client/gui/menus/settings/game_setting.gd20
-rw-r--r--client/gui/menus/settings/input/input_manager.gd6
-rw-r--r--client/gui/menus/settings/input/input_setting.gd7
-rw-r--r--client/gui/menus/settings/number_setting.gd6
-rw-r--r--client/gui/menus/settings/preset_row.gd5
-rw-r--r--client/gui/menus/settings/range_setting.gd2
-rw-r--r--client/gui/menus/settings/settings.gd4
-rw-r--r--client/gui/menus/settings/settings_category.gd12
-rw-r--r--client/gui/menus/settings/settings_root.gd12
-rw-r--r--client/gui/menus/settings/text_setting.gd2
-rw-r--r--client/gui/menus/settings/toggle_setting.gd2
-rw-r--r--client/gui/menus/setup/setup.gd8
-rw-r--r--client/gui/menus/setup/setup.tscn2
-rw-r--r--client/gui/overlays/overlays.gd2
-rw-r--r--client/map/map.gd2
-rw-r--r--client/map/tiles/exterior_tree.gd2
-rw-r--r--client/map/tiles/grass_mesher.gd4
-rw-r--r--client/map/tiles/light_tile.gd2
-rw-r--r--client/player/controllable_player.gd16
-rw-r--r--client/player/follow_camera.gd6
-rw-r--r--client/player/onscreen_controls/controls.gd2
-rw-r--r--client/server_list.gd6
-rw-r--r--client/service/discover.gd2
-rw-r--r--client/service/editor.gd2
-rw-r--r--client/service/server.gd28
-rw-r--r--client/settings.gd50
34 files changed, 140 insertions, 150 deletions
diff --git a/client/game.gd b/client/game.gd
index 8fa4a2cc..c0c0bb55 100644
--- a/client/game.gd
+++ b/client/game.gd
@@ -232,7 +232,7 @@ func handle_packet(p):
# after joining, the last item message that popped up is ignored. the next one will
# be used for the tutorial
if (player.is_customer
- and not Global.get_setting("gameplay.tutorial_disabled")
+ and not Settings.read("gameplay.tutorial_disabled")
and join_state == JoinState.JOINED):
var completed_ingredients: Array = Global.get_profile("tutorial_ingredients_played")
var completed := Global.array_has_all(completed_ingredients, ingredients)
@@ -310,7 +310,7 @@ func handle_packet(p):
while item_names[p.item] in tutorial_queue:
tutorial_queue.erase(item_names[p.item])
- if not tutorial_queue.is_empty() and not Global.get_setting("gameplay.tutorial_disabled"):
+ if not tutorial_queue.is_empty() and not Settings.read("gameplay.tutorial_disabled"):
tutorial_running = true
update_tutorial_running.emit(tutorial_running)
mp.send_chat(my_player_id, "/start-tutorial %s" % tutorial_queue.pop_front())
diff --git a/client/global.gd b/client/global.gd
index 5e538123..f308f847 100644
--- a/client/global.gd
+++ b/client/global.gd
@@ -69,21 +69,20 @@ var focused_menu: Menu # only use this as a last resort, currently exists to ope
func _ready():
profile = load_dict("user://profile", default_profile)
- load_settings("user://settings")
-
+ Settings.load("user://settings.json")
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("graphics.fullscreen"):
+ match get("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)
- "always": set_setting("graphics.fullscreen", "never")
- "never": set_setting("graphics.fullscreen", "always")
+ "always": set("graphics.fullscreen", "never")
+ "never": set("graphics.fullscreen", "always")
# Update using_joypad variable
if event is InputEventMouseButton or event is InputEventKey:
@@ -96,7 +95,7 @@ func _input(event):
using_joypad_change.emit(using_joypad)
# Update using_touch variable
- if get_setting("ui.touch_controls") == "automatic": # Only if set to automatic
+ if Settings.read("ui.touch_controls") == "automatic": # Only if set to automatic
if event is InputEventScreenTouch or event is InputEventScreenDrag:
if not using_touch:
using_touch = true
@@ -109,12 +108,6 @@ func _input(event):
func save_profile():
save_dict("user://profile", profile)
-func save_settings():
- var saved = {}
- for key in settings_tree.changed_keys():
- saved[key] = Global.get_setting(key)
- save_dict("user://settings", saved)
-
func save_dict(path: String, dict: Dictionary):
var f = FileAccess.open(path, FileAccess.WRITE)
var to_save = dict.duplicate(true)
@@ -130,19 +123,8 @@ func load_dict(path: String, default: Dictionary) -> Dictionary:
if saved_dict != null and saved_dict is Dictionary:
add_missing_keys(saved_dict, default)
-
- return saved_dict
-func load_settings(path: String):
- 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 = Settings.get_root()
- settings_tree.check()
- Settings.apply_initial()
+ return saved_dict
func on_mobile() -> bool:
var os_name := OS.get_name()
@@ -156,24 +138,6 @@ func on_high_end() -> bool:
func on_vulkan() -> bool:
return ProjectSettings.get_setting("rendering/rendering_device/driver") == "vulkan"
-func get_setting(key: String):
- if !settings.has(key):
- push_error("Tried to access setting \"%s\", which does not exist (missing key)" % key)
- return null
- return settings[key]
-
-func set_setting_unchecked(key: String, value):
- value = value.duplicate(true) if value is Array else value
- if key in settings and typeof(settings[key]) == typeof(value) and not value is Array and settings[key] == value: return
- settings[key] = value
- Settings.trigger_hook(key, value)
-
-func set_setting(key: String, value):
- if !settings.has(key):
- push_error("Tried to set setting \"%s\", which does not yet exist (missing key)" % key)
- return
- else: set_setting_unchecked(key, value)
-
func get_profile(key: String):
if profile.has(key):
return profile[key]
@@ -193,8 +157,8 @@ func set_hint(key: String, value: bool):
push_error("Tried to set hint \"%s\", which does not yet exist (missing key)" % key)
if profile["hints"][key] != value:
if value:
- set_setting("gameplay.hints_started", true)
- save_settings()
+ Settings.write("gameplay.hints_started", true)
+ Settings.save()
profile["hints"][key] = value
save_profile() # TODO avoid this call when bulk-unsetting hints
@@ -256,6 +220,7 @@ func array_has_all(parent: Array, children: Array) -> bool:
return false
return true
+# TODO orphan
class ParsedItem:
var name: String
var contents: Array
@@ -280,6 +245,7 @@ func configure_viewport_aa(vp: Viewport, aa: String) -> void:
vp.msaa_3d = Viewport.MSAA_4X
vp.screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED
+# TODO orphan
static func index_to_hand(i):
match i:
0: return "left"
diff --git a/client/gui/components/blur_setup.gd b/client/gui/components/blur_setup.gd
index 567ac891..318f8e7e 100644
--- a/client/gui/components/blur_setup.gd
+++ b/client/gui/components/blur_setup.gd
@@ -17,7 +17,7 @@ extends Control
class_name BlurSetup
func _ready():
- update(Global.get_setting("graphics.ui_blur"))
+ update(Settings.read("graphics.ui_blur"))
Settings.hook_changed("graphics.ui_blur", false, update)
func update(state):
diff --git a/client/gui/components/message/item/item_message.gd b/client/gui/components/message/item/item_message.gd
index e643c291..4079e363 100644
--- a/client/gui/components/message/item/item_message.gd
+++ b/client/gui/components/message/item/item_message.gd
@@ -31,7 +31,7 @@ var timeout_initial := 0.
@onready var v_box_container: VBoxContainer = $VBoxContainer
func _ready() -> void:
- Global.configure_viewport_aa(sub_viewport, Global.get_setting("graphics.aa"))
+ Global.configure_viewport_aa(sub_viewport, Settings.read("graphics.aa"))
if enable_grayscale:
sub_viewport_container.material = PRINTED_MAT
diff --git a/client/gui/menus/entry.gd b/client/gui/menus/entry.gd
index 91bec795..d9e3dd29 100644
--- a/client/gui/menus/entry.gd
+++ b/client/gui/menus/entry.gd
@@ -23,7 +23,7 @@ func _ready():
var args = OS.get_cmdline_user_args()
if args.size() == 1:
await submenu("res://gui/menus/game.tscn", args[0])
- elif not Global.get_setting("gameplay.setup_completed"):
+ elif not Settings.read("gameplay.setup_completed"):
await submenu("res://gui/menus/setup/setup.tscn")
else:
await submenu("res://gui/menus/main/main.tscn")
diff --git a/client/gui/menus/game.gd b/client/gui/menus/game.gd
index 033d1dd9..0bf44484 100644
--- a/client/gui/menus/game.gd
+++ b/client/gui/menus/game.gd
@@ -42,7 +42,7 @@ func _menu_cover(state):
game.follow_camera.update_disable_input()
func _process(_delta):
- if Global.get_setting("graphics.debug_info"):
+ if Settings.read("graphics.debug_info"):
debug_label.show()
debug_label.text = "%d FPS\nDriver: %s" % [Engine.get_frames_per_second(), ProjectSettings.get_setting("rendering/rendering_device/driver")]
else: debug_label.hide()
diff --git a/client/gui/menus/main/play.gd b/client/gui/menus/main/play.gd
index d2e231e1..87b0b5bf 100644
--- a/client/gui/menus/main/play.gd
+++ b/client/gui/menus/main/play.gd
@@ -45,18 +45,18 @@ func _ready():
super()
if not Global.get_profile("registry_asked"):
var popup_data := MenuPopup.Data.new()
- popup_data.text = tr("c.menu.play.allow_query_registry").format([Global.get_setting("online.registry_url")])
+ popup_data.text = tr("c.menu.play.allow_query_registry").format([Settings.read("online.registry_url")])
var allow_button := Button.new()
allow_button.text = tr("c.menu.accept")
var deny_button := Button.new()
deny_button.text = tr("c.menu.deny")
- allow_button.pressed.connect(func(): Global.set_setting("online.use_registry", true))
- deny_button.pressed.connect(func(): Global.set_setting("online.use_registry", false))
+ allow_button.pressed.connect(func(): Settings.write("online.use_registry", true))
+ deny_button.pressed.connect(func(): Settings.write("online.use_registry", false))
popup_data.buttons = [allow_button, deny_button]
await submenu("res://gui/menus/popup.tscn", popup_data)
Global.set_profile("registry_asked", true)
- Global.save_settings()
Global.save_profile()
+ Settings.save()
ServerList.start()
@@ -141,7 +141,7 @@ func _on_editor_control_pressed():
Service.State.FAILED: Editor.start()
func _on_server_connect_pressed():
- connect_to("ws://%s:%d" % [ServerService.connect_address(), Global.get_setting("server.bind_port")])
+ connect_to("ws://%s:%d" % [ServerService.connect_address(), Settings.read("server.bind_port")])
func _on_editor_connect_pressed():
connect_to("ws://[::1]:27032/")
diff --git a/client/gui/menus/settings/dropdown_setting.gd b/client/gui/menus/settings/dropdown_setting.gd
index 514df666..69ae29b6 100644
--- a/client/gui/menus/settings/dropdown_setting.gd
+++ b/client/gui/menus/settings/dropdown_setting.gd
@@ -32,5 +32,5 @@ func create_row():
if is_instance_valid(row):
row.value_node.select(options.find(value))
)
- row.value_node.item_selected.connect(func(item): Global.set_setting(key, options[item]))
+ row.value_node.item_selected.connect(func(item): Settings.write(key, options[item]))
return row
diff --git a/client/gui/menus/settings/game_setting.gd b/client/gui/menus/settings/game_setting.gd
index 1c04ad3b..1dfee59e 100644
--- a/client/gui/menus/settings/game_setting.gd
+++ b/client/gui/menus/settings/game_setting.gd
@@ -31,16 +31,16 @@ func set_parent(parent: GameSetting):
func create_row():
var row = preload("res://gui/menus/settings/settings_row.tscn").instantiate()
row.description = tr(nskey)
- row.reset.connect(func(): Global.set_setting(key, default))
+ row.reset.connect(func(): Settings.write(key, default))
return row
-func check():
- if default != null:
- if not key in Global.settings:
- Global.set_setting_unchecked(key, default)
- if typeof(default) != typeof(Global.settings[key]):
- Global.set_setting_unchecked(key, default)
+func load(d: Dictionary):
+ if d.has(key) && typeof(d[key]) == typeof(default):
+ Settings.write_unchecked(key, d[key])
+ elif default != null:
+ Settings.write_unchecked(key, default)
-func changed_keys():
- if Global.get_setting(key) != default: return [key]
- else: return []
+func save(d: Dictionary):
+ var value = Settings.read(key)
+ if value == default: return
+ d[key] = value
diff --git a/client/gui/menus/settings/input/input_manager.gd b/client/gui/menus/settings/input/input_manager.gd
index e3158a03..7fe814ff 100644
--- a/client/gui/menus/settings/input/input_manager.gd
+++ b/client/gui/menus/settings/input/input_manager.gd
@@ -62,7 +62,7 @@ func change_input_map_action(action_name: String, events: Array, save: bool = tr
# Update input map dictionary
input_map = get_input_map()
# Save settings
- Global.set_setting("input_map", input_map.duplicate(true))
+ Settings.write("input_map", input_map.duplicate(true))
func apply_input_map(new_input_map: Dictionary):
# Load into input map dictionary
@@ -76,8 +76,8 @@ func apply_input_map(new_input_map: Dictionary):
change_input_map_action(k, input_map[k], false)
func reset_input_map():
- Global.set_setting("input_map", default_input_map.duplicate())
- apply_input_map(Global.get_setting("input_map"))
+ Settings.write("input_map", default_input_map.duplicate())
+ apply_input_map(Settings.read("input_map"))
func get_event_type(input_event: InputEvent) -> EventType:
if input_event is InputEventKey or input_event is InputEventMouseButton:
diff --git a/client/gui/menus/settings/input/input_setting.gd b/client/gui/menus/settings/input/input_setting.gd
index fa903771..5617b26a 100644
--- a/client/gui/menus/settings/input/input_setting.gd
+++ b/client/gui/menus/settings/input/input_setting.gd
@@ -30,10 +30,7 @@ func create_row():
if is_instance_valid(row):
row.value_node.value = value
)
- row.value_node.changed.connect(func(): Global.set_setting(key, row.value_node.value))
+ row.value_node.changed.connect(func(): Settings.write(key, row.value_node.value))
return row
-func changed_keys():
- return [key]
- # if Global.array_eq(Global.get_setting(key), default): return [key]
- # else: return []
+func save(_d: Dictionary): pass # TODO
diff --git a/client/gui/menus/settings/number_setting.gd b/client/gui/menus/settings/number_setting.gd
index 5fa5a115..f729913c 100644
--- a/client/gui/menus/settings/number_setting.gd
+++ b/client/gui/menus/settings/number_setting.gd
@@ -31,7 +31,7 @@ func create_row():
input.min_value = min_value
input.max_value = max_value
- input.value_changed.connect(func(value): Global.set_setting(key, value as int))
+ input.value_changed.connect(func(value): Settings.write(key, value as int))
Settings.hook_changed_init(key, true,
func(v):
if is_instance_valid(input):
@@ -39,3 +39,7 @@ func create_row():
)
row.value_node = input
return row
+
+func load(d: Dictionary):
+ if d.has(key): d[key] = int(d[key])
+ super(d)
diff --git a/client/gui/menus/settings/preset_row.gd b/client/gui/menus/settings/preset_row.gd
index f3c46a26..9e7c97a2 100644
--- a/client/gui/menus/settings/preset_row.gd
+++ b/client/gui/menus/settings/preset_row.gd
@@ -31,7 +31,7 @@ func set_parent(parent):
func apply(preset_name: String):
var preset = options[preset_name]
for i in preset.keys():
- Global.set_setting(prefix + "." + i, preset[i])
+ Settings.write(prefix + "." + i, preset[i])
func create_row():
var row = super()
@@ -43,4 +43,5 @@ func create_row():
row.value_node.add_child(button)
return row
-func changed_keys(): return []
+func load(_d: Dictionary): pass
+func save(_d: Dictionary): pass
diff --git a/client/gui/menus/settings/range_setting.gd b/client/gui/menus/settings/range_setting.gd
index b8d392a4..a487c6b4 100644
--- a/client/gui/menus/settings/range_setting.gd
+++ b/client/gui/menus/settings/range_setting.gd
@@ -40,5 +40,5 @@ func create_row():
if is_instance_valid(row):
row.value_node.value = value
)
- row.value_node.value_changed.connect(func(value): Global.set_setting(key, value))
+ row.value_node.value_changed.connect(func(value): Settings.write(key, value))
return row
diff --git a/client/gui/menus/settings/settings.gd b/client/gui/menus/settings/settings.gd
index 32da54cc..7523b9fb 100644
--- a/client/gui/menus/settings/settings.gd
+++ b/client/gui/menus/settings/settings.gd
@@ -20,7 +20,7 @@ extends Menu
func _ready():
super()
- var row = Global.settings_tree.create_row()
+ var row = Settings.tree.create_row()
container.add_child(row)
container.move_child(row, 1)
@@ -36,5 +36,5 @@ func _on_back_pressed():
exit()
func exit():
- Global.save_settings()
+ Settings.save()
super()
diff --git a/client/gui/menus/settings/settings_category.gd b/client/gui/menus/settings/settings_category.gd
index bf85abd9..3cc3704f 100644
--- a/client/gui/menus/settings/settings_category.gd
+++ b/client/gui/menus/settings/settings_category.gd
@@ -38,12 +38,8 @@ func create_row():
for r in settings: options.add_child(r.create_row())
return row
-func check():
- for c in settings:
- c.check()
+func load(d: Dictionary):
+ for c in settings: c.load(d)
-func changed_keys():
- var changed = []
- for c in settings:
- changed.append_array(c.changed_keys())
- return changed
+func save(d: Dictionary):
+ for c in settings: c.save(d)
diff --git a/client/gui/menus/settings/settings_root.gd b/client/gui/menus/settings/settings_root.gd
index a9a024d8..3f7fc027 100644
--- a/client/gui/menus/settings/settings_root.gd
+++ b/client/gui/menus/settings/settings_root.gd
@@ -29,12 +29,8 @@ func create_row():
for r in children: row.add_child(r.create_row())
return row
-func check():
- for c in children:
- c.check()
+func load(d: Dictionary):
+ for c in children: c.load(d)
-func changed_keys():
- var changed = []
- for c in children:
- changed.append_array(c.changed_keys())
- return changed
+func save(d: Dictionary):
+ for c in children: c.save(d)
diff --git a/client/gui/menus/settings/text_setting.gd b/client/gui/menus/settings/text_setting.gd
index 8e2b6bec..83e68539 100644
--- a/client/gui/menus/settings/text_setting.gd
+++ b/client/gui/menus/settings/text_setting.gd
@@ -26,7 +26,7 @@ func create_row():
var row = super()
var input := LineEdit.new()
input.placeholder_text = placeholder
- input.text_changed.connect(func(text): Global.set_setting(key, text))
+ input.text_changed.connect(func(text): Settings.write(key, text))
Settings.hook_changed_init(key, true,
func(text):
if is_instance_valid(input):
diff --git a/client/gui/menus/settings/toggle_setting.gd b/client/gui/menus/settings/toggle_setting.gd
index abcb7f4a..dcf7dbd7 100644
--- a/client/gui/menus/settings/toggle_setting.gd
+++ b/client/gui/menus/settings/toggle_setting.gd
@@ -22,7 +22,7 @@ func _init(new_id: String, new_default: bool):
func create_row():
var row = super()
row.value_node = CheckButton.new()
- row.value_node.pressed.connect(func(): Global.set_setting(key, row.value_node.button_pressed))
+ row.value_node.pressed.connect(func(): Settings.write(key, row.value_node.button_pressed))
Settings.hook_changed_init(key, true,
func(value):
if is_instance_valid(row):
diff --git a/client/gui/menus/setup/setup.gd b/client/gui/menus/setup/setup.gd
index 4e843dd4..e4103603 100644
--- a/client/gui/menus/setup/setup.gd
+++ b/client/gui/menus/setup/setup.gd
@@ -99,10 +99,10 @@ func _on_sign_pressed():
Global.set_hint(k, true)
Global.save_profile()
- Global.set_setting("gameplay.hints_started", skip_tutorial.button_pressed)
- Global.set_setting("gameplay.tutorial_disabled", skip_tutorial.button_pressed)
- Global.set_setting("gameplay.setup_completed", true)
- Global.save_settings()
+ Settings.write("gameplay.hints_started", skip_tutorial.button_pressed)
+ Settings.write("gameplay.tutorial_disabled", skip_tutorial.button_pressed)
+ Settings.write("gameplay.setup_completed", true)
+ Settings.save()
Global.get_viewport().msaa_2d = Viewport.MSAA_DISABLED
diff --git a/client/gui/menus/setup/setup.tscn b/client/gui/menus/setup/setup.tscn
index d0cce350..487f2200 100644
--- a/client/gui/menus/setup/setup.tscn
+++ b/client/gui/menus/setup/setup.tscn
@@ -70,8 +70,6 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_mo46n")
-support_anim = null
-auto_anim = null
[node name="ColorRect" type="ColorRect" parent="."]
layout_mode = 2
diff --git a/client/gui/overlays/overlays.gd b/client/gui/overlays/overlays.gd
index 00778cdb..0483fef6 100644
--- a/client/gui/overlays/overlays.gd
+++ b/client/gui/overlays/overlays.gd
@@ -21,4 +21,4 @@ func _ready():
func _input(_event):
if Input.is_action_just_pressed("toggle_overlay"):
- Global.set_setting("ui.hide_overlays", not Global.get_setting("ui.hide_overlays"))
+ Settings.write("ui.hide_overlays", not Settings.read("ui.hide_overlays"))
diff --git a/client/map/map.gd b/client/map/map.gd
index 56101978..235425a0 100644
--- a/client/map/map.gd
+++ b/client/map/map.gd
@@ -73,7 +73,7 @@ func apply_gi_setting(state):
voxelgi.data = null
func gi_bake():
- if Global.get_setting("graphics.gi") != "voxelgi": return
+ if Settings.read("graphics.gi") != "voxelgi": return
print("Map: Rebaking VoxelGI")
currently_baked = true
gi_bake_blocking()
diff --git a/client/map/tiles/exterior_tree.gd b/client/map/tiles/exterior_tree.gd
index 84aa8f3c..fe9eeaf8 100644
--- a/client/map/tiles/exterior_tree.gd
+++ b/client/map/tiles/exterior_tree.gd
@@ -27,7 +27,7 @@ func _init(ctx: TileFactory.TileCC):
var trunk: Mesh = load("res://map/tiles/tree/trunk_%d.res" % tree)
var leaves: Mesh = load("res://map/tiles/tree/leaves_%d_%s.res" % [
tree,
- "lq" if Global.get_setting("graphics.lq_trees") else "hq"
+ "lq" if Settings.read("graphics.lq_trees") else "hq"
])
var trunk_instance: MeshInstance3D = MeshInstance3D.new()
trunk_instance.mesh = trunk
diff --git a/client/map/tiles/grass_mesher.gd b/client/map/tiles/grass_mesher.gd
index fd2892a8..466c3c1e 100644
--- a/client/map/tiles/grass_mesher.gd
+++ b/client/map/tiles/grass_mesher.gd
@@ -31,10 +31,10 @@ func flush() -> void:
var multimesh := MultiMesh.new()
multimesh.mesh = GRASS_MESH
multimesh.transform_format = MultiMesh.TRANSFORM_3D
- multimesh.instance_count = tiles.size() * Global.get_setting("graphics.grass_amount")
+ multimesh.instance_count = tiles.size() * Settings.read("graphics.grass_amount")
var t := tiles.values()
for i in multimesh.instance_count:
- var p = t[i / Global.get_setting("graphics.grass_amount")]
+ var p = t[i / Settings.read("graphics.grass_amount")]
var origin := Vector3(random.randf_range(-.5, .5), 0.25, random.randf_range(-.5, .5)) + Vector3(p.x + 0.5, 0.0, p.y + 0.5)
var basis_ := (Basis(Vector3(0, 1, 0), random.randf_range(0, PI)) * Basis(Vector3(1, 0, 0), PI/2)).scaled(Vector3(0.75, 0.5, 0.75))
multimesh.set_instance_transform(i, Transform3D(basis_, origin))
diff --git a/client/map/tiles/light_tile.gd b/client/map/tiles/light_tile.gd
index 5776645a..2476d8eb 100644
--- a/client/map/tiles/light_tile.gd
+++ b/client/map/tiles/light_tile.gd
@@ -19,4 +19,4 @@ extends Node3D
func _ready():
# TODO hook settings
- for l in lights: l.shadow_enabled = Global.get_setting("graphics.shadows")
+ for l in lights: l.shadow_enabled = Settings.read("graphics.shadows")
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd
index 3bcfacff..1700d900 100644
--- a/client/player/controllable_player.gd
+++ b/client/player/controllable_player.gd
@@ -73,7 +73,7 @@ var moving_duration = 0
var fps_rotation_target = 0
func _process_movement(delta):
var input = Input.get_vector("left", "right", "forwards", "backwards") if is_input_enabled() else Vector2.ZERO
- if Global.get_setting("gameplay.first_person"):
+ if Settings.read("gameplay.first_person"):
fps_rotation_target += input.x * delta * 3.
if abs(input.x) > 0.1: input.y -= 0.5
input.x = 0.
@@ -82,14 +82,14 @@ func _process_movement(delta):
else:
input = input.rotated(input_rotation)
- var boost = Input.is_action_pressed("boost") or (Global.get_setting("gameplay.latch_boost") and boosting)
+ var boost = Input.is_action_pressed("boost") or (Settings.read("gameplay.latch_boost") and boosting)
if Input.is_action_pressed("interact_left") or Input.is_action_just_released("interact_left") or Input.is_action_pressed("interact_right") or Input.is_action_just_released("interact_right"):
input *= 0
else:
update_interact_target()
- if Global.get_setting("gameplay.accessible_movement"):
+ if Settings.read("gameplay.accessible_movement"):
if input.length() < 0.5: moving_duration -= delta * 2
else: moving_duration += delta
moving_duration = clamp(moving_duration, 0, 1)
@@ -99,7 +99,7 @@ func _process_movement(delta):
var was_boosting = boosting
direction = input
update(delta, boost)
- if boosting and not was_boosting and Global.get_setting("gameplay.vibration"):
+ if boosting and not was_boosting and Settings.read("gameplay.vibration"):
Input.start_joy_vibration(0, 0, input.length(), 0.15)
Input.vibrate_handheld(75, input.length() * 0.1)
walking = input.length_squared() > 0.1
@@ -171,7 +171,7 @@ func progress(position__: float, speed: float, warn: bool, h):
current_vibration_strength = position__
current_vibration_change = speed
var vibration_strength := pow(current_vibration_strength, 3)
- if Global.get_setting("gameplay.vibration"): # todo maybe include the lines above too
+ if Settings.read("gameplay.vibration"): # todo maybe include the lines above too
Input.start_joy_vibration(0, vibration_strength, 0, 0.1)
Input.vibrate_handheld(100, vibration_strength)
vibration_timer.start()
@@ -190,13 +190,13 @@ func _on_vibration_timeout():
func put_item(tile: Tile, h: int):
super(tile, h)
- if Global.get_setting("gameplay.vibration"):
+ if Settings.read("gameplay.vibration"):
Input.start_joy_vibration(0, 0.1, 0.0, 0.075)
Input.vibrate_handheld(75, 0.1)
func take_item(tile: Tile, h: int):
super(tile, h)
- if Global.get_setting("gameplay.vibration"):
+ if Settings.read("gameplay.vibration"):
Input.start_joy_vibration(0, 0.1, 0.0, 0.075)
Input.vibrate_handheld(75, 0.1)
@@ -229,7 +229,7 @@ func interact():
marker.visible = false
func update_interact_target():
- match Global.get_setting("gameplay.interact_target"):
+ match Settings.read("gameplay.interact_target"):
"dirsnap": return update_interact_target_dirsnap()
"dir": return update_interact_target_dir()
_: return update_interact_target_dir()
diff --git a/client/player/follow_camera.gd b/client/player/follow_camera.gd
index 7ca674e0..804a9ebe 100644
--- a/client/player/follow_camera.gd
+++ b/client/player/follow_camera.gd
@@ -75,14 +75,14 @@ func zoom(zoom_dist: float) -> void:
camera_distance_target = clamp(camera_distance_target, MIN_ZOOM, MAX_ZOOM)
func follow(delta):
- if Global.get_setting("gameplay.first_person"):
+ if Settings.read("gameplay.first_person"):
global_position = target.global_position + Vector3.UP * 1.33
rotation = target.rotation + Vector3(0,PI,0)
if target.get_parent() is ControllablePlayer:
target.get_parent().input_rotation = -rotation.y
return
- var invert_factor = -1 if Global.get_setting("gameplay.invert_camera") else 1;
+ var invert_factor = -1 if Settings.read("gameplay.invert_camera") else 1;
if not _disable_input:
angle_target += Input.get_axis("rotate_left", "rotate_right") * ROTATE_SPEED * delta * invert_factor
@@ -99,7 +99,7 @@ func follow(delta):
new_transform.origin = target.position + offset
new_transform = new_transform.looking_at(target.position)
- if Global.get_setting("gameplay.interpolate_camera_rotation"):
+ if Settings.read("gameplay.interpolate_camera_rotation"):
transform.basis = Basis.from_euler(Vector3(
G.interpolate_angle(transform.basis.get_euler().x, new_transform.basis.get_euler().x, delta * LOOK_WEIGHT),
G.interpolate_angle(transform.basis.get_euler().y, new_transform.basis.get_euler().y, delta * LOOK_WEIGHT),
diff --git a/client/player/onscreen_controls/controls.gd b/client/player/onscreen_controls/controls.gd
index 16c10beb..c7fa0e36 100644
--- a/client/player/onscreen_controls/controls.gd
+++ b/client/player/onscreen_controls/controls.gd
@@ -25,7 +25,7 @@ var touch_enabled := false
func _ready():
Settings.hook_changed_init("ui.touch_controls", false, apply_touch)
- Global.using_touch_change.connect(func f(_x): apply_touch(Global.get_setting("ui.touch_controls"))) # throw away useless argument
+ Global.using_touch_change.connect(func f(_x): apply_touch(Settings.read("ui.touch_controls"))) # throw away useless argument
Global.hand_count_change.connect(apply_hand_count)
apply_hand_count(Global.hand_count)
diff --git a/client/server_list.gd b/client/server_list.gd
index a4f768fa..77b5ee0c 100644
--- a/client/server_list.gd
+++ b/client/server_list.gd
@@ -65,13 +65,13 @@ func _ready() -> void:
func fetch_server_list(registry: Registry) -> void:
match registry:
Registry.MDNS:
- if Global.get_setting("online.use_discover"):
+ if Settings.read("online.use_discover"):
match Discover.state:
Service.State.STOPPED: Discover.start()
Service.State.RUNNING: mdns.request(MDNS_URL, HEADERS)
Registry.GLOBAL:
- if Global.get_setting("online.use_registry"):
- var url: String = Global.get_setting("online.registry_url")
+ if Settings.read("online.use_registry"):
+ var url: String = Settings.read("online.registry_url")
url = url.replace("https:", "http:") if using_http_fallback else url
reg.request(url + "/v1/list", HEADERS)
diff --git a/client/service/discover.gd b/client/service/discover.gd
index 9aba0ce6..8ebd52da 100644
--- a/client/service/discover.gd
+++ b/client/service/discover.gd
@@ -23,7 +23,7 @@ func arguments():
return []
func exe_path() -> String:
- var path: String = Global.get_setting("online.discover_binary")
+ var path: String = Settings.read("online.discover_binary")
if path != "": return path
else: return "hurrycurry-discover"
diff --git a/client/service/editor.gd b/client/service/editor.gd
index 262f6fca..2197a5e1 100644
--- a/client/service/editor.gd
+++ b/client/service/editor.gd
@@ -23,7 +23,7 @@ func arguments():
return []
func exe_path() -> String:
- var path: String = Global.get_setting("server.editor_binary_path")
+ var path: String = Settings.read("server.editor_binary_path")
if path != "": return path
else: return "hurrycurry-editor"
diff --git a/client/service/server.gd b/client/service/server.gd
index ad9d5c68..9a314aca 100644
--- a/client/service/server.gd
+++ b/client/service/server.gd
@@ -21,37 +21,37 @@ func name():
func arguments():
var args = []
- if Global.get_setting("server.data_path") != "":
+ if Settings.read("server.data_path") != "":
args.push_back("--data-dir")
- args.push_back(Global.get_setting("server.data_path"))
- if Global.get_setting("server.name") != "":
+ args.push_back(Settings.read("server.data_path"))
+ if Settings.read("server.name") != "":
args.push_back("--server-name")
- args.push_back(Global.get_setting("server.name"))
- if Global.get_setting("server.mdns"):
+ args.push_back(Settings.read("server.name"))
+ if Settings.read("server.mdns"):
args.push_back("--mdns")
- if Global.get_setting("server.upnp"):
+ if Settings.read("server.upnp"):
args.push_back("--upnp")
- if Global.get_setting("server.register"):
+ if Settings.read("server.register"):
args.push_back("--register")
args.push_back("--listen")
- args.push_back("%s:%d" % [bind_address(), Global.get_setting("server.bind_port")])
+ args.push_back("%s:%d" % [bind_address(), Settings.read("server.bind_port")])
return args
func exe_path() -> String:
- var path: String = Global.get_setting("server.binary_path")
+ var path: String = Settings.read("server.binary_path")
if path != "": return path
else: return "hurrycurry-server"
func test_port():
- return Global.get_setting("server.bind_port")
+ return Settings.read("server.bind_port")
func test_host():
- return "::1" if Global.get_setting("server.enable_ipv6") else "127.0.0.1"
+ return "::1" if Settings.read("server.enable_ipv6") else "127.0.0.1"
static func bind_address() -> String:
- if Global.get_setting("server.allow_external_connections"):
- return "[::]" if Global.get_setting("server.enable_ipv6") else "0.0.0.0"
+ if Settings.read("server.allow_external_connections"):
+ return "[::]" if Settings.read("server.enable_ipv6") else "0.0.0.0"
else:
return connect_address()
static func connect_address() -> String:
- return "[::1]" if Global.get_setting("server.enable_ipv6") else "127.0.0.1"
+ return "[::1]" if Settings.read("server.enable_ipv6") else "127.0.0.1"
diff --git a/client/settings.gd b/client/settings.gd
index fa400821..8381ddc2 100644
--- a/client/settings.gd
+++ b/client/settings.gd
@@ -82,9 +82,46 @@ static func get_root():
])
])
+static var tree: GameSetting
+static var values: Dictionary = {}
+static var loaded_path: String
+
+static func read(key: String):
+ if !values.has(key):
+ push_error("Tried to access setting \"%s\", which does not exist (missing key)" % key)
+ return null
+ return values[key]
+
+static func write_unchecked(key: String, value):
+ value = value.duplicate(true) if value is Array else value
+ if key in values and typeof(values[key]) == typeof(value) and not value is Array and values[key] == value: return
+ values[key] = value
+ trigger_hook(key, value)
+
+static func write(key: String, value):
+ if !values.has(key):
+ push_error("Tried to set setting \"%s\", which does not yet exist (missing key)" % key)
+ return
+ else: write_unchecked(key, value)
+
+static func load(path: String):
+ tree = get_root()
+ loaded_path = path
+ var changed = {}
+ if FileAccess.file_exists(path):
+ var f = FileAccess.open(path, FileAccess.READ)
+ changed = JSON.parse_string(f.get_as_text())
+ tree.load(changed)
+
+static func save():
+ var changed = {}
+ tree.save(changed)
+ var f = FileAccess.open(loaded_path, FileAccess.WRITE)
+ f.store_string(JSON.stringify(changed))
+
static func trigger_hook(key: String, value):
- if Settings.change_hooks_display.get(key) != null: Settings.change_hooks_display.get(key).callv([value] if value != null else [])
- if Settings.change_hooks_apply.get(key) != null: Settings.change_hooks_apply.get(key).callv([value] if value != null else [])
+ if change_hooks_display.get(key) != null: change_hooks_display.get(key).callv([value] if value != null else [])
+ if change_hooks_apply.get(key) != null: change_hooks_apply.get(key).callv([value] if value != null else [])
if key.find(".") != -1: trigger_hook(key.rsplit(".", false, 1)[0], null)
static func hook_changed(key: String, display: bool, callable: Callable):
@@ -93,14 +130,14 @@ static func hook_changed(key: String, display: bool, callable: Callable):
static func hook_changed_init(key: String, display: bool, callable: Callable):
hook_changed(key, display, callable)
- callable.call(Global.get_setting(key))
+ callable.call(read(key))
static func get_category_dict(prefix: String):
var map = {}
for k in Global.settings.keys():
var kn = k.trim_prefix(prefix + ".")
if kn == k: continue
- map[kn] = Global.get_setting(k)
+ map[kn] = read(k)
return map
static func launch_setup():
@@ -121,11 +158,6 @@ static var change_hooks_apply = {
"audio.sfx_volume": h_volume_sfx,
}
-static func apply_initial():
- for key in change_hooks_apply.keys():
- if Global.settings.has(key): change_hooks_apply[key].call(Global.get_setting(key))
- else: change_hooks_apply[key].call()
-
static func h_aa(mode):
var vp = Global.get_viewport()
Global.configure_viewport_aa(vp, mode)