about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--Archipelago/client.gd103
-rw-r--r--Archipelago/load.gd5
-rw-r--r--Archipelago/panel.gd5
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 = ""
136var _hinted_locations = [] 136var _hinted_locations = []
137var _batch_messages = false 137var _batch_messages = false
138var _held_messages = {} 138var _held_messages = {}
139var _held_panels = []
140var _held_synced_panels = []
141var _solved_panels = []
142
143var _panelsBySolveIndex = {}
144const kPANEL_BITFIELDS = 13 # 802 / 64
139 145
140signal could_not_connect 146signal could_not_connect
141signal connect_status 147signal 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
196func _errored(): 204func _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
784func processItem(item, index, from, flags): 829func processItem(item, index, from, flags):
@@ -911,6 +956,23 @@ func processItem(item, index, from, flags):
911 saveLocaldata() 956 saveLocaldata()
912 957
913 958
959func 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
914func doorIsVanilla(door): 976func 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
1020func 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
958func parseHints(hints): 1031func 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 = ""
6var orig_color = Color(0, 0, 0, 0) 6var orig_color = Color(0, 0, 0, 0)
7var solvable = true 7var solvable = true
8var locked = false 8var locked = false
9var solve_index = null
9 10
10const kAtbashPre = "abcdefghijklmnopqrstuvwxyz1234567890+-" 11const kAtbashPre = "abcdefghijklmnopqrstuvwxyz1234567890+-"
11const kAtbashPost = "zyxwvutsrqponmlkjihgfedcba0987654321-+" 12const 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
36func evaluate_solvability(): 41func evaluate_solvability():
37 var apclient = global.get_node("Archipelago") 42 var apclient = global.get_node("Archipelago")