diff options
Diffstat (limited to 'client/Archipelago/manager.gd')
| -rw-r--r-- | client/Archipelago/manager.gd | 121 |
1 files changed, 100 insertions, 21 deletions
| diff --git a/client/Archipelago/manager.gd b/client/Archipelago/manager.gd index bcb21e7..06ae7d9 100644 --- a/client/Archipelago/manager.gd +++ b/client/Archipelago/manager.gd | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | extends Node | 1 | extends Node |
| 2 | 2 | ||
| 3 | const my_version = "0.1.0" | 3 | const MOD_VERSION = 6 |
| 4 | 4 | ||
| 5 | var SCRIPT_client | 5 | var SCRIPT_client |
| 6 | var SCRIPT_keyboard | 6 | var SCRIPT_keyboard |
| @@ -23,6 +23,7 @@ var _held_locations = [] | |||
| 23 | var _held_location_scouts = [] | 23 | var _held_location_scouts = [] |
| 24 | var _location_scouts = {} | 24 | var _location_scouts = {} |
| 25 | var _item_locks = {} | 25 | var _item_locks = {} |
| 26 | var _inverse_item_locks = {} | ||
| 26 | var _held_letters = {} | 27 | var _held_letters = {} |
| 27 | var _letters_setup = false | 28 | var _letters_setup = false |
| 28 | 29 | ||
| @@ -36,10 +37,19 @@ const kLETTER_BEHAVIOR_VANILLA = 0 | |||
| 36 | const kLETTER_BEHAVIOR_ITEM = 1 | 37 | const kLETTER_BEHAVIOR_ITEM = 1 |
| 37 | const kLETTER_BEHAVIOR_UNLOCKED = 2 | 38 | const kLETTER_BEHAVIOR_UNLOCKED = 2 |
| 38 | 39 | ||
| 40 | const kCYAN_DOOR_BEHAVIOR_H2 = 0 | ||
| 41 | const kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER = 1 | ||
| 42 | const kCYAN_DOOR_BEHAVIOR_ITEM = 2 | ||
| 43 | |||
| 44 | var apworld_version = [0, 0] | ||
| 45 | var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2 | ||
| 39 | var daedalus_roof_access = false | 46 | var daedalus_roof_access = false |
| 40 | var keyholder_sanity = false | 47 | var keyholder_sanity = false |
| 48 | var shuffle_control_center_colors = false | ||
| 41 | var shuffle_doors = false | 49 | var shuffle_doors = false |
| 50 | var shuffle_gallery_paintings = false | ||
| 42 | var shuffle_letters = kSHUFFLE_LETTERS_VANILLA | 51 | var shuffle_letters = kSHUFFLE_LETTERS_VANILLA |
| 52 | var shuffle_symbols = false | ||
| 43 | var victory_condition = -1 | 53 | var victory_condition = -1 |
| 44 | 54 | ||
| 45 | signal could_not_connect | 55 | signal could_not_connect |
| @@ -121,6 +131,10 @@ func saveLocaldata(): | |||
| 121 | 131 | ||
| 122 | func connectToServer(): | 132 | func connectToServer(): |
| 123 | _last_new_item = -1 | 133 | _last_new_item = -1 |
| 134 | _batch_locations = false | ||
| 135 | _held_locations = [] | ||
| 136 | _held_location_scouts = [] | ||
| 137 | _location_scouts = {} | ||
| 124 | _letters_setup = false | 138 | _letters_setup = false |
| 125 | _held_letters = {} | 139 | _held_letters = {} |
| 126 | 140 | ||
| @@ -145,24 +159,26 @@ func _process_item(item, index, from, flags, amount): | |||
| 145 | item_name = client._item_id_to_name["Lingo 2"][item] | 159 | item_name = client._item_id_to_name["Lingo 2"][item] |
| 146 | 160 | ||
| 147 | var gamedata = global.get_node("Gamedata") | 161 | var gamedata = global.get_node("Gamedata") |
| 148 | var door_id = gamedata.door_id_by_ap_id.get(item, null) | 162 | |
| 149 | var prog_id = null | 163 | var prog_id = null |
| 164 | if _inverse_item_locks.has(item): | ||
| 165 | for lock in _inverse_item_locks.get(item): | ||
| 166 | if lock[1] != amount: | ||
| 167 | continue | ||
| 150 | 168 | ||
| 151 | if door_id == null: | 169 | if gamedata.progressive_id_by_ap_id.has(item): |
| 152 | prog_id = gamedata.progressive_id_by_ap_id.get(item, null) | 170 | prog_id = lock[0] |
| 153 | if prog_id != null: | 171 | |
| 154 | var progressive = gamedata.objects.get_progressives()[prog_id] | 172 | if gamedata.get_door_map_name(lock[0]) != global.map: |
| 155 | if progressive.get_doors().size() >= amount: | 173 | continue |
| 156 | door_id = progressive.get_doors()[amount - 1] | 174 | |
| 157 | 175 | var receivers = gamedata.get_door_receivers(lock[0]) | |
| 158 | if door_id != null and gamedata.get_door_map_name(door_id) == global.map: | 176 | var scene = get_tree().get_root().get_node_or_null("scene") |
| 159 | var receivers = gamedata.get_door_receivers(door_id) | 177 | if scene != null: |
| 160 | var scene = get_tree().get_root().get_node_or_null("scene") | 178 | for receiver in receivers: |
| 161 | if scene != null: | 179 | var rnode = scene.get_node_or_null(receiver) |
| 162 | for receiver in receivers: | 180 | if rnode != null: |
| 163 | var rnode = scene.get_node_or_null(receiver) | 181 | rnode.handleTriggered() |
| 164 | if rnode != null: | ||
| 165 | rnode.handleTriggered() | ||
| 166 | 182 | ||
| 167 | var letter_id = gamedata.letter_id_by_ap_id.get(item, null) | 183 | var letter_id = gamedata.letter_id_by_ap_id.get(item, null) |
| 168 | if letter_id != null: | 184 | if letter_id != null: |
| @@ -170,6 +186,11 @@ func _process_item(item, index, from, flags, amount): | |||
| 170 | if not letter.has_level2() or not letter.get_level2(): | 186 | if not letter.has_level2() or not letter.get_level2(): |
| 171 | _process_key_item(letter.get_key(), amount) | 187 | _process_key_item(letter.get_key(), amount) |
| 172 | 188 | ||
| 189 | if gamedata.symbol_item_ids.has(item): | ||
| 190 | var player = get_tree().get_root().get_node_or_null("scene/player") | ||
| 191 | if player != null: | ||
| 192 | player.emit_signal("evaluate_solvability") | ||
| 193 | |||
| 173 | # Show a message about the item if it's new. | 194 | # Show a message about the item if it's new. |
| 174 | if index != null and index > _last_new_item: | 195 | if index != null and index > _last_new_item: |
| 175 | _last_new_item = index | 196 | _last_new_item = index |
| @@ -182,8 +203,8 @@ func _process_item(item, index, from, flags, amount): | |||
| 182 | var item_color = colorForItemType(flags) | 203 | var item_color = colorForItemType(flags) |
| 183 | 204 | ||
| 184 | var full_item_name = item_name | 205 | var full_item_name = item_name |
| 185 | if prog_id != null and door_id != null: | 206 | if prog_id != null: |
| 186 | var door = gamedata.objects.get_doors()[door_id] | 207 | var door = gamedata.objects.get_doors()[prog_id] |
| 187 | full_item_name = "%s (%s)" % [item_name, door.get_name()] | 208 | full_item_name = "%s (%s)" % [item_name, door.get_name()] |
| 188 | 209 | ||
| 189 | var message | 210 | var message |
| @@ -194,6 +215,9 @@ func _process_item(item, index, from, flags, amount): | |||
| 194 | "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] |
| 195 | ) | 216 | ) |
| 196 | 217 | ||
| 218 | if gamedata.anti_trap_ids.has(item): | ||
| 219 | keyboard.block_letter(gamedata.anti_trap_ids[item]) | ||
| 220 | |||
| 197 | global._print(message) | 221 | global._print(message) |
| 198 | 222 | ||
| 199 | global.get_node("Messages").showMessage(message) | 223 | global.get_node("Messages").showMessage(message) |
| @@ -288,6 +312,10 @@ func parse_printjson_for_textclient(message): | |||
| 288 | func _process_location_scout(item_id, location_id, player, flags): | 312 | func _process_location_scout(item_id, location_id, player, flags): |
| 289 | _location_scouts[location_id] = {"item": item_id, "player": player, "flags": flags} | 313 | _location_scouts[location_id] = {"item": item_id, "player": player, "flags": flags} |
| 290 | 314 | ||
| 315 | if player == client._slot and flags & 4 != 0: | ||
| 316 | # This is a trap for us, so let's not display it. | ||
| 317 | return | ||
| 318 | |||
| 291 | var gamedata = global.get_node("Gamedata") | 319 | var gamedata = global.get_node("Gamedata") |
| 292 | var map_id = gamedata.map_id_by_name.get(global.map) | 320 | var map_id = gamedata.map_id_by_name.get(global.map) |
| 293 | 321 | ||
| @@ -308,8 +336,8 @@ func _process_location_scout(item_id, location_id, player, flags): | |||
| 308 | collectable.setScoutedText(item_name) | 336 | collectable.setScoutedText(item_name) |
| 309 | 337 | ||
| 310 | 338 | ||
| 311 | func _client_could_not_connect(): | 339 | func _client_could_not_connect(message): |
| 312 | emit_signal("could_not_connect") | 340 | emit_signal("could_not_connect", message) |
| 313 | 341 | ||
| 314 | 342 | ||
| 315 | func _client_connect_status(message): | 343 | func _client_connect_status(message): |
| @@ -337,12 +365,19 @@ func _client_connected(slot_data): | |||
| 337 | _last_new_item = localdata[0] | 365 | _last_new_item = localdata[0] |
| 338 | 366 | ||
| 339 | # Read slot data. | 367 | # Read slot data. |
| 368 | cyan_door_behavior = int(slot_data.get("cyan_door_behavior", 0)) | ||
| 340 | daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) | 369 | daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) |
| 341 | keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) | 370 | keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) |
| 371 | shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false)) | ||
| 342 | shuffle_doors = bool(slot_data.get("shuffle_doors", false)) | 372 | shuffle_doors = bool(slot_data.get("shuffle_doors", false)) |
| 373 | shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false)) | ||
| 343 | shuffle_letters = int(slot_data.get("shuffle_letters", 0)) | 374 | shuffle_letters = int(slot_data.get("shuffle_letters", 0)) |
| 375 | shuffle_symbols = bool(slot_data.get("shuffle_symbols", false)) | ||
| 344 | victory_condition = int(slot_data.get("victory_condition", 0)) | 376 | victory_condition = int(slot_data.get("victory_condition", 0)) |
| 345 | 377 | ||
| 378 | if slot_data.has("version"): | ||
| 379 | apworld_version = [int(slot_data["version"][0]), int(slot_data["version"][1])] | ||
| 380 | |||
| 346 | # Set up item locks. | 381 | # Set up item locks. |
| 347 | _item_locks = {} | 382 | _item_locks = {} |
| 348 | 383 | ||
| @@ -359,6 +394,47 @@ func _client_connected(slot_data): | |||
| 359 | var door = gamedata.objects.get_doors()[progressive.get_doors()[i]] | 394 | var door = gamedata.objects.get_doors()[progressive.get_doors()[i]] |
| 360 | _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1] | 395 | _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1] |
| 361 | 396 | ||
| 397 | for door_group in gamedata.objects.get_door_groups(): | ||
| 398 | if ( | ||
| 399 | door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CONNECTOR | ||
| 400 | or door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.SHUFFLE_GROUP | ||
| 401 | ): | ||
| 402 | for door in door_group.get_doors(): | ||
| 403 | _item_locks[door] = [door_group.get_ap_id(), 1] | ||
| 404 | |||
| 405 | if shuffle_control_center_colors: | ||
| 406 | for door in gamedata.objects.get_doors(): | ||
| 407 | if door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR: | ||
| 408 | _item_locks[door.get_id()] = [door.get_ap_id(), 1] | ||
| 409 | |||
| 410 | for door_group in gamedata.objects.get_door_groups(): | ||
| 411 | if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.COLOR_CONNECTOR: | ||
| 412 | for door in door_group.get_doors(): | ||
| 413 | _item_locks[door] = [door_group.get_ap_id(), 1] | ||
| 414 | |||
| 415 | if shuffle_gallery_paintings: | ||
| 416 | for door in gamedata.objects.get_doors(): | ||
| 417 | if door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING: | ||
| 418 | _item_locks[door.get_id()] = [door.get_ap_id(), 1] | ||
| 419 | |||
| 420 | if cyan_door_behavior == kCYAN_DOOR_BEHAVIOR_ITEM: | ||
| 421 | for door_group in gamedata.objects.get_door_groups(): | ||
| 422 | if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CYAN_DOORS: | ||
| 423 | for door in door_group.get_doors(): | ||
| 424 | if not _item_locks.has(door): | ||
| 425 | _item_locks[door] = [door_group.get_ap_id(), 1] | ||
| 426 | |||
| 427 | # Create a reverse item locks map for processing items. | ||
| 428 | _inverse_item_locks = {} | ||
| 429 | |||
| 430 | for door_id in _item_locks.keys(): | ||
| 431 | var lock = _item_locks.get(door_id) | ||
| 432 | |||
| 433 | if not _inverse_item_locks.has(lock[0]): | ||
| 434 | _inverse_item_locks[lock[0]] = [] | ||
| 435 | |||
| 436 | _inverse_item_locks[lock[0]].append([door_id, lock[1]]) | ||
| 437 | |||
| 362 | emit_signal("ap_connected") | 438 | emit_signal("ap_connected") |
| 363 | 439 | ||
| 364 | 440 | ||
| @@ -453,4 +529,7 @@ func _process_key_item(key, level): | |||
| 453 | _held_letters[key] = max(_held_letters.get(key, 0), level) | 529 | _held_letters[key] = max(_held_letters.get(key, 0), level) |
| 454 | return | 530 | return |
| 455 | 531 | ||
| 532 | if shuffle_letters == kSHUFFLE_LETTERS_ITEM_CYAN: | ||
| 533 | level += 1 | ||
| 534 | |||
| 456 | keyboard.collect_remote_letter(key, level) | 535 | keyboard.collect_remote_letter(key, level) |
