From 5add48e21643321859783e069c9266b78245ab31 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 5 Mar 2025 16:47:23 -0500 Subject: Sync solved panels with datastorage --- Archipelago/client.gd | 103 ++++++++++++++++++++++++++++++++++++++++++-------- Archipelago/load.gd | 5 +++ Archipelago/panel.gd | 5 +++ 3 files changed, 98 insertions(+), 15 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 72346d0..a18f528 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -136,6 +136,12 @@ var _hints_key = "" var _hinted_locations = [] var _batch_messages = false var _held_messages = {} +var _held_panels = [] +var _held_synced_panels = [] +var _solved_panels = [] + +var _panelsBySolveIndex = {} +const kPANEL_BITFIELDS = 13 # 802 / 64 signal could_not_connect signal connect_status @@ -191,6 +197,8 @@ func _reset_state(): _authenticated = false _map_loaded = false _try_wss = false + _panelsBySolveIndex = {} + _solved_panels = [] func _errored(): @@ -412,22 +420,33 @@ func _on_data(): requestSync() - sendMessage( - [ - { - "cmd": "Set", - "key": "Lingo_%d_Paintings" % [_slot], - "default": [], - "want_reply": true, - "operations": [{"operation": "default", "value": []}] - } - ] - ) - _hints_key = "_read_hints_%d_%d" % [_team, _slot] - sendMessage( - [{"cmd": "SetNotify", "keys": [_hints_key]}, {"cmd": "Get", "keys": [_hints_key]}] - ) + + var cmds = [ + { + "cmd": "Set", + "key": "Lingo_%d_Paintings" % [_slot], + "default": [], + "want_reply": true, + "operations": [{"operation": "default", "value": []}] + }, + {"cmd": "Get", "keys": [_hints_key]} + ] + + var set_notifies = [_hints_key] + for k in range(0, kPANEL_BITFIELDS): + var panel_key = "Lingo_%d_Panels_%d" % [_slot, k] + set_notifies.append(panel_key) + cmds.append({ + "cmd": "Set", + "key": panel_key, + "default": 0, + "operations": [{"operation": "default", "value": 0}] + }) + + cmds.append({"cmd": "SetNotify", "keys": set_notifies}) + + sendMessage(cmds) emit_signal("client_connected") @@ -557,6 +576,13 @@ func _on_data(): _checked_paintings = message["value"] elif message["key"] == _hints_key: parseHints(message["value"]) + elif message["key"].begins_with("Lingo_%d_Panels_" % _slot): + var key_index = int(message["key"].substr(("Lingo_%d_Panels_" % _slot).length())) + var field_value = int(message["value"]) + for k in range(0, 64): + if field_value & (1 << k) != 0: + var panel_index = key_index * 64 + k + syncSolvedPanel(panel_index) elif cmd == "Retrieved": if message.has("keys") and message["keys"].has(_hints_key): @@ -776,9 +802,28 @@ func mapFinishedLoading(): sendMessage([{"cmd": "LocationChecks", "locations": _held_locations}]) + var panel_data = [] + for k in range(0, kPANEL_BITFIELDS): + panel_data.append(0) + + for panel_index in _held_panels: + var key_index = panel_index / 64 + var field_slot = panel_index % 64 + panel_data[key_index] = panel_data[key_index] | (1 << field_slot) + + for k in range(0, kPANEL_BITFIELDS): + if panel_data[k] != 0: + setValue("Panels_%d" % k, panel_data[k], "or") + _map_loaded = true + + for synced in _held_synced_panels: + syncSolvedPanel(synced) + _held_items = [] _held_locations = [] + _held_panels = [] + _held_synced_panels = [] func processItem(item, index, from, flags): @@ -911,6 +956,23 @@ func processItem(item, index, from, flags): saveLocaldata() +func syncSolvedPanel(panel_index): + if _solved_panels.has(panel_index): + return + + if _map_loaded: + var panel_name = _panelsBySolveIndex[panel_index] + global._print("Synced solved panel %d: %s" % [panel_index, panel_name]) + + if !panel_name.begins_with("EndPanel"): + var the_panel = get_tree().get_root().get_node("Spatial/Panels").get_node(panel_name) + + if !the_panel.is_complete: + the_panel.get_node("Viewport/GUI/Panel/TextEdit").complete() + else: + _held_synced_panels.append(panel_index) + + func doorIsVanilla(door): return !$Gamedata.mentioned_doors.has(door) @@ -955,6 +1017,17 @@ func checkPainting(painting_id): setValue("Paintings", [painting_id], "add") +func solvePanel(panel_index): + _solved_panels.append(panel_index) + + if _map_loaded: + var key_index = panel_index / 64 + var field_slot = panel_index % 64 + setValue("Panels_%d" % key_index, 1 << field_slot, "or") + else: + _held_panels.append(panel_index) + + func parseHints(hints): _hinted_locations.clear() diff --git a/Archipelago/load.gd b/Archipelago/load.gd index ba350f6..8510008 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd @@ -569,6 +569,7 @@ func _load(): # Attach a script to every panel so that we can do things like conditionally # disable them. var panel_script = apclient.SCRIPT_panel + var panel_index = 0 for panel in gamedata.panels: var panel_node if panel["id"].begins_with("EndPanel"): @@ -578,11 +579,15 @@ func _load(): var script_instance = panel_script.new() script_instance.name = "AP_Panel" script_instance.data = panel + script_instance.solve_index = panel_index if apclient._panel_door_shuffle and gamedata.mentioned_panels.has(panel["id"]): script_instance.locked = true panel_node.add_child(script_instance) apclient.connect("evaluate_solvability", script_instance, "evaluate_solvability") + apclient._panelsBySolveIndex[panel_index] = panel["id"] + panel_index += 1 + # Hook up the goal panel. if apclient._victory_condition == apclient.kTHE_MASTER: var the_master = self.get_node("Panels/Countdown Panels/Panel_master_master") diff --git a/Archipelago/panel.gd b/Archipelago/panel.gd index ce632c5..0cf29cd 100644 --- a/Archipelago/panel.gd +++ b/Archipelago/panel.gd @@ -6,6 +6,7 @@ var atbash_text = "" var orig_color = Color(0, 0, 0, 0) var solvable = true var locked = false +var solve_index = null const kAtbashPre = "abcdefghijklmnopqrstuvwxyz1234567890+-" const kAtbashPost = "zyxwvutsrqponmlkjihgfedcba0987654321-+" @@ -32,6 +33,10 @@ func answer_correct(): var effects = get_tree().get_root().get_node("Spatial/AP_Effects") effects.deactivate_atbash_trap() + if solve_index != null: + var apclient = global.get_node("Archipelago") + apclient.solvePanel(solve_index) + func evaluate_solvability(): var apclient = global.get_node("Archipelago") -- cgit 1.4.1