diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2025-09-06 09:20:28 -0400 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2025-09-06 09:20:28 -0400 |
| commit | bb4b16ca06c70cf263424955713c91117f2f1813 (patch) | |
| tree | 1f234246ad48a2472904e92a6ff48fc7f13e1c49 /client/Archipelago/manager.gd | |
| parent | ebda0b634c2396338b86b45128bf507c967e88a7 (diff) | |
| download | lingo2-archipelago-bb4b16ca06c70cf263424955713c91117f2f1813.tar.gz lingo2-archipelago-bb4b16ca06c70cf263424955713c91117f2f1813.tar.bz2 lingo2-archipelago-bb4b16ca06c70cf263424955713c91117f2f1813.zip | |
[Client] Handle letter shuffle
Cyan doors are not handled properly yet.
Diffstat (limited to 'client/Archipelago/manager.gd')
| -rw-r--r-- | client/Archipelago/manager.gd | 74 |
1 files changed, 69 insertions, 5 deletions
| 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 | |||
| 3 | const my_version = "0.1.0" | 3 | const my_version = "0.1.0" |
| 4 | 4 | ||
| 5 | var SCRIPT_client | 5 | var SCRIPT_client |
| 6 | var SCRIPT_keyboard | ||
| 6 | var SCRIPT_locationListener | 7 | var SCRIPT_locationListener |
| 7 | var SCRIPT_uuid | 8 | var SCRIPT_uuid |
| 8 | var SCRIPT_victoryListener | 9 | var SCRIPT_victoryListener |
| @@ -13,16 +14,30 @@ var ap_pass = "" | |||
| 13 | var connection_history = [] | 14 | var connection_history = [] |
| 14 | 15 | ||
| 15 | var client | 16 | var client |
| 17 | var keyboard | ||
| 16 | 18 | ||
| 17 | var _localdata_file = "" | 19 | var _localdata_file = "" |
| 18 | var _last_new_item = -1 | 20 | var _last_new_item = -1 |
| 19 | var _batch_locations = false | 21 | var _batch_locations = false |
| 20 | var _held_locations = [] | 22 | var _held_locations = [] |
| 21 | var _item_locks = {} | 23 | var _item_locks = {} |
| 24 | var _held_letters = {} | ||
| 25 | var _letters_setup = false | ||
| 26 | |||
| 27 | const kSHUFFLE_LETTERS_VANILLA = 0 | ||
| 28 | const kSHUFFLE_LETTERS_UNLOCKED = 1 | ||
| 29 | const kSHUFFLE_LETTERS_PROGRESSIVE = 2 | ||
| 30 | const kSHUFFLE_LETTERS_VANILLA_CYAN = 3 | ||
| 31 | const kSHUFFLE_LETTERS_ITEM_CYAN = 4 | ||
| 32 | |||
| 33 | const kLETTER_BEHAVIOR_VANILLA = 0 | ||
| 34 | const kLETTER_BEHAVIOR_ITEM = 1 | ||
| 35 | const kLETTER_BEHAVIOR_UNLOCKED = 2 | ||
| 22 | 36 | ||
| 23 | var daedalus_roof_access = false | 37 | var daedalus_roof_access = false |
| 24 | var keyholder_sanity = false | 38 | var keyholder_sanity = false |
| 25 | var shuffle_doors = false | 39 | var shuffle_doors = false |
| 40 | var shuffle_letters = kSHUFFLE_LETTERS_VANILLA | ||
| 26 | var victory_condition = -1 | 41 | var victory_condition = -1 |
| 27 | 42 | ||
| 28 | signal could_not_connect | 43 | signal could_not_connect |
| @@ -66,6 +81,9 @@ func _ready(): | |||
| 66 | 81 | ||
| 67 | add_child(client) | 82 | add_child(client) |
| 68 | 83 | ||
| 84 | keyboard = SCRIPT_keyboard.new() | ||
| 85 | add_child(keyboard) | ||
| 86 | |||
| 69 | 87 | ||
| 70 | func saveSettings(): | 88 | func saveSettings(): |
| 71 | # Save the AP settings to disk. | 89 | # Save the AP settings to disk. |
| @@ -100,6 +118,8 @@ func saveLocaldata(): | |||
| 100 | 118 | ||
| 101 | func connectToServer(): | 119 | func connectToServer(): |
| 102 | _last_new_item = -1 | 120 | _last_new_item = -1 |
| 121 | _letters_setup = false | ||
| 122 | _held_letters = {} | ||
| 103 | 123 | ||
| 104 | client.connectToServer(ap_server, ap_user, ap_pass) | 124 | client.connectToServer(ap_server, ap_user, ap_pass) |
| 105 | 125 | ||
| @@ -140,11 +160,10 @@ func _process_item(item, index, from, flags, amount): | |||
| 140 | var rnode = scene.get_node_or_null(receiver) | 160 | var rnode = scene.get_node_or_null(receiver) |
| 141 | if rnode != null: | 161 | if rnode != null: |
| 142 | rnode.handleTriggered() | 162 | rnode.handleTriggered() |
| 143 | #for painting_id in gamedata.objects.get_doors()[door_id].get_move_paintings(): | 163 | |
| 144 | # var painting = gamedata.objects.get_paintings()[painting_id] | 164 | var letter_key = gamedata.letter_key_by_ap_id.get(item, null) |
| 145 | # var pnode = scene.get_node_or_null(painting.get_path() + "/teleportListener") | 165 | if letter_key != null: |
| 146 | # if pnode != null: | 166 | _process_key_item(letter_key, amount) |
| 147 | # pnode.handleTriggered() | ||
| 148 | 167 | ||
| 149 | # Show a message about the item if it's new. | 168 | # Show a message about the item if it's new. |
| 150 | if index != null and index > _last_new_item: | 169 | if index != null and index > _last_new_item: |
| @@ -293,6 +312,7 @@ func _client_connected(slot_data): | |||
| 293 | daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) | 312 | daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) |
| 294 | keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) | 313 | keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) |
| 295 | shuffle_doors = bool(slot_data.get("shuffle_doors", false)) | 314 | shuffle_doors = bool(slot_data.get("shuffle_doors", false)) |
| 315 | shuffle_letters = int(slot_data.get("shuffle_letters", 0)) | ||
| 296 | victory_condition = int(slot_data.get("victory_condition", 0)) | 316 | victory_condition = int(slot_data.get("victory_condition", 0)) |
| 297 | 317 | ||
| 298 | # Set up item locks. | 318 | # Set up item locks. |
| @@ -344,3 +364,47 @@ func colorForItemType(flags): | |||
| 344 | return "#d63a22" | 364 | return "#d63a22" |
| 345 | else: # filler | 365 | else: # filler |
| 346 | return "#14de9e" | 366 | return "#14de9e" |
| 367 | |||
| 368 | |||
| 369 | func get_letter_behavior(key, level2): | ||
| 370 | if shuffle_letters == kSHUFFLE_LETTERS_UNLOCKED: | ||
| 371 | return kLETTER_BEHAVIOR_UNLOCKED | ||
| 372 | |||
| 373 | if [kSHUFFLE_LETTERS_VANILLA_CYAN, kSHUFFLE_LETTERS_ITEM_CYAN].has(shuffle_letters): | ||
| 374 | if level2: | ||
| 375 | if shuffle_letters == kSHUFFLE_LETTERS_VANILLA_CYAN: | ||
| 376 | return kLETTER_BEHAVIOR_VANILLA | ||
| 377 | else: | ||
| 378 | return kLETTER_BEHAVIOR_ITEM | ||
| 379 | else: | ||
| 380 | return kLETTER_BEHAVIOR_UNLOCKED | ||
| 381 | |||
| 382 | if not level2 and ["h", "i", "n", "t"].has(key): | ||
| 383 | # This differs from the equivalent function in the apworld. Logically it is | ||
| 384 | # the same as UNLOCKED since they are in the starting room, but VANILLA | ||
| 385 | # means the player still has to actually pick up the letters. | ||
| 386 | return kLETTER_BEHAVIOR_VANILLA | ||
| 387 | |||
| 388 | if shuffle_letters == kSHUFFLE_LETTERS_PROGRESSIVE: | ||
| 389 | return kLETTER_BEHAVIOR_ITEM | ||
| 390 | |||
| 391 | return kLETTER_BEHAVIOR_VANILLA | ||
| 392 | |||
| 393 | |||
| 394 | func setup_keys(): | ||
| 395 | keyboard.load_seed() | ||
| 396 | |||
| 397 | _letters_setup = true | ||
| 398 | |||
| 399 | for k in _held_letters.keys(): | ||
| 400 | _process_key_item(k, _held_letters[k]) | ||
| 401 | |||
| 402 | _held_letters.clear() | ||
| 403 | |||
| 404 | |||
| 405 | func _process_key_item(key, level): | ||
| 406 | if not _letters_setup: | ||
| 407 | _held_letters[key] = max(_held_letters.get(key, 0), level) | ||
| 408 | return | ||
| 409 | |||
| 410 | keyboard.collect_remote_letter(key, level) | ||
