diff options
52 files changed, 1416 insertions, 131 deletions
| diff --git a/CHANGELOG.md b/CHANGELOG.md index 76890e9..a9aec2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md | |||
| @@ -1,5 +1,35 @@ | |||
| 1 | # lingo2-archipelago Releases | 1 | # lingo2-archipelago Releases |
| 2 | 2 | ||
| 3 | ## v8.0.0 - 2025-11-02 | ||
| 4 | |||
| 5 | - ~50 new locations were added, such that almost every panel in the game is now | ||
| 6 | part of either a location or a connection. Some existing locations were also | ||
| 7 | modified or removed to make this cleaner. The only panels that are not part of | ||
| 8 | any location or connection are the ones in rooms that you are explicitly not | ||
| 9 | supposed to solve (e.g. the letter rooms in Daedalus where you are only | ||
| 10 | supposed to solve the panels indicated by the ceiling). | ||
| 11 | - Multiworld state is now saved in a way that should increase compatibility when | ||
| 12 | playing on a client that is a different version than the apworld that | ||
| 13 | generated the world, going forward. Complete compatibility is not guaranteed, | ||
| 14 | but this fixes some of the glaring issues. Also note that this client is _not_ | ||
| 15 | compatible with worlds generated on v7.x.x. | ||
| 16 | - Hinted locations are now prioritized in the tracker, and are displayed in a | ||
| 17 | different color. | ||
| 18 | - Locations can now be ignored in the tracker, which removes them from the | ||
| 19 | overlay and puts them at the bottom of the tab in the text client. | ||
| 20 | - Fixed the Yellow Ending door not opening properly when gallery paintings are | ||
| 21 | shuffled. | ||
| 22 | - The trigger for the gallery painting in The Unyielding is now smaller, so that | ||
| 23 | it matches the logical requirement. | ||
| 24 | - The DIRECTION panels near the Castle in Daedalus are now moved when the roof | ||
| 25 | access stairs are present, so that you don't lose access to them. | ||
| 26 | |||
| 27 | Download: | ||
| 28 | [lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.0/lingo2.apworld)<br/> | ||
| 29 | Template YAML: | ||
| 30 | [Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.0/Lingo%202.yaml)<br/> | ||
| 31 | Source: [v8.0.0](https://code.fourisland.com/lingo2-archipelago/tag/?h=v8.0.0) | ||
| 32 | |||
| 3 | ## v7.2.0 - 2025-10-25 | 33 | ## v7.2.0 - 2025-10-25 |
| 4 | 34 | ||
| 5 | - Doors that rely on keyholders or the control center color panel are now | 35 | - Doors that rely on keyholders or the control center color panel are now |
| diff --git a/README.md b/README.md index 83e241e..24e9fa2 100644 --- a/README.md +++ b/README.md | |||
| @@ -71,11 +71,10 @@ same time as collecting the letter. | |||
| 71 | 71 | ||
| 72 | ### What areas are randomized? | 72 | ### What areas are randomized? |
| 73 | 73 | ||
| 74 | Almost all maps that you can access from the base game are randomized. The | 74 | Almost all maps that you can access from the base game are randomized. The only |
| 75 | exceptions are: | 75 | exception is The Hinterlands, which will probably be repurposed into a hint |
| 76 | 76 | area. Some advanced/hidden maps are also disabled by default (as discussed | |
| 77 | - Demo | 77 | below). |
| 78 | - The Hinterlands (this will probably be repurposed) | ||
| 79 | 78 | ||
| 80 | ### Is my progress saved locally? | 79 | ### Is my progress saved locally? |
| 81 | 80 | ||
| diff --git a/apworld/__init__.py b/apworld/__init__.py index f5774c6..3d2f075 100644 --- a/apworld/__init__.py +++ b/apworld/__init__.py | |||
| @@ -77,7 +77,10 @@ class Lingo2World(World): | |||
| 77 | if self.options.shuffle_worldports: | 77 | if self.options.shuffle_worldports: |
| 78 | if hasattr(self.multiworld, "re_gen_passthrough") and "Lingo 2" in self.multiworld.re_gen_passthrough: | 78 | if hasattr(self.multiworld, "re_gen_passthrough") and "Lingo 2" in self.multiworld.re_gen_passthrough: |
| 79 | slot_value = self.multiworld.re_gen_passthrough["Lingo 2"]["port_pairings"] | 79 | slot_value = self.multiworld.re_gen_passthrough["Lingo 2"]["port_pairings"] |
| 80 | self.port_pairings = {int(fp): int(tp) for fp, tp in slot_value.items()} | 80 | self.port_pairings = { |
| 81 | self.static_logic.port_id_by_ap_id[int(fp)]: self.static_logic.port_id_by_ap_id[int(tp)] | ||
| 82 | for fp, tp in slot_value.items() | ||
| 83 | } | ||
| 81 | 84 | ||
| 82 | connect_ports_from_ut(self.port_pairings, self) | 85 | connect_ports_from_ut(self.port_pairings, self) |
| 83 | else: | 86 | else: |
| @@ -152,7 +155,11 @@ class Lingo2World(World): | |||
| 152 | } | 155 | } |
| 153 | 156 | ||
| 154 | if self.options.shuffle_worldports: | 157 | if self.options.shuffle_worldports: |
| 155 | slot_data["port_pairings"] = self.port_pairings | 158 | def get_port_ap_id(port_id): |
| 159 | return self.static_logic.objects.ports[port_id].ap_id | ||
| 160 | |||
| 161 | slot_data["port_pairings"] = {get_port_ap_id(from_id): get_port_ap_id(to_id) | ||
| 162 | for from_id, to_id in self.port_pairings.items()} | ||
| 156 | 163 | ||
| 157 | return slot_data | 164 | return slot_data |
| 158 | 165 | ||
| diff --git a/apworld/client/client.gd b/apworld/client/client.gd index ce5ac7e..c149482 100644 --- a/apworld/client/client.gd +++ b/apworld/client/client.gd | |||
| @@ -26,6 +26,7 @@ var _accessible_locations = [] | |||
| 26 | var _accessible_worldports = [] | 26 | var _accessible_worldports = [] |
| 27 | var _goal_accessible = false | 27 | var _goal_accessible = false |
| 28 | var _latched_doors = [] | 28 | var _latched_doors = [] |
| 29 | var _hinted_locations = [] | ||
| 29 | 30 | ||
| 30 | signal could_not_connect | 31 | signal could_not_connect |
| 31 | signal connect_status | 32 | signal connect_status |
| @@ -38,8 +39,10 @@ signal hint_received(message) | |||
| 38 | signal door_latched(id) | 39 | signal door_latched(id) |
| 39 | signal accessible_locations_updated | 40 | signal accessible_locations_updated |
| 40 | signal checked_locations_updated | 41 | signal checked_locations_updated |
| 42 | signal ignored_locations_updated(locations) | ||
| 41 | signal checked_worldports_updated | 43 | signal checked_worldports_updated |
| 42 | signal keyboard_update_received | 44 | signal keyboard_update_received |
| 45 | signal hinted_locations_updated | ||
| 43 | 46 | ||
| 44 | 47 | ||
| 45 | func _init(): | 48 | func _init(): |
| @@ -199,6 +202,21 @@ func _on_web_socket_server_message_received(_peer_id: int, packet: String) -> vo | |||
| 199 | 202 | ||
| 200 | door_latched.emit(iid) | 203 | door_latched.emit(iid) |
| 201 | 204 | ||
| 205 | elif cmd == "SetIgnoredLocations": | ||
| 206 | var locs = [] | ||
| 207 | for id in message["locations"]: | ||
| 208 | locs.append(int(id)) | ||
| 209 | |||
| 210 | ignored_locations_updated.emit(locs) | ||
| 211 | |||
| 212 | elif cmd == "UpdateHintedLocations": | ||
| 213 | for id in message["locations"]: | ||
| 214 | var iid = int(id) | ||
| 215 | if !_hinted_locations.has(iid): | ||
| 216 | _hinted_locations.append(iid) | ||
| 217 | |||
| 218 | hinted_locations_updated.emit() | ||
| 219 | |||
| 202 | 220 | ||
| 203 | func connectToServer(server, un, pw): | 221 | func connectToServer(server, un, pw): |
| 204 | sendMessage([{"cmd": "Connect", "server": server, "player": un, "password": pw}]) | 222 | sendMessage([{"cmd": "Connect", "server": server, "player": un, "password": pw}]) |
| @@ -280,6 +298,14 @@ func getLogicalPath(object_type, object_id): | |||
| 280 | sendMessage([msg]) | 298 | sendMessage([msg]) |
| 281 | 299 | ||
| 282 | 300 | ||
| 301 | func addIgnoredLocation(loc_id): | ||
| 302 | sendMessage([{"cmd": "IgnoreLocation", "id": loc_id}]) | ||
| 303 | |||
| 304 | |||
| 305 | func removeIgnoredLocation(loc_id): | ||
| 306 | sendMessage([{"cmd": "UnignoreLocation", "id": loc_id}]) | ||
| 307 | |||
| 308 | |||
| 283 | func sendQuit(): | 309 | func sendQuit(): |
| 284 | sendMessage([{"cmd": "Quit"}]) | 310 | sendMessage([{"cmd": "Quit"}]) |
| 285 | 311 | ||
| diff --git a/apworld/client/gamedata.gd b/apworld/client/gamedata.gd index 3a35125..d7e3136 100644 --- a/apworld/client/gamedata.gd +++ b/apworld/client/gamedata.gd | |||
| @@ -15,6 +15,7 @@ var symbol_item_ids = [] | |||
| 15 | var anti_trap_ids = {} | 15 | var anti_trap_ids = {} |
| 16 | var location_name_by_id = {} | 16 | var location_name_by_id = {} |
| 17 | var ending_display_name_by_name = {} | 17 | var ending_display_name_by_name = {} |
| 18 | var port_id_by_ap_id = {} | ||
| 18 | 19 | ||
| 19 | var kSYMBOL_ITEMS | 20 | var kSYMBOL_ITEMS |
| 20 | 21 | ||
| @@ -99,6 +100,9 @@ func load(data_bytes): | |||
| 99 | var map_data = port_id_by_map_node_path[map.get_name()] | 100 | var map_data = port_id_by_map_node_path[map.get_name()] |
| 100 | map_data[port.get_path()] = port.get_id() | 101 | map_data[port.get_path()] = port.get_id() |
| 101 | 102 | ||
| 103 | if port.has_ap_id(): | ||
| 104 | port_id_by_ap_id[port.get_ap_id()] = port.get_id() | ||
| 105 | |||
| 102 | for progressive in objects.get_progressives(): | 106 | for progressive in objects.get_progressives(): |
| 103 | progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id() | 107 | progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id() |
| 104 | 108 | ||
| diff --git a/apworld/client/main.gd b/apworld/client/main.gd index a543678..c90d6e7 100644 --- a/apworld/client/main.gd +++ b/apworld/client/main.gd | |||
| @@ -51,6 +51,7 @@ func _ready(): | |||
| 51 | installScriptExtension(runtime.load_script("saver.gd")) | 51 | installScriptExtension(runtime.load_script("saver.gd")) |
| 52 | installScriptExtension(runtime.load_script("teleport.gd")) | 52 | installScriptExtension(runtime.load_script("teleport.gd")) |
| 53 | installScriptExtension(runtime.load_script("teleportListener.gd")) | 53 | installScriptExtension(runtime.load_script("teleportListener.gd")) |
| 54 | installScriptExtension(runtime.load_script("unlockReaderListener.gd")) | ||
| 54 | installScriptExtension(runtime.load_script("visibilityListener.gd")) | 55 | installScriptExtension(runtime.load_script("visibilityListener.gd")) |
| 55 | installScriptExtension(runtime.load_script("worldport.gd")) | 56 | installScriptExtension(runtime.load_script("worldport.gd")) |
| 56 | installScriptExtension(runtime.load_script("worldportListener.gd")) | 57 | installScriptExtension(runtime.load_script("worldportListener.gd")) |
| @@ -253,6 +254,7 @@ func startGame(): | |||
| 253 | clearResourceCache("res://objects/nodes/listeners/keyHolderChecker.tscn") | 254 | clearResourceCache("res://objects/nodes/listeners/keyHolderChecker.tscn") |
| 254 | clearResourceCache("res://objects/nodes/listeners/keyHolderResetterListener.tscn") | 255 | clearResourceCache("res://objects/nodes/listeners/keyHolderResetterListener.tscn") |
| 255 | clearResourceCache("res://objects/nodes/listeners/teleportListener.tscn") | 256 | clearResourceCache("res://objects/nodes/listeners/teleportListener.tscn") |
| 257 | clearResourceCache("res://objects/nodes/listeners/unlockReaderListener.tscn") | ||
| 256 | clearResourceCache("res://objects/nodes/listeners/visibilityListener.tscn") | 258 | clearResourceCache("res://objects/nodes/listeners/visibilityListener.tscn") |
| 257 | clearResourceCache("res://objects/nodes/listeners/worldportListener.tscn") | 259 | clearResourceCache("res://objects/nodes/listeners/worldportListener.tscn") |
| 258 | clearResourceCache("res://objects/nodes/panel.tscn") | 260 | clearResourceCache("res://objects/nodes/panel.tscn") |
| diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index aa07559..830ebb8 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd | |||
| @@ -29,6 +29,7 @@ var _inverse_item_locks = {} | |||
| 29 | var _held_letters = {} | 29 | var _held_letters = {} |
| 30 | var _letters_setup = false | 30 | var _letters_setup = false |
| 31 | var _already_connected = false | 31 | var _already_connected = false |
| 32 | var _ignored_locations = [] | ||
| 32 | 33 | ||
| 33 | const kSHUFFLE_LETTERS_VANILLA = 0 | 34 | const kSHUFFLE_LETTERS_VANILLA = 0 |
| 34 | const kSHUFFLE_LETTERS_UNLOCKED = 1 | 35 | const kSHUFFLE_LETTERS_UNLOCKED = 1 |
| @@ -144,6 +145,8 @@ func _ready(): | |||
| 144 | client.hint_received.connect(_process_hint_received) | 145 | client.hint_received.connect(_process_hint_received) |
| 145 | client.accessible_locations_updated.connect(_on_accessible_locations_updated) | 146 | client.accessible_locations_updated.connect(_on_accessible_locations_updated) |
| 146 | client.checked_locations_updated.connect(_on_checked_locations_updated) | 147 | client.checked_locations_updated.connect(_on_checked_locations_updated) |
| 148 | client.ignored_locations_updated.connect(_on_ignored_locations_updated) | ||
| 149 | client.hinted_locations_updated.connect(_on_hinted_locations_updated) | ||
| 147 | client.checked_worldports_updated.connect(_on_checked_worldports_updated) | 150 | client.checked_worldports_updated.connect(_on_checked_worldports_updated) |
| 148 | client.door_latched.connect(_on_door_latched) | 151 | client.door_latched.connect(_on_door_latched) |
| 149 | 152 | ||
| @@ -384,6 +387,20 @@ func _on_checked_worldports_updated(): | |||
| 384 | textclient_node.update_worldports() | 387 | textclient_node.update_worldports() |
| 385 | 388 | ||
| 386 | 389 | ||
| 390 | func _on_ignored_locations_updated(locations): | ||
| 391 | _ignored_locations = locations | ||
| 392 | |||
| 393 | var textclient_node = global.get_node("Textclient") | ||
| 394 | if textclient_node != null: | ||
| 395 | textclient_node.update_locations() | ||
| 396 | |||
| 397 | |||
| 398 | func _on_hinted_locations_updated(): | ||
| 399 | var textclient_node = global.get_node("Textclient") | ||
| 400 | if textclient_node != null: | ||
| 401 | textclient_node.update_locations() | ||
| 402 | |||
| 403 | |||
| 387 | func _on_door_latched(door_id): | 404 | func _on_door_latched(door_id): |
| 388 | var gamedata = global.get_node("Gamedata") | 405 | var gamedata = global.get_node("Gamedata") |
| 389 | if gamedata.get_door_map_name(door_id) != global.map: | 406 | if gamedata.get_door_map_name(door_id) != global.map: |
| @@ -472,7 +489,9 @@ func _client_connected(slot_data): | |||
| 472 | var raw_pp = slot_data.get("port_pairings") | 489 | var raw_pp = slot_data.get("port_pairings") |
| 473 | 490 | ||
| 474 | for p1 in raw_pp.keys(): | 491 | for p1 in raw_pp.keys(): |
| 475 | port_pairings[int(p1)] = int(raw_pp[p1]) | 492 | port_pairings[gamedata.port_id_by_ap_id[int(p1)]] = gamedata.port_id_by_ap_id[int( |
| 493 | raw_pp[p1] | ||
| 494 | )] | ||
| 476 | 495 | ||
| 477 | # Set up item locks. | 496 | # Set up item locks. |
| 478 | _item_locks = {} | 497 | _item_locks = {} |
| @@ -675,3 +694,10 @@ func update_job_well_done_sign(): | |||
| 675 | 694 | ||
| 676 | sign2.get_node("MeshInstance3D").mesh.text = sign2.text | 695 | sign2.get_node("MeshInstance3D").mesh.text = sign2.text |
| 677 | sign3.get_node("MeshInstance3D").mesh.text = sign3.text | 696 | sign3.get_node("MeshInstance3D").mesh.text = sign3.text |
| 697 | |||
| 698 | |||
| 699 | func toggle_ignored_location(loc_id): | ||
| 700 | if loc_id in _ignored_locations: | ||
| 701 | client.removeIgnoredLocation(loc_id) | ||
| 702 | else: | ||
| 703 | client.addIgnoredLocation(loc_id) | ||
| diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 0e3fb23..65bf54e 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd | |||
| @@ -98,38 +98,72 @@ func _ready(): | |||
| 98 | old_door.queue_free() | 98 | old_door.queue_free() |
| 99 | get_node("/root/scene/Components/Doors").add_child.call_deferred(new_door) | 99 | get_node("/root/scene/Components/Doors").add_child.call_deferred(new_door) |
| 100 | 100 | ||
| 101 | # Block off roof access in Daedalus. | 101 | if global.map == "daedalus": |
| 102 | if global.map == "daedalus" and not ap.daedalus_roof_access: | 102 | # Teleport the direction panels when the stairs are there. |
| 103 | _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49) | 103 | var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") |
| 104 | _set_up_invis_wall(51.5, 11, -17, 16, 10, 1) | 104 | |
| 105 | _set_up_invis_wall(46, 10, -9.5, 1, 10, 10) | 105 | var dir1 = get_node("/root/scene/Panels/Castle Entrance/castle_direction_1") |
| 106 | _set_up_invis_wall(67.5, 11, 17, 16, 10, 1) | 106 | var dir1_tpl = tpl_prefab.instantiate() |
| 107 | _set_up_invis_wall(50.5, 11, 14, 10, 10, 1) | 107 | dir1_tpl.target_path = dir1 |
| 108 | _set_up_invis_wall(39, 10, 18.5, 1, 10, 22) | 108 | dir1_tpl.teleport_point = Vector3(59.5, 8, -6.5) |
| 109 | _set_up_invis_wall(20, 15, 18.5, 1, 10, 16) | 109 | dir1_tpl.teleport_rotate = Vector3(-45, 0, 0) |
| 110 | _set_up_invis_wall(11.5, 15, 3, 32, 10, 1) | 110 | dir1_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_south")) |
| 111 | _set_up_invis_wall(11.5, 16, -20, 14, 20, 1) | 111 | dir1_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_north")) |
| 112 | _set_up_invis_wall(14, 16, -26.5, 1, 20, 4) | 112 | dir1_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_west")) |
| 113 | _set_up_invis_wall(28.5, 20.5, -26.5, 1, 15, 25) | 113 | dir1.add_child.call_deferred(dir1_tpl) |
| 114 | _set_up_invis_wall(40.5, 20.5, -11, 30, 15, 1) | 114 | |
| 115 | _set_up_invis_wall(50.5, 15, 5.5, 7, 10, 1) | 115 | var dir2 = get_node("/root/scene/Panels/Castle Entrance/castle_direction_2") |
| 116 | _set_up_invis_wall(83.5, 33.5, 5.5, 1, 7, 11) | 116 | var dir2_tpl = tpl_prefab.instantiate() |
| 117 | _set_up_invis_wall(83.5, 33.5, -5.5, 1, 7, 11) | 117 | dir2_tpl.target_path = dir2 |
| 118 | 118 | dir2_tpl.teleport_point = Vector3(59.5, 8, 6.5) | |
| 119 | var warp_exit_prefab = preload("res://objects/nodes/exit.tscn") | 119 | dir2_tpl.teleport_rotate = Vector3(-45, -180, 0) |
| 120 | var warp_exit = warp_exit_prefab.instantiate() | 120 | dir2_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_south")) |
| 121 | warp_exit.name = "roof_access_blocker_warp_exit" | 121 | dir2_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_north")) |
| 122 | warp_exit.position = Vector3(58, 10, 0) | 122 | dir2_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_west")) |
| 123 | warp_exit.rotation_degrees.y = 90 | 123 | dir2.add_child.call_deferred(dir2_tpl) |
| 124 | get_parent().add_child.call_deferred(warp_exit) | 124 | |
| 125 | 125 | var dir3 = get_node("/root/scene/Panels/Castle Entrance/castle_direction_3") | |
| 126 | var warp_enter_prefab = preload("res://objects/nodes/teleportAuto.tscn") | 126 | var dir3_tpl = tpl_prefab.instantiate() |
| 127 | var warp_enter = warp_enter_prefab.instantiate() | 127 | dir3_tpl.target_path = dir3 |
| 128 | warp_enter.target = warp_exit | 128 | dir3_tpl.teleport_point = Vector3(54, 8, 0) |
| 129 | warp_enter.position = Vector3(76.5, 30, 1) | 129 | dir3_tpl.teleport_rotate = Vector3(-45, 90, 0) |
| 130 | warp_enter.scale = Vector3(4, 1.5, 1) | 130 | dir3_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_south")) |
| 131 | warp_enter.rotation_degrees.y = 90 | 131 | dir3_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_north")) |
| 132 | get_parent().add_child.call_deferred(warp_enter) | 132 | dir3_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_west")) |
| 133 | dir3.add_child.call_deferred(dir3_tpl) | ||
| 134 | |||
| 135 | # Block off roof access in Daedalus. | ||
| 136 | if not ap.daedalus_roof_access: | ||
| 137 | _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49) | ||
| 138 | _set_up_invis_wall(51.5, 11, -17, 16, 10, 1) | ||
| 139 | _set_up_invis_wall(46, 10, -9.5, 1, 10, 10) | ||
| 140 | _set_up_invis_wall(67.5, 11, 17, 16, 10, 1) | ||
| 141 | _set_up_invis_wall(50.5, 11, 14, 10, 10, 1) | ||
| 142 | _set_up_invis_wall(39, 10, 18.5, 1, 10, 22) | ||
| 143 | _set_up_invis_wall(20, 15, 18.5, 1, 10, 16) | ||
| 144 | _set_up_invis_wall(11.5, 15, 3, 32, 10, 1) | ||
| 145 | _set_up_invis_wall(11.5, 16, -20, 14, 20, 1) | ||
| 146 | _set_up_invis_wall(14, 16, -26.5, 1, 20, 4) | ||
| 147 | _set_up_invis_wall(28.5, 20.5, -26.5, 1, 15, 25) | ||
| 148 | _set_up_invis_wall(40.5, 20.5, -11, 30, 15, 1) | ||
| 149 | _set_up_invis_wall(50.5, 15, 5.5, 7, 10, 1) | ||
| 150 | _set_up_invis_wall(83.5, 33.5, 5.5, 1, 7, 11) | ||
| 151 | _set_up_invis_wall(83.5, 33.5, -5.5, 1, 7, 11) | ||
| 152 | |||
| 153 | var warp_exit_prefab = preload("res://objects/nodes/exit.tscn") | ||
| 154 | var warp_exit = warp_exit_prefab.instantiate() | ||
| 155 | warp_exit.name = "roof_access_blocker_warp_exit" | ||
| 156 | warp_exit.position = Vector3(58, 10, 0) | ||
| 157 | warp_exit.rotation_degrees.y = 90 | ||
| 158 | get_parent().add_child.call_deferred(warp_exit) | ||
| 159 | |||
| 160 | var warp_enter_prefab = preload("res://objects/nodes/teleportAuto.tscn") | ||
| 161 | var warp_enter = warp_enter_prefab.instantiate() | ||
| 162 | warp_enter.target = warp_exit | ||
| 163 | warp_enter.position = Vector3(76.5, 30, 1) | ||
| 164 | warp_enter.scale = Vector3(4, 1.5, 1) | ||
| 165 | warp_enter.rotation_degrees.y = 90 | ||
| 166 | get_parent().add_child.call_deferred(warp_enter) | ||
| 133 | 167 | ||
| 134 | if global.map == "the_entry": | 168 | if global.map == "the_entry": |
| 135 | # Remove door behind X1. | 169 | # Remove door behind X1. |
| @@ -604,9 +638,12 @@ func _ready(): | |||
| 604 | continue | 638 | continue |
| 605 | 639 | ||
| 606 | if ( | 640 | if ( |
| 607 | door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY | 641 | not (door.has_legacy_location() and door.get_legacy_location()) |
| 608 | or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING | 642 | and ( |
| 609 | or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR | 643 | door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY |
| 644 | or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING | ||
| 645 | or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR | ||
| 646 | ) | ||
| 610 | ): | 647 | ): |
| 611 | continue | 648 | continue |
| 612 | 649 | ||
| diff --git a/apworld/client/textclient.gd b/apworld/client/textclient.gd index f785a03..ce28a3a 100644 --- a/apworld/client/textclient.gd +++ b/apworld/client/textclient.gd | |||
| @@ -16,6 +16,8 @@ var tracker_loc_tree_item_by_id = {} | |||
| 16 | var tracker_port_tree_item_by_id = {} | 16 | var tracker_port_tree_item_by_id = {} |
| 17 | var tracker_goal_tree_item = null | 17 | var tracker_goal_tree_item = null |
| 18 | var tracker_object_by_index = {} | 18 | var tracker_object_by_index = {} |
| 19 | var tracker_object_by_ignored_index = {} | ||
| 20 | var tracker_ignored_group = null | ||
| 19 | 21 | ||
| 20 | var worldports_tab | 22 | var worldports_tab |
| 21 | var worldports_tree | 23 | var worldports_tree |
| @@ -99,7 +101,7 @@ func _ready(): | |||
| 99 | tabs.add_child(tracker_margins) | 101 | tabs.add_child(tracker_margins) |
| 100 | 102 | ||
| 101 | tracker_tree = Tree.new() | 103 | tracker_tree = Tree.new() |
| 102 | tracker_tree.columns = 3 | 104 | tracker_tree.columns = 4 |
| 103 | tracker_tree.hide_root = true | 105 | tracker_tree.hide_root = true |
| 104 | tracker_tree.add_theme_font_size_override("font_size", 24) | 106 | tracker_tree.add_theme_font_size_override("font_size", 24) |
| 105 | tracker_tree.add_theme_color_override("font_color", Color(0.8, 0.8, 0.8, 1)) | 107 | tracker_tree.add_theme_color_override("font_color", Color(0.8, 0.8, 0.8, 1)) |
| @@ -108,7 +110,9 @@ func _ready(): | |||
| 108 | tracker_tree.set_column_expand(0, false) | 110 | tracker_tree.set_column_expand(0, false) |
| 109 | tracker_tree.set_column_expand(1, true) | 111 | tracker_tree.set_column_expand(1, true) |
| 110 | tracker_tree.set_column_expand(2, false) | 112 | tracker_tree.set_column_expand(2, false) |
| 113 | tracker_tree.set_column_expand(3, false) | ||
| 111 | tracker_tree.set_column_custom_minimum_width(2, 200) | 114 | tracker_tree.set_column_custom_minimum_width(2, 200) |
| 115 | tracker_tree.set_column_custom_minimum_width(3, 200) | ||
| 112 | tracker_margins.add_child(tracker_tree) | 116 | tracker_margins.add_child(tracker_tree) |
| 113 | 117 | ||
| 114 | worldports_tab = MarginContainer.new() | 118 | worldports_tab = MarginContainer.new() |
| @@ -208,6 +212,8 @@ func update_locations(reset_locations = true): | |||
| 208 | "name": location_name, | 212 | "name": location_name, |
| 209 | "type": kLocation, | 213 | "type": kLocation, |
| 210 | "id": location_id, | 214 | "id": location_id, |
| 215 | "ignored": ap._ignored_locations.has(location_id), | ||
| 216 | "hint": ap.client._hinted_locations.has(location_id), | ||
| 211 | } | 217 | } |
| 212 | ) | 218 | ) |
| 213 | ) | 219 | ) |
| @@ -222,11 +228,13 @@ func update_locations(reset_locations = true): | |||
| 222 | "name": port_name, | 228 | "name": port_name, |
| 223 | "type": kWorldport, | 229 | "type": kWorldport, |
| 224 | "id": port_id, | 230 | "id": port_id, |
| 231 | "ignored": false, | ||
| 232 | "hint": false, | ||
| 225 | } | 233 | } |
| 226 | ) | 234 | ) |
| 227 | ) | 235 | ) |
| 228 | 236 | ||
| 229 | locations.sort_custom(func(a, b): return a["name"] < b["name"]) | 237 | locations.sort_custom(_cmp_tracker_objects) |
| 230 | 238 | ||
| 231 | if ap.client._goal_accessible: | 239 | if ap.client._goal_accessible: |
| 232 | var location_name = gamedata.ending_display_name_by_name[ap.kEndingNameByVictoryValue[ | 240 | var location_name = gamedata.ending_display_name_by_name[ap.kEndingNameByVictoryValue[ |
| @@ -238,14 +246,18 @@ func update_locations(reset_locations = true): | |||
| 238 | { | 246 | { |
| 239 | "name": location_name, | 247 | "name": location_name, |
| 240 | "type": kGoal, | 248 | "type": kGoal, |
| 249 | "ignored": false, | ||
| 250 | "hint": false, | ||
| 241 | } | 251 | } |
| 242 | ) | 252 | ) |
| 243 | ) | 253 | ) |
| 244 | 254 | ||
| 245 | var count = 0 | 255 | var count = 0 |
| 246 | for location in locations: | 256 | for location in locations: |
| 247 | if count < 18: | 257 | if count < 18 and not location["ignored"]: |
| 248 | locations_overlay.push_paragraph(HORIZONTAL_ALIGNMENT_RIGHT) | 258 | locations_overlay.push_paragraph(HORIZONTAL_ALIGNMENT_RIGHT) |
| 259 | if location["hint"]: | ||
| 260 | locations_overlay.push_color(Color("#fafad2")) | ||
| 249 | locations_overlay.append_text(location["name"]) | 261 | locations_overlay.append_text(location["name"]) |
| 250 | locations_overlay.append_text(" ") | 262 | locations_overlay.append_text(" ") |
| 251 | if location["type"] == kLocation: | 263 | if location["type"] == kLocation: |
| @@ -254,6 +266,8 @@ func update_locations(reset_locations = true): | |||
| 254 | locations_overlay.add_image(worldport_texture) | 266 | locations_overlay.add_image(worldport_texture) |
| 255 | elif location["type"] == kGoal: | 267 | elif location["type"] == kGoal: |
| 256 | locations_overlay.add_image(goal_texture) | 268 | locations_overlay.add_image(goal_texture) |
| 269 | if location["hint"]: | ||
| 270 | locations_overlay.pop() | ||
| 257 | locations_overlay.pop() | 271 | locations_overlay.pop() |
| 258 | count += 1 | 272 | count += 1 |
| 259 | 273 | ||
| @@ -266,17 +280,43 @@ func update_locations(reset_locations = true): | |||
| 266 | var root_ti = tracker_tree.create_item(null) | 280 | var root_ti = tracker_tree.create_item(null) |
| 267 | 281 | ||
| 268 | for location in locations: | 282 | for location in locations: |
| 269 | var loc_row = root_ti.create_child() | 283 | var loc_row |
| 284 | |||
| 285 | if location["ignored"]: | ||
| 286 | if tracker_ignored_group == null: | ||
| 287 | tracker_ignored_group = root_ti.create_child() | ||
| 288 | tracker_ignored_group.set_text(1, "Ignored Locations") | ||
| 289 | tracker_ignored_group.set_selectable(0, false) | ||
| 290 | tracker_ignored_group.set_selectable(1, false) | ||
| 291 | tracker_ignored_group.set_selectable(2, false) | ||
| 292 | tracker_ignored_group.set_selectable(3, false) | ||
| 293 | |||
| 294 | loc_row = tracker_ignored_group.create_child() | ||
| 295 | else: | ||
| 296 | loc_row = root_ti.create_child() | ||
| 297 | |||
| 270 | loc_row.set_cell_mode(0, TreeItem.CELL_MODE_ICON) | 298 | loc_row.set_cell_mode(0, TreeItem.CELL_MODE_ICON) |
| 271 | loc_row.set_selectable(0, false) | 299 | loc_row.set_selectable(0, false) |
| 272 | loc_row.set_text(1, location["name"]) | 300 | loc_row.set_text(1, location["name"]) |
| 273 | loc_row.set_selectable(1, false) | 301 | loc_row.set_selectable(1, false) |
| 302 | if location["hint"]: | ||
| 303 | loc_row.set_custom_color(1, Color("#fafad2")) | ||
| 274 | loc_row.set_cell_mode(2, TreeItem.CELL_MODE_CUSTOM) | 304 | loc_row.set_cell_mode(2, TreeItem.CELL_MODE_CUSTOM) |
| 275 | loc_row.set_text(2, "Show Path") | 305 | loc_row.set_text(2, "Show Path") |
| 276 | loc_row.set_custom_as_button(2, true) | 306 | loc_row.set_custom_as_button(2, true) |
| 277 | loc_row.set_editable(2, true) | 307 | loc_row.set_editable(2, true) |
| 278 | loc_row.set_selectable(2, false) | 308 | loc_row.set_selectable(2, false) |
| 279 | loc_row.set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER) | 309 | loc_row.set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER) |
| 310 | loc_row.set_selectable(3, false) | ||
| 311 | if location["type"] == kLocation: | ||
| 312 | loc_row.set_cell_mode(3, TreeItem.CELL_MODE_CUSTOM) | ||
| 313 | if location["ignored"]: | ||
| 314 | loc_row.set_text(3, "Unignore") | ||
| 315 | else: | ||
| 316 | loc_row.set_text(3, "Ignore") | ||
| 317 | loc_row.set_custom_as_button(3, true) | ||
| 318 | loc_row.set_editable(3, true) | ||
| 319 | loc_row.set_text_alignment(3, HORIZONTAL_ALIGNMENT_CENTER) | ||
| 280 | 320 | ||
| 281 | if location["type"] == kLocation: | 321 | if location["type"] == kLocation: |
| 282 | loc_row.set_icon(0, location_texture) | 322 | loc_row.set_icon(0, location_texture) |
| @@ -288,7 +328,10 @@ func update_locations(reset_locations = true): | |||
| 288 | loc_row.set_icon(0, goal_texture) | 328 | loc_row.set_icon(0, goal_texture) |
| 289 | tracker_goal_tree_item = loc_row | 329 | tracker_goal_tree_item = loc_row |
| 290 | 330 | ||
| 291 | tracker_object_by_index[loc_row.get_index()] = location | 331 | if location["ignored"]: |
| 332 | tracker_object_by_ignored_index[loc_row.get_index()] = location | ||
| 333 | else: | ||
| 334 | tracker_object_by_index[loc_row.get_index()] = location | ||
| 292 | else: | 335 | else: |
| 293 | for loc_row in tracker_tree.get_root().get_children(): | 336 | for loc_row in tracker_tree.get_root().get_children(): |
| 294 | loc_row.visible = false | 337 | loc_row.visible = false |
| @@ -310,6 +353,18 @@ func update_locations(reset_locations = true): | |||
| 310 | if tracker_goal_tree_item != null and ap.client._goal_accessible: | 353 | if tracker_goal_tree_item != null and ap.client._goal_accessible: |
| 311 | tracker_goal_tree_item.visible = true | 354 | tracker_goal_tree_item.visible = true |
| 312 | 355 | ||
| 356 | if tracker_ignored_group != null: | ||
| 357 | tracker_ignored_group.visible = true | ||
| 358 | |||
| 359 | |||
| 360 | func _cmp_tracker_objects(a, b) -> bool: | ||
| 361 | if a["ignored"] != b["ignored"]: | ||
| 362 | return !a["ignored"] | ||
| 363 | elif a["hint"] != b["hint"]: | ||
| 364 | return a["hint"] | ||
| 365 | else: | ||
| 366 | return a["name"] < b["name"] | ||
| 367 | |||
| 313 | 368 | ||
| 314 | func update_locations_visibility(): | 369 | func update_locations_visibility(): |
| 315 | var ap = global.get_node("Archipelago") | 370 | var ap = global.get_node("Archipelago") |
| @@ -317,20 +372,33 @@ func update_locations_visibility(): | |||
| 317 | 372 | ||
| 318 | 373 | ||
| 319 | func _on_tracker_button_clicked(): | 374 | func _on_tracker_button_clicked(): |
| 375 | var ap = global.get_node("Archipelago") | ||
| 376 | |||
| 320 | var edited_item = tracker_tree.get_edited() | 377 | var edited_item = tracker_tree.get_edited() |
| 321 | var edited_index = edited_item.get_index() | 378 | var edited_index = edited_item.get_index() |
| 322 | 379 | ||
| 323 | if tracker_object_by_index.has(edited_index): | 380 | if edited_item.get_parent() == tracker_tree.get_root(): |
| 324 | var tracker_object = tracker_object_by_index[edited_index] | 381 | if tracker_object_by_index.has(edited_index): |
| 325 | var ap = global.get_node("Archipelago") | 382 | var tracker_object = tracker_object_by_index[edited_index] |
| 326 | var type_str = "" | 383 | if tracker_tree.get_edited_column() == 2: |
| 327 | if tracker_object["type"] == kLocation: | 384 | var type_str = "" |
| 328 | type_str = "location" | 385 | if tracker_object["type"] == kLocation: |
| 329 | elif tracker_object["type"] == kWorldport: | 386 | type_str = "location" |
| 330 | type_str = "worldport" | 387 | elif tracker_object["type"] == kWorldport: |
| 331 | elif tracker_object["type"] == kGoal: | 388 | type_str = "worldport" |
| 332 | type_str = "goal" | 389 | elif tracker_object["type"] == kGoal: |
| 333 | ap.client.getLogicalPath(type_str, tracker_object.get("id", null)) | 390 | type_str = "goal" |
| 391 | ap.client.getLogicalPath(type_str, tracker_object.get("id", null)) | ||
| 392 | elif tracker_tree.get_edited_column() == 3: | ||
| 393 | ap.toggle_ignored_location(tracker_object["id"]) | ||
| 394 | elif edited_item.get_parent() == tracker_ignored_group: | ||
| 395 | # This is the ignored locations group. | ||
| 396 | if ( | ||
| 397 | tracker_object_by_ignored_index.has(edited_index) | ||
| 398 | and tracker_tree.get_edited_column() == 3 | ||
| 399 | ): | ||
| 400 | var tracker_object = tracker_object_by_ignored_index[edited_index] | ||
| 401 | ap.toggle_ignored_location(tracker_object["id"]) | ||
| 334 | 402 | ||
| 335 | 403 | ||
| 336 | func display_logical_path(object_type, object_id, paths): | 404 | func display_logical_path(object_type, object_id, paths): |
| @@ -435,4 +503,6 @@ func reset_tracker_tab(): | |||
| 435 | tracker_port_tree_item_by_id.clear() | 503 | tracker_port_tree_item_by_id.clear() |
| 436 | tracker_goal_tree_item = null | 504 | tracker_goal_tree_item = null |
| 437 | tracker_object_by_index.clear() | 505 | tracker_object_by_index.clear() |
| 506 | tracker_object_by_ignored_index.clear() | ||
| 507 | tracker_ignored_group = null | ||
| 438 | tracker_tree.clear() | 508 | tracker_tree.clear() |
| diff --git a/apworld/client/unlockReaderListener.gd b/apworld/client/unlockReaderListener.gd new file mode 100644 index 0000000..a5754b9 --- /dev/null +++ b/apworld/client/unlockReaderListener.gd | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | extends "res://scripts/nodes/listeners/unlockReaderListener.gd" | ||
| 2 | |||
| 3 | var item_id = null | ||
| 4 | var item_amount | ||
| 5 | |||
| 6 | |||
| 7 | func _ready(): | ||
| 8 | var node_path = String( | ||
| 9 | get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names() | ||
| 10 | ) | ||
| 11 | |||
| 12 | var gamedata = global.get_node("Gamedata") | ||
| 13 | var door_id = gamedata.get_door_for_map_node_path(global.map, node_path) | ||
| 14 | if door_id != null: | ||
| 15 | var ap = global.get_node("Archipelago") | ||
| 16 | var item_lock = ap.get_item_id_for_door(door_id) | ||
| 17 | |||
| 18 | if item_lock != null: | ||
| 19 | item_id = item_lock[0] | ||
| 20 | item_amount = item_lock[1] | ||
| 21 | |||
| 22 | self.senders = [] | ||
| 23 | self.senderGroup = [] | ||
| 24 | self.nested = false | ||
| 25 | self.complete_at = 0 | ||
| 26 | self.max_length = 0 | ||
| 27 | self.excludeSenders = [] | ||
| 28 | |||
| 29 | super._ready() | ||
| 30 | |||
| 31 | |||
| 32 | func _readier(): | ||
| 33 | if item_id != null: | ||
| 34 | var ap = global.get_node("Archipelago") | ||
| 35 | |||
| 36 | if ap.client.getItemAmount(item_id) >= item_amount: | ||
| 37 | handleTriggered() | ||
| 38 | else: | ||
| 39 | super._readier() | ||
| 40 | |||
| 41 | |||
| 42 | func handleTriggered(): | ||
| 43 | if item_id != null: | ||
| 44 | emit_signal("trigger") | ||
| 45 | else: | ||
| 46 | super.handleTriggered() | ||
| diff --git a/apworld/context.py b/apworld/context.py index e2d80cd..86392f9 100644 --- a/apworld/context.py +++ b/apworld/context.py | |||
| @@ -30,6 +30,16 @@ KEY_STORAGE_MAPPING = { | |||
| 30 | REVERSE_KEY_STORAGE_MAPPING = {t: k for k, t in KEY_STORAGE_MAPPING.items()} | 30 | REVERSE_KEY_STORAGE_MAPPING = {t: k for k, t in KEY_STORAGE_MAPPING.items()} |
| 31 | 31 | ||
| 32 | 32 | ||
| 33 | # There is a distinction between an object's ID and its AP ID. The latter is stable between releases, whereas the former | ||
| 34 | # can change and is also namespaced based on the object type. We should only store AP IDs in multiworld state (such as | ||
| 35 | # slot data and data storage) to increase compatability between releases. The data we currently store is: | ||
| 36 | # - Port pairings for worldport shuffle (slot data) | ||
| 37 | # - Checked worldports for worldport shuffle (data storage) | ||
| 38 | # - Latched doors (data storage) | ||
| 39 | # The client generally deals in the actual object IDs rather than the stable IDs, although it does have to convert the | ||
| 40 | # port pairing IDs when reading them from slot data. The context (this file here) does the work of converting back and | ||
| 41 | # forth between the values. AP IDs are converted to IDs after reading them from data storage, and IDs are converted to | ||
| 42 | # AP IDs before sending them to data storage. | ||
| 33 | class Lingo2Manager: | 43 | class Lingo2Manager: |
| 34 | game_ctx: "Lingo2GameContext" | 44 | game_ctx: "Lingo2GameContext" |
| 35 | client_ctx: "Lingo2ClientContext" | 45 | client_ctx: "Lingo2ClientContext" |
| @@ -39,6 +49,7 @@ class Lingo2Manager: | |||
| 39 | worldports: set[int] | 49 | worldports: set[int] |
| 40 | goaled: bool | 50 | goaled: bool |
| 41 | latches: set[int] | 51 | latches: set[int] |
| 52 | hinted_locations: set[int] | ||
| 42 | 53 | ||
| 43 | def __init__(self, game_ctx: "Lingo2GameContext", client_ctx: "Lingo2ClientContext"): | 54 | def __init__(self, game_ctx: "Lingo2GameContext", client_ctx: "Lingo2ClientContext"): |
| 44 | self.game_ctx = game_ctx | 55 | self.game_ctx = game_ctx |
| @@ -47,8 +58,6 @@ class Lingo2Manager: | |||
| 47 | self.client_ctx.manager = self | 58 | self.client_ctx.manager = self |
| 48 | self.tracker = Tracker(self) | 59 | self.tracker = Tracker(self) |
| 49 | self.keyboard = {} | 60 | self.keyboard = {} |
| 50 | self.worldports = set() | ||
| 51 | self.latches = set() | ||
| 52 | 61 | ||
| 53 | self.reset() | 62 | self.reset() |
| 54 | 63 | ||
| @@ -59,6 +68,7 @@ class Lingo2Manager: | |||
| 59 | self.worldports = set() | 68 | self.worldports = set() |
| 60 | self.goaled = False | 69 | self.goaled = False |
| 61 | self.latches = set() | 70 | self.latches = set() |
| 71 | self.hinted_locations = set() | ||
| 62 | 72 | ||
| 63 | def update_keyboard(self, new_keyboard: dict[str, int]) -> dict[str, int]: | 73 | def update_keyboard(self, new_keyboard: dict[str, int]) -> dict[str, int]: |
| 64 | ret: dict[str, int] = {} | 74 | ret: dict[str, int] = {} |
| @@ -74,6 +84,7 @@ class Lingo2Manager: | |||
| 74 | 84 | ||
| 75 | return ret | 85 | return ret |
| 76 | 86 | ||
| 87 | # Input should be real IDs, not AP IDs | ||
| 77 | def update_worldports(self, new_worldports: set[int]) -> set[int]: | 88 | def update_worldports(self, new_worldports: set[int]) -> set[int]: |
| 78 | ret = new_worldports.difference(self.worldports) | 89 | ret = new_worldports.difference(self.worldports) |
| 79 | self.worldports.update(new_worldports) | 90 | self.worldports.update(new_worldports) |
| @@ -90,6 +101,12 @@ class Lingo2Manager: | |||
| 90 | 101 | ||
| 91 | return ret | 102 | return ret |
| 92 | 103 | ||
| 104 | def update_hinted_locations(self, new_locs: set[int]) -> set[int]: | ||
| 105 | ret = new_locs.difference(self.hinted_locations) | ||
| 106 | self.hinted_locations.update(new_locs) | ||
| 107 | |||
| 108 | return ret | ||
| 109 | |||
| 93 | 110 | ||
| 94 | class Lingo2GameContext: | 111 | class Lingo2GameContext: |
| 95 | server: Endpoint | None | 112 | server: Endpoint | None |
| @@ -227,6 +244,7 @@ class Lingo2GameContext: | |||
| 227 | 244 | ||
| 228 | async_start(self.send_msgs([msg]), name="update keyboard") | 245 | async_start(self.send_msgs([msg]), name="update keyboard") |
| 229 | 246 | ||
| 247 | # Input should be real IDs, not AP IDs | ||
| 230 | def send_update_worldports(self, worldports): | 248 | def send_update_worldports(self, worldports): |
| 231 | if self.server is None: | 249 | if self.server is None: |
| 232 | return | 250 | return |
| @@ -264,6 +282,28 @@ class Lingo2GameContext: | |||
| 264 | 282 | ||
| 265 | async_start(self.send_msgs([msg]), name="update latches") | 283 | async_start(self.send_msgs([msg]), name="update latches") |
| 266 | 284 | ||
| 285 | def send_ignored_locations(self, ignored_locations): | ||
| 286 | if self.server is None: | ||
| 287 | return | ||
| 288 | |||
| 289 | msg = { | ||
| 290 | "cmd": "SetIgnoredLocations", | ||
| 291 | "locations": ignored_locations, | ||
| 292 | } | ||
| 293 | |||
| 294 | async_start(self.send_msgs([msg]), name="set ignored locations") | ||
| 295 | |||
| 296 | def send_update_hinted_locations(self, hinted_locations): | ||
| 297 | if self.server is None: | ||
| 298 | return | ||
| 299 | |||
| 300 | msg = { | ||
| 301 | "cmd": "UpdateHintedLocations", | ||
| 302 | "locations": hinted_locations, | ||
| 303 | } | ||
| 304 | |||
| 305 | async_start(self.send_msgs([msg]), name="update hinted locations") | ||
| 306 | |||
| 267 | async def send_msgs(self, msgs: list[Any]) -> None: | 307 | async def send_msgs(self, msgs: list[Any]) -> None: |
| 268 | """ `msgs` JSON serializable """ | 308 | """ `msgs` JSON serializable """ |
| 269 | if not self.server or not self.server.socket.open or self.server.socket.closed: | 309 | if not self.server or not self.server.socket.open or self.server.socket.closed: |
| @@ -278,6 +318,7 @@ class Lingo2ClientContext(CommonContext): | |||
| 278 | items_handling = 0b111 | 318 | items_handling = 0b111 |
| 279 | 319 | ||
| 280 | slot_data: dict[str, Any] | None | 320 | slot_data: dict[str, Any] | None |
| 321 | hints_data_storage_key: str | ||
| 281 | victory_data_storage_key: str | 322 | victory_data_storage_key: str |
| 282 | 323 | ||
| 283 | def __init__(self, server_address: str | None = None, password: str | None = None): | 324 | def __init__(self, server_address: str | None = None, password: str | None = None): |
| @@ -315,10 +356,12 @@ class Lingo2ClientContext(CommonContext): | |||
| 315 | self.manager.tracker.set_checked_locations(self.checked_locations) | 356 | self.manager.tracker.set_checked_locations(self.checked_locations) |
| 316 | self.manager.game_ctx.send_accessible_locations() | 357 | self.manager.game_ctx.send_accessible_locations() |
| 317 | 358 | ||
| 359 | self.hints_data_storage_key = f"_read_hints_{self.team}_{self.slot}" | ||
| 318 | self.victory_data_storage_key = f"_read_client_status_{self.team}_{self.slot}" | 360 | self.victory_data_storage_key = f"_read_client_status_{self.team}_{self.slot}" |
| 319 | 361 | ||
| 320 | self.set_notify(self.get_datastorage_key("keyboard1"), self.get_datastorage_key("keyboard2"), | 362 | self.set_notify(self.get_datastorage_key("keyboard1"), self.get_datastorage_key("keyboard2"), |
| 321 | self.victory_data_storage_key, self.get_datastorage_key("latches")) | 363 | self.victory_data_storage_key, self.get_datastorage_key("latches"), |
| 364 | self.get_datastorage_key("ignored_locations")) | ||
| 322 | msg_batch = [{ | 365 | msg_batch = [{ |
| 323 | "cmd": "Set", | 366 | "cmd": "Set", |
| 324 | "key": self.get_datastorage_key("keyboard1"), | 367 | "key": self.get_datastorage_key("keyboard1"), |
| @@ -337,6 +380,12 @@ class Lingo2ClientContext(CommonContext): | |||
| 337 | "default": [], | 380 | "default": [], |
| 338 | "want_reply": True, | 381 | "want_reply": True, |
| 339 | "operations": [{"operation": "default", "value": []}] | 382 | "operations": [{"operation": "default", "value": []}] |
| 383 | }, { | ||
| 384 | "cmd": "Set", | ||
| 385 | "key": self.get_datastorage_key("ignored_locations"), | ||
| 386 | "default": [], | ||
| 387 | "want_reply": True, | ||
| 388 | "operations": [{"operation": "default", "value": []}] | ||
| 340 | }] | 389 | }] |
| 341 | 390 | ||
| 342 | if self.slot_data.get("shuffle_worldports", False): | 391 | if self.slot_data.get("shuffle_worldports", False): |
| @@ -435,21 +484,29 @@ class Lingo2ClientContext(CommonContext): | |||
| 435 | for k, v in args["keys"].items(): | 484 | for k, v in args["keys"].items(): |
| 436 | if k == self.victory_data_storage_key: | 485 | if k == self.victory_data_storage_key: |
| 437 | self.handle_status_update(v) | 486 | self.handle_status_update(v) |
| 487 | elif k == self.hints_data_storage_key: | ||
| 488 | self.update_hints() | ||
| 438 | elif cmd == "SetReply": | 489 | elif cmd == "SetReply": |
| 439 | if args["key"] == self.get_datastorage_key("keyboard1"): | 490 | if args["key"] == self.get_datastorage_key("keyboard1"): |
| 440 | self.handle_keyboard_update(1, args) | 491 | self.handle_keyboard_update(1, args) |
| 441 | elif args["key"] == self.get_datastorage_key("keyboard2"): | 492 | elif args["key"] == self.get_datastorage_key("keyboard2"): |
| 442 | self.handle_keyboard_update(2, args) | 493 | self.handle_keyboard_update(2, args) |
| 443 | elif args["key"] == self.get_datastorage_key("worldports"): | 494 | elif args["key"] == self.get_datastorage_key("worldports"): |
| 444 | updates = self.manager.update_worldports(set(args["value"])) | 495 | port_ids = set(Lingo2World.static_logic.port_id_by_ap_id[ap_id] for ap_id in args["value"]) |
| 496 | updates = self.manager.update_worldports(port_ids) | ||
| 445 | if len(updates) > 0: | 497 | if len(updates) > 0: |
| 446 | self.manager.game_ctx.send_update_worldports(updates) | 498 | self.manager.game_ctx.send_update_worldports(updates) |
| 447 | elif args["key"] == self.victory_data_storage_key: | 499 | elif args["key"] == self.victory_data_storage_key: |
| 448 | self.handle_status_update(args["value"]) | 500 | self.handle_status_update(args["value"]) |
| 449 | elif args["key"] == self.get_datastorage_key("latches"): | 501 | elif args["key"] == self.get_datastorage_key("latches"): |
| 450 | updates = self.manager.update_latches(set(args["value"])) | 502 | door_ids = set(Lingo2World.static_logic.door_id_by_ap_id[ap_id] for ap_id in args["value"]) |
| 503 | updates = self.manager.update_latches(door_ids) | ||
| 451 | if len(updates) > 0: | 504 | if len(updates) > 0: |
| 452 | self.manager.game_ctx.send_update_latches(updates) | 505 | self.manager.game_ctx.send_update_latches(updates) |
| 506 | elif args["key"] == self.get_datastorage_key("ignored_locations"): | ||
| 507 | self.manager.game_ctx.send_ignored_locations(args["value"]) | ||
| 508 | elif args["key"] == self.hints_data_storage_key: | ||
| 509 | self.update_hints() | ||
| 453 | 510 | ||
| 454 | def get_datastorage_key(self, name: str): | 511 | def get_datastorage_key(self, name: str): |
| 455 | return f"Lingo2_{self.slot}_{name}" | 512 | return f"Lingo2_{self.slot}_{name}" |
| @@ -515,14 +572,16 @@ class Lingo2ClientContext(CommonContext): | |||
| 515 | if len(updates) > 0: | 572 | if len(updates) > 0: |
| 516 | self.manager.game_ctx.send_update_keyboard(updates) | 573 | self.manager.game_ctx.send_update_keyboard(updates) |
| 517 | 574 | ||
| 575 | # Input should be real IDs, not AP IDs | ||
| 518 | async def update_worldports(self, updates: set[int]): | 576 | async def update_worldports(self, updates: set[int]): |
| 577 | port_ap_ids = [Lingo2World.static_logic.objects.ports[port_id].ap_id for port_id in updates] | ||
| 519 | await self.send_msgs([{ | 578 | await self.send_msgs([{ |
| 520 | "cmd": "Set", | 579 | "cmd": "Set", |
| 521 | "key": self.get_datastorage_key("worldports"), | 580 | "key": self.get_datastorage_key("worldports"), |
| 522 | "want_reply": True, | 581 | "want_reply": True, |
| 523 | "operations": [{ | 582 | "operations": [{ |
| 524 | "operation": "update", | 583 | "operation": "update", |
| 525 | "value": updates | 584 | "value": port_ap_ids |
| 526 | }] | 585 | }] |
| 527 | }]) | 586 | }]) |
| 528 | 587 | ||
| @@ -532,16 +591,47 @@ class Lingo2ClientContext(CommonContext): | |||
| 532 | self.manager.game_ctx.send_accessible_locations() | 591 | self.manager.game_ctx.send_accessible_locations() |
| 533 | 592 | ||
| 534 | async def update_latches(self, updates: set[int]): | 593 | async def update_latches(self, updates: set[int]): |
| 594 | door_ap_ids = [Lingo2World.static_logic.objects.doors[door_id].ap_id for door_id in updates] | ||
| 535 | await self.send_msgs([{ | 595 | await self.send_msgs([{ |
| 536 | "cmd": "Set", | 596 | "cmd": "Set", |
| 537 | "key": self.get_datastorage_key("latches"), | 597 | "key": self.get_datastorage_key("latches"), |
| 538 | "want_reply": True, | 598 | "want_reply": True, |
| 539 | "operations": [{ | 599 | "operations": [{ |
| 540 | "operation": "update", | 600 | "operation": "update", |
| 541 | "value": updates | 601 | "value": door_ap_ids |
| 602 | }] | ||
| 603 | }]) | ||
| 604 | |||
| 605 | async def add_ignored_location(self, loc_id: int): | ||
| 606 | await self.send_msgs([{ | ||
| 607 | "cmd": "Set", | ||
| 608 | "key": self.get_datastorage_key("ignored_locations"), | ||
| 609 | "want_reply": True, | ||
| 610 | "operations": [{ | ||
| 611 | "operation": "update", | ||
| 612 | "value": [loc_id] | ||
| 542 | }] | 613 | }] |
| 543 | }]) | 614 | }]) |
| 544 | 615 | ||
| 616 | async def remove_ignored_location(self, loc_id: int): | ||
| 617 | await self.send_msgs([{ | ||
| 618 | "cmd": "Set", | ||
| 619 | "key": self.get_datastorage_key("ignored_locations"), | ||
| 620 | "want_reply": True, | ||
| 621 | "operations": [{ | ||
| 622 | "operation": "remove", | ||
| 623 | "value": loc_id | ||
| 624 | }] | ||
| 625 | }]) | ||
| 626 | |||
| 627 | def update_hints(self): | ||
| 628 | hints = self.stored_data.get(self.hints_data_storage_key, []) | ||
| 629 | |||
| 630 | hinted_locations = set(hint["location"] for hint in hints if hint["finding_player"] == self.slot) | ||
| 631 | updates = self.manager.update_hinted_locations(hinted_locations) | ||
| 632 | if len(updates) > 0: | ||
| 633 | self.manager.game_ctx.send_update_hinted_locations(updates) | ||
| 634 | |||
| 545 | 635 | ||
| 546 | async def pipe_loop(manager: Lingo2Manager): | 636 | async def pipe_loop(manager: Lingo2Manager): |
| 547 | while not manager.client_ctx.exit_event.is_set(): | 637 | while not manager.client_ctx.exit_event.is_set(): |
| @@ -590,12 +680,14 @@ async def process_game_cmd(manager: Lingo2Manager, args: dict): | |||
| 590 | async_start(manager.client_ctx.update_keyboard(updates), name="client update keyboard") | 680 | async_start(manager.client_ctx.update_keyboard(updates), name="client update keyboard") |
| 591 | elif cmd == "CheckWorldport": | 681 | elif cmd == "CheckWorldport": |
| 592 | port_id = args["port_id"] | 682 | port_id = args["port_id"] |
| 683 | port_ap_id = Lingo2World.static_logic.objects.ports[port_id].ap_id | ||
| 593 | worldports = {port_id} | 684 | worldports = {port_id} |
| 594 | 685 | ||
| 595 | # Also check the reverse port if it's a two-way connection. | 686 | # Also check the reverse port if it's a two-way connection. |
| 596 | port_pairings = manager.client_ctx.slot_data["port_pairings"] | 687 | port_pairings = manager.client_ctx.slot_data["port_pairings"] |
| 597 | if str(port_id) in port_pairings and port_pairings.get(str(port_pairings[str(port_id)]), None) == port_id: | 688 | if str(port_ap_id) in port_pairings and\ |
| 598 | worldports.add(port_pairings[str(port_id)]) | 689 | port_pairings.get(str(port_pairings[str(port_ap_id)]), None) == port_ap_id: |
| 690 | worldports.add(Lingo2World.static_logic.port_id_by_ap_id[port_pairings[str(port_ap_id)]]) | ||
| 599 | 691 | ||
| 600 | updates = manager.update_worldports(worldports) | 692 | updates = manager.update_worldports(worldports) |
| 601 | if len(updates) > 0: | 693 | if len(updates) > 0: |
| @@ -616,6 +708,10 @@ async def process_game_cmd(manager: Lingo2Manager, args: dict): | |||
| 616 | updates = manager.update_latches({args["door"]}) | 708 | updates = manager.update_latches({args["door"]}) |
| 617 | if len(updates) > 0: | 709 | if len(updates) > 0: |
| 618 | async_start(manager.client_ctx.update_latches(updates), name="client update latches") | 710 | async_start(manager.client_ctx.update_latches(updates), name="client update latches") |
| 711 | elif cmd == "IgnoreLocation": | ||
| 712 | async_start(manager.client_ctx.add_ignored_location(args["id"]), name="client ignore loc") | ||
| 713 | elif cmd == "UnignoreLocation": | ||
| 714 | async_start(manager.client_ctx.remove_ignored_location(args["id"]), name="client unignore loc") | ||
| 619 | elif cmd == "Quit": | 715 | elif cmd == "Quit": |
| 620 | manager.client_ctx.exit_event.set() | 716 | manager.client_ctx.exit_event.set() |
| 621 | 717 | ||
| diff --git a/apworld/player_logic.py b/apworld/player_logic.py index 1d68e4a..3ee8f38 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py | |||
| @@ -299,8 +299,7 @@ class Lingo2PlayerLogic: | |||
| 299 | if door.map_id not in self.shuffled_maps: | 299 | if door.map_id not in self.shuffled_maps: |
| 300 | continue | 300 | continue |
| 301 | 301 | ||
| 302 | if door.type in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE, | 302 | if door.type in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: |
| 303 | data_pb2.DoorType.LEGACY_LOCATION]: | ||
| 304 | continue | 303 | continue |
| 305 | 304 | ||
| 306 | if door.id in self.item_by_door: | 305 | if door.id in self.item_by_door: |
| diff --git a/apworld/static_logic.py b/apworld/static_logic.py index 702f30b..8a84111 100644 --- a/apworld/static_logic.py +++ b/apworld/static_logic.py | |||
| @@ -15,6 +15,9 @@ class Lingo2StaticLogic: | |||
| 15 | 15 | ||
| 16 | letter_weights: dict[str, int] | 16 | letter_weights: dict[str, int] |
| 17 | 17 | ||
| 18 | door_id_by_ap_id: dict[int, int] | ||
| 19 | port_id_by_ap_id: dict[int, int] | ||
| 20 | |||
| 18 | def __init__(self): | 21 | def __init__(self): |
| 19 | self.item_id_to_name = {} | 22 | self.item_id_to_name = {} |
| 20 | self.location_id_to_name = {} | 23 | self.location_id_to_name = {} |
| @@ -31,8 +34,7 @@ class Lingo2StaticLogic: | |||
| 31 | location_name = self.get_door_location_name(door) | 34 | location_name = self.get_door_location_name(door) |
| 32 | self.location_id_to_name[door.ap_id] = location_name | 35 | self.location_id_to_name[door.ap_id] = location_name |
| 33 | 36 | ||
| 34 | if door.type not in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE, | 37 | if door.type not in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: |
| 35 | data_pb2.DoorType.LEGACY_LOCATION]: | ||
| 36 | item_name = self.get_door_item_name(door) | 38 | item_name = self.get_door_item_name(door) |
| 37 | self.item_id_to_name[door.ap_id] = item_name | 39 | self.item_id_to_name[door.ap_id] = item_name |
| 38 | 40 | ||
| @@ -84,6 +86,9 @@ class Lingo2StaticLogic: | |||
| 84 | for letter in panel.answer.upper(): | 86 | for letter in panel.answer.upper(): |
| 85 | self.letter_weights[letter] = self.letter_weights.get(letter, 0) + 1 | 87 | self.letter_weights[letter] = self.letter_weights.get(letter, 0) + 1 |
| 86 | 88 | ||
| 89 | self.door_id_by_ap_id = {door.ap_id: door.id for door in self.objects.doors if door.HasField("ap_id")} | ||
| 90 | self.port_id_by_ap_id = {port.ap_id: port.id for port in self.objects.ports if port.HasField("ap_id")} | ||
| 91 | |||
| 87 | def get_door_item_name(self, door: data_pb2.Door) -> str: | 92 | def get_door_item_name(self, door: data_pb2.Door) -> str: |
| 88 | return f"{self.get_map_object_map_name(door)} - {door.name}" | 93 | return f"{self.get_map_object_map_name(door)} - {door.name}" |
| 89 | 94 | ||
| diff --git a/apworld/tracker.py b/apworld/tracker.py index c65317c..d473af4 100644 --- a/apworld/tracker.py +++ b/apworld/tracker.py | |||
| @@ -47,7 +47,10 @@ class Tracker: | |||
| 47 | self.world.create_regions() | 47 | self.world.create_regions() |
| 48 | 48 | ||
| 49 | if self.world.options.shuffle_worldports: | 49 | if self.world.options.shuffle_worldports: |
| 50 | port_pairings = {int(fp): int(tp) for fp, tp in slot_data["port_pairings"].items()} | 50 | port_pairings = { |
| 51 | self.world.static_logic.port_id_by_ap_id[int(fp)]: self.world.static_logic.port_id_by_ap_id[int(tp)] | ||
| 52 | for fp, tp in slot_data["port_pairings"].items() | ||
| 53 | } | ||
| 51 | connect_ports_from_ut(port_pairings, self.world) | 54 | connect_ports_from_ut(port_pairings, self.world) |
| 52 | 55 | ||
| 53 | self.refresh_state() | 56 | self.refresh_state() |
| diff --git a/data/MISSING PANELS.txt b/data/MISSING PANELS.txt new file mode 100644 index 0000000..478b8be --- /dev/null +++ b/data/MISSING PANELS.txt | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | Used in vanilla doors: | ||
| 2 | |||
| 3 | The Between - RIGHT | ||
| 4 | |||
| 5 | |||
| 6 | |||
| 7 | |||
| 8 | Used in a pseudo-connection: | ||
| 9 | |||
| 10 | The Sturdy - COLORS | ||
| 11 | |||
| 12 | |||
| 13 | |||
| 14 | |||
| 15 | Unsolved panels in letter rooms: | ||
| 16 | |||
| 17 | Daedalus (F2 Room) - DEADLY | ||
| 18 | Daedalus (F2 Room) - DIMS | ||
| 19 | Daedalus (F2 Room) - GRAVE | ||
| 20 | Daedalus (F2 Room) - LETHAL | ||
| 21 | Daedalus (O2 Room) - ACCEPT | ||
| 22 | Daedalus (O2 Room) - FOLLOW | ||
| 23 | Daedalus (O2 Room) - PLEDGE | ||
| 24 | Daedalus (O2 Room) - WARNING | ||
| 25 | Daedalus (U2 Room) - EFFECTIVE | ||
| 26 | Daedalus (U2 Room) - HELPFUL | ||
| 27 | Daedalus (U2 Room) - INFERNAL | ||
| 28 | Daedalus (U2 Room) - PRACTICAL | ||
| 29 | Daedalus (U2 Room) - PRODUCTIVE | ||
| 30 | Daedalus (U2 Room) - WONDERLAND | ||
| 31 | The Digital - EYE | ||
| 32 | The Digital - HIGH | ||
| diff --git a/data/ids.yaml b/data/ids.yaml index 1b94233..0042899 100644 --- a/data/ids.yaml +++ b/data/ids.yaml | |||
| @@ -74,6 +74,8 @@ maps: | |||
| 74 | Desert Door: 2717 | 74 | Desert Door: 2717 |
| 75 | Front Door: 2709 | 75 | Front Door: 2709 |
| 76 | Hidden Door: 2840 | 76 | Hidden Door: 2840 |
| 77 | Letters Panel: 3285 | ||
| 78 | Near Perceptive Panel: 3284 | ||
| 77 | Partial Door: 2713 | 79 | Partial Door: 2713 |
| 78 | Perceptive From Inside: 2842 | 80 | Perceptive From Inside: 2842 |
| 79 | Perceptive From Outside: 2841 | 81 | Perceptive From Outside: 2841 |
| @@ -1027,6 +1029,7 @@ maps: | |||
| 1027 | doors: | 1029 | doors: |
| 1028 | Amber East Doors: 1511 | 1030 | Amber East Doors: 1511 |
| 1029 | Amber North Door: 1510 | 1031 | Amber North Door: 1510 |
| 1032 | Amber Room Panels: 3289 | ||
| 1030 | Amber South Door: 1509 | 1033 | Amber South Door: 1509 |
| 1031 | Bee Room Back Door: 1523 | 1034 | Bee Room Back Door: 1523 |
| 1032 | Bee Room Entrance: 1521 | 1035 | Bee Room Entrance: 1521 |
| @@ -1069,7 +1072,9 @@ maps: | |||
| 1069 | Dark Light Room Entrance: 1569 | 1072 | Dark Light Room Entrance: 1569 |
| 1070 | Dark Light Room Exit: 1570 | 1073 | Dark Light Room Exit: 1570 |
| 1071 | Dark Light Room Exit Panel: 1571 | 1074 | Dark Light Room Exit Panel: 1571 |
| 1075 | Direction Panels: 3297 | ||
| 1072 | Entry Shortcut Secret Exit: 1437 | 1076 | Entry Shortcut Secret Exit: 1437 |
| 1077 | Equality Panels: 3292 | ||
| 1073 | Eye Painting: 2751 | 1078 | Eye Painting: 2751 |
| 1074 | Eye Painting Exit: 1446 | 1079 | Eye Painting Exit: 1446 |
| 1075 | F Keyholder Door: 1551 | 1080 | F Keyholder Door: 1551 |
| @@ -1077,6 +1082,7 @@ maps: | |||
| 1077 | F2 Room Southeast Door: 1487 | 1082 | F2 Room Southeast Door: 1487 |
| 1078 | F2 Room Southwest Door: 1490 | 1083 | F2 Room Southwest Door: 1490 |
| 1079 | F2 Room West Door: 1492 | 1084 | F2 Room West Door: 1492 |
| 1085 | Farewell Little Lamb Panels: 3302 | ||
| 1080 | Flip Painting Blocker: 1552 | 1086 | Flip Painting Blocker: 1552 |
| 1081 | Globe Room East Door: 1589 | 1087 | Globe Room East Door: 1589 |
| 1082 | Globe Room South Door: 1591 | 1088 | Globe Room South Door: 1591 |
| @@ -1107,13 +1113,16 @@ maps: | |||
| 1107 | Maze North Door: 1502 | 1113 | Maze North Door: 1502 |
| 1108 | Maze South Door: 1503 | 1114 | Maze South Door: 1503 |
| 1109 | Near Flip Painting Door: 1474 | 1115 | Near Flip Painting Door: 1474 |
| 1116 | Near H Keyholder Panel: 3299 | ||
| 1110 | Near Pyramid Gate: 1447 | 1117 | Near Pyramid Gate: 1447 |
| 1111 | Near Sweet Blue Door: 1573 | 1118 | Near Sweet Blue Door: 1573 |
| 1112 | Near Sweet Brown Door: 1561 | 1119 | Near Sweet Brown Door: 1561 |
| 1113 | Near Yellow Room Door: 1565 | 1120 | Near Yellow Room Door: 1565 |
| 1114 | North Castle Panel: 2742 | 1121 | North Castle Panel: 2742 |
| 1122 | Nursery Panels: 3298 | ||
| 1115 | O2 Room Northeast Door: 1485 | 1123 | O2 Room Northeast Door: 1485 |
| 1116 | O2 Room Southeast Door: 1478 | 1124 | O2 Room Southeast Door: 1478 |
| 1125 | Orange Panels: 3293 | ||
| 1117 | Orange Rainbow Panel: 2267 | 1126 | Orange Rainbow Panel: 2267 |
| 1118 | Orange Rainbow Room: 1535 | 1127 | Orange Rainbow Room: 1535 |
| 1119 | Orange Room: 1507 | 1128 | Orange Room: 1507 |
| @@ -1128,6 +1137,7 @@ maps: | |||
| 1128 | Pink Hallway: 1555 | 1137 | Pink Hallway: 1555 |
| 1129 | Planet Room Divider: 1513 | 1138 | Planet Room Divider: 1513 |
| 1130 | Planet Room Secret Door: 1578 | 1139 | Planet Room Secret Door: 1578 |
| 1140 | Plum Panels: 3300 | ||
| 1131 | Plum Room Entrance: 1576 | 1141 | Plum Room Entrance: 1576 |
| 1132 | Plum Room Exit: 1577 | 1142 | Plum Room Exit: 1577 |
| 1133 | Pumpkin Door: 1583 | 1143 | Pumpkin Door: 1583 |
| @@ -1152,6 +1162,7 @@ maps: | |||
| 1152 | Purple West Area West Door: 1466 | 1162 | Purple West Area West Door: 1466 |
| 1153 | Pyramid Entrance: 1505 | 1163 | Pyramid Entrance: 1505 |
| 1154 | Rain Side Panel: 1546 | 1164 | Rain Side Panel: 1546 |
| 1165 | Rainbow Color Backside Panels: 3286 | ||
| 1155 | Rainbow Rooms Entrance: 1533 | 1166 | Rainbow Rooms Entrance: 1533 |
| 1156 | Red Rainbow Panel: 2266 | 1167 | Red Rainbow Panel: 2266 |
| 1157 | Red Rainbow Room: 1534 | 1168 | Red Rainbow Room: 1534 |
| @@ -1159,6 +1170,7 @@ maps: | |||
| 1159 | Red Room Entrance: 1562 | 1170 | Red Room Entrance: 1562 |
| 1160 | Red Smiley: 1554 | 1171 | Red Smiley: 1554 |
| 1161 | Red Smiley Entrance: 1553 | 1172 | Red Smiley Entrance: 1553 |
| 1173 | Rent Panels: 3291 | ||
| 1162 | Roof Access: 1528 | 1174 | Roof Access: 1528 |
| 1163 | Salt Room Entrance: 1532 | 1175 | Salt Room Entrance: 1532 |
| 1164 | Seasoning Doors: 1544 | 1176 | Seasoning Doors: 1544 |
| @@ -1167,6 +1179,7 @@ maps: | |||
| 1167 | South Castle Area Entrance: 1575 | 1179 | South Castle Area Entrance: 1575 |
| 1168 | South Castle Panel: 2744 | 1180 | South Castle Panel: 2744 |
| 1169 | Southwest Area Intersection: 1475 | 1181 | Southwest Area Intersection: 1475 |
| 1182 | Splintering Area Panels: 3287 | ||
| 1170 | Splintering Exit North Door: 1449 | 1183 | Splintering Exit North Door: 1449 |
| 1171 | Splintering Exit South Door: 1450 | 1184 | Splintering Exit South Door: 1450 |
| 1172 | Starting Room East Wall Center Door: 1439 | 1185 | Starting Room East Wall Center Door: 1439 |
| @@ -1180,8 +1193,10 @@ maps: | |||
| 1180 | Starting Room West Wall North Door: 1438 | 1193 | Starting Room West Wall North Door: 1438 |
| 1181 | Starting Room West Wall South Door: 1433 | 1194 | Starting Room West Wall South Door: 1433 |
| 1182 | Sticks And Stones Door: 1593 | 1195 | Sticks And Stones Door: 1593 |
| 1196 | Teal Panel: 3296 | ||
| 1183 | Temple of the Eyes Entrance: 1444 | 1197 | Temple of the Eyes Entrance: 1444 |
| 1184 | Theo Panels: 2811 | 1198 | Theo Panels: 2811 |
| 1199 | Tree Panels: 3295 | ||
| 1185 | U2 Room East Door: 1498 | 1200 | U2 Room East Door: 1498 |
| 1186 | U2 Room Southeast Door: 1493 | 1201 | U2 Room Southeast Door: 1493 |
| 1187 | U2 Room Southwest Door: 1496 | 1202 | U2 Room Southwest Door: 1496 |
| @@ -1189,13 +1204,17 @@ maps: | |||
| 1189 | Welcome Back Door: 1435 | 1204 | Welcome Back Door: 1435 |
| 1190 | Welcome Back Secret Door: 1434 | 1205 | Welcome Back Secret Door: 1434 |
| 1191 | West Castle Panel: 2743 | 1206 | West Castle Panel: 2743 |
| 1207 | West Spire Panel: 3294 | ||
| 1208 | West Sticks And Stones Panel: 3288 | ||
| 1192 | White Hallway From Entry: 1488 | 1209 | White Hallway From Entry: 1488 |
| 1193 | Wonderland North Door: 1520 | 1210 | Wonderland North Door: 1520 |
| 1194 | Wonderland South Door: 1504 | 1211 | Wonderland South Door: 1504 |
| 1195 | Yellow Rainbow Panel: 2268 | 1212 | Yellow Rainbow Panel: 2268 |
| 1196 | Yellow Rainbow Room: 1536 | 1213 | Yellow Rainbow Room: 1536 |
| 1214 | Yellow Roof Puzzles: 3290 | ||
| 1197 | Yellow Room: 1568 | 1215 | Yellow Room: 1568 |
| 1198 | Yellow Room Entrance: 1567 | 1216 | Yellow Room Entrance: 1567 |
| 1217 | Yellow Smiley Annex Panels: 3301 | ||
| 1199 | Yellow Smiley Door: 1548 | 1218 | Yellow Smiley Door: 1548 |
| 1200 | Z2 Room Back Exit: 1451 | 1219 | Z2 Room Back Exit: 1451 |
| 1201 | Z2 Room Northeast Door: 1454 | 1220 | Z2 Room Northeast Door: 1454 |
| @@ -1617,7 +1636,9 @@ maps: | |||
| 1617 | CAKE: 80 | 1636 | CAKE: 80 |
| 1618 | doors: | 1637 | doors: |
| 1619 | Butterfly Entrance: 50 | 1638 | Butterfly Entrance: 50 |
| 1639 | Butterfly Room Panels: 3304 | ||
| 1620 | Control Center Brown Door: 49 | 1640 | Control Center Brown Door: 49 |
| 1641 | Control Center Color Panel: 3303 | ||
| 1621 | Exit Door: 47 | 1642 | Exit Door: 47 |
| 1622 | Overlook Door: 46 | 1643 | Overlook Door: 46 |
| 1623 | the_between: | 1644 | the_between: |
| @@ -1794,6 +1815,7 @@ maps: | |||
| 1794 | Black Door: 142 | 1815 | Black Door: 142 |
| 1795 | Blue Door: 144 | 1816 | Blue Door: 144 |
| 1796 | Brown Door: 151 | 1817 | Brown Door: 151 |
| 1818 | Chaos Panel: 3305 | ||
| 1797 | Cyan Door: 149 | 1819 | Cyan Door: 149 |
| 1798 | Gray Door: 153 | 1820 | Gray Door: 153 |
| 1799 | Green Door: 145 | 1821 | Green Door: 145 |
| @@ -1858,6 +1880,7 @@ maps: | |||
| 1858 | Flipped Yellow Door: 175 | 1880 | Flipped Yellow Door: 175 |
| 1859 | G Keyholder Blocker: 181 | 1881 | G Keyholder Blocker: 181 |
| 1860 | G2 Door: 182 | 1882 | G2 Door: 182 |
| 1883 | Main Area Puzzles: 3306 | ||
| 1861 | Near C Keyholder Puzzles: 180 | 1884 | Near C Keyholder Puzzles: 180 |
| 1862 | Obverse Magenta Door: 173 | 1885 | Obverse Magenta Door: 173 |
| 1863 | Obverse Yellow Door: 178 | 1886 | Obverse Yellow Door: 178 |
| @@ -1877,6 +1900,8 @@ maps: | |||
| 1877 | Mastery: | 1900 | Mastery: |
| 1878 | masteries: | 1901 | masteries: |
| 1879 | MASTERY: 2993 | 1902 | MASTERY: 2993 |
| 1903 | doors: | ||
| 1904 | Checkpoint Panels: 3307 | ||
| 1880 | the_darkroom: | 1905 | the_darkroom: |
| 1881 | rooms: | 1906 | rooms: |
| 1882 | Congruent Entrance: | 1907 | Congruent Entrance: |
| @@ -1967,6 +1992,7 @@ maps: | |||
| 1967 | UNYIELDING: 3164 | 1992 | UNYIELDING: 3164 |
| 1968 | doors: | 1993 | doors: |
| 1969 | Control Center Blue Door: 246 | 1994 | Control Center Blue Door: 246 |
| 1995 | Control Center Blue Panel: 3308 | ||
| 1970 | Gallery Entrance: 245 | 1996 | Gallery Entrance: 245 |
| 1971 | Tree Entrance: 247 | 1997 | Tree Entrance: 247 |
| 1972 | the_door: | 1998 | the_door: |
| @@ -2032,6 +2058,10 @@ maps: | |||
| 2032 | FULL: 286 | 2058 | FULL: 286 |
| 2033 | ports: | 2059 | ports: |
| 2034 | DARKROOM: 3165 | 2060 | DARKROOM: 3165 |
| 2061 | doors: | ||
| 2062 | 10 Panels: 3310 | ||
| 2063 | 15 Panels: 3311 | ||
| 2064 | 5 Panels: 3309 | ||
| 2035 | the_entry: | 2065 | the_entry: |
| 2036 | rooms: | 2066 | rooms: |
| 2037 | Blue Alcove: | 2067 | Blue Alcove: |
| @@ -2132,7 +2162,7 @@ maps: | |||
| 2132 | PARTHENON: 3176 | 2162 | PARTHENON: 3176 |
| 2133 | Rabbit Hole: | 2163 | Rabbit Hole: |
| 2134 | panels: | 2164 | panels: |
| 2135 | PUZZLE: 364 | 2165 | Blank: 364 |
| 2136 | ports: | 2166 | ports: |
| 2137 | HOLE: 3177 | 2167 | HOLE: 3177 |
| 2138 | Rabbit Hole Lock: | 2168 | Rabbit Hole Lock: |
| @@ -2192,27 +2222,33 @@ maps: | |||
| 2192 | ports: | 2222 | ports: |
| 2193 | CC: 3182 | 2223 | CC: 3182 |
| 2194 | doors: | 2224 | doors: |
| 2225 | Big Eyes: 3316 | ||
| 2195 | Blue Alcove Entrance: 297 | 2226 | Blue Alcove Entrance: 297 |
| 2196 | Blue Alcove Exit: 293 | 2227 | Blue Alcove Exit: 293 |
| 2197 | Colored Doors Area Entrance: 318 | 2228 | Colored Doors Area Entrance: 318 |
| 2198 | Composite Room Entrance: 309 | 2229 | Composite Room Entrance: 309 |
| 2199 | Control Center White Door: 307 | 2230 | Control Center White Door: 307 |
| 2231 | Control Center White Panel: 3318 | ||
| 2200 | Corners Painting: 292 | 2232 | Corners Painting: 292 |
| 2201 | D Room Entrance: 319 | 2233 | D Room Entrance: 319 |
| 2202 | Daedalus Entrance: 311 | 2234 | Daedalus Entrance: 311 |
| 2203 | Flip Area Entrance: 310 | 2235 | Flip Area Entrance: 310 |
| 2236 | Flipped Right Eye Panels: 3315 | ||
| 2204 | Flipped Second Room Left Door: 300 | 2237 | Flipped Second Room Left Door: 300 |
| 2205 | Flipped Second Room Right Door: 299 | 2238 | Flipped Second Room Right Door: 299 |
| 2206 | Gallery Entrance: 321 | 2239 | Gallery Entrance: 321 |
| 2207 | L Room Entrance: 322 | 2240 | L Room Entrance: 322 |
| 2241 | Least Blue Last: 3317 | ||
| 2208 | Liberated Entrance: 314 | 2242 | Liberated Entrance: 314 |
| 2209 | Lime Room Entrance: 305 | 2243 | Lime Room Entrance: 305 |
| 2210 | Link Area Entrance: 288 | 2244 | Link Area Entrance: 288 |
| 2211 | Literate Entrance: 316 | 2245 | Literate Entrance: 316 |
| 2212 | Near D Room Painting: 320 | 2246 | Near D Room Painting: 320 |
| 2213 | Noon Door: 295 | 2247 | Noon Door: 295 |
| 2248 | Noon Door Panels: 3312 | ||
| 2214 | Orange Door Hider: 304 | 2249 | Orange Door Hider: 304 |
| 2215 | Parthenon Entrance: 317 | 2250 | Parthenon Entrance: 317 |
| 2251 | Rabbit Hole Blank Puzzle: 3319 | ||
| 2216 | Rabbithole Door: 294 | 2252 | Rabbithole Door: 294 |
| 2217 | Red Alcove Exit: 291 | 2253 | Red Alcove Exit: 291 |
| 2218 | Red Blue Area Left Door: 302 | 2254 | Red Blue Area Left Door: 302 |
| @@ -2221,6 +2257,7 @@ maps: | |||
| 2221 | Revitalized Entrance: 306 | 2257 | Revitalized Entrance: 306 |
| 2222 | Right Eye Entrance: 301 | 2258 | Right Eye Entrance: 301 |
| 2223 | Scarf Door: 296 | 2259 | Scarf Door: 296 |
| 2260 | Scarf Door Panels: 3313 | ||
| 2224 | Second Room Left Door: 298 | 2261 | Second Room Left Door: 298 |
| 2225 | Second Room Right Door: 290 | 2262 | Second Room Right Door: 290 |
| 2226 | Shop Entrance: 313 | 2263 | Shop Entrance: 313 |
| @@ -2228,6 +2265,8 @@ maps: | |||
| 2228 | Third Eye Painting: 324 | 2265 | Third Eye Painting: 324 |
| 2229 | Trick Door: 287 | 2266 | Trick Door: 287 |
| 2230 | Trick To Shop Door: 289 | 2267 | Trick To Shop Door: 289 |
| 2268 | Wander Panels: 3314 | ||
| 2269 | Wrath Room Puzzles: 3320 | ||
| 2231 | X Area Entrance: 308 | 2270 | X Area Entrance: 308 |
| 2232 | the_extravagant: | 2271 | the_extravagant: |
| 2233 | rooms: | 2272 | rooms: |
| @@ -2299,6 +2338,7 @@ maps: | |||
| 2299 | MASTERY: 3037 | 2338 | MASTERY: 3037 |
| 2300 | doors: | 2339 | doors: |
| 2301 | Black Panels: 3021 | 2340 | Black Panels: 3021 |
| 2341 | Green Panels: 3321 | ||
| 2302 | the_gallery: | 2342 | the_gallery: |
| 2303 | rooms: | 2343 | rooms: |
| 2304 | Back Room: | 2344 | Back Room: |
| @@ -2338,6 +2378,8 @@ maps: | |||
| 2338 | The Whole Thing: | 2378 | The Whole Thing: |
| 2339 | panels: | 2379 | panels: |
| 2340 | PANEL: 434 | 2380 | PANEL: 434 |
| 2381 | doors: | ||
| 2382 | The Panel: 3322 | ||
| 2341 | the_graveyard: | 2383 | the_graveyard: |
| 2342 | rooms: | 2384 | rooms: |
| 2343 | Inside: | 2385 | Inside: |
| @@ -2347,6 +2389,8 @@ maps: | |||
| 2347 | panels: | 2389 | panels: |
| 2348 | FOOT: 436 | 2390 | FOOT: 436 |
| 2349 | SEVERE: 437 | 2391 | SEVERE: 437 |
| 2392 | doors: | ||
| 2393 | Remember Panel: 3323 | ||
| 2350 | the_great: | 2394 | the_great: |
| 2351 | rooms: | 2395 | rooms: |
| 2352 | Back Area: | 2396 | Back Area: |
| @@ -2609,13 +2653,19 @@ maps: | |||
| 2609 | SHIFT: 624 | 2653 | SHIFT: 624 |
| 2610 | doors: | 2654 | doors: |
| 2611 | Back Area Entrance: 439 | 2655 | Back Area Entrance: 439 |
| 2656 | Behind Orb Panel: 3336 | ||
| 2657 | Behind Question Room Panels: 3332 | ||
| 2612 | Between Entrance: 440 | 2658 | Between Entrance: 440 |
| 2613 | Big Y: 462 | 2659 | Big Y: 462 |
| 2660 | Broken Shed Panels: 3333 | ||
| 2614 | Building Building Gravestone: 468 | 2661 | Building Building Gravestone: 468 |
| 2615 | Colorful Entrance: 455 | 2662 | Colorful Entrance: 455 |
| 2616 | Control Center Gray Door: 446 | 2663 | Control Center Gray Door: 446 |
| 2664 | Control Center Gray Panel: 3326 | ||
| 2617 | Control Center Purple Door: 445 | 2665 | Control Center Purple Door: 445 |
| 2666 | Control Center Purple Panel: 3327 | ||
| 2618 | Control Center Red Door: 447 | 2667 | Control Center Red Door: 447 |
| 2668 | Control Center Red Panel: 3328 | ||
| 2619 | Courtyard Entrance: 442 | 2669 | Courtyard Entrance: 442 |
| 2620 | Courtyard Side Door: 461 | 2670 | Courtyard Side Door: 461 |
| 2621 | Daedalus Entrance: 448 | 2671 | Daedalus Entrance: 448 |
| @@ -2626,8 +2676,11 @@ maps: | |||
| 2626 | Invisible Entrance: 465 | 2676 | Invisible Entrance: 465 |
| 2627 | Jail Entrance: 451 | 2677 | Jail Entrance: 451 |
| 2628 | Magnet Room Entrance: 449 | 2678 | Magnet Room Entrance: 449 |
| 2679 | Mistreat Panel: 3329 | ||
| 2680 | Nature Panels: 3334 | ||
| 2629 | Nature Room Door: 466 | 2681 | Nature Room Door: 466 |
| 2630 | Nature Room Panels: 467 | 2682 | Nature Room Panels: 467 |
| 2683 | Near Linear Panels: 3324 | ||
| 2631 | Near UC Painting Door: 441 | 2684 | Near UC Painting Door: 441 |
| 2632 | North Landscape Entrance: 456 | 2685 | North Landscape Entrance: 456 |
| 2633 | Pillar Room Entrance: 450 | 2686 | Pillar Room Entrance: 450 |
| @@ -2636,10 +2689,14 @@ maps: | |||
| 2636 | Savory Painting: 452 | 2689 | Savory Painting: 452 |
| 2637 | Spiral Painting: 471 | 2690 | Spiral Painting: 471 |
| 2638 | Talented Entrance: 463 | 2691 | Talented Entrance: 463 |
| 2692 | Teal Panel: 3335 | ||
| 2639 | The Landscapes Gravestone: 458 | 2693 | The Landscapes Gravestone: 458 |
| 2640 | The Maze Gravestone: 460 | 2694 | The Maze Gravestone: 460 |
| 2641 | Tower Entrance: 459 | 2695 | Tower Entrance: 459 |
| 2696 | Tower Panels: 3330 | ||
| 2697 | Tree Panels: 3331 | ||
| 2642 | West/East Divider: 443 | 2698 | West/East Divider: 443 |
| 2699 | Why Is It Not Red: 3325 | ||
| 2643 | Zero Room Panels: 470 | 2700 | Zero Room Panels: 470 |
| 2644 | the_hinterlands: | 2701 | the_hinterlands: |
| 2645 | rooms: | 2702 | rooms: |
| @@ -2732,7 +2789,9 @@ maps: | |||
| 2732 | RIGHT: 683 | 2789 | RIGHT: 683 |
| 2733 | doors: | 2790 | doors: |
| 2734 | Control Center Green Door: 673 | 2791 | Control Center Green Door: 673 |
| 2792 | Control Center Green Panel: 3338 | ||
| 2735 | Front Door: 671 | 2793 | Front Door: 671 |
| 2794 | Green Eye Panels: 3337 | ||
| 2736 | Side Door: 672 | 2795 | Side Door: 672 |
| 2737 | the_invisible: | 2796 | the_invisible: |
| 2738 | rooms: | 2797 | rooms: |
| @@ -2778,6 +2837,7 @@ maps: | |||
| 2778 | J: 2772 | 2837 | J: 2772 |
| 2779 | doors: | 2838 | doors: |
| 2780 | Side Door: 687 | 2839 | Side Door: 687 |
| 2840 | Side Room Puzzles: 3339 | ||
| 2781 | the_keen: | 2841 | the_keen: |
| 2782 | rooms: | 2842 | rooms: |
| 2783 | Main Area: | 2843 | Main Area: |
| @@ -2907,6 +2967,7 @@ maps: | |||
| 2907 | Blue Side Puzzles: 763 | 2967 | Blue Side Puzzles: 763 |
| 2908 | Green Side Puzzles: 764 | 2968 | Green Side Puzzles: 764 |
| 2909 | Main Room Door: 2750 | 2969 | Main Room Door: 2750 |
| 2970 | Stores Panel: 3340 | ||
| 2910 | the_orb: | 2971 | the_orb: |
| 2911 | rooms: | 2972 | rooms: |
| 2912 | B Room: | 2973 | B Room: |
| @@ -2994,12 +3055,22 @@ maps: | |||
| 2994 | Blue Owl: 818 | 3055 | Blue Owl: 818 |
| 2995 | Brush Door: 804 | 3056 | Brush Door: 804 |
| 2996 | Control Center Magenta Door: 812 | 3057 | Control Center Magenta Door: 812 |
| 3058 | Control Center Magenta Panel: 3343 | ||
| 2997 | First Door: 808 | 3059 | First Door: 808 |
| 2998 | First Room Shortcut: 807 | 3060 | First Room Shortcut: 807 |
| 2999 | Gray Bottom Door: 811 | 3061 | Gray Bottom Door: 811 |
| 3000 | Gray Owl: 814 | 3062 | Gray Owl: 814 |
| 3001 | Gray Top Door: 810 | 3063 | Gray Top Door: 810 |
| 3064 | Near Z1 Panel: 3350 | ||
| 3002 | Orange Owl: 815 | 3065 | Orange Owl: 815 |
| 3066 | R1C1 Panels: 3341 | ||
| 3067 | R1C2 Panels: 3342 | ||
| 3068 | R1C3 Panels: 3344 | ||
| 3069 | R1C4 Panels: 3345 | ||
| 3070 | R2C1 Panels: 3346 | ||
| 3071 | R2C2 Panels: 3347 | ||
| 3072 | R2C3 Panels: 3348 | ||
| 3073 | R2C4 Panels: 3349 | ||
| 3003 | Sky Bottom Doors: 806 | 3074 | Sky Bottom Doors: 806 |
| 3004 | Sky Owl: 813 | 3075 | Sky Owl: 813 |
| 3005 | Sky Top Doors: 805 | 3076 | Sky Top Doors: 805 |
| @@ -3028,6 +3099,7 @@ maps: | |||
| 3028 | U: 2777 | 3099 | U: 2777 |
| 3029 | doors: | 3100 | doors: |
| 3030 | K2 Door: 852 | 3101 | K2 Door: 852 |
| 3102 | Lavender Area Puzzles: 3351 | ||
| 3031 | the_partial: | 3103 | the_partial: |
| 3032 | rooms: | 3104 | rooms: |
| 3033 | Control Center Entrance: | 3105 | Control Center Entrance: |
| @@ -3175,6 +3247,10 @@ maps: | |||
| 3175 | TYPIST BEAR RIGHT WING: 968 | 3247 | TYPIST BEAR RIGHT WING: 968 |
| 3176 | WING: 950 | 3248 | WING: 950 |
| 3177 | doors: | 3249 | doors: |
| 3250 | Near Broken Portal Panel: 3355 | ||
| 3251 | Near Repetitive Panel: 3354 | ||
| 3252 | Near Sirenic Panel: 3352 | ||
| 3253 | Near Symbolic Panel: 3353 | ||
| 3178 | Northeast Door: 893 | 3254 | Northeast Door: 893 |
| 3179 | Northeast Puzzles: 897 | 3255 | Northeast Puzzles: 897 |
| 3180 | Northwest Door: 892 | 3256 | Northwest Door: 892 |
| @@ -3391,11 +3467,14 @@ maps: | |||
| 3391 | doors: | 3467 | doors: |
| 3392 | Anti-Collectable: 2812 | 3468 | Anti-Collectable: 2812 |
| 3393 | Anti-Collectable Room: 1025 | 3469 | Anti-Collectable Room: 1025 |
| 3470 | Anti-Collectable Room Panels: 3358 | ||
| 3394 | Black Hallway: 2780 | 3471 | Black Hallway: 2780 |
| 3395 | Cyan Door: 1028 | 3472 | Cyan Door: 1028 |
| 3396 | Cyan Puzzles: 1032 | 3473 | Cyan Puzzles: 1032 |
| 3397 | Dot Area Entrance: 1026 | 3474 | Dot Area Entrance: 1026 |
| 3398 | Entry Entrance: 1023 | 3475 | Entry Entrance: 1023 |
| 3476 | H2 Room Puzzles: 3357 | ||
| 3477 | Hots Panels: 3356 | ||
| 3399 | Lime Door: 1027 | 3478 | Lime Door: 1027 |
| 3400 | Lime Puzzles: 1031 | 3479 | Lime Puzzles: 1031 |
| 3401 | Magenta Door: 1029 | 3480 | Magenta Door: 1029 |
| @@ -3544,6 +3623,7 @@ maps: | |||
| 3544 | doors: | 3623 | doors: |
| 3545 | Entrance: 2995 | 3624 | Entrance: 2995 |
| 3546 | Question Panels: 3017 | 3625 | Question Panels: 3017 |
| 3626 | Welcome Back Panels: 3359 | ||
| 3547 | the_stormy: | 3627 | the_stormy: |
| 3548 | rooms: | 3628 | rooms: |
| 3549 | Center: | 3629 | Center: |
| @@ -3879,6 +3959,7 @@ maps: | |||
| 3879 | doors: | 3959 | doors: |
| 3880 | Black Side Panels: 2427 | 3960 | Black Side Panels: 2427 |
| 3881 | Brown Side Panels: 2428 | 3961 | Brown Side Panels: 2428 |
| 3962 | Keyholder Hint Panel: 3360 | ||
| 3882 | Main Room Door: 2429 | 3963 | Main Room Door: 2429 |
| 3883 | the_tenacious: | 3964 | the_tenacious: |
| 3884 | rooms: | 3965 | rooms: |
| @@ -4188,10 +4269,12 @@ maps: | |||
| 4188 | doors: | 4269 | doors: |
| 4189 | Cog Rhino Hug Rug: 2586 | 4270 | Cog Rhino Hug Rug: 2586 |
| 4190 | Control Center Orange Door: 2582 | 4271 | Control Center Orange Door: 2582 |
| 4272 | Control Center Orange Panel: 3362 | ||
| 4191 | East Door: 2580 | 4273 | East Door: 2580 |
| 4192 | Honor Our Hint: 2585 | 4274 | Honor Our Hint: 2585 |
| 4193 | I Entered: 2845 | 4275 | I Entered: 2845 |
| 4194 | Let Untrue Tie: 2583 | 4276 | Let Untrue Tie: 2583 |
| 4277 | Near Teal Door Panels: 3361 | ||
| 4195 | Routine Out Chute: 2584 | 4278 | Routine Out Chute: 2584 |
| 4196 | W2 Room Door: 2581 | 4279 | W2 Room Door: 2581 |
| 4197 | the_unyielding: | 4280 | the_unyielding: |
| @@ -4441,7 +4524,9 @@ maps: | |||
| 4441 | HEALTH: 1428 | 4524 | HEALTH: 1428 |
| 4442 | doors: | 4525 | doors: |
| 4443 | Bearer Entrance: 1259 | 4526 | Bearer Entrance: 1259 |
| 4527 | Blue D Room Puzzles: 3363 | ||
| 4444 | Brown Alcove: 1255 | 4528 | Brown Alcove: 1255 |
| 4529 | Color Hallway Panels: 3364 | ||
| 4445 | Digital Entrance: 1257 | 4530 | Digital Entrance: 1257 |
| 4446 | East Room 1: 2740 | 4531 | East Room 1: 2740 |
| 4447 | East Room 1 Entrance: 1251 | 4532 | East Room 1 Entrance: 1251 |
| diff --git a/data/maps/control_center/doors.txtpb b/data/maps/control_center/doors.txtpb index 1422301..bec8714 100644 --- a/data/maps/control_center/doors.txtpb +++ b/data/maps/control_center/doors.txtpb | |||
| @@ -165,3 +165,16 @@ doors { | |||
| 165 | panels { room: "Unyielding Entrance" name: "SEEK" } | 165 | panels { room: "Unyielding Entrance" name: "SEEK" } |
| 166 | location_room: "Unyielding Entrance" | 166 | location_room: "Unyielding Entrance" |
| 167 | } | 167 | } |
| 168 | doors { | ||
| 169 | name: "Near Perceptive Panel" | ||
| 170 | type: LOCATION_ONLY | ||
| 171 | panels { room: "Perceptive Entrance" name: "COLORS" } | ||
| 172 | location_room: "Perceptive Entrance" | ||
| 173 | location_name: "COLORS" | ||
| 174 | } | ||
| 175 | doors { | ||
| 176 | name: "Letters Panel" | ||
| 177 | type: LOCATION_ONLY | ||
| 178 | panels { room: "Main Area" name: "Letters" } | ||
| 179 | location_room: "Main Area" | ||
| 180 | } | ||
| diff --git a/data/maps/daedalus/doors.txtpb b/data/maps/daedalus/doors.txtpb index de6971e..ed7516f 100644 --- a/data/maps/daedalus/doors.txtpb +++ b/data/maps/daedalus/doors.txtpb | |||
| @@ -188,10 +188,12 @@ doors { | |||
| 188 | } | 188 | } |
| 189 | doors { | 189 | doors { |
| 190 | name: "Welcome Back Secret Door" | 190 | name: "Welcome Back Secret Door" |
| 191 | type: ITEM_ONLY | 191 | type: STANDARD |
| 192 | receivers: "Components/Doors/Entry/entry_13" | 192 | receivers: "Components/Doors/Entry/entry_13" |
| 193 | panels { room: "Welcome Back Area" name: "FAREWELL LITTLE LAMB" } | 193 | panels { room: "Welcome Back Area" name: "FAREWELL LITTLE LAMB" } |
| 194 | panels { room: "West Spire" name: "BYE" } | 194 | panels { room: "West Spire" name: "BYE" } |
| 195 | location_room: "West Spire" | ||
| 196 | location_name: "BYE, FAREWELL LITTLE LAMB" | ||
| 195 | } | 197 | } |
| 196 | doors { | 198 | doors { |
| 197 | name: "Welcome Back Door" | 199 | name: "Welcome Back Door" |
| @@ -225,12 +227,21 @@ doors { | |||
| 225 | } | 227 | } |
| 226 | doors { | 228 | doors { |
| 227 | name: "Starting Room East Wall Center Door" | 229 | name: "Starting Room East Wall Center Door" |
| 228 | type: STANDARD | 230 | type: ITEM_ONLY |
| 231 | legacy_location: true | ||
| 229 | receivers: "Components/Doors/Entry/entry_6" | 232 | receivers: "Components/Doors/Entry/entry_6" |
| 230 | panels { room: "Rainbow Color Backside" name: "?" } | 233 | panels { room: "Rainbow Color Backside" name: "?" } |
| 231 | location_room: "Rainbow Color Backside" | 234 | location_room: "Rainbow Color Backside" |
| 232 | } | 235 | } |
| 233 | doors { | 236 | doors { |
| 237 | name: "Rainbow Color Backside Panels" | ||
| 238 | type: LOCATION_ONLY | ||
| 239 | panels { room: "Rainbow Color Backside" name: "?" } | ||
| 240 | panels { room: "Rainbow Color Backside" name: "BACKSIDE" } | ||
| 241 | location_room: "Rainbow Color Backside" | ||
| 242 | location_name: "BACKSIDE, ?" | ||
| 243 | } | ||
| 244 | doors { | ||
| 234 | name: "Starting Room East Wall North Door" | 245 | name: "Starting Room East Wall North Door" |
| 235 | type: ITEM_ONLY | 246 | type: ITEM_ONLY |
| 236 | receivers: "Components/Doors/Entry/entry_7" | 247 | receivers: "Components/Doors/Entry/entry_7" |
| @@ -300,7 +311,8 @@ doors { | |||
| 300 | } | 311 | } |
| 301 | doors { | 312 | doors { |
| 302 | name: "Splintering Exit North Door" | 313 | name: "Splintering Exit North Door" |
| 303 | type: STANDARD | 314 | type: ITEM_ONLY |
| 315 | legacy_location: true | ||
| 304 | receivers: "Components/Doors/Entry/gate_4" | 316 | receivers: "Components/Doors/Entry/gate_4" |
| 305 | panels { room: "West Castle Area" name: "EVER" } | 317 | panels { room: "West Castle Area" name: "EVER" } |
| 306 | panels { room: "West Castle Area" name: "AXES" } | 318 | panels { room: "West Castle Area" name: "AXES" } |
| @@ -318,6 +330,48 @@ doors { | |||
| 318 | panels { room: "West Castle Area" name: "SLOT" } | 330 | panels { room: "West Castle Area" name: "SLOT" } |
| 319 | } | 331 | } |
| 320 | doors { | 332 | doors { |
| 333 | name: "Splintering Area Panels" | ||
| 334 | type: LOCATION_ONLY | ||
| 335 | panels { room: "West Castle Area" name: "EVER" } | ||
| 336 | panels { room: "West Castle Area" name: "AXES" } | ||
| 337 | panels { room: "West Castle Area" name: "FLIP (1)" } | ||
| 338 | panels { room: "West Castle Area" name: "SLOT" } | ||
| 339 | panels { room: "West Castle Area" name: "WICKEDLY" } | ||
| 340 | panels { room: "West Castle Area" name: "CATHOLIC" } | ||
| 341 | panels { room: "West Castle Area" name: "SISTERLY" } | ||
| 342 | panels { room: "West Castle Area" name: "SQUEALED" } | ||
| 343 | panels { room: "West Castle Area" name: "READ" } | ||
| 344 | panels { room: "West Castle Area" name: "WORD" } | ||
| 345 | panels { room: "West Castle Area" name: "EACH" } | ||
| 346 | panels { room: "West Castle Area" name: "RANK" } | ||
| 347 | panels { room: "West Castle Area" name: "TEAR" } | ||
| 348 | panels { room: "West Castle Area" name: "SHUT" } | ||
| 349 | panels { room: "West Castle Area" name: "FLIP (2)" } | ||
| 350 | panels { room: "West Castle Area" name: "STUN" } | ||
| 351 | panels { room: "West Castle Area" name: "CHAT" } | ||
| 352 | panels { room: "West Castle Area" name: "LOST" } | ||
| 353 | panels { room: "West Castle Area" name: "PODS" } | ||
| 354 | panels { room: "West Castle Area" name: "FAME" } | ||
| 355 | location_room: "West Castle Area" | ||
| 356 | } | ||
| 357 | doors { | ||
| 358 | name: "West Sticks And Stones Panel" | ||
| 359 | type: LOCATION_ONLY | ||
| 360 | panels { room: "West Castle Area" name: "LETTERS" } | ||
| 361 | location_room: "West Castle Area" | ||
| 362 | location_name: "LETTERS" | ||
| 363 | } | ||
| 364 | doors { | ||
| 365 | name: "Amber Room Panels" | ||
| 366 | type: LOCATION_ONLY | ||
| 367 | panels { room: "West Castle Area" name: "HARMONY" } | ||
| 368 | panels { room: "West Castle Area" name: "MELODY" } | ||
| 369 | panels { room: "West Castle Area" name: "RHYTHM" } | ||
| 370 | panels { room: "West Castle Area" name: "TEXTURE" } | ||
| 371 | location_room: "West Castle Area" | ||
| 372 | location_name: "HARMONY, MELODY, RHYTHM, TEXTURE" | ||
| 373 | } | ||
| 374 | doors { | ||
| 321 | name: "Z2 Room Back Exit" | 375 | name: "Z2 Room Back Exit" |
| 322 | type: ITEM_ONLY | 376 | type: ITEM_ONLY |
| 323 | receivers: "Components/Doors/Entry/gate_2" | 377 | receivers: "Components/Doors/Entry/gate_2" |
| @@ -820,12 +874,23 @@ doors { | |||
| 820 | } | 874 | } |
| 821 | doors { | 875 | doors { |
| 822 | name: "Composite Room NW Entrance" | 876 | name: "Composite Room NW Entrance" |
| 823 | type: STANDARD | 877 | type: ITEM_ONLY |
| 878 | legacy_location: true | ||
| 824 | receivers: "Components/Doors/Halls/oroom_10" | 879 | receivers: "Components/Doors/Halls/oroom_10" |
| 825 | panels { room: "Red Color Door" name: "Near Obscured Puzzles" } | 880 | panels { room: "Red Color Door" name: "Near Obscured Puzzles" } |
| 826 | location_room: "Red Color Door" | 881 | location_room: "Red Color Door" |
| 827 | } | 882 | } |
| 828 | doors { | 883 | doors { |
| 884 | name: "Yellow Roof Puzzles" | ||
| 885 | type: LOCATION_ONLY | ||
| 886 | panels { room: "Red Color Door" name: "BACKSIDE" } | ||
| 887 | panels { room: "Red Color Door" name: "WALK BACK" } | ||
| 888 | panels { room: "Red Color Door" name: "Back (1)" } | ||
| 889 | panels { room: "Red Color Door" name: "Back (2)" } | ||
| 890 | panels { room: "Red Color Door" name: "Near Obscured Puzzles" } | ||
| 891 | location_room: "Red Color Door" | ||
| 892 | } | ||
| 893 | doors { | ||
| 829 | name: "Composite Room South Door" | 894 | name: "Composite Room South Door" |
| 830 | type: LOCATION_ONLY | 895 | type: LOCATION_ONLY |
| 831 | #receivers: "Components/Doors/Halls/oroom_9" | 896 | #receivers: "Components/Doors/Halls/oroom_9" |
| @@ -886,7 +951,8 @@ doors { | |||
| 886 | } | 951 | } |
| 887 | doors { | 952 | doors { |
| 888 | name: "F2 Room Southeast Door" | 953 | name: "F2 Room Southeast Door" |
| 889 | type: STANDARD | 954 | type: ITEM_ONLY |
| 955 | legacy_location: true | ||
| 890 | receivers: "Components/Doors/Halls/froom_2" | 956 | receivers: "Components/Doors/Halls/froom_2" |
| 891 | panels { room: "Sweet Foyer" name: "RENT (1)" } | 957 | panels { room: "Sweet Foyer" name: "RENT (1)" } |
| 892 | location_room: "Sweet Foyer" | 958 | location_room: "Sweet Foyer" |
| @@ -1391,6 +1457,9 @@ doors { | |||
| 1391 | receivers: "Meshes/Stairs/staircase31/teleportListener" | 1457 | receivers: "Meshes/Stairs/staircase31/teleportListener" |
| 1392 | receivers: "Meshes/Stairs/staircase32/teleportListener2" | 1458 | receivers: "Meshes/Stairs/staircase32/teleportListener2" |
| 1393 | receivers: "Meshes/Stairs/staircase33/teleportListener3" | 1459 | receivers: "Meshes/Stairs/staircase33/teleportListener3" |
| 1460 | receivers: "Panels/Castle Entrance/castle_direction_1/teleportListener" | ||
| 1461 | receivers: "Panels/Castle Entrance/castle_direction_2/teleportListener" | ||
| 1462 | receivers: "Panels/Castle Entrance/castle_direction_3/teleportListener" | ||
| 1394 | panels { room: "North Castle Area" name: "A SUMMER PLACE" } | 1463 | panels { room: "North Castle Area" name: "A SUMMER PLACE" } |
| 1395 | panels { room: "West Castle Area" name: "SONG FACE" } | 1464 | panels { room: "West Castle Area" name: "SONG FACE" } |
| 1396 | panels { room: "South Castle Area" name: "AN OFFER VILLAGE BEFORE LAIR" } | 1465 | panels { room: "South Castle Area" name: "AN OFFER VILLAGE BEFORE LAIR" } |
| @@ -1768,12 +1837,37 @@ doors { | |||
| 1768 | } | 1837 | } |
| 1769 | doors { | 1838 | doors { |
| 1770 | name: "Near Sweet Brown Door" | 1839 | name: "Near Sweet Brown Door" |
| 1771 | type: STANDARD | 1840 | type: ITEM_ONLY |
| 1841 | legacy_location: true | ||
| 1772 | receivers: "Components/Doors/Halls 2/halls_2" | 1842 | receivers: "Components/Doors/Halls 2/halls_2" |
| 1773 | panels { room: "Sweet Foyer" name: "RENT (4)" } | 1843 | panels { room: "Sweet Foyer" name: "RENT (4)" } |
| 1774 | location_room: "Sweet Foyer" | 1844 | location_room: "Sweet Foyer" |
| 1775 | } | 1845 | } |
| 1776 | doors { | 1846 | doors { |
| 1847 | name: "Rent Panels" | ||
| 1848 | type: LOCATION_ONLY | ||
| 1849 | panels { room: "Sweet Foyer" name: "RENT (1)" } | ||
| 1850 | panels { room: "Sweet Foyer" name: "RENT (2)" } | ||
| 1851 | panels { room: "Sweet Foyer" name: "RENT (3)" } | ||
| 1852 | panels { room: "Sweet Foyer" name: "RENT (4)" } | ||
| 1853 | location_room: "Sweet Foyer" | ||
| 1854 | } | ||
| 1855 | doors { | ||
| 1856 | name: "Equality Panels" | ||
| 1857 | type: LOCATION_ONLY | ||
| 1858 | panels { room: "Sweet Foyer" name: "EQUAL" } | ||
| 1859 | panels { room: "Sweet Foyer" name: "QUALITY" } | ||
| 1860 | location_room: "Sweet Foyer" | ||
| 1861 | location_name: "EQUAL, QUALITY" | ||
| 1862 | } | ||
| 1863 | doors { | ||
| 1864 | name: "Orange Panels" | ||
| 1865 | type: LOCATION_ONLY | ||
| 1866 | panels { room: "Blue Smiley Annex" name: "ORANGE (1)" } | ||
| 1867 | panels { room: "Blue Smiley Annex" name: "ORANGE (2)" } | ||
| 1868 | location_room: "Blue Smiley Annex" | ||
| 1869 | } | ||
| 1870 | doors { | ||
| 1777 | name: "Red Room Entrance" | 1871 | name: "Red Room Entrance" |
| 1778 | type: STANDARD | 1872 | type: STANDARD |
| 1779 | receivers: "Components/Doors/Halls 2/halls_3" | 1873 | receivers: "Components/Doors/Halls 2/halls_3" |
| @@ -1928,7 +2022,7 @@ doors { | |||
| 1928 | panels { room: "Gray Color Backside" name: "LAST" } | 2022 | panels { room: "Gray Color Backside" name: "LAST" } |
| 1929 | panels { room: "Gray Color Backside" name: "RISE" } | 2023 | panels { room: "Gray Color Backside" name: "RISE" } |
| 1930 | location_room: "Gray Color Backside" | 2024 | location_room: "Gray Color Backside" |
| 1931 | location_name: "Light Green Hex" | 2025 | location_name: "Pale Green Hex" |
| 1932 | } | 2026 | } |
| 1933 | doors { | 2027 | doors { |
| 1934 | name: "South Castle Area Back Door" | 2028 | name: "South Castle Area Back Door" |
| @@ -2304,3 +2398,74 @@ doors { | |||
| 2304 | location_room: "House" | 2398 | location_room: "House" |
| 2305 | location_name: "All Puzzles" | 2399 | location_name: "All Puzzles" |
| 2306 | } | 2400 | } |
| 2401 | doors { | ||
| 2402 | name: "West Spire Panel" | ||
| 2403 | type: LOCATION_ONLY | ||
| 2404 | panels { room: "West Spire" name: "MISSING" } | ||
| 2405 | location_room: "West Spire" | ||
| 2406 | location_name: "MISSING" | ||
| 2407 | } | ||
| 2408 | doors { | ||
| 2409 | name: "Tree Panels" | ||
| 2410 | type: LOCATION_ONLY | ||
| 2411 | panels { room: "Red Color Door" name: "FIR" } | ||
| 2412 | panels { room: "Red Color Door" name: "OAK" } | ||
| 2413 | panels { room: "Red Color Door" name: "PINE" } | ||
| 2414 | panels { room: "Red Color Door" name: "ASH" } | ||
| 2415 | location_room: "Red Color Door" | ||
| 2416 | location_name: "ASH, FIR, OAK, PINE" | ||
| 2417 | } | ||
| 2418 | doors { | ||
| 2419 | name: "Teal Panel" | ||
| 2420 | type: LOCATION_ONLY | ||
| 2421 | panels { room: "Outside Book Room" name: "TEAL" } | ||
| 2422 | location_room: "Outside Book Room" | ||
| 2423 | location_name: "TEAL" | ||
| 2424 | } | ||
| 2425 | doors { | ||
| 2426 | name: "Direction Panels" | ||
| 2427 | type: LOCATION_ONLY | ||
| 2428 | panels { room: "Rainbow Color Doors" name: "DIRECTION (1)" } | ||
| 2429 | panels { room: "Rainbow Color Doors" name: "DIRECTION (2)" } | ||
| 2430 | panels { room: "Rainbow Color Doors" name: "DIRECTION (3)" } | ||
| 2431 | location_room: "Rainbow Color Doors" | ||
| 2432 | } | ||
| 2433 | doors { | ||
| 2434 | name: "Nursery Panels" | ||
| 2435 | type: LOCATION_ONLY | ||
| 2436 | panels { room: "Nursery" name: "Paintings" } | ||
| 2437 | panels { room: "Nursery" name: "?" } | ||
| 2438 | location_room: "Nursery" | ||
| 2439 | location_name: "Paintings, ?" | ||
| 2440 | } | ||
| 2441 | doors { | ||
| 2442 | name: "Near H Keyholder Panel" | ||
| 2443 | type: LOCATION_ONLY | ||
| 2444 | panels { room: "Outside House" name: "SILENCE" } | ||
| 2445 | location_room: "Outside House" | ||
| 2446 | location_name: "SILENCE" | ||
| 2447 | } | ||
| 2448 | doors { | ||
| 2449 | name: "Plum Panels" | ||
| 2450 | type: LOCATION_ONLY | ||
| 2451 | panels { room: "Outside Hedges" name: "PLUM (1)" } | ||
| 2452 | panels { room: "Outside Hedges" name: "PLUM (2)" } | ||
| 2453 | location_room: "Outside Hedges" | ||
| 2454 | } | ||
| 2455 | doors { | ||
| 2456 | name: "Yellow Smiley Annex Panels" | ||
| 2457 | type: LOCATION_ONLY | ||
| 2458 | panels { room: "Yellow Smiley Annex" name: "BELL" } | ||
| 2459 | panels { room: "Yellow Smiley Annex" name: "COW" } | ||
| 2460 | location_room: "Yellow Smiley Annex" | ||
| 2461 | location_name: "BELL, COW" | ||
| 2462 | } | ||
| 2463 | doors { | ||
| 2464 | name: "Farewell Little Lamb Panels" | ||
| 2465 | type: LOCATION_ONLY | ||
| 2466 | panels { room: "Purple Room South" name: "FAREWELL" } | ||
| 2467 | panels { room: "Purple Room South" name: "LITTLE" } | ||
| 2468 | panels { room: "Purple Room South" name: "LAMB" } | ||
| 2469 | location_room: "Purple Room South" | ||
| 2470 | location_name: "FAREWELL, LITTLE, LAMB" | ||
| 2471 | } | ||
| diff --git a/data/maps/the_bearer/doors.txtpb b/data/maps/the_bearer/doors.txtpb index 1893455..acbf86a 100644 --- a/data/maps/the_bearer/doors.txtpb +++ b/data/maps/the_bearer/doors.txtpb | |||
| @@ -251,3 +251,18 @@ doors { | |||
| 251 | receivers: "Components/Doors/brown_2" | 251 | receivers: "Components/Doors/brown_2" |
| 252 | double_letters: true | 252 | double_letters: true |
| 253 | } | 253 | } |
| 254 | doors { | ||
| 255 | name: "Control Center Color Panel" | ||
| 256 | type: LOCATION_ONLY | ||
| 257 | panels { room: "Back Area" name: "COLOR" } | ||
| 258 | location_room: "Back Area" | ||
| 259 | location_name: "COLOR" | ||
| 260 | } | ||
| 261 | doors { | ||
| 262 | name: "Butterfly Room Panels" | ||
| 263 | type: LOCATION_ONLY | ||
| 264 | panels { room: "Butterfly Room" name: "DARKNESS" } | ||
| 265 | panels { room: "Butterfly Room" name: "VIBRANT" } | ||
| 266 | location_room: "Butterfly Room" | ||
| 267 | location_name: "DARKNESS, VIBRANT" | ||
| 268 | } | ||
| diff --git a/data/maps/the_colorful/doors.txtpb b/data/maps/the_colorful/doors.txtpb index 4785cf2..3ce5f71 100644 --- a/data/maps/the_colorful/doors.txtpb +++ b/data/maps/the_colorful/doors.txtpb | |||
| @@ -103,3 +103,10 @@ doors { | |||
| 103 | panels { room: "Gray Room" name: "MEND" } | 103 | panels { room: "Gray Room" name: "MEND" } |
| 104 | location_room: "Gray Room" | 104 | location_room: "Gray Room" |
| 105 | } | 105 | } |
| 106 | doors { | ||
| 107 | name: "Chaos Panel" | ||
| 108 | type: LOCATION_ONLY | ||
| 109 | panels { room: "Cyan Hallway" name: "CHAOS" } | ||
| 110 | location_room: "Cyan Hallway" | ||
| 111 | location_name: "CHAOS" | ||
| 112 | } | ||
| diff --git a/data/maps/the_congruent/doors.txtpb b/data/maps/the_congruent/doors.txtpb index a714eba..fab8d95 100644 --- a/data/maps/the_congruent/doors.txtpb +++ b/data/maps/the_congruent/doors.txtpb | |||
| @@ -1,12 +1,22 @@ | |||
| 1 | doors { | 1 | doors { |
| 2 | name: "Obverse Magenta Door" | 2 | name: "Obverse Magenta Door" |
| 3 | type: STANDARD | 3 | type: ITEM_ONLY |
| 4 | legacy_location: true | ||
| 4 | receivers: "Components/Doors/magenta_enterer2" | 5 | receivers: "Components/Doors/magenta_enterer2" |
| 5 | panels { room: "Main Area" name: "LAKE" } | 6 | panels { room: "Main Area" name: "LAKE" } |
| 6 | panels { room: "Main Area" name: "DIE" } | 7 | panels { room: "Main Area" name: "DIE" } |
| 7 | location_room: "Main Area" | 8 | location_room: "Main Area" |
| 8 | } | 9 | } |
| 9 | doors { | 10 | doors { |
| 11 | name: "Main Area Puzzles" | ||
| 12 | type: LOCATION_ONLY | ||
| 13 | panels { room: "Main Area" name: "LAKE" } | ||
| 14 | panels { room: "Main Area" name: "DIE" } | ||
| 15 | panels { room: "Main Area" name: "LIGHT" } | ||
| 16 | location_room: "Main Area" | ||
| 17 | location_name: "DIE, LAKE, LIGHT" | ||
| 18 | } | ||
| 19 | doors { | ||
| 10 | name: "Flipped Magenta Door" | 20 | name: "Flipped Magenta Door" |
| 11 | type: STANDARD | 21 | type: STANDARD |
| 12 | receivers: "Components/Doors/magenta_enterer" | 22 | receivers: "Components/Doors/magenta_enterer" |
| diff --git a/data/maps/the_crystalline/connections.txtpb b/data/maps/the_crystalline/connections.txtpb index 4134d12..131335a 100644 --- a/data/maps/the_crystalline/connections.txtpb +++ b/data/maps/the_crystalline/connections.txtpb | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | connections { | 1 | connections { |
| 2 | from_room: "Main Area" | 2 | from_room: "Main Area" |
| 3 | to_room: "Painting Divot" | 3 | to_room: "Painting Divot" |
| 4 | door { name: "Checkpoint Panels" } | ||
| 4 | oneway: true | 5 | oneway: true |
| 5 | } | 6 | } |
| 6 | connections { | 7 | connections { |
| diff --git a/data/maps/the_crystalline/doors.txtpb b/data/maps/the_crystalline/doors.txtpb index 024752a..5930463 100644 --- a/data/maps/the_crystalline/doors.txtpb +++ b/data/maps/the_crystalline/doors.txtpb | |||
| @@ -3,3 +3,12 @@ doors { | |||
| 3 | type: EVENT | 3 | type: EVENT |
| 4 | panels { room: "Flip Area" name: "SUCCEED" } | 4 | panels { room: "Flip Area" name: "SUCCEED" } |
| 5 | } | 5 | } |
| 6 | doors { | ||
| 7 | name: "Checkpoint Panels" | ||
| 8 | type: LOCATION_ONLY | ||
| 9 | panels { room: "Main Area" name: "DROP" } | ||
| 10 | panels { room: "Main Area" name: "LEAP" } | ||
| 11 | panels { room: "Main Area" name: "SPIN" } | ||
| 12 | location_room: "Main Area" | ||
| 13 | location_name: "DROP, LEAP, SPIN" | ||
| 14 | } | ||
| diff --git a/data/maps/the_digital/doors.txtpb b/data/maps/the_digital/doors.txtpb index 35cfa81..6c56c86 100644 --- a/data/maps/the_digital/doors.txtpb +++ b/data/maps/the_digital/doors.txtpb | |||
| @@ -53,3 +53,10 @@ doors { | |||
| 53 | panels { room: "Tree Area" name: "TREE" } | 53 | panels { room: "Tree Area" name: "TREE" } |
| 54 | location_room: "Tree Area" | 54 | location_room: "Tree Area" |
| 55 | } | 55 | } |
| 56 | doors { | ||
| 57 | name: "Control Center Blue Panel" | ||
| 58 | type: LOCATION_ONLY | ||
| 59 | panels { room: "Main Area" name: "COLOR" } | ||
| 60 | location_room: "Main Area" | ||
| 61 | location_name: "COLOR" | ||
| 62 | } | ||
| diff --git a/data/maps/the_double_sided/doors.txtpb b/data/maps/the_double_sided/doors.txtpb index 02b113a..1ae4324 100644 --- a/data/maps/the_double_sided/doors.txtpb +++ b/data/maps/the_double_sided/doors.txtpb | |||
| @@ -113,3 +113,82 @@ doors { | |||
| 113 | # The panel blocks your way; there's no door. | 113 | # The panel blocks your way; there's no door. |
| 114 | panels { room: "Flipped Black Area" name: "SEAPLANE" } | 114 | panels { room: "Flipped Black Area" name: "SEAPLANE" } |
| 115 | } | 115 | } |
| 116 | # These locations are kind of deranged but hey. Welcome to The Double Sided. | ||
| 117 | doors { | ||
| 118 | name: "5 Panels" | ||
| 119 | type: LOCATION_ONLY | ||
| 120 | panels { room: "Flipped Black Area" name: "SEAPLANE" } | ||
| 121 | panels { room: "Flipped Blue Area" name: "SKY" } | ||
| 122 | panels { room: "Flipped Blue Area" name: "HEAD" } | ||
| 123 | panels { room: "Flipped Green Area" name: "HIGH" } | ||
| 124 | panels { room: "Flipped Orange Area" name: "HEAVEN" } | ||
| 125 | panels { room: "Flipped Purple Area" name: "CEILING" } | ||
| 126 | panels { room: "Flipped Purple Area" name: "LEAVES" } | ||
| 127 | panels { room: "Flipped Red Area" name: "RAISED" } | ||
| 128 | panels { room: "Flipped Yellow Back Area" name: "ANGELS" } | ||
| 129 | panels { room: "Obverse Black Area" name: "MOUNTAIN" } | ||
| 130 | panels { room: "Obverse Black Area" name: "TRAIN" } | ||
| 131 | panels { room: "Obverse Green Area" name: "UPSIDE" } | ||
| 132 | panels { room: "Obverse Orange Back Area" name: "OVER" } | ||
| 133 | panels { room: "Obverse Orange Front Area" name: "UP" } | ||
| 134 | panels { room: "Obverse Orange Isolated Section" name: "TOP" } | ||
| 135 | panels { room: "Obverse Pink Area" name: "CLOUD" } | ||
| 136 | panels { room: "Obverse Purple Area" name: "DRAGON" } | ||
| 137 | panels { room: "Obverse Purple Area" name: "ABOVE" } | ||
| 138 | panels { room: "Start" name: "ATTIC" } | ||
| 139 | panels { room: "Start" name: "FULL" } | ||
| 140 | location_room: "Start" | ||
| 141 | complete_at: 5 | ||
| 142 | } | ||
| 143 | doors { | ||
| 144 | name: "10 Panels" | ||
| 145 | type: LOCATION_ONLY | ||
| 146 | panels { room: "Flipped Black Area" name: "SEAPLANE" } | ||
| 147 | panels { room: "Flipped Blue Area" name: "SKY" } | ||
| 148 | panels { room: "Flipped Blue Area" name: "HEAD" } | ||
| 149 | panels { room: "Flipped Green Area" name: "HIGH" } | ||
| 150 | panels { room: "Flipped Orange Area" name: "HEAVEN" } | ||
| 151 | panels { room: "Flipped Purple Area" name: "CEILING" } | ||
| 152 | panels { room: "Flipped Purple Area" name: "LEAVES" } | ||
| 153 | panels { room: "Flipped Red Area" name: "RAISED" } | ||
| 154 | panels { room: "Flipped Yellow Back Area" name: "ANGELS" } | ||
| 155 | panels { room: "Obverse Black Area" name: "MOUNTAIN" } | ||
| 156 | panels { room: "Obverse Black Area" name: "TRAIN" } | ||
| 157 | panels { room: "Obverse Green Area" name: "UPSIDE" } | ||
| 158 | panels { room: "Obverse Orange Back Area" name: "OVER" } | ||
| 159 | panels { room: "Obverse Orange Front Area" name: "UP" } | ||
| 160 | panels { room: "Obverse Orange Isolated Section" name: "TOP" } | ||
| 161 | panels { room: "Obverse Pink Area" name: "CLOUD" } | ||
| 162 | panels { room: "Obverse Purple Area" name: "DRAGON" } | ||
| 163 | panels { room: "Obverse Purple Area" name: "ABOVE" } | ||
| 164 | panels { room: "Start" name: "ATTIC" } | ||
| 165 | panels { room: "Start" name: "FULL" } | ||
| 166 | location_room: "Start" | ||
| 167 | complete_at: 10 | ||
| 168 | } | ||
| 169 | doors { | ||
| 170 | name: "15 Panels" | ||
| 171 | type: LOCATION_ONLY | ||
| 172 | panels { room: "Flipped Black Area" name: "SEAPLANE" } | ||
| 173 | panels { room: "Flipped Blue Area" name: "SKY" } | ||
| 174 | panels { room: "Flipped Blue Area" name: "HEAD" } | ||
| 175 | panels { room: "Flipped Green Area" name: "HIGH" } | ||
| 176 | panels { room: "Flipped Orange Area" name: "HEAVEN" } | ||
| 177 | panels { room: "Flipped Purple Area" name: "CEILING" } | ||
| 178 | panels { room: "Flipped Purple Area" name: "LEAVES" } | ||
| 179 | panels { room: "Flipped Red Area" name: "RAISED" } | ||
| 180 | panels { room: "Flipped Yellow Back Area" name: "ANGELS" } | ||
| 181 | panels { room: "Obverse Black Area" name: "MOUNTAIN" } | ||
| 182 | panels { room: "Obverse Black Area" name: "TRAIN" } | ||
| 183 | panels { room: "Obverse Green Area" name: "UPSIDE" } | ||
| 184 | panels { room: "Obverse Orange Back Area" name: "OVER" } | ||
| 185 | panels { room: "Obverse Orange Front Area" name: "UP" } | ||
| 186 | panels { room: "Obverse Orange Isolated Section" name: "TOP" } | ||
| 187 | panels { room: "Obverse Pink Area" name: "CLOUD" } | ||
| 188 | panels { room: "Obverse Purple Area" name: "DRAGON" } | ||
| 189 | panels { room: "Obverse Purple Area" name: "ABOVE" } | ||
| 190 | panels { room: "Start" name: "ATTIC" } | ||
| 191 | panels { room: "Start" name: "FULL" } | ||
| 192 | location_room: "Start" | ||
| 193 | complete_at: 15 | ||
| 194 | } | ||
| diff --git a/data/maps/the_entry/doors.txtpb b/data/maps/the_entry/doors.txtpb index 5bc6f57..3f62338 100644 --- a/data/maps/the_entry/doors.txtpb +++ b/data/maps/the_entry/doors.txtpb | |||
| @@ -69,20 +69,40 @@ doors { | |||
| 69 | # second_right is vanilla because it's like LOST door. | 69 | # second_right is vanilla because it's like LOST door. |
| 70 | doors { | 70 | doors { |
| 71 | name: "Noon Door" | 71 | name: "Noon Door" |
| 72 | type: STANDARD | 72 | type: ITEM_ONLY |
| 73 | legacy_location: true | ||
| 73 | receivers: "Components/Doors/second_right5" | 74 | receivers: "Components/Doors/second_right5" |
| 74 | receivers: "Components/Doors/second_right10" | 75 | receivers: "Components/Doors/second_right10" |
| 75 | panels { room: "Red Blue Halls" name: "CENTER DAY" } | 76 | panels { room: "Red Blue Halls" name: "CENTER DAY" } |
| 76 | location_room: "Red Blue Halls" | 77 | location_room: "Red Blue Halls" |
| 77 | } | 78 | } |
| 78 | doors { | 79 | doors { |
| 80 | name: "Noon Door Panels" | ||
| 81 | type: LOCATION_ONLY | ||
| 82 | panels { room: "Red Blue Halls" name: "CENTER" } | ||
| 83 | panels { room: "Red Blue Halls" name: "DAY" } | ||
| 84 | panels { room: "Red Blue Halls" name: "CENTER DAY" } | ||
| 85 | location_room: "Red Blue Halls" | ||
| 86 | location_name: "CENTER, DAY, CENTER DAY" | ||
| 87 | } | ||
| 88 | doors { | ||
| 79 | name: "Scarf Door" | 89 | name: "Scarf Door" |
| 80 | type: STANDARD | 90 | type: ITEM_ONLY |
| 91 | legacy_location: true | ||
| 81 | receivers: "Components/Doors/second_right6" | 92 | receivers: "Components/Doors/second_right6" |
| 82 | panels { room: "Red Blue Halls" name: "RAIN WOMAN" } | 93 | panels { room: "Red Blue Halls" name: "RAIN WOMAN" } |
| 83 | location_room: "Red Blue Halls" | 94 | location_room: "Red Blue Halls" |
| 84 | } | 95 | } |
| 85 | doors { | 96 | doors { |
| 97 | name: "Scarf Door Panels" | ||
| 98 | type: LOCATION_ONLY | ||
| 99 | panels { room: "Red Blue Halls" name: "RAIN" } | ||
| 100 | panels { room: "Red Blue Halls" name: "WOMAN" } | ||
| 101 | panels { room: "Red Blue Halls" name: "RAIN WOMAN" } | ||
| 102 | location_room: "Red Blue Halls" | ||
| 103 | location_name: "RAIN, WOMAN, RAIN WOMAN" | ||
| 104 | } | ||
| 105 | doors { | ||
| 86 | name: "Blue Alcove Entrance" | 106 | name: "Blue Alcove Entrance" |
| 87 | type: STANDARD | 107 | type: STANDARD |
| 88 | receivers: "Components/Doors/second_right9" | 108 | receivers: "Components/Doors/second_right9" |
| @@ -119,7 +139,8 @@ doors { | |||
| 119 | } | 139 | } |
| 120 | doors { | 140 | doors { |
| 121 | name: "Red Blue Area Left Door" | 141 | name: "Red Blue Area Left Door" |
| 122 | type: STANDARD | 142 | type: ITEM_ONLY |
| 143 | legacy_location: true | ||
| 123 | receivers: "Components/Doors/fourth_right" | 144 | receivers: "Components/Doors/fourth_right" |
| 124 | panels { room: "Right Eye" name: "WANDER" } | 145 | panels { room: "Right Eye" name: "WANDER" } |
| 125 | location_room: "Right Eye" | 146 | location_room: "Right Eye" |
| @@ -131,6 +152,31 @@ doors { | |||
| 131 | panels { room: "Right Eye" name: "WANDER" } | 152 | panels { room: "Right Eye" name: "WANDER" } |
| 132 | location_room: "Right Eye" | 153 | location_room: "Right Eye" |
| 133 | } | 154 | } |
| 155 | doors { | ||
| 156 | name: "Wander Panels" | ||
| 157 | type: LOCATION_ONLY | ||
| 158 | panels { room: "Right Eye" name: "WANDER" } | ||
| 159 | panels { room: "Red Blue Halls" name: "WANDER" } | ||
| 160 | panels { room: "Link Area" name: "WANDER" } | ||
| 161 | panels { room: "Flipped Link Area" name: "WANDER" } | ||
| 162 | location_room: "Flipped Link Area" | ||
| 163 | } | ||
| 164 | doors { | ||
| 165 | name: "Flipped Right Eye Panels" | ||
| 166 | type: LOCATION_ONLY | ||
| 167 | panels { room: "Flipped Right Eye" name: "HERE" } | ||
| 168 | panels { room: "Flipped Right Eye" name: "WHERE" } | ||
| 169 | location_room: "Flipped Right Eye" | ||
| 170 | location_name: "HERE, WHERE" | ||
| 171 | } | ||
| 172 | doors { | ||
| 173 | name: "Big Eyes" | ||
| 174 | type: LOCATION_ONLY | ||
| 175 | panels { room: "Starting Room" name: "EYE" } | ||
| 176 | panels { room: "Right Eye" name: "EYE" } | ||
| 177 | location_room: "Right Eye" | ||
| 178 | location_name: "EYE" | ||
| 179 | } | ||
| 134 | # Components/Doors/back_left_1, _3, _4, _6 are vanilla because they're nothing. | 180 | # Components/Doors/back_left_1, _3, _4, _6 are vanilla because they're nothing. |
| 135 | doors { | 181 | doors { |
| 136 | name: "Orange Door Hider" | 182 | name: "Orange Door Hider" |
| @@ -321,3 +367,39 @@ doors { | |||
| 321 | receivers: "Components/GiftMapEntrance/PanelTeleporter" | 367 | receivers: "Components/GiftMapEntrance/PanelTeleporter" |
| 322 | double_letters: true | 368 | double_letters: true |
| 323 | } | 369 | } |
| 370 | doors { | ||
| 371 | name: "Least Blue Last" | ||
| 372 | type: LOCATION_ONLY | ||
| 373 | panels { room: "Least Blue Last" name: "CAPABLE (1)" } | ||
| 374 | panels { room: "Least Blue Last" name: "CAPABLE (2)" } | ||
| 375 | panels { room: "Least Blue Last" name: "LUSTRE" } | ||
| 376 | panels { room: "Least Blue Last" name: "WANT" } | ||
| 377 | panels { room: "Least Blue Last" name: "STEALER" } | ||
| 378 | panels { room: "Least Blue Last" name: "OLD" } | ||
| 379 | panels { room: "Least Blue Last" name: "TRUST" } | ||
| 380 | panels { room: "Least Blue Last" name: "LABEL" } | ||
| 381 | panels { room: "Least Blue Last" name: "AIL" } | ||
| 382 | location_room: "Least Blue Last" | ||
| 383 | } | ||
| 384 | doors { | ||
| 385 | name: "Control Center White Panel" | ||
| 386 | type: LOCATION_ONLY | ||
| 387 | panels { room: "Lime Room" name: "COLOR" } | ||
| 388 | location_room: "Lime Room" | ||
| 389 | location_name: "COLOR" | ||
| 390 | } | ||
| 391 | doors { | ||
| 392 | name: "Rabbit Hole Blank Puzzle" | ||
| 393 | type: LOCATION_ONLY | ||
| 394 | panels { room: "Rabbit Hole" name: "Blank" } | ||
| 395 | location_room: "Rabbit Hole" | ||
| 396 | location_name: "Blank Puzzle" | ||
| 397 | } | ||
| 398 | doors { | ||
| 399 | name: "Wrath Room Puzzles" | ||
| 400 | type: LOCATION_ONLY | ||
| 401 | panels { room: "Wrath Room" name: "DICE" } | ||
| 402 | panels { room: "Wrath Room" name: "WREATH" } | ||
| 403 | location_room: "Wrath Room" | ||
| 404 | location_name: "DICE, WRATH" | ||
| 405 | } | ||
| diff --git a/data/maps/the_entry/rooms/Rabbit Hole.txtpb b/data/maps/the_entry/rooms/Rabbit Hole.txtpb index 4ffeb84..4799fde 100644 --- a/data/maps/the_entry/rooms/Rabbit Hole.txtpb +++ b/data/maps/the_entry/rooms/Rabbit Hole.txtpb | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | name: "Rabbit Hole" | 1 | name: "Rabbit Hole" |
| 2 | panel_display_name: "Red Blue Area" | 2 | panel_display_name: "Red Blue Area" |
| 3 | panels { | 3 | panels { |
| 4 | name: "PUZZLE" | 4 | name: "Blank" |
| 5 | path: "Panels/Back Right/br_6" | 5 | path: "Panels/Back Right/br_6" |
| 6 | clue: "" | 6 | clue: "" |
| 7 | answer: "down" | 7 | answer: "down" |
| diff --git a/data/maps/the_fuzzy/doors.txtpb b/data/maps/the_fuzzy/doors.txtpb index 0f89b80..9c481c9 100644 --- a/data/maps/the_fuzzy/doors.txtpb +++ b/data/maps/the_fuzzy/doors.txtpb | |||
| @@ -6,6 +6,23 @@ doors { | |||
| 6 | location_room: "Main Area" | 6 | location_room: "Main Area" |
| 7 | } | 7 | } |
| 8 | doors { | 8 | doors { |
| 9 | name: "Green Panels" | ||
| 10 | type: LOCATION_ONLY | ||
| 11 | panels { room: "Main Area" name: "ACHIEVES" } | ||
| 12 | panels { room: "Main Area" name: "BEFORE" } | ||
| 13 | panels { room: "Main Area" name: "Blank" } | ||
| 14 | panels { room: "Main Area" name: "BOTH" } | ||
| 15 | panels { room: "Main Area" name: "CAGED" } | ||
| 16 | panels { room: "Main Area" name: "DICE" } | ||
| 17 | panels { room: "Main Area" name: "FIRST" } | ||
| 18 | panels { room: "Main Area" name: "FORGED" } | ||
| 19 | panels { room: "Main Area" name: "LOTTO" } | ||
| 20 | panels { room: "Main Area" name: "TOED" } | ||
| 21 | panels { room: "Main Area" name: "TUTU" } | ||
| 22 | panels { room: "Main Area" name: "UNVEILED" } | ||
| 23 | location_room: "Main Area" | ||
| 24 | } | ||
| 25 | doors { | ||
| 9 | name: "Mastery Door" | 26 | name: "Mastery Door" |
| 10 | type: EVENT | 27 | type: EVENT |
| 11 | panels { room: "Main Area" name: "OTHERS" } | 28 | panels { room: "Main Area" name: "OTHERS" } |
| diff --git a/data/maps/the_gallery/doors.txtpb b/data/maps/the_gallery/doors.txtpb index adbc766..9bbc016 100644 --- a/data/maps/the_gallery/doors.txtpb +++ b/data/maps/the_gallery/doors.txtpb | |||
| @@ -3,7 +3,7 @@ doors { | |||
| 3 | name: "Darkroom Painting" | 3 | name: "Darkroom Painting" |
| 4 | type: GALLERY_PAINTING | 4 | type: GALLERY_PAINTING |
| 5 | #move_paintings { room: "Main Area" name: "DARKROOM" } | 5 | #move_paintings { room: "Main Area" name: "DARKROOM" } |
| 6 | receivers: "Components/Paintings/darkroom/teleportListener" | 6 | receivers: "Components/Listeners/Hint Room/unlockReaderListenerDarkroom" |
| 7 | panels { map: "the_darkroom" room: "First Room" name: "BISON" } | 7 | panels { map: "the_darkroom" room: "First Room" name: "BISON" } |
| 8 | panels { map: "the_darkroom" room: "First Room" name: "FISH" } | 8 | panels { map: "the_darkroom" room: "First Room" name: "FISH" } |
| 9 | panels { map: "the_darkroom" room: "First Room" name: "SHEEP" } | 9 | panels { map: "the_darkroom" room: "First Room" name: "SHEEP" } |
| @@ -29,14 +29,14 @@ doors { | |||
| 29 | name: "Butterfly Painting" | 29 | name: "Butterfly Painting" |
| 30 | type: GALLERY_PAINTING | 30 | type: GALLERY_PAINTING |
| 31 | #move_paintings { room: "Main Area" name: "BUTTERFLY" } | 31 | #move_paintings { room: "Main Area" name: "BUTTERFLY" } |
| 32 | receivers: "Components/Paintings/butterfly/teleportListener" | 32 | receivers: "Components/Listeners/Hint Room/unlockReaderListenerButterfly" |
| 33 | rooms { map: "the_butterfly" name: "Main Area" } | 33 | rooms { map: "the_butterfly" name: "Main Area" } |
| 34 | } | 34 | } |
| 35 | doors { | 35 | doors { |
| 36 | name: "Between Painting" | 36 | name: "Between Painting" |
| 37 | type: GALLERY_PAINTING | 37 | type: GALLERY_PAINTING |
| 38 | #move_paintings { room: "Main Area" name: "BETWEEN" } | 38 | #move_paintings { room: "Main Area" name: "BETWEEN" } |
| 39 | receivers: "Components/Paintings/between/teleportListener" | 39 | receivers: "Components/Listeners/Hint Room/unlockReaderListenerBetween" |
| 40 | panels { map: "the_between" room: "Main Area" name: "SUN" } | 40 | panels { map: "the_between" room: "Main Area" name: "SUN" } |
| 41 | panels { map: "the_between" room: "Main Area" name: "KOI" } | 41 | panels { map: "the_between" room: "Main Area" name: "KOI" } |
| 42 | panels { map: "the_between" room: "Main Area" name: "SUN KOI" } | 42 | panels { map: "the_between" room: "Main Area" name: "SUN KOI" } |
| @@ -72,14 +72,14 @@ doors { | |||
| 72 | name: "Entry Painting" | 72 | name: "Entry Painting" |
| 73 | type: GALLERY_PAINTING | 73 | type: GALLERY_PAINTING |
| 74 | #move_paintings { room: "Main Area" name: "ENTRY" } | 74 | #move_paintings { room: "Main Area" name: "ENTRY" } |
| 75 | receivers: "Components/Paintings/eyes/teleportListener" | 75 | receivers: "Components/Listeners/Hint Room/unlockReaderListenerEyes" |
| 76 | panels { map: "the_entry" room: "Eye Room" name: "I" } | 76 | panels { map: "the_entry" room: "Eye Room" name: "I" } |
| 77 | } | 77 | } |
| 78 | doors { | 78 | doors { |
| 79 | name: "Wise Painting" | 79 | name: "Wise Painting" |
| 80 | type: GALLERY_PAINTING | 80 | type: GALLERY_PAINTING |
| 81 | #move_paintings { room: "Main Area" name: "WISE" } | 81 | #move_paintings { room: "Main Area" name: "WISE" } |
| 82 | receivers: "Components/Paintings/triangle/teleportListener" | 82 | receivers: "Components/Listeners/Hint Room/unlockReaderListenerTriangle" |
| 83 | panels { map: "the_wise" room: "Entry" name: "INK" } | 83 | panels { map: "the_wise" room: "Entry" name: "INK" } |
| 84 | panels { map: "the_wise" room: "Puzzles" name: "STORY" } | 84 | panels { map: "the_wise" room: "Puzzles" name: "STORY" } |
| 85 | panels { map: "the_wise" room: "Puzzles" name: "VENTURE" } | 85 | panels { map: "the_wise" room: "Puzzles" name: "VENTURE" } |
| @@ -107,7 +107,7 @@ doors { | |||
| 107 | name: "Tree Painting" | 107 | name: "Tree Painting" |
| 108 | type: GALLERY_PAINTING | 108 | type: GALLERY_PAINTING |
| 109 | #move_paintings { room: "Main Area" name: "TREE" } | 109 | #move_paintings { room: "Main Area" name: "TREE" } |
| 110 | receivers: "Components/Paintings/Clue Maps/tree/teleportListener" | 110 | receivers: "Components/Listeners/Hint Room/unlockReaderListenerTree" |
| 111 | panels { map: "the_tree" room: "Main Area" name: "COLOR" } | 111 | panels { map: "the_tree" room: "Main Area" name: "COLOR" } |
| 112 | panels { map: "the_tree" room: "Main Area" name: "DAMAGE (1)" } | 112 | panels { map: "the_tree" room: "Main Area" name: "DAMAGE (1)" } |
| 113 | panels { map: "the_tree" room: "Main Area" name: "DAMAGE (2)" } | 113 | panels { map: "the_tree" room: "Main Area" name: "DAMAGE (2)" } |
| @@ -144,35 +144,35 @@ doors { | |||
| 144 | name: "Unyielding Painting" | 144 | name: "Unyielding Painting" |
| 145 | type: GALLERY_PAINTING | 145 | type: GALLERY_PAINTING |
| 146 | #move_paintings { room: "Main Area" name: "UNYIELDING" } | 146 | #move_paintings { room: "Main Area" name: "UNYIELDING" } |
| 147 | receivers: "Components/Paintings/Clue Maps/unyielding/teleportListener" | 147 | receivers: "Components/Listeners/Hint Room/unlockReaderListenerUnyielding" |
| 148 | rooms { map: "the_unyielding" name: "Digital Entrance" } | 148 | rooms { map: "the_unyielding" name: "Digital Entrance" } |
| 149 | } | 149 | } |
| 150 | doors { | 150 | doors { |
| 151 | name: "Graveyard Painting" | 151 | name: "Graveyard Painting" |
| 152 | type: GALLERY_PAINTING | 152 | type: GALLERY_PAINTING |
| 153 | #move_paintings { room: "Main Area" name: "GRAVEYARD" } | 153 | #move_paintings { room: "Main Area" name: "GRAVEYARD" } |
| 154 | receivers: "Components/Paintings/Endings/grave/teleportListener" | 154 | receivers: "Components/Listeners/Endings/unlockReaderListenerGraveyard" |
| 155 | rooms { map: "the_graveyard" name: "Outside" } | 155 | rooms { map: "the_graveyard" name: "Outside" } |
| 156 | } | 156 | } |
| 157 | doors { | 157 | doors { |
| 158 | name: "Control Center Painting" | 158 | name: "Control Center Painting" |
| 159 | type: GALLERY_PAINTING | 159 | type: GALLERY_PAINTING |
| 160 | #move_paintings { room: "Main Area" name: "CC" } | 160 | #move_paintings { room: "Main Area" name: "CC" } |
| 161 | receivers: "Components/Paintings/Endings/desert/teleportListener" | 161 | receivers: "Components/Listeners/Endings/unlockReaderListenerDesert" |
| 162 | rooms { map: "the_impressive" name: "M2 Room" } | 162 | rooms { map: "the_impressive" name: "M2 Room" } |
| 163 | } | 163 | } |
| 164 | doors { | 164 | doors { |
| 165 | name: "Tower Painting" | 165 | name: "Tower Painting" |
| 166 | type: GALLERY_PAINTING | 166 | type: GALLERY_PAINTING |
| 167 | #move_paintings { room: "Main Area" name: "TOWER" } | 167 | #move_paintings { room: "Main Area" name: "TOWER" } |
| 168 | receivers: "Components/Paintings/Endings/red/teleportListener" | 168 | receivers: "Components/Listeners/Endings/unlockReaderListenerTower" |
| 169 | rooms { map: "the_tower" name: "First Floor" } | 169 | rooms { map: "the_tower" name: "First Floor" } |
| 170 | } | 170 | } |
| 171 | doors { | 171 | doors { |
| 172 | name: "Wondrous Painting" | 172 | name: "Wondrous Painting" |
| 173 | type: GALLERY_PAINTING | 173 | type: GALLERY_PAINTING |
| 174 | #move_paintings { room: "Main Area" name: "WONDROUS" } | 174 | #move_paintings { room: "Main Area" name: "WONDROUS" } |
| 175 | receivers: "Components/Paintings/Endings/window/teleportListener" | 175 | receivers: "Components/Listeners/Endings/unlockReaderListenerWonderland" |
| 176 | panels { map: "the_wondrous" room: "Entry" name: "WONDER" } | 176 | panels { map: "the_wondrous" room: "Entry" name: "WONDER" } |
| 177 | panels { map: "the_wondrous" room: "Regular" name: "SHRINK" } | 177 | panels { map: "the_wondrous" room: "Regular" name: "SHRINK" } |
| 178 | panels { map: "the_wondrous" room: "Huge" name: "SHRINK" } | 178 | panels { map: "the_wondrous" room: "Huge" name: "SHRINK" } |
| @@ -189,42 +189,42 @@ doors { | |||
| 189 | name: "Rainbow Painting" | 189 | name: "Rainbow Painting" |
| 190 | type: GALLERY_PAINTING | 190 | type: GALLERY_PAINTING |
| 191 | #move_paintings { room: "Main Area" name: "RAINBOW" } | 191 | #move_paintings { room: "Main Area" name: "RAINBOW" } |
| 192 | receivers: "Components/Paintings/Endings/rainbow/teleportListener" | 192 | receivers: "Components/Listeners/Endings/unlockReaderListenerRainbow" |
| 193 | rooms { map: "daedalus" name: "Rainbow Start" } | 193 | rooms { map: "daedalus" name: "Rainbow Start" } |
| 194 | } | 194 | } |
| 195 | doors { | 195 | doors { |
| 196 | name: "Words Painting" | 196 | name: "Words Painting" |
| 197 | type: GALLERY_PAINTING | 197 | type: GALLERY_PAINTING |
| 198 | #move_paintings { room: "Main Area" name: "WORDS" } | 198 | #move_paintings { room: "Main Area" name: "WORDS" } |
| 199 | receivers: "Components/Paintings/Endings/words/teleportListener" | 199 | receivers: "Components/Listeners/Endings/unlockReaderListenerWords" |
| 200 | rooms { map: "the_words" name: "Main Area" } | 200 | rooms { map: "the_words" name: "Main Area" } |
| 201 | } | 201 | } |
| 202 | doors { | 202 | doors { |
| 203 | name: "Colorful Painting" | 203 | name: "Colorful Painting" |
| 204 | type: GALLERY_PAINTING | 204 | type: GALLERY_PAINTING |
| 205 | #move_paintings { room: "Main Area" name: "COLORFUL" } | 205 | #move_paintings { room: "Main Area" name: "COLORFUL" } |
| 206 | receivers: "Components/Paintings/Endings/colorful/teleportListener" | 206 | receivers: "Components/Listeners/Endings/unlockReaderListenerColorful" |
| 207 | rooms { map: "the_colorful" name: "White Room" } | 207 | rooms { map: "the_colorful" name: "White Room" } |
| 208 | } | 208 | } |
| 209 | doors { | 209 | doors { |
| 210 | name: "Castle Painting" | 210 | name: "Castle Painting" |
| 211 | type: GALLERY_PAINTING | 211 | type: GALLERY_PAINTING |
| 212 | #move_paintings { room: "Main Area" name: "CASTLE" } | 212 | #move_paintings { room: "Main Area" name: "CASTLE" } |
| 213 | receivers: "Components/Paintings/Endings/castle/teleportListener" | 213 | receivers: "Components/Listeners/Endings/unlockReaderListenerCastle" |
| 214 | rooms { map: "daedalus" name: "Castle" } | 214 | rooms { map: "daedalus" name: "Castle" } |
| 215 | } | 215 | } |
| 216 | doors { | 216 | doors { |
| 217 | name: "Sun Temple Painting" | 217 | name: "Sun Temple Painting" |
| 218 | type: GALLERY_PAINTING | 218 | type: GALLERY_PAINTING |
| 219 | #move_paintings { room: "Main Area" name: "SUNTEMPLE" } | 219 | #move_paintings { room: "Main Area" name: "SUNTEMPLE" } |
| 220 | receivers: "Components/Paintings/Endings/temple/teleportListener" | 220 | receivers: "Components/Listeners/Endings/unlockReaderListenerTemple" |
| 221 | rooms { map: "the_sun_temple" name: "Entrance" } | 221 | rooms { map: "the_sun_temple" name: "Entrance" } |
| 222 | } | 222 | } |
| 223 | doors { | 223 | doors { |
| 224 | name: "Ancient Painting" | 224 | name: "Ancient Painting" |
| 225 | type: GALLERY_PAINTING | 225 | type: GALLERY_PAINTING |
| 226 | #move_paintings { room: "Main Area" name: "ANCIENT" } | 226 | #move_paintings { room: "Main Area" name: "ANCIENT" } |
| 227 | receivers: "Components/Paintings/Endings/cubes/teleportListener" | 227 | receivers: "Components/Listeners/Endings/unlockReaderListenerQuartz" |
| 228 | rooms { map: "the_ancient" name: "Outside" } | 228 | rooms { map: "the_ancient" name: "Outside" } |
| 229 | } | 229 | } |
| 230 | doors { | 230 | doors { |
| @@ -255,7 +255,8 @@ doors { | |||
| 255 | doors { name: "Castle Painting" } | 255 | doors { name: "Castle Painting" } |
| 256 | doors { name: "Sun Temple Painting" } | 256 | doors { name: "Sun Temple Painting" } |
| 257 | doors { name: "Ancient Painting" } | 257 | doors { name: "Ancient Painting" } |
| 258 | doors { name: "Gallery Extension" } | 258 | panels { room: "Daedalus Extension" name: "WHERE" } |
| 259 | double_letters: true | ||
| 259 | } | 260 | } |
| 260 | doors { | 261 | doors { |
| 261 | name: "Ending Door" | 262 | name: "Ending Door" |
| diff --git a/data/maps/the_gold/doors.txtpb b/data/maps/the_gold/doors.txtpb new file mode 100644 index 0000000..d3329cb --- /dev/null +++ b/data/maps/the_gold/doors.txtpb | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | doors { | ||
| 2 | name: "The Panel" | ||
| 3 | type: LOCATION_ONLY | ||
| 4 | panels { room: "The Whole Thing" name: "PANEL" } | ||
| 5 | location_room: "The Whole Thing" | ||
| 6 | location_name: "Panel" | ||
| 7 | } | ||
| diff --git a/data/maps/the_graveyard/doors.txtpb b/data/maps/the_graveyard/doors.txtpb index a10d8f6..20e7fcf 100644 --- a/data/maps/the_graveyard/doors.txtpb +++ b/data/maps/the_graveyard/doors.txtpb | |||
| @@ -23,3 +23,10 @@ doors { | |||
| 23 | receivers: "Components/Paintings/omrt/teleportListener" | 23 | receivers: "Components/Paintings/omrt/teleportListener" |
| 24 | double_letters: true | 24 | double_letters: true |
| 25 | } | 25 | } |
| 26 | doors { | ||
| 27 | name: "Remember Panel" | ||
| 28 | type: LOCATION_ONLY | ||
| 29 | panels { room: "Inside" name: "REMEMBER" } | ||
| 30 | location_room: "Inside" | ||
| 31 | location_name: "REMEMBER" | ||
| 32 | } | ||
| diff --git a/data/maps/the_great/doors.txtpb b/data/maps/the_great/doors.txtpb index 132aa6f..98d9859 100644 --- a/data/maps/the_great/doors.txtpb +++ b/data/maps/the_great/doors.txtpb | |||
| @@ -29,6 +29,15 @@ doors { | |||
| 29 | location_room: "Main Area" | 29 | location_room: "Main Area" |
| 30 | } | 30 | } |
| 31 | doors { | 31 | doors { |
| 32 | name: "Near Linear Panels" | ||
| 33 | type: LOCATION_ONLY | ||
| 34 | panels { room: "Main Area" name: "DEW" } | ||
| 35 | panels { room: "Main Area" name: "EWE" } | ||
| 36 | panels { room: "Main Area" name: "NO" } | ||
| 37 | location_room: "Main Area" | ||
| 38 | location_name: "DEW, EWE, NO" | ||
| 39 | } | ||
| 40 | doors { | ||
| 32 | name: "Courtyard Entrance" | 41 | name: "Courtyard Entrance" |
| 33 | type: STANDARD | 42 | type: STANDARD |
| 34 | receivers: "Components/Doors/entry_1" | 43 | receivers: "Components/Doors/entry_1" |
| @@ -417,7 +426,8 @@ doors { | |||
| 417 | } | 426 | } |
| 418 | doors { | 427 | doors { |
| 419 | name: "Question Room Back Door" | 428 | name: "Question Room Back Door" |
| 420 | type: STANDARD | 429 | type: ITEM_ONLY |
| 430 | legacy_location: true | ||
| 421 | receivers: "Components/Doors/question_11" | 431 | receivers: "Components/Doors/question_11" |
| 422 | panels { room: "Behind Question Area" name: "YEW" answer: "ewe" } | 432 | panels { room: "Behind Question Area" name: "YEW" answer: "ewe" } |
| 423 | location_room: "Behind Question Area" | 433 | location_room: "Behind Question Area" |
| @@ -522,3 +532,99 @@ doors { | |||
| 522 | type: EVENT | 532 | type: EVENT |
| 523 | panels { room: "West Side" name: "CLUE" } | 533 | panels { room: "West Side" name: "CLUE" } |
| 524 | } | 534 | } |
| 535 | doors { | ||
| 536 | name: "Why Is It Not Red" | ||
| 537 | type: LOCATION_ONLY | ||
| 538 | panels { room: "Main Area" name: "WHY" } | ||
| 539 | panels { room: "Main Area" name: "IS" } | ||
| 540 | panels { room: "Main Area" name: "IT" } | ||
| 541 | panels { room: "Main Area" name: "NOT" } | ||
| 542 | panels { room: "Main Area" name: "RED" } | ||
| 543 | location_room: "Main Area" | ||
| 544 | location_name: "WHY, IS, IT, NOT, RED" | ||
| 545 | } | ||
| 546 | doors { | ||
| 547 | name: "Control Center Gray Panel" | ||
| 548 | type: LOCATION_ONLY | ||
| 549 | panels { room: "Main Area" name: "COLOR" } | ||
| 550 | location_room: "Main Area" | ||
| 551 | location_name: "COLOR" | ||
| 552 | } | ||
| 553 | doors { | ||
| 554 | name: "Control Center Purple Panel" | ||
| 555 | type: LOCATION_ONLY | ||
| 556 | panels { room: "East Landscape" name: "COLOR" } | ||
| 557 | location_room: "East Landscape" | ||
| 558 | location_name: "COLOR" | ||
| 559 | } | ||
| 560 | doors { | ||
| 561 | name: "Control Center Red Panel" | ||
| 562 | type: LOCATION_ONLY | ||
| 563 | panels { room: "West Side" name: "COLOR" } | ||
| 564 | location_room: "West Side" | ||
| 565 | location_name: "COLOR" | ||
| 566 | } | ||
| 567 | doors { | ||
| 568 | name: "Mistreat Panel" | ||
| 569 | type: LOCATION_ONLY | ||
| 570 | panels { room: "East Landscape" name: "MISTREAT" } | ||
| 571 | location_room: "East Landscape" | ||
| 572 | location_name: "MISTREAT" | ||
| 573 | } | ||
| 574 | doors { | ||
| 575 | name: "Tower Panels" | ||
| 576 | type: LOCATION_ONLY | ||
| 577 | panels { room: "Back Area" name: "TOWEL" } | ||
| 578 | panels { room: "Maze Tower" name: "SPIRE" } | ||
| 579 | location_room: "Maze Tower" | ||
| 580 | location_name: "SPIRE, TOWEL" | ||
| 581 | } | ||
| 582 | doors { | ||
| 583 | name: "Tree Panels" | ||
| 584 | type: LOCATION_ONLY | ||
| 585 | panels { room: "Back Area" name: "PLANT" } | ||
| 586 | panels { room: "Back Area" name: "TREE" } | ||
| 587 | location_room: "Back Area" | ||
| 588 | location_name: "PLANT, TREE" | ||
| 589 | } | ||
| 590 | doors { | ||
| 591 | name: "Behind Question Room Panels" | ||
| 592 | type: LOCATION_ONLY | ||
| 593 | panels { room: "Behind Question Area" name: "DEW" } | ||
| 594 | panels { room: "Behind Question Area" name: "YEW" answer: "ewe" } | ||
| 595 | panels { room: "Behind Question Area" name: "NO" } | ||
| 596 | location_room: "Behind Question Area" | ||
| 597 | location_name: "DEW, YEW/EWE, NO" | ||
| 598 | } | ||
| 599 | doors { | ||
| 600 | name: "Broken Shed Panels" | ||
| 601 | type: LOCATION_ONLY | ||
| 602 | panels { room: "North Landscape" name: "LAUGH" } | ||
| 603 | panels { room: "North Landscape" name: "FINISHED" } | ||
| 604 | panels { room: "North Landscape" name: "LAUGH FINISHED" } | ||
| 605 | location_room: "North Landscape" | ||
| 606 | location_name: "LAUGH, FINISHED, LAUGH FINISHED" | ||
| 607 | } | ||
| 608 | doors { | ||
| 609 | name: "Nature Panels" | ||
| 610 | type: LOCATION_ONLY | ||
| 611 | panels { room: "North Landscape" name: "WEATHER" } | ||
| 612 | panels { room: "North Landscape" name: "ANIMALS" } | ||
| 613 | panels { room: "North Landscape" name: "PLANTS" } | ||
| 614 | location_room: "North Landscape" | ||
| 615 | location_name: "ANIMALS, PLANTS, WEATHER" | ||
| 616 | } | ||
| 617 | doors { | ||
| 618 | name: "Teal Panel" | ||
| 619 | type: LOCATION_ONLY | ||
| 620 | panels { room: "Maze Wreck Area" name: "MAROON" } | ||
| 621 | location_room: "Maze Wreck Area" | ||
| 622 | location_name: "MAROON" | ||
| 623 | } | ||
| 624 | doors { | ||
| 625 | name: "Behind Orb Panel" | ||
| 626 | type: LOCATION_ONLY | ||
| 627 | panels { room: "Main Area" name: "BROWN RED ORANGE" } | ||
| 628 | location_room: "Main Area" | ||
| 629 | location_name: "Brown Red Orange" | ||
| 630 | } | ||
| diff --git a/data/maps/the_great/rooms/Maze Tower.txtpb b/data/maps/the_great/rooms/Maze Tower.txtpb index 44c30d7..3b1e5fc 100644 --- a/data/maps/the_great/rooms/Maze Tower.txtpb +++ b/data/maps/the_great/rooms/Maze Tower.txtpb | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | name: "Maze Tower" | 1 | name: "Maze Tower" |
| 2 | panel_display_name: "Courtyard" | ||
| 3 | panels { | 2 | panels { |
| 4 | name: "FEEL" | 3 | name: "FEEL" |
| 5 | path: "Panels/Maze/maze_12" | 4 | path: "Panels/Maze/maze_12" |
| diff --git a/data/maps/the_impressive/doors.txtpb b/data/maps/the_impressive/doors.txtpb index 03ec9f5..9ab6845 100644 --- a/data/maps/the_impressive/doors.txtpb +++ b/data/maps/the_impressive/doors.txtpb | |||
| @@ -30,9 +30,25 @@ doors { | |||
| 30 | panels { room: "Green Eye" name: "LEFT" } | 30 | panels { room: "Green Eye" name: "LEFT" } |
| 31 | } | 31 | } |
| 32 | doors { | 32 | doors { |
| 33 | name: "Green Eye Panels" | ||
| 34 | type: LOCATION_ONLY | ||
| 35 | panels { room: "Green Eye" name: "RETURN" } | ||
| 36 | panels { room: "Green Eye" name: "TO" } | ||
| 37 | panels { room: "Green Eye" name: "LEFT" } | ||
| 38 | location_room: "Green Eye" | ||
| 39 | location_name: "RETURN, TO, LEFT" | ||
| 40 | } | ||
| 41 | doors { | ||
| 33 | name: "Control Center Green Door" | 42 | name: "Control Center Green Door" |
| 34 | type: CONTROL_CENTER_COLOR | 43 | type: CONTROL_CENTER_COLOR |
| 35 | latch: true | 44 | latch: true |
| 36 | receivers: "Components/Doors/entry_2" | 45 | receivers: "Components/Doors/entry_2" |
| 37 | control_center_color: "green" | 46 | control_center_color: "green" |
| 38 | } | 47 | } |
| 48 | doors { | ||
| 49 | name: "Control Center Green Panel" | ||
| 50 | type: LOCATION_ONLY | ||
| 51 | panels { room: "Side Area" name: "COLOR" } | ||
| 52 | location_room: "Side Area" | ||
| 53 | location_name: "COLOR" | ||
| 54 | } | ||
| diff --git a/data/maps/the_jubilant/doors.txtpb b/data/maps/the_jubilant/doors.txtpb index 02db1ff..90bfd0f 100644 --- a/data/maps/the_jubilant/doors.txtpb +++ b/data/maps/the_jubilant/doors.txtpb | |||
| @@ -31,3 +31,14 @@ doors { | |||
| 31 | panels { room: "Main Area" name: "QUEEN" answer: "jack" } | 31 | panels { room: "Main Area" name: "QUEEN" answer: "jack" } |
| 32 | location_room: "Main Area" | 32 | location_room: "Main Area" |
| 33 | } | 33 | } |
| 34 | doors { | ||
| 35 | name: "Side Room Puzzles" | ||
| 36 | type: LOCATION_ONLY | ||
| 37 | panels { room: "Side Area" name: "CALLBACK" } | ||
| 38 | panels { room: "Side Area" name: "CALL" } | ||
| 39 | panels { room: "Side Area" name: "PUSHBACK" } | ||
| 40 | panels { room: "Side Area" name: "PUSH" } | ||
| 41 | panels { room: "Side Area" name: "FLASHBACK" } | ||
| 42 | panels { room: "Side Area" name: "FLASH" } | ||
| 43 | location_room: "Side Area" | ||
| 44 | } | ||
| diff --git a/data/maps/the_nuanced/doors.txtpb b/data/maps/the_nuanced/doors.txtpb index cd29766..300524b 100644 --- a/data/maps/the_nuanced/doors.txtpb +++ b/data/maps/the_nuanced/doors.txtpb | |||
| @@ -52,3 +52,10 @@ doors { | |||
| 52 | panels { room: "Back Room" name: "LIMB" } | 52 | panels { room: "Back Room" name: "LIMB" } |
| 53 | panels { room: "Back Room" name: "SPARE" } | 53 | panels { room: "Back Room" name: "SPARE" } |
| 54 | } | 54 | } |
| 55 | doors { | ||
| 56 | name: "Stores Panel" | ||
| 57 | type: LOCATION_ONLY | ||
| 58 | panels { room: "Main Room" name: "TORE" } | ||
| 59 | location_room: "Main Room" | ||
| 60 | location_name: "TORE" | ||
| 61 | } | ||
| diff --git a/data/maps/the_owl/doors.txtpb b/data/maps/the_owl/doors.txtpb index 032863e..eaafa48 100644 --- a/data/maps/the_owl/doors.txtpb +++ b/data/maps/the_owl/doors.txtpb | |||
| @@ -1,13 +1,15 @@ | |||
| 1 | doors { | 1 | doors { |
| 2 | name: "Brush Door" | 2 | name: "Brush Door" |
| 3 | type: STANDARD | 3 | type: ITEM_ONLY |
| 4 | legacy_location: true | ||
| 4 | receivers: "Components/Doors/entry_1" | 5 | receivers: "Components/Doors/entry_1" |
| 5 | panels { room: "R2C2 Top" name: "CRUSH" } | 6 | panels { room: "R2C2 Top" name: "CRUSH" } |
| 6 | location_room: "R2C2 Top" | 7 | location_room: "R2C2 Top" |
| 7 | } | 8 | } |
| 8 | doors { | 9 | doors { |
| 9 | name: "Sky Top Doors" | 10 | name: "Sky Top Doors" |
| 10 | type: STANDARD | 11 | type: ITEM_ONLY |
| 12 | legacy_location: true | ||
| 11 | receivers: "Components/Doors/entry_2" | 13 | receivers: "Components/Doors/entry_2" |
| 12 | receivers: "Components/Doors/entry_4" | 14 | receivers: "Components/Doors/entry_4" |
| 13 | panels { room: "R2C1 Left" name: "VERB" } | 15 | panels { room: "R2C1 Left" name: "VERB" } |
| @@ -15,7 +17,8 @@ doors { | |||
| 15 | } | 17 | } |
| 16 | doors { | 18 | doors { |
| 17 | name: "Sky Bottom Doors" | 19 | name: "Sky Bottom Doors" |
| 18 | type: STANDARD | 20 | type: ITEM_ONLY |
| 21 | legacy_location: true | ||
| 19 | receivers: "Components/Doors/entry_3" | 22 | receivers: "Components/Doors/entry_3" |
| 20 | receivers: "Components/Doors/entry_5" | 23 | receivers: "Components/Doors/entry_5" |
| 21 | panels { room: "R2C1 Left" name: "FOIL" } | 24 | panels { room: "R2C1 Left" name: "FOIL" } |
| @@ -23,21 +26,24 @@ doors { | |||
| 23 | } | 26 | } |
| 24 | doors { | 27 | doors { |
| 25 | name: "First Room Shortcut" | 28 | name: "First Room Shortcut" |
| 26 | type: STANDARD | 29 | type: ITEM_ONLY |
| 30 | legacy_location: true | ||
| 27 | receivers: "Components/Doors/entry_6" | 31 | receivers: "Components/Doors/entry_6" |
| 28 | panels { room: "Connected Area" name: "FIZZLE" } | 32 | panels { room: "Connected Area" name: "FIZZLE" } |
| 29 | location_room: "Connected Area" | 33 | location_room: "Connected Area" |
| 30 | } | 34 | } |
| 31 | doors { | 35 | doors { |
| 32 | name: "First Door" | 36 | name: "First Door" |
| 33 | type: STANDARD | 37 | type: ITEM_ONLY |
| 38 | legacy_location: true | ||
| 34 | receivers: "Components/Doors/entry_7" | 39 | receivers: "Components/Doors/entry_7" |
| 35 | panels { room: "R2C2 Bottom" name: "FOUL" } | 40 | panels { room: "R2C2 Bottom" name: "FOUL" } |
| 36 | location_room: "R2C2 Bottom" | 41 | location_room: "R2C2 Bottom" |
| 37 | } | 42 | } |
| 38 | doors { | 43 | doors { |
| 39 | name: "Blue Door" | 44 | name: "Blue Door" |
| 40 | type: STANDARD | 45 | type: ITEM_ONLY |
| 46 | legacy_location: true | ||
| 41 | receivers: "Components/Doors/entry_8" | 47 | receivers: "Components/Doors/entry_8" |
| 42 | panels { room: "Connected Area" name: "PAST" } | 48 | panels { room: "Connected Area" name: "PAST" } |
| 43 | panels { room: "Connected Area" name: "LAY" } | 49 | panels { room: "Connected Area" name: "LAY" } |
| @@ -65,7 +71,8 @@ doors { | |||
| 65 | } | 71 | } |
| 66 | doors { | 72 | doors { |
| 67 | name: "Sky Owl" | 73 | name: "Sky Owl" |
| 68 | type: STANDARD | 74 | type: ITEM_ONLY |
| 75 | legacy_location: true | ||
| 69 | receivers: "Components/Owl/Room 1/LB" | 76 | receivers: "Components/Owl/Room 1/LB" |
| 70 | receivers: "Components/Owl/Room 1/LBG" | 77 | receivers: "Components/Owl/Room 1/LBG" |
| 71 | receivers: "Components/Owl/Room 2/LB" | 78 | receivers: "Components/Owl/Room 2/LB" |
| @@ -93,7 +100,8 @@ doors { | |||
| 93 | } | 100 | } |
| 94 | doors { | 101 | doors { |
| 95 | name: "Gray Owl" | 102 | name: "Gray Owl" |
| 96 | type: STANDARD | 103 | type: ITEM_ONLY |
| 104 | legacy_location: true | ||
| 97 | receivers: "Components/Owl/Room 1/G" | 105 | receivers: "Components/Owl/Room 1/G" |
| 98 | receivers: "Components/Owl/Room 1/GG" | 106 | receivers: "Components/Owl/Room 1/GG" |
| 99 | receivers: "Components/Owl/Room 2/G" | 107 | receivers: "Components/Owl/Room 2/G" |
| @@ -121,7 +129,8 @@ doors { | |||
| 121 | } | 129 | } |
| 122 | doors { | 130 | doors { |
| 123 | name: "Orange Owl" | 131 | name: "Orange Owl" |
| 124 | type: STANDARD | 132 | type: ITEM_ONLY |
| 133 | legacy_location: true | ||
| 125 | receivers: "Components/Owl/Room 1/O" | 134 | receivers: "Components/Owl/Room 1/O" |
| 126 | receivers: "Components/Owl/Room 1/OG" | 135 | receivers: "Components/Owl/Room 1/OG" |
| 127 | receivers: "Components/Owl/Room 2/O" | 136 | receivers: "Components/Owl/Room 2/O" |
| @@ -149,7 +158,8 @@ doors { | |||
| 149 | } | 158 | } |
| 150 | doors { | 159 | doors { |
| 151 | name: "White Owl" | 160 | name: "White Owl" |
| 152 | type: STANDARD | 161 | type: ITEM_ONLY |
| 162 | legacy_location: true | ||
| 153 | receivers: "Components/Owl/Room 1/W" | 163 | receivers: "Components/Owl/Room 1/W" |
| 154 | receivers: "Components/Owl/Room 1/WG" | 164 | receivers: "Components/Owl/Room 1/WG" |
| 155 | receivers: "Components/Owl/Room 2/W" | 165 | receivers: "Components/Owl/Room 2/W" |
| @@ -177,7 +187,8 @@ doors { | |||
| 177 | } | 187 | } |
| 178 | doors { | 188 | doors { |
| 179 | name: "Black Owl" | 189 | name: "Black Owl" |
| 180 | type: STANDARD | 190 | type: ITEM_ONLY |
| 191 | legacy_location: true | ||
| 181 | receivers: "Components/Owl/Room 1/BK" | 192 | receivers: "Components/Owl/Room 1/BK" |
| 182 | receivers: "Components/Owl/Room 1/BKG" | 193 | receivers: "Components/Owl/Room 1/BKG" |
| 183 | receivers: "Components/Owl/Room 2/BK" | 194 | receivers: "Components/Owl/Room 2/BK" |
| @@ -205,7 +216,8 @@ doors { | |||
| 205 | } | 216 | } |
| 206 | doors { | 217 | doors { |
| 207 | name: "Blue Owl" | 218 | name: "Blue Owl" |
| 208 | type: STANDARD | 219 | type: ITEM_ONLY |
| 220 | legacy_location: true | ||
| 209 | receivers: "Components/Owl/Room 1/BL" | 221 | receivers: "Components/Owl/Room 1/BL" |
| 210 | receivers: "Components/Owl/Room 1/BLG" | 222 | receivers: "Components/Owl/Room 1/BLG" |
| 211 | receivers: "Components/Owl/Room 2/BL" | 223 | receivers: "Components/Owl/Room 2/BL" |
| @@ -251,3 +263,89 @@ doors { | |||
| 251 | panels { room: "Connected Area" name: "WHITE" } | 263 | panels { room: "Connected Area" name: "WHITE" } |
| 252 | panels { room: "Blue Room" name: "SKY" } | 264 | panels { room: "Blue Room" name: "SKY" } |
| 253 | } | 265 | } |
| 266 | doors { | ||
| 267 | name: "R1C1 Panels" | ||
| 268 | type: LOCATION_ONLY | ||
| 269 | panels { room: "Connected Area" name: "ETCH" } | ||
| 270 | panels { room: "Connected Area" name: "SHOE" } | ||
| 271 | panels { room: "Connected Area" name: "MARKER" } | ||
| 272 | location_room: "Connected Area" | ||
| 273 | location_name: "ETCH, MARKER, SHOE" | ||
| 274 | } | ||
| 275 | doors { | ||
| 276 | name: "R1C2 Panels" | ||
| 277 | type: LOCATION_ONLY | ||
| 278 | panels { room: "Connected Area" name: "FAINT" } | ||
| 279 | panels { room: "Connected Area" name: "PURE" } | ||
| 280 | panels { room: "Connected Area" name: "MODE" } | ||
| 281 | location_room: "Connected Area" | ||
| 282 | location_name: "FAINT, MODE, PURE" | ||
| 283 | } | ||
| 284 | doors { | ||
| 285 | name: "Control Center Magenta Panel" | ||
| 286 | type: LOCATION_ONLY | ||
| 287 | panels { room: "Connected Area" name: "COLOR" } | ||
| 288 | location_room: "Connected Area" | ||
| 289 | location_name: "COLOR" | ||
| 290 | } | ||
| 291 | doors { | ||
| 292 | name: "R1C3 Panels" | ||
| 293 | type: LOCATION_ONLY | ||
| 294 | panels { room: "Connected Area" name: "PENCIL" } | ||
| 295 | panels { room: "Connected Area" name: "WING" } | ||
| 296 | location_room: "Connected Area" | ||
| 297 | location_name: "PENCIL, WING" | ||
| 298 | } | ||
| 299 | doors { | ||
| 300 | name: "R1C4 Panels" | ||
| 301 | type: LOCATION_ONLY | ||
| 302 | panels { room: "Connected Area" name: "SKETCH" } | ||
| 303 | panels { room: "Connected Area" name: "PHOTO" } | ||
| 304 | panels { room: "R1C4 Left" name: "WALK" } | ||
| 305 | panels { room: "R1C4 Left" name: "STENCIL" } | ||
| 306 | location_room: "R1C4 Left" | ||
| 307 | location_name: "PHOTO, SKETCH, STENCIL, WALK" | ||
| 308 | } | ||
| 309 | doors { | ||
| 310 | name: "R2C1 Panels" | ||
| 311 | type: LOCATION_ONLY | ||
| 312 | panels { room: "Connected Area" name: "LAY" } | ||
| 313 | panels { room: "Connected Area" name: "PAST" } | ||
| 314 | panels { room: "R2C1 Left" name: "VERB" } | ||
| 315 | panels { room: "R2C1 Left" name: "FOIL" } | ||
| 316 | location_room: "R2C1 Left" | ||
| 317 | location_name: "FOIL, LAY, PAST, VERB" | ||
| 318 | } | ||
| 319 | doors { | ||
| 320 | name: "R2C2 Panels" | ||
| 321 | type: LOCATION_ONLY | ||
| 322 | panels { room: "R2C2 Bottom" name: "FOUL" } | ||
| 323 | panels { room: "R2C2 Top" name: "CRUSH" } | ||
| 324 | panels { room: "Connected Area" name: "FIZZLE" } | ||
| 325 | location_room: "R2C2 Top" | ||
| 326 | location_name: "CRUSH, FOUL, FIZZLE" | ||
| 327 | } | ||
| 328 | doors { | ||
| 329 | name: "R2C3 Panels" | ||
| 330 | type: LOCATION_ONLY | ||
| 331 | panels { room: "Connected Area" name: "PRIMARY" } | ||
| 332 | panels { room: "R2C3 Bottom" name: "FIGMENT" } | ||
| 333 | location_room: "R2C3 Bottom" | ||
| 334 | location_name: "FIGMENT, PRIMARY" | ||
| 335 | } | ||
| 336 | doors { | ||
| 337 | name: "R2C4 Panels" | ||
| 338 | type: LOCATION_ONLY | ||
| 339 | panels { room: "Connected Area" name: "SHOW" } | ||
| 340 | panels { room: "Connected Area" name: "HAD" } | ||
| 341 | panels { room: "Connected Area" name: "HEAVY" } | ||
| 342 | location_room: "Connected Area" | ||
| 343 | location_name: "HAD, HEAVY, SHOW" | ||
| 344 | } | ||
| 345 | doors { | ||
| 346 | name: "Near Z1 Panel" | ||
| 347 | type: LOCATION_ONLY | ||
| 348 | panels { room: "Z Room" name: "MAZE" } | ||
| 349 | location_room: "Z Room" | ||
| 350 | location_name: "MAZE" | ||
| 351 | } | ||
| diff --git a/data/maps/the_parthenon/doors.txtpb b/data/maps/the_parthenon/doors.txtpb index 1161917..05d2e63 100644 --- a/data/maps/the_parthenon/doors.txtpb +++ b/data/maps/the_parthenon/doors.txtpb | |||
| @@ -43,3 +43,12 @@ doors { | |||
| 43 | panels { room: "Main Area" name: "ALEXANDER" answer: "alexander" } | 43 | panels { room: "Main Area" name: "ALEXANDER" answer: "alexander" } |
| 44 | panels { room: "Main Area" name: "CAESAR" answer: "caesar" } | 44 | panels { room: "Main Area" name: "CAESAR" answer: "caesar" } |
| 45 | } | 45 | } |
| 46 | doors { | ||
| 47 | name: "Lavender Area Puzzles" | ||
| 48 | type: LOCATION_ONLY | ||
| 49 | panels { room: "Lavender Area" name: "ME" } | ||
| 50 | panels { room: "Lavender Area" name: "SHEEP" } | ||
| 51 | panels { room: "Lavender Area" name: "WOOD" } | ||
| 52 | location_room: "Lavender Area" | ||
| 53 | location_name: "ME, SHEEP, WOOD" | ||
| 54 | } | ||
| diff --git a/data/maps/the_partial/doors.txtpb b/data/maps/the_partial/doors.txtpb index 11826ea..e37d077 100644 --- a/data/maps/the_partial/doors.txtpb +++ b/data/maps/the_partial/doors.txtpb | |||
| @@ -49,7 +49,8 @@ doors { | |||
| 49 | } | 49 | } |
| 50 | doors { | 50 | doors { |
| 51 | name: "Control Center Entrance" | 51 | name: "Control Center Entrance" |
| 52 | type: LEGACY_LOCATION | 52 | type: EVENT |
| 53 | legacy_location: true | ||
| 53 | #receivers: "Components/Doors/controlDoor" | 54 | #receivers: "Components/Doors/controlDoor" |
| 54 | panels { room: "Control Center Entrance" name: "RETURN" } | 55 | panels { room: "Control Center Entrance" name: "RETURN" } |
| 55 | location_room: "Control Center Entrance" | 56 | location_room: "Control Center Entrance" |
| diff --git a/data/maps/the_plaza/doors.txtpb b/data/maps/the_plaza/doors.txtpb index d95273c..fef8954 100644 --- a/data/maps/the_plaza/doors.txtpb +++ b/data/maps/the_plaza/doors.txtpb | |||
| @@ -210,3 +210,31 @@ doors { | |||
| 210 | panels { room: "Bottom Right Room" name: "HONEY" } | 210 | panels { room: "Bottom Right Room" name: "HONEY" } |
| 211 | panels { room: "Bottom Right Room" name: "INJECT" } | 211 | panels { room: "Bottom Right Room" name: "INJECT" } |
| 212 | } | 212 | } |
| 213 | doors { | ||
| 214 | name: "Near Sirenic Panel" | ||
| 215 | type: LOCATION_ONLY | ||
| 216 | panels { room: "Sirenic Entrance" name: "SIREN" } | ||
| 217 | location_room: "Sirenic Entrance" | ||
| 218 | location_name: "SIREN" | ||
| 219 | } | ||
| 220 | doors { | ||
| 221 | name: "Near Symbolic Panel" | ||
| 222 | type: LOCATION_ONLY | ||
| 223 | panels { room: "Symbolic Entrance" name: "FIGURATIVE" } | ||
| 224 | location_room: "Symbolic Entrance" | ||
| 225 | location_name: "FIGURATIVE" | ||
| 226 | } | ||
| 227 | doors { | ||
| 228 | name: "Near Repetitive Panel" | ||
| 229 | type: LOCATION_ONLY | ||
| 230 | panels { room: "Repetitive Entrance" name: "TEDIOUS" } | ||
| 231 | location_room: "Repetitive Entrance" | ||
| 232 | location_name: "TEDIOUS" | ||
| 233 | } | ||
| 234 | doors { | ||
| 235 | name: "Near Broken Portal Panel" | ||
| 236 | type: LOCATION_ONLY | ||
| 237 | panels { room: "Main Area" name: "AFFABLE" } | ||
| 238 | location_room: "Main Area" | ||
| 239 | location_name: "AFFABLE" | ||
| 240 | } | ||
| diff --git a/data/maps/the_relentless/doors.txtpb b/data/maps/the_relentless/doors.txtpb index e970e40..e755d0b 100644 --- a/data/maps/the_relentless/doors.txtpb +++ b/data/maps/the_relentless/doors.txtpb | |||
| @@ -26,7 +26,8 @@ doors { | |||
| 26 | } | 26 | } |
| 27 | doors { | 27 | doors { |
| 28 | name: "Left/Turn Door" | 28 | name: "Left/Turn Door" |
| 29 | type: LEGACY_LOCATION | 29 | type: EVENT |
| 30 | legacy_location: true | ||
| 30 | panels { room: "Left Room" name: "HIDE" } | 31 | panels { room: "Left Room" name: "HIDE" } |
| 31 | panels { room: "Left Room" name: "LEFT" } | 32 | panels { room: "Left Room" name: "LEFT" } |
| 32 | panels { room: "Left Room" name: "MORE" } | 33 | panels { room: "Left Room" name: "MORE" } |
| @@ -37,7 +38,8 @@ doors { | |||
| 37 | } | 38 | } |
| 38 | doors { | 39 | doors { |
| 39 | name: "Turn/Shop Door" | 40 | name: "Turn/Shop Door" |
| 40 | type: LEGACY_LOCATION | 41 | type: EVENT |
| 42 | legacy_location: true | ||
| 41 | panels { room: "Turn Room" name: "HIDE (1)" } | 43 | panels { room: "Turn Room" name: "HIDE (1)" } |
| 42 | panels { room: "Turn Room" name: "HIDE (2)" } | 44 | panels { room: "Turn Room" name: "HIDE (2)" } |
| 43 | panels { room: "Turn Room" name: "MORE" } | 45 | panels { room: "Turn Room" name: "MORE" } |
| diff --git a/data/maps/the_repetitive/doors.txtpb b/data/maps/the_repetitive/doors.txtpb index d964928..95d189f 100644 --- a/data/maps/the_repetitive/doors.txtpb +++ b/data/maps/the_repetitive/doors.txtpb | |||
| @@ -20,12 +20,21 @@ doors { | |||
| 20 | } | 20 | } |
| 21 | doors { | 21 | doors { |
| 22 | name: "Dot Area Entrance" | 22 | name: "Dot Area Entrance" |
| 23 | type: STANDARD | 23 | type: ITEM_ONLY |
| 24 | legacy_location: true | ||
| 24 | receivers: "Components/Doors/Door8" | 25 | receivers: "Components/Doors/Door8" |
| 25 | panels { room: "Main Room" name: "HOTS (2)" } | 26 | panels { room: "Main Room" name: "HOTS (2)" } |
| 26 | location_room: "Main Room" | 27 | location_room: "Main Room" |
| 27 | } | 28 | } |
| 28 | doors { | 29 | doors { |
| 30 | name: "Hots Panels" | ||
| 31 | type: LOCATION_ONLY | ||
| 32 | panels { room: "Main Room" name: "HOTS (1)" } | ||
| 33 | panels { room: "Main Room" name: "HOTS (2)" } | ||
| 34 | location_room: "Main Room" | ||
| 35 | location_name: "HOTS (1), HOTS (2)" | ||
| 36 | } | ||
| 37 | doors { | ||
| 29 | name: "Lime Door" | 38 | name: "Lime Door" |
| 30 | type: STANDARD | 39 | type: STANDARD |
| 31 | receivers: "Components/Doors/Door9" | 40 | receivers: "Components/Doors/Door9" |
| @@ -200,3 +209,35 @@ doors { | |||
| 200 | senders: "Components/Collectables/anticollectable" | 209 | senders: "Components/Collectables/anticollectable" |
| 201 | location_room: "Anti Room" | 210 | location_room: "Anti Room" |
| 202 | } | 211 | } |
| 212 | doors { | ||
| 213 | name: "H2 Room Puzzles" | ||
| 214 | type: LOCATION_ONLY | ||
| 215 | panels { room: "Main Room" name: "HEIGHT (1)" } | ||
| 216 | panels { room: "Main Room" name: "HEIGHT (2)" } | ||
| 217 | panels { room: "Main Room" name: "HEIGHT (3)" } | ||
| 218 | panels { room: "Main Room" name: "HEIGHT (4)" } | ||
| 219 | panels { room: "Main Room" name: "HEIGHT (5)" } | ||
| 220 | panels { room: "Main Room" name: "HEIGHT (6)" } | ||
| 221 | panels { room: "Main Room" name: "QUESTION" } | ||
| 222 | panels { room: "Main Room" name: "INTUITION" } | ||
| 223 | panels { room: "Main Room" name: "?" } | ||
| 224 | panels { room: "Main Room" name: "HAND" } | ||
| 225 | panels { room: "Main Room" name: "? HAND" } | ||
| 226 | panels { room: "Main Room" name: "RICHES" } | ||
| 227 | panels { room: "Main Room" name: "? RICHES" } | ||
| 228 | panels { room: "Main Room" name: "MISHMASH" } | ||
| 229 | location_room: "Main Room" | ||
| 230 | } | ||
| 231 | doors { | ||
| 232 | name: "Anti-Collectable Room Panels" | ||
| 233 | type: LOCATION_ONLY | ||
| 234 | panels { room: "Anti Room" name: "EYE (1)" } | ||
| 235 | panels { room: "Anti Room" name: "EYE (2)" } | ||
| 236 | panels { room: "Anti Room" name: "HA (1)" } | ||
| 237 | panels { room: "Anti Room" name: "HA (2)" } | ||
| 238 | panels { room: "Anti Room" name: "HA (3)" } | ||
| 239 | panels { room: "Anti Room" name: "HA (4)" } | ||
| 240 | panels { room: "Anti Room" name: "HA (5)" } | ||
| 241 | panels { room: "Anti Room" name: "TWO" } | ||
| 242 | location_room: "Anti Room" | ||
| 243 | } | ||
| diff --git a/data/maps/the_stellar/doors.txtpb b/data/maps/the_stellar/doors.txtpb index 0656885..1359189 100644 --- a/data/maps/the_stellar/doors.txtpb +++ b/data/maps/the_stellar/doors.txtpb | |||
| @@ -93,3 +93,12 @@ doors { | |||
| 93 | panels { room: "Connected Area" name: "QUESTION (2)" } | 93 | panels { room: "Connected Area" name: "QUESTION (2)" } |
| 94 | location_room: "Connected Area" | 94 | location_room: "Connected Area" |
| 95 | } | 95 | } |
| 96 | doors { | ||
| 97 | name: "Welcome Back Panels" | ||
| 98 | type: LOCATION_ONLY | ||
| 99 | panels { room: "Connected Area" name: "GREETINGS" } | ||
| 100 | panels { room: "Connected Area" name: "BEHIND" } | ||
| 101 | panels { room: "Connected Area" name: "Blank" } | ||
| 102 | location_room: "Connected Area" | ||
| 103 | location_name: "BEHIND, GREETINGS, Blank" | ||
| 104 | } | ||
| diff --git a/data/maps/the_talented/doors.txtpb b/data/maps/the_talented/doors.txtpb index d4d3148..766e003 100644 --- a/data/maps/the_talented/doors.txtpb +++ b/data/maps/the_talented/doors.txtpb | |||
| @@ -52,3 +52,10 @@ doors { | |||
| 52 | panels { room: "Back Room" name: "RELEVANT" } | 52 | panels { room: "Back Room" name: "RELEVANT" } |
| 53 | panels { room: "Back Room" name: "LONE" } | 53 | panels { room: "Back Room" name: "LONE" } |
| 54 | } | 54 | } |
| 55 | doors { | ||
| 56 | name: "Keyholder Hint Panel" | ||
| 57 | type: LOCATION_ONLY | ||
| 58 | panels { room: "Main Area" name: "EARL" } | ||
| 59 | location_room: "Main Area" | ||
| 60 | location_name: "EARL" | ||
| 61 | } | ||
| diff --git a/data/maps/the_unkempt/doors.txtpb b/data/maps/the_unkempt/doors.txtpb index 446fe69..d2e9bc6 100644 --- a/data/maps/the_unkempt/doors.txtpb +++ b/data/maps/the_unkempt/doors.txtpb | |||
| @@ -185,3 +185,20 @@ doors { | |||
| 185 | panels { room: "Right Area" name: "TOUGH" } | 185 | panels { room: "Right Area" name: "TOUGH" } |
| 186 | location_room: "Right Area" | 186 | location_room: "Right Area" |
| 187 | } | 187 | } |
| 188 | doors { | ||
| 189 | name: "Near Teal Door Panels" | ||
| 190 | type: LOCATION_ONLY | ||
| 191 | panels { room: "Main Area" name: "I" } | ||
| 192 | panels { room: "Main Area" name: "SPY" } | ||
| 193 | panels { room: "Main Area" name: "HEFT" } | ||
| 194 | panels { room: "Main Area" name: "THEFT" } | ||
| 195 | location_room: "Main Area" | ||
| 196 | location_name: "HEFT, I, SPY, THEFT" | ||
| 197 | } | ||
| 198 | doors { | ||
| 199 | name: "Control Center Orange Panel" | ||
| 200 | type: LOCATION_ONLY | ||
| 201 | panels { room: "Right Area" name: "COLOR" } | ||
| 202 | location_room: "Right Area" | ||
| 203 | location_name: "COLOR" | ||
| 204 | } | ||
| diff --git a/data/maps/the_unyielding/doors.txtpb b/data/maps/the_unyielding/doors.txtpb index a3c3999..265442c 100644 --- a/data/maps/the_unyielding/doors.txtpb +++ b/data/maps/the_unyielding/doors.txtpb | |||
| @@ -504,3 +504,42 @@ doors { | |||
| 504 | receivers: "Panels/Miscellaneous/entry_3/teleportListener" | 504 | receivers: "Panels/Miscellaneous/entry_3/teleportListener" |
| 505 | double_letters: true | 505 | double_letters: true |
| 506 | } | 506 | } |
| 507 | doors { | ||
| 508 | name: "Blue D Room Puzzles" | ||
| 509 | type: LOCATION_ONLY | ||
| 510 | panels { room: "Central Connected Area" name: "FOX" } | ||
| 511 | panels { room: "Central Connected Area" name: "LOCKS" } | ||
| 512 | panels { room: "Central Connected Area" name: "BOX" } | ||
| 513 | panels { room: "Central Connected Area" name: "SQUAWKS" } | ||
| 514 | panels { room: "Central Connected Area" name: "HAWKS" } | ||
| 515 | panels { room: "Central Connected Area" name: "TALKS" } | ||
| 516 | location_room: "Central Connected Area" | ||
| 517 | } | ||
| 518 | doors { | ||
| 519 | name: "Color Hallway Panels" | ||
| 520 | type: LOCATION_ONLY | ||
| 521 | panels { room: "Brown Alcove" name: "BROW" } | ||
| 522 | panels { room: "Central Connected Area" name: "RANGE" } | ||
| 523 | panels { room: "Central Connected Area" name: "WHIT" } | ||
| 524 | panels { room: "Central Connected Area" name: "ALMOND" } | ||
| 525 | panels { room: "Central Connected Area" name: "DAY" } | ||
| 526 | panels { room: "Central Connected Area" name: "REAM" } | ||
| 527 | panels { room: "Central Connected Area" name: "SON (2)" } | ||
| 528 | panels { room: "Central Connected Area" name: "RAY" } | ||
| 529 | panels { room: "Central Connected Area" name: "BURROWING" } | ||
| 530 | panels { room: "Orange Alcove" name: "ON" } | ||
| 531 | panels { room: "Plaza Entrance" name: "GEE" } | ||
| 532 | panels { room: "Plaza Entrance" name: "SEA" } | ||
| 533 | panels { room: "Gray Alcove" name: "GRAVELY" } | ||
| 534 | panels { room: "Cyan Alcove" name: "CAN" } | ||
| 535 | panels { room: "Star Rooms" name: "CYANIDE" } | ||
| 536 | panels { room: "Star Rooms" name: "BACK" } | ||
| 537 | panels { room: "Black Alcove" name: "LACK" } | ||
| 538 | panels { room: "White Corners" name: "ARCH" } | ||
| 539 | panels { room: "White Corners" name: "ZERO" } | ||
| 540 | panels { room: "White Corners" name: "DAM" } | ||
| 541 | panels { room: "White Corners" name: "WHEN" } | ||
| 542 | panels { room: "Hero Room" name: "HER" } | ||
| 543 | panels { room: "Daisy Alcove" name: "CYANIDES" } | ||
| 544 | location_room: "Central Connected Area" | ||
| 545 | } | ||
| diff --git a/data/metadata.txtpb b/data/metadata.txtpb index a939456..a49edb0 100644 --- a/data/metadata.txtpb +++ b/data/metadata.txtpb | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | version { | 1 | version { |
| 2 | major: 7 | 2 | major: 8 |
| 3 | minor: 2 | 3 | minor: 0 |
| 4 | patch: 0 | 4 | patch: 0 |
| 5 | } | 5 | } |
| 6 | # Filler item. | 6 | # Filler item. |
| diff --git a/proto/data.proto b/proto/data.proto index d68c5c9..e9cc7d7 100644 --- a/proto/data.proto +++ b/proto/data.proto | |||
| @@ -30,9 +30,6 @@ enum DoorType { | |||
| 30 | 30 | ||
| 31 | // This door is never a location, and is an item as long as gallery painting shuffle is on. | 31 | // This door is never a location, and is an item as long as gallery painting shuffle is on. |
| 32 | GALLERY_PAINTING = 7; | 32 | GALLERY_PAINTING = 7; |
| 33 | |||
| 34 | // This location is not added to new worlds, but the client can send it out for backwards compataibility purposes. | ||
| 35 | LEGACY_LOCATION = 8; | ||
| 36 | } | 33 | } |
| 37 | 34 | ||
| 38 | enum DoorGroupType { | 35 | enum DoorGroupType { |
| @@ -159,6 +156,7 @@ message Door { | |||
| 159 | 156 | ||
| 160 | optional DoorType type = 8; | 157 | optional DoorType type = 8; |
| 161 | optional bool latch = 20; | 158 | optional bool latch = 20; |
| 159 | optional bool legacy_location = 21; | ||
| 162 | 160 | ||
| 163 | optional string location_name = 17; | 161 | optional string location_name = 17; |
| 164 | } | 162 | } |
| diff --git a/proto/human.proto b/proto/human.proto index 1cd0f10..c586599 100644 --- a/proto/human.proto +++ b/proto/human.proto | |||
| @@ -119,6 +119,11 @@ message HumanDoor { | |||
| 119 | // opening trigger is deactivated. This applies to EVENT/LOCATION_ONLY doors, | 119 | // opening trigger is deactivated. This applies to EVENT/LOCATION_ONLY doors, |
| 120 | // as well as item-locked doors when not shuffling doors. | 120 | // as well as item-locked doors when not shuffling doors. |
| 121 | optional bool latch = 17; | 121 | optional bool latch = 17; |
| 122 | |||
| 123 | // If true, the client will treat this door like a location, even though no | ||
| 124 | // location is created for it in the generator. This helps provide backwards | ||
| 125 | // compatability with older worlds. | ||
| 126 | optional bool legacy_location = 18; | ||
| 122 | } | 127 | } |
| 123 | 128 | ||
| 124 | message HumanDoors { | 129 | message HumanDoors { |
| diff --git a/tools/assign_ids/main.cpp b/tools/assign_ids/main.cpp index 8010a9a..4cf7c3f 100644 --- a/tools/assign_ids/main.cpp +++ b/tools/assign_ids/main.cpp | |||
| @@ -112,7 +112,8 @@ class AssignIds { | |||
| 112 | 112 | ||
| 113 | void ProcessDoor(const HumanDoor& h_door, | 113 | void ProcessDoor(const HumanDoor& h_door, |
| 114 | const std::string& current_map_name) { | 114 | const std::string& current_map_name) { |
| 115 | if (h_door.type() == DoorType::EVENT && !h_door.latch()) { | 115 | if (h_door.type() == DoorType::EVENT && !h_door.latch() && |
| 116 | !h_door.legacy_location()) { | ||
| 116 | return; | 117 | return; |
| 117 | } | 118 | } |
| 118 | 119 | ||
| diff --git a/tools/datapacker/main.cpp b/tools/datapacker/main.cpp index cf811c9..8109bf5 100644 --- a/tools/datapacker/main.cpp +++ b/tools/datapacker/main.cpp | |||
| @@ -436,6 +436,10 @@ class DataPacker { | |||
| 436 | if (h_door.has_latch()) { | 436 | if (h_door.has_latch()) { |
| 437 | door.set_latch(h_door.latch()); | 437 | door.set_latch(h_door.latch()); |
| 438 | } | 438 | } |
| 439 | |||
| 440 | if (h_door.has_legacy_location()) { | ||
| 441 | door.set_legacy_location(h_door.legacy_location()); | ||
| 442 | } | ||
| 439 | } | 443 | } |
| 440 | 444 | ||
| 441 | void ProcessConnectionsFile(std::filesystem::path path, | 445 | void ProcessConnectionsFile(std::filesystem::path path, |
| diff --git a/tools/validator/validator.cpp b/tools/validator/validator.cpp index a99447a..fe36be7 100644 --- a/tools/validator/validator.cpp +++ b/tools/validator/validator.cpp | |||
| @@ -227,8 +227,7 @@ class Validator { | |||
| 227 | 227 | ||
| 228 | if (h_door.type() == DoorType::STANDARD || | 228 | if (h_door.type() == DoorType::STANDARD || |
| 229 | h_door.type() == DoorType::LOCATION_ONLY || | 229 | h_door.type() == DoorType::LOCATION_ONLY || |
| 230 | h_door.type() == DoorType::GRAVESTONE || | 230 | h_door.type() == DoorType::GRAVESTONE || h_door.legacy_location()) { |
| 231 | h_door.type() == DoorType::LEGACY_LOCATION) { | ||
| 232 | if (h_door.double_letters()) { | 231 | if (h_door.double_letters()) { |
| 233 | std::cout << "Door " << door_identifier.ShortDebugString() | 232 | std::cout << "Door " << door_identifier.ShortDebugString() |
| 234 | << " is a location that depends on double_letters." | 233 | << " is a location that depends on double_letters." |
| @@ -241,7 +240,8 @@ class Validator { | |||
| 241 | } | 240 | } |
| 242 | } | 241 | } |
| 243 | 242 | ||
| 244 | bool needs_id = (h_door.type() != DoorType::EVENT || h_door.latch()); | 243 | bool needs_id = (h_door.type() != DoorType::EVENT || h_door.latch() || |
| 244 | h_door.legacy_location()); | ||
| 245 | if (door_info.has_id != needs_id) { | 245 | if (door_info.has_id != needs_id) { |
| 246 | if (needs_id) { | 246 | if (needs_id) { |
| 247 | std::cout << "Door " << door_identifier.ShortDebugString() | 247 | std::cout << "Door " << door_identifier.ShortDebugString() |
