diff options
29 files changed, 918 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 | |||
| 20 | Download: | ||
| 21 | [lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.2.0/lingo2.apworld)<br/> | ||
| 22 | Template YAML: | ||
| 23 | [Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.2.0/Lingo%202.yaml)<br/> | ||
| 24 | Source: [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 @@ | |||
| 1 | extends "res://scripts/nodes/allowNumbers.gd" | ||
| 2 | |||
| 3 | |||
| 4 | func _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/connections.txtpb b/data/connections.txtpb index 4bec584..8d75dab 100644 --- a/data/connections.txtpb +++ b/data/connections.txtpb | |||
| @@ -2688,3 +2688,53 @@ connections { | |||
| 2688 | } | 2688 | } |
| 2689 | oneway: true | 2689 | oneway: true |
| 2690 | } | 2690 | } |
| 2691 | connections { | ||
| 2692 | from { | ||
| 2693 | panel { | ||
| 2694 | map: "the_entry" | ||
| 2695 | room: "Starting Room" | ||
| 2696 | name: "Gift Maps" | ||
| 2697 | answer: "gongus" | ||
| 2698 | } | ||
| 2699 | } | ||
| 2700 | to { | ||
| 2701 | room { | ||
| 2702 | map: "the_fuzzy" | ||
| 2703 | name: "Main Area" | ||
| 2704 | } | ||
| 2705 | } | ||
| 2706 | oneway: true | ||
| 2707 | } | ||
| 2708 | connections { | ||
| 2709 | from { | ||
| 2710 | panel { | ||
| 2711 | map: "the_entry" | ||
| 2712 | room: "Starting Room" | ||
| 2713 | name: "Gift Maps" | ||
| 2714 | answer: "kiwi" | ||
| 2715 | } | ||
| 2716 | } | ||
| 2717 | to { | ||
| 2718 | room { | ||
| 2719 | map: "the_fuzzy" | ||
| 2720 | name: "Main Area" | ||
| 2721 | } | ||
| 2722 | } | ||
| 2723 | oneway: true | ||
| 2724 | } | ||
| 2725 | connections { | ||
| 2726 | from { | ||
| 2727 | port { | ||
| 2728 | map: "the_fuzzy" | ||
| 2729 | room: "Main Area" | ||
| 2730 | name: "WORLDPORT" | ||
| 2731 | } | ||
| 2732 | } | ||
| 2733 | to { | ||
| 2734 | room { | ||
| 2735 | map: "the_entry" | ||
| 2736 | name: "Starting Room" | ||
| 2737 | } | ||
| 2738 | } | ||
| 2739 | oneway: true | ||
| 2740 | } | ||
| diff --git a/data/ids.yaml b/data/ids.yaml index 1db61e3..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: |
| @@ -2022,6 +2100,30 @@ maps: | |||
| 2022 | panels: | 2100 | panels: |
| 2023 | CACTUS: 410 | 2101 | CACTUS: 410 |
| 2024 | TAIL: 411 | 2102 | TAIL: 411 |
| 2103 | the_fuzzy: | ||
| 2104 | rooms: | ||
| 2105 | Main Area: | ||
| 2106 | panels: | ||
| 2107 | ACHIEVES: 3033 | ||
| 2108 | BEFORE: 3028 | ||
| 2109 | BOTH: 3036 | ||
| 2110 | Blank: 3022 | ||
| 2111 | CAGED: 3027 | ||
| 2112 | COMBINED: 3032 | ||
| 2113 | DICE: 3026 | ||
| 2114 | FIRST: 3035 | ||
| 2115 | FORGED: 3030 | ||
| 2116 | LOTTO: 3024 | ||
| 2117 | OTHERS: 3031 | ||
| 2118 | TOED: 3029 | ||
| 2119 | TUTU: 3023 | ||
| 2120 | UNVEILED: 3034 | ||
| 2121 | WHERETO: 3025 | ||
| 2122 | Mastery: | ||
| 2123 | masteries: | ||
| 2124 | MASTERY: 3037 | ||
| 2125 | doors: | ||
| 2126 | Black Panels: 3021 | ||
| 2025 | the_gallery: | 2127 | the_gallery: |
| 2026 | rooms: | 2128 | rooms: |
| 2027 | Back Room: | 2129 | Back Room: |
| @@ -4154,6 +4256,7 @@ special: | |||
| 4154 | Job Symbol: 2798 | 4256 | Job Symbol: 2798 |
| 4155 | Lingo Symbol: 2799 | 4257 | Lingo Symbol: 2799 |
| 4156 | Null Symbol: 2800 | 4258 | Null Symbol: 2800 |
| 4259 | Numbers: 3038 | ||
| 4157 | Planet Symbol: 2801 | 4260 | Planet Symbol: 2801 |
| 4158 | Pyramid Symbol: 2802 | 4261 | Pyramid Symbol: 2802 |
| 4159 | Question Symbol: 2803 | 4262 | Question Symbol: 2803 |
| 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 @@ | |||
| 1 | connections { | ||
| 2 | from_room: "Main Area" | ||
| 3 | to_room: "Center Building" | ||
| 4 | door { name: "Center Building" } | ||
| 5 | } | ||
| 6 | connections { | ||
| 7 | from_room: "Main Area" | ||
| 8 | to_room: "Flower Hallway" | ||
| 9 | door { name: "Flower Hallway" } | ||
| 10 | } | ||
| 11 | connections { | ||
| 12 | from_room: "Main Area" | ||
| 13 | to_room: "Tower" | ||
| 14 | door { name: "Tower Entrance" } | ||
| 15 | } | ||
| 16 | connections { | ||
| 17 | from_room: "Main Area" | ||
| 18 | to_room: "Castle" | ||
| 19 | door { name: "Castle" } | ||
| 20 | } | ||
| 21 | connections { | ||
| 22 | from_room: "Main Area" | ||
| 23 | to_room: "Backside Area" | ||
| 24 | door { name: "Backside Entrance" } | ||
| 25 | } | ||
| 26 | connections { | ||
| 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 @@ | |||
| 1 | doors { | ||
| 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 | } | ||
| 8 | doors { | ||
| 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 | } | ||
| 15 | doors { | ||
| 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 | } | ||
| 25 | doors { | ||
| 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 | } | ||
| 35 | doors { | ||
| 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 | } | ||
| 45 | doors { | ||
| 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 | } | ||
| 63 | doors { | ||
| 64 | name: "Red Door" | ||
| 65 | type: LOCATION_ONLY | ||
| 66 | panels { room: "Castle" name: "SERIES" } | ||
| 67 | location_room: "Castle" | ||
| 68 | location_name: "SERIES" | ||
| 69 | } | ||
| 70 | doors { | ||
| 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 | } | ||
| 77 | doors { | ||
| 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 | } | ||
| 91 | doors { | ||
| 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 | } | ||
| 100 | doors { | ||
| 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 | } | ||
| 149 | doors { | ||
| 150 | name: "Backside Entrance" | ||
| 151 | type: EVENT | ||
| 152 | panels { room: "Tower" name: "ENDS (1)" } | ||
| 153 | } | ||
| 154 | doors { | ||
| 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 @@ | |||
| 1 | display_name: "Demo" | ||
| 2 | type: DEMO | ||
| 3 | # This painting is above a panel and can't be entered. | ||
| 4 | excluded_nodes: "Meshes/owl" | ||
| 5 | # The map's mastery is created at runtime. | ||
| 6 | custom_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 @@ | |||
| 1 | name: "Backside Area" | ||
| 2 | panels { | ||
| 3 | name: "BACKSIDE" | ||
| 4 | path: "Panels/Endings/demo_41" | ||
| 5 | clue: "backside" | ||
| 6 | answer: "back" | ||
| 7 | } | ||
| 8 | panels { | ||
| 9 | name: "DOORWAYS" | ||
| 10 | path: "Panels/Endings/demo_42" | ||
| 11 | clue: "doorways" | ||
| 12 | answer: "doors" | ||
| 13 | } | ||
| 14 | panels { | ||
| 15 | name: "SEE" | ||
| 16 | path: "Panels/Endings/demo_43" | ||
| 17 | clue: "see" | ||
| 18 | answer: "secret" | ||
| 19 | } | ||
| 20 | panels { | ||
| 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 @@ | |||
| 1 | name: "Castle" | ||
| 2 | panels { | ||
| 3 | name: "SERIES" | ||
| 4 | path: "Panels/Red/demo_26" | ||
| 5 | clue: "series" | ||
| 6 | answer: "mysteries" | ||
| 7 | } | ||
| 8 | panels { | ||
| 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 @@ | |||
| 1 | name: "Center Building" | ||
| 2 | panels { | ||
| 3 | name: "WORLD" | ||
| 4 | path: "Panels/Room 1/demo_3" | ||
| 5 | clue: "world" | ||
| 6 | answer: "word" | ||
| 7 | } | ||
| 8 | panels { | ||
| 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 @@ | |||
| 1 | name: "Flower Hallway" | ||
| 2 | panels { | ||
| 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 @@ | |||
| 1 | name: "Main Area" | ||
| 2 | panels { | ||
| 3 | name: "HI" | ||
| 4 | path: "Panels/Entry/demo_1" | ||
| 5 | clue: "hi" | ||
| 6 | answer: "hi" | ||
| 7 | } | ||
| 8 | panels { | ||
| 9 | name: "ART" | ||
| 10 | path: "Panels/Entry/demo_49" | ||
| 11 | clue: "\"art\"" | ||
| 12 | answer: "art" | ||
| 13 | } | ||
| 14 | panels { | ||
| 15 | name: "TEES" | ||
| 16 | path: "Panels/Entry/demo_50" | ||
| 17 | clue: "tees" | ||
| 18 | answer: "trees" | ||
| 19 | } | ||
| 20 | panels { | ||
| 21 | name: "COLORFUL" | ||
| 22 | path: "Panels/Room 1/demo_5" | ||
| 23 | clue: "colorful" | ||
| 24 | answer: "colorful" | ||
| 25 | } | ||
| 26 | panels { | ||
| 27 | name: "WORD" | ||
| 28 | path: "Panels/Room 1/demo_6" | ||
| 29 | clue: "word" | ||
| 30 | answer: "world" | ||
| 31 | } | ||
| 32 | panels { | ||
| 33 | name: "AGES" | ||
| 34 | path: "Panels/Orange/demo_7" | ||
| 35 | clue: "ages" | ||
| 36 | answer: "messages" | ||
| 37 | } | ||
| 38 | panels { | ||
| 39 | name: "DEN" | ||
| 40 | path: "Panels/Orange/demo_8" | ||
| 41 | clue: "den" | ||
| 42 | answer: "hidden" | ||
| 43 | } | ||
| 44 | panels { | ||
| 45 | name: "HID" | ||
| 46 | path: "Panels/Orange/demo_9" | ||
| 47 | clue: "hid" | ||
| 48 | answer: "hidden" | ||
| 49 | } | ||
| 50 | panels { | ||
| 51 | name: "MESS" | ||
| 52 | path: "Panels/Orange/demo_10" | ||
| 53 | clue: "mess" | ||
| 54 | answer: "messages" | ||
| 55 | } | ||
| 56 | panels { | ||
| 57 | name: "CLOCKWISE" | ||
| 58 | path: "Panels/Purple/demo_2" | ||
| 59 | clue: "clockwise" | ||
| 60 | answer: "counter" | ||
| 61 | } | ||
| 62 | panels { | ||
| 63 | name: "POSSIBLE" | ||
| 64 | path: "Panels/Purple/demo_12" | ||
| 65 | clue: "possible" | ||
| 66 | answer: "impossible" | ||
| 67 | } | ||
| 68 | panels { | ||
| 69 | name: "PACES" | ||
| 70 | path: "Panels/Purple/demo_13" | ||
| 71 | clue: "paces" | ||
| 72 | answer: "spaces" | ||
| 73 | } | ||
| 74 | panels { | ||
| 75 | name: "COUNTER" | ||
| 76 | path: "Panels/Purple/demo_30" | ||
| 77 | clue: "counter" | ||
| 78 | answer: "clockwise" | ||
| 79 | } | ||
| 80 | panels { | ||
| 81 | name: "ANY" | ||
| 82 | path: "Panels/Yellow/demo_14" | ||
| 83 | clue: "any" | ||
| 84 | answer: "many" | ||
| 85 | } | ||
| 86 | panels { | ||
| 87 | name: "RODS" | ||
| 88 | path: "Panels/Yellow/demo_15" | ||
| 89 | clue: "rods" | ||
| 90 | answer: "roads" | ||
| 91 | } | ||
| 92 | panels { | ||
| 93 | name: "TWO" | ||
| 94 | path: "Panels/Yellow/demo_16" | ||
| 95 | clue: "two" | ||
| 96 | answer: "to" | ||
| 97 | } | ||
| 98 | panels { | ||
| 99 | name: "TALK" | ||
| 100 | path: "Panels/Yellow/demo_17" | ||
| 101 | clue: "talk" | ||
| 102 | answer: "walk" | ||
| 103 | } | ||
| 104 | panels { | ||
| 105 | name: "SECRETIVE" | ||
| 106 | path: "Panels/Yellow/demo_18" | ||
| 107 | clue: "secretive" | ||
| 108 | answer: "secret" | ||
| 109 | } | ||
| 110 | panels { | ||
| 111 | name: "TOADS" | ||
| 112 | path: "Panels/Yellow/demo_19" | ||
| 113 | clue: "toads" | ||
| 114 | answer: "roads" | ||
| 115 | } | ||
| 116 | panels { | ||
| 117 | name: "TON" | ||
| 118 | path: "Panels/Yellow/demo_20" | ||
| 119 | clue: "ton" | ||
| 120 | answer: "to" | ||
| 121 | } | ||
| 122 | panels { | ||
| 123 | name: "MIND" | ||
| 124 | path: "Panels/Yellow/demo_21" | ||
| 125 | clue: "mind" | ||
| 126 | answer: "find" | ||
| 127 | } | ||
| 128 | panels { | ||
| 129 | name: "END" | ||
| 130 | path: "Panels/Yellow/demo_22" | ||
| 131 | clue: "end" | ||
| 132 | answer: "endless" | ||
| 133 | } | ||
| 134 | panels { | ||
| 135 | name: "RAD" | ||
| 136 | path: "Panels/Yellow/demo_23" | ||
| 137 | clue: "rad" | ||
| 138 | answer: "roads" | ||
| 139 | } | ||
| 140 | panels { | ||
| 141 | name: "TOO" | ||
| 142 | path: "Panels/Yellow/demo_24" | ||
| 143 | clue: "too" | ||
| 144 | answer: "to" | ||
| 145 | } | ||
| 146 | panels { | ||
| 147 | name: "STALK" | ||
| 148 | path: "Panels/Yellow/demo_25" | ||
| 149 | clue: "stalk" | ||
| 150 | answer: "walk" | ||
| 151 | } | ||
| 152 | panels { | ||
| 153 | name: "HAZES" | ||
| 154 | path: "Panels/Green/demo_27" | ||
| 155 | clue: "hazes" | ||
| 156 | answer: "mazes" | ||
| 157 | } | ||
| 158 | panels { | ||
| 159 | name: "DAZES" | ||
| 160 | path: "Panels/Green/demo_28" | ||
| 161 | clue: "dazes" | ||
| 162 | answer: "mazes" | ||
| 163 | } | ||
| 164 | panels { | ||
| 165 | name: "GAZES" | ||
| 166 | path: "Panels/Green/demo_29" | ||
| 167 | clue: "gazes" | ||
| 168 | answer: "mazes" | ||
| 169 | } | ||
| 170 | panels { | ||
| 171 | name: "CASTS" | ||
| 172 | path: "Panels/Green/demo_30" | ||
| 173 | clue: "casts" | ||
| 174 | answer: "castles" | ||
| 175 | } | ||
| 176 | panels { | ||
| 177 | name: "S" | ||
| 178 | path: "Panels/Blue/demo_31" | ||
| 179 | clue: "s" | ||
| 180 | answer: "s" | ||
| 181 | } | ||
| 182 | panels { | ||
| 183 | name: "C" | ||
| 184 | path: "Panels/Blue/demo_32" | ||
| 185 | clue: "c" | ||
| 186 | answer: "c" | ||
| 187 | } | ||
| 188 | panels { | ||
| 189 | name: "A" | ||
| 190 | path: "Panels/Blue/demo_33" | ||
| 191 | clue: "a" | ||
| 192 | answer: "a" | ||
| 193 | } | ||
| 194 | panels { | ||
| 195 | name: "V" | ||
| 196 | path: "Panels/Blue/demo_34" | ||
| 197 | clue: "v" | ||
| 198 | answer: "v" | ||
| 199 | } | ||
| 200 | panels { | ||
| 201 | name: "E (1)" | ||
| 202 | path: "Panels/Blue/demo_35" | ||
| 203 | clue: "e" | ||
| 204 | answer: "e" | ||
| 205 | } | ||
| 206 | panels { | ||
| 207 | name: "N" | ||
| 208 | path: "Panels/Blue/demo_36" | ||
| 209 | clue: "n" | ||
| 210 | answer: "n" | ||
| 211 | } | ||
| 212 | panels { | ||
| 213 | name: "E (2)" | ||
| 214 | path: "Panels/Blue/demo_38" | ||
| 215 | clue: "e" | ||
| 216 | answer: "e" | ||
| 217 | } | ||
| 218 | panels { | ||
| 219 | name: "R" | ||
| 220 | path: "Panels/Blue/demo_39" | ||
| 221 | clue: "r" | ||
| 222 | answer: "r" | ||
| 223 | } | ||
| 224 | panels { | ||
| 225 | name: "Blank" | ||
| 226 | path: "Panels/Blue/demo_40" | ||
| 227 | clue: "" | ||
| 228 | answer: "hunts" | ||
| 229 | } | ||
| 230 | panels { | ||
| 231 | name: "DISCOVER" | ||
| 232 | path: "Panels/Gold/demo_45" | ||
| 233 | clue: "discover" | ||
| 234 | answer: "rediscover" | ||
| 235 | } | ||
| 236 | panels { | ||
| 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 @@ | |||
| 1 | name: "Mastery" | ||
| 2 | masteries { | ||
| 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 @@ | |||
| 1 | name: "Tower" | ||
| 2 | panels { | ||
| 3 | name: "ENDS (1)" | ||
| 4 | path: "Panels/Endings/demo_48" | ||
| 5 | clue: "ends" | ||
| 6 | answer: "endings" | ||
| 7 | } | ||
| diff --git a/data/maps/the_entry/metadata.txtpb b/data/maps/the_entry/metadata.txtpb index bdcdf83..da2194b 100644 --- a/data/maps/the_entry/metadata.txtpb +++ b/data/maps/the_entry/metadata.txtpb | |||
| @@ -12,9 +12,11 @@ excluded_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. |
| 13 | excluded_nodes: "Panels/Entry/entry_proxied_fake" | 13 | excluded_nodes: "Panels/Entry/entry_proxied_fake" |
| 14 | # The gift map entrance is created by the mod. | 14 | # The gift map entrance is created by the mod. |
| 15 | custom_nodes: "Components/GiftMapEntrance/GongusPanel" | ||
| 15 | custom_nodes: "Components/GiftMapEntrance/HatkirbyPanel" | 16 | custom_nodes: "Components/GiftMapEntrance/HatkirbyPanel" |
| 16 | custom_nodes: "Components/GiftMapEntrance/IcelyPanel" | 17 | custom_nodes: "Components/GiftMapEntrance/IcelyPanel" |
| 17 | custom_nodes: "Components/GiftMapEntrance/KirbyPanel" | 18 | custom_nodes: "Components/GiftMapEntrance/KirbyPanel" |
| 19 | custom_nodes: "Components/GiftMapEntrance/KiwiPanel" | ||
| 18 | custom_nodes: "Components/GiftMapEntrance/Panel" | 20 | custom_nodes: "Components/GiftMapEntrance/Panel" |
| 19 | custom_nodes: "Components/GiftMapEntrance/QPanel" | 21 | custom_nodes: "Components/GiftMapEntrance/QPanel" |
| 20 | custom_nodes: "Components/GiftMapEntrance/SouveyPanel" | 22 | custom_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 9c73766..d01d807 100644 --- a/data/maps/the_entry/rooms/Starting Room.txtpb +++ b/data/maps/the_entry/rooms/Starting Room.txtpb | |||
| @@ -55,9 +55,11 @@ panels { | |||
| 55 | # The puzzle solution doesn't matter. We'll change it to the player's name | 55 | # The puzzle solution doesn't matter. We'll change it to the player's name |
| 56 | # for fun. | 56 | # for fun. |
| 57 | symbols: QUESTION | 57 | symbols: QUESTION |
| 58 | proxies { answer: "gongus" path: "Components/GiftMapEntrance/GongusPanel" } | ||
| 58 | proxies { answer: "hatkirby" path: "Components/GiftMapEntrance/HatkirbyPanel" } | 59 | proxies { answer: "hatkirby" path: "Components/GiftMapEntrance/HatkirbyPanel" } |
| 59 | proxies { answer: "icely" path: "Components/GiftMapEntrance/IcelyPanel" } | 60 | proxies { answer: "icely" path: "Components/GiftMapEntrance/IcelyPanel" } |
| 60 | proxies { answer: "kirby" path: "Components/GiftMapEntrance/KirbyPanel" } | 61 | proxies { answer: "kirby" path: "Components/GiftMapEntrance/KirbyPanel" } |
| 62 | proxies { answer: "kiwi" path: "Components/GiftMapEntrance/KiwiPanel" } | ||
| 61 | proxies { answer: "q" path: "Components/GiftMapEntrance/QPanel" } | 63 | proxies { answer: "q" path: "Components/GiftMapEntrance/QPanel" } |
| 62 | proxies { answer: "souvey" path: "Components/GiftMapEntrance/SouveyPanel" } | 64 | proxies { answer: "souvey" path: "Components/GiftMapEntrance/SouveyPanel" } |
| 63 | proxies { answer: "star" path: "Components/GiftMapEntrance/StarPanel" } | 65 | proxies { answer: "star" path: "Components/GiftMapEntrance/StarPanel" } |
| diff --git a/data/maps/the_fuzzy/connections.txtpb b/data/maps/the_fuzzy/connections.txtpb new file mode 100644 index 0000000..ea39f34 --- /dev/null +++ b/data/maps/the_fuzzy/connections.txtpb | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | connections { | ||
| 2 | from_room: "Main Area" | ||
| 3 | to_room: "Mastery" | ||
| 4 | door { name: "Mastery Door" } | ||
| 5 | } | ||
| diff --git a/data/maps/the_fuzzy/doors.txtpb b/data/maps/the_fuzzy/doors.txtpb new file mode 100644 index 0000000..0f89b80 --- /dev/null +++ b/data/maps/the_fuzzy/doors.txtpb | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | doors { | ||
| 2 | name: "Black Panels" | ||
| 3 | type: LOCATION_ONLY | ||
| 4 | panels { room: "Main Area" name: "WHERETO" } | ||
| 5 | panels { room: "Main Area" name: "COMBINED" } | ||
| 6 | location_room: "Main Area" | ||
| 7 | } | ||
| 8 | doors { | ||
| 9 | name: "Mastery Door" | ||
| 10 | type: EVENT | ||
| 11 | panels { room: "Main Area" name: "OTHERS" } | ||
| 12 | } | ||
| diff --git a/data/maps/the_fuzzy/metadata.txtpb b/data/maps/the_fuzzy/metadata.txtpb new file mode 100644 index 0000000..b4178c7 --- /dev/null +++ b/data/maps/the_fuzzy/metadata.txtpb | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | display_name: "The Fuzzy" | ||
| 2 | type: GIFT_MAP | ||
| 3 | # The map's mastery is created at runtime. | ||
| 4 | custom_nodes: "Components/Collectables/collectable" | ||
| diff --git a/data/maps/the_fuzzy/rooms/Main Area.txtpb b/data/maps/the_fuzzy/rooms/Main Area.txtpb new file mode 100644 index 0000000..9c06df8 --- /dev/null +++ b/data/maps/the_fuzzy/rooms/Main Area.txtpb | |||
| @@ -0,0 +1,119 @@ | |||
| 1 | name: "Main Area" | ||
| 2 | panels { | ||
| 3 | name: "Blank" | ||
| 4 | path: "Panels/Room_1/panel_1" | ||
| 5 | clue: "" | ||
| 6 | answer: "2475" | ||
| 7 | symbols: LINGO | ||
| 8 | symbols: QUESTION | ||
| 9 | } | ||
| 10 | panels { | ||
| 11 | name: "TUTU" | ||
| 12 | path: "Panels/Room_1/panel_2" | ||
| 13 | clue: "tutu" | ||
| 14 | answer: "22" | ||
| 15 | symbols: ZERO | ||
| 16 | symbols: EVAL | ||
| 17 | } | ||
| 18 | panels { | ||
| 19 | name: "LOTTO" | ||
| 20 | path: "Panels/Room_1/panel_3" | ||
| 21 | clue: "lotto" | ||
| 22 | answer: "22222222" | ||
| 23 | symbols: ZERO | ||
| 24 | symbols: EVAL | ||
| 25 | } | ||
| 26 | panels { | ||
| 27 | name: "WHERETO" | ||
| 28 | path: "Panels/Room_1/panel_10" | ||
| 29 | clue: "whereto" | ||
| 30 | answer: "sides" | ||
| 31 | symbols: QUESTION | ||
| 32 | } | ||
| 33 | panels { | ||
| 34 | name: "DICE" | ||
| 35 | path: "Panels/Room_1/panel_11" | ||
| 36 | clue: "dice" | ||
| 37 | answer: "4935" | ||
| 38 | symbols: QUESTION | ||
| 39 | } | ||
| 40 | panels { | ||
| 41 | name: "CAGED" | ||
| 42 | path: "Panels/Room_1/panel_12" | ||
| 43 | clue: "caged" | ||
| 44 | answer: "31754" | ||
| 45 | symbols: QUESTION | ||
| 46 | } | ||
| 47 | panels { | ||
| 48 | name: "BEFORE" | ||
| 49 | path: "Panels/Room_1/panel_13" | ||
| 50 | clue: "before" | ||
| 51 | answer: "100" | ||
| 52 | symbols: ZERO | ||
| 53 | symbols: EVAL | ||
| 54 | } | ||
| 55 | panels { | ||
| 56 | name: "TOED" | ||
| 57 | path: "Panels/Room_1/panel_14" | ||
| 58 | clue: "toed" | ||
| 59 | answer: "108" | ||
| 60 | symbols: ZERO | ||
| 61 | symbols: EVAL | ||
| 62 | } | ||
| 63 | panels { | ||
| 64 | name: "FORGED" | ||
| 65 | path: "Panels/Room_1/panel_15" | ||
| 66 | clue: "forged" | ||
| 67 | answer: "3016" | ||
| 68 | symbols: ZERO | ||
| 69 | symbols: EVAL | ||
| 70 | } | ||
| 71 | panels { | ||
| 72 | name: "OTHERS" | ||
| 73 | path: "Panels/Room_1/panel_4" | ||
| 74 | clue: "others" | ||
| 75 | answer: "34390869" | ||
| 76 | symbols: QUESTION | ||
| 77 | } | ||
| 78 | panels { | ||
| 79 | name: "COMBINED" | ||
| 80 | path: "Panels/Room_1/panel_9" | ||
| 81 | clue: "combined" | ||
| 82 | answer: "added" | ||
| 83 | symbols: SUN | ||
| 84 | } | ||
| 85 | panels { | ||
| 86 | name: "ACHIEVES" | ||
| 87 | path: "Panels/Room_1/panel_5" | ||
| 88 | clue: "achieves" | ||
| 89 | answer: "4214" | ||
| 90 | symbols: QUESTION | ||
| 91 | } | ||
| 92 | panels { | ||
| 93 | name: "UNVEILED" | ||
| 94 | path: "Panels/Room_1/panel_6" | ||
| 95 | clue: "unveiled" | ||
| 96 | answer: "12122021" | ||
| 97 | symbols: QUESTION | ||
| 98 | } | ||
| 99 | panels { | ||
| 100 | name: "FIRST" | ||
| 101 | path: "Panels/Room_1/panel_8" | ||
| 102 | clue: "first" | ||
| 103 | answer: "1" | ||
| 104 | symbols: QUESTION | ||
| 105 | } | ||
| 106 | panels { | ||
| 107 | name: "BOTH" | ||
| 108 | path: "Panels/Room_1/panel_7" | ||
| 109 | clue: "both" | ||
| 110 | answer: "2" | ||
| 111 | symbols: QUESTION | ||
| 112 | } | ||
| 113 | ports { | ||
| 114 | name: "WORLDPORT" | ||
| 115 | display_name: "Entrance" | ||
| 116 | path: "Components/Warps/worldport" | ||
| 117 | destination { x: 0 y: 0 z: 9 } | ||
| 118 | rotation: 0 | ||
| 119 | } | ||
| diff --git a/data/maps/the_fuzzy/rooms/Mastery.txtpb b/data/maps/the_fuzzy/rooms/Mastery.txtpb new file mode 100644 index 0000000..bbe8742 --- /dev/null +++ b/data/maps/the_fuzzy/rooms/Mastery.txtpb | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | name: "Mastery" | ||
| 2 | masteries { | ||
| 3 | name: "MASTERY" | ||
| 4 | path: "Components/Collectables/collectable" | ||
| 5 | } | ||
| diff --git a/data/metadata.txtpb b/data/metadata.txtpb index c5c48c2..a939456 100644 --- a/data/metadata.txtpb +++ b/data/metadata.txtpb | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | version { | 1 | version { |
| 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. |
| @@ -52,3 +52,5 @@ special_names: "Anti W" | |||
| 52 | special_names: "Anti X" | 52 | special_names: "Anti X" |
| 53 | special_names: "Anti Y" | 53 | special_names: "Anti Y" |
| 54 | special_names: "Anti Z" | 54 | special_names: "Anti Z" |
| 55 | # Numbers for The Fuzzy | ||
| 56 | special_names: "Numbers" | ||
| 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 | ||
| 61 | enum AxisDirection { | 62 | enum AxisDirection { |
