about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md30
-rw-r--r--README.md9
-rw-r--r--apworld/__init__.py11
-rw-r--r--apworld/client/client.gd26
-rw-r--r--apworld/client/gamedata.gd4
-rw-r--r--apworld/client/main.gd2
-rw-r--r--apworld/client/manager.gd28
-rw-r--r--apworld/client/player.gd107
-rw-r--r--apworld/client/textclient.gd102
-rw-r--r--apworld/client/unlockReaderListener.gd46
-rw-r--r--apworld/context.py114
-rw-r--r--apworld/player_logic.py3
-rw-r--r--apworld/static_logic.py9
-rw-r--r--apworld/tracker.py5
-rw-r--r--data/MISSING PANELS.txt32
-rw-r--r--data/ids.yaml87
-rw-r--r--data/maps/control_center/doors.txtpb13
-rw-r--r--data/maps/daedalus/doors.txtpb179
-rw-r--r--data/maps/the_bearer/doors.txtpb15
-rw-r--r--data/maps/the_colorful/doors.txtpb7
-rw-r--r--data/maps/the_congruent/doors.txtpb12
-rw-r--r--data/maps/the_crystalline/connections.txtpb1
-rw-r--r--data/maps/the_crystalline/doors.txtpb9
-rw-r--r--data/maps/the_digital/doors.txtpb7
-rw-r--r--data/maps/the_double_sided/doors.txtpb79
-rw-r--r--data/maps/the_entry/doors.txtpb88
-rw-r--r--data/maps/the_entry/rooms/Rabbit Hole.txtpb2
-rw-r--r--data/maps/the_fuzzy/doors.txtpb17
-rw-r--r--data/maps/the_gallery/doors.txtpb37
-rw-r--r--data/maps/the_gold/doors.txtpb7
-rw-r--r--data/maps/the_graveyard/doors.txtpb7
-rw-r--r--data/maps/the_great/doors.txtpb108
-rw-r--r--data/maps/the_great/rooms/Maze Tower.txtpb1
-rw-r--r--data/maps/the_impressive/doors.txtpb16
-rw-r--r--data/maps/the_jubilant/doors.txtpb11
-rw-r--r--data/maps/the_nuanced/doors.txtpb7
-rw-r--r--data/maps/the_owl/doors.txtpb122
-rw-r--r--data/maps/the_parthenon/doors.txtpb9
-rw-r--r--data/maps/the_partial/doors.txtpb3
-rw-r--r--data/maps/the_plaza/doors.txtpb28
-rw-r--r--data/maps/the_relentless/doors.txtpb6
-rw-r--r--data/maps/the_repetitive/doors.txtpb43
-rw-r--r--data/maps/the_stellar/doors.txtpb9
-rw-r--r--data/maps/the_talented/doors.txtpb7
-rw-r--r--data/maps/the_unkempt/doors.txtpb17
-rw-r--r--data/maps/the_unyielding/doors.txtpb39
-rw-r--r--data/metadata.txtpb4
-rw-r--r--proto/data.proto4
-rw-r--r--proto/human.proto5
-rw-r--r--tools/assign_ids/main.cpp3
-rw-r--r--tools/datapacker/main.cpp4
-rw-r--r--tools/validator/validator.cpp6
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
27Download:
28[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.0/lingo2.apworld)<br/>
29Template YAML:
30[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.0/Lingo%202.yaml)<br/>
31Source: [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
74Almost all maps that you can access from the base game are randomized. The 74Almost all maps that you can access from the base game are randomized. The only
75exceptions are: 75exception is The Hinterlands, which will probably be repurposed into a hint
76 76area. Some advanced/hidden maps are also disabled by default (as discussed
77- Demo 77below).
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 = []
26var _accessible_worldports = [] 26var _accessible_worldports = []
27var _goal_accessible = false 27var _goal_accessible = false
28var _latched_doors = [] 28var _latched_doors = []
29var _hinted_locations = []
29 30
30signal could_not_connect 31signal could_not_connect
31signal connect_status 32signal connect_status
@@ -38,8 +39,10 @@ signal hint_received(message)
38signal door_latched(id) 39signal door_latched(id)
39signal accessible_locations_updated 40signal accessible_locations_updated
40signal checked_locations_updated 41signal checked_locations_updated
42signal ignored_locations_updated(locations)
41signal checked_worldports_updated 43signal checked_worldports_updated
42signal keyboard_update_received 44signal keyboard_update_received
45signal hinted_locations_updated
43 46
44 47
45func _init(): 48func _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
203func connectToServer(server, un, pw): 221func 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
301func addIgnoredLocation(loc_id):
302 sendMessage([{"cmd": "IgnoreLocation", "id": loc_id}])
303
304
305func removeIgnoredLocation(loc_id):
306 sendMessage([{"cmd": "UnignoreLocation", "id": loc_id}])
307
308
283func sendQuit(): 309func 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 = []
15var anti_trap_ids = {} 15var anti_trap_ids = {}
16var location_name_by_id = {} 16var location_name_by_id = {}
17var ending_display_name_by_name = {} 17var ending_display_name_by_name = {}
18var port_id_by_ap_id = {}
18 19
19var kSYMBOL_ITEMS 20var 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 = {}
29var _held_letters = {} 29var _held_letters = {}
30var _letters_setup = false 30var _letters_setup = false
31var _already_connected = false 31var _already_connected = false
32var _ignored_locations = []
32 33
33const kSHUFFLE_LETTERS_VANILLA = 0 34const kSHUFFLE_LETTERS_VANILLA = 0
34const kSHUFFLE_LETTERS_UNLOCKED = 1 35const 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
390func _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
398func _on_hinted_locations_updated():
399 var textclient_node = global.get_node("Textclient")
400 if textclient_node != null:
401 textclient_node.update_locations()
402
403
387func _on_door_latched(door_id): 404func _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
699func 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 = {}
16var tracker_port_tree_item_by_id = {} 16var tracker_port_tree_item_by_id = {}
17var tracker_goal_tree_item = null 17var tracker_goal_tree_item = null
18var tracker_object_by_index = {} 18var tracker_object_by_index = {}
19var tracker_object_by_ignored_index = {}
20var tracker_ignored_group = null
19 21
20var worldports_tab 22var worldports_tab
21var worldports_tree 23var 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
360func _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
314func update_locations_visibility(): 369func 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
319func _on_tracker_button_clicked(): 374func _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
336func display_logical_path(object_type, object_id, paths): 404func 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 @@
1extends "res://scripts/nodes/listeners/unlockReaderListener.gd"
2
3var item_id = null
4var item_amount
5
6
7func _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
32func _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
42func 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 = {
30REVERSE_KEY_STORAGE_MAPPING = {t: k for k, t in KEY_STORAGE_MAPPING.items()} 30REVERSE_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.
33class Lingo2Manager: 43class 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
94class Lingo2GameContext: 111class 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
546async def pipe_loop(manager: Lingo2Manager): 636async 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 @@
1Used in vanilla doors:
2
3The Between - RIGHT
4
5
6
7
8Used in a pseudo-connection:
9
10The Sturdy - COLORS
11
12
13
14
15Unsolved panels in letter rooms:
16
17Daedalus (F2 Room) - DEADLY
18Daedalus (F2 Room) - DIMS
19Daedalus (F2 Room) - GRAVE
20Daedalus (F2 Room) - LETHAL
21Daedalus (O2 Room) - ACCEPT
22Daedalus (O2 Room) - FOLLOW
23Daedalus (O2 Room) - PLEDGE
24Daedalus (O2 Room) - WARNING
25Daedalus (U2 Room) - EFFECTIVE
26Daedalus (U2 Room) - HELPFUL
27Daedalus (U2 Room) - INFERNAL
28Daedalus (U2 Room) - PRACTICAL
29Daedalus (U2 Room) - PRODUCTIVE
30Daedalus (U2 Room) - WONDERLAND
31The Digital - EYE
32The 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}
168doors {
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}
175doors {
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}
189doors { 189doors {
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}
196doors { 198doors {
197 name: "Welcome Back Door" 199 name: "Welcome Back Door"
@@ -225,12 +227,21 @@ doors {
225} 227}
226doors { 228doors {
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}
233doors { 236doors {
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}
244doors {
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}
301doors { 312doors {
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}
320doors { 332doors {
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}
357doors {
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}
364doors {
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}
374doors {
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}
821doors { 875doors {
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}
828doors { 883doors {
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}
893doors {
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}
887doors { 952doors {
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}
1769doors { 1838doors {
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}
1776doors { 1846doors {
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}
1855doors {
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}
1863doors {
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}
1870doors {
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}
1933doors { 2027doors {
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}
2401doors {
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}
2408doors {
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}
2418doors {
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}
2425doors {
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}
2433doors {
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}
2441doors {
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}
2448doors {
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}
2455doors {
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}
2463doors {
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}
254doors {
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}
261doors {
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}
106doors {
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 @@
1doors { 1doors {
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}
9doors { 10doors {
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}
19doors {
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 @@
1connections { 1connections {
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}
6connections { 7connections {
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}
6doors {
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}
56doors {
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.
117doors {
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}
143doors {
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}
169doors {
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.
70doors { 70doors {
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}
78doors { 79doors {
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}
88doors {
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}
85doors { 96doors {
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}
105doors {
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}
120doors { 140doors {
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}
155doors {
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}
164doors {
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}
172doors {
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.
135doors { 181doors {
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}
370doors {
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}
384doors {
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}
391doors {
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}
398doors {
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 @@
1name: "Rabbit Hole" 1name: "Rabbit Hole"
2panel_display_name: "Red Blue Area" 2panel_display_name: "Red Blue Area"
3panels { 3panels {
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}
8doors { 8doors {
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}
25doors {
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}
35doors { 35doors {
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}
78doors { 78doors {
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}
150doors { 150doors {
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}
157doors { 157doors {
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}
164doors { 164doors {
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}
171doors { 171doors {
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}
195doors { 195doors {
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}
202doors { 202doors {
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}
209doors { 209doors {
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}
216doors { 216doors {
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}
223doors { 223doors {
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}
230doors { 230doors {
@@ -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}
260doors { 261doors {
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 @@
1doors {
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}
26doors {
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}
31doors { 31doors {
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}
40doors {
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}
418doors { 427doors {
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}
535doors {
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}
546doors {
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}
553doors {
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}
560doors {
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}
567doors {
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}
574doors {
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}
582doors {
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}
590doors {
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}
599doors {
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}
608doors {
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}
617doors {
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}
624doors {
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 @@
1name: "Maze Tower" 1name: "Maze Tower"
2panel_display_name: "Courtyard"
3panels { 2panels {
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}
32doors { 32doors {
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}
41doors {
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}
48doors {
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}
34doors {
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}
55doors {
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 @@
1doors { 1doors {
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}
8doors { 9doors {
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}
16doors { 18doors {
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}
24doors { 27doors {
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}
31doors { 35doors {
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}
38doors { 43doors {
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}
66doors { 72doors {
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}
94doors { 101doors {
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}
122doors { 130doors {
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}
150doors { 159doors {
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}
178doors { 188doors {
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}
206doors { 217doors {
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}
266doors {
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}
275doors {
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}
284doors {
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}
291doors {
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}
299doors {
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}
309doors {
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}
319doors {
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}
328doors {
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}
336doors {
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}
345doors {
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}
46doors {
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}
50doors { 50doors {
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}
213doors {
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}
220doors {
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}
227doors {
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}
234doors {
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}
27doors { 27doors {
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}
38doors { 39doors {
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}
21doors { 21doors {
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}
28doors { 29doors {
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}
37doors {
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}
212doors {
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}
231doors {
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}
96doors {
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}
55doors {
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}
188doors {
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}
198doors {
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}
507doors {
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}
518doors {
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 @@
1version { 1version {
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
38enum DoorGroupType { 35enum 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
124message HumanDoors { 129message 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()