about summary refs log tree commit diff stats
path: root/client/Archipelago/keyboard.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/Archipelago/keyboard.gd')
-rw-r--r--client/Archipelago/keyboard.gd35
1 files changed, 32 insertions, 3 deletions
diff --git a/client/Archipelago/keyboard.gd b/client/Archipelago/keyboard.gd index e43ec9f..450566d 100644 --- a/client/Archipelago/keyboard.gd +++ b/client/Archipelago/keyboard.gd
@@ -4,6 +4,7 @@ const kALL_LETTERS = "abcdefghjiklmnopqrstuvwxyz"
4 4
5var letters_saved = {} 5var letters_saved = {}
6var letters_in_keyholders = [] 6var letters_in_keyholders = []
7var letters_blocked = []
7var letters_dynamic = {} 8var letters_dynamic = {}
8var keyholder_state = {} 9var keyholder_state = {}
9 10
@@ -17,6 +18,7 @@ func _init():
17func reset(): 18func 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
@@ -79,17 +81,28 @@ func save():
79func update_unlocks(): 81func update_unlocks():
80 unlocks.resetKeys() 82 unlocks.resetKeys()
81 83
84 var has_doubles = false
85
82 for k in kALL_LETTERS: 86 for k in kALL_LETTERS:
83 var level = 0 87 var level = 0
84 88
85 if not letters_in_keyholders.has(k): 89 if not letters_in_keyholders.has(k):
86 level = letters_saved.get(k, 0) + letters_dynamic.get(k, 0) 90 level = letters_saved.get(k, 0) + letters_dynamic.get(k, 0)
87 91
88 if level > 2: 92 if level >= 2:
89 level = 2 93 level = 2
94 has_doubles = true
95
96 if letters_blocked.has(k):
97 level = 0
90 98
91 unlocks.unlockKey(k, level) 99 unlocks.unlockKey(k, level)
92 100
101 if has_doubles and unlocks.data["double_letters"] != "unlocked":
102 var ap = global.get_node("Archipelago")
103 if ap.cyan_door_behavior == ap.kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER:
104 unlocks.setData("double_letters", "unlocked")
105
93 106
94func collect_local_letter(key, level): 107func collect_local_letter(key, level):
95 if level < 0 or level > 2 or level < letters_saved.get(key, 0): 108 if level < 0 or level > 2 or level < letters_saved.get(key, 0):
@@ -97,6 +110,9 @@ func collect_local_letter(key, level):
97 110
98 letters_saved[key] = level 111 letters_saved[key] = level
99 112
113 if letters_blocked.has(key):
114 letters_blocked.erase(key)
115
100 update_unlocks() 116 update_unlocks()
101 save() 117 save()
102 118
@@ -107,6 +123,9 @@ func collect_remote_letter(key, level):
107 123
108 letters_dynamic[key] = level 124 letters_dynamic[key] = level
109 125
126 if letters_blocked.has(key):
127 letters_blocked.erase(key)
128
110 update_unlocks() 129 update_unlocks()
111 save() 130 save()
112 131
@@ -140,6 +159,13 @@ func remove_from_keyholder(key, map, kh_path):
140 save() 159 save()
141 160
142 161
162func block_letter(key):
163 if not letters_blocked.has(key):
164 letters_blocked.append(key)
165
166 update_unlocks()
167
168
143func load_keyholders(map): 169func load_keyholders(map):
144 if keyholder_state.has(map): 170 if keyholder_state.has(map):
145 var khs = keyholder_state[map] 171 var khs = keyholder_state[map]
@@ -152,9 +178,11 @@ func load_keyholders(map):
152 178
153 179
154func reset_keyholders(): 180func reset_keyholders():
155 if letters_in_keyholders.is_empty(): 181 if letters_in_keyholders.is_empty() and letters_blocked.is_empty():
156 return false 182 return false
157 183
184 var cleared_anything = not letters_in_keyholders.is_empty() or not letters_blocked.is_empty()
185
158 if keyholder_state.has(global.map): 186 if keyholder_state.has(global.map):
159 for path in keyholder_state[global.map]: 187 for path in keyholder_state[global.map]:
160 get_tree().get_root().get_node("scene").get_node(path).setFromAp( 188 get_tree().get_root().get_node("scene").get_node(path).setFromAp(
@@ -163,8 +191,9 @@ func reset_keyholders():
163 191
164 keyholder_state.clear() 192 keyholder_state.clear()
165 letters_in_keyholders.clear() 193 letters_in_keyholders.clear()
194 letters_blocked.clear()
166 195
167 update_unlocks() 196 update_unlocks()
168 save() 197 save()
169 198
170 return true 199 return cleared_anything