From 5dbc46d7d00091b92b178a73f114871d0e0cc806 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 13 Sep 2025 12:43:15 -0400 Subject: [Client] Handle anti collectable traps --- client/Archipelago/gamedata.gd | 7 +++++++ client/Archipelago/keyboard.gd | 25 +++++++++++++++++++++++-- client/Archipelago/manager.gd | 3 +++ 3 files changed, 33 insertions(+), 2 deletions(-) (limited to 'client') diff --git a/client/Archipelago/gamedata.gd b/client/Archipelago/gamedata.gd index d8d16ed..41d966a 100644 --- a/client/Archipelago/gamedata.gd +++ b/client/Archipelago/gamedata.gd @@ -11,6 +11,7 @@ var map_id_by_name = {} var progressive_id_by_ap_id = {} var letter_id_by_ap_id = {} var symbol_item_ids = [] +var anti_trap_ids = {} var kSYMBOL_ITEMS @@ -97,6 +98,12 @@ func load(data_bytes): for symbol_name in kSYMBOL_ITEMS.values(): symbol_item_ids.append(objects.get_special_ids()[symbol_name]) + for special_name in objects.get_special_ids().keys(): + if special_name.begins_with("Anti "): + anti_trap_ids[objects.get_special_ids()[special_name]] = ( + special_name.substr(5).to_lower() + ) + func get_door_for_map_node_path(map_name, node_path): if not door_id_by_map_node_path.has(map_name): diff --git a/client/Archipelago/keyboard.gd b/client/Archipelago/keyboard.gd index 600a047..450566d 100644 --- a/client/Archipelago/keyboard.gd +++ b/client/Archipelago/keyboard.gd @@ -4,6 +4,7 @@ const kALL_LETTERS = "abcdefghjiklmnopqrstuvwxyz" var letters_saved = {} var letters_in_keyholders = [] +var letters_blocked = [] var letters_dynamic = {} var keyholder_state = {} @@ -17,6 +18,7 @@ func _init(): func reset(): letters_saved.clear() letters_in_keyholders.clear() + letters_blocked.clear() letters_dynamic.clear() keyholder_state.clear() @@ -91,6 +93,9 @@ func update_unlocks(): level = 2 has_doubles = true + if letters_blocked.has(k): + level = 0 + unlocks.unlockKey(k, level) if has_doubles and unlocks.data["double_letters"] != "unlocked": @@ -105,6 +110,9 @@ func collect_local_letter(key, level): letters_saved[key] = level + if letters_blocked.has(key): + letters_blocked.erase(key) + update_unlocks() save() @@ -115,6 +123,9 @@ func collect_remote_letter(key, level): letters_dynamic[key] = level + if letters_blocked.has(key): + letters_blocked.erase(key) + update_unlocks() save() @@ -148,6 +159,13 @@ func remove_from_keyholder(key, map, kh_path): save() +func block_letter(key): + if not letters_blocked.has(key): + letters_blocked.append(key) + + update_unlocks() + + func load_keyholders(map): if keyholder_state.has(map): var khs = keyholder_state[map] @@ -160,9 +178,11 @@ func load_keyholders(map): func reset_keyholders(): - if letters_in_keyholders.is_empty(): + if letters_in_keyholders.is_empty() and letters_blocked.is_empty(): return false + var cleared_anything = not letters_in_keyholders.is_empty() or not letters_blocked.is_empty() + if keyholder_state.has(global.map): for path in keyholder_state[global.map]: get_tree().get_root().get_node("scene").get_node(path).setFromAp( @@ -171,8 +191,9 @@ func reset_keyholders(): keyholder_state.clear() letters_in_keyholders.clear() + letters_blocked.clear() update_unlocks() save() - return true + return cleared_anything diff --git a/client/Archipelago/manager.gd b/client/Archipelago/manager.gd index 34f5e27..5a36336 100644 --- a/client/Archipelago/manager.gd +++ b/client/Archipelago/manager.gd @@ -215,6 +215,9 @@ func _process_item(item, index, from, flags, amount): "Received [color=%s]%s[/color] from %s" % [item_color, full_item_name, player_name] ) + if gamedata.anti_trap_ids.has(item): + keyboard.block_letter(gamedata.anti_trap_ids[item]) + global._print(message) global.get_node("Messages").showMessage(message) -- cgit 1.4.1