diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2025-03-05 16:47:23 -0500 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2025-03-05 16:47:23 -0500 |
| commit | 5add48e21643321859783e069c9266b78245ab31 (patch) | |
| tree | 9090a90926d3c24b065febb4e214a525cb7ce5f7 | |
| parent | 70f8769ad3441af2a0d853d8cdcfa34c2cbbf153 (diff) | |
| download | lingo-archipelago-5add48e21643321859783e069c9266b78245ab31.tar.gz lingo-archipelago-5add48e21643321859783e069c9266b78245ab31.tar.bz2 lingo-archipelago-5add48e21643321859783e069c9266b78245ab31.zip | |
Sync solved panels with datastorage
| -rw-r--r-- | Archipelago/client.gd | 103 | ||||
| -rw-r--r-- | Archipelago/load.gd | 5 | ||||
| -rw-r--r-- | 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 = "" | |||
| 136 | var _hinted_locations = [] | 136 | var _hinted_locations = [] |
| 137 | var _batch_messages = false | 137 | var _batch_messages = false |
| 138 | var _held_messages = {} | 138 | var _held_messages = {} |
| 139 | var _held_panels = [] | ||
| 140 | var _held_synced_panels = [] | ||
| 141 | var _solved_panels = [] | ||
| 142 | |||
| 143 | var _panelsBySolveIndex = {} | ||
| 144 | const kPANEL_BITFIELDS = 13 # 802 / 64 | ||
| 139 | 145 | ||
| 140 | signal could_not_connect | 146 | signal could_not_connect |
| 141 | signal connect_status | 147 | signal connect_status |
| @@ -191,6 +197,8 @@ func _reset_state(): | |||
| 191 | _authenticated = false | 197 | _authenticated = false |
| 192 | _map_loaded = false | 198 | _map_loaded = false |
| 193 | _try_wss = false | 199 | _try_wss = false |
| 200 | _panelsBySolveIndex = {} | ||
| 201 | _solved_panels = [] | ||
| 194 | 202 | ||
| 195 | 203 | ||
| 196 | func _errored(): | 204 | func _errored(): |
| @@ -412,22 +420,33 @@ func _on_data(): | |||
| 412 | 420 | ||
| 413 | requestSync() | 421 | requestSync() |
| 414 | 422 | ||
| 415 | sendMessage( | ||
| 416 | [ | ||
| 417 | { | ||
| 418 | "cmd": "Set", | ||
| 419 | "key": "Lingo_%d_Paintings" % [_slot], | ||
| 420 | "default": [], | ||
| 421 | "want_reply": true, | ||
| 422 | "operations": [{"operation": "default", "value": []}] | ||
| 423 | } | ||
| 424 | ] | ||
| 425 | ) | ||
| 426 | |||
| 427 | _hints_key = "_read_hints_%d_%d" % [_team, _slot] | 423 | _hints_key = "_read_hints_%d_%d" % [_team, _slot] |
| 428 | sendMessage( | 424 | |
| 429 | [{"cmd": "SetNotify", "keys": [_hints_key]}, {"cmd": "Get", "keys": [_hints_key]}] | 425 | var cmds = [ |
| 430 | ) | 426 | { |
| 427 | "cmd": "Set", | ||
| 428 | "key": "Lingo_%d_Paintings" % [_slot], | ||
| 429 | "default": [], | ||
| 430 | "want_reply": true, | ||
| 431 | "operations": [{"operation": "default", "value": []}] | ||
| 432 | }, | ||
| 433 | {"cmd": "Get", "keys": [_hints_key]} | ||
| 434 | ] | ||
| 435 | |||
| 436 | var set_notifies = [_hints_key] | ||
| 437 | for k in range(0, kPANEL_BITFIELDS): | ||
| 438 | var panel_key = "Lingo_%d_Panels_%d" % [_slot, k] | ||
| 439 | set_notifies.append(panel_key) | ||
| 440 | cmds.append({ | ||
| 441 | "cmd": "Set", | ||
| 442 | "key": panel_key, | ||
| 443 | "default": 0, | ||
| 444 | "operations": [{"operation": "default", "value": 0}] | ||
| 445 | }) | ||
| 446 | |||
| 447 | cmds.append({"cmd": "SetNotify", "keys": set_notifies}) | ||
| 448 | |||
| 449 | sendMessage(cmds) | ||
| 431 | 450 | ||
| 432 | emit_signal("client_connected") | 451 | emit_signal("client_connected") |
| 433 | 452 | ||
| @@ -557,6 +576,13 @@ func _on_data(): | |||
| 557 | _checked_paintings = message["value"] | 576 | _checked_paintings = message["value"] |
| 558 | elif message["key"] == _hints_key: | 577 | elif message["key"] == _hints_key: |
| 559 | parseHints(message["value"]) | 578 | parseHints(message["value"]) |
| 579 | elif message["key"].begins_with("Lingo_%d_Panels_" % _slot): | ||
| 580 | var key_index = int(message["key"].substr(("Lingo_%d_Panels_" % _slot).length())) | ||
| 581 | var field_value = int(message["value"]) | ||
| 582 | for k in range(0, 64): | ||
| 583 | if field_value & (1 << k) != 0: | ||
| 584 | var panel_index = key_index * 64 + k | ||
| 585 | syncSolvedPanel(panel_index) | ||
| 560 | 586 | ||
| 561 | elif cmd == "Retrieved": | 587 | elif cmd == "Retrieved": |
| 562 | if message.has("keys") and message["keys"].has(_hints_key): | 588 | if message.has("keys") and message["keys"].has(_hints_key): |
| @@ -776,9 +802,28 @@ func mapFinishedLoading(): | |||
| 776 | 802 | ||
| 777 | sendMessage([{"cmd": "LocationChecks", "locations": _held_locations}]) | 803 | sendMessage([{"cmd": "LocationChecks", "locations": _held_locations}]) |
| 778 | 804 | ||
| 805 | var panel_data = [] | ||
| 806 | for k in range(0, kPANEL_BITFIELDS): | ||
| 807 | panel_data.append(0) | ||
| 808 | |||
| 809 | for panel_index in _held_panels: | ||
| 810 | var key_index = panel_index / 64 | ||
| 811 | var field_slot = panel_index % 64 | ||
| 812 | panel_data[key_index] = panel_data[key_index] | (1 << field_slot) | ||
| 813 | |||
| 814 | for k in range(0, kPANEL_BITFIELDS): | ||
| 815 | if panel_data[k] != 0: | ||
| 816 | setValue("Panels_%d" % k, panel_data[k], "or") | ||
| 817 | |||
| 779 | _map_loaded = true | 818 | _map_loaded = true |
| 819 | |||
| 820 | for synced in _held_synced_panels: | ||
| 821 | syncSolvedPanel(synced) | ||
| 822 | |||
| 780 | _held_items = [] | 823 | _held_items = [] |
| 781 | _held_locations = [] | 824 | _held_locations = [] |
| 825 | _held_panels = [] | ||
| 826 | _held_synced_panels = [] | ||
| 782 | 827 | ||
| 783 | 828 | ||
| 784 | func processItem(item, index, from, flags): | 829 | func processItem(item, index, from, flags): |
| @@ -911,6 +956,23 @@ func processItem(item, index, from, flags): | |||
| 911 | saveLocaldata() | 956 | saveLocaldata() |
| 912 | 957 | ||
| 913 | 958 | ||
| 959 | func syncSolvedPanel(panel_index): | ||
| 960 | if _solved_panels.has(panel_index): | ||
| 961 | return | ||
| 962 | |||
| 963 | if _map_loaded: | ||
| 964 | var panel_name = _panelsBySolveIndex[panel_index] | ||
| 965 | global._print("Synced solved panel %d: %s" % [panel_index, panel_name]) | ||
| 966 | |||
| 967 | if !panel_name.begins_with("EndPanel"): | ||
| 968 | var the_panel = get_tree().get_root().get_node("Spatial/Panels").get_node(panel_name) | ||
| 969 | |||
| 970 | if !the_panel.is_complete: | ||
| 971 | the_panel.get_node("Viewport/GUI/Panel/TextEdit").complete() | ||
| 972 | else: | ||
| 973 | _held_synced_panels.append(panel_index) | ||
| 974 | |||
| 975 | |||
| 914 | func doorIsVanilla(door): | 976 | func doorIsVanilla(door): |
| 915 | return !$Gamedata.mentioned_doors.has(door) | 977 | return !$Gamedata.mentioned_doors.has(door) |
| 916 | 978 | ||
| @@ -955,6 +1017,17 @@ func checkPainting(painting_id): | |||
| 955 | setValue("Paintings", [painting_id], "add") | 1017 | setValue("Paintings", [painting_id], "add") |
| 956 | 1018 | ||
| 957 | 1019 | ||
| 1020 | func solvePanel(panel_index): | ||
| 1021 | _solved_panels.append(panel_index) | ||
| 1022 | |||
| 1023 | if _map_loaded: | ||
| 1024 | var key_index = panel_index / 64 | ||
| 1025 | var field_slot = panel_index % 64 | ||
| 1026 | setValue("Panels_%d" % key_index, 1 << field_slot, "or") | ||
| 1027 | else: | ||
| 1028 | _held_panels.append(panel_index) | ||
| 1029 | |||
| 1030 | |||
| 958 | func parseHints(hints): | 1031 | func parseHints(hints): |
| 959 | _hinted_locations.clear() | 1032 | _hinted_locations.clear() |
| 960 | 1033 | ||
| 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(): | |||
| 569 | # Attach a script to every panel so that we can do things like conditionally | 569 | # Attach a script to every panel so that we can do things like conditionally |
| 570 | # disable them. | 570 | # disable them. |
| 571 | var panel_script = apclient.SCRIPT_panel | 571 | var panel_script = apclient.SCRIPT_panel |
| 572 | var panel_index = 0 | ||
| 572 | for panel in gamedata.panels: | 573 | for panel in gamedata.panels: |
| 573 | var panel_node | 574 | var panel_node |
| 574 | if panel["id"].begins_with("EndPanel"): | 575 | if panel["id"].begins_with("EndPanel"): |
| @@ -578,11 +579,15 @@ func _load(): | |||
| 578 | var script_instance = panel_script.new() | 579 | var script_instance = panel_script.new() |
| 579 | script_instance.name = "AP_Panel" | 580 | script_instance.name = "AP_Panel" |
| 580 | script_instance.data = panel | 581 | script_instance.data = panel |
| 582 | script_instance.solve_index = panel_index | ||
| 581 | if apclient._panel_door_shuffle and gamedata.mentioned_panels.has(panel["id"]): | 583 | if apclient._panel_door_shuffle and gamedata.mentioned_panels.has(panel["id"]): |
| 582 | script_instance.locked = true | 584 | script_instance.locked = true |
| 583 | panel_node.add_child(script_instance) | 585 | panel_node.add_child(script_instance) |
| 584 | apclient.connect("evaluate_solvability", script_instance, "evaluate_solvability") | 586 | apclient.connect("evaluate_solvability", script_instance, "evaluate_solvability") |
| 585 | 587 | ||
| 588 | apclient._panelsBySolveIndex[panel_index] = panel["id"] | ||
| 589 | panel_index += 1 | ||
| 590 | |||
| 586 | # Hook up the goal panel. | 591 | # Hook up the goal panel. |
| 587 | if apclient._victory_condition == apclient.kTHE_MASTER: | 592 | if apclient._victory_condition == apclient.kTHE_MASTER: |
| 588 | var the_master = self.get_node("Panels/Countdown Panels/Panel_master_master") | 593 | 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 = "" | |||
| 6 | var orig_color = Color(0, 0, 0, 0) | 6 | var orig_color = Color(0, 0, 0, 0) |
| 7 | var solvable = true | 7 | var solvable = true |
| 8 | var locked = false | 8 | var locked = false |
| 9 | var solve_index = null | ||
| 9 | 10 | ||
| 10 | const kAtbashPre = "abcdefghijklmnopqrstuvwxyz1234567890+-" | 11 | const kAtbashPre = "abcdefghijklmnopqrstuvwxyz1234567890+-" |
| 11 | const kAtbashPost = "zyxwvutsrqponmlkjihgfedcba0987654321-+" | 12 | const kAtbashPost = "zyxwvutsrqponmlkjihgfedcba0987654321-+" |
| @@ -32,6 +33,10 @@ func answer_correct(): | |||
| 32 | var effects = get_tree().get_root().get_node("Spatial/AP_Effects") | 33 | var effects = get_tree().get_root().get_node("Spatial/AP_Effects") |
| 33 | effects.deactivate_atbash_trap() | 34 | effects.deactivate_atbash_trap() |
| 34 | 35 | ||
| 36 | if solve_index != null: | ||
| 37 | var apclient = global.get_node("Archipelago") | ||
| 38 | apclient.solvePanel(solve_index) | ||
| 39 | |||
| 35 | 40 | ||
| 36 | func evaluate_solvability(): | 41 | func evaluate_solvability(): |
| 37 | var apclient = global.get_node("Archipelago") | 42 | var apclient = global.get_node("Archipelago") |
