about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md23
-rw-r--r--apworld/client/allowNumbers.gd10
-rw-r--r--apworld/client/main.gd3
-rw-r--r--apworld/client/manager.gd3
-rw-r--r--apworld/client/player.gd50
-rw-r--r--apworld/options.py2
-rw-r--r--apworld/player_logic.py18
-rw-r--r--apworld/static_logic.py1
-rw-r--r--data/ids.yaml78
-rw-r--r--data/maps/demo/connections.txtpb30
-rw-r--r--data/maps/demo/doors.txtpb161
-rw-r--r--data/maps/demo/metadata.txtpb6
-rw-r--r--data/maps/demo/rooms/Backside Area.txtpb25
-rw-r--r--data/maps/demo/rooms/Castle.txtpb13
-rw-r--r--data/maps/demo/rooms/Center Building.txtpb13
-rw-r--r--data/maps/demo/rooms/Flower Hallway.txtpb7
-rw-r--r--data/maps/demo/rooms/Main Area.txtpb241
-rw-r--r--data/maps/demo/rooms/Mastery.txtpb5
-rw-r--r--data/maps/demo/rooms/Tower.txtpb7
-rw-r--r--data/metadata.txtpb2
-rw-r--r--proto/data.proto1
21 files changed, 692 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 131b8a0..76890e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md
@@ -1,5 +1,28 @@
1# lingo2-archipelago Releases 1# lingo2-archipelago Releases
2 2
3## v7.2.0 - 2025-10-25
4
5- Doors that rely on keyholders or the control center color panel are now
6 "latched". This means they will not close once they've been opened. Because of
7 this, the worldports near these doors are now eligible for randomization in
8 worldport shuffle.
9- Icarus is now optionally randomizable.
10- The requirements for accessing White Ending are now customizable. You can
11 choose to require a number of endings as well as a number of masteries.
12- The "Return To" trigger in The Plaza is now outside of the turtle.
13- Fixed a logic error regarding a couple of specific doors in vanilla doors
14 mode.
15- Fixed a bug where unlocks would not persist if you were playing with all
16 letters pre-unlocked and cyan doors on "any double letter".
17- Fixed a bug where the client would fail to connect properly when launched from
18 a URL if the player name had spaces in it.
19
20Download:
21[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.2.0/lingo2.apworld)<br/>
22Template YAML:
23[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.2.0/Lingo%202.yaml)<br/>
24Source: [v7.2.0](https://code.fourisland.com/lingo2-archipelago/tag/?h=v7.2.0)
25
3## v7.1.0 - 2025-10-07 26## v7.1.0 - 2025-10-07
4 27
5- Added a "Get Path" button to the locations tracker. This shows you the path 28- Added a "Get Path" button to the locations tracker. This shows you the path
diff --git a/apworld/client/allowNumbers.gd b/apworld/client/allowNumbers.gd new file mode 100644 index 0000000..d958b50 --- /dev/null +++ b/apworld/client/allowNumbers.gd
@@ -0,0 +1,10 @@
1extends "res://scripts/nodes/allowNumbers.gd"
2
3
4func _readier():
5 var ap = global.get_node("Archipelago")
6 var gamedata = global.get_node("Gamedata")
7
8 var item_id = gamedata.objects.get_special_ids()["Numbers"]
9 if ap.client.getItemAmount(item_id) >= 1:
10 global.allow_numbers = true
diff --git a/apworld/client/main.gd b/apworld/client/main.gd index a3b21c5..a543678 100644 --- a/apworld/client/main.gd +++ b/apworld/client/main.gd
@@ -36,6 +36,7 @@ func _ready():
36 global.add_child(ap_instance) 36 global.add_child(ap_instance)
37 37
38 # Let's also inject any scripts we need to inject now. 38 # Let's also inject any scripts we need to inject now.
39 installScriptExtension(runtime.load_script("allowNumbers.gd"))
39 installScriptExtension(runtime.load_script("animationListener.gd")) 40 installScriptExtension(runtime.load_script("animationListener.gd"))
40 installScriptExtension(runtime.load_script("collectable.gd")) 41 installScriptExtension(runtime.load_script("collectable.gd"))
41 installScriptExtension(runtime.load_script("door.gd")) 42 installScriptExtension(runtime.load_script("door.gd"))
@@ -86,6 +87,7 @@ func _ready():
86 unlocks.data["advanced_mastery"] = "" 87 unlocks.data["advanced_mastery"] = ""
87 unlocks.data["charismatic_mastery"] = "" 88 unlocks.data["charismatic_mastery"] = ""
88 unlocks.data["crystalline_mastery"] = "" 89 unlocks.data["crystalline_mastery"] = ""
90 unlocks.data["fuzzy_mastery"] = ""
89 unlocks.data["icarus_mastery"] = "" 91 unlocks.data["icarus_mastery"] = ""
90 unlocks.data["stellar_mastery"] = "" 92 unlocks.data["stellar_mastery"] = ""
91 93
@@ -243,6 +245,7 @@ func startGame():
243 settings.worldport_fades = "never" 245 settings.worldport_fades = "never"
244 246
245 clearResourceCache("res://objects/meshes/gridDoor.tscn") 247 clearResourceCache("res://objects/meshes/gridDoor.tscn")
248 clearResourceCache("res://objects/nodes/allowNumbers.tscn")
246 clearResourceCache("res://objects/nodes/collectable.tscn") 249 clearResourceCache("res://objects/nodes/collectable.tscn")
247 clearResourceCache("res://objects/nodes/door.tscn") 250 clearResourceCache("res://objects/nodes/door.tscn")
248 clearResourceCache("res://objects/nodes/keyHolder.tscn") 251 clearResourceCache("res://objects/nodes/keyHolder.tscn")
diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index 399d6a5..aa07559 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd
@@ -261,6 +261,9 @@ func _process_item(item, amount):
261 if item_id == gamedata.objects.get_special_ids()["A Job Well Done"]: 261 if item_id == gamedata.objects.get_special_ids()["A Job Well Done"]:
262 update_job_well_done_sign() 262 update_job_well_done_sign()
263 263
264 if item_id == gamedata.objects.get_special_ids()["Numbers"] and global.map == "the_fuzzy":
265 global.allow_numbers = true
266
264 # Show a message about the item if it's new. 267 # Show a message about the item if it's new.
265 if int(item["index"]) > _last_new_item: 268 if int(item["index"]) > _last_new_item:
266 _last_new_item = int(item["index"]) 269 _last_new_item = int(item["index"])
diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 9acb942..712a59b 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd
@@ -25,6 +25,7 @@ func _ready():
25 _set_up_mastery_listener("advanced") 25 _set_up_mastery_listener("advanced")
26 _set_up_mastery_listener("charismatic") 26 _set_up_mastery_listener("charismatic")
27 _set_up_mastery_listener("crystalline") 27 _set_up_mastery_listener("crystalline")
28 _set_up_mastery_listener("fuzzy")
28 _set_up_mastery_listener("icarus") 29 _set_up_mastery_listener("icarus")
29 _set_up_mastery_listener("stellar") 30 _set_up_mastery_listener("stellar")
30 31
@@ -219,6 +220,29 @@ func _ready():
219 q_wpl.senders.append(NodePath("../QPanel")) 220 q_wpl.senders.append(NodePath("../QPanel"))
220 giftmap_parent.add_child.call_deferred(q_wpl) 221 giftmap_parent.add_child.call_deferred(q_wpl)
221 222
223 if ap.enable_gift_maps.has("The Fuzzy"):
224 var gongus_panel = panel_prefab.instantiate()
225 gongus_panel.name = "GongusPanel"
226 gongus_panel.answer = "gongus"
227 gongus_panel.position = Vector3(33.5, -260, 5.5)
228 giftmap_panel.proxies.append(NodePath("../GongusPanel"))
229 giftmap_parent.add_child.call_deferred(gongus_panel)
230
231 var kiwi_panel = panel_prefab.instantiate()
232 kiwi_panel.name = "KiwiPanel"
233 kiwi_panel.answer = "kiwi"
234 kiwi_panel.position = Vector3(33.5, -270, 5.5)
235 giftmap_panel.proxies.append(NodePath("../KiwiPanel"))
236 giftmap_parent.add_child.call_deferred(kiwi_panel)
237
238 var fuzzy_wpl = wpl_prefab.instantiate()
239 fuzzy_wpl.name = "FuzzyWpl"
240 fuzzy_wpl.exit = "the_fuzzy"
241 fuzzy_wpl.senders.append(NodePath("../GongusPanel"))
242 fuzzy_wpl.senders.append(NodePath("../KiwiPanel"))
243 fuzzy_wpl.complete_at = 1
244 giftmap_parent.add_child.call_deferred(fuzzy_wpl)
245
222 if ap.enable_gift_maps.has("The Stellar"): 246 if ap.enable_gift_maps.has("The Stellar"):
223 var hatkirby_panel = panel_prefab.instantiate() 247 var hatkirby_panel = panel_prefab.instantiate()
224 hatkirby_panel.name = "HatkirbyPanel" 248 hatkirby_panel.name = "HatkirbyPanel"
@@ -505,6 +529,32 @@ func _ready():
505 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables")) 529 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
506 get_node("/root/scene").add_child.call_deferred(saver) 530 get_node("/root/scene").add_child.call_deferred(saver)
507 531
532 # Add the mastery to The Fuzzy.
533 if global.map == "the_fuzzy":
534 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
535 var saver_prefab = preload("res://objects/nodes/saver.tscn")
536 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
537
538 var mastery = collectable_prefab.instantiate()
539 mastery.name = "collectable"
540 mastery.position = Vector3(0, 2, -20)
541 mastery.unlock_type = "smiley"
542 mastery.material_override = load("res://assets/materials/gold.material")
543 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
544
545 var usl = usl_prefab.instantiate()
546 usl.name = "unlockSetterListenerMastery"
547 usl.key = "fuzzy_mastery"
548 usl.value = "unlocked"
549 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
550 get_node("/root/scene/Components").add_child.call_deferred(usl)
551
552 var saver = saver_prefab.instantiate()
553 saver.name = "saver_collectables"
554 saver.type = "collectables"
555 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
556 get_node("/root/scene").add_child.call_deferred(saver)
557
508 # Add the mastery to The Stellar. 558 # Add the mastery to The Stellar.
509 if global.map == "the_stellar": 559 if global.map == "the_stellar":
510 var collectable_prefab = preload("res://objects/nodes/collectable.tscn") 560 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
diff --git a/apworld/options.py b/apworld/options.py index a56b40d..f687434 100644 --- a/apworld/options.py +++ b/apworld/options.py
@@ -197,7 +197,7 @@ class MasteriesRequirement(Range):
197 the maximum.""" 197 the maximum."""
198 display_name = "Masteries Requirement" 198 display_name = "Masteries Requirement"
199 range_start = 0 199 range_start = 0
200 range_end = 18 200 range_end = 19
201 default = 0 201 default = 0
202 202
203 203
diff --git a/apworld/player_logic.py b/apworld/player_logic.py index e21e2c3..d7b18c2 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py
@@ -241,6 +241,8 @@ class Lingo2PlayerLogic:
241 return "The Charismatic" in world.options.enable_gift_maps.value 241 return "The Charismatic" in world.options.enable_gift_maps.value
242 elif game_map.name == "the_crystalline": 242 elif game_map.name == "the_crystalline":
243 return "The Crystalline" in world.options.enable_gift_maps.value 243 return "The Crystalline" in world.options.enable_gift_maps.value
244 elif game_map.name == "the_fuzzy":
245 return "The Fuzzy" in world.options.enable_gift_maps.value
244 elif game_map.name == "the_stellar": 246 elif game_map.name == "the_stellar":
245 return "The Stellar" in world.options.enable_gift_maps.value 247 return "The Stellar" in world.options.enable_gift_maps.value
246 248
@@ -256,6 +258,9 @@ class Lingo2PlayerLogic:
256 if world.options.masteries_requirement > maximum_masteries: 258 if world.options.masteries_requirement > maximum_masteries:
257 world.options.masteries_requirement.value = maximum_masteries 259 world.options.masteries_requirement.value = maximum_masteries
258 260
261 if "The Fuzzy" in world.options.enable_gift_maps.value:
262 self.real_items.append("Numbers")
263
259 if self.world.options.shuffle_doors: 264 if self.world.options.shuffle_doors:
260 for progressive in world.static_logic.objects.progressives: 265 for progressive in world.static_logic.objects.progressives:
261 for i in range(0, len(progressive.doors)): 266 for i in range(0, len(progressive.doors)):
@@ -384,14 +389,14 @@ class Lingo2PlayerLogic:
384 self.locations_by_room.setdefault(ending.room_id, []).append(PlayerLocation(ending.ap_id, 389 self.locations_by_room.setdefault(ending.room_id, []).append(PlayerLocation(ending.ap_id,
385 AccessRequirements())) 390 AccessRequirements()))
386 391
387 event_name = f"{ending.name.capitalize()} Ending (Achieved)"
388 item_name = "Ending"
389
390 if world.options.victory_condition.current_key.removesuffix("_ending").upper() == ending.name: 392 if world.options.victory_condition.current_key.removesuffix("_ending").upper() == ending.name:
391 item_name = "Victory" 393 event_name = f"{ending.name.capitalize()} Ending (Goal)"
394 self.event_loc_item_by_room.setdefault(ending.room_id, {})[event_name] = "Victory"
392 self.goal_room_id = ending.room_id 395 self.goal_room_id = ending.room_id
393 396
394 self.event_loc_item_by_room.setdefault(ending.room_id, {})[event_name] = item_name 397 if ending.name != "WHITE":
398 event_name = f"{ending.name.capitalize()} Ending (Achieved)"
399 self.event_loc_item_by_room.setdefault(ending.room_id, {})[event_name] = "Ending"
395 400
396 if self.world.options.keyholder_sanity: 401 if self.world.options.keyholder_sanity:
397 for keyholder in world.static_logic.objects.keyholders: 402 for keyholder in world.static_logic.objects.keyholders:
@@ -599,3 +604,6 @@ class Lingo2PlayerLogic:
599 604
600 if needed > 0: 605 if needed > 0:
601 reqs.letters[l] = max(reqs.letters.get(l, 0), needed) 606 reqs.letters[l] = max(reqs.letters.get(l, 0), needed)
607
608 if any(l.isnumeric() for l in solution):
609 reqs.items.add("Numbers")
diff --git a/apworld/static_logic.py b/apworld/static_logic.py index fb23e4c..8e07b82 100644 --- a/apworld/static_logic.py +++ b/apworld/static_logic.py
@@ -68,6 +68,7 @@ class Lingo2StaticLogic:
68 self.location_name_groups.setdefault("Keyholders", []).append(location_name) 68 self.location_name_groups.setdefault("Keyholders", []).append(location_name)
69 69
70 self.item_id_to_name[self.objects.special_ids["A Job Well Done"]] = "A Job Well Done" 70 self.item_id_to_name[self.objects.special_ids["A Job Well Done"]] = "A Job Well Done"
71 self.item_id_to_name[self.objects.special_ids["Numbers"]] = "Numbers"
71 72
72 for symbol_name in SYMBOL_ITEMS.values(): 73 for symbol_name in SYMBOL_ITEMS.values():
73 self.item_id_to_name[self.objects.special_ids[symbol_name]] = symbol_name 74 self.item_id_to_name[self.objects.special_ids[symbol_name]] = symbol_name
diff --git a/data/ids.yaml b/data/ids.yaml index dc82306..6a44044 100644 --- a/data/ids.yaml +++ b/data/ids.yaml
@@ -1156,6 +1156,84 @@ maps:
1156 Zoo Prize Door: 1599 1156 Zoo Prize Door: 1599
1157 Zoo South Entrance: 1596 1157 Zoo South Entrance: 1596
1158 Zoo West Entrance: 1594 1158 Zoo West Entrance: 1594
1159 demo:
1160 rooms:
1161 Backside Area:
1162 panels:
1163 BACKSIDE: 3049
1164 DOORWAYS: 3050
1165 ENDS (2): 3052
1166 SEE: 3051
1167 Castle:
1168 panels:
1169 G: 3054
1170 SERIES: 3053
1171 Center Building:
1172 panels:
1173 FUZZIES: 3056
1174 WORLD: 3055
1175 Flower Hallway:
1176 panels:
1177 LACES: 3057
1178 Main Area:
1179 panels:
1180 A: 3089
1181 AGES: 3063
1182 ANY: 3071
1183 ART: 3059
1184 Blank: 3095
1185 C: 3088
1186 CASTS: 3086
1187 CLOCKWISE: 3067
1188 COLORFUL: 3061
1189 COUNTER: 3070
1190 DAZES: 3084
1191 DEN: 3064
1192 DISCOVER: 3096
1193 E (1): 3091
1194 E (2): 3093
1195 END: 3079
1196 FAMILY: 3097
1197 GAZES: 3085
1198 HAZES: 3083
1199 HI: 3058
1200 HID: 3065
1201 MESS: 3066
1202 MIND: 3078
1203 N: 3092
1204 PACES: 3069
1205 POSSIBLE: 3068
1206 R: 3094
1207 RAD: 3080
1208 RODS: 3072
1209 S: 3087
1210 SECRETIVE: 3075
1211 STALK: 3082
1212 TALK: 3074
1213 TEES: 3060
1214 TOADS: 3076
1215 TON: 3077
1216 TOO: 3081
1217 TWO: 3073
1218 V: 3090
1219 WORD: 3062
1220 Mastery:
1221 masteries:
1222 MASTERY: 3098
1223 Tower:
1224 panels:
1225 ENDS (1): 3099
1226 doors:
1227 Castle: 3046
1228 Center Building: 3039
1229 Center Building Panels: 3041
1230 Flower Hallway: 3040
1231 Gold Door: 3048
1232 Orange Door: 3042
1233 Purple Door: 3043
1234 Red Door: 3045
1235 Scavenger Hunt: 3047
1236 Yellow Door: 3044
1159 four_rooms: 1237 four_rooms:
1160 rooms: 1238 rooms:
1161 Examples Room: 1239 Examples Room:
diff --git a/data/maps/demo/connections.txtpb b/data/maps/demo/connections.txtpb new file mode 100644 index 0000000..fd9a918 --- /dev/null +++ b/data/maps/demo/connections.txtpb
@@ -0,0 +1,30 @@
1connections {
2 from_room: "Main Area"
3 to_room: "Center Building"
4 door { name: "Center Building" }
5}
6connections {
7 from_room: "Main Area"
8 to_room: "Flower Hallway"
9 door { name: "Flower Hallway" }
10}
11connections {
12 from_room: "Main Area"
13 to_room: "Tower"
14 door { name: "Tower Entrance" }
15}
16connections {
17 from_room: "Main Area"
18 to_room: "Castle"
19 door { name: "Castle" }
20}
21connections {
22 from_room: "Main Area"
23 to_room: "Backside Area"
24 door { name: "Backside Entrance" }
25}
26connections {
27 from_room: "Backside Area"
28 to_room: "Mastery"
29 door { name: "Mastery Door" }
30}
diff --git a/data/maps/demo/doors.txtpb b/data/maps/demo/doors.txtpb new file mode 100644 index 0000000..37e0bae --- /dev/null +++ b/data/maps/demo/doors.txtpb
@@ -0,0 +1,161 @@
1doors {
2 name: "Center Building"
3 type: STANDARD
4 receivers: "Components/Doors/demo_1"
5 panels { room: "Main Area" name: "HI" }
6 location_room: "Main Area"
7}
8doors {
9 name: "Flower Hallway"
10 type: STANDARD
11 receivers: "Components/Doors/demo_32"
12 panels { room: "Main Area" name: "TEES" }
13 location_room: "Main Area"
14}
15doors {
16 name: "Center Building Panels"
17 type: LOCATION_ONLY
18 panels { room: "Center Building" name: "WORLD" }
19 panels { room: "Center Building" name: "FUZZIES" }
20 panels { room: "Main Area" name: "COLORFUL" }
21 panels { room: "Main Area" name: "WORD" }
22 location_room: "Center Building"
23 location_name: "COLORFUL, FUZZIES, WORD, WORLD"
24}
25doors {
26 name: "Orange Door"
27 type: LOCATION_ONLY
28 panels { room: "Main Area" name: "HID" }
29 panels { room: "Main Area" name: "MESS" }
30 panels { room: "Main Area" name: "DEN" }
31 panels { room: "Main Area" name: "AGES" }
32 location_room: "Main Area"
33 location_name: "AGES, DEN, HID, MESS"
34}
35doors {
36 name: "Purple Door"
37 type: LOCATION_ONLY
38 panels { room: "Main Area" name: "COUNTER" }
39 panels { room: "Main Area" name: "POSSIBLE" }
40 panels { room: "Main Area" name: "PACES" }
41 panels { room: "Main Area" name: "CLOCKWISE" }
42 location_room: "Main Area"
43 location_name: "CLOCKWISE, COUNTER, PACES, POSSIBLE"
44}
45doors {
46 name: "Yellow Door"
47 type: LOCATION_ONLY
48 panels { room: "Main Area" name: "ANY" }
49 panels { room: "Main Area" name: "RODS" }
50 panels { room: "Main Area" name: "TWO" }
51 panels { room: "Main Area" name: "TALK" }
52 panels { room: "Main Area" name: "SECRETIVE" }
53 panels { room: "Main Area" name: "TOADS" }
54 panels { room: "Main Area" name: "TON" }
55 panels { room: "Main Area" name: "MIND" }
56 panels { room: "Main Area" name: "END" }
57 panels { room: "Main Area" name: "RAD" }
58 panels { room: "Main Area" name: "TOO" }
59 panels { room: "Main Area" name: "STALK" }
60 location_room: "Main Area"
61 location_name: "Yellow Area Puzzles"
62}
63doors {
64 name: "Red Door"
65 type: LOCATION_ONLY
66 panels { room: "Castle" name: "SERIES" }
67 location_room: "Castle"
68 location_name: "SERIES"
69}
70doors {
71 name: "Castle"
72 type: STANDARD
73 receivers: "Components/Doors/demo_15"
74 panels { room: "Main Area" name: "CASTS" }
75 location_room: "Main Area"
76}
77doors {
78 name: "Scavenger Hunt"
79 type: LOCATION_ONLY
80 panels { room: "Main Area" name: "S" }
81 panels { room: "Main Area" name: "C" }
82 panels { room: "Main Area" name: "A" }
83 panels { room: "Main Area" name: "V" }
84 panels { room: "Main Area" name: "E (1)" }
85 panels { room: "Main Area" name: "N" }
86 panels { room: "Castle" name: "G" }
87 panels { room: "Main Area" name: "E (2)" }
88 panels { room: "Main Area" name: "R" }
89 location_room: "Castle"
90}
91doors {
92 name: "Gold Door"
93 type: LOCATION_ONLY
94 panels { room: "Main Area" name: "DISCOVER" }
95 panels { room: "Main Area" name: "FAMILY" }
96 panels { room: "Flower Hallway" name: "LACES" }
97 location_room: "Flower Hallway"
98 location_name: "DISCOVER, FAMILY, LACES"
99}
100doors {
101 name: "Tower Entrance"
102 type: EVENT
103 panels { room: "Main Area" name: "HI" }
104 panels { room: "Main Area" name: "ART" }
105 panels { room: "Main Area" name: "TEES" }
106 panels { room: "Center Building" name: "WORLD" }
107 panels { room: "Center Building" name: "FUZZIES" }
108 panels { room: "Main Area" name: "COLORFUL" }
109 panels { room: "Main Area" name: "WORD" }
110 panels { room: "Main Area" name: "HID" }
111 panels { room: "Main Area" name: "MESS" }
112 panels { room: "Main Area" name: "DEN" }
113 panels { room: "Main Area" name: "AGES" }
114 panels { room: "Main Area" name: "COUNTER" }
115 panels { room: "Main Area" name: "POSSIBLE" }
116 panels { room: "Main Area" name: "PACES" }
117 panels { room: "Main Area" name: "CLOCKWISE" }
118 panels { room: "Main Area" name: "ANY" }
119 panels { room: "Main Area" name: "RODS" }
120 panels { room: "Main Area" name: "TWO" }
121 panels { room: "Main Area" name: "TALK" }
122 panels { room: "Main Area" name: "SECRETIVE" }
123 panels { room: "Main Area" name: "TOADS" }
124 panels { room: "Main Area" name: "TON" }
125 panels { room: "Main Area" name: "MIND" }
126 panels { room: "Main Area" name: "END" }
127 panels { room: "Main Area" name: "RAD" }
128 panels { room: "Main Area" name: "TOO" }
129 panels { room: "Main Area" name: "STALK" }
130 panels { room: "Castle" name: "SERIES" }
131 panels { room: "Main Area" name: "CASTS" }
132 panels { room: "Main Area" name: "HAZES" }
133 panels { room: "Main Area" name: "DAZES" }
134 panels { room: "Main Area" name: "GAZES" }
135 panels { room: "Main Area" name: "S" }
136 panels { room: "Main Area" name: "C" }
137 panels { room: "Main Area" name: "A" }
138 panels { room: "Main Area" name: "V" }
139 panels { room: "Main Area" name: "E (1)" }
140 panels { room: "Main Area" name: "N" }
141 panels { room: "Castle" name: "G" }
142 panels { room: "Main Area" name: "E (2)" }
143 panels { room: "Main Area" name: "R" }
144 panels { room: "Main Area" name: "Blank" }
145 panels { room: "Main Area" name: "DISCOVER" }
146 panels { room: "Main Area" name: "FAMILY" }
147 panels { room: "Flower Hallway" name: "LACES" }
148}
149doors {
150 name: "Backside Entrance"
151 type: EVENT
152 panels { room: "Tower" name: "ENDS (1)" }
153}
154doors {
155 name: "Mastery Door"
156 type: EVENT
157 panels { room: "Backside Area" name: "BACKSIDE" }
158 panels { room: "Backside Area" name: "DOORWAYS" }
159 panels { room: "Backside Area" name: "SEE" }
160 panels { room: "Backside Area" name: "ENDS (2)" }
161}
diff --git a/data/maps/demo/metadata.txtpb b/data/maps/demo/metadata.txtpb new file mode 100644 index 0000000..4f61386 --- /dev/null +++ b/data/maps/demo/metadata.txtpb
@@ -0,0 +1,6 @@
1display_name: "Demo"
2type: DEMO
3# This painting is above a panel and can't be entered.
4excluded_nodes: "Meshes/owl"
5# The map's mastery is created at runtime.
6custom_nodes: "Components/Collectables/collectable"
diff --git a/data/maps/demo/rooms/Backside Area.txtpb b/data/maps/demo/rooms/Backside Area.txtpb new file mode 100644 index 0000000..ee31973 --- /dev/null +++ b/data/maps/demo/rooms/Backside Area.txtpb
@@ -0,0 +1,25 @@
1name: "Backside Area"
2panels {
3 name: "BACKSIDE"
4 path: "Panels/Endings/demo_41"
5 clue: "backside"
6 answer: "back"
7}
8panels {
9 name: "DOORWAYS"
10 path: "Panels/Endings/demo_42"
11 clue: "doorways"
12 answer: "doors"
13}
14panels {
15 name: "SEE"
16 path: "Panels/Endings/demo_43"
17 clue: "see"
18 answer: "secret"
19}
20panels {
21 name: "ENDS (2)"
22 path: "Panels/Endings/demo_44"
23 clue: "ends"
24 answer: "endings"
25}
diff --git a/data/maps/demo/rooms/Castle.txtpb b/data/maps/demo/rooms/Castle.txtpb new file mode 100644 index 0000000..4e17137 --- /dev/null +++ b/data/maps/demo/rooms/Castle.txtpb
@@ -0,0 +1,13 @@
1name: "Castle"
2panels {
3 name: "SERIES"
4 path: "Panels/Red/demo_26"
5 clue: "series"
6 answer: "mysteries"
7}
8panels {
9 name: "G"
10 path: "Panels/Blue/demo_37"
11 clue: "g"
12 answer: "g"
13}
diff --git a/data/maps/demo/rooms/Center Building.txtpb b/data/maps/demo/rooms/Center Building.txtpb new file mode 100644 index 0000000..401fd59 --- /dev/null +++ b/data/maps/demo/rooms/Center Building.txtpb
@@ -0,0 +1,13 @@
1name: "Center Building"
2panels {
3 name: "WORLD"
4 path: "Panels/Room 1/demo_3"
5 clue: "world"
6 answer: "word"
7}
8panels {
9 name: "FUZZIES"
10 path: "Panels/Room 1/demo_4"
11 clue: "fuzzies"
12 answer: "puzzles"
13}
diff --git a/data/maps/demo/rooms/Flower Hallway.txtpb b/data/maps/demo/rooms/Flower Hallway.txtpb new file mode 100644 index 0000000..059e4f6 --- /dev/null +++ b/data/maps/demo/rooms/Flower Hallway.txtpb
@@ -0,0 +1,7 @@
1name: "Flower Hallway"
2panels {
3 name: "LACES"
4 path: "Panels/Gold/demo_47"
5 clue: "laces"
6 answer: "places"
7}
diff --git a/data/maps/demo/rooms/Main Area.txtpb b/data/maps/demo/rooms/Main Area.txtpb new file mode 100644 index 0000000..f920a26 --- /dev/null +++ b/data/maps/demo/rooms/Main Area.txtpb
@@ -0,0 +1,241 @@
1name: "Main Area"
2panels {
3 name: "HI"
4 path: "Panels/Entry/demo_1"
5 clue: "hi"
6 answer: "hi"
7}
8panels {
9 name: "ART"
10 path: "Panels/Entry/demo_49"
11 clue: "\"art\""
12 answer: "art"
13}
14panels {
15 name: "TEES"
16 path: "Panels/Entry/demo_50"
17 clue: "tees"
18 answer: "trees"
19}
20panels {
21 name: "COLORFUL"
22 path: "Panels/Room 1/demo_5"
23 clue: "colorful"
24 answer: "colorful"
25}
26panels {
27 name: "WORD"
28 path: "Panels/Room 1/demo_6"
29 clue: "word"
30 answer: "world"
31}
32panels {
33 name: "AGES"
34 path: "Panels/Orange/demo_7"
35 clue: "ages"
36 answer: "messages"
37}
38panels {
39 name: "DEN"
40 path: "Panels/Orange/demo_8"
41 clue: "den"
42 answer: "hidden"
43}
44panels {
45 name: "HID"
46 path: "Panels/Orange/demo_9"
47 clue: "hid"
48 answer: "hidden"
49}
50panels {
51 name: "MESS"
52 path: "Panels/Orange/demo_10"
53 clue: "mess"
54 answer: "messages"
55}
56panels {
57 name: "CLOCKWISE"
58 path: "Panels/Purple/demo_2"
59 clue: "clockwise"
60 answer: "counter"
61}
62panels {
63 name: "POSSIBLE"
64 path: "Panels/Purple/demo_12"
65 clue: "possible"
66 answer: "impossible"
67}
68panels {
69 name: "PACES"
70 path: "Panels/Purple/demo_13"
71 clue: "paces"
72 answer: "spaces"
73}
74panels {
75 name: "COUNTER"
76 path: "Panels/Purple/demo_30"
77 clue: "counter"
78 answer: "clockwise"
79}
80panels {
81 name: "ANY"
82 path: "Panels/Yellow/demo_14"
83 clue: "any"
84 answer: "many"
85}
86panels {
87 name: "RODS"
88 path: "Panels/Yellow/demo_15"
89 clue: "rods"
90 answer: "roads"
91}
92panels {
93 name: "TWO"
94 path: "Panels/Yellow/demo_16"
95 clue: "two"
96 answer: "to"
97}
98panels {
99 name: "TALK"
100 path: "Panels/Yellow/demo_17"
101 clue: "talk"
102 answer: "walk"
103}
104panels {
105 name: "SECRETIVE"
106 path: "Panels/Yellow/demo_18"
107 clue: "secretive"
108 answer: "secret"
109}
110panels {
111 name: "TOADS"
112 path: "Panels/Yellow/demo_19"
113 clue: "toads"
114 answer: "roads"
115}
116panels {
117 name: "TON"
118 path: "Panels/Yellow/demo_20"
119 clue: "ton"
120 answer: "to"
121}
122panels {
123 name: "MIND"
124 path: "Panels/Yellow/demo_21"
125 clue: "mind"
126 answer: "find"
127}
128panels {
129 name: "END"
130 path: "Panels/Yellow/demo_22"
131 clue: "end"
132 answer: "endless"
133}
134panels {
135 name: "RAD"
136 path: "Panels/Yellow/demo_23"
137 clue: "rad"
138 answer: "roads"
139}
140panels {
141 name: "TOO"
142 path: "Panels/Yellow/demo_24"
143 clue: "too"
144 answer: "to"
145}
146panels {
147 name: "STALK"
148 path: "Panels/Yellow/demo_25"
149 clue: "stalk"
150 answer: "walk"
151}
152panels {
153 name: "HAZES"
154 path: "Panels/Green/demo_27"
155 clue: "hazes"
156 answer: "mazes"
157}
158panels {
159 name: "DAZES"
160 path: "Panels/Green/demo_28"
161 clue: "dazes"
162 answer: "mazes"
163}
164panels {
165 name: "GAZES"
166 path: "Panels/Green/demo_29"
167 clue: "gazes"
168 answer: "mazes"
169}
170panels {
171 name: "CASTS"
172 path: "Panels/Green/demo_30"
173 clue: "casts"
174 answer: "castles"
175}
176panels {
177 name: "S"
178 path: "Panels/Blue/demo_31"
179 clue: "s"
180 answer: "s"
181}
182panels {
183 name: "C"
184 path: "Panels/Blue/demo_32"
185 clue: "c"
186 answer: "c"
187}
188panels {
189 name: "A"
190 path: "Panels/Blue/demo_33"
191 clue: "a"
192 answer: "a"
193}
194panels {
195 name: "V"
196 path: "Panels/Blue/demo_34"
197 clue: "v"
198 answer: "v"
199}
200panels {
201 name: "E (1)"
202 path: "Panels/Blue/demo_35"
203 clue: "e"
204 answer: "e"
205}
206panels {
207 name: "N"
208 path: "Panels/Blue/demo_36"
209 clue: "n"
210 answer: "n"
211}
212panels {
213 name: "E (2)"
214 path: "Panels/Blue/demo_38"
215 clue: "e"
216 answer: "e"
217}
218panels {
219 name: "R"
220 path: "Panels/Blue/demo_39"
221 clue: "r"
222 answer: "r"
223}
224panels {
225 name: "Blank"
226 path: "Panels/Blue/demo_40"
227 clue: ""
228 answer: "hunts"
229}
230panels {
231 name: "DISCOVER"
232 path: "Panels/Gold/demo_45"
233 clue: "discover"
234 answer: "rediscover"
235}
236panels {
237 name: "FAMILY"
238 path: "Panels/Gold/demo_46"
239 clue: "family"
240 answer: "familiar"
241}
diff --git a/data/maps/demo/rooms/Mastery.txtpb b/data/maps/demo/rooms/Mastery.txtpb new file mode 100644 index 0000000..bbe8742 --- /dev/null +++ b/data/maps/demo/rooms/Mastery.txtpb
@@ -0,0 +1,5 @@
1name: "Mastery"
2masteries {
3 name: "MASTERY"
4 path: "Components/Collectables/collectable"
5}
diff --git a/data/maps/demo/rooms/Tower.txtpb b/data/maps/demo/rooms/Tower.txtpb new file mode 100644 index 0000000..2e73d79 --- /dev/null +++ b/data/maps/demo/rooms/Tower.txtpb
@@ -0,0 +1,7 @@
1name: "Tower"
2panels {
3 name: "ENDS (1)"
4 path: "Panels/Endings/demo_48"
5 clue: "ends"
6 answer: "endings"
7}
diff --git a/data/metadata.txtpb b/data/metadata.txtpb index eb3fe54..a939456 100644 --- a/data/metadata.txtpb +++ b/data/metadata.txtpb
@@ -1,6 +1,6 @@
1version { 1version {
2 major: 7 2 major: 7
3 minor: 1 3 minor: 2
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 be18100..b46ab99 100644 --- a/proto/data.proto +++ b/proto/data.proto
@@ -56,6 +56,7 @@ enum MapType {
56 NORMAL_MAP = 0; 56 NORMAL_MAP = 0;
57 ICARUS = 1; 57 ICARUS = 1;
58 GIFT_MAP = 2; 58 GIFT_MAP = 2;
59 DEMO = 3;
59} 60}
60 61
61enum AxisDirection { 62enum AxisDirection {