about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--client/Archipelago/keyboard.gd10
-rw-r--r--client/Archipelago/manager.gd61
2 files changed, 52 insertions, 19 deletions
diff --git a/client/Archipelago/keyboard.gd b/client/Archipelago/keyboard.gd index e43ec9f..600a047 100644 --- a/client/Archipelago/keyboard.gd +++ b/client/Archipelago/keyboard.gd
@@ -79,17 +79,25 @@ func save():
79func update_unlocks(): 79func update_unlocks():
80 unlocks.resetKeys() 80 unlocks.resetKeys()
81 81
82 var has_doubles = false
83
82 for k in kALL_LETTERS: 84 for k in kALL_LETTERS:
83 var level = 0 85 var level = 0
84 86
85 if not letters_in_keyholders.has(k): 87 if not letters_in_keyholders.has(k):
86 level = letters_saved.get(k, 0) + letters_dynamic.get(k, 0) 88 level = letters_saved.get(k, 0) + letters_dynamic.get(k, 0)
87 89
88 if level > 2: 90 if level >= 2:
89 level = 2 91 level = 2
92 has_doubles = true
90 93
91 unlocks.unlockKey(k, level) 94 unlocks.unlockKey(k, level)
92 95
96 if has_doubles and unlocks.data["double_letters"] != "unlocked":
97 var ap = global.get_node("Archipelago")
98 if ap.cyan_door_behavior == ap.kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER:
99 unlocks.setData("double_letters", "unlocked")
100
93 101
94func collect_local_letter(key, level): 102func collect_local_letter(key, level):
95 if level < 0 or level > 2 or level < letters_saved.get(key, 0): 103 if level < 0 or level > 2 or level < letters_saved.get(key, 0):
diff --git a/client/Archipelago/manager.gd b/client/Archipelago/manager.gd index 72abf34..b71a326 100644 --- a/client/Archipelago/manager.gd +++ b/client/Archipelago/manager.gd
@@ -23,6 +23,7 @@ var _held_locations = []
23var _held_location_scouts = [] 23var _held_location_scouts = []
24var _location_scouts = {} 24var _location_scouts = {}
25var _item_locks = {} 25var _item_locks = {}
26var _inverse_item_locks = {}
26var _held_letters = {} 27var _held_letters = {}
27var _letters_setup = false 28var _letters_setup = false
28 29
@@ -36,6 +37,11 @@ const kLETTER_BEHAVIOR_VANILLA = 0
36const kLETTER_BEHAVIOR_ITEM = 1 37const kLETTER_BEHAVIOR_ITEM = 1
37const kLETTER_BEHAVIOR_UNLOCKED = 2 38const kLETTER_BEHAVIOR_UNLOCKED = 2
38 39
40const kCYAN_DOOR_BEHAVIOR_H2 = 0
41const kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER = 1
42const kCYAN_DOOR_BEHAVIOR_ITEM = 2
43
44var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2
39var daedalus_roof_access = false 45var daedalus_roof_access = false
40var keyholder_sanity = false 46var keyholder_sanity = false
41var shuffle_control_center_colors = false 47var shuffle_control_center_colors = false
@@ -146,24 +152,26 @@ func _process_item(item, index, from, flags, amount):
146 item_name = client._item_id_to_name["Lingo 2"][item] 152 item_name = client._item_id_to_name["Lingo 2"][item]
147 153
148 var gamedata = global.get_node("Gamedata") 154 var gamedata = global.get_node("Gamedata")
149 var door_id = gamedata.door_id_by_ap_id.get(item, null) 155
150 var prog_id = null 156 var prog_id = null
157 if _inverse_item_locks.has(item):
158 for lock in _inverse_item_locks.get(item):
159 if lock[1] != amount:
160 continue
151 161
152 if door_id == null: 162 if gamedata.progressive_id_by_ap_id.has(item):
153 prog_id = gamedata.progressive_id_by_ap_id.get(item, null) 163 prog_id = lock[0]
154 if prog_id != null: 164
155 var progressive = gamedata.objects.get_progressives()[prog_id] 165 if gamedata.get_door_map_name(lock[0]) != global.map:
156 if progressive.get_doors().size() >= amount: 166 continue
157 door_id = progressive.get_doors()[amount - 1] 167
158 168 var receivers = gamedata.get_door_receivers(lock[0])
159 if door_id != null and gamedata.get_door_map_name(door_id) == global.map: 169 var scene = get_tree().get_root().get_node_or_null("scene")
160 var receivers = gamedata.get_door_receivers(door_id) 170 if scene != null:
161 var scene = get_tree().get_root().get_node_or_null("scene") 171 for receiver in receivers:
162 if scene != null: 172 var rnode = scene.get_node_or_null(receiver)
163 for receiver in receivers: 173 if rnode != null:
164 var rnode = scene.get_node_or_null(receiver) 174 rnode.handleTriggered()
165 if rnode != null:
166 rnode.handleTriggered()
167 175
168 var letter_id = gamedata.letter_id_by_ap_id.get(item, null) 176 var letter_id = gamedata.letter_id_by_ap_id.get(item, null)
169 if letter_id != null: 177 if letter_id != null:
@@ -183,8 +191,8 @@ func _process_item(item, index, from, flags, amount):
183 var item_color = colorForItemType(flags) 191 var item_color = colorForItemType(flags)
184 192
185 var full_item_name = item_name 193 var full_item_name = item_name
186 if prog_id != null and door_id != null: 194 if prog_id != null:
187 var door = gamedata.objects.get_doors()[door_id] 195 var door = gamedata.objects.get_doors()[prog_id]
188 full_item_name = "%s (%s)" % [item_name, door.get_name()] 196 full_item_name = "%s (%s)" % [item_name, door.get_name()]
189 197
190 var message 198 var message
@@ -338,6 +346,7 @@ func _client_connected(slot_data):
338 _last_new_item = localdata[0] 346 _last_new_item = localdata[0]
339 347
340 # Read slot data. 348 # Read slot data.
349 cyan_door_behavior = int(slot_data.get("cyan_door_behavior", 0))
341 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) 350 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false))
342 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) 351 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false))
343 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false)) 352 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false))
@@ -376,6 +385,22 @@ func _client_connected(slot_data):
376 for door in door_group.get_doors(): 385 for door in door_group.get_doors():
377 _item_locks[door] = [door_group.get_ap_id(), 1] 386 _item_locks[door] = [door_group.get_ap_id(), 1]
378 387
388 if cyan_door_behavior == kCYAN_DOOR_BEHAVIOR_ITEM:
389 for door_group in gamedata.objects.get_door_groups():
390 if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CYAN_DOORS:
391 for door in door_group.get_doors():
392 if not _item_locks.has(door):
393 _item_locks[door] = [door_group.get_ap_id(), 1]
394
395 # Create a reverse item locks map for processing items.
396 for door_id in _item_locks.keys():
397 var lock = _item_locks.get(door_id)
398
399 if not _inverse_item_locks.has(lock[0]):
400 _inverse_item_locks[lock[0]] = []
401
402 _inverse_item_locks[lock[0]].append([door_id, lock[1]])
403
379 emit_signal("ap_connected") 404 emit_signal("ap_connected")
380 405
381 406