From bb4b16ca06c70cf263424955713c91117f2f1813 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 6 Sep 2025 09:20:28 -0400 Subject: [Client] Handle letter shuffle Cyan doors are not handled properly yet. --- client/Archipelago/keyboard.gd | 170 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 client/Archipelago/keyboard.gd (limited to 'client/Archipelago/keyboard.gd') diff --git a/client/Archipelago/keyboard.gd b/client/Archipelago/keyboard.gd new file mode 100644 index 0000000..e43ec9f --- /dev/null +++ b/client/Archipelago/keyboard.gd @@ -0,0 +1,170 @@ +extends Node + +const kALL_LETTERS = "abcdefghjiklmnopqrstuvwxyz" + +var letters_saved = {} +var letters_in_keyholders = [] +var letters_dynamic = {} +var keyholder_state = {} + +var filename = "" + + +func _init(): + reset() + + +func reset(): + letters_saved.clear() + letters_in_keyholders.clear() + letters_dynamic.clear() + keyholder_state.clear() + + +func load_seed(): + var ap = global.get_node("Archipelago") + + reset() + + filename = "user://archipelago_keys/%s_%d" % [ap.client._seed, ap.client._slot] + + if FileAccess.file_exists(filename): + var ap_file = FileAccess.open(filename, FileAccess.READ) + var localdata = [] + if ap_file != null: + localdata = ap_file.get_var(true) + ap_file.close() + + if typeof(localdata) != TYPE_ARRAY: + print("AP keyboard file is corrupted") + localdata = [] + + if localdata.size() > 0: + letters_saved = localdata[0] + if localdata.size() > 1: + letters_in_keyholders = localdata[1] + if localdata.size() > 2: + keyholder_state = localdata[2] + + for k in kALL_LETTERS: + var level = 0 + + if ap.get_letter_behavior(k, false) == ap.kLETTER_BEHAVIOR_UNLOCKED: + level += 1 + if ap.get_letter_behavior(k, true) == ap.kLETTER_BEHAVIOR_UNLOCKED: + level += 1 + + letters_dynamic[k] = level + + update_unlocks() + + +func save(): + var dir = DirAccess.open("user://") + var folder = "archipelago_keys" + if not dir.dir_exists(folder): + dir.make_dir(folder) + + var file = FileAccess.open(filename, FileAccess.WRITE) + + var data = [ + letters_saved, + letters_in_keyholders, + keyholder_state, + ] + file.store_var(data, true) + file.close() + + +func update_unlocks(): + unlocks.resetKeys() + + 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: + level = 2 + + unlocks.unlockKey(k, level) + + +func collect_local_letter(key, level): + if level < 0 or level > 2 or level < letters_saved.get(key, 0): + return + + letters_saved[key] = level + + update_unlocks() + save() + + +func collect_remote_letter(key, level): + if level < 0 or level > 2 or level < letters_dynamic.get(key, 0): + return + + letters_dynamic[key] = level + + update_unlocks() + save() + + +func put_in_keyholder(key, map, kh_path): + if not keyholder_state.has(map): + keyholder_state[map] = {} + + keyholder_state[map][kh_path] = key + letters_in_keyholders.append(key) + + get_tree().get_root().get_node("scene").get_node(kh_path).setFromAp( + key, min(letters_saved.get(key, 0) + letters_dynamic.get(key, 0), 2) + ) + + update_unlocks() + save() + + +func remove_from_keyholder(key, map, kh_path): + if not keyholder_state.has(map): + # This... shouldn't happen. + keyholder_state[map] = {} + + keyholder_state[map].erase(kh_path) + letters_in_keyholders.erase(key) + + get_tree().get_root().get_node("scene").get_node(kh_path).setFromAp(key, 0) + + update_unlocks() + save() + + +func load_keyholders(map): + if keyholder_state.has(map): + var khs = keyholder_state[map] + + for path in khs.keys(): + var key = khs[path] + get_tree().get_root().get_node("scene").get_node(path).setFromAp( + key, min(letters_saved.get(key, 0) + letters_dynamic.get(key, 0), 2) + ) + + +func reset_keyholders(): + if letters_in_keyholders.is_empty(): + return false + + if keyholder_state.has(global.map): + for path in keyholder_state[global.map]: + get_tree().get_root().get_node("scene").get_node(path).setFromAp( + keyholder_state[global.map][path], 0 + ) + + keyholder_state.clear() + letters_in_keyholders.clear() + + update_unlocks() + save() + + return true -- cgit 1.4.1