diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2025-09-08 13:44:45 -0400 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2025-09-08 13:44:45 -0400 |
commit | 0aa1b7c005edc97323f3e1cbbe591d9064a73475 (patch) | |
tree | fa8dba2fc0552e68dee1bb5a9c3cc956c31d0ceb /client | |
parent | 55e5d0aa958c4ab9b4161743d28d924b60bf496d (diff) | |
download | lingo2-archipelago-0aa1b7c005edc97323f3e1cbbe591d9064a73475.tar.gz lingo2-archipelago-0aa1b7c005edc97323f3e1cbbe591d9064a73475.tar.bz2 lingo2-archipelago-0aa1b7c005edc97323f3e1cbbe591d9064a73475.zip |
[Client] Handle cyan door behavior
Player still needs to leave and re-enter the map for "any double letter" value.
Diffstat (limited to 'client')
-rw-r--r-- | client/Archipelago/keyboard.gd | 10 | ||||
-rw-r--r-- | client/Archipelago/manager.gd | 61 |
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(): | |||
79 | func update_unlocks(): | 79 | func 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 | ||
94 | func collect_local_letter(key, level): | 102 | func 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 = [] | |||
23 | var _held_location_scouts = [] | 23 | var _held_location_scouts = [] |
24 | var _location_scouts = {} | 24 | var _location_scouts = {} |
25 | var _item_locks = {} | 25 | var _item_locks = {} |
26 | var _inverse_item_locks = {} | ||
26 | var _held_letters = {} | 27 | var _held_letters = {} |
27 | var _letters_setup = false | 28 | var _letters_setup = false |
28 | 29 | ||
@@ -36,6 +37,11 @@ const kLETTER_BEHAVIOR_VANILLA = 0 | |||
36 | const kLETTER_BEHAVIOR_ITEM = 1 | 37 | const kLETTER_BEHAVIOR_ITEM = 1 |
37 | const kLETTER_BEHAVIOR_UNLOCKED = 2 | 38 | const kLETTER_BEHAVIOR_UNLOCKED = 2 |
38 | 39 | ||
40 | const kCYAN_DOOR_BEHAVIOR_H2 = 0 | ||
41 | const kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER = 1 | ||
42 | const kCYAN_DOOR_BEHAVIOR_ITEM = 2 | ||
43 | |||
44 | var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2 | ||
39 | var daedalus_roof_access = false | 45 | var daedalus_roof_access = false |
40 | var keyholder_sanity = false | 46 | var keyholder_sanity = false |
41 | var shuffle_control_center_colors = false | 47 | var 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 | ||