diff options
Diffstat (limited to 'Archipelago')
-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") |