diff options
author | metamuffin <metamuffin@disroot.org> | 2025-09-15 01:26:13 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-09-15 01:38:34 +0200 |
commit | 676d4dcb6c439677b91b1b5cbc0bf08f98e2dd9d (patch) | |
tree | 5cd83591e230833735fbdacf41df5c1d69dd8c0e /client | |
parent | 4e196b83a42b9b217e3b7107b55a14cb1a005b84 (diff) | |
download | hurrycurry-676d4dcb6c439677b91b1b5cbc0bf08f98e2dd9d.tar hurrycurry-676d4dcb6c439677b91b1b5cbc0bf08f98e2dd9d.tar.bz2 hurrycurry-676d4dcb6c439677b91b1b5cbc0bf08f98e2dd9d.tar.zst |
Refactor settings; store as JSON; input settings now broken
Diffstat (limited to 'client')
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) |