diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2025-09-13 12:43:15 -0400 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2025-09-13 12:43:15 -0400 |
commit | 5dbc46d7d00091b92b178a73f114871d0e0cc806 (patch) | |
tree | 67a67d7d1ed46d80544c5a3ea1e8431e06541095 | |
parent | c456854263be17264aeb8446986bc401d3921f33 (diff) | |
download | lingo2-archipelago-5dbc46d7d00091b92b178a73f114871d0e0cc806.tar.gz lingo2-archipelago-5dbc46d7d00091b92b178a73f114871d0e0cc806.tar.bz2 lingo2-archipelago-5dbc46d7d00091b92b178a73f114871d0e0cc806.zip |
[Client] Handle anti collectable traps
-rw-r--r-- | client/Archipelago/gamedata.gd | 7 | ||||
-rw-r--r-- | client/Archipelago/keyboard.gd | 25 | ||||
-rw-r--r-- | client/Archipelago/manager.gd | 3 |
3 files changed, 33 insertions, 2 deletions
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 = {} | |||
11 | var progressive_id_by_ap_id = {} | 11 | var progressive_id_by_ap_id = {} |
12 | var letter_id_by_ap_id = {} | 12 | var letter_id_by_ap_id = {} |
13 | var symbol_item_ids = [] | 13 | var symbol_item_ids = [] |
14 | var anti_trap_ids = {} | ||
14 | 15 | ||
15 | var kSYMBOL_ITEMS | 16 | var kSYMBOL_ITEMS |
16 | 17 | ||
@@ -97,6 +98,12 @@ func load(data_bytes): | |||
97 | for symbol_name in kSYMBOL_ITEMS.values(): | 98 | for symbol_name in kSYMBOL_ITEMS.values(): |
98 | symbol_item_ids.append(objects.get_special_ids()[symbol_name]) | 99 | symbol_item_ids.append(objects.get_special_ids()[symbol_name]) |
99 | 100 | ||
101 | for special_name in objects.get_special_ids().keys(): | ||
102 | if special_name.begins_with("Anti "): | ||
103 | anti_trap_ids[objects.get_special_ids()[special_name]] = ( | ||
104 | special_name.substr(5).to_lower() | ||
105 | ) | ||
106 | |||
100 | 107 | ||
101 | func get_door_for_map_node_path(map_name, node_path): | 108 | func get_door_for_map_node_path(map_name, node_path): |
102 | if not door_id_by_map_node_path.has(map_name): | 109 | 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" | |||
4 | 4 | ||
5 | var letters_saved = {} | 5 | var letters_saved = {} |
6 | var letters_in_keyholders = [] | 6 | var letters_in_keyholders = [] |
7 | var letters_blocked = [] | ||
7 | var letters_dynamic = {} | 8 | var letters_dynamic = {} |
8 | var keyholder_state = {} | 9 | var keyholder_state = {} |
9 | 10 | ||
@@ -17,6 +18,7 @@ func _init(): | |||
17 | func reset(): | 18 | func reset(): |
18 | letters_saved.clear() | 19 | letters_saved.clear() |
19 | letters_in_keyholders.clear() | 20 | letters_in_keyholders.clear() |
21 | letters_blocked.clear() | ||
20 | letters_dynamic.clear() | 22 | letters_dynamic.clear() |
21 | keyholder_state.clear() | 23 | keyholder_state.clear() |
22 | 24 | ||
@@ -91,6 +93,9 @@ func update_unlocks(): | |||
91 | level = 2 | 93 | level = 2 |
92 | has_doubles = true | 94 | has_doubles = true |
93 | 95 | ||
96 | if letters_blocked.has(k): | ||
97 | level = 0 | ||
98 | |||
94 | unlocks.unlockKey(k, level) | 99 | unlocks.unlockKey(k, level) |
95 | 100 | ||
96 | if has_doubles and unlocks.data["double_letters"] != "unlocked": | 101 | if has_doubles and unlocks.data["double_letters"] != "unlocked": |
@@ -105,6 +110,9 @@ func collect_local_letter(key, level): | |||
105 | 110 | ||
106 | letters_saved[key] = level | 111 | letters_saved[key] = level |
107 | 112 | ||
113 | if letters_blocked.has(key): | ||
114 | letters_blocked.erase(key) | ||
115 | |||
108 | update_unlocks() | 116 | update_unlocks() |
109 | save() | 117 | save() |
110 | 118 | ||
@@ -115,6 +123,9 @@ func collect_remote_letter(key, level): | |||
115 | 123 | ||
116 | letters_dynamic[key] = level | 124 | letters_dynamic[key] = level |
117 | 125 | ||
126 | if letters_blocked.has(key): | ||
127 | letters_blocked.erase(key) | ||
128 | |||
118 | update_unlocks() | 129 | update_unlocks() |
119 | save() | 130 | save() |
120 | 131 | ||
@@ -148,6 +159,13 @@ func remove_from_keyholder(key, map, kh_path): | |||
148 | save() | 159 | save() |
149 | 160 | ||
150 | 161 | ||
162 | func block_letter(key): | ||
163 | if not letters_blocked.has(key): | ||
164 | letters_blocked.append(key) | ||
165 | |||
166 | update_unlocks() | ||
167 | |||
168 | |||
151 | func load_keyholders(map): | 169 | func load_keyholders(map): |
152 | if keyholder_state.has(map): | 170 | if keyholder_state.has(map): |
153 | var khs = keyholder_state[map] | 171 | var khs = keyholder_state[map] |
@@ -160,9 +178,11 @@ func load_keyholders(map): | |||
160 | 178 | ||
161 | 179 | ||
162 | func reset_keyholders(): | 180 | func reset_keyholders(): |
163 | if letters_in_keyholders.is_empty(): | 181 | if letters_in_keyholders.is_empty() and letters_blocked.is_empty(): |
164 | return false | 182 | return false |
165 | 183 | ||
184 | var cleared_anything = not letters_in_keyholders.is_empty() or not letters_blocked.is_empty() | ||
185 | |||
166 | if keyholder_state.has(global.map): | 186 | if keyholder_state.has(global.map): |
167 | for path in keyholder_state[global.map]: | 187 | for path in keyholder_state[global.map]: |
168 | get_tree().get_root().get_node("scene").get_node(path).setFromAp( | 188 | get_tree().get_root().get_node("scene").get_node(path).setFromAp( |
@@ -171,8 +191,9 @@ func reset_keyholders(): | |||
171 | 191 | ||
172 | keyholder_state.clear() | 192 | keyholder_state.clear() |
173 | letters_in_keyholders.clear() | 193 | letters_in_keyholders.clear() |
194 | letters_blocked.clear() | ||
174 | 195 | ||
175 | update_unlocks() | 196 | update_unlocks() |
176 | save() | 197 | save() |
177 | 198 | ||
178 | return true | 199 | 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): | |||
215 | "Received [color=%s]%s[/color] from %s" % [item_color, full_item_name, player_name] | 215 | "Received [color=%s]%s[/color] from %s" % [item_color, full_item_name, player_name] |
216 | ) | 216 | ) |
217 | 217 | ||
218 | if gamedata.anti_trap_ids.has(item): | ||
219 | keyboard.block_letter(gamedata.anti_trap_ids[item]) | ||
220 | |||
218 | global._print(message) | 221 | global._print(message) |
219 | 222 | ||
220 | global.get_node("Messages").showMessage(message) | 223 | global.get_node("Messages").showMessage(message) |