about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--apworld/client/manager.gd2
-rw-r--r--apworld/client/player.gd115
-rw-r--r--apworld/options.py15
-rw-r--r--apworld/player_logic.py4
-rw-r--r--data/connections.txtpb82
-rw-r--r--data/ids.yaml57
-rw-r--r--data/maps/icarus/connections.txtpb15
-rw-r--r--data/maps/icarus/doors.txtpb66
-rw-r--r--data/maps/icarus/metadata.txtpb2
-rw-r--r--data/maps/icarus/rooms/Mastery.txtpb5
-rw-r--r--data/maps/icarus/rooms/Trans Rights Panels.txtpb22
-rw-r--r--data/maps/icarus/rooms/Trans Rights.txtpb21
-rw-r--r--data/maps/the_advanced/metadata.txtpb2
-rw-r--r--data/maps/the_charismatic/connections.txtpb35
-rw-r--r--data/maps/the_charismatic/doors.txtpb56
-rw-r--r--data/maps/the_charismatic/metadata.txtpb4
-rw-r--r--data/maps/the_charismatic/rooms/Latitude Middle.txtpb8
-rw-r--r--data/maps/the_charismatic/rooms/Latitude North.txtpb8
-rw-r--r--data/maps/the_charismatic/rooms/Latitude South.txtpb8
-rw-r--r--data/maps/the_charismatic/rooms/Longitude East.txtpb8
-rw-r--r--data/maps/the_charismatic/rooms/Longitude Middle.txtpb8
-rw-r--r--data/maps/the_charismatic/rooms/Longitude West.txtpb8
-rw-r--r--data/maps/the_charismatic/rooms/Main Area.txtpb78
-rw-r--r--data/maps/the_charismatic/rooms/Mastery.txtpb5
-rw-r--r--data/maps/the_crystalline/connections.txtpb25
-rw-r--r--data/maps/the_crystalline/doors.txtpb5
-rw-r--r--data/maps/the_crystalline/metadata.txtpb4
-rw-r--r--data/maps/the_crystalline/rooms/Flip Area.txtpb14
-rw-r--r--data/maps/the_crystalline/rooms/Main Area.txtpb29
-rw-r--r--data/maps/the_crystalline/rooms/Mastery.txtpb5
-rw-r--r--data/maps/the_crystalline/rooms/Painting Divot.txtpb5
-rw-r--r--data/maps/the_entry/metadata.txtpb5
-rw-r--r--data/maps/the_entry/rooms/Starting Room.txtpb2
-rw-r--r--data/maps/the_sturdy/metadata.txtpb3
-rw-r--r--proto/human.proto13
-rw-r--r--tools/validator/human_processor.cpp4
36 files changed, 714 insertions, 34 deletions
diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index 91797b2..41ab648 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd
@@ -64,6 +64,7 @@ var apworld_version = [0, 0, 0]
64var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2 64var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2
65var daedalus_roof_access = false 65var daedalus_roof_access = false
66var enable_gift_maps = [] 66var enable_gift_maps = []
67var enable_icarus = false
67var keyholder_sanity = false 68var keyholder_sanity = false
68var port_pairings = {} 69var port_pairings = {}
69var shuffle_control_center_colors = false 70var shuffle_control_center_colors = false
@@ -441,6 +442,7 @@ func _client_connected(slot_data):
441 cyan_door_behavior = int(slot_data.get("cyan_door_behavior", 0)) 442 cyan_door_behavior = int(slot_data.get("cyan_door_behavior", 0))
442 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) 443 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false))
443 enable_gift_maps = slot_data.get("enable_gift_maps", []) 444 enable_gift_maps = slot_data.get("enable_gift_maps", [])
445 enable_icarus = bool(slot_data.get("enable_icarus", false))
444 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) 446 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false))
445 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false)) 447 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false))
446 shuffle_doors = bool(slot_data.get("shuffle_doors", false)) 448 shuffle_doors = bool(slot_data.get("shuffle_doors", false))
diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 43bf758..8aee21a 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd
@@ -78,6 +78,7 @@ func _ready():
78 # Add the gift map entry panel if needed. 78 # Add the gift map entry panel if needed.
79 if not ap.enable_gift_maps.is_empty(): 79 if not ap.enable_gift_maps.is_empty():
80 var panel_prefab = preload("res://objects/nodes/panel.tscn") 80 var panel_prefab = preload("res://objects/nodes/panel.tscn")
81 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
81 var wpl_prefab = preload("res://objects/nodes/listeners/worldportListener.tscn") 82 var wpl_prefab = preload("res://objects/nodes/listeners/worldportListener.tscn")
82 83
83 var giftmap_parent = Node.new() 84 var giftmap_parent = Node.new()
@@ -93,7 +94,7 @@ func _ready():
93 94
94 var giftmap_panel = panel_prefab.instantiate() 95 var giftmap_panel = panel_prefab.instantiate()
95 giftmap_panel.name = "Panel" 96 giftmap_panel.name = "Panel"
96 giftmap_panel.position = Vector3(33.5, 1, 5.5) 97 giftmap_panel.position = Vector3(33.5, -190, 5.5)
97 giftmap_panel.rotation_degrees = Vector3(-45, 0, 0) 98 giftmap_panel.rotation_degrees = Vector3(-45, 0, 0)
98 giftmap_panel.clue = "player" 99 giftmap_panel.clue = "player"
99 giftmap_panel.answer = symbolless_player 100 giftmap_panel.answer = symbolless_player
@@ -112,8 +113,46 @@ func _ready():
112 icely_wpl.senders.append(NodePath("../IcelyPanel")) 113 icely_wpl.senders.append(NodePath("../IcelyPanel"))
113 giftmap_parent.add_child.call_deferred(icely_wpl) 114 giftmap_parent.add_child.call_deferred(icely_wpl)
114 115
116 if ap.enable_gift_maps.has("The Charismatic"):
117 var souvey_panel = panel_prefab.instantiate()
118 souvey_panel.name = "SouveyPanel"
119 souvey_panel.answer = "souvey"
120 souvey_panel.position = Vector3(33.5, -210, 5.5)
121 giftmap_panel.proxies.append(NodePath("../SouveyPanel"))
122 giftmap_parent.add_child.call_deferred(souvey_panel)
123
124 var souvey_wpl = wpl_prefab.instantiate()
125 souvey_wpl.name = "SouveyWpl"
126 souvey_wpl.exit = "the_charismatic"
127 souvey_wpl.senders.append(NodePath("../SouveyPanel"))
128 giftmap_parent.add_child.call_deferred(souvey_wpl)
129
130 if ap.enable_gift_maps.has("The Crystalline"):
131 var q_panel = panel_prefab.instantiate()
132 q_panel.name = "QPanel"
133 q_panel.answer = "q"
134 q_panel.position = Vector3(33.5, -220, 5.5)
135 giftmap_panel.proxies.append(NodePath("../QPanel"))
136 giftmap_parent.add_child.call_deferred(q_panel)
137
138 var q_wpl = wpl_prefab.instantiate()
139 q_wpl.name = "QWpl"
140 q_wpl.exit = "the_crystalline"
141 q_wpl.senders.append(NodePath("../QPanel"))
142 giftmap_parent.add_child.call_deferred(q_wpl)
143
115 giftmap_parent.add_child.call_deferred(giftmap_panel) 144 giftmap_parent.add_child.call_deferred(giftmap_panel)
116 145
146 var giftmap_tpl = tpl_prefab.instantiate()
147 giftmap_tpl.name = "PanelTeleporter"
148 giftmap_tpl.teleport_point = Vector3(33.5, 1, 5.5)
149 giftmap_tpl.teleport_rotate = Vector3(-45, 0, 0)
150 giftmap_tpl.target_path = giftmap_panel
151 giftmap_tpl.senders.append(
152 NodePath("/root/scene/Components/Listeners/unlockReaderListenerDoubles")
153 )
154 giftmap_parent.add_child.call_deferred(giftmap_tpl)
155
117 # Add the strict purple ending validation. 156 # Add the strict purple ending validation.
118 if global.map == "the_sun_temple" and ap.strict_purple_ending: 157 if global.map == "the_sun_temple" and ap.strict_purple_ending:
119 var panel_prefab = preload("res://objects/nodes/panel.tscn") 158 var panel_prefab = preload("res://objects/nodes/panel.tscn")
@@ -222,6 +261,34 @@ func _ready():
222 var rte_trigger = get_node("/root/scene/Components/Warps/triggerArea") 261 var rte_trigger = get_node("/root/scene/Components/Warps/triggerArea")
223 rte_trigger.position.z = 0 262 rte_trigger.position.z = 0
224 263
264 # Add the mastery to Icarus.
265 if global.map == "icarus" and ap.enable_icarus:
266 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
267 var saver_prefab = preload("res://objects/nodes/saver.tscn")
268 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
269
270 var mastery = collectable_prefab.instantiate()
271 mastery.name = "collectable"
272 mastery.position = Vector3(0, -2000, 0)
273 mastery.unlock_type = "smiley"
274 mastery.material_override = load("res://assets/materials/gold.material")
275 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
276
277 var tpl = tpl_prefab.instantiate()
278 tpl.teleport_point = Vector3(56.25, 0, -5.5)
279 tpl.teleport_rotate = Vector3(0, 0, 0)
280 tpl.target_path = mastery
281 tpl.name = "Teleport"
282 tpl.senderGroup.append(NodePath("/root/scene/Panels"))
283 tpl.nested = true
284 mastery.add_child.call_deferred(tpl)
285
286 var saver = saver_prefab.instantiate()
287 saver.name = "saver_collectables"
288 saver.type = "collectables"
289 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
290 get_node("/root/scene").add_child.call_deferred(saver)
291
225 # Add the mastery to The Advanced. 292 # Add the mastery to The Advanced.
226 if global.map == "the_advanced": 293 if global.map == "the_advanced":
227 var collectable_prefab = preload("res://objects/nodes/collectable.tscn") 294 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
@@ -251,6 +318,52 @@ func _ready():
251 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables")) 318 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
252 get_node("/root/scene").add_child.call_deferred(saver) 319 get_node("/root/scene").add_child.call_deferred(saver)
253 320
321 # Add the mastery to The Charismatic.
322 if global.map == "the_charismatic":
323 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
324 var saver_prefab = preload("res://objects/nodes/saver.tscn")
325
326 var mastery = collectable_prefab.instantiate()
327 mastery.name = "collectable"
328 mastery.position = Vector3(-17, 2, -29)
329 mastery.rotation_degrees = Vector3(0, 45, 0)
330 mastery.unlock_type = "smiley"
331 mastery.material_override = load("res://assets/materials/gold.material")
332 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
333
334 var saver = saver_prefab.instantiate()
335 saver.name = "saver_collectables"
336 saver.type = "collectables"
337 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
338 get_node("/root/scene").add_child.call_deferred(saver)
339
340 # Add the mastery to The Crystalline.
341 if global.map == "the_crystalline":
342 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
343 var saver_prefab = preload("res://objects/nodes/saver.tscn")
344 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
345
346 var mastery = collectable_prefab.instantiate()
347 mastery.name = "collectable"
348 mastery.position = Vector3(0, 13, 37)
349 mastery.unlock_type = "smiley"
350 mastery.material_override = load("res://assets/materials/gold.material")
351 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
352
353 var tpl = tpl_prefab.instantiate()
354 tpl.teleport_point = Vector3(0, 11.5, -20)
355 tpl.teleport_rotate = Vector3(0, 0, 180)
356 tpl.target_path = mastery
357 tpl.name = "Teleport"
358 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_3"))
359 mastery.add_child.call_deferred(tpl)
360
361 var saver = saver_prefab.instantiate()
362 saver.name = "saver_collectables"
363 saver.type = "collectables"
364 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
365 get_node("/root/scene").add_child.call_deferred(saver)
366
254 ap.update_job_well_done_sign() 367 ap.update_job_well_done_sign()
255 368
256 # Set up door locations. 369 # Set up door locations.
diff --git a/apworld/options.py b/apworld/options.py index 4d9c3aa..7577e0c 100644 --- a/apworld/options.py +++ b/apworld/options.py
@@ -102,15 +102,20 @@ class EnableIcarus(Toggle):
102class EnableGiftMaps(OptionSet): 102class EnableGiftMaps(OptionSet):
103 """ 103 """
104 Controls whether the beta tester gift maps are randomized. By default, these are not accessible at all from within 104 Controls whether the beta tester gift maps are randomized. By default, these are not accessible at all from within
105 the randomizer. Enabling at least one gift map will cause a panel to appear in The Entry's Starting Room. Gift maps 105 the randomizer. This option allows you to enter the maps, and creates items and locations for them. If worldport
106 can be accessed by taking a player name that would ordinarily cause the game to load into a gift map, and entering 106 shuffle is on, their worldports will be included in the randomization.
107 it into this panel. 107
108 The gift maps are accessed via a panel in The Entry's Starting Room, which only appears if at least one gift map is
109 enabled. It is also treated like a cyan door, and will not appear until the condition specified in the Cyan Door
110 Behavior option is satisfied. Solving this panel with the name of one of the beta testers will teleport you to their
111 corresponding gift map.
108 112
109 In the base game, nothing happens once you complete a gift map. Masteries have been added to the gift maps in the 113 In the base game, nothing happens once you complete a gift map. Masteries have been added to the gift maps in the
110 randomizer so that the player can be rewarded for completing them. 114 randomizer so that the player can be rewarded for completing them.
111 115
112 Note that the gift maps are intended only for specific people, and as a result may be frustrating or require 116 Note that the gift maps were originally only intended to be played by specific people, and as a result may be
113 knowledge of inside jokes. The Crystalline is particularly difficult as it requires completing a parkour course. 117 frustrating or require knowledge of inside jokes. The Crystalline is particularly difficult as it requires
118 completing a parkour course.
114 """ 119 """
115 display_name = "Enable Gift Maps" 120 display_name = "Enable Gift Maps"
116 valid_keys = ["The Advanced", "The Charismatic", "The Crystalline", "The Fuzzy", "The Stellar"] 121 valid_keys = ["The Advanced", "The Charismatic", "The Crystalline", "The Fuzzy", "The Stellar"]
diff --git a/apworld/player_logic.py b/apworld/player_logic.py index 4f825b9..5f4f1d7 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py
@@ -237,6 +237,10 @@ class Lingo2PlayerLogic:
237 elif game_map.type == data_pb2.MapType.GIFT_MAP: 237 elif game_map.type == data_pb2.MapType.GIFT_MAP:
238 if game_map.name == "the_advanced": 238 if game_map.name == "the_advanced":
239 return "The Advanced" in world.options.enable_gift_maps.value 239 return "The Advanced" in world.options.enable_gift_maps.value
240 elif game_map.name == "the_charismatic":
241 return "The Charismatic" in world.options.enable_gift_maps.value
242 elif game_map.name == "the_crystalline":
243 return "The Crystalline" in world.options.enable_gift_maps.value
240 244
241 return False 245 return False
242 246
diff --git a/data/connections.txtpb b/data/connections.txtpb index 5027215..12d6cfe 100644 --- a/data/connections.txtpb +++ b/data/connections.txtpb
@@ -2522,3 +2522,85 @@ connections {
2522 } 2522 }
2523 oneway: true 2523 oneway: true
2524} 2524}
2525connections {
2526 from {
2527 panel {
2528 map: "the_entry"
2529 room: "Starting Room"
2530 name: "Gift Maps"
2531 answer: "souvey"
2532 }
2533 }
2534 to {
2535 room {
2536 map: "the_charismatic"
2537 name: "Main Area"
2538 }
2539 }
2540 oneway: true
2541}
2542connections {
2543 from {
2544 port {
2545 map: "the_charismatic"
2546 room: "Main Area"
2547 name: "WORLDPORT"
2548 }
2549 }
2550 to {
2551 room {
2552 map: "the_entry"
2553 name: "Starting Room"
2554 }
2555 }
2556 oneway: true
2557}
2558connections {
2559 from {
2560 panel {
2561 map: "the_entry"
2562 room: "Starting Room"
2563 name: "Gift Maps"
2564 answer: "q"
2565 }
2566 }
2567 to {
2568 room {
2569 map: "the_crystalline"
2570 name: "Main Area"
2571 }
2572 }
2573 oneway: true
2574}
2575connections {
2576 from {
2577 port {
2578 map: "the_crystalline"
2579 room: "Main Area"
2580 name: "WORLDPORT"
2581 }
2582 }
2583 to {
2584 room {
2585 map: "the_entry"
2586 name: "Starting Room"
2587 }
2588 }
2589 oneway: true
2590}
2591connections {
2592 # Possibly the most cursed connection in the entire game.
2593 from {
2594 room {
2595 map: "the_crystalline"
2596 name: "Flip Area"
2597 }
2598 }
2599 to {
2600 room {
2601 map: "icarus"
2602 name: "Welcome Spine (Obverse)"
2603 }
2604 }
2605 oneway: true
2606}
diff --git a/data/ids.yaml b/data/ids.yaml index bfa1f5c..dc57d10 100644 --- a/data/ids.yaml +++ b/data/ids.yaml
@@ -1229,6 +1229,9 @@ maps:
1229 panels: 1229 panels:
1230 DIAGNOSIS: 2882 1230 DIAGNOSIS: 2882
1231 QUEEN: 2883 1231 QUEEN: 2883
1232 Mastery:
1233 masteries:
1234 MASTERY: 2994
1232 Maze: 1235 Maze:
1233 panels: 1236 panels:
1234 ANALYSIS: 2887 1237 ANALYSIS: 2887
@@ -1288,11 +1291,13 @@ maps:
1288 PRINCE: 2921 1291 PRINCE: 2921
1289 Trans Rights: 1292 Trans Rights:
1290 panels: 1293 panels:
1294 SERVANT (1): 2926
1295 SERVANT (2): 2927
1296 Trans Rights Panels:
1297 panels:
1291 AGENDER: 2923 1298 AGENDER: 2923
1292 HUMAN (3): 2924 1299 HUMAN (3): 2924
1293 HUMAN (4): 2925 1300 HUMAN (4): 2925
1294 SERVANT (1): 2926
1295 SERVANT (2): 2927
1296 Welcome Spine (Obverse): 1301 Welcome Spine (Obverse):
1297 panels: 1302 panels:
1298 FISHWIFE: 2928 1303 FISHWIFE: 2928
@@ -1540,6 +1545,41 @@ maps:
1540 Mastery: 1545 Mastery:
1541 masteries: 1546 masteries:
1542 MASTERY: 140 1547 MASTERY: 140
1548 the_charismatic:
1549 rooms:
1550 Latitude Middle:
1551 panels:
1552 FUNNY: 2972
1553 Latitude North:
1554 panels:
1555 DEPENDABLE: 2973
1556 Latitude South:
1557 panels:
1558 CHARISMA: 2974
1559 Longitude East:
1560 panels:
1561 FUN: 2975
1562 Longitude Middle:
1563 panels:
1564 INTELLIGENT: 2976
1565 Longitude West:
1566 panels:
1567 CREATIVE: 2977
1568 Main Area:
1569 panels:
1570 AQUA: 2981
1571 ARC: 2978
1572 Blank: 2987
1573 HERE: 2984
1574 IT: 2985
1575 KING: 2979
1576 NAIL: 2983
1577 PINS: 2986
1578 TILE: 2982
1579 TIP: 2980
1580 Mastery:
1581 masteries:
1582 MASTERY: 2988
1543 the_colorful: 1583 the_colorful:
1544 rooms: 1584 rooms:
1545 Black Room: 1585 Black Room:
@@ -1656,6 +1696,19 @@ maps:
1656 Obverse Magenta Door: 173 1696 Obverse Magenta Door: 173
1657 Obverse Yellow Door: 178 1697 Obverse Yellow Door: 178
1658 Obverse Yellow Puzzles: 179 1698 Obverse Yellow Puzzles: 179
1699 the_crystalline:
1700 rooms:
1701 Flip Area:
1702 panels:
1703 SUCCEED: 2989
1704 Main Area:
1705 panels:
1706 DROP: 2991
1707 LEAP: 2990
1708 SPIN: 2992
1709 Mastery:
1710 masteries:
1711 MASTERY: 2993
1659 the_darkroom: 1712 the_darkroom:
1660 rooms: 1713 rooms:
1661 First Room: 1714 First Room:
diff --git a/data/maps/icarus/connections.txtpb b/data/maps/icarus/connections.txtpb index 1ec90d9..a963424 100644 --- a/data/maps/icarus/connections.txtpb +++ b/data/maps/icarus/connections.txtpb
@@ -607,6 +607,21 @@ connections {
607 } 607 }
608 oneway: true 608 oneway: true
609} 609}
610connections {
611 from_room: "Trans Rights"
612 to_room: "Trans Rights Panels"
613 oneway: true
614}
615connections {
616 from_room: "Above Trans Rights"
617 to_room: "Trans Rights Panels"
618 oneway: true
619}
620connections {
621 from_room: "Welcome Spine (Obverse)"
622 to_room: "Mastery"
623 door { name: "Mastery" }
624}
610# It is possible to fall out of the map from every room, which always sends you 625# It is possible to fall out of the map from every room, which always sends you
611# back to the beginning. 626# back to the beginning.
612connections { 627connections {
diff --git a/data/maps/icarus/doors.txtpb b/data/maps/icarus/doors.txtpb index 5554393..a333dea 100644 --- a/data/maps/icarus/doors.txtpb +++ b/data/maps/icarus/doors.txtpb
@@ -2,14 +2,14 @@ doors {
2 name: "Agender Door" 2 name: "Agender Door"
3 type: STANDARD 3 type: STANDARD
4 receivers: "Components/Doors/quicktravel3" 4 receivers: "Components/Doors/quicktravel3"
5 panels { room: "Trans Rights" name: "AGENDER" } 5 panels { room: "Trans Rights Panels" name: "AGENDER" }
6 location_room: "Trans Rights" 6 location_room: "Trans Rights Panels"
7} 7}
8doors { 8doors {
9 name: "Quick Travel 3" 9 name: "Quick Travel 3"
10 type: ITEM_ONLY 10 type: ITEM_ONLY
11 receivers: "Components/Paintings/QuickTravel/go3" 11 receivers: "Components/Paintings/QuickTravel/go3"
12 panels { room: "Trans Rights" name: "AGENDER" } 12 panels { room: "Trans Rights Panels" name: "AGENDER" }
13} 13}
14doors { 14doors {
15 name: "Pea Door" 15 name: "Pea Door"
@@ -224,3 +224,63 @@ doors {
224 panels { room: "Spiral Ramp" name: "FIREMAN" } 224 panels { room: "Spiral Ramp" name: "FIREMAN" }
225 location_room: "Spiral Ramp" 225 location_room: "Spiral Ramp"
226} 226}
227doors {
228 name: "Mastery"
229 type: EVENT
230 panels { room: "Above Trans Rights" name: "ANT" }
231 panels { room: "Big U" name: "DECK" }
232 panels { room: "Big U" name: "COLONY" }
233 panels { room: "Big U" name: "MANOR" }
234 panels { room: "Fatherland" name: "FATHERLAND" }
235 panels { room: "Highest Point" name: "DIAGNOSIS" }
236 panels { room: "Highest Point" name: "QUEEN" }
237 panels { room: "Maze Back" name: "THESE" }
238 panels { room: "Maze King Panel" name: "KING (2)" }
239 panels { room: "Maze" name: "KING (1)" }
240 panels { room: "Maze" name: "ANALYSIS" }
241 panels { room: "Maze" name: "MANSLAUGHTER" }
242 panels { room: "Maze" name: "MEDIUMS" }
243 panels { room: "Maze" name: "BOOKS" }
244 panels { room: "Mini Icarus 2" name: "BATTERY" }
245 panels { room: "Mini Icarus 2" name: "TROUPE" }
246 panels { room: "Mini Icarus 2" name: "ANIMALS" }
247 panels { room: "Mini Icarus 2" name: "ARROWS" }
248 panels { room: "Mini Icarus 2" name: "SQUAD" }
249 panels { room: "Pillar Ramp" name: "ASTEROID" }
250 panels { room: "Pillar Ramp" name: "BUNCH" }
251 panels { room: "Pillar Ramp" name: "PRINCES" }
252 panels { room: "Pillar Ramp" name: "PATRICIDE" }
253 panels { room: "Pillar Ramp" name: "DRONE" }
254 panels { room: "Pillar Ramp" name: "PEA (1)" }
255 panels { room: "Spiral Ramp" name: "FIREMAN" }
256 panels { room: "The Orb" name: "ADDERS" }
257 panels { room: "The Orb" name: "PUPPY" }
258 panels { room: "The Orb" name: "NEEDLE" }
259 panels { room: "The Orb" name: "US" }
260 panels { room: "The Orb" name: "FISH" }
261 panels { room: "The Orb" name: "DEADLINE" }
262 panels { room: "The Orb" name: "PEA (2)" }
263 panels { room: "The Orb" name: "THESIS" }
264 panels { room: "The Orb" name: "CLUTCH (1)" }
265 panels { room: "The Orb" name: "BASIS (2)" }
266 panels { room: "The Orb" name: "AXIS" }
267 panels { room: "The Orb" name: "STRAIGHT" }
268 panels { room: "The Orb" name: "HISS" }
269 panels { room: "The Orb" name: "DISCUS" }
270 panels { room: "The Orb" name: "SON" }
271 panels { room: "The Orb" name: "CLUTCH (2)" }
272 panels { room: "Through Woman (Obverse)" name: "HUMAN (2)" }
273 panels { room: "Through Woman (Obverse)" name: "COW" }
274 panels { room: "Through Woman (Reverse)" name: "PRINCE" }
275 panels { room: "Through Woman (Reverse)" name: "BASIS (1)" }
276 panels { room: "Trans Rights" name: "SERVANT (1)" }
277 panels { room: "Trans Rights" name: "SERVANT (2)" }
278 panels { room: "Trans Rights Panels" name: "AGENDER" }
279 panels { room: "Trans Rights Panels" name: "HUMAN (3)" }
280 panels { room: "Trans Rights Panels" name: "HUMAN (4)" }
281 panels { room: "Welcome Spine (Obverse)" name: "FISHWIFE" }
282 panels { room: "Welcome Spine (Obverse)" name: "HUMAN (1)" }
283 panels { room: "Welcome Spine (Reverse)" name: "FATHER" }
284 panels { room: "Welcome Spine (Reverse)" name: "TERMITE" }
285 panels { room: "Welcome Spine (Reverse)" name: "SISTER" }
286}
diff --git a/data/maps/icarus/metadata.txtpb b/data/maps/icarus/metadata.txtpb index 83afad7..8512d8e 100644 --- a/data/maps/icarus/metadata.txtpb +++ b/data/maps/icarus/metadata.txtpb
@@ -1,2 +1,4 @@
1display_name: "Icarus" 1display_name: "Icarus"
2type: ICARUS 2type: ICARUS
3# The map's mastery is created at runtime.
4custom_nodes: "Components/Collectables/collectable"
diff --git a/data/maps/icarus/rooms/Mastery.txtpb b/data/maps/icarus/rooms/Mastery.txtpb new file mode 100644 index 0000000..bbe8742 --- /dev/null +++ b/data/maps/icarus/rooms/Mastery.txtpb
@@ -0,0 +1,5 @@
1name: "Mastery"
2masteries {
3 name: "MASTERY"
4 path: "Components/Collectables/collectable"
5}
diff --git a/data/maps/icarus/rooms/Trans Rights Panels.txtpb b/data/maps/icarus/rooms/Trans Rights Panels.txtpb new file mode 100644 index 0000000..e51d4bc --- /dev/null +++ b/data/maps/icarus/rooms/Trans Rights Panels.txtpb
@@ -0,0 +1,22 @@
1name: "Trans Rights Panels"
2panels {
3 name: "AGENDER"
4 path: "Panels/Room_1/human4"
5 clue: "agender"
6 answer: "human"
7 symbols: GENDER
8}
9panels {
10 name: "HUMAN (3)"
11 path: "Panels/Room_1/human5"
12 clue: "human"
13 answer: "female"
14 symbols: GENDER
15}
16panels {
17 name: "HUMAN (4)"
18 path: "Panels/Room_1/human6"
19 clue: "human"
20 answer: "male"
21 symbols: GENDER
22}
diff --git a/data/maps/icarus/rooms/Trans Rights.txtpb b/data/maps/icarus/rooms/Trans Rights.txtpb index 2e95de6..2ca98dd 100644 --- a/data/maps/icarus/rooms/Trans Rights.txtpb +++ b/data/maps/icarus/rooms/Trans Rights.txtpb
@@ -1,27 +1,6 @@
1name: "Trans Rights" 1name: "Trans Rights"
2# slay 2# slay
3panels { 3panels {
4 name: "AGENDER"
5 path: "Panels/Room_1/human4"
6 clue: "agender"
7 answer: "human"
8 symbols: GENDER
9}
10panels {
11 name: "HUMAN (3)"
12 path: "Panels/Room_1/human5"
13 clue: "human"
14 answer: "female"
15 symbols: GENDER
16}
17panels {
18 name: "HUMAN (4)"
19 path: "Panels/Room_1/human6"
20 clue: "human"
21 answer: "male"
22 symbols: GENDER
23}
24panels {
25 name: "SERVANT (1)" 4 name: "SERVANT (1)"
26 path: "Panels/Room_1/servant" 5 path: "Panels/Room_1/servant"
27 clue: "servant" 6 clue: "servant"
diff --git a/data/maps/the_advanced/metadata.txtpb b/data/maps/the_advanced/metadata.txtpb index 578fe72..cee10b6 100644 --- a/data/maps/the_advanced/metadata.txtpb +++ b/data/maps/the_advanced/metadata.txtpb
@@ -1,2 +1,4 @@
1display_name: "The Advanced" 1display_name: "The Advanced"
2type: GIFT_MAP 2type: GIFT_MAP
3# The map's mastery is created at runtime.
4custom_nodes: "Components/Collectables/collectable"
diff --git a/data/maps/the_charismatic/connections.txtpb b/data/maps/the_charismatic/connections.txtpb new file mode 100644 index 0000000..6130302 --- /dev/null +++ b/data/maps/the_charismatic/connections.txtpb
@@ -0,0 +1,35 @@
1connections {
2 from_room: "Main Area"
3 to_room: "Latitude South"
4 door { name: "Latitude South Door" }
5}
6connections {
7 from_room: "Main Area"
8 to_room: "Latitude Middle"
9 door { name: "Latitude Middle Door" }
10}
11connections {
12 from_room: "Main Area"
13 to_room: "Latitude North"
14 door { name: "Latitude North Door" }
15}
16connections {
17 from_room: "Main Area"
18 to_room: "Longitude West"
19 door { name: "Longitude West Door" }
20}
21connections {
22 from_room: "Main Area"
23 to_room: "Longitude Middle"
24 door { name: "Longitude Middle Door" }
25}
26connections {
27 from_room: "Main Area"
28 to_room: "Longitude East"
29 door { name: "Longitude East Door" }
30}
31connections {
32 from_room: "Main Area"
33 to_room: "Mastery"
34 door { name: "Mastery Door" }
35}
diff --git a/data/maps/the_charismatic/doors.txtpb b/data/maps/the_charismatic/doors.txtpb new file mode 100644 index 0000000..0c7eb40 --- /dev/null +++ b/data/maps/the_charismatic/doors.txtpb
@@ -0,0 +1,56 @@
1doors {
2 name: "Latitude South Door"
3 type: EVENT
4 panels { room: "Main Area" name: "TIP" }
5 panels { room: "Main Area" name: "KING" }
6 panels { room: "Main Area" name: "ARC" }
7}
8doors {
9 name: "Latitude Middle Door"
10 type: EVENT
11 panels { room: "Main Area" name: "NAIL" }
12 panels { room: "Main Area" name: "TILE" }
13 panels { room: "Main Area" name: "AQUA" }
14}
15doors {
16 name: "Latitude North Door"
17 type: EVENT
18 panels { room: "Main Area" name: "PINS" }
19 panels { room: "Main Area" name: "IT" }
20 panels { room: "Main Area" name: "HERE" }
21}
22doors {
23 name: "Longitude West Door"
24 type: EVENT
25 panels { room: "Main Area" name: "ARC" }
26 panels { room: "Main Area" name: "AQUA" }
27 panels { room: "Main Area" name: "HERE" }
28}
29doors {
30 name: "Longitude Middle Door"
31 type: EVENT
32 panels { room: "Main Area" name: "KING" }
33 panels { room: "Main Area" name: "TILE" }
34 panels { room: "Main Area" name: "IT" }
35}
36doors {
37 name: "Longitude East Door"
38 type: EVENT
39 panels { room: "Main Area" name: "TIP" }
40 panels { room: "Main Area" name: "NAIL" }
41 panels { room: "Main Area" name: "PINS" }
42}
43doors {
44 name: "Mastery Door"
45 type: EVENT
46 panels { room: "Main Area" name: "HERE" }
47 panels { room: "Main Area" name: "TILE" }
48 panels { room: "Main Area" name: "TIP" }
49 panels { room: "Main Area" name: "Blank" }
50 panels { room: "Latitude South" name: "CHARISMA" }
51 panels { room: "Latitude Middle" name: "FUNNY" }
52 panels { room: "Latitude North" name: "DEPENDABLE" }
53 panels { room: "Longitude West" name: "CREATIVE" }
54 panels { room: "Longitude Middle" name: "INTELLIGENT" }
55 panels { room: "Longitude East" name: "FUN" }
56}
diff --git a/data/maps/the_charismatic/metadata.txtpb b/data/maps/the_charismatic/metadata.txtpb new file mode 100644 index 0000000..8d26105 --- /dev/null +++ b/data/maps/the_charismatic/metadata.txtpb
@@ -0,0 +1,4 @@
1display_name: "The Charismatic"
2type: GIFT_MAP
3# The map's mastery is created at runtime.
4custom_nodes: "Components/Collectables/collectable"
diff --git a/data/maps/the_charismatic/rooms/Latitude Middle.txtpb b/data/maps/the_charismatic/rooms/Latitude Middle.txtpb new file mode 100644 index 0000000..7d83dcf --- /dev/null +++ b/data/maps/the_charismatic/rooms/Latitude Middle.txtpb
@@ -0,0 +1,8 @@
1name: "Latitude Middle"
2panels {
3 name: "FUNNY"
4 path: "Panels/Room 2/panel_h"
5 clue: "funny"
6 answer: "hilarious"
7 symbols: PYRAMID
8}
diff --git a/data/maps/the_charismatic/rooms/Latitude North.txtpb b/data/maps/the_charismatic/rooms/Latitude North.txtpb new file mode 100644 index 0000000..50c412b --- /dev/null +++ b/data/maps/the_charismatic/rooms/Latitude North.txtpb
@@ -0,0 +1,8 @@
1name: "Latitude North"
2panels {
3 name: "DEPENDABLE"
4 path: "Panels/Room 2/panel_r"
5 clue: "dependable"
6 answer: "reliable"
7 symbols: SUN
8}
diff --git a/data/maps/the_charismatic/rooms/Latitude South.txtpb b/data/maps/the_charismatic/rooms/Latitude South.txtpb new file mode 100644 index 0000000..472e4a7 --- /dev/null +++ b/data/maps/the_charismatic/rooms/Latitude South.txtpb
@@ -0,0 +1,8 @@
1name: "Latitude South"
2panels {
3 name: "CHARISMA"
4 path: "Panels/Room 2/panel_c"
5 clue: "charisma"
6 answer: "charismatic"
7 symbols: QUESTION
8}
diff --git a/data/maps/the_charismatic/rooms/Longitude East.txtpb b/data/maps/the_charismatic/rooms/Longitude East.txtpb new file mode 100644 index 0000000..75cd6e0 --- /dev/null +++ b/data/maps/the_charismatic/rooms/Longitude East.txtpb
@@ -0,0 +1,8 @@
1name: "Longitude East"
2panels {
3 name: "FUN"
4 path: "Panels/Room 2/panel_s2"
5 clue: "fun"
6 answer: "silly"
7 symbols: SUN
8}
diff --git a/data/maps/the_charismatic/rooms/Longitude Middle.txtpb b/data/maps/the_charismatic/rooms/Longitude Middle.txtpb new file mode 100644 index 0000000..7ee8c11 --- /dev/null +++ b/data/maps/the_charismatic/rooms/Longitude Middle.txtpb
@@ -0,0 +1,8 @@
1name: "Longitude Middle"
2panels {
3 name: "INTELLIGENT"
4 path: "Panels/Room 2/panel_s"
5 clue: "intelligent"
6 answer: "smart"
7 symbols: SUN
8}
diff --git a/data/maps/the_charismatic/rooms/Longitude West.txtpb b/data/maps/the_charismatic/rooms/Longitude West.txtpb new file mode 100644 index 0000000..28fe8c8 --- /dev/null +++ b/data/maps/the_charismatic/rooms/Longitude West.txtpb
@@ -0,0 +1,8 @@
1name: "Longitude West"
2panels {
3 name: "CREATIVE"
4 path: "Panels/Room 2/panel_i"
5 clue: "creative"
6 answer: "imaginative"
7 symbols: SUN
8}
diff --git a/data/maps/the_charismatic/rooms/Main Area.txtpb b/data/maps/the_charismatic/rooms/Main Area.txtpb new file mode 100644 index 0000000..2d84000 --- /dev/null +++ b/data/maps/the_charismatic/rooms/Main Area.txtpb
@@ -0,0 +1,78 @@
1name: "Main Area"
2panels {
3 name: "ARC"
4 path: "Panels/Room_1/panel_1"
5 clue: "arc"
6 answer: "arctic"
7 symbols: QUESTION
8}
9panels {
10 name: "KING"
11 path: "Panels/Room_1/panel_2"
12 clue: "king"
13 answer: "tacking"
14 symbols: QUESTION
15}
16panels {
17 name: "TIP"
18 path: "Panels/Room_1/panel_3"
19 clue: "tip"
20 answer: "tiptoe"
21 symbols: QUESTION
22}
23panels {
24 name: "AQUA"
25 path: "Panels/Room_1/panel_4"
26 clue: "aqua"
27 answer: "aquatic"
28 symbols: QUESTION
29}
30panels {
31 name: "TILE"
32 path: "Panels/Room_1/panel_5"
33 clue: "tile"
34 answer: "tactile"
35 symbols: QUESTION
36}
37panels {
38 name: "NAIL"
39 path: "Panels/Room_1/panel_6"
40 clue: "nail"
41 answer: "toenail"
42 symbols: QUESTION
43}
44panels {
45 name: "HERE"
46 path: "Panels/Room_1/panel_7"
47 clue: "here"
48 answer: "heretic"
49 symbols: QUESTION
50}
51panels {
52 name: "IT"
53 path: "Panels/Room_1/panel_8"
54 clue: "it"
55 answer: "tacit"
56 symbols: QUESTION
57}
58panels {
59 name: "PINS"
60 path: "Panels/Room_1/panel_9"
61 clue: "pins"
62 answer: "pintoes"
63 symbols: QUESTION
64}
65panels {
66 name: "Blank"
67 path: "Panels/Room 3/panel_10"
68 clue: ""
69 answer: "tactic"
70 symbols: QUESTION
71}
72ports {
73 name: "WORLDPORT"
74 display_name: "Entrance"
75 path: "Components/Warps/worldport"
76 destination { x: 0 y: 0 z: 9.5 }
77 rotation: 0
78}
diff --git a/data/maps/the_charismatic/rooms/Mastery.txtpb b/data/maps/the_charismatic/rooms/Mastery.txtpb new file mode 100644 index 0000000..bbe8742 --- /dev/null +++ b/data/maps/the_charismatic/rooms/Mastery.txtpb
@@ -0,0 +1,5 @@
1name: "Mastery"
2masteries {
3 name: "MASTERY"
4 path: "Components/Collectables/collectable"
5}
diff --git a/data/maps/the_crystalline/connections.txtpb b/data/maps/the_crystalline/connections.txtpb new file mode 100644 index 0000000..4134d12 --- /dev/null +++ b/data/maps/the_crystalline/connections.txtpb
@@ -0,0 +1,25 @@
1connections {
2 from_room: "Main Area"
3 to_room: "Painting Divot"
4 oneway: true
5}
6connections {
7 from {
8 painting {
9 room: "Painting Divot"
10 name: "SNAKE"
11 }
12 }
13 to {
14 painting {
15 room: "Flip Area"
16 name: "SNAKE2"
17 }
18 }
19 oneway: true
20}
21connections {
22 from_room: "Flip Area"
23 to_room: "Mastery"
24 door { name: "Mastery" }
25}
diff --git a/data/maps/the_crystalline/doors.txtpb b/data/maps/the_crystalline/doors.txtpb new file mode 100644 index 0000000..024752a --- /dev/null +++ b/data/maps/the_crystalline/doors.txtpb
@@ -0,0 +1,5 @@
1doors {
2 name: "Mastery"
3 type: EVENT
4 panels { room: "Flip Area" name: "SUCCEED" }
5}
diff --git a/data/maps/the_crystalline/metadata.txtpb b/data/maps/the_crystalline/metadata.txtpb new file mode 100644 index 0000000..09b0f1d --- /dev/null +++ b/data/maps/the_crystalline/metadata.txtpb
@@ -0,0 +1,4 @@
1display_name: "The Crystalline"
2type: GIFT_MAP
3# The map's mastery is created at runtime.
4custom_nodes: "Components/Collectables/collectable"
diff --git a/data/maps/the_crystalline/rooms/Flip Area.txtpb b/data/maps/the_crystalline/rooms/Flip Area.txtpb new file mode 100644 index 0000000..3c6e3fd --- /dev/null +++ b/data/maps/the_crystalline/rooms/Flip Area.txtpb
@@ -0,0 +1,14 @@
1name: "Flip Area"
2panels {
3 name: "SUCCEED"
4 path: "Panels/Room_1/panel_3"
5 clue: "succeed"
6 answer: "win"
7 symbols: SUN
8}
9paintings {
10 name: "SNAKE2"
11 path: "Components/snake2"
12 exit_only: true
13 gravity: Y_PLUS
14}
diff --git a/data/maps/the_crystalline/rooms/Main Area.txtpb b/data/maps/the_crystalline/rooms/Main Area.txtpb new file mode 100644 index 0000000..0b8d26c --- /dev/null +++ b/data/maps/the_crystalline/rooms/Main Area.txtpb
@@ -0,0 +1,29 @@
1name: "Main Area"
2panels {
3 name: "LEAP"
4 path: "Panels/Room_1/panel_1"
5 clue: "leap"
6 answer: "jump"
7 symbols: SUN
8}
9panels {
10 name: "DROP"
11 path: "Panels/Room_1/panel_2"
12 clue: "drop"
13 answer: "fall"
14 symbols: SUN
15}
16panels {
17 name: "SPIN"
18 path: "Panels/Room_1/panel_4"
19 clue: "spin"
20 answer: "flip"
21 symbols: SUN
22}
23ports {
24 name: "WORLDPORT"
25 display_name: "Entrance"
26 path: "Components/Warps/worldport"
27 destination { x: 0 y: 0 z: 9.5 }
28 rotation: 0
29}
diff --git a/data/maps/the_crystalline/rooms/Mastery.txtpb b/data/maps/the_crystalline/rooms/Mastery.txtpb new file mode 100644 index 0000000..bbe8742 --- /dev/null +++ b/data/maps/the_crystalline/rooms/Mastery.txtpb
@@ -0,0 +1,5 @@
1name: "Mastery"
2masteries {
3 name: "MASTERY"
4 path: "Components/Collectables/collectable"
5}
diff --git a/data/maps/the_crystalline/rooms/Painting Divot.txtpb b/data/maps/the_crystalline/rooms/Painting Divot.txtpb new file mode 100644 index 0000000..ab9a132 --- /dev/null +++ b/data/maps/the_crystalline/rooms/Painting Divot.txtpb
@@ -0,0 +1,5 @@
1name: "Painting Divot"
2paintings {
3 name: "SNAKE"
4 path: "Components/snake"
5}
diff --git a/data/maps/the_entry/metadata.txtpb b/data/maps/the_entry/metadata.txtpb index 0eeb29a..d969c68 100644 --- a/data/maps/the_entry/metadata.txtpb +++ b/data/maps/the_entry/metadata.txtpb
@@ -11,3 +11,8 @@ excluded_nodes: "Panels/Back Left/backleft_4_proxied_1"
11excluded_nodes: "Panels/Back Left/backleft_4_proxied_2" 11excluded_nodes: "Panels/Back Left/backleft_4_proxied_2"
12# This is a proxy related to the first panel and it doesn't seem useful. 12# This is a proxy related to the first panel and it doesn't seem useful.
13excluded_nodes: "Panels/Entry/entry_proxied_fake" 13excluded_nodes: "Panels/Entry/entry_proxied_fake"
14# The gift map entrance is created by the mod.
15custom_nodes: "Components/GiftMapEntrance/IcelyPanel"
16custom_nodes: "Components/GiftMapEntrance/Panel"
17custom_nodes: "Components/GiftMapEntrance/QPanel"
18custom_nodes: "Components/GiftMapEntrance/SouveyPanel"
diff --git a/data/maps/the_entry/rooms/Starting Room.txtpb b/data/maps/the_entry/rooms/Starting Room.txtpb index e21e3ff..a1f3dbf 100644 --- a/data/maps/the_entry/rooms/Starting Room.txtpb +++ b/data/maps/the_entry/rooms/Starting Room.txtpb
@@ -56,6 +56,8 @@ panels {
56 # for fun. 56 # for fun.
57 symbols: QUESTION 57 symbols: QUESTION
58 proxies { answer: "icely" path: "Components/GiftMapEntrance/IcelyPanel" } 58 proxies { answer: "icely" path: "Components/GiftMapEntrance/IcelyPanel" }
59 proxies { answer: "q" path: "Components/GiftMapEntrance/QPanel" }
60 proxies { answer: "souvey" path: "Components/GiftMapEntrance/SouveyPanel" }
59 required_door { name: "Gift Maps Entrance" } 61 required_door { name: "Gift Maps Entrance" }
60} 62}
61letters { 63letters {
diff --git a/data/maps/the_sturdy/metadata.txtpb b/data/maps/the_sturdy/metadata.txtpb index 9f42137..624f765 100644 --- a/data/maps/the_sturdy/metadata.txtpb +++ b/data/maps/the_sturdy/metadata.txtpb
@@ -4,3 +4,6 @@ display_name: "The Sturdy"
4# I don't know why there's a second copy of the rainbow. 4# I don't know why there's a second copy of the rainbow.
5#excluded_nodes: "Components/Doors/Rainbow/Hinge/rainbow" 5#excluded_nodes: "Components/Doors/Rainbow/Hinge/rainbow"
6#excluded_nodes: "Components/Doors/Rainbow/Hinge/rainbowMirrored" 6#excluded_nodes: "Components/Doors/Rainbow/Hinge/rainbowMirrored"
7# The validator doesn't know that this node exists because it is part of a
8# sub-scene.
9custom_nodes: "Components/Doors/Rainbow2/Hinge/rainbow"
diff --git a/proto/human.proto b/proto/human.proto index 41fce45..df33a5e 100644 --- a/proto/human.proto +++ b/proto/human.proto
@@ -221,9 +221,18 @@ message HumanRoom {
221 221
222message HumanMap { 222message HumanMap {
223 optional string display_name = 1; 223 optional string display_name = 1;
224 repeated string excluded_nodes = 2;
225 optional PortIdentifier worldport_entrance = 3;
226 optional MapType type = 4; 224 optional MapType type = 4;
225
226 optional PortIdentifier worldport_entrance = 3;
227
228 // These two fields are used by the validator and nothing else. excluded_nodes
229 // are objects in the tscn that are intentionally not mentioned in the txtpb.
230 // custom_nodes are the reverse of that; objects that are mentioned in the
231 // txtpb but not present in the tscn. These are generally created dynamically
232 // by the game mod, but may also be used for places where the validator is
233 // just wrong about the contents of the map file.
234 repeated string excluded_nodes = 2;
235 repeated string custom_nodes = 5;
227} 236}
228 237
229message HumanProgressive { 238message HumanProgressive {
diff --git a/tools/validator/human_processor.cpp b/tools/validator/human_processor.cpp index de80db0..5a1c095 100644 --- a/tools/validator/human_processor.cpp +++ b/tools/validator/human_processor.cpp
@@ -78,6 +78,10 @@ class HumanProcessor {
78 map_info.game_nodes[path].uses++; 78 map_info.game_nodes[path].uses++;
79 } 79 }
80 80
81 for (const std::string& path : metadata.custom_nodes()) {
82 map_info.game_nodes[path].defined = true;
83 }
84
81 if (metadata.has_worldport_entrance()) { 85 if (metadata.has_worldport_entrance()) {
82 auto port_identifier = GetCompletePortIdentifier( 86 auto port_identifier = GetCompletePortIdentifier(
83 metadata.worldport_entrance(), current_map_name, std::nullopt); 87 metadata.worldport_entrance(), current_map_name, std::nullopt);