From 0aa1b7c005edc97323f3e1cbbe591d9064a73475 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 8 Sep 2025 13:44:45 -0400 Subject: [Client] Handle cyan door behavior Player still needs to leave and re-enter the map for "any double letter" value. --- client/Archipelago/keyboard.gd | 10 ++++++- 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(): func update_unlocks(): unlocks.resetKeys() + var has_doubles = false + for k in kALL_LETTERS: var level = 0 if not letters_in_keyholders.has(k): level = letters_saved.get(k, 0) + letters_dynamic.get(k, 0) - if level > 2: + if level >= 2: level = 2 + has_doubles = true unlocks.unlockKey(k, level) + if has_doubles and unlocks.data["double_letters"] != "unlocked": + var ap = global.get_node("Archipelago") + if ap.cyan_door_behavior == ap.kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER: + unlocks.setData("double_letters", "unlocked") + func collect_local_letter(key, level): 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 = [] var _held_location_scouts = [] var _location_scouts = {} var _item_locks = {} +var _inverse_item_locks = {} var _held_letters = {} var _letters_setup = false @@ -36,6 +37,11 @@ const kLETTER_BEHAVIOR_VANILLA = 0 const kLETTER_BEHAVIOR_ITEM = 1 const kLETTER_BEHAVIOR_UNLOCKED = 2 +const kCYAN_DOOR_BEHAVIOR_H2 = 0 +const kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER = 1 +const kCYAN_DOOR_BEHAVIOR_ITEM = 2 + +var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2 var daedalus_roof_access = false var keyholder_sanity = false var shuffle_control_center_colors = false @@ -146,24 +152,26 @@ func _process_item(item, index, from, flags, amount): item_name = client._item_id_to_name["Lingo 2"][item] var gamedata = global.get_node("Gamedata") - var door_id = gamedata.door_id_by_ap_id.get(item, null) + var prog_id = null + if _inverse_item_locks.has(item): + for lock in _inverse_item_locks.get(item): + if lock[1] != amount: + continue - if door_id == null: - prog_id = gamedata.progressive_id_by_ap_id.get(item, null) - if prog_id != null: - var progressive = gamedata.objects.get_progressives()[prog_id] - if progressive.get_doors().size() >= amount: - door_id = progressive.get_doors()[amount - 1] - - if door_id != null and gamedata.get_door_map_name(door_id) == global.map: - var receivers = gamedata.get_door_receivers(door_id) - var scene = get_tree().get_root().get_node_or_null("scene") - if scene != null: - for receiver in receivers: - var rnode = scene.get_node_or_null(receiver) - if rnode != null: - rnode.handleTriggered() + if gamedata.progressive_id_by_ap_id.has(item): + prog_id = lock[0] + + if gamedata.get_door_map_name(lock[0]) != global.map: + continue + + var receivers = gamedata.get_door_receivers(lock[0]) + var scene = get_tree().get_root().get_node_or_null("scene") + if scene != null: + for receiver in receivers: + var rnode = scene.get_node_or_null(receiver) + if rnode != null: + rnode.handleTriggered() var letter_id = gamedata.letter_id_by_ap_id.get(item, null) if letter_id != null: @@ -183,8 +191,8 @@ func _process_item(item, index, from, flags, amount): var item_color = colorForItemType(flags) var full_item_name = item_name - if prog_id != null and door_id != null: - var door = gamedata.objects.get_doors()[door_id] + if prog_id != null: + var door = gamedata.objects.get_doors()[prog_id] full_item_name = "%s (%s)" % [item_name, door.get_name()] var message @@ -338,6 +346,7 @@ func _client_connected(slot_data): _last_new_item = localdata[0] # Read slot data. + cyan_door_behavior = int(slot_data.get("cyan_door_behavior", 0)) daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false)) @@ -376,6 +385,22 @@ func _client_connected(slot_data): for door in door_group.get_doors(): _item_locks[door] = [door_group.get_ap_id(), 1] + if cyan_door_behavior == kCYAN_DOOR_BEHAVIOR_ITEM: + for door_group in gamedata.objects.get_door_groups(): + if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CYAN_DOORS: + for door in door_group.get_doors(): + if not _item_locks.has(door): + _item_locks[door] = [door_group.get_ap_id(), 1] + + # Create a reverse item locks map for processing items. + for door_id in _item_locks.keys(): + var lock = _item_locks.get(door_id) + + if not _inverse_item_locks.has(lock[0]): + _inverse_item_locks[lock[0]] = [] + + _inverse_item_locks[lock[0]].append([door_id, lock[1]]) + emit_signal("ap_connected") -- cgit 1.4.1