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/manager.gd | 74 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 5 deletions(-) (limited to 'client/Archipelago/manager.gd') diff --git a/client/Archipelago/manager.gd b/client/Archipelago/manager.gd index 609e645..07d28a4 100644 --- a/client/Archipelago/manager.gd +++ b/client/Archipelago/manager.gd @@ -3,6 +3,7 @@ extends Node const my_version = "0.1.0" var SCRIPT_client +var SCRIPT_keyboard var SCRIPT_locationListener var SCRIPT_uuid var SCRIPT_victoryListener @@ -13,16 +14,30 @@ var ap_pass = "" var connection_history = [] var client +var keyboard var _localdata_file = "" var _last_new_item = -1 var _batch_locations = false var _held_locations = [] var _item_locks = {} +var _held_letters = {} +var _letters_setup = false + +const kSHUFFLE_LETTERS_VANILLA = 0 +const kSHUFFLE_LETTERS_UNLOCKED = 1 +const kSHUFFLE_LETTERS_PROGRESSIVE = 2 +const kSHUFFLE_LETTERS_VANILLA_CYAN = 3 +const kSHUFFLE_LETTERS_ITEM_CYAN = 4 + +const kLETTER_BEHAVIOR_VANILLA = 0 +const kLETTER_BEHAVIOR_ITEM = 1 +const kLETTER_BEHAVIOR_UNLOCKED = 2 var daedalus_roof_access = false var keyholder_sanity = false var shuffle_doors = false +var shuffle_letters = kSHUFFLE_LETTERS_VANILLA var victory_condition = -1 signal could_not_connect @@ -66,6 +81,9 @@ func _ready(): add_child(client) + keyboard = SCRIPT_keyboard.new() + add_child(keyboard) + func saveSettings(): # Save the AP settings to disk. @@ -100,6 +118,8 @@ func saveLocaldata(): func connectToServer(): _last_new_item = -1 + _letters_setup = false + _held_letters = {} client.connectToServer(ap_server, ap_user, ap_pass) @@ -140,11 +160,10 @@ func _process_item(item, index, from, flags, amount): var rnode = scene.get_node_or_null(receiver) if rnode != null: rnode.handleTriggered() - #for painting_id in gamedata.objects.get_doors()[door_id].get_move_paintings(): - # var painting = gamedata.objects.get_paintings()[painting_id] - # var pnode = scene.get_node_or_null(painting.get_path() + "/teleportListener") - # if pnode != null: - # pnode.handleTriggered() + + var letter_key = gamedata.letter_key_by_ap_id.get(item, null) + if letter_key != null: + _process_key_item(letter_key, amount) # Show a message about the item if it's new. if index != null and index > _last_new_item: @@ -293,6 +312,7 @@ func _client_connected(slot_data): daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) shuffle_doors = bool(slot_data.get("shuffle_doors", false)) + shuffle_letters = int(slot_data.get("shuffle_letters", 0)) victory_condition = int(slot_data.get("victory_condition", 0)) # Set up item locks. @@ -344,3 +364,47 @@ func colorForItemType(flags): return "#d63a22" else: # filler return "#14de9e" + + +func get_letter_behavior(key, level2): + if shuffle_letters == kSHUFFLE_LETTERS_UNLOCKED: + return kLETTER_BEHAVIOR_UNLOCKED + + if [kSHUFFLE_LETTERS_VANILLA_CYAN, kSHUFFLE_LETTERS_ITEM_CYAN].has(shuffle_letters): + if level2: + if shuffle_letters == kSHUFFLE_LETTERS_VANILLA_CYAN: + return kLETTER_BEHAVIOR_VANILLA + else: + return kLETTER_BEHAVIOR_ITEM + else: + return kLETTER_BEHAVIOR_UNLOCKED + + if not level2 and ["h", "i", "n", "t"].has(key): + # This differs from the equivalent function in the apworld. Logically it is + # the same as UNLOCKED since they are in the starting room, but VANILLA + # means the player still has to actually pick up the letters. + return kLETTER_BEHAVIOR_VANILLA + + if shuffle_letters == kSHUFFLE_LETTERS_PROGRESSIVE: + return kLETTER_BEHAVIOR_ITEM + + return kLETTER_BEHAVIOR_VANILLA + + +func setup_keys(): + keyboard.load_seed() + + _letters_setup = true + + for k in _held_letters.keys(): + _process_key_item(k, _held_letters[k]) + + _held_letters.clear() + + +func _process_key_item(key, level): + if not _letters_setup: + _held_letters[key] = max(_held_letters.get(key, 0), level) + return + + keyboard.collect_remote_letter(key, level) -- cgit 1.4.1