about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--CHANGELOG.md354
-rw-r--r--README.md284
-rw-r--r--apworld/__init__.py141
-rw-r--r--apworld/client/allowNumbers.gd10
-rw-r--r--apworld/client/animationListener.gd38
-rw-r--r--apworld/client/apworld_runtime.gd49
-rw-r--r--apworld/client/assets/goal.pngbin0 -> 215 bytes
-rw-r--r--apworld/client/assets/location.pngbin0 -> 311 bytes
-rw-r--r--apworld/client/assets/worldport.pngbin0 -> 219 bytes
-rw-r--r--apworld/client/client.gd318
-rw-r--r--apworld/client/collectable.gd16
-rw-r--r--apworld/client/compass.gd66
-rw-r--r--apworld/client/compass_overlay.gd17
-rw-r--r--apworld/client/door.gd75
-rw-r--r--apworld/client/effects.gd32
-rw-r--r--apworld/client/gamedata.gd302
-rw-r--r--apworld/client/keyHolder.gd38
-rw-r--r--apworld/client/keyHolderChecker.gd24
-rw-r--r--apworld/client/keyHolderResetterListener.gd10
-rw-r--r--apworld/client/keyboard.gd228
-rw-r--r--apworld/client/locationListener.gd20
-rw-r--r--apworld/client/main.gd308
-rw-r--r--apworld/client/manager.gd717
-rw-r--r--apworld/client/maps/control_center.gd85
-rw-r--r--apworld/client/maps/daedalus.gd85
-rw-r--r--apworld/client/maps/icarus.gd38
-rw-r--r--apworld/client/maps/the_advanced.gd36
-rw-r--r--apworld/client/maps/the_charismatic.gd26
-rw-r--r--apworld/client/maps/the_crystalline.gd34
-rw-r--r--apworld/client/maps/the_entry.gd156
-rw-r--r--apworld/client/maps/the_fuzzy.gd25
-rw-r--r--apworld/client/maps/the_parthenon.gd51
-rw-r--r--apworld/client/maps/the_plaza.gd4
-rw-r--r--apworld/client/maps/the_stellar.gd30
-rw-r--r--apworld/client/maps/the_sun_temple.gd56
-rw-r--r--apworld/client/maps/the_unkempt.gd4
-rw-r--r--apworld/client/maps/the_unyielding.gd5
-rw-r--r--apworld/client/messages.gd74
-rw-r--r--apworld/client/minimap.gd178
-rw-r--r--apworld/client/painting.gd38
-rw-r--r--apworld/client/paintingAuto.gd43
-rw-r--r--apworld/client/panel.gd101
-rw-r--r--apworld/client/pauseMenu.gd91
-rw-r--r--apworld/client/player.gd181
-rw-r--r--apworld/client/rainbowText.gd10
-rw-r--r--apworld/client/run_from_apworld.tscn30
-rw-r--r--apworld/client/run_from_source.tscn22
-rw-r--r--apworld/client/saver.gd23
-rw-r--r--apworld/client/settings_screen.gd149
-rw-r--r--apworld/client/source_runtime.gd33
-rw-r--r--apworld/client/teleport.gd38
-rw-r--r--apworld/client/teleportListener.gd49
-rw-r--r--apworld/client/textclient.gd508
-rw-r--r--apworld/client/unlockReaderListener.gd46
-rw-r--r--apworld/client/vendor/LICENSE21
-rw-r--r--apworld/client/vendor/WebSocketServer.gd173
-rw-r--r--apworld/client/victoryListener.gd20
-rw-r--r--apworld/client/visibilityListener.gd38
-rw-r--r--apworld/client/worldport.gd61
-rw-r--r--apworld/client/worldportListener.gd8
-rw-r--r--apworld/context.py800
-rw-r--r--apworld/docs/en_Lingo_2.md4
-rw-r--r--apworld/items.py26
-rw-r--r--apworld/locations.py3
-rw-r--r--apworld/logo.pngbin0 -> 9429 bytes
-rw-r--r--apworld/options.py221
-rw-r--r--apworld/player_logic.py505
-rw-r--r--apworld/regions.py194
-rw-r--r--apworld/requirements.txt2
-rw-r--r--apworld/rules.py53
-rw-r--r--apworld/static_logic.py133
-rw-r--r--apworld/tracker.py147
-rw-r--r--client/archipelago.tscn153
-rw-r--r--data/MISSING PANELS.txt32
-rw-r--r--data/README.md13
-rw-r--r--data/connections.txtpb1664
-rw-r--r--data/door_groups.txtpb171
-rw-r--r--data/ids.yaml2755
-rw-r--r--data/maps/control_center/connections.txtpb85
-rw-r--r--data/maps/control_center/doors.txtpb180
-rw-r--r--data/maps/control_center/metadata.txtpb1
-rw-r--r--data/maps/control_center/rooms/Ancient Entrance.txtpb12
-rw-r--r--data/maps/control_center/rooms/Between Entrance.txtpb15
-rw-r--r--data/maps/control_center/rooms/Desert Room.txtpb8
-rw-r--r--data/maps/control_center/rooms/Entry Entrance.txtpb15
-rw-r--r--data/maps/control_center/rooms/Entry.txtpb15
-rw-r--r--data/maps/control_center/rooms/Hide Room.txtpb8
-rw-r--r--data/maps/control_center/rooms/Main Area.txtpb81
-rw-r--r--data/maps/control_center/rooms/Mint Ending.txtpb5
-rw-r--r--data/maps/control_center/rooms/Partial Entrance.txtpb15
-rw-r--r--data/maps/control_center/rooms/Perceptive Entrance.txtpb23
-rw-r--r--data/maps/control_center/rooms/Repetitive Entrance.txtpb8
-rw-r--r--data/maps/control_center/rooms/Shop Entrance.txtpb9
-rw-r--r--data/maps/control_center/rooms/Stormy Entrance.txtpb8
-rw-r--r--data/maps/control_center/rooms/Tenacious Entrance.txtpb15
-rw-r--r--data/maps/control_center/rooms/Unkempt Entrance.txtpb15
-rw-r--r--data/maps/control_center/rooms/Unyielding Entrance.txtpb15
-rw-r--r--data/maps/control_center/rooms/White Ending.txtpb5
-rw-r--r--data/maps/daedalus/connections.txtpb1876
-rw-r--r--data/maps/daedalus/doors.txtpb2473
-rw-r--r--data/maps/daedalus/metadata.txtpb23
-rw-r--r--data/maps/daedalus/rooms/After Bee Room.txtpb23
-rw-r--r--data/maps/daedalus/rooms/Amber North 2.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Bee Room Obverse.txtpb66
-rw-r--r--data/maps/daedalus/rooms/Bee Room Reverse.txtpb68
-rw-r--r--data/maps/daedalus/rooms/Beehalls Intersection.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Black Hex.txtpb52
-rw-r--r--data/maps/daedalus/rooms/Blue Hallway Cut Side.txtpb16
-rw-r--r--data/maps/daedalus/rooms/Blue Hallway Tall Side.txtpb54
-rw-r--r--data/maps/daedalus/rooms/Blue Hallway.txtpb16
-rw-r--r--data/maps/daedalus/rooms/Blue Room.txtpb80
-rw-r--r--data/maps/daedalus/rooms/Blue Smiley Annex.txtpb16
-rw-r--r--data/maps/daedalus/rooms/Blue Smiley.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Book Room.txtpb86
-rw-r--r--data/maps/daedalus/rooms/Bow Side.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Brown Smiley.txtpb9
-rw-r--r--data/maps/daedalus/rooms/C Keyholder.txtpb7
-rw-r--r--data/maps/daedalus/rooms/Castle.txtpb204
-rw-r--r--data/maps/daedalus/rooms/Coin Tower.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Composite Room NE.txtpb77
-rw-r--r--data/maps/daedalus/rooms/Composite Room NW.txtpb94
-rw-r--r--data/maps/daedalus/rooms/Composite Room S.txtpb201
-rw-r--r--data/maps/daedalus/rooms/Computer Room Seal.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Computer Room.txtpb72
-rw-r--r--data/maps/daedalus/rooms/Cyan Room.txtpb79
-rw-r--r--data/maps/daedalus/rooms/D Keyholder.txtpb7
-rw-r--r--data/maps/daedalus/rooms/D2 Room.txtpb7
-rw-r--r--data/maps/daedalus/rooms/Dark Light Exit.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Dark Light Room.txtpb79
-rw-r--r--data/maps/daedalus/rooms/Ending.txtpb6
-rw-r--r--data/maps/daedalus/rooms/Entry Shortcut.txtpb17
-rw-r--r--data/maps/daedalus/rooms/Eye Painting.txtpb13
-rw-r--r--data/maps/daedalus/rooms/Eye Temple 1F Side.txtpb14
-rw-r--r--data/maps/daedalus/rooms/Eye Temple 1F.txtpb27
-rw-r--r--data/maps/daedalus/rooms/Eye Temple 2F Side.txtpb14
-rw-r--r--data/maps/daedalus/rooms/Eye Temple 2F.txtpb18
-rw-r--r--data/maps/daedalus/rooms/Eye Temple Pillar 1.txtpb15
-rw-r--r--data/maps/daedalus/rooms/Eye Temple Pillar 2.txtpb15
-rw-r--r--data/maps/daedalus/rooms/F Keyholder.txtpb7
-rw-r--r--data/maps/daedalus/rooms/F2 Prize.txtpb7
-rw-r--r--data/maps/daedalus/rooms/F2 Room.txtpb114
-rw-r--r--data/maps/daedalus/rooms/Flip Painting Destination.txtpb8
-rw-r--r--data/maps/daedalus/rooms/Flip Painting Hidden Panel.txtpb12
-rw-r--r--data/maps/daedalus/rooms/Flip Painting.txtpb6
-rw-r--r--data/maps/daedalus/rooms/Gallery Entrance.txtpb6
-rw-r--r--data/maps/daedalus/rooms/Globe Room.txtpb54
-rw-r--r--data/maps/daedalus/rooms/Godot Room.txtpb66
-rw-r--r--data/maps/daedalus/rooms/Gray Color Backside.txtpb47
-rw-r--r--data/maps/daedalus/rooms/Gray Color Door.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Green Color Door.txtpb30
-rw-r--r--data/maps/daedalus/rooms/Green Room.txtpb83
-rw-r--r--data/maps/daedalus/rooms/Green Smiley.txtpb13
-rw-r--r--data/maps/daedalus/rooms/Hedges Tower.txtpb8
-rw-r--r--data/maps/daedalus/rooms/Hedges.txtpb74
-rw-r--r--data/maps/daedalus/rooms/Hotel.txtpb450
-rw-r--r--data/maps/daedalus/rooms/House Entrance.txtpb9
-rw-r--r--data/maps/daedalus/rooms/House.txtpb30
-rw-r--r--data/maps/daedalus/rooms/I2 Room.txtpb11
-rw-r--r--data/maps/daedalus/rooms/Intense Room.txtpb65
-rw-r--r--data/maps/daedalus/rooms/J2 Room.txtpb7
-rw-r--r--data/maps/daedalus/rooms/J2 Vestibule.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Magic Room.txtpb30
-rw-r--r--data/maps/daedalus/rooms/Maze Paintings Area.txtpb25
-rw-r--r--data/maps/daedalus/rooms/Maze.txtpb2
-rw-r--r--data/maps/daedalus/rooms/Moat.txtpb13
-rw-r--r--data/maps/daedalus/rooms/North Castle Area.txtpb36
-rw-r--r--data/maps/daedalus/rooms/Number Paintings Area.txtpb40
-rw-r--r--data/maps/daedalus/rooms/Nursery.txtpb32
-rw-r--r--data/maps/daedalus/rooms/O2 Prize.txtpb7
-rw-r--r--data/maps/daedalus/rooms/O2 Room.txtpb114
-rw-r--r--data/maps/daedalus/rooms/Orange Room Hallway.txtpb4
-rw-r--r--data/maps/daedalus/rooms/Orange Room.txtpb72
-rw-r--r--data/maps/daedalus/rooms/Outside Book Room.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Outside Eye Temple.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Outside Hedges.txtpb83
-rw-r--r--data/maps/daedalus/rooms/Outside Hotel.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Outside House.txtpb83
-rw-r--r--data/maps/daedalus/rooms/Outside Magic Room.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Outside Orange Room.txtpb60
-rw-r--r--data/maps/daedalus/rooms/Outside Pyramid.txtpb16
-rw-r--r--data/maps/daedalus/rooms/Outside Red Room.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Outside Salt Room.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Outside Snake Room.txtpb68
-rw-r--r--data/maps/daedalus/rooms/Pains Room.txtpb14
-rw-r--r--data/maps/daedalus/rooms/Pairs Room.txtpb2
-rw-r--r--data/maps/daedalus/rooms/Pepper Room.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Plum Room.txtpb53
-rw-r--r--data/maps/daedalus/rooms/Post Orange Smiley Three Way.txtpb2
-rw-r--r--data/maps/daedalus/rooms/Pumpkin Entrance.txtpb8
-rw-r--r--data/maps/daedalus/rooms/Pumpkin Room.txtpb65
-rw-r--r--data/maps/daedalus/rooms/Purple Hallway From Great.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Purple NW Vestibule.txtpb23
-rw-r--r--data/maps/daedalus/rooms/Purple Room East.txtpb2
-rw-r--r--data/maps/daedalus/rooms/Purple Room South.txtpb43
-rw-r--r--data/maps/daedalus/rooms/Purple Room West.txtpb2
-rw-r--r--data/maps/daedalus/rooms/Purple Room.txtpb59
-rw-r--r--data/maps/daedalus/rooms/Purple SE Vestibule.txtpb16
-rw-r--r--data/maps/daedalus/rooms/Purple SW Vestibule.txtpb20
-rw-r--r--data/maps/daedalus/rooms/Purple Smiley.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Pyramid 3.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Pyramid 4.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Pyramid 5.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Pyramid 6.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Pyramid 7.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Pyramid 8.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Pyramid Entry.txtpb16
-rw-r--r--data/maps/daedalus/rooms/Pyramid Second Floor.txtpb48
-rw-r--r--data/maps/daedalus/rooms/Pyramid Top.txtpb7
-rw-r--r--data/maps/daedalus/rooms/Quiet Entrance.txtpb23
-rw-r--r--data/maps/daedalus/rooms/Rain Side.txtpb17
-rw-r--r--data/maps/daedalus/rooms/Rainbow Blue.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Rainbow Color Backside.txtpb15
-rw-r--r--data/maps/daedalus/rooms/Rainbow Color Doors.txtpb94
-rw-r--r--data/maps/daedalus/rooms/Rainbow Cyan.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Rainbow End.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Rainbow Green.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Rainbow Orange.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Rainbow Purple.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Rainbow Red.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Rainbow Start.txtpb13
-rw-r--r--data/maps/daedalus/rooms/Rainbow Yellow.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Red Color Door.txtpb71
-rw-r--r--data/maps/daedalus/rooms/Red Room.txtpb79
-rw-r--r--data/maps/daedalus/rooms/Red Smiley.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Roof.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Salt Room.txtpb10
-rw-r--r--data/maps/daedalus/rooms/Seasoning Room.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Snake Room.txtpb44
-rw-r--r--data/maps/daedalus/rooms/South Castle Area.txtpb111
-rw-r--r--data/maps/daedalus/rooms/Starting Room.txtpb16
-rw-r--r--data/maps/daedalus/rooms/Sweet Foyer.txtpb65
-rw-r--r--data/maps/daedalus/rooms/Tree Entrance.txtpb55
-rw-r--r--data/maps/daedalus/rooms/U2 Prize.txtpb7
-rw-r--r--data/maps/daedalus/rooms/U2 Room.txtpb114
-rw-r--r--data/maps/daedalus/rooms/Unkempt Entrance.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Welcome Back Area.txtpb16
-rw-r--r--data/maps/daedalus/rooms/Welcome Back Exit.txtpb11
-rw-r--r--data/maps/daedalus/rooms/West Castle Area.txtpb235
-rw-r--r--data/maps/daedalus/rooms/West Spire.txtpb44
-rw-r--r--data/maps/daedalus/rooms/White Hallway From Entry.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Wisdom Panel.txtpb9
-rw-r--r--data/maps/daedalus/rooms/Wonderland.txtpb44
-rw-r--r--data/maps/daedalus/rooms/Yellow Color Backside.txtpb30
-rw-r--r--data/maps/daedalus/rooms/Yellow Color Door.txtpb37
-rw-r--r--data/maps/daedalus/rooms/Yellow Room.txtpb83
-rw-r--r--data/maps/daedalus/rooms/Yellow Smiley Annex.txtpb16
-rw-r--r--data/maps/daedalus/rooms/Z2 Prize.txtpb7
-rw-r--r--data/maps/daedalus/rooms/Z2 Room.txtpb167
-rw-r--r--data/maps/daedalus/rooms/Zoo Center.txtpb7
-rw-r--r--data/maps/daedalus/rooms/Zoo E.txtpb30
-rw-r--r--data/maps/daedalus/rooms/Zoo N.txtpb39
-rw-r--r--data/maps/daedalus/rooms/Zoo NE.txtpb39
-rw-r--r--data/maps/daedalus/rooms/Zoo S.txtpb31
-rw-r--r--data/maps/daedalus/rooms/Zoo SE.txtpb2
-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/maps/four_rooms/doors.txtpb4
-rw-r--r--data/maps/four_rooms/rooms/A2 Room.txtpb1
-rw-r--r--data/maps/four_rooms/rooms/Examples Room.txtpb5
-rw-r--r--data/maps/four_rooms/rooms/Hallway.txtpb1
-rw-r--r--data/maps/four_rooms/rooms/Intensify Room.txtpb5
-rw-r--r--data/maps/four_rooms/rooms/Keyholder Room.txtpb2
-rw-r--r--data/maps/four_rooms/rooms/Synonyms Room.txtpb5
-rw-r--r--data/maps/four_rooms/rooms/Time Room.txtpb5
-rw-r--r--data/maps/icarus/connections.txtpb766
-rw-r--r--data/maps/icarus/doors.txtpb286
-rw-r--r--data/maps/icarus/metadata.txtpb4
-rw-r--r--data/maps/icarus/rooms/Above Trans Rights.txtpb12
-rw-r--r--data/maps/icarus/rooms/Banana Belt Door.txtpb5
-rw-r--r--data/maps/icarus/rooms/Behind Welcome Spine.txtpb1
-rw-r--r--data/maps/icarus/rooms/Big U.txtpb40
-rw-r--r--data/maps/icarus/rooms/Cow Quicktravel.txtpb14
-rw-r--r--data/maps/icarus/rooms/Fatherland Quicktravel.txtpb10
-rw-r--r--data/maps/icarus/rooms/Fatherland.txtpb16
-rw-r--r--data/maps/icarus/rooms/Highest Point.txtpb19
-rw-r--r--data/maps/icarus/rooms/Mastery.txtpb5
-rw-r--r--data/maps/icarus/rooms/Maze Back.txtpb8
-rw-r--r--data/maps/icarus/rooms/Maze King Painting.txtpb8
-rw-r--r--data/maps/icarus/rooms/Maze King Panel.txtpb8
-rw-r--r--data/maps/icarus/rooms/Maze Wings Passage.txtpb9
-rw-r--r--data/maps/icarus/rooms/Maze.txtpb60
-rw-r--r--data/maps/icarus/rooms/Mediums Quicktravel.txtpb10
-rw-r--r--data/maps/icarus/rooms/Mini Icarus 2.txtpb45
-rw-r--r--data/maps/icarus/rooms/Mini Icarus 3.txtpb1
-rw-r--r--data/maps/icarus/rooms/Mini Icarus Sun Loop.txtpb22
-rw-r--r--data/maps/icarus/rooms/Mini Icarus Wings Painting.txtpb5
-rw-r--r--data/maps/icarus/rooms/Painting Maze 1.txtpb13
-rw-r--r--data/maps/icarus/rooms/Painting Maze 2.txtpb13
-rw-r--r--data/maps/icarus/rooms/Patricide Room.txtpb9
-rw-r--r--data/maps/icarus/rooms/Pillar Ramp.txtpb65
-rw-r--r--data/maps/icarus/rooms/Spiral Ramp.txtpb29
-rw-r--r--data/maps/icarus/rooms/The Orb.txtpb117
-rw-r--r--data/maps/icarus/rooms/Through Woman (Obverse).txtpb28
-rw-r--r--data/maps/icarus/rooms/Through Woman (Reverse).txtpb19
-rw-r--r--data/maps/icarus/rooms/Trans Rights Panels.txtpb22
-rw-r--r--data/maps/icarus/rooms/Trans Rights.txtpb25
-rw-r--r--data/maps/icarus/rooms/Welcome Spine (Obverse).txtpb22
-rw-r--r--data/maps/icarus/rooms/Welcome Spine (Reverse).txtpb22
-rw-r--r--data/maps/icarus/rooms/Welcome Spine Quicktravel.txtpb10
-rw-r--r--data/maps/the_advanced/connections.txtpb10
-rw-r--r--data/maps/the_advanced/doors.txtpb50
-rw-r--r--data/maps/the_advanced/metadata.txtpb4
-rw-r--r--data/maps/the_advanced/rooms/CBA.txtpb22
-rw-r--r--data/maps/the_advanced/rooms/Main Area.txtpb200
-rw-r--r--data/maps/the_advanced/rooms/Mastery.txtpb5
-rw-r--r--data/maps/the_ancient/doors.txtpb33
-rw-r--r--data/maps/the_ancient/rooms/Ending.txtpb1
-rw-r--r--data/maps/the_ancient/rooms/Inside.txtpb2
-rw-r--r--data/maps/the_ancient/rooms/Outside.txtpb2
-rw-r--r--data/maps/the_bearer/connections.txtpb10
-rw-r--r--data/maps/the_bearer/doors.txtpb21
-rw-r--r--data/maps/the_bearer/rooms/Back Area.txtpb11
-rw-r--r--data/maps/the_bearer/rooms/Blue Animal (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Blue Animal.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Blue Planet (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Blue Planet.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Blue Town (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Blue Town.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Blue Vegetable (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Blue Vegetable.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Butterfly Room.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Entry.txtpb5
-rw-r--r--data/maps/the_bearer/rooms/Green Animal.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Green Planet (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Green Planet.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Green Town.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Green Vegetable (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Green Vegetable.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Orange Planet.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Orange Vegetable.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Overlook.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Purple Animal (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Purple Animal.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Purple Planet (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Purple Planet.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Purple Town (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Purple Town.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Purple Vegetable (View).txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Purple Vegetable.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Q2 Room.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Red Animal.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Red Planet.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Red Town.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Red Vegetable.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Tree Entrance.txtpb8
-rw-r--r--data/maps/the_bearer/rooms/Yellow Planet.txtpb1
-rw-r--r--data/maps/the_bearer/rooms/Yellow Vegetable.txtpb1
-rw-r--r--data/maps/the_between/rooms/B2 Back Room.txtpb1
-rw-r--r--data/maps/the_between/rooms/B2 Front Room.txtpb1
-rw-r--r--data/maps/the_between/rooms/Control Center Side.txtpb9
-rw-r--r--data/maps/the_between/rooms/Main Area.txtpb5
-rw-r--r--data/maps/the_between/rooms/Plaza Entrance.txtpb5
-rw-r--r--data/maps/the_butterfly/doors.txtpb1
-rw-r--r--data/maps/the_butterfly/rooms/Main Area.txtpb5
-rw-r--r--data/maps/the_butterfly/rooms/Mastery.txtpb1
-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_colorful/doors.txtpb11
-rw-r--r--data/maps/the_colorful/rooms/Black Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/Blue Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/Brown Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/Cyan Hallway.txtpb9
-rw-r--r--data/maps/the_colorful/rooms/Cyan Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/Ending.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/Gray Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/Green Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/Orange Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/P2 Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/Purple Room.txtpb2
-rw-r--r--data/maps/the_colorful/rooms/Red Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/White Room.txtpb5
-rw-r--r--data/maps/the_colorful/rooms/Window Room.txtpb1
-rw-r--r--data/maps/the_colorful/rooms/Yellow Room.txtpb1
-rw-r--r--data/maps/the_congruent/doors.txtpb25
-rw-r--r--data/maps/the_congruent/metadata.txtpb4
-rw-r--r--data/maps/the_congruent/rooms/C Keyholder.txtpb2
-rw-r--r--data/maps/the_congruent/rooms/C2 Room.txtpb1
-rw-r--r--data/maps/the_congruent/rooms/Flipped Magenta Room.txtpb1
-rw-r--r--data/maps/the_congruent/rooms/Flipped Yellow Room.txtpb1
-rw-r--r--data/maps/the_congruent/rooms/G Keyholder.txtpb2
-rw-r--r--data/maps/the_congruent/rooms/G2 Room.txtpb1
-rw-r--r--data/maps/the_congruent/rooms/Main Area.txtpb5
-rw-r--r--data/maps/the_congruent/rooms/Obverse Magenta Room.txtpb1
-rw-r--r--data/maps/the_congruent/rooms/Obverse Yellow Room.txtpb1
-rw-r--r--data/maps/the_congruent/rooms/T Keyholder.txtpb2
-rw-r--r--data/maps/the_crystalline/connections.txtpb26
-rw-r--r--data/maps/the_crystalline/doors.txtpb14
-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_darkroom/connections.txtpb29
-rw-r--r--data/maps/the_darkroom/doors.txtpb12
-rw-r--r--data/maps/the_darkroom/rooms/Congruent Entrance.txtpb9
-rw-r--r--data/maps/the_darkroom/rooms/Cyan Hallway.txtpb9
-rw-r--r--data/maps/the_darkroom/rooms/Double Sided Entrance.txtpb9
-rw-r--r--data/maps/the_darkroom/rooms/First Room Exit.txtpb9
-rw-r--r--data/maps/the_darkroom/rooms/First Room.txtpb24
-rw-r--r--data/maps/the_darkroom/rooms/S Room.txtpb1
-rw-r--r--data/maps/the_darkroom/rooms/Second Room Exit.txtpb9
-rw-r--r--data/maps/the_darkroom/rooms/Second Room.txtpb18
-rw-r--r--data/maps/the_darkroom/rooms/Third Room.txtpb6
-rw-r--r--data/maps/the_digital/connections.txtpb5
-rw-r--r--data/maps/the_digital/doors.txtpb8
-rw-r--r--data/maps/the_digital/rooms/C Room.txtpb1
-rw-r--r--data/maps/the_digital/rooms/Chamber.txtpb1
-rw-r--r--data/maps/the_digital/rooms/Gallery Maze.txtpb5
-rw-r--r--data/maps/the_digital/rooms/Main Area.txtpb13
-rw-r--r--data/maps/the_digital/rooms/Tree Area.txtpb6
-rw-r--r--data/maps/the_digital/rooms/U Room.txtpb1
-rw-r--r--data/maps/the_digital/rooms/Unyielding Entrance.txtpb4
-rw-r--r--data/maps/the_door/rooms/Ending.txtpb1
-rw-r--r--data/maps/the_door/rooms/Main Area.txtpb1
-rw-r--r--data/maps/the_double_sided/doors.txtpb79
-rw-r--r--data/maps/the_double_sided/metadata.txtpb4
-rw-r--r--data/maps/the_double_sided/rooms/Brown Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Flipped Black Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Flipped Blue Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Flipped Green Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Flipped Orange Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Flipped Pink Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Flipped Purple Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Flipped Red Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Flipped Yellow Back Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Flipped Yellow Front Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Black Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Blue Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Green Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Orange Back Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Orange Front Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Orange Isolated Section.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Pink Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Purple Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Red Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Obverse Yellow Area.txtpb1
-rw-r--r--data/maps/the_double_sided/rooms/Start.txtpb5
-rw-r--r--data/maps/the_entry/connections.txtpb67
-rw-r--r--data/maps/the_entry/doors.txtpb130
-rw-r--r--data/maps/the_entry/metadata.txtpb12
-rw-r--r--data/maps/the_entry/rooms/Blue Alcove.txtpb2
-rw-r--r--data/maps/the_entry/rooms/Colored Doors Area.txtpb2
-rw-r--r--data/maps/the_entry/rooms/Composite Room Entrance.txtpb6
-rw-r--r--data/maps/the_entry/rooms/Ctrl Tutorial.txtpb2
-rw-r--r--data/maps/the_entry/rooms/D Room Final.txtpb2
-rw-r--r--data/maps/the_entry/rooms/D Room.txtpb2
-rw-r--r--data/maps/the_entry/rooms/Daedalus Entrance.txtpb6
-rw-r--r--data/maps/the_entry/rooms/Digital Entrance.txtpb6
-rw-r--r--data/maps/the_entry/rooms/Entry Exit.txtpb6
-rw-r--r--data/maps/the_entry/rooms/Eye Room.txtpb6
-rw-r--r--data/maps/the_entry/rooms/Flipped Link Area.txtpb5
-rw-r--r--data/maps/the_entry/rooms/Flipped Pyramid Area.txtpb20
-rw-r--r--data/maps/the_entry/rooms/Flipped Right Eye.txtpb2
-rw-r--r--data/maps/the_entry/rooms/Flipped Second Room.txtpb9
-rw-r--r--data/maps/the_entry/rooms/Four Rooms Entrance.txtpb9
-rw-r--r--data/maps/the_entry/rooms/Gallery Return.txtpb6
-rw-r--r--data/maps/the_entry/rooms/Least Blue Last.txtpb6
-rw-r--r--data/maps/the_entry/rooms/Liberated Entrance Panel.txtpb9
-rw-r--r--data/maps/the_entry/rooms/Liberated Entrance.txtpb8
-rw-r--r--data/maps/the_entry/rooms/Lime Room.txtpb14
-rw-r--r--data/maps/the_entry/rooms/Link Area.txtpb15
-rw-r--r--data/maps/the_entry/rooms/Literate Entrance Panel.txtpb9
-rw-r--r--data/maps/the_entry/rooms/Literate Entrance.txtpb8
-rw-r--r--data/maps/the_entry/rooms/Parthenon Return.txtpb8
-rw-r--r--data/maps/the_entry/rooms/Rabbit Hole Lock.txtpb18
-rw-r--r--data/maps/the_entry/rooms/Rabbit Hole.txtpb10
-rw-r--r--data/maps/the_entry/rooms/Red Alcove.txtpb2
-rw-r--r--data/maps/the_entry/rooms/Red Blue Halls.txtpb2
-rw-r--r--data/maps/the_entry/rooms/Repetitive Entrance.txtpb6
-rw-r--r--data/maps/the_entry/rooms/Revitalized Entrance.txtpb9
-rw-r--r--data/maps/the_entry/rooms/Right Eye.txtpb2
-rw-r--r--data/maps/the_entry/rooms/Shop Entrance.txtpb6
-rw-r--r--data/maps/the_entry/rooms/Starting Room.txtpb26
-rw-r--r--data/maps/the_entry/rooms/Trick Room.txtpb2
-rw-r--r--data/maps/the_entry/rooms/White Hallway To Daedalus.txtpb9
-rw-r--r--data/maps/the_entry/rooms/Wrath Room.txtpb18
-rw-r--r--data/maps/the_entry/rooms/X Area.txtpb6
-rw-r--r--data/maps/the_extravagant/rooms/E Room.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/Engine Room.txtpb5
-rw-r--r--data/maps/the_extravagant/rooms/Hat Chamber.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/X Minus Middle Leg.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/X Minus Right Leg.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/X Minus.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/X Plus Middle Leg.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/X Plus Right Leg.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/X Plus.txtpb2
-rw-r--r--data/maps/the_extravagant/rooms/Y Minus First Floor.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/Y Minus Second Floor.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/Y Minus Third Floor.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/Y Plus First Floor.txtpb1
-rw-r--r--data/maps/the_extravagant/rooms/Y Plus Third Floor.txtpb1
-rw-r--r--data/maps/the_fuzzy/connections.txtpb5
-rw-r--r--data/maps/the_fuzzy/doors.txtpb29
-rw-r--r--data/maps/the_fuzzy/metadata.txtpb4
-rw-r--r--data/maps/the_fuzzy/rooms/Main Area.txtpb119
-rw-r--r--data/maps/the_fuzzy/rooms/Mastery.txtpb5
-rw-r--r--data/maps/the_gallery/doors.txtpb163
-rw-r--r--data/maps/the_gallery/rooms/Back Room.txtpb1
-rw-r--r--data/maps/the_gallery/rooms/Daedalus Extension.txtpb1
-rw-r--r--data/maps/the_gallery/rooms/Ending.txtpb1
-rw-r--r--data/maps/the_gallery/rooms/Main Area.txtpb6
-rw-r--r--data/maps/the_gold/doors.txtpb7
-rw-r--r--data/maps/the_gold/rooms/The Whole Thing.txtpb1
-rw-r--r--data/maps/the_graveyard/doors.txtpb17
-rw-r--r--data/maps/the_graveyard/rooms/Inside.txtpb1
-rw-r--r--data/maps/the_graveyard/rooms/Outside.txtpb1
-rw-r--r--data/maps/the_great/connections.txtpb4
-rw-r--r--data/maps/the_great/doors.txtpb182
-rw-r--r--data/maps/the_great/rooms/Back Area.txtpb104
-rw-r--r--data/maps/the_great/rooms/Behind Question Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Colorful Entrance.txtpb6
-rw-r--r--data/maps/the_great/rooms/Daedalus Entrance.txtpb6
-rw-r--r--data/maps/the_great/rooms/East Landscape.txtpb2
-rw-r--r--data/maps/the_great/rooms/G Room.txtpb2
-rw-r--r--data/maps/the_great/rooms/Hive Entrance.txtpb6
-rw-r--r--data/maps/the_great/rooms/Jail Part 1.txtpb2
-rw-r--r--data/maps/the_great/rooms/Jail Part 2.txtpb2
-rw-r--r--data/maps/the_great/rooms/Jubilant Entrance.txtpb6
-rw-r--r--data/maps/the_great/rooms/Magnet Room.txtpb2
-rw-r--r--data/maps/the_great/rooms/Main Area.txtpb23
-rw-r--r--data/maps/the_great/rooms/Maze Center.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze Cold Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze Empty Vestibule.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze In Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze Moon Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze Off Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze Slice Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze Smooth Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze South Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze Start.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze Tower.txtpb1
-rw-r--r--data/maps/the_great/rooms/Maze Up Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Maze Wreck Area.txtpb2
-rw-r--r--data/maps/the_great/rooms/Nature Room.txtpb2
-rw-r--r--data/maps/the_great/rooms/North Landscape.txtpb8
-rw-r--r--data/maps/the_great/rooms/Outside Jail.txtpb2
-rw-r--r--data/maps/the_great/rooms/Pillar Room.txtpb2
-rw-r--r--data/maps/the_great/rooms/Purple Room.txtpb6
-rw-r--r--data/maps/the_great/rooms/Question Room How.txtpb5
-rw-r--r--data/maps/the_great/rooms/Question Room What.txtpb13
-rw-r--r--data/maps/the_great/rooms/Question Room When.txtpb5
-rw-r--r--data/maps/the_great/rooms/Question Room Who.txtpb5
-rw-r--r--data/maps/the_great/rooms/Salmon Room.txtpb6
-rw-r--r--data/maps/the_great/rooms/Talented Entrance.txtpb6
-rw-r--r--data/maps/the_great/rooms/The Landscapes.txtpb88
-rw-r--r--data/maps/the_great/rooms/Under Question Room.txtpb4
-rw-r--r--data/maps/the_great/rooms/West Side.txtpb15
-rw-r--r--data/maps/the_great/rooms/Whole Room.txtpb2
-rw-r--r--data/maps/the_great/rooms/Y Room.txtpb2
-rw-r--r--data/maps/the_great/rooms/Zero Room.txtpb2
-rw-r--r--data/maps/the_hinterlands/rooms/Main Area.txtpb9
-rw-r--r--data/maps/the_hive/doors.txtpb3
-rw-r--r--data/maps/the_hive/rooms/Main Area.txtpb18
-rw-r--r--data/maps/the_hive/rooms/Mastery Room.txtpb1
-rw-r--r--data/maps/the_hive/rooms/Room 8.txtpb1
-rw-r--r--data/maps/the_impressive/doors.txtpb17
-rw-r--r--data/maps/the_impressive/rooms/Green Eye.txtpb6
-rw-r--r--data/maps/the_impressive/rooms/Lobby.txtpb6
-rw-r--r--data/maps/the_impressive/rooms/M Room.txtpb2
-rw-r--r--data/maps/the_impressive/rooms/M2 Room.txtpb2
-rw-r--r--data/maps/the_impressive/rooms/Side Area.txtpb6
-rw-r--r--data/maps/the_impressive/rooms/W Room.txtpb2
-rw-r--r--data/maps/the_impressive/rooms/WM Room.txtpb3
-rw-r--r--data/maps/the_invisible/rooms/Entrance.txtpb5
-rw-r--r--data/maps/the_invisible/rooms/Maze.txtpb6
-rw-r--r--data/maps/the_jubilant/doors.txtpb11
-rw-r--r--data/maps/the_jubilant/metadata.txtpb4
-rw-r--r--data/maps/the_jubilant/rooms/J Room.txtpb1
-rw-r--r--data/maps/the_jubilant/rooms/Main Area.txtpb5
-rw-r--r--data/maps/the_jubilant/rooms/Side Area.txtpb2
-rw-r--r--data/maps/the_keen/metadata.txtpb4
-rw-r--r--data/maps/the_keen/rooms/K Room.txtpb1
-rw-r--r--data/maps/the_keen/rooms/Main Area.txtpb5
-rw-r--r--data/maps/the_liberated/doors.txtpb1
-rw-r--r--data/maps/the_liberated/metadata.txtpb4
-rw-r--r--data/maps/the_liberated/rooms/Painting Room.txtpb1
-rw-r--r--data/maps/the_liberated/rooms/Puzzle Room.txtpb5
-rw-r--r--data/maps/the_linear/doors.txtpb1
-rw-r--r--data/maps/the_linear/metadata.txtpb4
-rw-r--r--data/maps/the_linear/rooms/Room.txtpb5
-rw-r--r--data/maps/the_lionized/metadata.txtpb4
-rw-r--r--data/maps/the_lionized/rooms/E2 Room.txtpb1
-rw-r--r--data/maps/the_lionized/rooms/Puzzle Room.txtpb5
-rw-r--r--data/maps/the_literate/doors.txtpb1
-rw-r--r--data/maps/the_literate/metadata.txtpb4
-rw-r--r--data/maps/the_literate/rooms/Painting Room.txtpb1
-rw-r--r--data/maps/the_literate/rooms/Puzzle Room.txtpb5
-rw-r--r--data/maps/the_lively/metadata.txtpb4
-rw-r--r--data/maps/the_lively/rooms/L2 Room.txtpb1
-rw-r--r--data/maps/the_lively/rooms/Puzzle Room.txtpb4
-rw-r--r--data/maps/the_nuanced/connections.txtpb2
-rw-r--r--data/maps/the_nuanced/doors.txtpb13
-rw-r--r--data/maps/the_nuanced/metadata.txtpb4
-rw-r--r--data/maps/the_nuanced/rooms/Back Room.txtpb1
-rw-r--r--data/maps/the_nuanced/rooms/Main Room.txtpb6
-rw-r--r--data/maps/the_nuanced/rooms/N2 Room.txtpb1
-rw-r--r--data/maps/the_orb/connections.txtpb12
-rw-r--r--data/maps/the_orb/rooms/B Room.txtpb16
-rw-r--r--data/maps/the_orb/rooms/Main Area.txtpb5
-rw-r--r--data/maps/the_orb/rooms/Middle Room.txtpb12
-rw-r--r--data/maps/the_orb/rooms/O Room.txtpb1
-rw-r--r--data/maps/the_orb/rooms/R Room.txtpb1
-rw-r--r--data/maps/the_owl/connections.txtpb39
-rw-r--r--data/maps/the_owl/doors.txtpb160
-rw-r--r--data/maps/the_owl/rooms/Blue Room.txtpb1
-rw-r--r--data/maps/the_owl/rooms/Connected Area.txtpb13
-rw-r--r--data/maps/the_owl/rooms/Magenta Hallway.txtpb5
-rw-r--r--data/maps/the_owl/rooms/R1C4 Left.txtpb1
-rw-r--r--data/maps/the_owl/rooms/R2C1 Left.txtpb1
-rw-r--r--data/maps/the_owl/rooms/R2C2 Bottom.txtpb8
-rw-r--r--data/maps/the_owl/rooms/R2C2 Top.txtpb1
-rw-r--r--data/maps/the_owl/rooms/R2C3 Bottom.txtpb (renamed from data/maps/the_owl/rooms/R2C2.5 Bottom.txtpb)10
-rw-r--r--data/maps/the_owl/rooms/Z Room.txtpb1
-rw-r--r--data/maps/the_parthenon/connections.txtpb1
-rw-r--r--data/maps/the_parthenon/doors.txtpb26
-rw-r--r--data/maps/the_parthenon/rooms/Ending.txtpb1
-rw-r--r--data/maps/the_parthenon/rooms/K2 Room.txtpb1
-rw-r--r--data/maps/the_parthenon/rooms/Lavender Area.txtpb1
-rw-r--r--data/maps/the_parthenon/rooms/Main Area.txtpb25
-rw-r--r--data/maps/the_parthenon/rooms/U Keyholder.txtpb2
-rw-r--r--data/maps/the_partial/connections.txtpb2
-rw-r--r--data/maps/the_partial/doors.txtpb9
-rw-r--r--data/maps/the_partial/rooms/Control Center Entrance.txtpb5
-rw-r--r--data/maps/the_partial/rooms/F Room.txtpb1
-rw-r--r--data/maps/the_partial/rooms/Obverse Side.txtpb6
-rw-r--r--data/maps/the_partial/rooms/P Room.txtpb1
-rw-r--r--data/maps/the_partial/rooms/Reverse Side.txtpb1
-rw-r--r--data/maps/the_perceptive/metadata.txtpb4
-rw-r--r--data/maps/the_perceptive/rooms/Main Area.txtpb5
-rw-r--r--data/maps/the_plaza/connections.txtpb8
-rw-r--r--data/maps/the_plaza/doors.txtpb45
-rw-r--r--data/maps/the_plaza/rooms/Bottom Left Room.txtpb1
-rw-r--r--data/maps/the_plaza/rooms/Bottom Right Room.txtpb1
-rw-r--r--data/maps/the_plaza/rooms/Center Room.txtpb1
-rw-r--r--data/maps/the_plaza/rooms/Main Area.txtpb13
-rw-r--r--data/maps/the_plaza/rooms/Mastery.txtpb1
-rw-r--r--data/maps/the_plaza/rooms/Repetitive Entrance.txtpb5
-rw-r--r--data/maps/the_plaza/rooms/Sirenic Entrance.txtpb5
-rw-r--r--data/maps/the_plaza/rooms/Symbolic Entrance.txtpb5
-rw-r--r--data/maps/the_plaza/rooms/Top Left Room.txtpb3
-rw-r--r--data/maps/the_plaza/rooms/Top Right Room.txtpb3
-rw-r--r--data/maps/the_quiet/metadata.txtpb4
-rw-r--r--data/maps/the_quiet/rooms/Keyholder Room.txtpb2
-rw-r--r--data/maps/the_quiet/rooms/Main Area.txtpb5
-rw-r--r--data/maps/the_quiet/rooms/Q Room.txtpb1
-rw-r--r--data/maps/the_relentless/doors.txtpb32
-rw-r--r--data/maps/the_relentless/rooms/All.txtpb1
-rw-r--r--data/maps/the_relentless/rooms/Left And Turn.txtpb1
-rw-r--r--data/maps/the_relentless/rooms/Left Room.txtpb1
-rw-r--r--data/maps/the_relentless/rooms/Mastery.txtpb1
-rw-r--r--data/maps/the_relentless/rooms/Shop Room.txtpb1
-rw-r--r--data/maps/the_relentless/rooms/Turn And Shop.txtpb1
-rw-r--r--data/maps/the_relentless/rooms/Turn Room.txtpb1
-rw-r--r--data/maps/the_repetitive/connections.txtpb4
-rw-r--r--data/maps/the_repetitive/doors.txtpb51
-rw-r--r--data/maps/the_repetitive/metadata.txtpb4
-rw-r--r--data/maps/the_repetitive/rooms/Anti Room.txtpb12
-rw-r--r--data/maps/the_repetitive/rooms/Cyan Room.txtpb1
-rw-r--r--data/maps/the_repetitive/rooms/Dot Area.txtpb3
-rw-r--r--data/maps/the_repetitive/rooms/Entry Connector.txtpb5
-rw-r--r--data/maps/the_repetitive/rooms/Lime Room.txtpb1
-rw-r--r--data/maps/the_repetitive/rooms/Magenta Room.txtpb1
-rw-r--r--data/maps/the_repetitive/rooms/Main Room.txtpb5
-rw-r--r--data/maps/the_repetitive/rooms/Mastery Room.txtpb1
-rw-r--r--data/maps/the_repetitive/rooms/Plaza Connector.txtpb5
-rw-r--r--data/maps/the_repetitive/rooms/Yellow Room.txtpb1
-rw-r--r--data/maps/the_revitalized/rooms/Bye Room.txtpb5
-rw-r--r--data/maps/the_revitalized/rooms/Hidden Room.txtpb1
-rw-r--r--data/maps/the_revitalized/rooms/Hide Room.txtpb1
-rw-r--r--data/maps/the_revitalized/rooms/High Room.txtpb1
-rw-r--r--data/maps/the_revitalized/rooms/Return Room.txtpb1
-rw-r--r--data/maps/the_revitalized/rooms/Too Room.txtpb1
-rw-r--r--data/maps/the_revitalized/rooms/Won Room.txtpb1
-rw-r--r--data/maps/the_shop/doors.txtpb3
-rw-r--r--data/maps/the_shop/rooms/Main Area.txtpb5
-rw-r--r--data/maps/the_sirenic/metadata.txtpb4
-rw-r--r--data/maps/the_sirenic/rooms/Mastery.txtpb1
-rw-r--r--data/maps/the_sirenic/rooms/Puzzles.txtpb1
-rw-r--r--data/maps/the_sirenic/rooms/Start.txtpb5
-rw-r--r--data/maps/the_stellar/connections.txtpb70
-rw-r--r--data/maps/the_stellar/doors.txtpb104
-rw-r--r--data/maps/the_stellar/metadata.txtpb6
-rw-r--r--data/maps/the_stellar/rooms/Blue Panel.txtpb8
-rw-r--r--data/maps/the_stellar/rooms/Connected Area.txtpb63
-rw-r--r--data/maps/the_stellar/rooms/Green Area.txtpb8
-rw-r--r--data/maps/the_stellar/rooms/Green Panel.txtpb8
-rw-r--r--data/maps/the_stellar/rooms/Hi Room.txtpb8
-rw-r--r--data/maps/the_stellar/rooms/Mastery.txtpb5
-rw-r--r--data/maps/the_stellar/rooms/Old Crossroads.txtpb8
-rw-r--r--data/maps/the_stellar/rooms/Orange Panel.txtpb8
-rw-r--r--data/maps/the_stellar/rooms/Purple Panel.txtpb8
-rw-r--r--data/maps/the_stellar/rooms/Red Panel.txtpb8
-rw-r--r--data/maps/the_stellar/rooms/Starting Room.txtpb15
-rw-r--r--data/maps/the_stellar/rooms/Yellow Panel.txtpb8
-rw-r--r--data/maps/the_stormy/rooms/Center.txtpb7
-rw-r--r--data/maps/the_stormy/rooms/Nuclear Side.txtpb1
-rw-r--r--data/maps/the_stormy/rooms/Nuclear Vestibule.txtpb1
-rw-r--r--data/maps/the_stormy/rooms/Rain Side.txtpb3
-rw-r--r--data/maps/the_stormy/rooms/Tornado Side.txtpb1
-rw-r--r--data/maps/the_stormy/rooms/Tornado Vestibule.txtpb1
-rw-r--r--data/maps/the_stormy/rooms/Volcano Side.txtpb1
-rw-r--r--data/maps/the_stormy/rooms/X2 Room.txtpb1
-rw-r--r--data/maps/the_sturdy/connections.txtpb5
-rw-r--r--data/maps/the_sturdy/doors.txtpb6
-rw-r--r--data/maps/the_sturdy/metadata.txtpb8
-rw-r--r--data/maps/the_sturdy/rooms/Hidden Rainbow.txtpb6
-rw-r--r--data/maps/the_sturdy/rooms/Main Area.txtpb23
-rw-r--r--data/maps/the_sturdy/rooms/S2 Area.txtpb5
-rw-r--r--data/maps/the_sun_temple/connections.txtpb1
-rw-r--r--data/maps/the_sun_temple/metadata.txtpb4
-rw-r--r--data/maps/the_sun_temple/rooms/Ending.txtpb1
-rw-r--r--data/maps/the_sun_temple/rooms/Entrance.txtpb6
-rw-r--r--data/maps/the_sun_temple/rooms/Mastery.txtpb1
-rw-r--r--data/maps/the_sun_temple/rooms/Temple.txtpb15
-rw-r--r--data/maps/the_sweet/rooms/Main Area.txtpb7
-rw-r--r--data/maps/the_sweet/rooms/Y2 Room.txtpb1
-rw-r--r--data/maps/the_symbolic/connections.txtpb110
-rw-r--r--data/maps/the_symbolic/doors.txtpb392
-rw-r--r--data/maps/the_symbolic/metadata.txtpb5
-rw-r--r--data/maps/the_symbolic/rooms/Black Room.txtpb8
-rw-r--r--data/maps/the_symbolic/rooms/Blue Room.txtpb8
-rw-r--r--data/maps/the_symbolic/rooms/Green Room.txtpb8
-rw-r--r--data/maps/the_symbolic/rooms/Last Room.txtpb30
-rw-r--r--data/maps/the_symbolic/rooms/Main Area.txtpb542
-rw-r--r--data/maps/the_symbolic/rooms/Mastery.txtpb5
-rw-r--r--data/maps/the_symbolic/rooms/Orange Room.txtpb8
-rw-r--r--data/maps/the_symbolic/rooms/Poetry Room 1.txtpb19
-rw-r--r--data/maps/the_symbolic/rooms/Poetry Room 2.txtpb21
-rw-r--r--data/maps/the_symbolic/rooms/Poetry Room 3.txtpb23
-rw-r--r--data/maps/the_symbolic/rooms/Poetry Room Left Left.txtpb27
-rw-r--r--data/maps/the_symbolic/rooms/Poetry Room Left Right.txtpb27
-rw-r--r--data/maps/the_symbolic/rooms/Poetry Room Left.txtpb23
-rw-r--r--data/maps/the_symbolic/rooms/Poetry Room Right Left.txtpb27
-rw-r--r--data/maps/the_symbolic/rooms/Poetry Room Right Right.txtpb27
-rw-r--r--data/maps/the_symbolic/rooms/Poetry Room Right.txtpb23
-rw-r--r--data/maps/the_symbolic/rooms/Purple Room.txtpb8
-rw-r--r--data/maps/the_symbolic/rooms/Red Blue Room.txtpb20
-rw-r--r--data/maps/the_symbolic/rooms/Red Room.txtpb8
-rw-r--r--data/maps/the_symbolic/rooms/Tutorial.txtpb62
-rw-r--r--data/maps/the_symbolic/rooms/Whirred Room.txtpb40
-rw-r--r--data/maps/the_symbolic/rooms/White Room.txtpb14
-rw-r--r--data/maps/the_symbolic/rooms/Yellow Room.txtpb8
-rw-r--r--data/maps/the_talented/connections.txtpb10
-rw-r--r--data/maps/the_talented/doors.txtpb61
-rw-r--r--data/maps/the_talented/metadata.txtpb5
-rw-r--r--data/maps/the_talented/rooms/Back Room.txtpb50
-rw-r--r--data/maps/the_talented/rooms/Main Area.txtpb118
-rw-r--r--data/maps/the_talented/rooms/T2 Room.txtpb6
-rw-r--r--data/maps/the_tenacious/connections.txtpb35
-rw-r--r--data/maps/the_tenacious/doors.txtpb41
-rw-r--r--data/maps/the_tenacious/metadata.txtpb1
-rw-r--r--data/maps/the_tenacious/rooms/Color Room.txtpb7
-rw-r--r--data/maps/the_tenacious/rooms/Control Center Entrance.txtpb15
-rw-r--r--data/maps/the_tenacious/rooms/Main Area.txtpb6
-rw-r--r--data/maps/the_tenacious/rooms/Mastery.txtpb5
-rw-r--r--data/maps/the_tenacious/rooms/Paintings Room.txtpb10
-rw-r--r--data/maps/the_tenacious/rooms/Tower Room.txtpb7
-rw-r--r--data/maps/the_tenacious/rooms/Wisdom Room.txtpb7
-rw-r--r--data/maps/the_three_doors/connections.txtpb150
-rw-r--r--data/maps/the_three_doors/doors.txtpb54
-rw-r--r--data/maps/the_three_doors/metadata.txtpb1
-rw-r--r--data/maps/the_three_doors/rooms/Dead End Room.txtpb43
-rw-r--r--data/maps/the_three_doors/rooms/First Second Room.txtpb43
-rw-r--r--data/maps/the_three_doors/rooms/Loose Strings Room.txtpb22
-rw-r--r--data/maps/the_three_doors/rooms/One Luck Room.txtpb22
-rw-r--r--data/maps/the_three_doors/rooms/Silver Portal Room.txtpb41
-rw-r--r--data/maps/the_tower/connections.txtpb10
-rw-r--r--data/maps/the_tower/doors.txtpb181
-rw-r--r--data/maps/the_tower/metadata.txtpb5
-rw-r--r--data/maps/the_tower/rooms/Ending.txtpb5
-rw-r--r--data/maps/the_tower/rooms/First Floor.txtpb104
-rw-r--r--data/maps/the_tower/rooms/Tower.txtpb409
-rw-r--r--data/maps/the_tree/connections.txtpb5
-rw-r--r--data/maps/the_tree/doors.txtpb43
-rw-r--r--data/maps/the_tree/metadata.txtpb1
-rw-r--r--data/maps/the_tree/rooms/Bearer Entrance.txtpb8
-rw-r--r--data/maps/the_tree/rooms/Main Area.txtpb253
-rw-r--r--data/maps/the_unkempt/connections.txtpb60
-rw-r--r--data/maps/the_unkempt/doors.txtpb203
-rw-r--r--data/maps/the_unkempt/metadata.txtpb1
-rw-r--r--data/maps/the_unkempt/rooms/Control Center Entrance.txtpb15
-rw-r--r--data/maps/the_unkempt/rooms/Daedalus Entrance.txtpb8
-rw-r--r--data/maps/the_unkempt/rooms/Exit Room 2.txtpb29
-rw-r--r--data/maps/the_unkempt/rooms/Exit Room 3.txtpb8
-rw-r--r--data/maps/the_unkempt/rooms/Main Area.txtpb238
-rw-r--r--data/maps/the_unkempt/rooms/Middle Room.txtpb29
-rw-r--r--data/maps/the_unkempt/rooms/Right Area.txtpb162
-rw-r--r--data/maps/the_unkempt/rooms/Unsymmetry Room.txtpb99
-rw-r--r--data/maps/the_unkempt/rooms/V Keyholder.txtpb6
-rw-r--r--data/maps/the_unkempt/rooms/V1 Room.txtpb5
-rw-r--r--data/maps/the_unkempt/rooms/W Keyholder.txtpb6
-rw-r--r--data/maps/the_unkempt/rooms/W2 Room.txtpb6
-rw-r--r--data/maps/the_unyielding/connections.txtpb5
-rw-r--r--data/maps/the_unyielding/doors.txtpb73
-rw-r--r--data/maps/the_unyielding/rooms/Bearer Entrance.txtpb3
-rw-r--r--data/maps/the_unyielding/rooms/Digital Entrance.txtpb3
-rw-r--r--data/maps/the_unyielding/rooms/Nuanced Entrance.txtpb3
-rw-r--r--data/maps/the_unyielding/rooms/Plaza Entrance.txtpb3
-rw-r--r--data/maps/the_unyielding/rooms/Yellow Left.txtpb1
-rw-r--r--data/maps/the_unyielding/rooms/Yellow Right.txtpb1
-rw-r--r--data/maps/the_wise/connections.txtpb10
-rw-r--r--data/maps/the_wise/doors.txtpb36
-rw-r--r--data/maps/the_wise/metadata.txtpb3
-rw-r--r--data/maps/the_wise/rooms/Entry.txtpb12
-rw-r--r--data/maps/the_wise/rooms/Mastery.txtpb5
-rw-r--r--data/maps/the_wise/rooms/Puzzles.txtpb151
-rw-r--r--data/maps/the_wondrous/connections.txtpb10
-rw-r--r--data/maps/the_wondrous/doors.txtpb24
-rw-r--r--data/maps/the_wondrous/metadata.txtpb5
-rw-r--r--data/maps/the_wondrous/rooms/Entry.txtpb14
-rw-r--r--data/maps/the_wondrous/rooms/Huge.txtpb57
-rw-r--r--data/maps/the_wondrous/rooms/Regular.txtpb8
-rw-r--r--data/maps/the_words/connections.txtpb5
-rw-r--r--data/maps/the_words/doors.txtpb12
-rw-r--r--data/maps/the_words/metadata.txtpb11
-rw-r--r--data/maps/the_words/rooms/Ending.txtpb5
-rw-r--r--data/maps/the_words/rooms/Main Area.txtpb64
-rw-r--r--data/metadata.txtpb56
-rw-r--r--data/progressives.txtpb24
-rw-r--r--proto/data.proto95
-rw-r--r--proto/human.proto98
-rw-r--r--tools/assign_ids/main.cpp230
-rw-r--r--tools/datapacker/container.cpp38
-rw-r--r--tools/datapacker/container.h6
-rw-r--r--tools/datapacker/main.cpp163
-rw-r--r--tools/util/godot_scene.cpp6
-rw-r--r--tools/util/ids_yaml_format.cpp52
-rw-r--r--tools/validator/CMakeLists.txt3
-rw-r--r--tools/validator/human_processor.cpp204
-rw-r--r--tools/validator/structs.h37
-rw-r--r--tools/validator/validator.cpp690
-rw-r--r--tools/validator/validator.h2
-rw-r--r--vcpkg.json3
-rw-r--r--vendor/godobuf/LICENSE29
-rw-r--r--vendor/godobuf/README4
-rw-r--r--vendor/godobuf/addons/protobuf/parser.gd2254
-rw-r--r--vendor/godobuf/addons/protobuf/plugin.cfg7
-rw-r--r--vendor/godobuf/addons/protobuf/protobuf_cmdln.gd66
-rw-r--r--vendor/godobuf/addons/protobuf/protobuf_core.gd668
-rw-r--r--vendor/godobuf/addons/protobuf/protobuf_util.gd46
-rw-r--r--vendor/godobuf/default_env.tres7
-rw-r--r--vendor/godobuf/logo.pngbin0 -> 19026 bytes
-rw-r--r--vendor/godobuf/logo.png.import35
-rw-r--r--vendor/godobuf/project.godot26
862 files changed, 37293 insertions, 1315 deletions
diff --git a/.gitignore b/.gitignore index b30b031..05901b2 100644 --- a/.gitignore +++ b/.gitignore
@@ -5,3 +5,4 @@ apworld/generated/
5__pycache__ 5__pycache__
6.vs/ 6.vs/
7^out/ 7^out/
8client/Archipelago/generated/
diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..723befc --- /dev/null +++ b/CHANGELOG.md
@@ -0,0 +1,354 @@
1# lingo2-archipelago Releases
2
3## v8.0.3 - 2025-12-18
4
5- Fixed the "Set changed during iteration" error some users were experiencing.
6- Fixed issue where generation would try to create anti-number traps when The
7 Fuzzy was enabled.
8- Using the key return now acts like interacting with a keyholder, and should
9 force-update your keyboard in case it gets out of sync.
10
11Compatibility notes:
12
13- This client should be completely compatible with worlds generated on v8.0.2.
14- See the v8.0.2 release notes for additional compatibility notes regarding
15 earlier versions.
16
17Download:
18[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.3/lingo2.apworld)<br/>
19Template YAML:
20[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.3/Lingo%202.yaml)<br/>
21Source: [v8.0.3](https://code.fourisland.com/lingo2-archipelago/tag/?h=v8.0.3)
22
23## v8.0.2 - 2025-11-11
24
25- Fixed a logic issue in The Symbolic where Poetry Room and Whirred Room were
26 not part of the requirements to access the mastery.
27- Fixed the issue where the Poetry Room location would be sent early.
28- The Daedalus Hedges Tower door is now latched (it will stay open after being
29 opened once).
30
31Compatibility notes:
32
33- This client should overall be compatible with worlds generated on v8.0.0 and
34 v8.0.1. The tracker will now correctly show when The Symbolic - Mastery is
35 possible to get in-game. However, this does not match the generator's logic in
36 earlier versions of the apworld, so you may end up in a position where you are
37 blocked because the mastery is impossible to get. Playing on another version
38 of the client will not fix this problem, nor is there an easy way to get the
39 mastery out-of-logic, and you may need to use server commands to send the
40 location early.
41- See the v8.0.1 release notes for additional compatibility notes regarding
42 earlier versions.
43
44Download:
45[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.2/lingo2.apworld)<br/>
46Template YAML:
47[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.2/Lingo%202.yaml)<br/>
48Source: [v8.0.2](https://code.fourisland.com/lingo2-archipelago/tag/?h=v8.0.2)
49
50## v8.0.1 - 2025-11-05
51
52- Fixed issue where The Unkempt - COLOR would disappear when it became logical
53 to solve it. It is now always present, and does not logically require cyan
54 doors or the orange control center door.
55- Fixed issue where you would be expected to solve The Owl - COLOR while it is
56 invisible. It is now considered a cyan door.
57
58Compatibility notes:
59
60- This client should overall be compatible with worlds generated on v8.0.0. The
61 tracker will show the new logic for The Unkempt - COLOR, which reflects when
62 it is solvable in game, but may place it in an earlier sphere than it was in
63 the original generation. Conversely, The Owl - COLOR is now more restricted in
64 the new logic, so you may end up in a situation where you are required to
65 solve it but the tracker does not realize it is in logic. However, the panel
66 is simply invisible when you don't have cyan doors, meaning it is easy to
67 solve it early if necessary.
68
69Download:
70[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.1/lingo2.apworld)<br/>
71Template YAML:
72[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.1/Lingo%202.yaml)<br/>
73Source: [v8.0.1](https://code.fourisland.com/lingo2-archipelago/tag/?h=v8.0.1)
74
75## v8.0.0 - 2025-11-02
76
77- ~50 new locations were added, such that almost every panel in the game is now
78 part of either a location or a connection. Some existing locations were also
79 modified or removed to make this cleaner. The only panels that are not part of
80 any location or connection are the ones in rooms that you are explicitly not
81 supposed to solve (e.g. the letter rooms in Daedalus where you are only
82 supposed to solve the panels indicated by the ceiling).
83- Multiworld state is now saved in a way that should increase compatibility when
84 playing on a client that is a different version than the apworld that
85 generated the world, going forward. Complete compatibility is not guaranteed,
86 but this fixes some of the glaring issues. Also note that this client is _not_
87 compatible with worlds generated on v7.x.x.
88- Hinted locations are now prioritized in the tracker, and are displayed in a
89 different color.
90- Locations can now be ignored in the tracker, which removes them from the
91 overlay and puts them at the bottom of the tab in the text client.
92- Fixed the Yellow Ending door not opening properly when gallery paintings are
93 shuffled.
94- The trigger for the gallery painting in The Unyielding is now smaller, so that
95 it matches the logical requirement.
96- The DIRECTION panels near the Castle in Daedalus are now moved when the roof
97 access stairs are present, so that you don't lose access to them.
98
99Download:
100[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.0/lingo2.apworld)<br/>
101Template YAML:
102[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v8.0.0/Lingo%202.yaml)<br/>
103Source: [v8.0.0](https://code.fourisland.com/lingo2-archipelago/tag/?h=v8.0.0)
104
105## v7.2.0 - 2025-10-25
106
107- Doors that rely on keyholders or the control center color panel are now
108 "latched". This means they will not close once they've been opened. Because of
109 this, the worldports near these doors are now eligible for randomization in
110 worldport shuffle.
111- Icarus is now optionally randomizable.
112- The requirements for accessing White Ending are now customizable. You can
113 choose to require a number of endings as well as a number of masteries.
114- The "Return To" trigger in The Plaza is now outside of the turtle.
115- Fixed a logic error regarding a couple of specific doors in vanilla doors
116 mode.
117- Fixed a bug where unlocks would not persist if you were playing with all
118 letters pre-unlocked and cyan doors on "any double letter".
119- Fixed a bug where the client would fail to connect properly when launched from
120 a URL if the player name had spaces in it.
121
122Download:
123[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.2.0/lingo2.apworld)<br/>
124Template YAML:
125[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.2.0/Lingo%202.yaml)<br/>
126Source: [v7.2.0](https://code.fourisland.com/lingo2-archipelago/tag/?h=v7.2.0)
127
128## v7.1.0 - 2025-10-07
129
130- Added a "Get Path" button to the locations tracker. This shows you the path
131 you're currently expected to be able to take in order to reach that
132 location/worldport/goal.
133- Worldport names in the spoiler log have been changed to be more descriptive.
134- Jumping into The Graveyard from The Sun Temple is now in logic.
135- Solving the FLIP panels above the Liberated and Literate entrances by looking
136 up is now in logic.
137- Renamed some locations so that they're shorter.
138- Fixed bug where White Ending would kick the player out of Archipelago.
139- Fixed bug where the minimap would be completely white when a texture pack is
140 enabled.
141- Generation failures while shuffling worldports should be significantly less
142 common.
143
144Download:
145[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.1.0/lingo2.apworld)<br/>
146Template YAML:
147[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.1.0/Lingo%202.yaml)<br/>
148Source: [v7.1.0](https://code.fourisland.com/lingo2-archipelago/tag/?h=v7.1.0)
149
150## v7.0.2 - 2025-10-03
151
152- Fixed issue connecting to password-protected slots.
153- Added instructions for using the client on Linux.
154
155Download:
156[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.0.2/lingo2.apworld)<br/>
157Template YAML:
158[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.0.2/Lingo%202.yaml)<br/>
159Source: [v7.0.2](https://code.fourisland.com/lingo2-archipelago/tag/?h=v7.0.2)
160
161## v7.0.1 - 2025-10-01
162
163- Fixed logic error regarding the Plaza Entrance in The Repetitive. Going from
164 The Plaza to The Repetitive does not require the door to be open in vanilla
165 doors, but both directions require the door item when doors are shuffled.
166- Fixed Worldports tracker tab getting messed up after disconnecting and
167 reconnecting to multiworld.
168- Improved error messages when failing to connect. The game now also shows you
169 when your connection has dropped.
170
171Download:
172[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.0.1/lingo2.apworld)<br/>
173Template YAML:
174[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.0.1/Lingo%202.yaml)<br/>
175Source: [v7.0.1](https://code.fourisland.com/lingo2-archipelago/tag/?h=v7.0.1)
176
177## v7.0.0 - 2025-09-30
178
179- Major update! First and foremost: the client and apworld are no longer
180 separate! There is only an apworld now, which you install into your
181 Archipelago custom worlds folder as per normal. In order to play a randomized
182 world, you open the Archipelago Launcher and click Lingo 2 Client. The first
183 time you do this, it will ask you for the location of your Lingo2.exe, which
184 you can find by right clicking on the game in Steam and clicking Browse Local
185 Files.
186- **Built-in tracker**: The in-game text client has a new tab called "Locations"
187 which lists the currently accessible locations similar to how Universal
188 Tracker does it. There is also an optional overlay you can enable in the
189 settings, which shows you some of your accessible locations on screen while
190 you're playing. If you're playing with vanilla letters, the tracker won't show
191 you locations that are solvable with letters until you collect the actual
192 letters, in order to help direct you better. More features will be coming to
193 the tracker in the future!
194- **Worldport shuffle**: The first part of entrance randomization is here!
195 Enabling this shuffles the destinations of the worldports, which are the
196 loading zones you walk into in order to change maps. Some restrictions apply,
197 which are noted in the option description. The tracker will show a list of
198 worldports you haven't entered yet, and will also not show you what lies
199 beyond a worldport until you've entered it. There is also a tab in the
200 textclient showing you the mapping between worldports you've already entered.
201- **Minimap**: There is an option in the settings to show a minimap in the
202 corner of the screen. This shows an overhead view of the map you're on, and
203 where you are in it. More features will be coming to the minimap in the
204 future!
205- Fixed the gate outside the Daedalus entrance in The Great not opening when
206 control center colors are shuffled.
207
208Download:
209[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.0.0/lingo2.apworld)<br/>
210Template YAML:
211[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.0.0/Lingo%202.yaml)<br/>
212Source: [v7.0.0](https://code.fourisland.com/lingo2-archipelago/tag/?h=v7.0.0)
213
214## Legacy Client v6.7 - 2025-09-19
215
216- Added a compass overlay. This makes it clearer which direction corresponds to
217 which compass direction, which is useful since many location/item names
218 reference compass directions. It can be enabled in the settings screen on the
219 pause menu.
220- Compatability update for the changes in v6.6 of the apworld.
221
222Download:
223[lingo2-archipelago-client-v6.7.zip](https://files.fourisland.com/releases/lingo2-archipelago/client/lingo2-archipelago-client-v6.7.zip)<br/>
224Source:
225[v6.7](https://code.fourisland.com/lingo2-archipelago/tag/?h=client-v6.7)
226
227## Legacy Apworld v6.6 - 2025-09-19
228
229- Added options that make the requirements for Purple Ending and Cyan Ending
230 stricter. With the strict options on, players are required to have all purple
231 (level 1) letters in order to get Purple Ending, and all cyan (level 2)
232 letters to get Cyan Ending. These options are on by default.
233- Renamed several items and locations, mostly regarding changing relative
234 directions (left, right, etc) to compass directions. The colored SMILE panels
235 in Daedalus now have clearer names too.
236- Fixed some minor logic errors.
237
238Download:
239[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v6.6/lingo2.apworld)<br/>
240Template YAML:
241[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v6.6/Lingo%202.yaml)<br/>
242Source:
243[v6.6](https://code.fourisland.com/lingo2-archipelago/tag/?h=apworld-v6.6)
244
245## Legacy Client v5.6 - 2025-09-17
246
247- Letter locations will no longer reappear after being collected.
248- This also prevents a potential scenario in which it is impossible to access
249 the location "The Congruent - Obverse Yellow Puzzles" when door shuffle is
250 disabled.
251
252Download:
253[lingo2-archipelago-client-v5.6.zip](https://files.fourisland.com/releases/lingo2-archipelago/client/lingo2-archipelago-client-v5.6.zip)<br/>
254Source:
255[v5.6](https://code.fourisland.com/lingo2-archipelago/tag/?h=client-v5.6)
256
257## Legacy Client v5.5 - 2025-09-16
258
259- Compatability update for v5.5 of the apworld.
260
261Download:
262[lingo2-archipelago-client-v5.5.zip](https://files.fourisland.com/releases/lingo2-archipelago/client/lingo2-archipelago-client-v5.5.zip)<br/>
263Source:
264[v5.5](https://code.fourisland.com/lingo2-archipelago/tag/?h=client-v5.5)
265
266## Legacy Apworld v5.5 - 2025-09-16
267
268- Fixed a panel in The Ancient that was missing a symbol.
269- Fixed an issue where you could be expected to get S1 in The Darkroom without
270 having U.
271- Renamed a few locations.
272
273Download:
274[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v5.5/lingo2.apworld)<br/>
275Template YAML:
276[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v5.5/Lingo%202.yaml)<br/>
277Source:
278[v5.5](https://code.fourisland.com/lingo2-archipelago/tag/?h=apworld-v5.5)
279
280## Legacy Apworld v4.4 - 2025-09-14
281
282- Fixed panel set location names.
283
284Download:
285[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v4.4/lingo2.apworld)<br/>
286Template YAML:
287[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v4.4/Lingo%202.yaml)<br/>
288Source:
289[v4.4](https://code.fourisland.com/lingo2-archipelago/tag/?h=apworld-v4.4)
290
291## Legacy Client v4.4 - 2025-09-13
292
293- Added support for anti-collectable trap items.
294- Fixed entrance to The Jubilant not opening properly when using control center
295 color shuffle.
296- Fixed the location "The Entry (Colored Doors Area) - OPEN" not sending.
297- Fixed level 2 letters not activating properly when letter shuffle is set to
298 Item Cyan.
299- Messages are now cleared out when returning to the main menu.
300- The player is prevented from accidentally breaking roof access logic when
301 returning to Daedalus from Icarus.
302
303Download:
304[lingo2-archipelago-client-v4.4.zip](https://files.fourisland.com/releases/lingo2-archipelago/client/lingo2-archipelago-client-v4.4.zip)<br/>
305Source:
306[v4.4](https://code.fourisland.com/lingo2-archipelago/tag/?h=client-v4.4)
307
308## Legacy Apworld v4.3 - 2025-09-13
309
310- Added a location for the anti-collectable in The Repetitive.
311- Added trap items. These remove letters from your keyboard until you use the
312 Key Return in The Entry, similar to the anti-collectable in The Repetitive.
313 This can be controlled using the `trap_percentage` option, which defaults to
314 zero.
315- Fixed crash on load when using Python 3.11.
316
317Download:
318[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v4.3/lingo2.apworld)<br/>
319Template YAML:
320[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v4.3/Lingo%202.yaml)<br/>
321Source:
322[v4.3](https://code.fourisland.com/lingo2-archipelago/tag/?h=apworld-v4.3)
323
324## Legacy Client v3.3 - 2025-09-12
325
326- Fixed issue downloading large datapackages (such as TUNIC's).
327- Connection failures now show error messages.
328
329Download:
330[lingo2-archipelago-client-v3.3.zip](https://files.fourisland.com/releases/lingo2-archipelago/client/lingo2-archipelago-client-v3.3.zip)<br/>
331Source:
332[v3.3](https://code.fourisland.com/lingo2-archipelago/tag/?h=client-v3.3)
333
334## Legacy Client v3.2 - 2025-09-12
335
336- Initial release for testing. Features include door shuffle, letter shuffle,
337 and symbol shuffle.
338
339Download:
340[lingo2-archipelago-client-v3.2.zip](https://files.fourisland.com/releases/lingo2-archipelago/client/lingo2-archipelago-client-v3.2.zip)<br/>
341Source:
342[v3.2](https://code.fourisland.com/lingo2-archipelago/tag/?h=client-v3.2)
343
344## Legacy Apworld v3.2 - 2025-09-12
345
346- Initial release for testing. Features include door shuffle, letter shuffle,
347 and symbol shuffle.
348
349Download:
350[lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v3.2/lingo2.apworld)<br/>
351Template YAML:
352[Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v3.2/Lingo%202.yaml)<br/>
353Source:
354[v3.2](https://code.fourisland.com/lingo2-archipelago/tag/?h=apworld-v3.2)
diff --git a/README.md b/README.md new file mode 100644 index 0000000..24e9fa2 --- /dev/null +++ b/README.md
@@ -0,0 +1,284 @@
1# lingo2-archipelago
2
3[Archipelago](https://archipelago.gg/) is an open-source project that supports
4randomizing a number of different games and combining them into one cooperative
5experience. Items from each game are hidden in other games. For more information
6about Archipelago, you can look at their website.
7
8This is a project that modifies the game
9[Lingo 2](https://www.lingothegame.com/lingo2.html) so that it can be played as
10part of an Archipelago multiworld game.
11
12## Installation
13
141. Download the Lingo 2 Apworld from
15 [the releases page](https://code.fourisland.com/lingo2-archipelago/about/CHANGELOG.md).
162. If you do not already have it, download and install the
17 [Archipelago software](https://github.com/ArchipelagoMW/Archipelago/releases/).
183. Double click on `lingo2.apworld` to install it, or copy it manually to the
19 `custom_worlds` folder of your Archipelago installation.
20
21## Joining a Multiworld game (Windows)
22
231. Open the Archipelago Launcher.
242. Select "Lingo 2 Client".
253. The first time you do this, Archipelago will prompt you for the location of
26 the Lingo 2 executable file ("Lingo2.exe"). You can find this by
27 right-clicking on Lingo 2 in Steam, going to "Manage", and clicking "Browse
28 local files".
294. Lingo 2 will open, and you will see a form asking for your connection
30 details. Enter the Archipelago address, slot name, and password into the
31 fields.
325. Press Connect.
336. Enjoy!
34
35To continue an earlier game, you can perform the exact same steps as above.
36
37## Joining a Multiworld game (Non-Windows)
38
39Lingo 2 only officially supports Windows, but has been known to work on Linux
40using Proton. Archipelago can be played on a non-Windows system, but the process
41is a little more complex.
42
431. Download
44 [archipelago.tscn](https://code.fourisland.com/lingo2-archipelago/plain/client/archipelago.tscn)
45 and put it in your custom maps folder. You only have to do this once.
462. Open Lingo 2, and select Archipelago from the level selection list.
473. Put the path to your `lingo2.apworld` into the field provided. You only have
48 to do this once, as the game will remember what you put in.
494. Click Start and wait for the connection settings screen to load.
505. Open the Archipelago Launcher.
516. Select "Lingo 2 Client".
527. You should see "Connected to Lingo 2!" You can then return to Lingo 2 and
53 fill out your connection details.
548. Press Connect.
559. Enjoy!
56
57## Frequently Asked Questions
58
59### Why aren't the starting room letters shuffled?
60
61The letter requirements for solving puzzles are very restrictive, especially in
62the early game. It is possible for the generator to find some subset of letters
63and doors to place in the starting room such that you are not trapped, but this
64places a lot of strain on generation and leads to significantly more generation
65failures.
66
67As a result, the starting room letters (H1, I1, N1, and T1) are always present
68in the starting room, even when remote letter shuffle is enabled. These letters
69will _also_ count as clearing a check, so you will send out another item at the
70same time as collecting the letter.
71
72### What areas are randomized?
73
74Almost all maps that you can access from the base game are randomized. The only
75exception is The Hinterlands, which will probably be repurposed into a hint
76area. Some advanced/hidden maps are also disabled by default (as discussed
77below).
78
79### Is my progress saved locally?
80
81Lingo 2 autosaves your progress every time you solve a puzzle, get a
82collectable, or interact with a keyholder. The randomizer generates a savefile
83name based on your Multiworld seed and slot number, so you should be able to
84seamlessly switch between multiworlds and even slots within a multiworld.
85
86The exception to this is different rooms created from the same multiworld seed.
87The client is unable to tell rooms in a seed apart (this is a limitation of the
88Archipelago API), so the client will use the same save file for the same slot in
89different rooms on the same seed. You can work around this by manually moving or
90removing the save folder from the users directory in Lingo 2's game files.
91
92If you play the base game again, you will see one or more save files with a long
93name that begins with "zzAP\_". These are the saves for your multiworlds. They
94can be safely deleted after you have completed the associated multiworld. It is
95not recommended to load these save files outside of the randomizer.
96
97A connection to Archipelago is required to resume playing a multiworld. This is
98because the set of items you have received is not stored locally.
99
100### What about wall snipes?
101
102"Wall sniping" refers to the fact that you are able to solve puzzles on the
103other side of opaque walls. The player is never expected to or required to do
104this in normal gameplay. This randomizer does not change how wall snipes work,
105but it will likewise never require the use of them.
106
107### How do cyan doors work?
108
109In the base game, there are a number of cyan-colored doors that ordinarily open
110once you collect H2 in The Repetitive. There are also a handful of panels that
111only appear upon getting H2 as well, which the apworld treats the same as the
112cyan doors.
113
114There is an option that lets you choose how these doors and panels behave. By
115default, they act the same as in the base game: they only open or appear after
116collecting H2. Note that this means the actual H2 collectable in The Repetitive.
117Receiving H2 via remote letter shuffle does not count for this requirement.
118However, you can also make cyan doors activate upon collecting or receiving your
119first double letter, regardless of what it is or if it's remote. Finally, you
120can lock cyan doors behind an item called "Cyan Doors".
121
122It is important to note, however, that the Cyan Door Behavior option only
123applies to cyan doors that are not already affected by another type of
124shuffling. When door shuffle is on, the following cyan doors are activated by
125individual items and are not impacted by your choice of Cyan Door Behavior:
126
127- The entrance to The Tower from The Great (The Great - Tower Entrance)
128- The entrance to The Butterfly from The Bearer (The Bearer - Butterfly
129 Entrance)
130- The entrance to The Repetitive from The Entry (The Entry - Repetitive
131 Entrance)
132- The eye painting near the yellow color hallway in Daedalus (Daedalus - Eye
133 Painting)
134- The Red I room in The Repetitive (The Repetitive - Anti Collectable Room)
135
136Additionally, when control center color shuffle is enabled, the orange door in
137The Unkempt (which ordinarily doubles as a cyan door) opens upon receiving the
138Control Center Orange Doors item, instead of following the Cyan Door Behavior
139option.
140
141### Help! I lost C/G in The Congruent!
142
143If you place C or G into the relevant keyholders in The Congruent, the keyholder
144disappears. You can retrieve your letter immediately by pressing C or G again
145before leaving solve mode, as the keyholder will still be considered to be
146"focused", even though it has moved. If you have already moved, though, there is
147another way to get your letters back: just use the Key Return in The Entry.
148
149### Why is the tracker telling me to solve a panel that's currently red?
150
151Red usually indicates that a panel cannot be solved because of missing letters.
152However, that only applies to the puzzle's main answer. If a puzzle has
153alternate answers, you may be expected to use one of those instead of the main
154one. As long as you have all of the necessary letters, an alternate answer can
155be typed into a red panel even though it does not show you typing. When you
156finish typing the answer, the panel will solve as normal.
157
158### Why does the tracker say "The Entry (Colored Doors Area) - OPEN" is in logic?
159
160This is an infamous panel, both in the base game and in the randomizer. There
161are _two_ valid answers that open the door / clear the location. These are
162"ORANGE" and "WALL".
163
164### I can't solve the COLORS panel in The Sturdy!
165
166The Sturdy contains a rainbow painting that leads to the Gold Ending area in
167Daedalus. There are three ways to spawn this painting, which have different
168logical requirements:
169
170- Solve the COLORS panel that appears after collecting S2. This is the most
171 well-known way, and causes the most confusion because you may be expected to
172 enter the painting even if you are unable to solve the panel (e.g. if you are
173 missing letters or missing Boxes Symbol).
174- Solve the panels in the order that you walk across the colors on the way
175 toward S2: Magenta, Red, Orange, Yellow, Green, Blue, Purple, Cyan. This has
176 the same logic as accessing S2.
177- Type "MOVE" into the Green and Yellow panels, and none of the other ones. This
178 is a subset of the logic for accessing S2, so you may actually be expected to
179 use the rainbow painting before you can even collect S2.
180
181### How does Icarus work?
182
183While Icarus is easily accessible during normal play, it is not randomized by
184default. The main reason for this is that Icarus employs significantly more use
185of gravity changing mechanics than the rest of the game and as a result tends to
186cause motion sickness in a lot of players. It is also an infamously confusing
187area to navigate.
188
189Because of this, the player may enter and exit Icarus from the usual place in
190Daedalus, but it will not contain any locations, and no items will be added to
191the pool for it. The worldport will not be included in the randomization if
192worldport shuffle is on. Icarus can also still be entered from The Crystalline,
193but doing so (in order to then access Daedalus) will not be logically required.
194
195However, Icarus can be randomized via the "Enable Icarus" option. Doing so
196creates locations and items for the map, and includes the worldport in worldport
197shuffle. The aforementioned connection from The Crystalline also becomes
198logical, if The Crystalline is enabled.
199
200It is not trivial to telegraph exactly what is logical within Icarus. It is very
201easy to break logic because the gravity changers allow you to fall in almost any
202direction you want to. In general, falling is only in logic if it is "guided",
203i.e. falling through a hole or an open door to another platform, or using a
204gravity inverter. You may also sometimes be required to solve panels that are
205physically near you and easily visible, but not on your plane of gravity. The
206tracker can help you determine what is considered logical, if you want to stay
207within the randomizer's logic.
208
209### How do the gift maps work?
210
211The beta tester gift maps are hidden levels intended for specific people. By
212default, these are not accessible at all from within the randomizer. The "Enable
213Gift Maps" option allows you to enter the maps, and creates items and locations
214for them. If worldport shuffle is on, their worldports will be included in the
215randomization.
216
217The gift maps are accessed via a panel in The Entry's Starting Room, which only
218appears if at least one gift map is enabled. It is also treated like a cyan
219door, and will not appear until the condition specified in the Cyan Door
220Behavior option is satisfied. Solving this panel with the name of one of the
221beta testers will teleport you to their corresponding gift map. This README
222purposefully does not list the names you need to enter the maps via the panel.
223
224In the base game, nothing happens once you complete a gift map. Masteries have
225been added to the gift maps in the randomizer so that the player can be rewarded
226for completing them.
227
228Note that the gift maps were originally only intended to be played by specific
229people, and as a result may be frustrating or require knowledge of inside jokes.
230The Crystalline is particularly difficult as it requires completing a parkour
231course. It is highly recommended that you complete these maps vanilla or solo
232before bringing them to a multiworld. It is also perfectly acceptable to never
233enable them.
234
235## Running from source
236
237The randomizer is mostly written in Python and GDScript, which do not need to be
238compiled. However, there are three files that need to be generated before the
239apworld can be used.
240
241The first file is `data.binpb`, the datafile containing the randomizer logic.
242You can read about how to generate it on
243[its own README page](https://code.fourisland.com/lingo2-archipelago/about/data/README.md).
244Once you have it, put it in a subfolder of `apworld` called `generated`.
245
246The second generated file is `data_pb2.py`. This file allows Archipelago to read
247the datafile. We use `protoc`, the Protocol Buffer compiler, to generate it. As
248of 0.6.3, Archipelago has protobuf 3.20.3 packaged with it, which means we need
249to compile our proto file with a similar version.
250
251If you followed the steps to generate `data.binpb` and compiled the `datapacker`
252tool yourself, you will already have protobuf version 3.21.12 installed through
253vcpkg. You can then run a command similar to this in order to generate the
254python file.
255
256```shell
257.\out\build\x64-Debug\vcpkg_installed\x64-windows\tools\protobuf\protoc.exe -Iproto\ ^
258 --python_out=apworld\generated\ .\proto\data.proto
259```
260
261The exact path to `protoc.exe` is going to depend on where vcpkg installed its
262packages. The above location is where Visual Studio will probably put it.
263
264The third generated file is `proto.gd`. This is the GDScript version of the
265previous file. We use a Godot script to generate it, which means
266[the Godot Editor](https://godotengine.org/download/) is required. From the root
267of the repository:
268
269```shell
270cd vendor\godobuf
271godot --headless -s addons\protobuf\protobuf_cmdln.gd --input=..\..\proto\data.proto ^
272 --output=..\..\apworld\generated\proto.gd
273```
274
275If you are not on Windows, replace the forward slashes with backslashes as
276appropriate (and the caret with a forward slash). You will also probably need to
277replace "godot" at the start of the second line with a path to a Godot Editor
278executable.
279
280After generating those three files, the apworld should be functional. You can
281copy it into an Archipelago source tree (rename the folder `apworld` to `lingo2`
282if you do so) if you want to edit/debug the code. Otherwise, you can zip up the
283folder and rename it to `lingo2.apworld` in order to package it for
284distribution.
diff --git a/apworld/__init__.py b/apworld/__init__.py index 07e3982..3d2f075 100644 --- a/apworld/__init__.py +++ b/apworld/__init__.py
@@ -1,18 +1,40 @@
1""" 1"""
2Archipelago init file for Lingo 2 2Archipelago init file for Lingo 2
3""" 3"""
4from BaseClasses import ItemClassification, Item 4from typing import ClassVar
5
6from BaseClasses import ItemClassification, Item, Tutorial
7from Options import OptionError
8from settings import Group, UserFilePath
5from worlds.AutoWorld import WebWorld, World 9from worlds.AutoWorld import WebWorld, World
6from .items import Lingo2Item 10from .items import Lingo2Item, ANTI_COLLECTABLE_TRAPS
7from .options import Lingo2Options 11from .options import Lingo2Options
8from .player_logic import Lingo2PlayerLogic 12from .player_logic import Lingo2PlayerLogic
9from .regions import create_regions 13from .regions import create_regions, shuffle_entrances, connect_ports_from_ut
10from .static_logic import Lingo2StaticLogic 14from .static_logic import Lingo2StaticLogic
15from worlds.LauncherComponents import Component, Type, components, launch as launch_component, icon_paths
11 16
12 17
13class Lingo2WebWorld(WebWorld): 18class Lingo2WebWorld(WebWorld):
14 rich_text_options_doc = True 19 rich_text_options_doc = True
15 theme = "grass" 20 theme = "grass"
21 tutorials = [Tutorial(
22 "Multiworld Setup Guide",
23 "A guide to playing Lingo 2 with Archipelago.",
24 "English",
25 "en_Lingo_2.md",
26 "setup/en",
27 ["hatkirby"]
28 )]
29
30
31class Lingo2Settings(Group):
32 class ExecutableFile(UserFilePath):
33 """Path to the Lingo 2 executable"""
34 is_exe = True
35
36 exe_file: ExecutableFile = ExecutableFile()
37 start_game: bool = True
16 38
17 39
18class Lingo2World(World): 40class Lingo2World(World):
@@ -24,24 +46,49 @@ class Lingo2World(World):
24 game = "Lingo 2" 46 game = "Lingo 2"
25 web = Lingo2WebWorld() 47 web = Lingo2WebWorld()
26 48
49 settings: ClassVar[Lingo2Settings]
50 settings_key = "lingo2_options"
51
52 topology_present = True
53
27 options_dataclass = Lingo2Options 54 options_dataclass = Lingo2Options
28 options: Lingo2Options 55 options: Lingo2Options
29 56
30 static_logic = Lingo2StaticLogic() 57 static_logic = Lingo2StaticLogic()
31 item_name_to_id = static_logic.item_name_to_id 58 item_name_to_id = static_logic.item_name_to_id
32 location_name_to_id = static_logic.location_name_to_id 59 location_name_to_id = static_logic.location_name_to_id
60 item_name_groups = static_logic.item_name_groups
61 location_name_groups = static_logic.location_name_groups
62
63 for_tracker: ClassVar[bool] = False
33 64
34 player_logic: Lingo2PlayerLogic 65 player_logic: Lingo2PlayerLogic
35 66
67 port_pairings: dict[int, int]
68
36 def generate_early(self): 69 def generate_early(self):
37 self.player_logic = Lingo2PlayerLogic(self) 70 self.player_logic = Lingo2PlayerLogic(self)
71 self.port_pairings = {}
38 72
39 def create_regions(self): 73 def create_regions(self):
40 create_regions(self) 74 create_regions(self)
41 75
42 from Utils import visualize_regions 76 def connect_entrances(self):
77 if self.options.shuffle_worldports:
78 if hasattr(self.multiworld, "re_gen_passthrough") and "Lingo 2" in self.multiworld.re_gen_passthrough:
79 slot_value = self.multiworld.re_gen_passthrough["Lingo 2"]["port_pairings"]
80 self.port_pairings = {
81 self.static_logic.port_id_by_ap_id[int(fp)]: self.static_logic.port_id_by_ap_id[int(tp)]
82 for fp, tp in slot_value.items()
83 }
43 84
44 visualize_regions(self.multiworld.get_region("Menu", self.player), "my_world.puml") 85 connect_ports_from_ut(self.port_pairings, self)
86 else:
87 shuffle_entrances(self)
88
89 #from Utils import visualize_regions
90
91 #visualize_regions(self.multiworld.get_region("Menu", self.player), "my_world.puml")
45 92
46 def create_items(self): 93 def create_items(self):
47 pool = [self.create_item(name) for name in self.player_logic.real_items] 94 pool = [self.create_item(name) for name in self.player_logic.real_items]
@@ -49,11 +96,91 @@ class Lingo2World(World):
49 total_locations = sum(len(locs) for locs in self.player_logic.locations_by_room.values()) 96 total_locations = sum(len(locs) for locs in self.player_logic.locations_by_room.values())
50 97
51 item_difference = total_locations - len(pool) 98 item_difference = total_locations - len(pool)
99
100 if self.options.trap_percentage > 0:
101 num_traps = int(item_difference * self.options.trap_percentage / 100)
102 item_difference = item_difference - num_traps
103
104 trap_names = []
105 trap_weights = []
106 for letter_name, weight in self.static_logic.letter_weights.items():
107 trap_names.append(f"Anti {letter_name}")
108 trap_weights.append(weight)
109
110 bad_letters = self.random.choices(trap_names, weights=trap_weights, k=num_traps)
111 pool += [self.create_item(trap_name) for trap_name in bad_letters]
112
52 for i in range(0, item_difference): 113 for i in range(0, item_difference):
53 pool.append(self.create_item("Nothing")) 114 pool.append(self.create_item(self.get_filler_item_name()))
115
116 if not any(ItemClassification.progression in item.classification for item in pool):
117 raise OptionError(f"Lingo 2 player {self.player} has no progression items. Please enable at least one "
118 f"option that would add progression gating to your world, such as Shuffle Doors or "
119 f"Shuffle Letters.")
54 120
55 self.multiworld.itempool += pool 121 self.multiworld.itempool += pool
56 122
57 def create_item(self, name: str) -> Item: 123 def create_item(self, name: str) -> Item:
58 return Lingo2Item(name, ItemClassification.filler if name == "Nothing" else ItemClassification.progression, 124 return Lingo2Item(name, ItemClassification.filler if name == self.get_filler_item_name() else
125 ItemClassification.trap if name in ANTI_COLLECTABLE_TRAPS else
126 ItemClassification.progression,
59 self.item_name_to_id.get(name), self.player) 127 self.item_name_to_id.get(name), self.player)
128
129 def set_rules(self):
130 self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player)
131
132 def fill_slot_data(self):
133 slot_options = [
134 "cyan_door_behavior",
135 "daedalus_roof_access",
136 "enable_gift_maps",
137 "enable_icarus",
138 "endings_requirement",
139 "keyholder_sanity",
140 "masteries_requirement",
141 "shuffle_control_center_colors",
142 "shuffle_doors",
143 "shuffle_gallery_paintings",
144 "shuffle_letters",
145 "shuffle_symbols",
146 "shuffle_worldports",
147 "strict_cyan_ending",
148 "strict_purple_ending",
149 "victory_condition",
150 ]
151
152 slot_data: dict[str, object] = {
153 **self.options.as_dict(*slot_options),
154 "version": self.static_logic.get_data_version(),
155 }
156
157 if self.options.shuffle_worldports:
158 def get_port_ap_id(port_id):
159 return self.static_logic.objects.ports[port_id].ap_id
160
161 slot_data["port_pairings"] = {get_port_ap_id(from_id): get_port_ap_id(to_id)
162 for from_id, to_id in self.port_pairings.items()}
163
164 return slot_data
165
166 def get_filler_item_name(self) -> str:
167 return "A Job Well Done"
168
169 # for the universal tracker, doesn't get called in standard gen
170 # docs: https://github.com/FarisTheAncient/Archipelago/blob/tracker/worlds/tracker/docs/re-gen-passthrough.md
171 @staticmethod
172 def interpret_slot_data(slot_data: dict[str, object]) -> dict[str, object]:
173 # returning slot_data so it regens, giving it back in multiworld.re_gen_passthrough
174 # we are using re_gen_passthrough over modifying the world here due to complexities with ER
175 return slot_data
176
177
178def launch_client(*args):
179 from .context import client_main
180 launch_component(client_main, name="Lingo2Client", args=args)
181
182
183icon_paths["lingo2_ico"] = f"ap:{__name__}/logo.png"
184component = Component("Lingo 2 Client", component_type=Type.CLIENT, func=launch_client,
185 description="Open Lingo 2.", supports_uri=True, game_name="Lingo 2", icon="lingo2_ico")
186components.append(component)
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/animationListener.gd b/apworld/client/animationListener.gd new file mode 100644 index 0000000..c3b26db --- /dev/null +++ b/apworld/client/animationListener.gd
@@ -0,0 +1,38 @@
1extends "res://scripts/nodes/listeners/animationListener.gd"
2
3var item_id
4var item_amount
5
6
7func _ready():
8 var node_path = String(
9 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
10 )
11
12 var gamedata = global.get_node("Gamedata")
13 var door_id = gamedata.get_door_for_map_node_path(global.map, node_path)
14 if door_id != null:
15 var ap = global.get_node("Archipelago")
16 var item_lock = ap.get_item_id_for_door(door_id)
17
18 if item_lock != null:
19 item_id = item_lock[0]
20 item_amount = item_lock[1]
21
22 self.senders = []
23 self.senderGroup = []
24 self.nested = false
25 self.complete_at = 0
26 self.max_length = 0
27 self.excludeSenders = []
28
29 call_deferred("_readier")
30
31 super._ready()
32
33
34func _readier():
35 var ap = global.get_node("Archipelago")
36
37 if ap.client.getItemAmount(item_id) >= item_amount:
38 handleTriggered()
diff --git a/apworld/client/apworld_runtime.gd b/apworld/client/apworld_runtime.gd new file mode 100644 index 0000000..03568bf --- /dev/null +++ b/apworld/client/apworld_runtime.gd
@@ -0,0 +1,49 @@
1extends Node
2
3var apworld_reader
4
5
6func _init(path):
7 apworld_reader = ZIPReader.new()
8 apworld_reader.open(path)
9
10
11func _get_true_path(path):
12 if path.begins_with("../"):
13 return "lingo2/%s" % path.substr(3)
14 else:
15 return "lingo2/client/%s" % path
16
17
18func path_exists(path):
19 var true_path = _get_true_path(path)
20 return apworld_reader.file_exists(true_path)
21
22
23func load_script(path):
24 var true_path = _get_true_path(path)
25
26 var script = GDScript.new()
27 script.source_code = apworld_reader.read_file(true_path).get_string_from_utf8()
28 script.reload()
29
30 return script
31
32
33func read_path(path):
34 var true_path = _get_true_path(path)
35 return apworld_reader.read_file(true_path)
36
37
38func load_script_as_scene(path, scene_name):
39 var script = load_script(path)
40 var instance = script.new()
41 instance.name = scene_name
42
43 get_tree().unload_current_scene()
44 _load_scene.call_deferred(instance)
45
46
47func _load_scene(instance):
48 get_tree().get_root().add_child(instance)
49 get_tree().current_scene = instance
diff --git a/apworld/client/assets/goal.png b/apworld/client/assets/goal.png new file mode 100644 index 0000000..bd1650d --- /dev/null +++ b/apworld/client/assets/goal.png
Binary files differ
diff --git a/apworld/client/assets/location.png b/apworld/client/assets/location.png new file mode 100644 index 0000000..5304deb --- /dev/null +++ b/apworld/client/assets/location.png
Binary files differ
diff --git a/apworld/client/assets/worldport.png b/apworld/client/assets/worldport.png new file mode 100644 index 0000000..19dfdc3 --- /dev/null +++ b/apworld/client/assets/worldport.png
Binary files differ
diff --git a/apworld/client/client.gd b/apworld/client/client.gd new file mode 100644 index 0000000..c149482 --- /dev/null +++ b/apworld/client/client.gd
@@ -0,0 +1,318 @@
1extends Node
2
3const ap_version = {"major": 0, "minor": 6, "build": 3, "class": "Version"}
4
5var SCRIPT_websocketserver
6
7var _server
8var _should_process = false
9
10var _remote_version = {"major": 0, "minor": 0, "build": 0}
11var _gen_version = {"major": 0, "minor": 0, "build": 0}
12
13var ap_server = ""
14var ap_user = ""
15var ap_pass = ""
16
17var _seed = ""
18var _team = 0
19var _slot = 0
20var _checked_locations = []
21var _checked_worldports = []
22var _received_indexes = []
23var _received_items = {}
24var _slot_data = {}
25var _accessible_locations = []
26var _accessible_worldports = []
27var _goal_accessible = false
28var _latched_doors = []
29var _hinted_locations = []
30
31signal could_not_connect
32signal connect_status
33signal client_connected(slot_data)
34signal item_received(item, amount)
35signal location_scout_received(location_id, item_name, player_name, flags, for_self)
36signal text_message_received(message)
37signal item_sent_notification(message)
38signal hint_received(message)
39signal door_latched(id)
40signal accessible_locations_updated
41signal checked_locations_updated
42signal ignored_locations_updated(locations)
43signal checked_worldports_updated
44signal keyboard_update_received
45signal hinted_locations_updated
46
47
48func _init():
49 set_process_mode(Node.PROCESS_MODE_ALWAYS)
50
51 global._print("Instantiated APClient")
52
53
54func _ready():
55 _server = SCRIPT_websocketserver.new()
56 _server.client_connected.connect(_on_web_socket_server_client_connected)
57 _server.client_disconnected.connect(_on_web_socket_server_client_disconnected)
58 _server.message_received.connect(_on_web_socket_server_message_received)
59 add_child(_server)
60 _server.listen(43182)
61
62
63func _reset_state():
64 _should_process = false
65 _received_items = {}
66 _received_indexes = []
67 _checked_worldports = []
68 _accessible_locations = []
69 _accessible_worldports = []
70 _goal_accessible = false
71
72
73func disconnect_from_ap():
74 sendMessage([{"cmd": "Disconnect"}])
75
76
77func _on_web_socket_server_client_connected(peer_id: int) -> void:
78 var peer: WebSocketPeer = _server.peers[peer_id]
79 print("Remote client connected: %d. Protocol: %s" % [peer_id, peer.get_selected_protocol()])
80 _server.send(-peer_id, "[%d] connected" % peer_id)
81
82
83func _on_web_socket_server_client_disconnected(peer_id: int) -> void:
84 var peer: WebSocketPeer = _server.peers[peer_id]
85 print(
86 (
87 "Remote client disconnected: %d. Code: %d, Reason: %s"
88 % [peer_id, peer.get_close_code(), peer.get_close_reason()]
89 )
90 )
91 _server.send(-peer_id, "[%d] disconnected" % peer_id)
92
93
94func _on_web_socket_server_message_received(_peer_id: int, packet: String) -> void:
95 global._print("Got data from server: " + packet)
96 var json = JSON.new()
97 var jserror = json.parse(packet)
98 if jserror != OK:
99 global._print("Error parsing packet from AP: " + jserror.error_string)
100 return
101
102 for message in json.data:
103 var cmd = message["cmd"]
104 global._print("Received command: " + cmd)
105
106 if cmd == "Connected":
107 _seed = message["seed_name"]
108 _remote_version = message["version"]
109 _gen_version = message["generator_version"]
110 _team = message["team"]
111 _slot = message["slot"]
112 _slot_data = message["slot_data"]
113
114 _checked_locations = []
115 for location in message["checked_locations"]:
116 _checked_locations.append(int(location))
117
118 client_connected.emit(_slot_data)
119
120 elif cmd == "ConnectionRefused":
121 could_not_connect.emit(message["text"])
122 global._print("Connection to AP refused")
123
124 elif cmd == "UpdateLocations":
125 for location in message["locations"]:
126 var lint = int(location)
127 if not _checked_locations.has(lint):
128 _checked_locations.append(lint)
129
130 checked_locations_updated.emit()
131
132 elif cmd == "UpdateWorldports":
133 for port_id in message["worldports"]:
134 var lint = int(port_id)
135 if not _checked_worldports.has(lint):
136 _checked_worldports.append(lint)
137
138 checked_worldports_updated.emit()
139
140 elif cmd == "ItemReceived":
141 for item in message["items"]:
142 var index = int(item["index"])
143 if _received_indexes.has(index):
144 # Do not re-process items.
145 continue
146
147 _received_indexes.append(index)
148
149 var item_id = int(item["id"])
150 _received_items[item_id] = _received_items.get(item_id, 0) + 1
151
152 item_received.emit(item, _received_items[item_id])
153
154 elif cmd == "TextMessage":
155 text_message_received.emit(message["data"])
156
157 elif cmd == "ItemSentNotif":
158 item_sent_notification.emit(message)
159
160 elif cmd == "HintReceived":
161 hint_received.emit(message)
162
163 elif cmd == "LocationInfo":
164 for loc in message["locations"]:
165 location_scout_received.emit(
166 int(loc["id"]), loc["item"], loc["player"], int(loc["flags"]), int(loc["self"])
167 )
168
169 elif cmd == "AccessibleLocations":
170 _accessible_locations.clear()
171 _accessible_worldports.clear()
172
173 for loc in message["locations"]:
174 _accessible_locations.append(int(loc))
175
176 if "worldports" in message:
177 for port_id in message["worldports"]:
178 _accessible_worldports.append(int(port_id))
179
180 _goal_accessible = bool(message.get("goal", false))
181
182 accessible_locations_updated.emit()
183
184 elif cmd == "UpdateKeyboard":
185 var updates = {}
186 for k in message["updates"]:
187 updates[k] = int(message["updates"][k])
188
189 keyboard_update_received.emit(updates)
190
191 elif cmd == "PathReply":
192 var textclient = global.get_node("Textclient")
193 textclient.display_logical_path(
194 message["type"], int(message.get("id", null)), message["path"]
195 )
196
197 elif cmd == "UpdateLatches":
198 for id in message["latches"]:
199 var iid = int(id)
200 if not _latched_doors.has(iid):
201 _latched_doors.append(iid)
202
203 door_latched.emit(iid)
204
205 elif cmd == "SetIgnoredLocations":
206 var locs = []
207 for id in message["locations"]:
208 locs.append(int(id))
209
210 ignored_locations_updated.emit(locs)
211
212 elif cmd == "UpdateHintedLocations":
213 for id in message["locations"]:
214 var iid = int(id)
215 if !_hinted_locations.has(iid):
216 _hinted_locations.append(iid)
217
218 hinted_locations_updated.emit()
219
220
221func connectToServer(server, un, pw):
222 sendMessage([{"cmd": "Connect", "server": server, "player": un, "password": pw}])
223
224 ap_server = server
225 ap_user = un
226 ap_pass = pw
227
228 _should_process = true
229
230 connect_status.emit("Connecting...")
231
232
233func sendMessage(msg):
234 var payload = JSON.stringify(msg)
235 _server.send(0, payload)
236
237
238func connectToRoom():
239 connect_status.emit("Authenticating...")
240
241 sendMessage(
242 [
243 {
244 "cmd": "Connect",
245 "password": ap_pass,
246 "game": "Lingo 2",
247 "name": ap_user,
248 }
249 ]
250 )
251
252
253func requestSync():
254 sendMessage([{"cmd": "Sync"}])
255
256
257func sendLocation(loc_id):
258 sendMessage([{"cmd": "LocationChecks", "locations": [loc_id]}])
259
260
261func sendLocations(loc_ids):
262 sendMessage([{"cmd": "LocationChecks", "locations": loc_ids}])
263
264
265func say(textdata):
266 sendMessage([{"cmd": "Say", "text": textdata}])
267
268
269func completedGoal():
270 sendMessage([{"cmd": "StatusUpdate", "status": 30}]) # CLIENT_GOAL
271
272
273func scoutLocations(loc_ids):
274 sendMessage([{"cmd": "LocationScouts", "locations": loc_ids}])
275
276
277func updateKeyboard(updates):
278 sendMessage([{"cmd": "UpdateKeyboard", "keyboard": updates}])
279
280
281func checkWorldport(port_id):
282 if not _checked_worldports.has(port_id):
283 sendMessage([{"cmd": "CheckWorldport", "port_id": port_id}])
284
285
286func latchDoor(id):
287 if not _latched_doors.has(id):
288 _latched_doors.append(id)
289
290 sendMessage([{"cmd": "LatchDoor", "door": id}])
291
292
293func getLogicalPath(object_type, object_id):
294 var msg = {"cmd": "GetPath", "type": object_type}
295 if object_id != null:
296 msg["id"] = object_id
297
298 sendMessage([msg])
299
300
301func addIgnoredLocation(loc_id):
302 sendMessage([{"cmd": "IgnoreLocation", "id": loc_id}])
303
304
305func removeIgnoredLocation(loc_id):
306 sendMessage([{"cmd": "UnignoreLocation", "id": loc_id}])
307
308
309func sendQuit():
310 sendMessage([{"cmd": "Quit"}])
311
312
313func hasItem(item_id):
314 return _received_items.has(item_id)
315
316
317func getItemAmount(item_id):
318 return _received_items.get(item_id, 0)
diff --git a/apworld/client/collectable.gd b/apworld/client/collectable.gd new file mode 100644 index 0000000..4a17a2a --- /dev/null +++ b/apworld/client/collectable.gd
@@ -0,0 +1,16 @@
1extends "res://scripts/nodes/collectable.gd"
2
3
4func pickedUp():
5 if unlock_type == "key":
6 var ap = global.get_node("Archipelago")
7 if ap.get_letter_behavior(unlock_key, level == 2) == ap.kLETTER_BEHAVIOR_VANILLA:
8 ap.keyboard.collect_local_letter(unlock_key, level)
9 else:
10 ap.keyboard.update_unlocks()
11
12 super.pickedUp()
13
14
15func setScoutedText(text):
16 get_node("MeshInstance3D").mesh.text = text.replace(" ", "\n")
diff --git a/apworld/client/compass.gd b/apworld/client/compass.gd new file mode 100644 index 0000000..c90475a --- /dev/null +++ b/apworld/client/compass.gd
@@ -0,0 +1,66 @@
1extends Node2D
2
3const RADIUS = 48
4
5var _font
6
7
8func _ready():
9 _font = load("res://assets/fonts/Lingo2.ttf")
10
11
12func _draw():
13 draw_circle(Vector2.ZERO, RADIUS, Color(1.0, 1.0, 1.0, 0.8), true)
14 draw_circle(Vector2.ZERO, RADIUS, Color.BLACK, false)
15 draw_string(
16 _font,
17 Vector2(-4, -RADIUS * 3.0 / 4.0),
18 "N",
19 HorizontalAlignment.HORIZONTAL_ALIGNMENT_LEFT,
20 -1,
21 16,
22 Color.BLACK
23 )
24 draw_set_transform(Vector2.ZERO, PI / 2)
25 draw_string(
26 _font,
27 Vector2(-4, -RADIUS * 3.0 / 4.0),
28 "E",
29 HorizontalAlignment.HORIZONTAL_ALIGNMENT_LEFT,
30 -1,
31 16,
32 Color.BLACK
33 )
34 draw_set_transform(Vector2.ZERO, PI)
35 draw_string(
36 _font,
37 Vector2(-4, -RADIUS * 3.0 / 4.0),
38 "S",
39 HorizontalAlignment.HORIZONTAL_ALIGNMENT_LEFT,
40 -1,
41 16,
42 Color.BLACK
43 )
44 draw_set_transform(Vector2.ZERO, PI * 3.0 / 2.0)
45 draw_string(
46 _font,
47 Vector2(-4, -RADIUS * 3.0 / 4.0),
48 "W",
49 HorizontalAlignment.HORIZONTAL_ALIGNMENT_LEFT,
50 -1,
51 16,
52 Color.BLACK
53 )
54 draw_set_transform(Vector2.ZERO)
55 draw_colored_polygon(
56 PackedVector2Array(
57 [Vector2(0, -RADIUS * 5.0 / 8.0), Vector2(-RADIUS / 6.0, 0), Vector2(RADIUS / 6.0, 0)]
58 ),
59 Color.RED
60 )
61 draw_colored_polygon(
62 PackedVector2Array(
63 [Vector2(0, RADIUS * 5.0 / 8.0), Vector2(-RADIUS / 6.0, 0), Vector2(RADIUS / 6.0, 0)]
64 ),
65 Color.GRAY
66 )
diff --git a/apworld/client/compass_overlay.gd b/apworld/client/compass_overlay.gd new file mode 100644 index 0000000..56e81ff --- /dev/null +++ b/apworld/client/compass_overlay.gd
@@ -0,0 +1,17 @@
1extends CanvasLayer
2
3var SCRIPT_compass
4
5var compass
6
7
8func _ready():
9 compass = SCRIPT_compass.new()
10 compass.position = Vector2(1840, 80)
11 add_child(compass)
12
13 visible = false
14
15
16func update_rotation(ry):
17 compass.rotation = ry
diff --git a/apworld/client/door.gd b/apworld/client/door.gd new file mode 100644 index 0000000..63cfa99 --- /dev/null +++ b/apworld/client/door.gd
@@ -0,0 +1,75 @@
1extends "res://scripts/nodes/door.gd"
2
3var door_id
4var item_id
5var item_amount
6var latched = false
7
8
9func _ready():
10 var node_path = String(
11 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
12 )
13
14 var gamedata = global.get_node("Gamedata")
15 door_id = gamedata.get_door_for_map_node_path(global.map, node_path)
16 if door_id != null:
17 var ap = global.get_node("Archipelago")
18 var item_lock = ap.get_item_id_for_door(door_id)
19
20 if item_lock != null:
21 item_id = item_lock[0]
22 item_amount = item_lock[1]
23
24 self.senders = []
25 self.senderGroup = []
26 self.nested = false
27 self.complete_at = 0
28 self.max_length = 0
29 self.excludeSenders = []
30
31 call_deferred("_readier")
32 else:
33 var door_data = gamedata.objects.get_doors()[door_id]
34 if door_data.has_latch() and door_data.get_latch():
35 _check_latched.call_deferred(door_id)
36
37 latched = true
38
39 if global.map == "the_sun_temple":
40 if name == "spe_EndPlatform" or name == "spe_entry_2":
41 senders = [NodePath("/root/scene/Panels/EndCheck_dog")]
42
43 if global.map == "the_parthenon":
44 if name == "spe_entry_1":
45 senders = [NodePath("/root/scene/Panels/EndCheck_dog")]
46
47 super._ready()
48
49
50func _readier():
51 var ap = global.get_node("Archipelago")
52
53 if ap.client.getItemAmount(item_id) >= item_amount:
54 handleTriggered()
55
56
57func _check_latched(door_id):
58 var ap = global.get_node("Archipelago")
59
60 if ap.client._latched_doors.has(door_id):
61 triggered = total
62 handleTriggered()
63
64
65func handleTriggered():
66 super.handleTriggered()
67
68 if latched and ran:
69 var ap = global.get_node("Archipelago")
70 ap.client.latchDoor(door_id)
71
72
73func handleUntriggered():
74 if not latched or not ran:
75 super.handleUntriggered()
diff --git a/apworld/client/effects.gd b/apworld/client/effects.gd new file mode 100644 index 0000000..9dc1dd8 --- /dev/null +++ b/apworld/client/effects.gd
@@ -0,0 +1,32 @@
1extends CanvasLayer
2
3var _label
4
5var _disconnected = false
6
7
8func _ready():
9 _label = Label.new()
10 _label.name = "Label"
11 _label.offset_left = 20
12 _label.offset_top = 20
13 _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_LEFT
14 _label.vertical_alignment = VERTICAL_ALIGNMENT_TOP
15 _label.theme = preload("res://assets/themes/baseUI.tres")
16 _label.add_theme_font_size_override("font_size", 36)
17 add_child(_label)
18
19
20func set_connection_lost(arg):
21 _disconnected = arg
22
23 _update_label()
24
25
26func _update_label():
27 var text = []
28
29 if _disconnected:
30 text.append("Disconnected from multiworld.")
31
32 _label.text = "\n".join(text)
diff --git a/apworld/client/gamedata.gd b/apworld/client/gamedata.gd new file mode 100644 index 0000000..d7e3136 --- /dev/null +++ b/apworld/client/gamedata.gd
@@ -0,0 +1,302 @@
1extends Node
2
3var SCRIPT_proto
4
5var objects
6var door_id_by_map_node_path = {}
7var painting_id_by_map_node_path = {}
8var panel_id_by_map_node_path = {}
9var port_id_by_map_node_path = {}
10var door_id_by_ap_id = {}
11var map_id_by_name = {}
12var progressive_id_by_ap_id = {}
13var letter_id_by_ap_id = {}
14var symbol_item_ids = []
15var anti_trap_ids = {}
16var location_name_by_id = {}
17var ending_display_name_by_name = {}
18var port_id_by_ap_id = {}
19
20var kSYMBOL_ITEMS
21
22
23func _init(proto_script):
24 SCRIPT_proto = proto_script
25
26 kSYMBOL_ITEMS = {
27 SCRIPT_proto.PuzzleSymbol.SUN: "Sun Symbol",
28 SCRIPT_proto.PuzzleSymbol.SPARKLES: "Sparkles Symbol",
29 SCRIPT_proto.PuzzleSymbol.ZERO: "Zero Symbol",
30 SCRIPT_proto.PuzzleSymbol.EXAMPLE: "Example Symbol",
31 SCRIPT_proto.PuzzleSymbol.BOXES: "Boxes Symbol",
32 SCRIPT_proto.PuzzleSymbol.PLANET: "Planet Symbol",
33 SCRIPT_proto.PuzzleSymbol.PYRAMID: "Pyramid Symbol",
34 SCRIPT_proto.PuzzleSymbol.CROSS: "Cross Symbol",
35 SCRIPT_proto.PuzzleSymbol.SWEET: "Sweet Symbol",
36 SCRIPT_proto.PuzzleSymbol.GENDER: "Gender Symbol",
37 SCRIPT_proto.PuzzleSymbol.AGE: "Age Symbol",
38 SCRIPT_proto.PuzzleSymbol.SOUND: "Sound Symbol",
39 SCRIPT_proto.PuzzleSymbol.ANAGRAM: "Anagram Symbol",
40 SCRIPT_proto.PuzzleSymbol.JOB: "Job Symbol",
41 SCRIPT_proto.PuzzleSymbol.STARS: "Stars Symbol",
42 SCRIPT_proto.PuzzleSymbol.NULL: "Null Symbol",
43 SCRIPT_proto.PuzzleSymbol.EVAL: "Eval Symbol",
44 SCRIPT_proto.PuzzleSymbol.LINGO: "Lingo Symbol",
45 SCRIPT_proto.PuzzleSymbol.QUESTION: "Question Symbol",
46 }
47
48
49func load(data_bytes):
50 objects = SCRIPT_proto.AllObjects.new()
51
52 var result_code = objects.from_bytes(data_bytes)
53 if result_code != SCRIPT_proto.PB_ERR.NO_ERRORS:
54 print("Could not load generated data: %d" % result_code)
55 return
56
57 for map in objects.get_maps():
58 map_id_by_name[map.get_name()] = map.get_id()
59
60 for door in objects.get_doors():
61 var map = objects.get_maps()[door.get_map_id()]
62
63 if not map.get_name() in door_id_by_map_node_path:
64 door_id_by_map_node_path[map.get_name()] = {}
65
66 var map_data = door_id_by_map_node_path[map.get_name()]
67 for receiver in door.get_receivers():
68 map_data[receiver] = door.get_id()
69
70 for painting_id in door.get_move_paintings():
71 var painting = objects.get_paintings()[painting_id]
72 map_data[painting.get_path()] = door.get_id()
73
74 if door.has_ap_id():
75 door_id_by_ap_id[door.get_ap_id()] = door.get_id()
76
77 if (
78 door.get_type() == SCRIPT_proto.DoorType.STANDARD
79 or door.get_type() == SCRIPT_proto.DoorType.LOCATION_ONLY
80 or door.get_type() == SCRIPT_proto.DoorType.GRAVESTONE
81 ):
82 location_name_by_id[door.get_ap_id()] = _get_door_location_name(door)
83
84 for painting in objects.get_paintings():
85 var room = objects.get_rooms()[painting.get_room_id()]
86 var map = objects.get_maps()[room.get_map_id()]
87
88 if not map.get_name() in painting_id_by_map_node_path:
89 painting_id_by_map_node_path[map.get_name()] = {}
90
91 var _map_data = painting_id_by_map_node_path[map.get_name()]
92
93 for port in objects.get_ports():
94 var room = objects.get_rooms()[port.get_room_id()]
95 var map = objects.get_maps()[room.get_map_id()]
96
97 if not map.get_name() in port_id_by_map_node_path:
98 port_id_by_map_node_path[map.get_name()] = {}
99
100 var map_data = port_id_by_map_node_path[map.get_name()]
101 map_data[port.get_path()] = port.get_id()
102
103 if port.has_ap_id():
104 port_id_by_ap_id[port.get_ap_id()] = port.get_id()
105
106 for progressive in objects.get_progressives():
107 progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id()
108
109 for letter in objects.get_letters():
110 letter_id_by_ap_id[letter.get_ap_id()] = letter.get_id()
111 location_name_by_id[letter.get_ap_id()] = _get_letter_location_name(letter)
112
113 for mastery in objects.get_masteries():
114 location_name_by_id[mastery.get_ap_id()] = _get_mastery_location_name(mastery)
115
116 for ending in objects.get_endings():
117 var location_name = _get_ending_location_name(ending)
118 location_name_by_id[ending.get_ap_id()] = location_name
119 ending_display_name_by_name[ending.get_name()] = location_name
120
121 for keyholder in objects.get_keyholders():
122 if keyholder.has_key():
123 location_name_by_id[keyholder.get_ap_id()] = _get_keyholder_location_name(keyholder)
124
125 for panel in objects.get_panels():
126 var room = objects.get_rooms()[panel.get_room_id()]
127 var map = objects.get_maps()[room.get_map_id()]
128
129 if not map.get_name() in panel_id_by_map_node_path:
130 panel_id_by_map_node_path[map.get_name()] = {}
131
132 var map_data = panel_id_by_map_node_path[map.get_name()]
133 map_data[panel.get_path()] = panel.get_id()
134
135 for symbol_name in kSYMBOL_ITEMS.values():
136 symbol_item_ids.append(objects.get_special_ids()[symbol_name])
137
138 for special_name in objects.get_special_ids().keys():
139 if special_name.begins_with("Anti "):
140 anti_trap_ids[objects.get_special_ids()[special_name]] = (
141 special_name.substr(5).to_lower()
142 )
143
144
145func get_door_for_map_node_path(map_name, node_path):
146 if not door_id_by_map_node_path.has(map_name):
147 return null
148
149 var map_data = door_id_by_map_node_path[map_name]
150 return map_data.get(node_path, null)
151
152
153func get_panel_for_map_node_path(map_name, node_path):
154 if not panel_id_by_map_node_path.has(map_name):
155 return null
156
157 var map_data = panel_id_by_map_node_path[map_name]
158 return map_data.get(node_path, null)
159
160
161func get_port_for_map_node_path(map_name, node_path):
162 if not port_id_by_map_node_path.has(map_name):
163 return null
164
165 var map_data = port_id_by_map_node_path[map_name]
166 return map_data.get(node_path, null)
167
168
169func get_door_ap_id(door_id):
170 var door = objects.get_doors()[door_id]
171 if door.has_ap_id():
172 return door.get_ap_id()
173 else:
174 return null
175
176
177func get_door_map_name(door_id):
178 var door = objects.get_doors()[door_id]
179 var map = objects.get_maps()[door.get_map_id()]
180 return map.get_name()
181
182
183func get_door_receivers(door_id):
184 var door = objects.get_doors()[door_id]
185 return door.get_receivers()
186
187
188func get_worldport_display_name(port_id):
189 var port = objects.get_ports()[port_id]
190 return "%s - %s" % [_get_room_object_map_name(port), port.get_display_name()]
191
192
193func _get_map_object_map_name(obj):
194 return objects.get_maps()[obj.get_map_id()].get_display_name()
195
196
197func _get_room_object_map_name(obj):
198 return _get_map_object_map_name(objects.get_rooms()[obj.get_room_id()])
199
200
201func _get_room_object_location_prefix(obj):
202 var room = objects.get_rooms()[obj.get_room_id()]
203 var game_map = objects.get_maps()[room.get_map_id()]
204
205 if room.has_panel_display_name():
206 return "%s (%s)" % [game_map.get_display_name(), room.get_panel_display_name()]
207 else:
208 return game_map.get_display_name()
209
210
211func _get_door_location_name(door):
212 var map_part = _get_room_object_location_prefix(door)
213
214 if door.has_location_name():
215 return "%s - %s" % [map_part, door.get_location_name()]
216
217 var generated_location_name = _get_generated_door_location_name(door)
218 if generated_location_name != null:
219 return generated_location_name
220
221 return "%s - %s" % [map_part, door.get_name()]
222
223
224func _get_generated_door_location_name(door):
225 if door.get_type() != SCRIPT_proto.DoorType.STANDARD:
226 return null
227
228 if (
229 door.get_keyholders().size() > 0
230 or (door.has_white_ending() and door.get_white_ending())
231 or door.has_complete_at()
232 ):
233 return null
234
235 if door.get_panels().size() > 4:
236 return null
237
238 var map_areas = []
239 for panel_id in door.get_panels():
240 var panel = objects.get_panels()[panel_id.get_panel()]
241 var panel_room = objects.get_rooms()[panel.get_room_id()]
242 # It's okay if panel_display_name is not present because then it's coalesced with other unnamed areas.
243 var panel_display_name = ""
244 if panel_room.has_panel_display_name():
245 panel_display_name = panel_room.get_panel_display_name()
246 if not map_areas.has(panel_display_name):
247 map_areas.append(panel_display_name)
248
249 if map_areas.size() > 1:
250 return null
251
252 var game_map = objects.get_maps()[door.get_map_id()]
253 var map_area = map_areas[0]
254 var map_part
255 if map_area == "":
256 map_part = game_map.get_display_name()
257 else:
258 map_part = "%s (%s)" % [game_map.get_display_name(), map_area]
259
260 var panel_names = []
261 for panel_id in door.get_panels():
262 var panel_data = objects.get_panels()[panel_id.get_panel()]
263 var panel_name
264 if panel_data.has_display_name():
265 panel_name = panel_data.get_display_name()
266 else:
267 panel_name = panel_data.get_name()
268
269 var location_part
270 if panel_id.has_answer():
271 location_part = "%s/%s" % [panel_name, panel_id.get_answer().to_upper()]
272 else:
273 location_part = panel_name
274
275 panel_names.append(location_part)
276
277 panel_names.sort()
278
279 return map_part + " - " + ", ".join(panel_names)
280
281
282func _get_letter_location_name(letter):
283 var letter_level = 2 if (letter.has_level2() and letter.get_level2()) else 1
284 var letter_name = "%s%d" % [letter.get_key().to_upper(), letter_level]
285 return "%s - %s" % [_get_room_object_map_name(letter), letter_name]
286
287
288func _get_mastery_location_name(mastery):
289 return "%s - Mastery" % _get_room_object_map_name(mastery)
290
291
292func _get_ending_location_name(ending):
293 return (
294 "%s - %s Ending" % [_get_room_object_map_name(ending), ending.get_name().to_pascal_case()]
295 )
296
297
298func _get_keyholder_location_name(keyholder):
299 return (
300 "%s - %s Keyholder"
301 % [_get_room_object_location_prefix(keyholder), keyholder.get_key().to_upper()]
302 )
diff --git a/apworld/client/keyHolder.gd b/apworld/client/keyHolder.gd new file mode 100644 index 0000000..3c037ff --- /dev/null +++ b/apworld/client/keyHolder.gd
@@ -0,0 +1,38 @@
1extends "res://scripts/nodes/keyHolder.gd"
2
3
4func setFromAp(key, level):
5 if level > 0:
6 has_key = true
7 is_complete = "%s%d" % [key, level]
8 held_key = key
9 held_level = level
10 get_node("Hinge/Letter").mesh.text = held_key
11 get_node("Hinge/Letter2").mesh.text = held_key
12 setMaterial()
13 emit_signal("trigger")
14 else:
15 has_key = false
16 held_key = ""
17 held_level = 0
18 setMaterial()
19 get_node("Hinge/Letter").mesh.text = "-"
20 get_node("Hinge/Letter2").mesh.text = "-"
21 is_complete = ""
22 emit_signal("untrigger")
23
24
25func addKey(key):
26 var node_path = String(
27 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
28 )
29 var ap = global.get_node("Archipelago")
30 ap.keyboard.put_in_keyholder(key, global.map, node_path)
31
32
33func removeKey():
34 var node_path = String(
35 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
36 )
37 var ap = global.get_node("Archipelago")
38 ap.keyboard.remove_from_keyholder(held_key, global.map, node_path)
diff --git a/apworld/client/keyHolderChecker.gd b/apworld/client/keyHolderChecker.gd new file mode 100644 index 0000000..a75a9e4 --- /dev/null +++ b/apworld/client/keyHolderChecker.gd
@@ -0,0 +1,24 @@
1extends "res://scripts/nodes/listeners/keyHolderChecker.gd"
2
3
4func check():
5 var ap = global.get_node("Archipelago")
6 var matches = []
7 for map in ap.keyboard.keyholder_state.keys():
8 var nodes = ap.keyboard.keyholder_state[map]
9 for node in nodes.keys():
10 matches.append([nodes[node], 1, map, "/root/scene/%s" % node])
11
12 var count = 0
13 for key_match in matches:
14 var active = (
15 key_match[2] + String(key_match[3]).replace("/root/scene/Components/KeyHolders/", ".")
16 )
17 if map[active] == key_match[0]:
18 emit_signal("trigger_letter", key_match[0], true)
19 count += 1
20 else:
21 emit_signal("trigger_letter", key_match[0], false)
22
23 if count > 25:
24 emit_signal("trigger")
diff --git a/apworld/client/keyHolderResetterListener.gd b/apworld/client/keyHolderResetterListener.gd new file mode 100644 index 0000000..9ab45f9 --- /dev/null +++ b/apworld/client/keyHolderResetterListener.gd
@@ -0,0 +1,10 @@
1extends "res://scripts/nodes/listeners/keyHolderResetterListener.gd"
2
3
4func reset():
5 var ap = global.get_node("Archipelago")
6 var was_removed = ap.keyboard.reset_keyholders()
7 if was_removed:
8 sfxPlayer.sfx_play("pickup")
9
10 ap.client.requestSync()
diff --git a/apworld/client/keyboard.gd b/apworld/client/keyboard.gd new file mode 100644 index 0000000..9026c06 --- /dev/null +++ b/apworld/client/keyboard.gd
@@ -0,0 +1,228 @@
1extends Node
2
3const kALL_LETTERS = "abcdefghjiklmnopqrstuvwxyz"
4
5var letters_saved = {}
6var letters_in_keyholders = []
7var letters_blocked = []
8var letters_dynamic = {}
9var keyholder_state = {}
10
11var filename = ""
12
13
14func _init():
15 reset()
16
17
18func reset():
19 letters_saved.clear()
20 letters_in_keyholders.clear()
21 letters_blocked.clear()
22 letters_dynamic.clear()
23 keyholder_state.clear()
24
25
26func load_seed():
27 var ap = global.get_node("Archipelago")
28
29 reset()
30
31 filename = "user://archipelago_keys/%s_%d" % [ap.client._seed, ap.client._slot]
32
33 if FileAccess.file_exists(filename):
34 var ap_file = FileAccess.open(filename, FileAccess.READ)
35 var localdata = []
36 if ap_file != null:
37 localdata = ap_file.get_var(true)
38 ap_file.close()
39
40 if typeof(localdata) != TYPE_ARRAY:
41 print("AP keyboard file is corrupted")
42 localdata = []
43
44 if localdata.size() > 0:
45 letters_saved = localdata[0]
46 if localdata.size() > 1:
47 letters_in_keyholders = localdata[1]
48 if localdata.size() > 2:
49 keyholder_state = localdata[2]
50
51 if not letters_saved.is_empty():
52 ap.client.updateKeyboard(letters_saved)
53
54 for k in kALL_LETTERS:
55 var level = 0
56
57 if ap.get_letter_behavior(k, false) == ap.kLETTER_BEHAVIOR_UNLOCKED:
58 level += 1
59 if ap.get_letter_behavior(k, true) == ap.kLETTER_BEHAVIOR_UNLOCKED:
60 level += 1
61
62 letters_dynamic[k] = level
63
64 update_unlocks()
65
66
67func save():
68 var dir = DirAccess.open("user://")
69 var folder = "archipelago_keys"
70 if not dir.dir_exists(folder):
71 dir.make_dir(folder)
72
73 var file = FileAccess.open(filename, FileAccess.WRITE)
74
75 var data = [
76 letters_saved,
77 letters_in_keyholders,
78 keyholder_state,
79 ]
80 file.store_var(data, true)
81 file.close()
82
83
84func update_unlocks():
85 unlocks.resetKeys()
86
87 var has_doubles = false
88
89 for k in kALL_LETTERS:
90 var level = 0
91
92 if not letters_in_keyholders.has(k):
93 level = letters_saved.get(k, 0) + letters_dynamic.get(k, 0)
94
95 if level >= 2:
96 level = 2
97 has_doubles = true
98
99 if letters_blocked.has(k):
100 level = 0
101
102 unlocks.unlockKey(k, level)
103
104 if has_doubles and unlocks.data["double_letters"] != "unlocked":
105 var ap = global.get_node("Archipelago")
106 if ap.cyan_door_behavior == ap.kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER:
107 unlocks.setData("double_letters", "unlocked")
108
109
110func collect_local_letter(key, level):
111 var ap = global.get_node("Archipelago")
112 var true_level = 0
113
114 if ap.get_letter_behavior(key, false) == ap.kLETTER_BEHAVIOR_VANILLA:
115 true_level += 1
116 if level == 2 and ap.get_letter_behavior(key, true) == ap.kLETTER_BEHAVIOR_VANILLA:
117 true_level += 1
118
119 if true_level < letters_saved.get(key, 0):
120 return
121
122 letters_saved[key] = true_level
123
124 ap.client.updateKeyboard({key: true_level})
125
126 if letters_blocked.has(key):
127 letters_blocked.erase(key)
128
129 update_unlocks()
130 save()
131
132
133func collect_remote_letter(key, level):
134 if level < 0 or level > 2 or level < letters_dynamic.get(key, 0):
135 return
136
137 letters_dynamic[key] = level
138
139 if letters_blocked.has(key):
140 letters_blocked.erase(key)
141
142 update_unlocks()
143 save()
144
145
146func put_in_keyholder(key, map, kh_path):
147 if not keyholder_state.has(map):
148 keyholder_state[map] = {}
149
150 keyholder_state[map][kh_path] = key
151 letters_in_keyholders.append(key)
152
153 get_tree().get_root().get_node("scene").get_node(kh_path).setFromAp(
154 key, min(letters_saved.get(key, 0) + letters_dynamic.get(key, 0), 2)
155 )
156
157 update_unlocks()
158 save()
159
160
161func remove_from_keyholder(key, map, kh_path):
162 if not keyholder_state.has(map):
163 # This... shouldn't happen.
164 keyholder_state[map] = {}
165
166 keyholder_state[map].erase(kh_path)
167 letters_in_keyholders.erase(key)
168
169 get_tree().get_root().get_node("scene").get_node(kh_path).setFromAp(key, 0)
170
171 update_unlocks()
172 save()
173
174
175func block_letter(key):
176 if not letters_blocked.has(key):
177 letters_blocked.append(key)
178
179 update_unlocks()
180
181
182func load_keyholders(map):
183 if keyholder_state.has(map):
184 var khs = keyholder_state[map]
185
186 for path in khs.keys():
187 var key = khs[path]
188 get_tree().get_root().get_node("scene").get_node(path).setFromAp(
189 key, min(letters_saved.get(key, 0) + letters_dynamic.get(key, 0), 2)
190 )
191
192
193func reset_keyholders():
194 var cleared_anything = not letters_in_keyholders.is_empty() or not letters_blocked.is_empty()
195
196 if keyholder_state.has(global.map):
197 for path in keyholder_state[global.map]:
198 get_tree().get_root().get_node("scene").get_node(path).setFromAp(
199 keyholder_state[global.map][path], 0
200 )
201
202 keyholder_state.clear()
203 letters_in_keyholders.clear()
204 letters_blocked.clear()
205
206 update_unlocks()
207 save()
208
209 return cleared_anything
210
211
212func remote_keyboard_updated(updates):
213 var reverse = {}
214 var should_update = false
215
216 for k in updates:
217 if not letters_saved.has(k) or updates[k] > letters_saved[k]:
218 letters_saved[k] = updates[k]
219 should_update = true
220 elif updates[k] < letters_saved[k]:
221 reverse[k] = letters_saved[k]
222
223 if should_update:
224 update_unlocks()
225
226 if not reverse.is_empty():
227 var ap = global.get_node("Archipelago")
228 ap.client.updateKeyboard(reverse)
diff --git a/apworld/client/locationListener.gd b/apworld/client/locationListener.gd new file mode 100644 index 0000000..71792ed --- /dev/null +++ b/apworld/client/locationListener.gd
@@ -0,0 +1,20 @@
1extends Receiver
2
3var location_id
4
5
6func _ready():
7 super._ready()
8
9
10func handleTriggered():
11 triggered += 1
12 if triggered >= total:
13 var ap = global.get_node("Archipelago")
14 ap.send_location(location_id)
15
16
17func handleUntriggered():
18 triggered -= 1
19 if triggered < total:
20 pass
diff --git a/apworld/client/main.gd b/apworld/client/main.gd new file mode 100644 index 0000000..c90d6e7 --- /dev/null +++ b/apworld/client/main.gd
@@ -0,0 +1,308 @@
1extends Node
2
3
4func _ready():
5 var runtime = global.get_node("Runtime")
6
7 # Some helpful logging.
8 if Steam.isSubscribed():
9 global._print("Provisioning successful! Build ID: %d" % Steam.getAppBuildId())
10 else:
11 global._print("Provisioning failed.")
12
13 # Undo the load screen removing our cursor
14 get_tree().get_root().set_disable_input(false)
15 Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
16
17 # Increase the WebSocket input buffer size so that we can download large
18 # data packages.
19 ProjectSettings.set_setting("network/limits/websocket_client/max_in_buffer_kb", 8192)
20
21 switcher.layer = 4
22
23 # Create the global AP manager, if it doesn't already exist.
24 if not global.has_node("Archipelago"):
25 var ap_script = runtime.load_script("manager.gd")
26 var ap_instance = ap_script.new()
27 ap_instance.name = "Archipelago"
28
29 ap_instance.SCRIPT_client = runtime.load_script("client.gd")
30 ap_instance.SCRIPT_keyboard = runtime.load_script("keyboard.gd")
31 ap_instance.SCRIPT_locationListener = runtime.load_script("locationListener.gd")
32 ap_instance.SCRIPT_minimap = runtime.load_script("minimap.gd")
33 ap_instance.SCRIPT_victoryListener = runtime.load_script("victoryListener.gd")
34 ap_instance.SCRIPT_websocketserver = runtime.load_script("vendor/WebSocketServer.gd")
35
36 global.add_child(ap_instance)
37
38 # Let's also inject any scripts we need to inject now.
39 installScriptExtension(runtime.load_script("allowNumbers.gd"))
40 installScriptExtension(runtime.load_script("animationListener.gd"))
41 installScriptExtension(runtime.load_script("collectable.gd"))
42 installScriptExtension(runtime.load_script("door.gd"))
43 installScriptExtension(runtime.load_script("keyHolder.gd"))
44 installScriptExtension(runtime.load_script("keyHolderChecker.gd"))
45 installScriptExtension(runtime.load_script("keyHolderResetterListener.gd"))
46 installScriptExtension(runtime.load_script("painting.gd"))
47 installScriptExtension(runtime.load_script("paintingAuto.gd"))
48 installScriptExtension(runtime.load_script("panel.gd"))
49 installScriptExtension(runtime.load_script("pauseMenu.gd"))
50 installScriptExtension(runtime.load_script("player.gd"))
51 installScriptExtension(runtime.load_script("saver.gd"))
52 installScriptExtension(runtime.load_script("teleport.gd"))
53 installScriptExtension(runtime.load_script("teleportListener.gd"))
54 installScriptExtension(runtime.load_script("unlockReaderListener.gd"))
55 installScriptExtension(runtime.load_script("visibilityListener.gd"))
56 installScriptExtension(runtime.load_script("worldport.gd"))
57 installScriptExtension(runtime.load_script("worldportListener.gd"))
58
59 var proto_script = runtime.load_script("../generated/proto.gd")
60 var gamedata_script = runtime.load_script("gamedata.gd")
61 var gamedata_instance = gamedata_script.new(proto_script)
62 gamedata_instance.load(runtime.read_path("../generated/data.binpb"))
63 gamedata_instance.name = "Gamedata"
64 global.add_child(gamedata_instance)
65
66 var messages_script = runtime.load_script("messages.gd")
67 var messages_instance = messages_script.new()
68 messages_instance.name = "Messages"
69 messages_instance.SCRIPT_rainbowText = runtime.load_script("rainbowText.gd")
70 global.add_child(messages_instance)
71
72 var effects_script = runtime.load_script("effects.gd")
73 var effects_instance = effects_script.new()
74 effects_instance.name = "Effects"
75 global.add_child(effects_instance)
76
77 var textclient_script = runtime.load_script("textclient.gd")
78 var textclient_instance = textclient_script.new()
79 textclient_instance.name = "Textclient"
80 global.add_child(textclient_instance)
81
82 var compass_overlay_script = runtime.load_script("compass_overlay.gd")
83 var compass_overlay_instance = compass_overlay_script.new()
84 compass_overlay_instance.name = "Compass"
85 compass_overlay_instance.SCRIPT_compass = runtime.load_script("compass.gd")
86 global.add_child(compass_overlay_instance)
87
88 unlocks.data["advanced_mastery"] = ""
89 unlocks.data["charismatic_mastery"] = ""
90 unlocks.data["crystalline_mastery"] = ""
91 unlocks.data["fuzzy_mastery"] = ""
92 unlocks.data["icarus_mastery"] = ""
93 unlocks.data["stellar_mastery"] = ""
94
95 var ap = global.get_node("Archipelago")
96 var gamedata = global.get_node("Gamedata")
97 ap.ap_connected.connect(connectionSuccessful)
98 ap.could_not_connect.connect(connectionUnsuccessful)
99 ap.connect_status.connect(connectionStatus)
100
101 # Populate textboxes with AP settings.
102 get_node("../Panel/server_box").text = ap.ap_server
103 get_node("../Panel/player_box").text = ap.ap_user
104 get_node("../Panel/password_box").text = ap.ap_pass
105
106 var history_box = get_node("../Panel/connection_history")
107 if ap.connection_history.is_empty():
108 history_box.disabled = true
109 else:
110 history_box.disabled = false
111
112 var i = 0
113 for details in ap.connection_history:
114 history_box.get_popup().add_item("%s (%s)" % [details[1], details[0]], i)
115 i += 1
116
117 history_box.get_popup().id_pressed.connect(historySelected)
118
119 # Show client version.
120 var version = gamedata.objects.get_version()
121 get_node("../Panel/title").text = (
122 "ARCHIPELAGO (%d.%d.%d)" % [version.get_major(), version.get_minor(), version.get_patch()]
123 )
124
125 # Increase font size in text boxes.
126 get_node("../Panel/server_box").add_theme_font_size_override("font_size", 36)
127 get_node("../Panel/player_box").add_theme_font_size_override("font_size", 36)
128 get_node("../Panel/password_box").add_theme_font_size_override("font_size", 36)
129
130 # Set up version mismatch dialog.
131 get_node("../Panel/VersionMismatch").confirmed.connect(startGame)
132 get_node("../Panel/VersionMismatch").get_cancel_button().pressed.connect(
133 versionMismatchDeclined
134 )
135
136 # Set up buttons.
137 get_node("../Panel/connect_button").pressed.connect(_connect_pressed)
138 get_node("../Panel/quit_button").pressed.connect(_back_pressed)
139
140
141func _connect_pressed():
142 get_node("../Panel/connect_button").disabled = true
143
144 var ap = global.get_node("Archipelago")
145 ap.ap_server = get_node("../Panel/server_box").text
146 ap.ap_user = get_node("../Panel/player_box").text
147 ap.ap_pass = get_node("../Panel/password_box").text
148 ap.saveSettings()
149
150 ap.connectToServer()
151
152
153func _back_pressed():
154 var ap = global.get_node("Archipelago")
155 ap.disconnect_from_ap()
156 ap.client.sendQuit()
157
158 get_tree().quit()
159
160
161# Adapted from https://gitlab.com/Delta-V-Modding/Mods/-/blob/main/game/ModLoader.gd
162func installScriptExtension(childScript: Resource):
163 # Force Godot to compile the script now.
164 # We need to do this here to ensure that the inheritance chain is
165 # properly set up, and multiple mods can chain-extend the same
166 # class multiple times.
167 # This is also needed to make Godot instantiate the extended class
168 # when creating singletons.
169 # The actual instance is thrown away.
170 childScript.new()
171
172 var parentScript = childScript.get_base_script()
173 var parentScriptPath = parentScript.resource_path
174 global._print("ModLoader: Installing script extension over %s" % parentScriptPath)
175 childScript.take_over_path(parentScriptPath)
176
177
178func connectionStatus(message):
179 var popup = get_node("../Panel/AcceptDialog")
180 popup.title = "Connecting to Archipelago"
181 popup.dialog_text = message
182 popup.exclusive = true
183 popup.get_ok_button().visible = false
184 popup.popup_centered()
185
186
187func connectionSuccessful():
188 var ap = global.get_node("Archipelago")
189 var gamedata = global.get_node("Gamedata")
190
191 # Check for major version mismatch.
192 if ap.apworld_version[0] != gamedata.objects.get_version().get_major():
193 get_node("../Panel/AcceptDialog").exclusive = false
194
195 var popup = get_node("../Panel/VersionMismatch")
196 popup.title = "Version Mismatch!"
197 popup.dialog_text = (
198 "This slot was generated using v%d.%d.%d of the Lingo 2 apworld,\nwhich has a different major version than this client (v%d.%d.%d).\nIt is highly recommended to play using the correct version of the client.\nYou may experience bugs or logic issues if you continue."
199 % [
200 ap.apworld_version[0],
201 ap.apworld_version[1],
202 ap.apworld_version[2],
203 gamedata.objects.get_version().get_major(),
204 gamedata.objects.get_version().get_minor(),
205 gamedata.objects.get_version().get_patch()
206 ]
207 )
208 popup.exclusive = true
209 popup.popup_centered()
210
211 return
212
213 startGame()
214
215
216func startGame():
217 var ap = global.get_node("Archipelago")
218
219 # Save connection details
220 var connection_details = [ap.ap_server, ap.ap_user, ap.ap_pass]
221 if ap.connection_history.has(connection_details):
222 ap.connection_history.erase(connection_details)
223 ap.connection_history.push_front(connection_details)
224 if ap.connection_history.size() > 10:
225 ap.connection_history.resize(10)
226 ap.saveSettings()
227
228 # Switch to the_entry
229 Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
230 global.user = ap.getSaveFileName()
231 global.universe = "lingo"
232 global.map = "the_entry"
233
234 unlocks.resetCollectables()
235 unlocks.resetData()
236 unlocks.loadCollectables()
237 unlocks.loadData()
238
239 ap.setup_keys()
240
241 unlocks.unlockKey("capslock", 1)
242
243 if ap.shuffle_worldports:
244 settings.worldport_fades = "default"
245 else:
246 settings.worldport_fades = "never"
247
248 clearResourceCache("res://objects/meshes/gridDoor.tscn")
249 clearResourceCache("res://objects/nodes/allowNumbers.tscn")
250 clearResourceCache("res://objects/nodes/collectable.tscn")
251 clearResourceCache("res://objects/nodes/door.tscn")
252 clearResourceCache("res://objects/nodes/keyHolder.tscn")
253 clearResourceCache("res://objects/nodes/listeners/animationListener.tscn")
254 clearResourceCache("res://objects/nodes/listeners/keyHolderChecker.tscn")
255 clearResourceCache("res://objects/nodes/listeners/keyHolderResetterListener.tscn")
256 clearResourceCache("res://objects/nodes/listeners/teleportListener.tscn")
257 clearResourceCache("res://objects/nodes/listeners/unlockReaderListener.tscn")
258 clearResourceCache("res://objects/nodes/listeners/visibilityListener.tscn")
259 clearResourceCache("res://objects/nodes/listeners/worldportListener.tscn")
260 clearResourceCache("res://objects/nodes/panel.tscn")
261 clearResourceCache("res://objects/nodes/player.tscn")
262 clearResourceCache("res://objects/nodes/saver.tscn")
263 clearResourceCache("res://objects/nodes/teleport.tscn")
264 clearResourceCache("res://objects/nodes/worldport.tscn")
265 clearResourceCache("res://objects/scenes/menus/pause_menu.tscn")
266
267 var paintings_dir = DirAccess.open("res://objects/meshes/paintings")
268 if paintings_dir:
269 paintings_dir.list_dir_begin()
270 var file_name = paintings_dir.get_next()
271 while file_name != "":
272 if not paintings_dir.current_is_dir() and file_name.ends_with(".tscn"):
273 clearResourceCache("res://objects/meshes/paintings/" + file_name)
274 file_name = paintings_dir.get_next()
275
276 switcher.switch_map.call_deferred("res://objects/scenes/the_entry.tscn")
277
278
279func connectionUnsuccessful(error_message):
280 get_node("../Panel/connect_button").disabled = false
281
282 var popup = get_node("../Panel/AcceptDialog")
283 popup.title = "Could not connect to Archipelago"
284 popup.dialog_text = error_message
285 popup.exclusive = true
286 popup.get_ok_button().visible = true
287 popup.popup_centered()
288
289
290func versionMismatchDeclined():
291 get_node("../Panel/AcceptDialog").hide()
292 get_node("../Panel/connect_button").disabled = false
293
294 var ap = global.get_node("Archipelago")
295 ap.disconnect_from_ap()
296
297
298func historySelected(index):
299 var ap = global.get_node("Archipelago")
300 var details = ap.connection_history[index]
301
302 get_node("../Panel/server_box").text = details[0]
303 get_node("../Panel/player_box").text = details[1]
304 get_node("../Panel/password_box").text = details[2]
305
306
307func clearResourceCache(path):
308 ResourceLoader.load(path, "", ResourceLoader.CACHE_MODE_REPLACE)
diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd new file mode 100644 index 0000000..8c981f9 --- /dev/null +++ b/apworld/client/manager.gd
@@ -0,0 +1,717 @@
1extends Node
2
3var SCRIPT_client
4var SCRIPT_keyboard
5var SCRIPT_locationListener
6var SCRIPT_minimap
7var SCRIPT_victoryListener
8var SCRIPT_websocketserver
9
10var ap_server = ""
11var ap_user = ""
12var ap_pass = ""
13var connection_history = []
14var show_compass = false
15var show_locations = false
16var show_minimap = false
17
18var client
19var keyboard
20
21var _localdata_file = ""
22var _last_new_item = -1
23var _batch_locations = false
24var _held_locations = []
25var _held_location_scouts = []
26var _location_scouts = {}
27var _item_locks = {}
28var _inverse_item_locks = {}
29var _held_letters = {}
30var _letters_setup = false
31var _already_connected = false
32var _ignored_locations = []
33var _map_scripts = {}
34
35const kSHUFFLE_LETTERS_VANILLA = 0
36const kSHUFFLE_LETTERS_UNLOCKED = 1
37const kSHUFFLE_LETTERS_PROGRESSIVE = 2
38const kSHUFFLE_LETTERS_VANILLA_CYAN = 3
39const kSHUFFLE_LETTERS_ITEM_CYAN = 4
40
41const kLETTER_BEHAVIOR_VANILLA = 0
42const kLETTER_BEHAVIOR_ITEM = 1
43const kLETTER_BEHAVIOR_UNLOCKED = 2
44
45const kCYAN_DOOR_BEHAVIOR_H2 = 0
46const kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER = 1
47const kCYAN_DOOR_BEHAVIOR_ITEM = 2
48
49const kEndingNameByVictoryValue = {
50 0: "GRAY",
51 1: "PURPLE",
52 2: "MINT",
53 3: "BLACK",
54 4: "BLUE",
55 5: "CYAN",
56 6: "RED",
57 7: "PLUM",
58 8: "ORANGE",
59 9: "GOLD",
60 10: "YELLOW",
61 11: "GREEN",
62 12: "WHITE",
63}
64
65var apworld_version = [0, 0, 0]
66var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2
67var daedalus_roof_access = false
68var enable_gift_maps = []
69var enable_icarus = false
70var endings_requirement = 0
71var keyholder_sanity = false
72var masteries_requirement = 0
73var port_pairings = {}
74var shuffle_control_center_colors = false
75var shuffle_doors = false
76var shuffle_gallery_paintings = false
77var shuffle_letters = kSHUFFLE_LETTERS_VANILLA
78var shuffle_symbols = false
79var shuffle_worldports = false
80var strict_cyan_ending = false
81var strict_purple_ending = false
82var victory_condition = -1
83
84var color_by_material_path = {}
85
86signal could_not_connect
87signal connect_status
88signal ap_connected
89
90
91func _init():
92 # Read AP settings from file, if there are any
93 if FileAccess.file_exists("user://ap_settings"):
94 var file = FileAccess.open("user://ap_settings", FileAccess.READ)
95 var data = file.get_var(true)
96 file.close()
97
98 if typeof(data) != TYPE_ARRAY:
99 global._print("AP settings file is corrupted")
100 data = []
101
102 if data.size() > 0:
103 ap_server = data[0]
104
105 if data.size() > 1:
106 ap_user = data[1]
107
108 if data.size() > 2:
109 ap_pass = data[2]
110
111 if data.size() > 3:
112 connection_history = data[3]
113
114 if data.size() > 4:
115 show_compass = data[4]
116
117 if data.size() > 5:
118 show_locations = data[5]
119
120 if data.size() > 6:
121 show_minimap = data[6]
122
123 # We need to create a mapping from material paths to the original colors of
124 # those materials. We force reload the materials, overwriting any custom
125 # textures, and create the mapping. We then reload the textures in case the
126 # player had a custom one enabled.
127 var directory = DirAccess.open("res://assets/materials")
128 for material_name in directory.get_files():
129 var material = ResourceLoader.load(
130 "res://assets/materials/" + material_name, "", ResourceLoader.CACHE_MODE_REPLACE
131 )
132
133 color_by_material_path[material.resource_path] = Color(material.albedo_color)
134
135 settings.load_user_textures()
136
137
138func _ready():
139 client = SCRIPT_client.new()
140 client.SCRIPT_websocketserver = SCRIPT_websocketserver
141
142 client.item_received.connect(_process_item)
143 client.location_scout_received.connect(_process_location_scout)
144 client.text_message_received.connect(_process_text_message)
145 client.item_sent_notification.connect(_process_item_sent_notification)
146 client.hint_received.connect(_process_hint_received)
147 client.accessible_locations_updated.connect(_on_accessible_locations_updated)
148 client.checked_locations_updated.connect(_on_checked_locations_updated)
149 client.ignored_locations_updated.connect(_on_ignored_locations_updated)
150 client.hinted_locations_updated.connect(_on_hinted_locations_updated)
151 client.checked_worldports_updated.connect(_on_checked_worldports_updated)
152 client.door_latched.connect(_on_door_latched)
153
154 client.could_not_connect.connect(_client_could_not_connect)
155 client.connect_status.connect(_client_connect_status)
156 client.client_connected.connect(_client_connected)
157
158 add_child(client)
159
160 keyboard = SCRIPT_keyboard.new()
161 add_child(keyboard)
162 client.keyboard_update_received.connect(keyboard.remote_keyboard_updated)
163
164
165func saveSettings():
166 # Save the AP settings to disk.
167 var path = "user://ap_settings"
168 var file = FileAccess.open(path, FileAccess.WRITE)
169
170 var data = [
171 ap_server,
172 ap_user,
173 ap_pass,
174 connection_history,
175 show_compass,
176 show_locations,
177 show_minimap,
178 ]
179 file.store_var(data, true)
180 file.close()
181
182
183func saveLocaldata():
184 # Save the MW/slot specific settings to disk.
185 var dir = DirAccess.open("user://")
186 var folder = "archipelago_data"
187 if not dir.dir_exists(folder):
188 dir.make_dir(folder)
189
190 var file = FileAccess.open(_localdata_file, FileAccess.WRITE)
191
192 var data = [
193 _last_new_item,
194 ]
195 file.store_var(data, true)
196 file.close()
197
198
199func connectToServer():
200 _last_new_item = -1
201 _batch_locations = false
202 _held_locations = []
203 _held_location_scouts = []
204 _location_scouts = {}
205 _letters_setup = false
206 _held_letters = {}
207 _already_connected = false
208
209 client.connectToServer(ap_server, ap_user, ap_pass)
210
211
212func getSaveFileName():
213 return "zzAP_%s_%d" % [client._seed, client._slot]
214
215
216func disconnect_from_ap():
217 _already_connected = false
218
219 var effects = global.get_node("Effects")
220 effects.set_connection_lost(false)
221
222 client.disconnect_from_ap()
223
224
225func get_item_id_for_door(door_id):
226 return _item_locks.get(door_id, null)
227
228
229func _process_item(item, amount):
230 var gamedata = global.get_node("Gamedata")
231
232 var item_id = int(item["id"])
233 var prog_id = null
234 if _inverse_item_locks.has(item_id):
235 for lock in _inverse_item_locks.get(item_id):
236 if lock[1] != amount:
237 continue
238
239 if gamedata.progressive_id_by_ap_id.has(item_id):
240 prog_id = lock[0]
241
242 if gamedata.get_door_map_name(lock[0]) != global.map:
243 continue
244
245 # TODO: fix doors opening from door groups
246 var receivers = gamedata.get_door_receivers(lock[0])
247 var scene = get_tree().get_root().get_node_or_null("scene")
248 if scene != null:
249 for receiver in receivers:
250 var rnode = scene.get_node_or_null(receiver)
251 if rnode != null:
252 rnode.handleTriggered()
253
254 var letter_id = gamedata.letter_id_by_ap_id.get(item_id, null)
255 if letter_id != null:
256 var letter = gamedata.objects.get_letters()[letter_id]
257 if not letter.has_level2() or not letter.get_level2():
258 _process_key_item(letter.get_key(), amount)
259
260 if gamedata.symbol_item_ids.has(item_id):
261 var player = get_tree().get_root().get_node_or_null("scene/player")
262 if player != null:
263 player.evaluate_solvability.emit()
264
265 if item_id == gamedata.objects.get_special_ids()["A Job Well Done"]:
266 update_job_well_done_sign()
267
268 if item_id == gamedata.objects.get_special_ids()["Numbers"] and global.map == "the_fuzzy":
269 global.allow_numbers = true
270
271 # Show a message about the item if it's new.
272 if int(item["index"]) > _last_new_item:
273 _last_new_item = int(item["index"])
274 saveLocaldata()
275
276 var full_item_name = item["text"]
277 if prog_id != null:
278 var door = gamedata.objects.get_doors()[prog_id]
279 full_item_name = "%s (%s)" % [full_item_name, door.get_name()]
280
281 var message
282 if "sender" in item:
283 message = (
284 "Received %s from %s"
285 % [wrapInItemColorTags(full_item_name, item["flags"]), item["sender"]]
286 )
287 else:
288 message = "Found %s" % wrapInItemColorTags(full_item_name, item["flags"])
289
290 if gamedata.anti_trap_ids.has(item):
291 keyboard.block_letter(gamedata.anti_trap_ids[item])
292
293 global._print(message)
294
295 global.get_node("Messages").showMessage(message)
296
297
298func _process_item_sent_notification(message):
299 var sentMsg = (
300 "Sent %s to %s"
301 % [
302 wrapInItemColorTags(message["item_name"], message["item_flags"]),
303 message["receiver_name"]
304 ]
305 )
306 #if _hinted_locations.has(message["item"]["location"]):
307 # sentMsg += " ([color=#fafad2]Hinted![/color])"
308 global.get_node("Messages").showMessage(sentMsg)
309
310
311func _process_hint_received(message):
312 var is_for = ""
313 if message["self"] == 0:
314 is_for = " for %s" % message["receiver_name"]
315
316 global.get_node("Messages").showMessage(
317 (
318 "Hint: %s%s is on %s"
319 % [
320 wrapInItemColorTags(message["item_name"], message["item_flags"]),
321 is_for,
322 message["location_name"]
323 ]
324 )
325 )
326
327
328func _process_text_message(message):
329 var parts = []
330 for message_part in message:
331 if message_part["type"] == "text":
332 parts.append(message_part["text"])
333 elif message_part["type"] == "player":
334 if message_part["self"] == 1:
335 parts.append("[color=#ee00ee]%s[/color]" % message_part["text"])
336 else:
337 parts.append("[color=#fafad2]%s[/color]" % message_part["text"])
338 elif message_part["type"] == "item":
339 parts.append(wrapInItemColorTags(message_part["text"], int(message_part["flags"])))
340 elif message_part["type"] == "location":
341 parts.append("[color=#00ff7f]%s[/color]" % message_part["text"])
342
343 var textclient_node = global.get_node("Textclient")
344 if textclient_node != null:
345 textclient_node.parse_printjson("".join(parts))
346
347
348func _process_location_scout(location_id, item_name, player_name, flags, for_self):
349 _location_scouts[location_id] = {
350 "item": item_name, "player": player_name, "flags": flags, "for_self": for_self
351 }
352
353 if for_self and flags & 4 != 0:
354 # This is a trap for us, so let's not display it.
355 return
356
357 var gamedata = global.get_node("Gamedata")
358 var map_id = gamedata.map_id_by_name.get(global.map)
359
360 var letter_id = gamedata.letter_id_by_ap_id.get(location_id, null)
361 if letter_id != null:
362 var letter = gamedata.objects.get_letters()[letter_id]
363 var room = gamedata.objects.get_rooms()[letter.get_room_id()]
364 if room.get_map_id() == map_id:
365 var collectable = get_tree().get_root().get_node("scene").get_node_or_null(
366 letter.get_path()
367 )
368 if collectable != null:
369 collectable.setScoutedText(item_name)
370
371
372func _on_accessible_locations_updated():
373 var textclient_node = global.get_node("Textclient")
374 if textclient_node != null:
375 textclient_node.update_locations()
376
377
378func _on_checked_locations_updated():
379 var textclient_node = global.get_node("Textclient")
380 if textclient_node != null:
381 textclient_node.update_locations(false)
382
383
384func _on_checked_worldports_updated():
385 var textclient_node = global.get_node("Textclient")
386 if textclient_node != null:
387 textclient_node.update_locations()
388 textclient_node.update_worldports()
389
390
391func _on_ignored_locations_updated(locations):
392 _ignored_locations = locations
393
394 var textclient_node = global.get_node("Textclient")
395 if textclient_node != null:
396 textclient_node.update_locations()
397
398
399func _on_hinted_locations_updated():
400 var textclient_node = global.get_node("Textclient")
401 if textclient_node != null:
402 textclient_node.update_locations()
403
404
405func _on_door_latched(door_id):
406 var gamedata = global.get_node("Gamedata")
407 if gamedata.get_door_map_name(door_id) != global.map:
408 return
409
410 var receivers = gamedata.get_door_receivers(door_id)
411 var scene = get_tree().get_root().get_node_or_null("scene")
412 if scene != null:
413 for receiver in receivers:
414 var rnode = scene.get_node_or_null(receiver)
415 if rnode != null:
416 rnode.handleTriggered()
417
418
419func _client_could_not_connect(message):
420 could_not_connect.emit(message)
421
422 if global.loaded:
423 var effects = global.get_node("Effects")
424 effects.set_connection_lost(true)
425
426 var messages = global.get_node("Messages")
427 messages.showMessage("Connection to multiworld lost.")
428
429
430func _client_connect_status(message):
431 connect_status.emit(message)
432
433
434func _client_connected(slot_data):
435 var effects = global.get_node("Effects")
436 effects.set_connection_lost(false)
437
438 if _already_connected:
439 var messages = global.get_node("Messages")
440 messages.showMessage("Reconnected to multiworld!")
441 return
442
443 _already_connected = true
444
445 var gamedata = global.get_node("Gamedata")
446
447 _localdata_file = "user://archipelago_data/%s_%d" % [client._seed, client._slot]
448 _last_new_item = -1
449
450 if FileAccess.file_exists(_localdata_file):
451 var ap_file = FileAccess.open(_localdata_file, FileAccess.READ)
452 var localdata = []
453 if ap_file != null:
454 localdata = ap_file.get_var(true)
455 ap_file.close()
456
457 if typeof(localdata) != TYPE_ARRAY:
458 print("AP localdata file is corrupted")
459 localdata = []
460
461 if localdata.size() > 0:
462 _last_new_item = localdata[0]
463
464 # Read slot data.
465 cyan_door_behavior = int(slot_data.get("cyan_door_behavior", 0))
466 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false))
467 enable_gift_maps = slot_data.get("enable_gift_maps", [])
468 enable_icarus = bool(slot_data.get("enable_icarus", false))
469 endings_requirement = int(slot_data.get("endings_requirement", 0))
470 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false))
471 masteries_requirement = int(slot_data.get("masteries_requirement", 0))
472 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false))
473 shuffle_doors = bool(slot_data.get("shuffle_doors", false))
474 shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false))
475 shuffle_letters = int(slot_data.get("shuffle_letters", 0))
476 shuffle_symbols = bool(slot_data.get("shuffle_symbols", false))
477 shuffle_worldports = bool(slot_data.get("shuffle_worldports", false))
478 strict_cyan_ending = bool(slot_data.get("strict_cyan_ending", false))
479 strict_purple_ending = bool(slot_data.get("strict_purple_ending", false))
480 victory_condition = int(slot_data.get("victory_condition", 0))
481
482 if slot_data.has("version"):
483 var version_msg = slot_data["version"]
484 apworld_version = [int(version_msg[0]), int(version_msg[1]), 0]
485 if version_msg.size() > 2:
486 apworld_version[2] = int(version_msg[2])
487
488 port_pairings.clear()
489 if slot_data.has("port_pairings"):
490 var raw_pp = slot_data.get("port_pairings")
491
492 for p1 in raw_pp.keys():
493 port_pairings[gamedata.port_id_by_ap_id[int(p1)]] = gamedata.port_id_by_ap_id[int(
494 raw_pp[p1]
495 )]
496
497 # Set up item locks.
498 _item_locks = {}
499
500 if shuffle_doors:
501 for door in gamedata.objects.get_doors():
502 if (
503 door.get_type() == gamedata.SCRIPT_proto.DoorType.STANDARD
504 or door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY
505 ):
506 _item_locks[door.get_id()] = [door.get_ap_id(), 1]
507
508 for progressive in gamedata.objects.get_progressives():
509 for i in range(0, progressive.get_doors().size()):
510 var door = gamedata.objects.get_doors()[progressive.get_doors()[i]]
511 _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1]
512
513 for door_group in gamedata.objects.get_door_groups():
514 if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CONNECTOR:
515 if shuffle_worldports:
516 continue
517 elif door_group.get_type() != gamedata.SCRIPT_proto.DoorGroupType.SHUFFLE_GROUP:
518 continue
519
520 for door in door_group.get_doors():
521 _item_locks[door] = [door_group.get_ap_id(), 1]
522
523 if shuffle_control_center_colors:
524 for door in gamedata.objects.get_doors():
525 if door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR:
526 _item_locks[door.get_id()] = [door.get_ap_id(), 1]
527
528 for door_group in gamedata.objects.get_door_groups():
529 if (
530 door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.COLOR_CONNECTOR
531 and not shuffle_worldports
532 ):
533 for door in door_group.get_doors():
534 _item_locks[door] = [door_group.get_ap_id(), 1]
535
536 if shuffle_gallery_paintings:
537 for door in gamedata.objects.get_doors():
538 if door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING:
539 _item_locks[door.get_id()] = [door.get_ap_id(), 1]
540
541 if cyan_door_behavior == kCYAN_DOOR_BEHAVIOR_ITEM:
542 for door_group in gamedata.objects.get_door_groups():
543 if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CYAN_DOORS:
544 for door in door_group.get_doors():
545 if not _item_locks.has(door):
546 _item_locks[door] = [door_group.get_ap_id(), 1]
547
548 # Create a reverse item locks map for processing items.
549 _inverse_item_locks = {}
550
551 for door_id in _item_locks.keys():
552 var lock = _item_locks.get(door_id)
553
554 if not _inverse_item_locks.has(lock[0]):
555 _inverse_item_locks[lock[0]] = []
556
557 _inverse_item_locks[lock[0]].append([door_id, lock[1]])
558
559 if shuffle_worldports:
560 var textclient = global.get_node("Textclient")
561 textclient.setup_worldports()
562
563 ap_connected.emit()
564
565
566func start_batching_locations():
567 _batch_locations = true
568
569
570func send_location(loc_id):
571 if client._checked_locations.has(loc_id):
572 return
573
574 if _batch_locations:
575 _held_locations.append(loc_id)
576 else:
577 client.sendLocation(loc_id)
578
579
580func scout_location(loc_id):
581 if _location_scouts.has(loc_id):
582 return _location_scouts.get(loc_id)
583
584 if _batch_locations:
585 _held_location_scouts.append(loc_id)
586 else:
587 client.scoutLocation(loc_id)
588
589 return null
590
591
592func stop_batching_locations():
593 _batch_locations = false
594
595 if not _held_locations.is_empty():
596 client.sendLocations(_held_locations)
597 _held_locations.clear()
598
599 if not _held_location_scouts.is_empty():
600 client.scoutLocations(_held_location_scouts)
601 _held_location_scouts.clear()
602
603
604func colorForItemType(flags):
605 var int_flags = int(flags)
606 if int_flags & 1: # progression
607 if int_flags & 2: # proguseful
608 return "#f0d200"
609 else:
610 return "#bc51e0"
611 elif int_flags & 2: # useful
612 return "#2b67ff"
613 elif int_flags & 4: # trap
614 return "#d63a22"
615 else: # filler
616 return "#14de9e"
617
618
619func wrapInItemColorTags(text, flags):
620 var int_flags = int(flags)
621 if int_flags & 1 and int_flags & 2: # proguseful
622 return "[rainbow]%s[/rainbow]" % text
623 else:
624 return "[color=%s]%s[/color]" % [colorForItemType(flags), text]
625
626
627func get_letter_behavior(key, level2):
628 if shuffle_letters == kSHUFFLE_LETTERS_UNLOCKED:
629 return kLETTER_BEHAVIOR_UNLOCKED
630
631 if [kSHUFFLE_LETTERS_VANILLA_CYAN, kSHUFFLE_LETTERS_ITEM_CYAN].has(shuffle_letters):
632 if level2:
633 if shuffle_letters == kSHUFFLE_LETTERS_VANILLA_CYAN:
634 return kLETTER_BEHAVIOR_VANILLA
635 else:
636 return kLETTER_BEHAVIOR_ITEM
637 else:
638 return kLETTER_BEHAVIOR_UNLOCKED
639
640 if not level2 and ["h", "i", "n", "t"].has(key):
641 # This differs from the equivalent function in the apworld. Logically it is
642 # the same as UNLOCKED since they are in the starting room, but VANILLA
643 # means the player still has to actually pick up the letters.
644 return kLETTER_BEHAVIOR_VANILLA
645
646 if shuffle_letters == kSHUFFLE_LETTERS_PROGRESSIVE:
647 return kLETTER_BEHAVIOR_ITEM
648
649 return kLETTER_BEHAVIOR_VANILLA
650
651
652func setup_keys():
653 keyboard.load_seed()
654
655 _letters_setup = true
656
657 for k in _held_letters.keys():
658 _process_key_item(k, _held_letters[k])
659
660 _held_letters.clear()
661
662
663func _process_key_item(key, level):
664 if not _letters_setup:
665 _held_letters[key] = max(_held_letters.get(key, 0), level)
666 return
667
668 if shuffle_letters == kSHUFFLE_LETTERS_ITEM_CYAN:
669 level += 1
670
671 keyboard.collect_remote_letter(key, level)
672
673
674func update_job_well_done_sign():
675 if global.map != "daedalus":
676 return
677
678 var gamedata = global.get_node("Gamedata")
679 var job_item = gamedata.objects.get_special_ids()["A Job Well Done"]
680 var jobs_done = client.getItemAmount(job_item)
681
682 var sign2 = get_tree().get_root().get_node_or_null("scene/Meshes/Miscellaneous/sign2")
683 var sign3 = get_tree().get_root().get_node_or_null("scene/Meshes/Miscellaneous/sign3")
684
685 if sign2 != null and sign3 != null:
686 if jobs_done == 0:
687 sign2.text = "what are you doing"
688 sign3.text = "?"
689 elif jobs_done == 1:
690 sign2.text = "a job well done"
691 sign3.text = "is its own reward"
692 else:
693 sign2.text = "%d jobs well done" % jobs_done
694 sign3.text = "are their own reward"
695
696 sign2.get_node("MeshInstance3D").mesh.text = sign2.text
697 sign3.get_node("MeshInstance3D").mesh.text = sign3.text
698
699
700func toggle_ignored_location(loc_id):
701 if loc_id in _ignored_locations:
702 client.removeIgnoredLocation(loc_id)
703 else:
704 client.addIgnoredLocation(loc_id)
705
706
707func get_map_script(map_name):
708 if !_map_scripts.has(map_name):
709 var runtime = global.get_node("Runtime")
710 var script_path = "maps/%s.gd" % map_name
711 if runtime.path_exists(script_path):
712 var script = runtime.load_script(script_path)
713 _map_scripts[map_name] = script.new()
714 else:
715 _map_scripts[map_name] = null
716
717 return _map_scripts[map_name]
diff --git a/apworld/client/maps/control_center.gd b/apworld/client/maps/control_center.gd new file mode 100644 index 0000000..de9ae4b --- /dev/null +++ b/apworld/client/maps/control_center.gd
@@ -0,0 +1,85 @@
1func on_map_load(root):
2 var ap = global.get_node("Archipelago")
3
4 # Remove the door blocking the trophy case.
5 root.get_node("/root/scene/Components/Doors/entry_18").queue_free()
6
7 # Set up mastery listeners for extra maps.
8 _set_up_mastery_listener(root, "advanced")
9 _set_up_mastery_listener(root, "charismatic")
10 _set_up_mastery_listener(root, "crystalline")
11 _set_up_mastery_listener(root, "fuzzy")
12 _set_up_mastery_listener(root, "icarus")
13 _set_up_mastery_listener(root, "stellar")
14
15 if ap.endings_requirement != 12 or ap.masteries_requirement != 0:
16 # Set up listeners for the potential White Ending requirements.
17 var merging_prefab = preload("res://objects/nodes/listeners/mergingListener.tscn")
18
19 var old_door = root.get_node("/root/scene/Components/Doors/entry_19")
20 var new_door = old_door.duplicate()
21 new_door.name = "entry_19_new"
22 new_door.senders.clear()
23 new_door.senderGroup.clear()
24 new_door.excludeSenders.clear()
25
26 if ap.endings_requirement == 12:
27 new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners"))
28 elif ap.endings_requirement > 0:
29 if ap.masteries_requirement == 0:
30 new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners"))
31 new_door.complete_at = ap.endings_requirement
32 else:
33 var endings_merge = merging_prefab.instantiate()
34 endings_merge.name = "EndingsMerge"
35 endings_merge.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners"))
36 endings_merge.complete_at = ap.endings_requirement
37 root.get_node("/root/scene/Components").add_child.call_deferred(endings_merge)
38 new_door.senders.append(NodePath("/root/scene/Components/EndingsMerge"))
39
40 var max_masteries = 13 + ap.enable_gift_maps.size()
41 if ap.enable_icarus:
42 max_masteries += 1
43
44 if ap.masteries_requirement == max_masteries:
45 new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/MasteryListeners"))
46 new_door.excludeSenders.append(
47 NodePath("/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite")
48 )
49 elif ap.masteries_requirement > 0:
50 if ap.endings_requirement == 0:
51 new_door.senderGroup.append(
52 NodePath("/root/scene/Meshes/Trophies/MasteryListeners")
53 )
54 new_door.excludeSenders.append(
55 NodePath(
56 "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite"
57 )
58 )
59 new_door.complete_at = ap.masteries_requirement
60 else:
61 var masteries_merge = merging_prefab.instantiate()
62 masteries_merge.name = "MasteriesMerge"
63 masteries_merge.senderGroup.append(
64 NodePath("/root/scene/Meshes/Trophies/MasteryListeners")
65 )
66 masteries_merge.excludeSenders.append(
67 NodePath(
68 "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite"
69 )
70 )
71 masteries_merge.complete_at = ap.masteries_requirement
72 root.get_node("/root/scene/Components").add_child.call_deferred(masteries_merge)
73 new_door.senders.append(NodePath("/root/scene/Components/MasteriesMerge"))
74
75 old_door.queue_free()
76 root.get_node("/root/scene/Components/Doors").add_child.call_deferred(new_door)
77
78
79func _set_up_mastery_listener(root, name):
80 var prefab = preload("res://objects/nodes/listeners/unlockReaderListener.tscn")
81 var url = prefab.instantiate()
82 url.name = "unlockReaderListenerMastery_%s" % name
83 url.key = "%s_mastery" % name
84 url.value = "unlocked"
85 root.get_node("/root/scene/Meshes/Trophies/MasteryListeners").add_child.call_deferred(url)
diff --git a/apworld/client/maps/daedalus.gd b/apworld/client/maps/daedalus.gd new file mode 100644 index 0000000..5fcf7a5 --- /dev/null +++ b/apworld/client/maps/daedalus.gd
@@ -0,0 +1,85 @@
1func on_map_load(root):
2 var ap = global.get_node("Archipelago")
3
4 # Teleport the direction panels when the stairs are there.
5 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
6
7 var dir1 = root.get_node("/root/scene/Panels/Castle Entrance/castle_direction_1")
8 var dir1_tpl = tpl_prefab.instantiate()
9 dir1_tpl.target_path = dir1
10 dir1_tpl.teleport_point = Vector3(59.5, 8, -6.5)
11 dir1_tpl.teleport_rotate = Vector3(-45, 0, 0)
12 dir1_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_south"))
13 dir1_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_north"))
14 dir1_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_west"))
15 dir1.add_child.call_deferred(dir1_tpl)
16
17 var dir2 = root.get_node("/root/scene/Panels/Castle Entrance/castle_direction_2")
18 var dir2_tpl = tpl_prefab.instantiate()
19 dir2_tpl.target_path = dir2
20 dir2_tpl.teleport_point = Vector3(59.5, 8, 6.5)
21 dir2_tpl.teleport_rotate = Vector3(-45, -180, 0)
22 dir2_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_south"))
23 dir2_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_north"))
24 dir2_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_west"))
25 dir2.add_child.call_deferred(dir2_tpl)
26
27 var dir3 = root.get_node("/root/scene/Panels/Castle Entrance/castle_direction_3")
28 var dir3_tpl = tpl_prefab.instantiate()
29 dir3_tpl.target_path = dir3
30 dir3_tpl.teleport_point = Vector3(54, 8, 0)
31 dir3_tpl.teleport_rotate = Vector3(-45, 90, 0)
32 dir3_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_south"))
33 dir3_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_north"))
34 dir3_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_west"))
35 dir3.add_child.call_deferred(dir3_tpl)
36
37 # Block off roof access in Daedalus.
38 if not ap.daedalus_roof_access:
39 _set_up_invis_wall(root, 75.5, 11, -24.5, 1, 10, 49)
40 _set_up_invis_wall(root, 51.5, 11, -17, 16, 10, 1)
41 _set_up_invis_wall(root, 46, 10, -9.5, 1, 10, 10)
42 _set_up_invis_wall(root, 67.5, 11, 17, 16, 10, 1)
43 _set_up_invis_wall(root, 50.5, 11, 14, 10, 10, 1)
44 _set_up_invis_wall(root, 39, 10, 18.5, 1, 10, 22)
45 _set_up_invis_wall(root, 20, 15, 18.5, 1, 10, 16)
46 _set_up_invis_wall(root, 11.5, 15, 3, 32, 10, 1)
47 _set_up_invis_wall(root, 11.5, 16, -20, 14, 20, 1)
48 _set_up_invis_wall(root, 14, 16, -26.5, 1, 20, 4)
49 _set_up_invis_wall(root, 28.5, 20.5, -26.5, 1, 15, 25)
50 _set_up_invis_wall(root, 40.5, 20.5, -11, 30, 15, 1)
51 _set_up_invis_wall(root, 50.5, 15, 5.5, 7, 10, 1)
52 _set_up_invis_wall(root, 83.5, 33.5, 5.5, 1, 7, 11)
53 _set_up_invis_wall(root, 83.5, 33.5, -5.5, 1, 7, 11)
54
55 var warp_exit_prefab = preload("res://objects/nodes/exit.tscn")
56 var warp_exit = warp_exit_prefab.instantiate()
57 warp_exit.name = "roof_access_blocker_warp_exit"
58 warp_exit.position = Vector3(58, 10, 0)
59 warp_exit.rotation_degrees.y = 90
60 root.get_node("/root/scene").add_child.call_deferred(warp_exit)
61
62 var warp_enter_prefab = preload("res://objects/nodes/teleportAuto.tscn")
63 var warp_enter = warp_enter_prefab.instantiate()
64 warp_enter.target = warp_exit
65 warp_enter.position = Vector3(76.5, 30, 1)
66 warp_enter.scale = Vector3(4, 1.5, 1)
67 warp_enter.rotation_degrees.y = 90
68 root.get_node("/root/scene").add_child.call_deferred(warp_enter)
69
70
71func _set_up_invis_wall(root, x, y, z, sx, sy, sz):
72 var prefab = preload("res://objects/nodes/block.tscn")
73 var newwall = prefab.instantiate()
74 newwall.position.x = x
75 newwall.position.y = y
76 newwall.position.z = z
77 newwall.scale.x = sz
78 newwall.scale.y = sy
79 newwall.scale.z = sx
80 newwall.set_surface_override_material(0, preload("res://assets/materials/blackMatte.material"))
81 newwall.visibility_range_end = 3
82 newwall.visibility_range_end_margin = 1
83 newwall.visibility_range_fade_mode = RenderingServer.VISIBILITY_RANGE_FADE_SELF
84 newwall.skeleton = ".."
85 root.get_node("/root/scene").add_child.call_deferred(newwall)
diff --git a/apworld/client/maps/icarus.gd b/apworld/client/maps/icarus.gd new file mode 100644 index 0000000..ad00741 --- /dev/null +++ b/apworld/client/maps/icarus.gd
@@ -0,0 +1,38 @@
1func on_map_load(root):
2 var ap = global.get_node("Archipelago")
3
4 # Add the mastery to Icarus.
5 if ap.enable_icarus:
6 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
7 var saver_prefab = preload("res://objects/nodes/saver.tscn")
8 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
9 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
10
11 var mastery = collectable_prefab.instantiate()
12 mastery.name = "collectable"
13 mastery.position = Vector3(0, -2000, 0)
14 mastery.unlock_type = "smiley"
15 mastery.material_override = load("res://assets/materials/gold.material")
16 root.get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
17
18 var tpl = tpl_prefab.instantiate()
19 tpl.teleport_point = Vector3(56.25, 0, -5.5)
20 tpl.teleport_rotate = Vector3(0, 0, 0)
21 tpl.target_path = mastery
22 tpl.name = "Teleport"
23 tpl.senderGroup.append(NodePath("/root/scene/Panels"))
24 tpl.nested = true
25 mastery.add_child.call_deferred(tpl)
26
27 var usl = usl_prefab.instantiate()
28 usl.name = "unlockSetterListenerMastery"
29 usl.key = "icarus_mastery"
30 usl.value = "unlocked"
31 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
32 root.get_node("/root/scene/Components").add_child.call_deferred(usl)
33
34 var saver = saver_prefab.instantiate()
35 saver.name = "saver_collectables"
36 saver.type = "collectables"
37 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
38 root.get_node("/root/scene").add_child.call_deferred(saver)
diff --git a/apworld/client/maps/the_advanced.gd b/apworld/client/maps/the_advanced.gd new file mode 100644 index 0000000..b41549c --- /dev/null +++ b/apworld/client/maps/the_advanced.gd
@@ -0,0 +1,36 @@
1func on_map_load(root):
2 # Add the mastery to The Advanced.
3 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
4 var saver_prefab = preload("res://objects/nodes/saver.tscn")
5 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
6 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
7
8 var mastery = collectable_prefab.instantiate()
9 mastery.name = "collectable"
10 mastery.position = Vector3(0, -200, -5)
11 mastery.unlock_type = "smiley"
12 mastery.material_override = load("res://assets/materials/gold.material")
13 root.get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
14
15 var tpl = tpl_prefab.instantiate()
16 tpl.teleport_point = Vector3(0, 2, -5)
17 tpl.teleport_rotate = Vector3(0, 0, 0)
18 tpl.target_path = mastery
19 tpl.name = "Teleport"
20 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_29"))
21 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_30"))
22 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_31"))
23 mastery.add_child.call_deferred(tpl)
24
25 var usl = usl_prefab.instantiate()
26 usl.name = "unlockSetterListenerMastery"
27 usl.key = "advanced_mastery"
28 usl.value = "unlocked"
29 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
30 root.get_node("/root/scene/Components").add_child.call_deferred(usl)
31
32 var saver = saver_prefab.instantiate()
33 saver.name = "saver_collectables"
34 saver.type = "collectables"
35 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
36 root.get_node("/root/scene").add_child.call_deferred(saver)
diff --git a/apworld/client/maps/the_charismatic.gd b/apworld/client/maps/the_charismatic.gd new file mode 100644 index 0000000..734001d --- /dev/null +++ b/apworld/client/maps/the_charismatic.gd
@@ -0,0 +1,26 @@
1func on_map_load(root):
2 # Add the mastery to The Charismatic.
3 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
4 var saver_prefab = preload("res://objects/nodes/saver.tscn")
5 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
6
7 var mastery = collectable_prefab.instantiate()
8 mastery.name = "collectable"
9 mastery.position = Vector3(-17, 2, -29)
10 mastery.rotation_degrees = Vector3(0, 45, 0)
11 mastery.unlock_type = "smiley"
12 mastery.material_override = load("res://assets/materials/gold.material")
13 root.get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
14
15 var usl = usl_prefab.instantiate()
16 usl.name = "unlockSetterListenerMastery"
17 usl.key = "charismatic_mastery"
18 usl.value = "unlocked"
19 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
20 root.get_node("/root/scene/Components").add_child.call_deferred(usl)
21
22 var saver = saver_prefab.instantiate()
23 saver.name = "saver_collectables"
24 saver.type = "collectables"
25 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
26 root.get_node("/root/scene").add_child.call_deferred(saver)
diff --git a/apworld/client/maps/the_crystalline.gd b/apworld/client/maps/the_crystalline.gd new file mode 100644 index 0000000..7d43e78 --- /dev/null +++ b/apworld/client/maps/the_crystalline.gd
@@ -0,0 +1,34 @@
1func on_map_load(root):
2 # Add the mastery to The Crystalline.
3 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
4 var saver_prefab = preload("res://objects/nodes/saver.tscn")
5 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
6 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
7
8 var mastery = collectable_prefab.instantiate()
9 mastery.name = "collectable"
10 mastery.position = Vector3(0, 13, 37)
11 mastery.unlock_type = "smiley"
12 mastery.material_override = load("res://assets/materials/gold.material")
13 root.get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
14
15 var tpl = tpl_prefab.instantiate()
16 tpl.teleport_point = Vector3(0, 11.5, -20)
17 tpl.teleport_rotate = Vector3(0, 0, 180)
18 tpl.target_path = mastery
19 tpl.name = "Teleport"
20 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_3"))
21 mastery.add_child.call_deferred(tpl)
22
23 var usl = usl_prefab.instantiate()
24 usl.name = "unlockSetterListenerMastery"
25 usl.key = "crystalline_mastery"
26 usl.value = "unlocked"
27 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
28 root.get_node("/root/scene/Components").add_child.call_deferred(usl)
29
30 var saver = saver_prefab.instantiate()
31 saver.name = "saver_collectables"
32 saver.type = "collectables"
33 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
34 root.get_node("/root/scene").add_child.call_deferred(saver)
diff --git a/apworld/client/maps/the_entry.gd b/apworld/client/maps/the_entry.gd new file mode 100644 index 0000000..3608bb3 --- /dev/null +++ b/apworld/client/maps/the_entry.gd
@@ -0,0 +1,156 @@
1func on_map_load(root):
2 var ap = global.get_node("Archipelago")
3
4 # Remove door behind X1.
5 var door_node = root.get_node("/root/scene/Components/Doors/exit_1")
6 door_node.handleTriggered()
7
8 # Display win condition.
9 var sign_prefab = preload("res://objects/nodes/sign.tscn")
10 var sign1 = sign_prefab.instantiate()
11 sign1.position = Vector3(-7, 5, -15.01)
12 sign1.text = "victory"
13 root.get_node("/root/scene").add_child.call_deferred(sign1)
14
15 var sign2 = sign_prefab.instantiate()
16 sign2.position = Vector3(-7, 4, -15.01)
17 sign2.text = "%s ending" % ap.kEndingNameByVictoryValue.get(ap.victory_condition, "?")
18
19 var sign2_color = ap.kEndingNameByVictoryValue.get(ap.victory_condition, "coral").to_lower()
20 if sign2_color == "white":
21 sign2_color = "silver"
22
23 sign2.material = load("res://assets/materials/%s.material" % sign2_color)
24 root.get_node("/root/scene").add_child.call_deferred(sign2)
25
26 # Add the gift map entry panel if needed.
27 if not ap.enable_gift_maps.is_empty():
28 var panel_prefab = preload("res://objects/nodes/panel.tscn")
29 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
30 var wpl_prefab = preload("res://objects/nodes/listeners/worldportListener.tscn")
31
32 var giftmap_parent = Node.new()
33 giftmap_parent.name = "GiftMapEntrance"
34 root.get_node("/root/scene/Components").add_child.call_deferred(giftmap_parent)
35
36 var symbolless_player = ""
37 for i in range(ap.client.ap_user.length()):
38 if "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(
39 ap.client.ap_user[i]
40 ):
41 symbolless_player = symbolless_player + ap.client.ap_user[i].to_lower()
42
43 var giftmap_panel = panel_prefab.instantiate()
44 giftmap_panel.name = "Panel"
45 giftmap_panel.position = Vector3(33.5, -190, 5.5)
46 giftmap_panel.rotation_degrees = Vector3(-45, 0, 0)
47 giftmap_panel.clue = "player"
48 giftmap_panel.answer = symbolless_player
49
50 if ap.enable_gift_maps.has("The Advanced"):
51 var icely_panel = panel_prefab.instantiate()
52 icely_panel.name = "IcelyPanel"
53 icely_panel.answer = "icely"
54 icely_panel.position = Vector3(33.5, -200, 5.5)
55 giftmap_panel.proxies.append(NodePath("../IcelyPanel"))
56 giftmap_parent.add_child.call_deferred(icely_panel)
57
58 var icely_wpl = wpl_prefab.instantiate()
59 icely_wpl.name = "IcelyWpl"
60 icely_wpl.exit = "the_advanced"
61 icely_wpl.senders.append(NodePath("../IcelyPanel"))
62 giftmap_parent.add_child.call_deferred(icely_wpl)
63
64 if ap.enable_gift_maps.has("The Charismatic"):
65 var souvey_panel = panel_prefab.instantiate()
66 souvey_panel.name = "SouveyPanel"
67 souvey_panel.answer = "souvey"
68 souvey_panel.position = Vector3(33.5, -210, 5.5)
69 giftmap_panel.proxies.append(NodePath("../SouveyPanel"))
70 giftmap_parent.add_child.call_deferred(souvey_panel)
71
72 var souvey_wpl = wpl_prefab.instantiate()
73 souvey_wpl.name = "SouveyWpl"
74 souvey_wpl.exit = "the_charismatic"
75 souvey_wpl.senders.append(NodePath("../SouveyPanel"))
76 giftmap_parent.add_child.call_deferred(souvey_wpl)
77
78 if ap.enable_gift_maps.has("The Crystalline"):
79 var q_panel = panel_prefab.instantiate()
80 q_panel.name = "QPanel"
81 q_panel.answer = "q"
82 q_panel.position = Vector3(33.5, -220, 5.5)
83 giftmap_panel.proxies.append(NodePath("../QPanel"))
84 giftmap_parent.add_child.call_deferred(q_panel)
85
86 var q_wpl = wpl_prefab.instantiate()
87 q_wpl.name = "QWpl"
88 q_wpl.exit = "the_crystalline"
89 q_wpl.senders.append(NodePath("../QPanel"))
90 giftmap_parent.add_child.call_deferred(q_wpl)
91
92 if ap.enable_gift_maps.has("The Fuzzy"):
93 var gongus_panel = panel_prefab.instantiate()
94 gongus_panel.name = "GongusPanel"
95 gongus_panel.answer = "gongus"
96 gongus_panel.position = Vector3(33.5, -260, 5.5)
97 giftmap_panel.proxies.append(NodePath("../GongusPanel"))
98 giftmap_parent.add_child.call_deferred(gongus_panel)
99
100 var kiwi_panel = panel_prefab.instantiate()
101 kiwi_panel.name = "KiwiPanel"
102 kiwi_panel.answer = "kiwi"
103 kiwi_panel.position = Vector3(33.5, -270, 5.5)
104 giftmap_panel.proxies.append(NodePath("../KiwiPanel"))
105 giftmap_parent.add_child.call_deferred(kiwi_panel)
106
107 var fuzzy_wpl = wpl_prefab.instantiate()
108 fuzzy_wpl.name = "FuzzyWpl"
109 fuzzy_wpl.exit = "the_fuzzy"
110 fuzzy_wpl.senders.append(NodePath("../GongusPanel"))
111 fuzzy_wpl.senders.append(NodePath("../KiwiPanel"))
112 fuzzy_wpl.complete_at = 1
113 giftmap_parent.add_child.call_deferred(fuzzy_wpl)
114
115 if ap.enable_gift_maps.has("The Stellar"):
116 var hatkirby_panel = panel_prefab.instantiate()
117 hatkirby_panel.name = "HatkirbyPanel"
118 hatkirby_panel.answer = "hatkirby"
119 hatkirby_panel.position = Vector3(33.5, -230, 5.5)
120 giftmap_panel.proxies.append(NodePath("../HatkirbyPanel"))
121 giftmap_parent.add_child.call_deferred(hatkirby_panel)
122
123 var kirby_panel = panel_prefab.instantiate()
124 kirby_panel.name = "KirbyPanel"
125 kirby_panel.answer = "kirby"
126 kirby_panel.position = Vector3(33.5, -240, 5.5)
127 giftmap_panel.proxies.append(NodePath("../KirbyPanel"))
128 giftmap_parent.add_child.call_deferred(kirby_panel)
129
130 var star_panel = panel_prefab.instantiate()
131 star_panel.name = "StarPanel"
132 star_panel.answer = "star"
133 star_panel.position = Vector3(33.5, -250, 5.5)
134 giftmap_panel.proxies.append(NodePath("../StarPanel"))
135 giftmap_parent.add_child.call_deferred(star_panel)
136
137 var stellar_wpl = wpl_prefab.instantiate()
138 stellar_wpl.name = "StellarWpl"
139 stellar_wpl.exit = "the_stellar"
140 stellar_wpl.senders.append(NodePath("../HatkirbyPanel"))
141 stellar_wpl.senders.append(NodePath("../KirbyPanel"))
142 stellar_wpl.senders.append(NodePath("../StarPanel"))
143 stellar_wpl.complete_at = 1
144 giftmap_parent.add_child.call_deferred(stellar_wpl)
145
146 giftmap_parent.add_child.call_deferred(giftmap_panel)
147
148 var giftmap_tpl = tpl_prefab.instantiate()
149 giftmap_tpl.name = "PanelTeleporter"
150 giftmap_tpl.teleport_point = Vector3(33.5, 1, 5.5)
151 giftmap_tpl.teleport_rotate = Vector3(-45, 0, 0)
152 giftmap_tpl.target_path = giftmap_panel
153 giftmap_tpl.senders.append(
154 NodePath("/root/scene/Components/Listeners/unlockReaderListenerDoubles")
155 )
156 giftmap_parent.add_child.call_deferred(giftmap_tpl)
diff --git a/apworld/client/maps/the_fuzzy.gd b/apworld/client/maps/the_fuzzy.gd new file mode 100644 index 0000000..269dcee --- /dev/null +++ b/apworld/client/maps/the_fuzzy.gd
@@ -0,0 +1,25 @@
1func on_map_load(root):
2 # Add the mastery to The Fuzzy.
3 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
4 var saver_prefab = preload("res://objects/nodes/saver.tscn")
5 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
6
7 var mastery = collectable_prefab.instantiate()
8 mastery.name = "collectable"
9 mastery.position = Vector3(0, 2, -20)
10 mastery.unlock_type = "smiley"
11 mastery.material_override = load("res://assets/materials/gold.material")
12 root.get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
13
14 var usl = usl_prefab.instantiate()
15 usl.name = "unlockSetterListenerMastery"
16 usl.key = "fuzzy_mastery"
17 usl.value = "unlocked"
18 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
19 root.get_node("/root/scene/Components").add_child.call_deferred(usl)
20
21 var saver = saver_prefab.instantiate()
22 saver.name = "saver_collectables"
23 saver.type = "collectables"
24 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
25 root.get_node("/root/scene").add_child.call_deferred(saver)
diff --git a/apworld/client/maps/the_parthenon.gd b/apworld/client/maps/the_parthenon.gd new file mode 100644 index 0000000..96510da --- /dev/null +++ b/apworld/client/maps/the_parthenon.gd
@@ -0,0 +1,51 @@
1func on_map_load(root):
2 var ap = global.get_node("Archipelago")
3
4 # Add the strict cyan ending validation.
5 if ap.strict_cyan_ending:
6 var panel_prefab = preload("res://objects/nodes/panel.tscn")
7 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
8 var reverse_prefab = preload("res://objects/nodes/listeners/reversingListener.tscn")
9
10 var previous_panel = null
11 var next_y = -100
12 var words = ["quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
13 for word in words:
14 var panel = panel_prefab.instantiate()
15 panel.position = Vector3(0, next_y, 0)
16 next_y -= 10
17 panel.clue = word
18 panel.symbol = "."
19 panel.answer = "%s%s" % [word, word]
20 panel.name = "EndCheck_%s" % word
21
22 var tpl = tpl_prefab.instantiate()
23 tpl.teleport_point = Vector3(0, 1, -11)
24 tpl.teleport_rotate = Vector3(-45, 0, 0)
25 tpl.target_path = panel
26 tpl.name = "Teleport"
27
28 if previous_panel == null:
29 tpl.senderGroup.append(NodePath("/root/scene/Panels/Rulers"))
30 else:
31 tpl.senders.append(NodePath("../../%s" % previous_panel.name))
32
33 var reversing = reverse_prefab.instantiate()
34 reversing.senders.append(NodePath(".."))
35 reversing.name = "Reversing"
36 tpl.senders.append(NodePath("../Reversing"))
37
38 panel.add_child.call_deferred(tpl)
39 panel.add_child.call_deferred(reversing)
40 root.get_node("/root/scene/Panels").add_child.call_deferred(panel)
41
42 previous_panel = panel
43
44 # Duplicate the door that usually waits on the rulers. We can't set the
45 # senders here for some reason so we actually set them in the door ready
46 # function.
47 var entry1 = root.get_node("/root/scene/Components/Doors/entry_1")
48 var entry12 = entry1.duplicate()
49 entry12.name = "spe_entry_1"
50 entry1.get_parent().add_child.call_deferred(entry12)
51 entry1.queue_free()
diff --git a/apworld/client/maps/the_plaza.gd b/apworld/client/maps/the_plaza.gd new file mode 100644 index 0000000..13e002d --- /dev/null +++ b/apworld/client/maps/the_plaza.gd
@@ -0,0 +1,4 @@
1func on_map_load(root):
2 # Move the Plaza RTE trigger outside of the turtle.
3 var rte_trigger = root.get_node("/root/scene/Components/Warps/triggerArea")
4 rte_trigger.position.z = 0
diff --git a/apworld/client/maps/the_stellar.gd b/apworld/client/maps/the_stellar.gd new file mode 100644 index 0000000..d633535 --- /dev/null +++ b/apworld/client/maps/the_stellar.gd
@@ -0,0 +1,30 @@
1func on_map_load(root):
2 # Add the mastery to The Stellar.
3 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
4 var saver_prefab = preload("res://objects/nodes/saver.tscn")
5 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
6
7 var collectables = Node.new()
8 collectables.name = "Collectables"
9
10 var mastery = collectable_prefab.instantiate()
11 mastery.name = "collectable"
12 mastery.position = Vector3(2, 2, -31)
13 mastery.rotation_degrees = Vector3(0, 90, 0)
14 mastery.unlock_type = "smiley"
15 mastery.material_override = load("res://assets/materials/gold.material")
16 collectables.add_child.call_deferred(mastery)
17 root.get_node("/root/scene/Components").add_child.call_deferred(collectables)
18
19 var usl = usl_prefab.instantiate()
20 usl.name = "unlockSetterListenerMastery"
21 usl.key = "stellar_mastery"
22 usl.value = "unlocked"
23 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
24 root.get_node("/root/scene/Components").add_child.call_deferred(usl)
25
26 var saver = saver_prefab.instantiate()
27 saver.name = "saver_collectables"
28 saver.type = "collectables"
29 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
30 root.get_node("/root/scene").add_child.call_deferred(saver)
diff --git a/apworld/client/maps/the_sun_temple.gd b/apworld/client/maps/the_sun_temple.gd new file mode 100644 index 0000000..9804bf8 --- /dev/null +++ b/apworld/client/maps/the_sun_temple.gd
@@ -0,0 +1,56 @@
1func on_map_load(root):
2 var ap = global.get_node("Archipelago")
3
4 # Add the strict purple ending validation.
5 if ap.strict_purple_ending:
6 var panel_prefab = preload("res://objects/nodes/panel.tscn")
7 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
8 var reverse_prefab = preload("res://objects/nodes/listeners/reversingListener.tscn")
9
10 var previous_panel = null
11 var next_y = -100
12 var words = ["quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
13 for word in words:
14 var panel = panel_prefab.instantiate()
15 panel.position = Vector3(0, next_y, 0)
16 next_y -= 10
17 panel.clue = word
18 panel.symbol = ""
19 panel.answer = word
20 panel.name = "EndCheck_%s" % word
21
22 var tpl = tpl_prefab.instantiate()
23 tpl.teleport_point = Vector3(0, 1, 0)
24 tpl.teleport_rotate = Vector3(-45, 180, 0)
25 tpl.target_path = panel
26 tpl.name = "Teleport"
27
28 if previous_panel == null:
29 tpl.senders.append(NodePath("/root/scene/Panels/End/panel_24"))
30 else:
31 tpl.senders.append(NodePath("../../%s" % previous_panel.name))
32
33 var reversing = reverse_prefab.instantiate()
34 reversing.senders.append(NodePath(".."))
35 reversing.name = "Reversing"
36 tpl.senders.append(NodePath("../Reversing"))
37
38 panel.add_child.call_deferred(tpl)
39 panel.add_child.call_deferred(reversing)
40 root.get_node("/root/scene/Panels").add_child.call_deferred(panel)
41
42 previous_panel = panel
43
44 # Duplicate the doors that usually wait on EQUINOX. We can't set the senders
45 # here for some reason so we actually set them in the door ready function.
46 var endplat = root.get_node("/root/scene/Components/Doors/EndPlatform")
47 var endplat2 = endplat.duplicate()
48 endplat2.name = "spe_EndPlatform"
49 endplat.get_parent().add_child.call_deferred(endplat2)
50 endplat.queue_free()
51
52 var entry2 = root.get_node("/root/scene/Components/Doors/entry_2")
53 var entry22 = entry2.duplicate()
54 entry22.name = "spe_entry_2"
55 entry2.get_parent().add_child.call_deferred(entry22)
56 entry2.queue_free()
diff --git a/apworld/client/maps/the_unkempt.gd b/apworld/client/maps/the_unkempt.gd new file mode 100644 index 0000000..c907650 --- /dev/null +++ b/apworld/client/maps/the_unkempt.gd
@@ -0,0 +1,4 @@
1func on_map_load(root):
2 # Prevent the COLOR panel from disappearing.
3 var color_tpl = root.get_node("/root/scene/Panels/Assorted/panel_1/teleportListener")
4 color_tpl.target_path = color_tpl
diff --git a/apworld/client/maps/the_unyielding.gd b/apworld/client/maps/the_unyielding.gd new file mode 100644 index 0000000..a2f8eee --- /dev/null +++ b/apworld/client/maps/the_unyielding.gd
@@ -0,0 +1,5 @@
1func on_map_load(root):
2 # Shrink the painting trigger in The Unyielding.
3 var trigger_area = root.get_node("/root/scene/Components/PaintingUnlocker/triggerArea")
4 trigger_area.position = Vector3(0, 0, -6)
5 trigger_area.scale = Vector3(6, 1, 6)
diff --git a/apworld/client/messages.gd b/apworld/client/messages.gd new file mode 100644 index 0000000..ab4f071 --- /dev/null +++ b/apworld/client/messages.gd
@@ -0,0 +1,74 @@
1extends CanvasLayer
2
3var SCRIPT_rainbowText
4
5var _message_queue = []
6var _font
7var _container
8var _ordered_labels = []
9
10
11func _ready():
12 _container = VBoxContainer.new()
13 _container.set_name("Container")
14 _container.anchor_bottom = 1
15 _container.offset_left = 20.0
16 _container.offset_right = 1920.0
17 _container.offset_top = 0.0
18 _container.offset_bottom = -20.0
19 _container.alignment = BoxContainer.ALIGNMENT_END
20 _container.mouse_filter = Control.MOUSE_FILTER_IGNORE
21 self.add_child(_container)
22
23 _font = load("res://assets/fonts/Lingo2.ttf")
24
25
26func _add_message(text):
27 var new_label = RichTextLabel.new()
28 new_label.install_effect(SCRIPT_rainbowText.new())
29 new_label.push_font(_font)
30 new_label.push_font_size(36)
31 new_label.push_outline_color(Color(0, 0, 0, 1))
32 new_label.push_outline_size(2)
33 new_label.append_text(text)
34 new_label.fit_content = true
35
36 _container.add_child(new_label)
37 _ordered_labels.push_back(new_label)
38
39
40func showMessage(text):
41 if _ordered_labels.size() >= 9:
42 _message_queue.append(text)
43 return
44
45 _add_message(text)
46
47 if _ordered_labels.size() > 1:
48 return
49
50 var timeout = 10.0
51 while !_ordered_labels.is_empty():
52 await get_tree().create_timer(timeout).timeout
53
54 if !_ordered_labels.is_empty():
55 var to_remove = _ordered_labels.pop_front()
56 var to_tween = get_tree().create_tween().bind_node(to_remove)
57 to_tween.tween_property(to_remove, "modulate:a", 0.0, 0.5)
58 to_tween.tween_callback(to_remove.queue_free)
59
60 if !_message_queue.is_empty():
61 var next_msg = _message_queue.pop_front()
62 _add_message(next_msg)
63
64 if timeout > 4:
65 timeout -= 3
66
67
68func clear():
69 _message_queue.clear()
70
71 for message_label in _ordered_labels:
72 message_label.queue_free()
73
74 _ordered_labels.clear()
diff --git a/apworld/client/minimap.gd b/apworld/client/minimap.gd new file mode 100644 index 0000000..bf70114 --- /dev/null +++ b/apworld/client/minimap.gd
@@ -0,0 +1,178 @@
1extends CanvasLayer
2
3var player
4var drawer
5var sprite
6var label
7
8var cell_left
9var cell_top
10var cell_right
11var cell_bottom
12var cell_width
13var cell_height
14var center_x_min
15var center_x_max
16var center_y_min
17var center_y_max
18
19
20func _ready():
21 player = get_tree().get_root().get_node("scene/player")
22
23 var svc = PanelContainer.new()
24 svc.anchor_left = 1.0
25 svc.anchor_top = 1.0
26 svc.anchor_right = 1.0
27 svc.anchor_bottom = 1.0
28 svc.offset_left = -320.0
29 svc.offset_top = -320.0
30 svc.offset_right = -64.0
31 svc.offset_bottom = -64.0
32 svc.clip_contents = true
33 add_child(svc)
34
35 var background_color = Color.WHITE
36
37 var world_env = get_tree().get_root().get_node("scene/WorldEnvironment")
38 if world_env != null and world_env.environment != null:
39 if world_env.environment.background_mode == Environment.BG_COLOR:
40 background_color = world_env.environment.background_color
41 elif (
42 world_env.environment.background_mode == Environment.BG_SKY
43 and world_env.environment.sky != null
44 and world_env.environment.sky.sky_material != null
45 ):
46 var sky = world_env.environment.sky.sky_material
47 if sky is PhysicalSkyMaterial:
48 background_color = sky.ground_color
49 elif sky is ProceduralSkyMaterial:
50 background_color = sky.sky_top_color
51
52 var stylebox = StyleBoxFlat.new()
53 stylebox.bg_color = Color(background_color, 0.6)
54 svc.add_theme_stylebox_override("panel", stylebox)
55
56 drawer = Node2D.new()
57 svc.add_child(drawer)
58
59 var gridmap = get_tree().get_root().get_node("scene/GridMap")
60 if gridmap == null:
61 visible = false
62 return
63
64 cell_left = 0
65 cell_top = 0
66 cell_right = 0
67 cell_bottom = 0
68
69 for pos in gridmap.get_used_cells():
70 if pos.x < cell_left:
71 cell_left = pos.x
72 if pos.x > cell_right:
73 cell_right = pos.x
74 if pos.z < cell_top:
75 cell_top = pos.z
76 if pos.z > cell_bottom:
77 cell_bottom = pos.z
78
79 cell_width = cell_right - cell_left + 1
80 cell_height = cell_bottom - cell_top + 1
81
82 var rendered = _renderMap(gridmap)
83
84 var image_texture = ImageTexture.create_from_image(rendered)
85 sprite = Sprite2D.new()
86 sprite.texture = image_texture
87 sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
88 sprite.scale = Vector2(2, 2)
89 sprite.centered = false
90 drawer.add_child(sprite)
91
92 label = Label.new()
93 label.theme = preload("res://assets/themes/baseUI.tres")
94 label.add_theme_font_size_override("font_size", 32)
95 label.text = "@"
96 drawer.add_child(label)
97
98 #var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top))
99 #var global_tl = gridmap.to_global(local_tl)
100 #var local_br = gridmap.map_to_local(Vector3i(cell_right, 0, cell_bottom))
101 #var global_br = gridmap.to_global(local_br)
102
103 center_x_min = 0
104 center_x_max = cell_width - 128
105 center_y_min = 0
106 center_y_max = cell_height - 128
107
108 if center_x_max < center_x_min:
109 center_x_min = (center_x_min + center_x_max) / 2
110 center_x_max = center_x_min
111
112 if center_y_max < center_y_min:
113 center_y_min = (center_y_min + center_y_max) / 2
114 center_y_max = center_y_min
115
116
117func _process(_delta):
118 if visible == false:
119 return
120
121 drawer.position.x = clamp(player.position.x - cell_left - 64, center_x_min, center_x_max) * -2
122 drawer.position.y = clamp(player.position.z - cell_top - 64, center_y_min, center_y_max) * -2
123
124 label.position.x = (player.position.x - cell_left) * 2 - 16
125 label.position.y = (player.position.z - cell_top) * 2 - 16
126
127
128func _renderMap(gridmap):
129 var ap = global.get_node("Archipelago")
130 var heights = {}
131
132 var rendered = Image.create_empty(cell_width, cell_height, false, Image.FORMAT_RGBA8)
133 rendered.fill(Color.TRANSPARENT)
134
135 var meshes_node = get_tree().get_root().get_node("scene/Meshes")
136 if meshes_node != null:
137 _renderMeshNode(ap, gridmap, meshes_node, rendered)
138
139 for pos in gridmap.get_used_cells():
140 var in_plane = Vector2i(pos.x, pos.z)
141
142 if in_plane in heights and heights[in_plane] > pos.y:
143 continue
144
145 heights[in_plane] = pos.y
146
147 var cell_item = gridmap.get_cell_item(pos)
148 var mesh = gridmap.mesh_library.get_item_mesh(cell_item)
149 var material = mesh.surface_get_material(0)
150 var color = ap.color_by_material_path.get(material.resource_path, Color.TRANSPARENT)
151
152 rendered.set_pixel(pos.x - cell_left, pos.z - cell_top, color)
153
154 return rendered
155
156
157func _renderMeshNode(ap, gridmap, mesh, rendered):
158 if mesh is MeshInstance3D:
159 var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top))
160 var global_tl = gridmap.to_global(local_tl)
161 var mesh_material = mesh.get_surface_override_material(0)
162 if mesh_material != null:
163 var mesh_color = ap.color_by_material_path.get(
164 mesh_material.resource_path, Color.TRANSPARENT
165 )
166
167 for y in range(
168 max(mesh.position.z - mesh.scale.z / 2 - global_tl.z, 0),
169 min(mesh.position.z + mesh.scale.z / 2 - global_tl.z, cell_height)
170 ):
171 for x in range(
172 max(mesh.position.x - mesh.scale.x / 2 - global_tl.x, 0),
173 min(mesh.position.x + mesh.scale.x / 2 - global_tl.x, cell_width)
174 ):
175 rendered.set_pixel(x, y, mesh_color)
176
177 for child in mesh.get_children():
178 _renderMeshNode(ap, gridmap, child, rendered)
diff --git a/apworld/client/painting.gd b/apworld/client/painting.gd new file mode 100644 index 0000000..276d4eb --- /dev/null +++ b/apworld/client/painting.gd
@@ -0,0 +1,38 @@
1extends "res://scripts/nodes/painting.gd"
2
3var item_id
4var item_amount
5
6
7func _ready():
8 var node_path = String(
9 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
10 )
11
12 var gamedata = global.get_node("Gamedata")
13 var door_id = gamedata.get_door_for_map_node_path(global.map, node_path)
14 if door_id != null:
15 var ap = global.get_node("Archipelago")
16 var item_lock = ap.get_item_id_for_door(door_id)
17
18 if item_lock != null:
19 item_id = item_lock[0]
20 item_amount = item_lock[1]
21
22 self.senders = []
23 self.senderGroup = []
24 self.nested = false
25 self.complete_at = 0
26 self.max_length = 0
27 self.excludeSenders = []
28
29 call_deferred("_readier")
30
31 super._ready()
32
33
34func _readier():
35 var ap = global.get_node("Archipelago")
36
37 if ap.client.getItemAmount(item_id) >= item_amount:
38 handleTriggered()
diff --git a/apworld/client/paintingAuto.gd b/apworld/client/paintingAuto.gd new file mode 100644 index 0000000..553c2c9 --- /dev/null +++ b/apworld/client/paintingAuto.gd
@@ -0,0 +1,43 @@
1extends "res://scripts/nodes/paintingAuto.gd"
2
3var item_id
4var item_amount
5
6
7func _ready():
8 var node_path = String(
9 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
10 )
11
12 var gamedata = global.get_node("Gamedata")
13 var door_id = gamedata.get_door_for_map_node_path(global.map, node_path)
14 if door_id != null:
15 var ap = global.get_node("Archipelago")
16 var item_lock = ap.get_item_id_for_door(door_id)
17
18 if item_lock != null:
19 item_id = item_lock[0]
20 item_amount = item_lock[1]
21
22 self.senders = []
23 self.senderGroup = []
24 self.nested = false
25 self.complete_at = 0
26 self.max_length = 0
27 self.excludeSenders = []
28
29 call_deferred("_readier")
30
31 super._ready()
32
33 if item_id != null and activate_on_sender_complete:
34 enabled = false
35 if not hide_particles:
36 get_node("Hinge/paintingColliders/TeleportParticles").emitting = false
37
38
39func _readier():
40 var ap = global.get_node("Archipelago")
41
42 if ap.client.getItemAmount(item_id) >= item_amount:
43 handleTriggered()
diff --git a/apworld/client/panel.gd b/apworld/client/panel.gd new file mode 100644 index 0000000..2cef28e --- /dev/null +++ b/apworld/client/panel.gd
@@ -0,0 +1,101 @@
1extends "res://scripts/nodes/panel.gd"
2
3var panel_logic = null
4var symbol_solvable = true
5
6var black = load("res://assets/materials/black.material")
7
8
9func _ready():
10 super._ready()
11
12 var node_path = String(
13 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
14 )
15
16 var gamedata = global.get_node("Gamedata")
17 var panel_id = gamedata.get_panel_for_map_node_path(global.map, node_path)
18 if panel_id != null:
19 var ap = global.get_node("Archipelago")
20 if ap.shuffle_symbols:
21 if global.map == "the_entry" and node_path == "Panels/Entry/front_1":
22 clue = "i"
23 symbol = ""
24
25 setField("clue", clue)
26 setField("symbol", symbol)
27
28 panel_logic = gamedata.objects.get_panels()[panel_id]
29 checkSymbolSolvable()
30
31 if not symbol_solvable:
32 get_tree().get_root().get_node("scene/player").evaluate_solvability.connect(
33 evaluateSolvability
34 )
35
36
37func checkSymbolSolvable():
38 var old_solvable = symbol_solvable
39 symbol_solvable = true
40
41 if panel_logic == null:
42 # There's no logic for this panel.
43 return
44
45 var ap = global.get_node("Archipelago")
46 if not ap.shuffle_symbols:
47 # Symbols aren't item-locked.
48 return
49
50 var gamedata = global.get_node("Gamedata")
51 for symbol in panel_logic.get_symbols():
52 var item_name = gamedata.kSYMBOL_ITEMS.get(symbol)
53 var item_id = gamedata.objects.get_special_ids()[item_name]
54 if ap.client.getItemAmount(item_id) < 1:
55 symbol_solvable = false
56 break
57
58 if symbol_solvable != old_solvable:
59 if symbol_solvable:
60 setField("clue", clue)
61 setField("symbol", symbol)
62 setField("answer", answer)
63 else:
64 quad_mesh.surface_set_material(0, black)
65 get_node("Hinge/clue").text = "missing"
66 get_node("Hinge/answer").text = "symbols"
67
68
69func checkSolvable(key):
70 checkSymbolSolvable()
71 if not symbol_solvable:
72 return false
73
74 return super.checkSolvable(key)
75
76
77func evaluateSolvability():
78 checkSolvable("")
79
80
81func passedInput(key, skip_focus_check = false):
82 if not symbol_solvable:
83 return
84
85 super.passedInput(key, skip_focus_check)
86
87
88func focus():
89 if not symbol_solvable:
90 has_focus = false
91 return
92
93 super.focus()
94
95
96func unfocus():
97 if not symbol_solvable:
98 has_focus = false
99 return
100
101 super.unfocus()
diff --git a/apworld/client/pauseMenu.gd b/apworld/client/pauseMenu.gd new file mode 100644 index 0000000..72b45e8 --- /dev/null +++ b/apworld/client/pauseMenu.gd
@@ -0,0 +1,91 @@
1extends "res://scripts/ui/pauseMenu.gd"
2
3var compass_button
4var locations_button
5var minimap_button
6
7
8func _ready():
9 var ap_panel = Panel.new()
10 ap_panel.name = "Archipelago"
11 get_node("menu/settings/settingsInner/TabContainer").add_child(ap_panel)
12
13 var ap = global.get_node("Archipelago")
14
15 compass_button = CheckBox.new()
16 compass_button.text = "show compass"
17 compass_button.button_pressed = ap.show_compass
18 compass_button.position = Vector2(65, 100)
19 compass_button.theme = preload("res://assets/themes/baseUI.tres")
20 compass_button.add_theme_font_size_override("font_size", 60)
21 compass_button.pressed.connect(_toggle_compass)
22 ap_panel.add_child(compass_button)
23
24 locations_button = CheckBox.new()
25 locations_button.text = "show locations overlay"
26 locations_button.button_pressed = ap.show_locations
27 locations_button.position = Vector2(65, 200)
28 locations_button.theme = preload("res://assets/themes/baseUI.tres")
29 locations_button.add_theme_font_size_override("font_size", 60)
30 locations_button.pressed.connect(_toggle_locations)
31 ap_panel.add_child(locations_button)
32
33 minimap_button = CheckBox.new()
34 minimap_button.text = "show minimap"
35 minimap_button.button_pressed = ap.show_minimap
36 minimap_button.position = Vector2(65, 300)
37 minimap_button.theme = preload("res://assets/themes/baseUI.tres")
38 minimap_button.add_theme_font_size_override("font_size", 60)
39 minimap_button.pressed.connect(_toggle_minimap)
40 ap_panel.add_child(minimap_button)
41
42 super._ready()
43
44
45func _pause_game():
46 global.get_node("Textclient").dismiss()
47 super._pause_game()
48
49
50func _main_menu():
51 global.loaded = false
52 global.get_node("Archipelago").disconnect_from_ap()
53 global.get_node("Messages").clear()
54 global.get_node("Compass").visible = false
55 global.get_node("Textclient").reset()
56
57 autosplitter.reset()
58 _unpause_game()
59 Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
60 musicPlayer.stop()
61
62 var runtime = global.get_node("Runtime")
63 runtime.load_script_as_scene.call_deferred("settings_screen.gd", "settings_screen")
64
65
66func _toggle_compass():
67 var ap = global.get_node("Archipelago")
68 ap.show_compass = compass_button.button_pressed
69 ap.saveSettings()
70
71 var compass = global.get_node("Compass")
72 compass.visible = compass_button.button_pressed
73
74
75func _toggle_locations():
76 var ap = global.get_node("Archipelago")
77 ap.show_locations = locations_button.button_pressed
78 ap.saveSettings()
79
80 var textclient = global.get_node("Textclient")
81 textclient.update_locations_visibility()
82
83
84func _toggle_minimap():
85 var ap = global.get_node("Archipelago")
86 ap.show_minimap = minimap_button.button_pressed
87 ap.saveSettings()
88
89 var minimap = get_tree().get_root().get_node("scene/Minimap")
90 if minimap != null:
91 minimap.visible = ap.show_minimap
diff --git a/apworld/client/player.gd b/apworld/client/player.gd new file mode 100644 index 0000000..5fac9fd --- /dev/null +++ b/apworld/client/player.gd
@@ -0,0 +1,181 @@
1extends "res://scripts/nodes/player.gd"
2
3signal evaluate_solvability
4
5var compass
6
7
8func _ready():
9 var khl_script = load("res://scripts/nodes/keyHolderListener.gd")
10
11 var pause_menu = get_node("pause_menu")
12 pause_menu.layer = 3
13
14 var ap = global.get_node("Archipelago")
15 var gamedata = global.get_node("Gamedata")
16
17 compass = global.get_node("Compass")
18 compass.visible = ap.show_compass
19
20 ap.start_batching_locations()
21
22 # Run map-specific initialization.
23 var map_script = ap.get_map_script(global.map)
24 if map_script != null:
25 map_script.on_map_load(get_tree().get_root())
26
27 ap.update_job_well_done_sign()
28
29 # Set up door locations.
30 var map_id = gamedata.map_id_by_name.get(global.map)
31 for door in gamedata.objects.get_doors():
32 if door.get_map_id() != map_id:
33 continue
34
35 if not door.has_ap_id():
36 continue
37
38 if (
39 not (door.has_legacy_location() and door.get_legacy_location())
40 and (
41 door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY
42 or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING
43 or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR
44 )
45 ):
46 continue
47
48 var locationListener = ap.SCRIPT_locationListener.new()
49 locationListener.location_id = door.get_ap_id()
50 locationListener.name = "locationListener_%d" % door.get_ap_id()
51
52 for panel_ref in door.get_panels():
53 var panel_data = gamedata.objects.get_panels()[panel_ref.get_panel()]
54 var panel_path = panel_data.get_path()
55
56 if panel_ref.has_answer():
57 for proxy in panel_data.get_proxies():
58 if proxy.get_answer() == panel_ref.get_answer():
59 panel_path = proxy.get_path()
60 break
61
62 locationListener.senders.append(NodePath("/root/scene/" + panel_path))
63
64 for keyholder_ref in door.get_keyholders():
65 var keyholder_data = gamedata.objects.get_keyholders()[keyholder_ref.get_keyholder()]
66
67 var khl = khl_script.new()
68 khl.name = (
69 "location_%d_keyholder_%d" % [door.get_ap_id(), keyholder_ref.get_keyholder()]
70 )
71 khl.answer = keyholder_ref.get_key()
72 khl.senders.append(NodePath("/root/scene/" + keyholder_data.get_path()))
73 get_parent().add_child.call_deferred(khl)
74
75 locationListener.senders.append(NodePath("../" + khl.name))
76
77 for sender in door.get_senders():
78 locationListener.senders.append(NodePath("/root/scene/" + sender))
79
80 if door.has_complete_at():
81 locationListener.complete_at = door.get_complete_at()
82
83 get_parent().add_child.call_deferred(locationListener)
84
85 # Set up letter locations.
86 for letter in gamedata.objects.get_letters():
87 var room = gamedata.objects.get_rooms()[letter.get_room_id()]
88 if room.get_map_id() != map_id:
89 continue
90
91 var locationListener = ap.SCRIPT_locationListener.new()
92 locationListener.location_id = letter.get_ap_id()
93 locationListener.name = "locationListener_%d" % letter.get_ap_id()
94 locationListener.senders.append(NodePath("/root/scene/" + letter.get_path()))
95
96 get_parent().add_child.call_deferred(locationListener)
97
98 if (
99 ap.get_letter_behavior(letter.get_key(), letter.has_level2() and letter.get_level2())
100 != ap.kLETTER_BEHAVIOR_VANILLA
101 ):
102 var scout = ap.scout_location(letter.get_ap_id())
103 if scout != null and not (scout["for_self"] and scout["flags"] & 4 != 0):
104 var collectable = get_tree().get_root().get_node("scene").get_node_or_null(
105 letter.get_path()
106 )
107 if collectable != null:
108 collectable.setScoutedText.call_deferred(scout["item"])
109
110 # Set up mastery locations.
111 for mastery in gamedata.objects.get_masteries():
112 var room = gamedata.objects.get_rooms()[mastery.get_room_id()]
113 if room.get_map_id() != map_id:
114 continue
115
116 var locationListener = ap.SCRIPT_locationListener.new()
117 locationListener.location_id = mastery.get_ap_id()
118 locationListener.name = "locationListener_%d" % mastery.get_ap_id()
119 locationListener.senders.append(NodePath("/root/scene/" + mastery.get_path()))
120
121 get_parent().add_child.call_deferred(locationListener)
122
123 # Set up ending locations.
124 for ending in gamedata.objects.get_endings():
125 var room = gamedata.objects.get_rooms()[ending.get_room_id()]
126 if room.get_map_id() != map_id:
127 continue
128
129 var locationListener = ap.SCRIPT_locationListener.new()
130 locationListener.location_id = ending.get_ap_id()
131 locationListener.name = "locationListener_%d" % ending.get_ap_id()
132 locationListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
133
134 get_parent().add_child.call_deferred(locationListener)
135
136 if ap.kEndingNameByVictoryValue.get(ap.victory_condition, null) == ending.get_name():
137 var victoryListener = ap.SCRIPT_victoryListener.new()
138 victoryListener.name = "victoryListener"
139 victoryListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
140
141 get_parent().add_child.call_deferred(victoryListener)
142
143 # Set up keyholder locations, in keyholder sanity.
144 if ap.keyholder_sanity:
145 for keyholder in gamedata.objects.get_keyholders():
146 if not keyholder.has_key():
147 continue
148
149 var room = gamedata.objects.get_rooms()[keyholder.get_room_id()]
150 if room.get_map_id() != map_id:
151 continue
152
153 var locationListener = ap.SCRIPT_locationListener.new()
154 locationListener.location_id = keyholder.get_ap_id()
155 locationListener.name = "locationListener_%d" % keyholder.get_ap_id()
156
157 var khl = khl_script.new()
158 khl.name = "location_%d_keyholder" % keyholder.get_ap_id()
159 khl.answer = keyholder.get_key()
160 khl.senders.append(NodePath("/root/scene/" + keyholder.get_path()))
161 get_parent().add_child.call_deferred(khl)
162
163 locationListener.senders.append(NodePath("../" + khl.name))
164
165 get_parent().add_child.call_deferred(locationListener)
166
167 var minimap = ap.SCRIPT_minimap.new()
168 minimap.name = "Minimap"
169 minimap.visible = ap.show_minimap
170 get_parent().add_child.call_deferred(minimap)
171
172 super._ready()
173
174 await get_tree().process_frame
175 await get_tree().process_frame
176
177 ap.stop_batching_locations()
178
179
180func _process(_dt):
181 compass.update_rotation(global_rotation.y)
diff --git a/apworld/client/rainbowText.gd b/apworld/client/rainbowText.gd new file mode 100644 index 0000000..9a4c1d0 --- /dev/null +++ b/apworld/client/rainbowText.gd
@@ -0,0 +1,10 @@
1extends RichTextEffect
2
3var bbcode = "rainbow"
4
5
6func _process_custom_fx(char_fx: CharFXTransform):
7 char_fx.color = Color.from_hsv(
8 char_fx.elapsed_time - floor(char_fx.elapsed_time), 1.0, 1.0, 1.0
9 )
10 return true
diff --git a/apworld/client/run_from_apworld.tscn b/apworld/client/run_from_apworld.tscn new file mode 100644 index 0000000..11373e0 --- /dev/null +++ b/apworld/client/run_from_apworld.tscn
@@ -0,0 +1,30 @@
1[gd_scene load_steps=11 format=2]
2
3[sub_resource id=2 type="GDScript"]
4script/source = "extends Node2D
5
6
7func _ready():
8 var args = OS.get_cmdline_user_args()
9 var apworld_path = args[0]
10
11 var zip_reader = ZIPReader.new()
12 zip_reader.open(apworld_path)
13
14 var runtime_script = GDScript.new()
15 runtime_script.source_code = zip_reader.read_file(\"lingo2/client/apworld_runtime.gd\").get_string_from_utf8()
16 runtime_script.reload()
17
18 zip_reader.close()
19
20 var runtime = runtime_script.new(apworld_path)
21 runtime.name = \"Runtime\"
22
23 global.add_child(runtime)
24
25 runtime.load_script_as_scene.call_deferred(\"settings_screen.gd\", \"settings_screen\")
26
27"
28
29[node name="loader" type="Node2D"]
30script = SubResource( 2 )
diff --git a/apworld/client/run_from_source.tscn b/apworld/client/run_from_source.tscn new file mode 100644 index 0000000..59a914d --- /dev/null +++ b/apworld/client/run_from_source.tscn
@@ -0,0 +1,22 @@
1[gd_scene load_steps=11 format=2]
2
3[sub_resource id=2 type="GDScript"]
4script/source = "extends Node2D
5
6
7func _ready():
8 var args = OS.get_cmdline_user_args()
9 var source_path = args[0]
10
11 var runtime_script = ResourceLoader.load(\"%s/source_runtime.gd\" % source_path)
12 var runtime = runtime_script.new(source_path)
13 runtime.name = \"Runtime\"
14
15 global.add_child(runtime)
16
17 runtime.load_script_as_scene.call_deferred(\"settings_screen.gd\", \"settings_screen\")
18
19"
20
21[node name="loader" type="Node2D"]
22script = SubResource( 2 )
diff --git a/apworld/client/saver.gd b/apworld/client/saver.gd new file mode 100644 index 0000000..44bc179 --- /dev/null +++ b/apworld/client/saver.gd
@@ -0,0 +1,23 @@
1extends "res://scripts/nodes/saver.gd"
2
3
4func levelLoaded():
5 if type == "keyholders":
6 var ap = global.get_node("Archipelago")
7 ap.keyboard.load_keyholders.call_deferred(global.map)
8 else:
9 reload.call_deferred()
10
11
12func reload():
13 # Just rewriting this whole thing so I can remove Chris's safeguard.
14 var file = FileAccess.open(path + type + ".save", FileAccess.READ)
15 if file:
16 var data = file.get_var(true)
17 file.close()
18 for datum in data:
19 var saveable = get_node_or_null(datum[0])
20 if saveable != null:
21 saveable.is_complete = datum[1]
22 if saveable.is_complete:
23 saveable.loadData(saveable.is_complete)
diff --git a/apworld/client/settings_screen.gd b/apworld/client/settings_screen.gd new file mode 100644 index 0000000..89e8b68 --- /dev/null +++ b/apworld/client/settings_screen.gd
@@ -0,0 +1,149 @@
1extends Node
2
3
4func _ready():
5 var theme = preload("res://assets/themes/baseUI.tres")
6
7 var simple_style_box = StyleBoxFlat.new()
8 simple_style_box.bg_color = Color(0, 0, 0, 0)
9
10 var panel = Panel.new()
11 panel.name = "Panel"
12 panel.offset_right = 1920.0
13 panel.offset_bottom = 1080.0
14 add_child(panel)
15
16 var title = Label.new()
17 title.name = "title"
18 title.offset_left = 0.0
19 title.offset_top = 75.0
20 title.offset_right = 1920.0
21 title.offset_bottom = 225.0
22 title.text = "ARCHIPELAGO"
23 title.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
24 title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
25 title.theme = theme
26 panel.add_child(title)
27
28 var connect_button = Button.new()
29 connect_button.name = "connect_button"
30 connect_button.offset_left = 255.0
31 connect_button.offset_top = 875.0
32 connect_button.offset_right = 891.0
33 connect_button.offset_bottom = 1025.0
34 connect_button.add_theme_color_override("font_color_hover", Color(1, 0.501961, 0, 1))
35 connect_button.text = "CONNECT"
36 connect_button.theme = theme
37 panel.add_child(connect_button)
38
39 var quit_button = Button.new()
40 quit_button.name = "quit_button"
41 quit_button.offset_left = 1102.0
42 quit_button.offset_top = 875.0
43 quit_button.offset_right = 1738.0
44 quit_button.offset_bottom = 1025.0
45 quit_button.add_theme_color_override("font_color_hover", Color(1, 0, 0, 1))
46 quit_button.text = "QUIT"
47 quit_button.theme = theme
48 panel.add_child(quit_button)
49
50 var credit2 = Label.new()
51 credit2.name = "credit2"
52 credit2.offset_left = -105.0
53 credit2.offset_top = 346.0
54 credit2.offset_right = 485.0
55 credit2.offset_bottom = 410.0
56 credit2.add_theme_stylebox_override("normal", simple_style_box)
57 credit2.text = "SERVER"
58 credit2.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
59 credit2.theme = theme
60 panel.add_child(credit2)
61
62 var credit3 = Label.new()
63 credit3.name = "credit3"
64 credit3.offset_left = -105.0
65 credit3.offset_top = 519.0
66 credit3.offset_right = 485.0
67 credit3.offset_bottom = 583.0
68 credit3.add_theme_stylebox_override("normal", simple_style_box)
69 credit3.text = "PLAYER"
70 credit3.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
71 credit3.theme = theme
72 panel.add_child(credit3)
73
74 var credit4 = Label.new()
75 credit4.name = "credit4"
76 credit4.offset_left = -105.0
77 credit4.offset_top = 704.0
78 credit4.offset_right = 485.0
79 credit4.offset_bottom = 768.0
80 credit4.add_theme_stylebox_override("normal", simple_style_box)
81 credit4.text = "PASSWORD"
82 credit4.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
83 credit4.theme = theme
84 panel.add_child(credit4)
85
86 var credit5 = Label.new()
87 credit5.name = "credit5"
88 credit5.offset_left = 1239.0
89 credit5.offset_top = 422.0
90 credit5.offset_right = 1829.0
91 credit5.offset_bottom = 486.0
92 credit5.add_theme_stylebox_override("normal", simple_style_box)
93 credit5.text = "OPTIONS"
94 credit5.theme = theme
95 panel.add_child(credit5)
96
97 var server_box = LineEdit.new()
98 server_box.name = "server_box"
99 server_box.offset_left = 502.0
100 server_box.offset_top = 295.0
101 server_box.offset_right = 1144.0
102 server_box.offset_bottom = 445.0
103 server_box.alignment = HORIZONTAL_ALIGNMENT_CENTER
104 server_box.caret_blink = true
105 panel.add_child(server_box)
106
107 var player_box = LineEdit.new()
108 player_box.name = "player_box"
109 player_box.offset_left = 502.0
110 player_box.offset_top = 477.0
111 player_box.offset_right = 1144.0
112 player_box.offset_bottom = 627.0
113 player_box.alignment = HORIZONTAL_ALIGNMENT_CENTER
114 player_box.caret_blink = true
115 panel.add_child(player_box)
116
117 var password_box = LineEdit.new()
118 password_box.name = "password_box"
119 password_box.offset_left = 502.0
120 password_box.offset_top = 659.0
121 password_box.offset_right = 1144.0
122 password_box.offset_bottom = 809.0
123 password_box.alignment = HORIZONTAL_ALIGNMENT_CENTER
124 password_box.caret_blink = true
125 panel.add_child(password_box)
126
127 var accept_dialog = AcceptDialog.new()
128 accept_dialog.name = "AcceptDialog"
129 panel.add_child(accept_dialog)
130
131 var version_mismatch = ConfirmationDialog.new()
132 version_mismatch.name = "VersionMismatch"
133 panel.add_child(version_mismatch)
134
135 var connection_history = MenuButton.new()
136 connection_history.name = "connection_history"
137 connection_history.offset_left = 1239.0
138 connection_history.offset_top = 276.0
139 connection_history.offset_right = 1829.0
140 connection_history.offset_bottom = 372.0
141 connection_history.text = "connection history"
142 connection_history.flat = false
143 panel.add_child(connection_history)
144
145 var runtime = global.get_node("Runtime")
146 var main_script = runtime.load_script("main.gd")
147 var main_node = main_script.new()
148 main_node.name = "Main"
149 add_child(main_node)
diff --git a/apworld/client/source_runtime.gd b/apworld/client/source_runtime.gd new file mode 100644 index 0000000..146587a --- /dev/null +++ b/apworld/client/source_runtime.gd
@@ -0,0 +1,33 @@
1extends Node
2
3var source_path
4
5
6func _init(path):
7 source_path = path
8
9
10func path_exists(path):
11 return FileAccess.file_exists("%s/%s" % [source_path, path])
12
13
14func load_script(path):
15 return ResourceLoader.load("%s/%s" % [source_path, path])
16
17
18func read_path(path):
19 return FileAccess.get_file_as_bytes("%s/%s" % [source_path, path])
20
21
22func load_script_as_scene(path, scene_name):
23 var script = load_script(path)
24 var instance = script.new()
25 instance.name = scene_name
26
27 get_tree().unload_current_scene()
28 _load_scene.call_deferred(instance)
29
30
31func _load_scene(instance):
32 get_tree().get_root().add_child(instance)
33 get_tree().current_scene = instance
diff --git a/apworld/client/teleport.gd b/apworld/client/teleport.gd new file mode 100644 index 0000000..428d50b --- /dev/null +++ b/apworld/client/teleport.gd
@@ -0,0 +1,38 @@
1extends "res://scripts/nodes/teleport.gd"
2
3var item_id
4var item_amount
5
6
7func _ready():
8 var node_path = String(
9 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
10 )
11
12 var gamedata = global.get_node("Gamedata")
13 var door_id = gamedata.get_door_for_map_node_path(global.map, node_path)
14 if door_id != null:
15 var ap = global.get_node("Archipelago")
16 var item_lock = ap.get_item_id_for_door(door_id)
17
18 if item_lock != null:
19 item_id = item_lock[0]
20 item_amount = item_lock[1]
21
22 self.senders = []
23 self.senderGroup = []
24 self.nested = false
25 self.complete_at = 0
26 self.max_length = 0
27 self.excludeSenders = []
28
29 call_deferred("_readier")
30
31 super._ready()
32
33
34func _readier():
35 var ap = global.get_node("Archipelago")
36
37 if ap.client.getItemAmount(item_id) >= item_amount:
38 handleTriggered()
diff --git a/apworld/client/teleportListener.gd b/apworld/client/teleportListener.gd new file mode 100644 index 0000000..6f363af --- /dev/null +++ b/apworld/client/teleportListener.gd
@@ -0,0 +1,49 @@
1extends "res://scripts/nodes/listeners/teleportListener.gd"
2
3var item_id
4var item_amount
5
6
7func _ready():
8 var node_path = String(
9 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
10 )
11
12 if (
13 global.map == "daedalus"
14 and (
15 node_path == "Components/Triggers/teleportListenerConnections"
16 or node_path == "Components/Triggers/teleportListenerConnections2"
17 )
18 ):
19 # Effectively disable these.
20 teleport_point = target_path.position
21 return
22
23 var gamedata = global.get_node("Gamedata")
24 var door_id = gamedata.get_door_for_map_node_path(global.map, node_path)
25 if door_id != null:
26 var ap = global.get_node("Archipelago")
27 var item_lock = ap.get_item_id_for_door(door_id)
28
29 if item_lock != null:
30 item_id = item_lock[0]
31 item_amount = item_lock[1]
32
33 self.senders = []
34 self.senderGroup = []
35 self.nested = false
36 self.complete_at = 0
37 self.max_length = 0
38 self.excludeSenders = []
39
40 call_deferred("_readier")
41
42 super._ready()
43
44
45func _readier():
46 var ap = global.get_node("Archipelago")
47
48 if ap.client.getItemAmount(item_id) >= item_amount:
49 handleTriggered()
diff --git a/apworld/client/textclient.gd b/apworld/client/textclient.gd new file mode 100644 index 0000000..ce28a3a --- /dev/null +++ b/apworld/client/textclient.gd
@@ -0,0 +1,508 @@
1extends CanvasLayer
2
3var tabs
4var panel
5var label
6var entry
7var is_open = false
8
9var locations_overlay
10var location_texture
11var worldport_texture
12var goal_texture
13
14var tracker_tree
15var tracker_loc_tree_item_by_id = {}
16var tracker_port_tree_item_by_id = {}
17var tracker_goal_tree_item = null
18var tracker_object_by_index = {}
19var tracker_object_by_ignored_index = {}
20var tracker_ignored_group = null
21
22var worldports_tab
23var worldports_tree
24var port_tree_item_by_map = {}
25var port_tree_item_by_map_port = {}
26
27const kLocation = 0
28const kWorldport = 1
29const kGoal = 2
30
31
32func _ready():
33 process_mode = ProcessMode.PROCESS_MODE_ALWAYS
34 layer = 2
35
36 locations_overlay = RichTextLabel.new()
37 locations_overlay.name = "LocationsOverlay"
38 locations_overlay.offset_top = 220
39 locations_overlay.offset_bottom = 720
40 locations_overlay.offset_left = 20
41 locations_overlay.anchor_right = 1.0
42 locations_overlay.offset_right = -10
43 locations_overlay.scroll_active = false
44 locations_overlay.mouse_filter = Control.MOUSE_FILTER_IGNORE
45 locations_overlay.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
46 add_child(locations_overlay)
47 update_locations_visibility()
48
49 tabs = TabContainer.new()
50 tabs.name = "Tabs"
51 tabs.offset_left = 100
52 tabs.offset_right = 1820
53 tabs.offset_top = 100
54 tabs.offset_bottom = 980
55 tabs.visible = false
56 tabs.theme = preload("res://assets/themes/baseUI.tres")
57 tabs.add_theme_font_size_override("font_size", 36)
58 add_child(tabs)
59
60 panel = MarginContainer.new()
61 panel.name = "Text Client"
62 panel.add_theme_constant_override("margin_top", 60)
63 panel.add_theme_constant_override("margin_left", 60)
64 panel.add_theme_constant_override("margin_right", 60)
65 panel.add_theme_constant_override("margin_bottom", 60)
66 tabs.add_child(panel)
67
68 label = RichTextLabel.new()
69 label.set_name("Label")
70 label.scroll_following = true
71 label.selection_enabled = true
72 label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
73 label.size_flags_vertical = Control.SIZE_EXPAND_FILL
74 label.push_font(preload("res://assets/fonts/Lingo2.ttf"))
75 label.push_font_size(30)
76
77 var entry_style = StyleBoxFlat.new()
78 entry_style.bg_color = Color(0.9, 0.9, 0.9, 1)
79
80 entry = LineEdit.new()
81 entry.set_name("Entry")
82 entry.add_theme_font_override("font", preload("res://assets/fonts/Lingo2.ttf"))
83 entry.add_theme_font_size_override("font_size", 36)
84 entry.add_theme_color_override("font_color", Color(0, 0, 0, 1))
85 entry.add_theme_color_override("cursor_color", Color(0, 0, 0, 1))
86 entry.add_theme_stylebox_override("focus", entry_style)
87 entry.text_submitted.connect(text_entered)
88
89 var tc_arranger = VBoxContainer.new()
90 tc_arranger.add_child(label)
91 tc_arranger.add_child(entry)
92 tc_arranger.add_theme_constant_override("separation", 40)
93 panel.add_child(tc_arranger)
94
95 var tracker_margins = MarginContainer.new()
96 tracker_margins.name = "Locations"
97 tracker_margins.add_theme_constant_override("margin_top", 60)
98 tracker_margins.add_theme_constant_override("margin_left", 60)
99 tracker_margins.add_theme_constant_override("margin_right", 60)
100 tracker_margins.add_theme_constant_override("margin_bottom", 60)
101 tabs.add_child(tracker_margins)
102
103 tracker_tree = Tree.new()
104 tracker_tree.columns = 4
105 tracker_tree.hide_root = true
106 tracker_tree.add_theme_font_size_override("font_size", 24)
107 tracker_tree.add_theme_color_override("font_color", Color(0.8, 0.8, 0.8, 1))
108 tracker_tree.add_theme_constant_override("v_separation", 1)
109 tracker_tree.item_edited.connect(_on_tracker_button_clicked)
110 tracker_tree.set_column_expand(0, false)
111 tracker_tree.set_column_expand(1, true)
112 tracker_tree.set_column_expand(2, false)
113 tracker_tree.set_column_expand(3, false)
114 tracker_tree.set_column_custom_minimum_width(2, 200)
115 tracker_tree.set_column_custom_minimum_width(3, 200)
116 tracker_margins.add_child(tracker_tree)
117
118 worldports_tab = MarginContainer.new()
119 worldports_tab.name = "Worldports"
120 worldports_tab.add_theme_constant_override("margin_top", 60)
121 worldports_tab.add_theme_constant_override("margin_left", 60)
122 worldports_tab.add_theme_constant_override("margin_right", 60)
123 worldports_tab.add_theme_constant_override("margin_bottom", 60)
124 tabs.add_child(worldports_tab)
125 tabs.set_tab_hidden(2, true)
126
127 worldports_tree = Tree.new()
128 worldports_tree.columns = 2
129 worldports_tree.hide_root = true
130 worldports_tree.theme = preload("res://assets/themes/baseUI.tres")
131 worldports_tree.add_theme_font_size_override("font_size", 24)
132 worldports_tab.add_child(worldports_tree)
133
134 var runtime = global.get_node("Runtime")
135 var location_image = Image.new()
136 location_image.load_png_from_buffer(runtime.read_path("assets/location.png"))
137 location_texture = ImageTexture.create_from_image(location_image)
138
139 var worldport_image = Image.new()
140 worldport_image.load_png_from_buffer(runtime.read_path("assets/worldport.png"))
141 worldport_texture = ImageTexture.create_from_image(worldport_image)
142
143 var goal_image = Image.new()
144 goal_image.load_png_from_buffer(runtime.read_path("assets/goal.png"))
145 goal_texture = ImageTexture.create_from_image(goal_image)
146
147
148func _input(event):
149 if global.loaded and event is InputEventKey and event.pressed:
150 if event.keycode == KEY_TAB and !Input.is_key_pressed(KEY_SHIFT):
151 if !get_tree().paused:
152 is_open = true
153 get_tree().paused = true
154 Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
155 tabs.visible = true
156 entry.grab_focus()
157 get_viewport().set_input_as_handled()
158 else:
159 dismiss()
160 elif event.keycode == KEY_ESCAPE:
161 if is_open:
162 dismiss()
163 get_viewport().set_input_as_handled()
164
165
166func dismiss():
167 if is_open:
168 get_tree().paused = false
169 Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
170 tabs.visible = false
171 is_open = false
172
173
174func parse_printjson(text):
175 label.append_text("[p]" + text + "[/p]")
176
177
178func text_entered(text):
179 var ap = global.get_node("Archipelago")
180 var cmd = text.trim_suffix("\n")
181 entry.text = ""
182 if OS.is_debug_build():
183 if cmd.begins_with("/tp_map "):
184 var new_map = cmd.substr(8)
185 global.map = new_map
186 global.sets_entry_point = false
187 switcher.switch_map("res://objects/scenes/%s.tscn" % new_map)
188 return
189
190 ap.client.say(cmd)
191
192
193func update_locations(reset_locations = true):
194 var ap = global.get_node("Archipelago")
195 var gamedata = global.get_node("Gamedata")
196
197 locations_overlay.clear()
198 locations_overlay.push_font(preload("res://assets/fonts/Lingo2.ttf"))
199 locations_overlay.push_font_size(24)
200 locations_overlay.push_color(Color(0.9, 0.9, 0.9, 1))
201 locations_overlay.push_outline_color(Color(0, 0, 0, 1))
202 locations_overlay.push_outline_size(2)
203
204 var locations = []
205 for location_id in ap.client._accessible_locations:
206 if not ap.client._checked_locations.has(location_id):
207 var location_name = gamedata.location_name_by_id.get(location_id, "(Unknown)")
208 (
209 locations
210 . append(
211 {
212 "name": location_name,
213 "type": kLocation,
214 "id": location_id,
215 "ignored": ap._ignored_locations.has(location_id),
216 "hint": ap.client._hinted_locations.has(location_id),
217 }
218 )
219 )
220
221 for port_id in ap.client._accessible_worldports:
222 if not ap.client._checked_worldports.has(port_id):
223 var port_name = gamedata.get_worldport_display_name(port_id)
224 (
225 locations
226 . append(
227 {
228 "name": port_name,
229 "type": kWorldport,
230 "id": port_id,
231 "ignored": false,
232 "hint": false,
233 }
234 )
235 )
236
237 locations.sort_custom(_cmp_tracker_objects)
238
239 if ap.client._goal_accessible:
240 var location_name = gamedata.ending_display_name_by_name[ap.kEndingNameByVictoryValue[
241 ap.victory_condition
242 ]]
243 (
244 locations
245 . push_front(
246 {
247 "name": location_name,
248 "type": kGoal,
249 "ignored": false,
250 "hint": false,
251 }
252 )
253 )
254
255 var count = 0
256 for location in locations:
257 if count < 18 and not location["ignored"]:
258 locations_overlay.push_paragraph(HORIZONTAL_ALIGNMENT_RIGHT)
259 if location["hint"]:
260 locations_overlay.push_color(Color("#fafad2"))
261 locations_overlay.append_text(location["name"])
262 locations_overlay.append_text(" ")
263 if location["type"] == kLocation:
264 locations_overlay.add_image(location_texture)
265 elif location["type"] == kWorldport:
266 locations_overlay.add_image(worldport_texture)
267 elif location["type"] == kGoal:
268 locations_overlay.add_image(goal_texture)
269 if location["hint"]:
270 locations_overlay.pop()
271 locations_overlay.pop()
272 count += 1
273
274 if count > 18:
275 locations_overlay.append_text("[p align=right][lb]...[rb][/p]")
276
277 if reset_locations:
278 reset_tracker_tab()
279
280 var root_ti = tracker_tree.create_item(null)
281
282 for location in locations:
283 var loc_row
284
285 if location["ignored"]:
286 if tracker_ignored_group == null:
287 tracker_ignored_group = root_ti.create_child()
288 tracker_ignored_group.set_text(1, "Ignored Locations")
289 tracker_ignored_group.set_selectable(0, false)
290 tracker_ignored_group.set_selectable(1, false)
291 tracker_ignored_group.set_selectable(2, false)
292 tracker_ignored_group.set_selectable(3, false)
293
294 loc_row = tracker_ignored_group.create_child()
295 else:
296 loc_row = root_ti.create_child()
297
298 loc_row.set_cell_mode(0, TreeItem.CELL_MODE_ICON)
299 loc_row.set_selectable(0, false)
300 loc_row.set_text(1, location["name"])
301 loc_row.set_selectable(1, false)
302 if location["hint"]:
303 loc_row.set_custom_color(1, Color("#fafad2"))
304 loc_row.set_cell_mode(2, TreeItem.CELL_MODE_CUSTOM)
305 loc_row.set_text(2, "Show Path")
306 loc_row.set_custom_as_button(2, true)
307 loc_row.set_editable(2, true)
308 loc_row.set_selectable(2, false)
309 loc_row.set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER)
310 loc_row.set_selectable(3, false)
311 if location["type"] == kLocation:
312 loc_row.set_cell_mode(3, TreeItem.CELL_MODE_CUSTOM)
313 if location["ignored"]:
314 loc_row.set_text(3, "Unignore")
315 else:
316 loc_row.set_text(3, "Ignore")
317 loc_row.set_custom_as_button(3, true)
318 loc_row.set_editable(3, true)
319 loc_row.set_text_alignment(3, HORIZONTAL_ALIGNMENT_CENTER)
320
321 if location["type"] == kLocation:
322 loc_row.set_icon(0, location_texture)
323 tracker_loc_tree_item_by_id[location["id"]] = loc_row
324 elif location["type"] == kWorldport:
325 loc_row.set_icon(0, worldport_texture)
326 tracker_port_tree_item_by_id[location["id"]] = loc_row
327 elif location["type"] == kGoal:
328 loc_row.set_icon(0, goal_texture)
329 tracker_goal_tree_item = loc_row
330
331 if location["ignored"]:
332 tracker_object_by_ignored_index[loc_row.get_index()] = location
333 else:
334 tracker_object_by_index[loc_row.get_index()] = location
335 else:
336 for loc_row in tracker_tree.get_root().get_children():
337 loc_row.visible = false
338
339 for location_id in tracker_loc_tree_item_by_id.keys():
340 if (
341 ap.client._accessible_locations.has(location_id)
342 and not ap.client._checked_locations.has(location_id)
343 ):
344 tracker_loc_tree_item_by_id[location_id].visible = true
345
346 for port_id in tracker_port_tree_item_by_id.keys():
347 if (
348 ap.client._accessible_worldports.has(port_id)
349 and not ap.client._checked_worldports.has(port_id)
350 ):
351 tracker_port_tree_item_by_id[port_id].visible = true
352
353 if tracker_goal_tree_item != null and ap.client._goal_accessible:
354 tracker_goal_tree_item.visible = true
355
356 if tracker_ignored_group != null:
357 tracker_ignored_group.visible = true
358
359
360func _cmp_tracker_objects(a, b) -> bool:
361 if a["ignored"] != b["ignored"]:
362 return !a["ignored"]
363 elif a["hint"] != b["hint"]:
364 return a["hint"]
365 else:
366 return a["name"] < b["name"]
367
368
369func update_locations_visibility():
370 var ap = global.get_node("Archipelago")
371 locations_overlay.visible = ap.show_locations
372
373
374func _on_tracker_button_clicked():
375 var ap = global.get_node("Archipelago")
376
377 var edited_item = tracker_tree.get_edited()
378 var edited_index = edited_item.get_index()
379
380 if edited_item.get_parent() == tracker_tree.get_root():
381 if tracker_object_by_index.has(edited_index):
382 var tracker_object = tracker_object_by_index[edited_index]
383 if tracker_tree.get_edited_column() == 2:
384 var type_str = ""
385 if tracker_object["type"] == kLocation:
386 type_str = "location"
387 elif tracker_object["type"] == kWorldport:
388 type_str = "worldport"
389 elif tracker_object["type"] == kGoal:
390 type_str = "goal"
391 ap.client.getLogicalPath(type_str, tracker_object.get("id", null))
392 elif tracker_tree.get_edited_column() == 3:
393 ap.toggle_ignored_location(tracker_object["id"])
394 elif edited_item.get_parent() == tracker_ignored_group:
395 # This is the ignored locations group.
396 if (
397 tracker_object_by_ignored_index.has(edited_index)
398 and tracker_tree.get_edited_column() == 3
399 ):
400 var tracker_object = tracker_object_by_ignored_index[edited_index]
401 ap.toggle_ignored_location(tracker_object["id"])
402
403
404func display_logical_path(object_type, object_id, paths):
405 var ap = global.get_node("Archipelago")
406 var gamedata = global.get_node("Gamedata")
407
408 var location_name = "(Unknown)"
409 if object_type == "location" and object_id != null:
410 location_name = gamedata.location_name_by_id.get(object_id, "(Unknown)")
411 elif object_type == "worldport" and object_id != null:
412 location_name = gamedata.get_worldport_display_name(object_id)
413 elif object_type == "goal":
414 location_name = gamedata.ending_display_name_by_name[ap.kEndingNameByVictoryValue[
415 ap.victory_condition
416 ]]
417
418 label.append_text("[p]Path to %s:[/p]" % location_name)
419 label.append_text("[ol]" + "\n".join(paths) + "[/ol]")
420
421 panel.visible = true
422
423
424func setup_worldports():
425 tabs.set_tab_hidden(2, false)
426
427 var root_ti = worldports_tree.create_item(null)
428
429 var ports_by_map_id = {}
430 var display_names_by_map_id = {}
431 var display_names_by_port_id = {}
432
433 var ap = global.get_node("Archipelago")
434 var gamedata = global.get_node("Gamedata")
435 for fpid in ap.port_pairings:
436 var port = gamedata.objects.get_ports()[fpid]
437 var room = gamedata.objects.get_rooms()[port.get_room_id()]
438
439 if not ports_by_map_id.has(room.get_map_id()):
440 ports_by_map_id[room.get_map_id()] = []
441
442 var map = gamedata.objects.get_maps()[room.get_map_id()]
443 display_names_by_map_id[map.get_id()] = map.get_display_name()
444
445 ports_by_map_id[room.get_map_id()].append(fpid)
446 display_names_by_port_id[fpid] = port.get_display_name()
447
448 var sorted_map_ids = ports_by_map_id.keys().duplicate()
449 sorted_map_ids.sort_custom(
450 func(a, b): return display_names_by_map_id[a] < display_names_by_map_id[b]
451 )
452
453 for map_id in sorted_map_ids:
454 var map_ti = root_ti.create_child()
455 map_ti.set_text(0, display_names_by_map_id[map_id])
456 map_ti.visible = false
457 map_ti.collapsed = true
458 port_tree_item_by_map[map_id] = map_ti
459 port_tree_item_by_map_port[map_id] = {}
460
461 var port_ids = ports_by_map_id[map_id]
462 port_ids.sort_custom(
463 func(a, b): return display_names_by_port_id[a] < display_names_by_port_id[b]
464 )
465
466 for port_id in port_ids:
467 var port_ti = map_ti.create_child()
468 port_ti.set_text(0, display_names_by_port_id[port_id])
469 port_ti.set_text(1, gamedata.get_worldport_display_name(ap.port_pairings[port_id]))
470 port_ti.visible = false
471 port_tree_item_by_map_port[map_id][port_id] = port_ti
472
473 update_worldports()
474
475
476func update_worldports():
477 var ap = global.get_node("Archipelago")
478
479 for map_id in port_tree_item_by_map_port.keys():
480 var map_visible = false
481
482 for port_id in port_tree_item_by_map_port[map_id].keys():
483 var ti = port_tree_item_by_map_port[map_id][port_id]
484 ti.visible = ap.client._checked_worldports.has(port_id)
485
486 if ti.visible:
487 map_visible = true
488
489 port_tree_item_by_map[map_id].visible = map_visible
490
491
492func reset():
493 locations_overlay.clear()
494 tabs.set_tab_hidden(2, true)
495 port_tree_item_by_map.clear()
496 port_tree_item_by_map_port.clear()
497 worldports_tree.clear()
498 reset_tracker_tab()
499
500
501func reset_tracker_tab():
502 tracker_loc_tree_item_by_id.clear()
503 tracker_port_tree_item_by_id.clear()
504 tracker_goal_tree_item = null
505 tracker_object_by_index.clear()
506 tracker_object_by_ignored_index.clear()
507 tracker_ignored_group = null
508 tracker_tree.clear()
diff --git a/apworld/client/unlockReaderListener.gd b/apworld/client/unlockReaderListener.gd new file mode 100644 index 0000000..a5754b9 --- /dev/null +++ b/apworld/client/unlockReaderListener.gd
@@ -0,0 +1,46 @@
1extends "res://scripts/nodes/listeners/unlockReaderListener.gd"
2
3var item_id = null
4var item_amount
5
6
7func _ready():
8 var node_path = String(
9 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
10 )
11
12 var gamedata = global.get_node("Gamedata")
13 var door_id = gamedata.get_door_for_map_node_path(global.map, node_path)
14 if door_id != null:
15 var ap = global.get_node("Archipelago")
16 var item_lock = ap.get_item_id_for_door(door_id)
17
18 if item_lock != null:
19 item_id = item_lock[0]
20 item_amount = item_lock[1]
21
22 self.senders = []
23 self.senderGroup = []
24 self.nested = false
25 self.complete_at = 0
26 self.max_length = 0
27 self.excludeSenders = []
28
29 super._ready()
30
31
32func _readier():
33 if item_id != null:
34 var ap = global.get_node("Archipelago")
35
36 if ap.client.getItemAmount(item_id) >= item_amount:
37 handleTriggered()
38 else:
39 super._readier()
40
41
42func handleTriggered():
43 if item_id != null:
44 emit_signal("trigger")
45 else:
46 super.handleTriggered()
diff --git a/apworld/client/vendor/LICENSE b/apworld/client/vendor/LICENSE new file mode 100644 index 0000000..12763b1 --- /dev/null +++ b/apworld/client/vendor/LICENSE
@@ -0,0 +1,21 @@
1WebSocketServer.gd:
2
3Copyright (c) 2014-present Godot Engine contributors. Copyright (c) 2007-2014
4Juan Linietsky, Ariel Manzur.
5
6Permission is hereby granted, free of charge, to any person obtaining a copy of
7this software and associated documentation files (the "Software"), to deal in
8the Software without restriction, including without limitation the rights to
9use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
10the Software, and to permit persons to whom the Software is furnished to do so,
11subject to the following conditions:
12
13The above copyright notice and this permission notice shall be included in all
14copies or substantial portions of the Software.
15
16THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/apworld/client/vendor/WebSocketServer.gd b/apworld/client/vendor/WebSocketServer.gd new file mode 100644 index 0000000..2cee494 --- /dev/null +++ b/apworld/client/vendor/WebSocketServer.gd
@@ -0,0 +1,173 @@
1class_name WebSocketServer
2extends Node
3
4signal message_received(peer_id: int, message: String)
5signal client_connected(peer_id: int)
6signal client_disconnected(peer_id: int)
7
8@export var handshake_headers := PackedStringArray()
9@export var supported_protocols := PackedStringArray()
10@export var handshake_timout := 3000
11@export var use_tls := false
12@export var tls_cert: X509Certificate
13@export var tls_key: CryptoKey
14@export var refuse_new_connections := false:
15 set(refuse):
16 if refuse:
17 pending_peers.clear()
18
19
20class PendingPeer:
21 var connect_time: int
22 var tcp: StreamPeerTCP
23 var connection: StreamPeer
24 var ws: WebSocketPeer
25
26 func _init(p_tcp: StreamPeerTCP) -> void:
27 tcp = p_tcp
28 connection = p_tcp
29 connect_time = Time.get_ticks_msec()
30
31
32var tcp_server := TCPServer.new()
33var pending_peers: Array[PendingPeer] = []
34var peers: Dictionary
35
36
37func listen(port: int) -> int:
38 assert(not tcp_server.is_listening())
39 return tcp_server.listen(port)
40
41
42func stop() -> void:
43 tcp_server.stop()
44 pending_peers.clear()
45 peers.clear()
46
47
48func send(peer_id: int, message: String) -> int:
49 var type := typeof(message)
50 if peer_id <= 0:
51 # Send to multiple peers, (zero = broadcast, negative = exclude one).
52 for id: int in peers:
53 if id == -peer_id:
54 continue
55 if type == TYPE_STRING:
56 peers[id].send_text(message)
57 else:
58 peers[id].put_packet(message)
59 return OK
60
61 assert(peers.has(peer_id))
62 var socket: WebSocketPeer = peers[peer_id]
63 if type == TYPE_STRING:
64 return socket.send_text(message)
65 return socket.send(var_to_bytes(message))
66
67
68func get_message(peer_id: int) -> Variant:
69 assert(peers.has(peer_id))
70 var socket: WebSocketPeer = peers[peer_id]
71 if socket.get_available_packet_count() < 1:
72 return null
73 var pkt: PackedByteArray = socket.get_packet()
74 if socket.was_string_packet():
75 return pkt.get_string_from_utf8()
76 return bytes_to_var(pkt)
77
78
79func has_message(peer_id: int) -> bool:
80 assert(peers.has(peer_id))
81 return peers[peer_id].get_available_packet_count() > 0
82
83
84func _create_peer() -> WebSocketPeer:
85 var ws := WebSocketPeer.new()
86 ws.supported_protocols = supported_protocols
87 ws.handshake_headers = handshake_headers
88 return ws
89
90
91func poll() -> void:
92 if not tcp_server.is_listening():
93 return
94
95 while not refuse_new_connections and tcp_server.is_connection_available():
96 var conn: StreamPeerTCP = tcp_server.take_connection()
97 assert(conn != null)
98 pending_peers.append(PendingPeer.new(conn))
99
100 var to_remove := []
101
102 for p in pending_peers:
103 if not _connect_pending(p):
104 if p.connect_time + handshake_timout < Time.get_ticks_msec():
105 # Timeout.
106 to_remove.append(p)
107 continue # Still pending.
108
109 to_remove.append(p)
110
111 for r: RefCounted in to_remove:
112 pending_peers.erase(r)
113
114 to_remove.clear()
115
116 for id: int in peers:
117 var p: WebSocketPeer = peers[id]
118 p.poll()
119
120 if p.get_ready_state() != WebSocketPeer.STATE_OPEN:
121 client_disconnected.emit(id)
122 to_remove.append(id)
123 continue
124
125 while p.get_available_packet_count():
126 message_received.emit(id, get_message(id))
127
128 for r: int in to_remove:
129 peers.erase(r)
130 to_remove.clear()
131
132
133func _connect_pending(p: PendingPeer) -> bool:
134 if p.ws != null:
135 # Poll websocket client if doing handshake.
136 p.ws.poll()
137 var state := p.ws.get_ready_state()
138 if state == WebSocketPeer.STATE_OPEN:
139 var id := randi_range(2, 1 << 30)
140 peers[id] = p.ws
141 client_connected.emit(id)
142 return true # Success.
143 elif state != WebSocketPeer.STATE_CONNECTING:
144 return true # Failure.
145 return false # Still connecting.
146 elif p.tcp.get_status() != StreamPeerTCP.STATUS_CONNECTED:
147 return true # TCP disconnected.
148 elif not use_tls:
149 # TCP is ready, create WS peer.
150 p.ws = _create_peer()
151 p.ws.accept_stream(p.tcp)
152 return false # WebSocketPeer connection is pending.
153
154 else:
155 if p.connection == p.tcp:
156 assert(tls_key != null and tls_cert != null)
157 var tls := StreamPeerTLS.new()
158 tls.accept_stream(p.tcp, TLSOptions.server(tls_key, tls_cert))
159 p.connection = tls
160 p.connection.poll()
161 var status: StreamPeerTLS.Status = p.connection.get_status()
162 if status == StreamPeerTLS.STATUS_CONNECTED:
163 p.ws = _create_peer()
164 p.ws.accept_stream(p.connection)
165 return false # WebSocketPeer connection is pending.
166 if status != StreamPeerTLS.STATUS_HANDSHAKING:
167 return true # Failure.
168
169 return false
170
171
172func _process(_delta: float) -> void:
173 poll()
diff --git a/apworld/client/victoryListener.gd b/apworld/client/victoryListener.gd new file mode 100644 index 0000000..e9089d7 --- /dev/null +++ b/apworld/client/victoryListener.gd
@@ -0,0 +1,20 @@
1extends Receiver
2
3
4func _ready():
5 super._ready()
6
7
8func handleTriggered():
9 triggered += 1
10 if triggered >= total:
11 var ap = global.get_node("Archipelago")
12 ap.client.completedGoal()
13
14 global.get_node("Messages").showMessage("You have completed your goal!")
15
16
17func handleUntriggered():
18 triggered -= 1
19 if triggered < total:
20 pass
diff --git a/apworld/client/visibilityListener.gd b/apworld/client/visibilityListener.gd new file mode 100644 index 0000000..5ea17a0 --- /dev/null +++ b/apworld/client/visibilityListener.gd
@@ -0,0 +1,38 @@
1extends "res://scripts/nodes/listeners/visibilityListener.gd"
2
3var item_id
4var item_amount
5
6
7func _ready():
8 var node_path = String(
9 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
10 )
11
12 var gamedata = global.get_node("Gamedata")
13 var door_id = gamedata.get_door_for_map_node_path(global.map, node_path)
14 if door_id != null:
15 var ap = global.get_node("Archipelago")
16 var item_lock = ap.get_item_id_for_door(door_id)
17
18 if item_lock != null:
19 item_id = item_lock[0]
20 item_amount = item_lock[1]
21
22 self.senders = []
23 self.senderGroup = []
24 self.nested = false
25 self.complete_at = 0
26 self.max_length = 0
27 self.excludeSenders = []
28
29 call_deferred("_readier")
30
31 super._ready()
32
33
34func _readier():
35 var ap = global.get_node("Archipelago")
36
37 if ap.client.getItemAmount(item_id) >= item_amount:
38 handleTriggered()
diff --git a/apworld/client/worldport.gd b/apworld/client/worldport.gd new file mode 100644 index 0000000..ed9891e --- /dev/null +++ b/apworld/client/worldport.gd
@@ -0,0 +1,61 @@
1extends "res://scripts/nodes/worldport.gd"
2
3var absolute_rotation = false
4var target_rotation = 0
5
6var port_id = null
7
8
9func _ready():
10 var node_path = String(
11 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
12 )
13
14 var ap = global.get_node("Archipelago")
15
16 if ap.shuffle_worldports:
17 var gamedata = global.get_node("Gamedata")
18 port_id = gamedata.get_port_for_map_node_path(global.map, node_path)
19 if port_id != null:
20 if port_id in ap.port_pairings:
21 var target_port = gamedata.objects.get_ports()[ap.port_pairings[port_id]]
22 var target_room = gamedata.objects.get_rooms()[target_port.get_room_id()]
23 var target_map = gamedata.objects.get_maps()[target_room.get_map_id()]
24
25 exit = target_map.get_name()
26 entry_point.x = target_port.get_destination().get_x()
27 entry_point.y = target_port.get_destination().get_y()
28 entry_point.z = target_port.get_destination().get_z()
29 absolute_rotation = true
30 target_rotation = target_port.get_rotation()
31 sets_entry_point = true
32 invisible = false
33 fades = true
34 else:
35 port_id = null
36
37 if global.map == "icarus" and exit == "daedalus":
38 if not ap.daedalus_roof_access:
39 entry_point = Vector3(58, 10, 0)
40
41 super._ready()
42
43
44func bodyEntered(body):
45 if body.is_in_group("player"):
46 if port_id != null:
47 var ap = global.get_node("Archipelago")
48 ap.client.checkWorldport(port_id)
49
50 if absolute_rotation:
51 entry_rotate.y = target_rotation - body.rotation_degrees.y
52
53 super.bodyEntered(body)
54
55
56func changeScene():
57 var player = get_tree().get_root().get_node("scene/player")
58 if player != null:
59 player.playable = false
60
61 super.changeScene()
diff --git a/apworld/client/worldportListener.gd b/apworld/client/worldportListener.gd new file mode 100644 index 0000000..4cff8e9 --- /dev/null +++ b/apworld/client/worldportListener.gd
@@ -0,0 +1,8 @@
1extends "res://scripts/nodes/listeners/worldportListener.gd"
2
3
4func handleTriggered():
5 if exit.begins_with("menus/credits"):
6 return
7
8 super.handleTriggered()
diff --git a/apworld/context.py b/apworld/context.py new file mode 100644 index 0000000..86392f9 --- /dev/null +++ b/apworld/context.py
@@ -0,0 +1,800 @@
1import asyncio
2import os
3import pkgutil
4import subprocess
5import sys
6from typing import Any
7
8import websockets
9
10import Utils
11import settings
12from BaseClasses import ItemClassification
13from CommonClient import CommonContext, server_loop, gui_enabled, logger, get_base_parser, handle_url_arg
14from NetUtils import Endpoint, decode, encode, ClientStatus
15from Utils import async_start
16from . import Lingo2World
17from .tracker import Tracker
18
19ALL_LETTERS = "abcdefghijklmnopqrstuvwxyz"
20MESSAGE_MAX_SIZE = 16*1024*1024
21PORT = 43182
22
23KEY_STORAGE_MAPPING = {
24 "a": (1, 0), "b": (1, 1), "c": (1, 2), "d": (1, 3), "e": (1, 4), "f": (1, 5), "g": (1, 6), "h": (1, 7), "i": (1, 8),
25 "j": (1, 9), "k": (1, 10), "l": (1, 11), "m": (1, 12), "n": (2, 0), "o": (2, 1), "p": (2, 2), "q": (2, 3),
26 "r": (2, 4), "s": (2, 5), "t": (2, 6), "u": (2, 7), "v": (2, 8), "w": (2, 9), "x": (2, 10), "y": (2, 11),
27 "z": (2, 12),
28}
29
30REVERSE_KEY_STORAGE_MAPPING = {t: k for k, t in KEY_STORAGE_MAPPING.items()}
31
32
33# There is a distinction between an object's ID and its AP ID. The latter is stable between releases, whereas the former
34# can change and is also namespaced based on the object type. We should only store AP IDs in multiworld state (such as
35# slot data and data storage) to increase compatability between releases. The data we currently store is:
36# - Port pairings for worldport shuffle (slot data)
37# - Checked worldports for worldport shuffle (data storage)
38# - Latched doors (data storage)
39# The client generally deals in the actual object IDs rather than the stable IDs, although it does have to convert the
40# port pairing IDs when reading them from slot data. The context (this file here) does the work of converting back and
41# forth between the values. AP IDs are converted to IDs after reading them from data storage, and IDs are converted to
42# AP IDs before sending them to data storage.
43class Lingo2Manager:
44 game_ctx: "Lingo2GameContext"
45 client_ctx: "Lingo2ClientContext"
46 tracker: Tracker
47
48 keyboard: dict[str, int]
49 worldports: set[int]
50 goaled: bool
51 latches: set[int]
52 hinted_locations: set[int]
53
54 def __init__(self, game_ctx: "Lingo2GameContext", client_ctx: "Lingo2ClientContext"):
55 self.game_ctx = game_ctx
56 self.game_ctx.manager = self
57 self.client_ctx = client_ctx
58 self.client_ctx.manager = self
59 self.tracker = Tracker(self)
60 self.keyboard = {}
61
62 self.reset()
63
64 def reset(self):
65 for k in ALL_LETTERS:
66 self.keyboard[k] = 0
67
68 self.worldports = set()
69 self.goaled = False
70 self.latches = set()
71 self.hinted_locations = set()
72
73 def update_keyboard(self, new_keyboard: dict[str, int]) -> dict[str, int]:
74 ret: dict[str, int] = {}
75
76 for k, v in new_keyboard.items():
77 if v > self.keyboard.get(k, 0):
78 self.keyboard[k] = v
79 ret[k] = v
80
81 if len(ret) > 0:
82 self.tracker.refresh_state()
83 self.game_ctx.send_accessible_locations()
84
85 return ret
86
87 # Input should be real IDs, not AP IDs
88 def update_worldports(self, new_worldports: set[int]) -> set[int]:
89 ret = new_worldports.difference(self.worldports)
90 self.worldports.update(new_worldports)
91
92 if len(ret) > 0:
93 self.tracker.refresh_state()
94 self.game_ctx.send_accessible_locations()
95
96 return ret
97
98 def update_latches(self, new_latches: set[int]) -> set[int]:
99 ret = new_latches.difference(self.latches)
100 self.latches.update(new_latches)
101
102 return ret
103
104 def update_hinted_locations(self, new_locs: set[int]) -> set[int]:
105 ret = new_locs.difference(self.hinted_locations)
106 self.hinted_locations.update(new_locs)
107
108 return ret
109
110
111class Lingo2GameContext:
112 server: Endpoint | None
113 manager: Lingo2Manager
114
115 def __init__(self):
116 self.server = None
117
118 def send_connected(self):
119 if self.server is None:
120 return
121
122 msg = {
123 "cmd": "Connected",
124 "user": self.manager.client_ctx.username,
125 "seed_name": self.manager.client_ctx.seed_name,
126 "version": self.manager.client_ctx.server_version,
127 "generator_version": self.manager.client_ctx.generator_version,
128 "team": self.manager.client_ctx.team,
129 "slot": self.manager.client_ctx.slot,
130 "checked_locations": self.manager.client_ctx.checked_locations,
131 "slot_data": self.manager.client_ctx.slot_data,
132 }
133
134 async_start(self.send_msgs([msg]), name="game Connected")
135
136 def send_connection_refused(self, text):
137 if self.server is None:
138 return
139
140 msg = {
141 "cmd": "ConnectionRefused",
142 "text": text,
143 }
144
145 async_start(self.send_msgs([msg]), name="game ConnectionRefused")
146
147 def send_item_sent_notification(self, item_name, receiver_name, item_flags):
148 if self.server is None:
149 return
150
151 msg = {
152 "cmd": "ItemSentNotif",
153 "item_name": item_name,
154 "receiver_name": receiver_name,
155 "item_flags": item_flags,
156 }
157
158 async_start(self.send_msgs([msg]), name="item sent notif")
159
160 def send_hint_received(self, item_name, location_name, receiver_name, item_flags, for_self):
161 if self.server is None:
162 return
163
164 msg = {
165 "cmd": "HintReceived",
166 "item_name": item_name,
167 "location_name": location_name,
168 "receiver_name": receiver_name,
169 "item_flags": item_flags,
170 "self": int(for_self),
171 }
172
173 async_start(self.send_msgs([msg]), name="hint received notif")
174
175 def send_item_received(self, items):
176 if self.server is None:
177 return
178
179 msg = {
180 "cmd": "ItemReceived",
181 "items": items,
182 }
183
184 async_start(self.send_msgs([msg]), name="item received")
185
186 def send_location_info(self, locations):
187 if self.server is None:
188 return
189
190 msg = {
191 "cmd": "LocationInfo",
192 "locations": locations,
193 }
194
195 async_start(self.send_msgs([msg]), name="location info")
196
197 def send_text_message(self, parts):
198 if self.server is None:
199 return
200
201 msg = {
202 "cmd": "TextMessage",
203 "data": parts,
204 }
205
206 async_start(self.send_msgs([msg]), name="notif")
207
208 def send_accessible_locations(self):
209 if self.server is None:
210 return
211
212 msg = {
213 "cmd": "AccessibleLocations",
214 "locations": list(self.manager.tracker.accessible_locations),
215 }
216
217 if len(self.manager.tracker.accessible_worldports) > 0:
218 msg["worldports"] = list(self.manager.tracker.accessible_worldports)
219
220 if self.manager.tracker.goal_accessible and not self.manager.goaled:
221 msg["goal"] = True
222
223 async_start(self.send_msgs([msg]), name="accessible locations")
224
225 def send_update_locations(self, locations):
226 if self.server is None:
227 return
228
229 msg = {
230 "cmd": "UpdateLocations",
231 "locations": locations,
232 }
233
234 async_start(self.send_msgs([msg]), name="update locations")
235
236 def send_update_keyboard(self, updates):
237 if self.server is None:
238 return
239
240 msg = {
241 "cmd": "UpdateKeyboard",
242 "updates": updates,
243 }
244
245 async_start(self.send_msgs([msg]), name="update keyboard")
246
247 # Input should be real IDs, not AP IDs
248 def send_update_worldports(self, worldports):
249 if self.server is None:
250 return
251
252 msg = {
253 "cmd": "UpdateWorldports",
254 "worldports": worldports,
255 }
256
257 async_start(self.send_msgs([msg]), name="update worldports")
258
259 def send_path_reply(self, object_type: str, object_id: int | None, path: list[str]):
260 if self.server is None:
261 return
262
263 msg = {
264 "cmd": "PathReply",
265 "type": object_type,
266 "path": path,
267 }
268
269 if object_id is not None:
270 msg["id"] = object_id
271
272 async_start(self.send_msgs([msg]), name="path reply")
273
274 def send_update_latches(self, latches):
275 if self.server is None:
276 return
277
278 msg = {
279 "cmd": "UpdateLatches",
280 "latches": latches,
281 }
282
283 async_start(self.send_msgs([msg]), name="update latches")
284
285 def send_ignored_locations(self, ignored_locations):
286 if self.server is None:
287 return
288
289 msg = {
290 "cmd": "SetIgnoredLocations",
291 "locations": ignored_locations,
292 }
293
294 async_start(self.send_msgs([msg]), name="set ignored locations")
295
296 def send_update_hinted_locations(self, hinted_locations):
297 if self.server is None:
298 return
299
300 msg = {
301 "cmd": "UpdateHintedLocations",
302 "locations": hinted_locations,
303 }
304
305 async_start(self.send_msgs([msg]), name="update hinted locations")
306
307 async def send_msgs(self, msgs: list[Any]) -> None:
308 """ `msgs` JSON serializable """
309 if not self.server or not self.server.socket.open or self.server.socket.closed:
310 return
311 await self.server.socket.send(encode(msgs))
312
313
314class Lingo2ClientContext(CommonContext):
315 manager: Lingo2Manager
316
317 game = "Lingo 2"
318 items_handling = 0b111
319
320 slot_data: dict[str, Any] | None
321 hints_data_storage_key: str
322 victory_data_storage_key: str
323
324 def __init__(self, server_address: str | None = None, password: str | None = None):
325 super().__init__(server_address, password)
326
327 def make_gui(self):
328 ui = super().make_gui()
329 ui.base_title = "Archipelago Lingo 2 Client"
330 return ui
331
332 async def server_auth(self, password_requested: bool = False):
333 if password_requested and not self.password:
334 self.manager.game_ctx.send_connection_refused("Invalid password.")
335 else:
336 self.auth = self.username
337 await self.send_connect()
338
339 def handle_connection_loss(self, msg: str):
340 super().handle_connection_loss(msg)
341
342 exc_info = sys.exc_info()
343 self.manager.game_ctx.send_connection_refused(str(exc_info[1]))
344
345 def on_package(self, cmd: str, args: dict):
346 if cmd == "RoomInfo":
347 self.seed_name = args.get("seed_name", None)
348 elif cmd == "Connected":
349 self.slot_data = args.get("slot_data", None)
350
351 self.manager.reset()
352
353 self.manager.game_ctx.send_connected()
354
355 self.manager.tracker.setup_slot(self.slot_data)
356 self.manager.tracker.set_checked_locations(self.checked_locations)
357 self.manager.game_ctx.send_accessible_locations()
358
359 self.hints_data_storage_key = f"_read_hints_{self.team}_{self.slot}"
360 self.victory_data_storage_key = f"_read_client_status_{self.team}_{self.slot}"
361
362 self.set_notify(self.get_datastorage_key("keyboard1"), self.get_datastorage_key("keyboard2"),
363 self.victory_data_storage_key, self.get_datastorage_key("latches"),
364 self.get_datastorage_key("ignored_locations"))
365 msg_batch = [{
366 "cmd": "Set",
367 "key": self.get_datastorage_key("keyboard1"),
368 "default": 0,
369 "want_reply": True,
370 "operations": [{"operation": "default", "value": 0}]
371 }, {
372 "cmd": "Set",
373 "key": self.get_datastorage_key("keyboard2"),
374 "default": 0,
375 "want_reply": True,
376 "operations": [{"operation": "default", "value": 0}]
377 }, {
378 "cmd": "Set",
379 "key": self.get_datastorage_key("latches"),
380 "default": [],
381 "want_reply": True,
382 "operations": [{"operation": "default", "value": []}]
383 }, {
384 "cmd": "Set",
385 "key": self.get_datastorage_key("ignored_locations"),
386 "default": [],
387 "want_reply": True,
388 "operations": [{"operation": "default", "value": []}]
389 }]
390
391 if self.slot_data.get("shuffle_worldports", False):
392 self.set_notify(self.get_datastorage_key("worldports"))
393 msg_batch.append({
394 "cmd": "Set",
395 "key": self.get_datastorage_key("worldports"),
396 "default": [],
397 "want_reply": True,
398 "operations": [{"operation": "default", "value": []}]
399 })
400
401 async_start(self.send_msgs(msg_batch), name="default keys")
402 elif cmd == "RoomUpdate":
403 if "checked_locations" in args:
404 self.manager.tracker.set_checked_locations(self.checked_locations)
405 self.manager.game_ctx.send_update_locations(args["checked_locations"])
406 elif cmd == "ReceivedItems":
407 self.manager.tracker.set_collected_items(self.items_received)
408
409 cur_index = 0
410 items = []
411
412 for item in args["items"]:
413 index = cur_index + args["index"]
414 cur_index += 1
415
416 item_msg = {
417 "id": item.item,
418 "index": index,
419 "flags": item.flags,
420 "text": self.item_names.lookup_in_slot(item.item, self.slot),
421 }
422
423 if item.player != self.slot:
424 item_msg["sender"] = self.player_names.get(item.player)
425
426 items.append(item_msg)
427
428 self.manager.game_ctx.send_item_received(items)
429
430 if any(ItemClassification.progression in ItemClassification(item.flags) for item in args["items"]):
431 self.manager.game_ctx.send_accessible_locations()
432 elif cmd == "PrintJSON":
433 if "receiving" in args and "item" in args and args["item"].player == self.slot:
434 item_name = self.item_names.lookup_in_slot(args["item"].item, args["receiving"])
435 location_name = self.location_names.lookup_in_slot(args["item"].location, args["item"].player)
436 receiver_name = self.player_names.get(args["receiving"])
437
438 if args["type"] == "Hint" and not args.get("found", False):
439 self.manager.game_ctx.send_hint_received(item_name, location_name, receiver_name, args["item"].flags,
440 int(args["receiving"]) == self.slot)
441 elif args["receiving"] != self.slot:
442 self.manager.game_ctx.send_item_sent_notification(item_name, receiver_name, args["item"].flags)
443
444 parts = []
445 for message_part in args["data"]:
446 if "type" not in message_part and "text" in message_part:
447 parts.append({"type": "text", "text": message_part["text"]})
448 elif message_part["type"] == "player_id":
449 parts.append({
450 "type": "player",
451 "text": self.player_names.get(int(message_part["text"])),
452 "self": int(int(message_part["text"]) == self.slot),
453 })
454 elif message_part["type"] == "item_id":
455 parts.append({
456 "type": "item",
457 "text": self.item_names.lookup_in_slot(int(message_part["text"]), message_part["player"]),
458 "flags": message_part["flags"],
459 })
460 elif message_part["type"] == "location_id":
461 parts.append({
462 "type": "location",
463 "text": self.location_names.lookup_in_slot(int(message_part["text"]),
464 message_part["player"])
465 })
466 elif "text" in message_part:
467 parts.append({"type": "text", "text": message_part["text"]})
468
469 self.manager.game_ctx.send_text_message(parts)
470 elif cmd == "LocationInfo":
471 locations = []
472
473 for location in args["locations"]:
474 locations.append({
475 "id": location.location,
476 "item": self.item_names.lookup_in_slot(location.item, location.player),
477 "player": self.player_names.get(location.player),
478 "flags": location.flags,
479 "self": int(location.player) == self.slot,
480 })
481
482 self.manager.game_ctx.send_location_info(locations)
483 elif cmd == "Retrieved":
484 for k, v in args["keys"].items():
485 if k == self.victory_data_storage_key:
486 self.handle_status_update(v)
487 elif k == self.hints_data_storage_key:
488 self.update_hints()
489 elif cmd == "SetReply":
490 if args["key"] == self.get_datastorage_key("keyboard1"):
491 self.handle_keyboard_update(1, args)
492 elif args["key"] == self.get_datastorage_key("keyboard2"):
493 self.handle_keyboard_update(2, args)
494 elif args["key"] == self.get_datastorage_key("worldports"):
495 port_ids = set(Lingo2World.static_logic.port_id_by_ap_id[ap_id] for ap_id in args["value"])
496 updates = self.manager.update_worldports(port_ids)
497 if len(updates) > 0:
498 self.manager.game_ctx.send_update_worldports(updates)
499 elif args["key"] == self.victory_data_storage_key:
500 self.handle_status_update(args["value"])
501 elif args["key"] == self.get_datastorage_key("latches"):
502 door_ids = set(Lingo2World.static_logic.door_id_by_ap_id[ap_id] for ap_id in args["value"])
503 updates = self.manager.update_latches(door_ids)
504 if len(updates) > 0:
505 self.manager.game_ctx.send_update_latches(updates)
506 elif args["key"] == self.get_datastorage_key("ignored_locations"):
507 self.manager.game_ctx.send_ignored_locations(args["value"])
508 elif args["key"] == self.hints_data_storage_key:
509 self.update_hints()
510
511 def get_datastorage_key(self, name: str):
512 return f"Lingo2_{self.slot}_{name}"
513
514 async def update_keyboard(self, updates: dict[str, int]):
515 kb1 = 0
516 kb2 = 0
517
518 for k, v in updates.items():
519 if v == 0:
520 continue
521
522 effect = 0
523 if v >= 1:
524 effect |= 1
525 if v == 2:
526 effect |= 2
527
528 pos = KEY_STORAGE_MAPPING[k]
529 if pos[0] == 1:
530 kb1 |= (effect << pos[1] * 2)
531 else:
532 kb2 |= (effect << pos[1] * 2)
533
534 msgs = []
535
536 if kb1 != 0:
537 msgs.append({
538 "cmd": "Set",
539 "key": self.get_datastorage_key("keyboard1"),
540 "want_reply": True,
541 "operations": [{
542 "operation": "or",
543 "value": kb1
544 }]
545 })
546
547 if kb2 != 0:
548 msgs.append({
549 "cmd": "Set",
550 "key": self.get_datastorage_key("keyboard2"),
551 "want_reply": True,
552 "operations": [{
553 "operation": "or",
554 "value": kb2
555 }]
556 })
557
558 if len(msgs) > 0:
559 await self.send_msgs(msgs)
560
561 def handle_keyboard_update(self, field: int, args: dict[str, Any]):
562 keys = {}
563 value = args["value"]
564
565 for i in range(0, 13):
566 if (value & (1 << (i * 2))) != 0:
567 keys[REVERSE_KEY_STORAGE_MAPPING[(field, i)]] = 1
568 if (value & (1 << (i * 2 + 1))) != 0:
569 keys[REVERSE_KEY_STORAGE_MAPPING[(field, i)]] = 2
570
571 updates = self.manager.update_keyboard(keys)
572 if len(updates) > 0:
573 self.manager.game_ctx.send_update_keyboard(updates)
574
575 # Input should be real IDs, not AP IDs
576 async def update_worldports(self, updates: set[int]):
577 port_ap_ids = [Lingo2World.static_logic.objects.ports[port_id].ap_id for port_id in updates]
578 await self.send_msgs([{
579 "cmd": "Set",
580 "key": self.get_datastorage_key("worldports"),
581 "want_reply": True,
582 "operations": [{
583 "operation": "update",
584 "value": port_ap_ids
585 }]
586 }])
587
588 def handle_status_update(self, value: int):
589 self.manager.goaled = (value == ClientStatus.CLIENT_GOAL)
590 self.manager.tracker.refresh_state()
591 self.manager.game_ctx.send_accessible_locations()
592
593 async def update_latches(self, updates: set[int]):
594 door_ap_ids = [Lingo2World.static_logic.objects.doors[door_id].ap_id for door_id in updates]
595 await self.send_msgs([{
596 "cmd": "Set",
597 "key": self.get_datastorage_key("latches"),
598 "want_reply": True,
599 "operations": [{
600 "operation": "update",
601 "value": door_ap_ids
602 }]
603 }])
604
605 async def add_ignored_location(self, loc_id: int):
606 await self.send_msgs([{
607 "cmd": "Set",
608 "key": self.get_datastorage_key("ignored_locations"),
609 "want_reply": True,
610 "operations": [{
611 "operation": "update",
612 "value": [loc_id]
613 }]
614 }])
615
616 async def remove_ignored_location(self, loc_id: int):
617 await self.send_msgs([{
618 "cmd": "Set",
619 "key": self.get_datastorage_key("ignored_locations"),
620 "want_reply": True,
621 "operations": [{
622 "operation": "remove",
623 "value": loc_id
624 }]
625 }])
626
627 def update_hints(self):
628 hints = self.stored_data.get(self.hints_data_storage_key, [])
629
630 hinted_locations = set(hint["location"] for hint in hints if hint["finding_player"] == self.slot)
631 updates = self.manager.update_hinted_locations(hinted_locations)
632 if len(updates) > 0:
633 self.manager.game_ctx.send_update_hinted_locations(updates)
634
635
636async def pipe_loop(manager: Lingo2Manager):
637 while not manager.client_ctx.exit_event.is_set():
638 try:
639 socket = await websockets.connect("ws://localhost", port=PORT, ping_timeout=None, ping_interval=None,
640 max_size=MESSAGE_MAX_SIZE)
641 manager.game_ctx.server = Endpoint(socket)
642 logger.info("Connected to Lingo 2!")
643 if manager.client_ctx.auth is not None:
644 manager.game_ctx.send_connected()
645 manager.game_ctx.send_accessible_locations()
646 async for data in manager.game_ctx.server.socket:
647 for msg in decode(data):
648 await process_game_cmd(manager, msg)
649 except ConnectionRefusedError:
650 logger.info("Could not connect to Lingo 2.")
651 finally:
652 manager.game_ctx.server = None
653
654
655async def process_game_cmd(manager: Lingo2Manager, args: dict):
656 cmd = args["cmd"]
657
658 if cmd == "Connect":
659 manager.client_ctx.seed_name = None
660
661 server = args.get("server")
662 player = args.get("player")
663 password = args.get("password")
664
665 if password != "":
666 server_address = f"{player}:{password}@{server}"
667 else:
668 server_address = f"{player}:None@{server}"
669
670 async_start(manager.client_ctx.connect(server_address), name="client connect")
671 elif cmd == "Disconnect":
672 manager.client_ctx.seed_name = None
673
674 async_start(manager.client_ctx.disconnect(), name="client disconnect")
675 elif cmd in ["Sync", "LocationChecks", "Say", "StatusUpdate", "LocationScouts"]:
676 async_start(manager.client_ctx.send_msgs([args]), name="client forward")
677 elif cmd == "UpdateKeyboard":
678 updates = manager.update_keyboard(args["keyboard"])
679 if len(updates) > 0:
680 async_start(manager.client_ctx.update_keyboard(updates), name="client update keyboard")
681 elif cmd == "CheckWorldport":
682 port_id = args["port_id"]
683 port_ap_id = Lingo2World.static_logic.objects.ports[port_id].ap_id
684 worldports = {port_id}
685
686 # Also check the reverse port if it's a two-way connection.
687 port_pairings = manager.client_ctx.slot_data["port_pairings"]
688 if str(port_ap_id) in port_pairings and\
689 port_pairings.get(str(port_pairings[str(port_ap_id)]), None) == port_ap_id:
690 worldports.add(Lingo2World.static_logic.port_id_by_ap_id[port_pairings[str(port_ap_id)]])
691
692 updates = manager.update_worldports(worldports)
693 if len(updates) > 0:
694 async_start(manager.client_ctx.update_worldports(updates), name="client update worldports")
695 manager.game_ctx.send_update_worldports(updates)
696 elif cmd == "GetPath":
697 path = None
698
699 if args["type"] == "location":
700 path = manager.tracker.get_path_to_location(args["id"])
701 elif args["type"] == "worldport":
702 path = manager.tracker.get_path_to_port(args["id"])
703 elif args["type"] == "goal":
704 path = manager.tracker.get_path_to_goal()
705
706 manager.game_ctx.send_path_reply(args["type"], args.get("id", None), path)
707 elif cmd == "LatchDoor":
708 updates = manager.update_latches({args["door"]})
709 if len(updates) > 0:
710 async_start(manager.client_ctx.update_latches(updates), name="client update latches")
711 elif cmd == "IgnoreLocation":
712 async_start(manager.client_ctx.add_ignored_location(args["id"]), name="client ignore loc")
713 elif cmd == "UnignoreLocation":
714 async_start(manager.client_ctx.remove_ignored_location(args["id"]), name="client unignore loc")
715 elif cmd == "Quit":
716 manager.client_ctx.exit_event.set()
717
718
719async def run_game():
720 exe_file = settings.get_settings().lingo2_options.exe_file
721
722 # This ensures we can use Steam features without having to open the game
723 # through steam.
724 steam_appid_path = os.path.join(os.path.dirname(exe_file), "steam_appid.txt")
725 with open(steam_appid_path, "w") as said_handle:
726 said_handle.write("2523310")
727
728 if Lingo2World.zip_path is not None:
729 # This is a packaged apworld.
730 init_scene = pkgutil.get_data(__name__, "client/run_from_apworld.tscn")
731 init_path = Utils.local_path("data", "lingo2_init.tscn")
732
733 with open(init_path, "wb") as file_handle:
734 file_handle.write(init_scene)
735
736 subprocess.Popen(
737 [
738 exe_file,
739 "--scene",
740 init_path,
741 "--",
742 str(Lingo2World.zip_path.absolute()),
743 ],
744 cwd=os.path.dirname(exe_file),
745 )
746 else:
747 # The world is unzipped and being run in source.
748 subprocess.Popen(
749 [
750 exe_file,
751 "--scene",
752 Utils.local_path("worlds", "lingo2", "client", "run_from_source.tscn"),
753 "--",
754 Utils.local_path("worlds", "lingo2", "client"),
755 ],
756 cwd=os.path.dirname(exe_file),
757 )
758
759
760def client_main(*launch_args: str) -> None:
761 async def main(args):
762 if settings.get_settings().lingo2_options.start_game:
763 async_start(run_game())
764
765 client_ctx = Lingo2ClientContext(args.connect, args.password)
766 client_ctx.auth = args.name
767
768 game_ctx = Lingo2GameContext()
769 manager = Lingo2Manager(game_ctx, client_ctx)
770
771 client_ctx.server_task = asyncio.create_task(server_loop(client_ctx), name="ServerLoop")
772
773 if gui_enabled:
774 client_ctx.run_gui()
775 client_ctx.run_cli()
776
777 pipe_task = asyncio.create_task(pipe_loop(manager), name="GameWatcher")
778
779 try:
780 await pipe_task
781 except Exception as e:
782 logger.exception(e)
783
784 await client_ctx.exit_event.wait()
785 client_ctx.ui.stop()
786 await client_ctx.shutdown()
787
788 Utils.init_logging("Lingo2Client", exception_logger="Client")
789 import colorama
790
791 parser = get_base_parser(description="Lingo 2 Archipelago Client")
792 parser.add_argument('--name', default=None, help="Slot Name to connect as.")
793 parser.add_argument("url", nargs="?", help="Archipelago connection url")
794 args = parser.parse_args(launch_args)
795
796 args = handle_url_arg(args, parser=parser)
797
798 colorama.just_fix_windows_console()
799 asyncio.run(main(args))
800 colorama.deinit()
diff --git a/apworld/docs/en_Lingo_2.md b/apworld/docs/en_Lingo_2.md new file mode 100644 index 0000000..977795a --- /dev/null +++ b/apworld/docs/en_Lingo_2.md
@@ -0,0 +1,4 @@
1# Lingo 2
2
3See [the project README](https://code.fourisland.com/lingo2-archipelago/about/)
4for installation instructions and frequently asked questions. \ No newline at end of file
diff --git a/apworld/items.py b/apworld/items.py index 971a709..28158c3 100644 --- a/apworld/items.py +++ b/apworld/items.py
@@ -1,5 +1,31 @@
1from .generated import data_pb2 as data_pb2
1from BaseClasses import Item 2from BaseClasses import Item
2 3
3 4
4class Lingo2Item(Item): 5class Lingo2Item(Item):
5 game: str = "Lingo 2" 6 game: str = "Lingo 2"
7
8
9SYMBOL_ITEMS: dict[data_pb2.PuzzleSymbol, str] = {
10 data_pb2.PuzzleSymbol.SUN: "Sun Symbol",
11 data_pb2.PuzzleSymbol.SPARKLES: "Sparkles Symbol",
12 data_pb2.PuzzleSymbol.ZERO: "Zero Symbol",
13 data_pb2.PuzzleSymbol.EXAMPLE: "Example Symbol",
14 data_pb2.PuzzleSymbol.BOXES: "Boxes Symbol",
15 data_pb2.PuzzleSymbol.PLANET: "Planet Symbol",
16 data_pb2.PuzzleSymbol.PYRAMID: "Pyramid Symbol",
17 data_pb2.PuzzleSymbol.CROSS: "Cross Symbol",
18 data_pb2.PuzzleSymbol.SWEET: "Sweet Symbol",
19 data_pb2.PuzzleSymbol.GENDER: "Gender Symbol",
20 data_pb2.PuzzleSymbol.AGE: "Age Symbol",
21 data_pb2.PuzzleSymbol.SOUND: "Sound Symbol",
22 data_pb2.PuzzleSymbol.ANAGRAM: "Anagram Symbol",
23 data_pb2.PuzzleSymbol.JOB: "Job Symbol",
24 data_pb2.PuzzleSymbol.STARS: "Stars Symbol",
25 data_pb2.PuzzleSymbol.NULL: "Null Symbol",
26 data_pb2.PuzzleSymbol.EVAL: "Eval Symbol",
27 data_pb2.PuzzleSymbol.LINGO: "Lingo Symbol",
28 data_pb2.PuzzleSymbol.QUESTION: "Question Symbol",
29}
30
31ANTI_COLLECTABLE_TRAPS: list[str] = [f"Anti {letter}" for letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
diff --git a/apworld/locations.py b/apworld/locations.py index 108decb..3d619dc 100644 --- a/apworld/locations.py +++ b/apworld/locations.py
@@ -3,3 +3,6 @@ from BaseClasses import Location
3 3
4class Lingo2Location(Location): 4class Lingo2Location(Location):
5 game: str = "Lingo 2" 5 game: str = "Lingo 2"
6
7 port_id: int
8 goal: bool
diff --git a/apworld/logo.png b/apworld/logo.png new file mode 100644 index 0000000..b9d00ba --- /dev/null +++ b/apworld/logo.png
Binary files differ
diff --git a/apworld/options.py b/apworld/options.py index 77f0ae3..f687434 100644 --- a/apworld/options.py +++ b/apworld/options.py
@@ -1,13 +1,230 @@
1from dataclasses import dataclass 1from dataclasses import dataclass
2 2
3from Options import PerGameCommonOptions, Toggle 3from Options import PerGameCommonOptions, Toggle, Choice, DefaultOnToggle, Range, OptionSet
4 4
5 5
6class ShuffleDoors(Toggle): 6class ShuffleDoors(DefaultOnToggle):
7 """If enabled, most doors will open from receiving an item rather than fulfilling the in-game requirements.""" 7 """If enabled, most doors will open from receiving an item rather than fulfilling the in-game requirements."""
8 display_name = "Shuffle Doors" 8 display_name = "Shuffle Doors"
9 9
10 10
11class ShuffleControlCenterColors(Toggle):
12 """
13 Some doors open after solving the COLOR panel in the Control Center. If this option is enabled, these doors will
14 instead open upon receiving an item.
15 """
16 display_name = "Shuffle Control Center Colors"
17
18
19class ShuffleGalleryPaintings(Toggle):
20 """If enabled, gallery paintings will appear from receiving an item rather than by triggering them normally."""
21 display_name = "Shuffle Gallery Paintings"
22
23
24class ShuffleLetters(Choice):
25 """
26 Controls how letter unlocks are handled. Note that H1, I1, N1, and T1 will always be present at their vanilla
27 locations in the starting room, even if letters are shuffled remotely.
28
29 - **Vanilla**: All letters will be present at their vanilla locations.
30 - **Unlocked**: Players will start with their keyboards fully unlocked.
31 - **Progressive**: Two items will be added to the pool for every letter (one for H, I, N, and T). Receiving the
32 first item gives you the corresponding level 1 letter, and the second item gives you the corresponding level 2
33 letter.
34 - **Vanilla Cyan**: Players will start with all level 1 (purple) letters unlocked. Level 2 (cyan) letters will be
35 present at their vanilla locations.
36 - **Item Cyan**: Players will start with all level 1 (purple) letters unlocked. One item will be added to the pool
37 for every level 2 (cyan) letter.
38 """
39 display_name = "Shuffle Letters"
40 option_vanilla = 0
41 option_unlocked = 1
42 option_progressive = 2
43 option_vanilla_cyan = 3
44 option_item_cyan = 4
45
46
47class ShuffleSymbols(Toggle):
48 """
49 If enabled, 19 items will be added to the pool, representing the different symbols that can appear on a panel.
50 Players will be prevented from solving puzzles with symbols on them until all of the required symbols are unlocked.
51 """
52 display_name = "Shuffle Symbols"
53
54
55class ShuffleWorldports(Toggle):
56 """
57 Randomizes the connections between maps. This affects worldports only, which are the loading zones you walk into in
58 order to change maps. This does not affect paintings, panels that teleport you, or certain other special connections
59 like the one between The Shop and Control Center.
60 """
61 display_name = "Shuffle Worldports"
62
63
64class KeyholderSanity(Toggle):
65 """
66 If enabled, 26 locations will be created for placing each key into its respective Green Ending keyholder.
67
68 NOTE: This does not apply to the two disappearing keyholders in The Congruent, as they are not part of Green Ending.
69 """
70 display_name = "Keyholder Sanity"
71
72
73class CyanDoorBehavior(Choice):
74 """
75 Cyan-colored doors usually only open upon unlocking double letters. Some panels also only appear upon unlocking
76 double letters. This option determines how these unlocks should behave.
77
78 - **Collect H2**: In the base game, H2 is the first double letter you are intended to collect, so cyan doors only
79 open when you collect the H2 pickup in The Repetitive. Collecting the actual pickup is still required even with
80 remote letter shuffle enabled.
81 - **Any Double Letter**: Cyan doors will open when you have unlocked any cyan letter on your keyboard. In letter
82 shuffle, this means receiving a cyan letter, not picking up a cyan letter collectable.
83 - **Item**: Cyan doors will be grouped together in a single item.
84
85 Note that some cyan doors are impacted by door shuffle (e.g. the entrance to The Tower). When door shuffle is
86 enabled, these doors won't be affected by the value of this option.
87 """
88 display_name = "Cyan Door Behavior"
89 option_collect_h2 = 0
90 option_any_double_letter = 1
91 option_item = 2
92
93
94class EnableIcarus(Toggle):
95 """
96 Controls whether Icarus is randomized. If disabled, which is the default, no locations or items will be created for
97 it, and its worldport will not be shuffled when worldport shuffle is on.
98 """
99 display_name = "Enable Icarus"
100
101
102class EnableGiftMaps(OptionSet):
103 """
104 Controls whether the beta tester gift maps are randomized. By default, these are not accessible at all from within
105 the randomizer. This option allows you to enter the maps, and creates items and locations for them. If worldport
106 shuffle is on, their worldports will be included in the randomization.
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.
112
113 In the base game, nothing happens once you complete a gift map. Masteries have been added to the gift maps in the
114 randomizer so that the player can be rewarded for completing them.
115
116 Note that the gift maps were originally only intended to be played by specific people, and as a result may be
117 frustrating or require knowledge of inside jokes. The Crystalline is particularly difficult as it requires
118 completing a parkour course.
119 """
120 display_name = "Enable Gift Maps"
121 valid_keys = ["The Advanced", "The Charismatic", "The Crystalline", "The Fuzzy", "The Stellar"]
122
123
124class DaedalusRoofAccess(Toggle):
125 """
126 If enabled, the player will be logically expected to be able to go from the castle entrance to any part of Daedalus
127 that is open to the air. If disabled, the player will only be expected to be able to enter the castle, the moat,
128 Icarus, and the area at the bottom of the stairs. Invisible walls that become opaque as you approach them are added
129 to the level to prevent the player from accidentally breaking logic.
130 """
131 display_name = "Allow Daedalus Roof Access"
132
133
134class StrictPurpleEnding(DefaultOnToggle):
135 """
136 If enabled, the player will be required to have all purple (level 1) letters in order to get Purple Ending.
137 Otherwise, some of the letters may be skippable depending on the other options.
138 """
139 display_name = "Strict Purple Ending"
140
141
142class StrictCyanEnding(DefaultOnToggle):
143 """
144 If enabled, the player will be required to have all cyan (level 2) letters in order to get Cyan Ending. Otherwise,
145 at least J2, Q2, and V2 are skippable. Others may also be skippable depending on the options chosen.
146 """
147 display_name = "Strict Cyan Ending"
148
149
150class VictoryCondition(Choice):
151 """
152 This option determines what your goal is.
153
154 - **Gray Ending** (The Colorful)
155 - **Purple Ending** (The Sun Temple). This ordinarily requires all level 1 (purple) letters.
156 - **Mint Ending** (typing EXIT into the keyholders in Control Center)
157 - **Black Ending** (The Graveyard)
158 - **Blue Ending** (The Words)
159 - **Cyan Ending** (The Parthenon). This ordinarily requires almost all level 2 (cyan) letters.
160 - **Red Ending** (The Tower)
161 - **Plum Ending** (The Wondrous / The Door)
162 - **Orange Ending** (the castle in Daedalus)
163 - **Gold Ending** (The Gold). This involves going through the color rooms in Daedalus.
164 - **Yellow Ending** (The Gallery). This requires unlocking all gallery paintings.
165 - **Green Ending** (The Ancient). This requires filling all keyholders with specific letters.
166 - **White Ending** (Control Center). This combines every other ending.
167 """
168 display_name = "Victory Condition"
169 option_gray_ending = 0
170 option_purple_ending = 1
171 option_mint_ending = 2
172 option_black_ending = 3
173 option_blue_ending = 4
174 option_cyan_ending = 5
175 option_red_ending = 6
176 option_plum_ending = 7
177 option_orange_ending = 8
178 option_gold_ending = 9
179 option_yellow_ending = 10
180 option_green_ending = 11
181 option_white_ending = 12
182
183
184class EndingsRequirement(Range):
185 """The number of endings required to unlock White Ending."""
186 display_name = "Endings Requirement"
187 range_start = 0
188 range_end = 12
189 default = 12
190
191
192class MasteriesRequirement(Range):
193 """The number of masteries required to unlock White Ending.
194
195 There are only 13 masteries in the base game, but some of the other slot options may add more masteries to the
196 world. If the chosen number of masteries is higher than the total in your world, it will be automatically lowered to
197 the maximum."""
198 display_name = "Masteries Requirement"
199 range_start = 0
200 range_end = 19
201 default = 0
202
203
204class TrapPercentage(Range):
205 """Replaces junk items with traps, at the specified rate."""
206 display_name = "Trap Percentage"
207 range_start = 0
208 range_end = 100
209 default = 0
210
211
11@dataclass 212@dataclass
12class Lingo2Options(PerGameCommonOptions): 213class Lingo2Options(PerGameCommonOptions):
13 shuffle_doors: ShuffleDoors 214 shuffle_doors: ShuffleDoors
215 shuffle_control_center_colors: ShuffleControlCenterColors
216 shuffle_gallery_paintings: ShuffleGalleryPaintings
217 shuffle_letters: ShuffleLetters
218 shuffle_symbols: ShuffleSymbols
219 shuffle_worldports: ShuffleWorldports
220 keyholder_sanity: KeyholderSanity
221 cyan_door_behavior: CyanDoorBehavior
222 enable_icarus: EnableIcarus
223 enable_gift_maps: EnableGiftMaps
224 daedalus_roof_access: DaedalusRoofAccess
225 strict_purple_ending: StrictPurpleEnding
226 strict_cyan_ending: StrictCyanEnding
227 victory_condition: VictoryCondition
228 endings_requirement: EndingsRequirement
229 masteries_requirement: MasteriesRequirement
230 trap_percentage: TrapPercentage
diff --git a/apworld/player_logic.py b/apworld/player_logic.py index edf8c4f..3ee8f38 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py
@@ -1,6 +1,11 @@
1from enum import IntEnum, auto
2
1from .generated import data_pb2 as data_pb2 3from .generated import data_pb2 as data_pb2
4from .items import SYMBOL_ITEMS
2from typing import TYPE_CHECKING, NamedTuple 5from typing import TYPE_CHECKING, NamedTuple
3 6
7from .options import ShuffleLetters, CyanDoorBehavior
8
4if TYPE_CHECKING: 9if TYPE_CHECKING:
5 from . import Lingo2World 10 from . import Lingo2World
6 11
@@ -10,48 +15,177 @@ def calculate_letter_histogram(solution: str) -> dict[str, int]:
10 for l in solution: 15 for l in solution:
11 if l.isalpha(): 16 if l.isalpha():
12 real_l = l.upper() 17 real_l = l.upper()
13 histogram[real_l] = min(histogram.get(l, 0) + 1, 2) 18 histogram[real_l] = min(histogram.get(real_l, 0) + 1, 2)
14 19
15 return histogram 20 return histogram
16 21
17 22
18class AccessRequirements: 23class AccessRequirements:
19 items: set[str] 24 items: set[str]
25 progressives: dict[str, int]
20 rooms: set[str] 26 rooms: set[str]
21 symbols: set[str]
22 letters: dict[str, int] 27 letters: dict[str, int]
28 cyans: bool
23 29
24 # This is an AND of ORs. 30 # This is an AND of ORs.
25 or_logic: list[list["AccessRequirements"]] 31 or_logic: list[list["AccessRequirements"]]
26 32
33 # When complete_at is set, at least that many of the requirements in possibilities must be accessible. This should
34 # only be used for doors with complete_at > 1, as or_logic is more efficient for complete_at == 1.
35 complete_at: int | None
36 possibilities: list["AccessRequirements"]
37
27 def __init__(self): 38 def __init__(self):
28 self.items = set() 39 self.items = set()
40 self.progressives = dict()
29 self.rooms = set() 41 self.rooms = set()
30 self.symbols = set()
31 self.letters = dict() 42 self.letters = dict()
43 self.cyans = False
32 self.or_logic = list() 44 self.or_logic = list()
45 self.complete_at = None
46 self.possibilities = list()
33 47
34 def add_solution(self, solution: str): 48 def copy(self) -> "AccessRequirements":
35 histogram = calculate_letter_histogram(solution) 49 reqs = AccessRequirements()
36 50 reqs.items = self.items.copy()
37 for l, a in histogram.items(): 51 reqs.progressives = self.progressives.copy()
38 self.letters[l] = max(self.letters.get(l, 0), histogram.get(l)) 52 reqs.rooms = self.rooms.copy()
53 reqs.letters = self.letters.copy()
54 reqs.cyans = self.cyans
55 reqs.or_logic = [[other_req.copy() for other_req in disjunction] for disjunction in self.or_logic]
56 reqs.complete_at = self.complete_at
57 reqs.possibilities = self.possibilities.copy()
58 return reqs
39 59
40 def merge(self, other: "AccessRequirements"): 60 def merge(self, other: "AccessRequirements"):
41 for item in other.items: 61 for item in other.items:
42 self.items.add(item) 62 self.items.add(item)
43 63
64 for item, amount in other.progressives.items():
65 self.progressives[item] = max(amount, self.progressives.get(item, 0))
66
44 for room in other.rooms: 67 for room in other.rooms:
45 self.rooms.add(room) 68 self.rooms.add(room)
46 69
47 for symbol in other.symbols:
48 self.symbols.add(symbol)
49
50 for letter, level in other.letters.items(): 70 for letter, level in other.letters.items():
51 self.letters[letter] = max(self.letters.get(letter, 0), level) 71 self.letters[letter] = max(self.letters.get(letter, 0), level)
52 72
73 self.cyans = self.cyans or other.cyans
74
53 for disjunction in other.or_logic: 75 for disjunction in other.or_logic:
54 self.or_logic.append(disjunction) 76 self.or_logic.append([sub_req.copy() for sub_req in disjunction])
77
78 if other.complete_at is not None:
79 # Merging multiple requirements that use complete_at sucks, and is part of why we want to minimize use of
80 # it. If both requirements use complete_at, we will cheat by using the or_logic field, which supports
81 # conjunctions of requirements.
82 if self.complete_at is not None:
83 print("Merging requirements with complete_at > 1. This is messy and should be avoided!")
84
85 left_req = AccessRequirements()
86 left_req.complete_at = self.complete_at
87 left_req.possibilities = [sub_req.copy() for sub_req in self.possibilities]
88 self.or_logic.append([left_req])
89
90 self.complete_at = None
91 self.possibilities = list()
92
93 right_req = AccessRequirements()
94 right_req.complete_at = other.complete_at
95 right_req.possibilities = [sub_req.copy() for sub_req in other.possibilities]
96 self.or_logic.append([right_req])
97 else:
98 self.complete_at = other.complete_at
99 self.possibilities = [sub_req.copy() for sub_req in other.possibilities]
100
101 def is_empty(self) -> bool:
102 return (len(self.items) == 0 and len(self.progressives) == 0 and len(self.rooms) == 0 and len(self.letters) == 0
103 and not self.cyans and len(self.or_logic) == 0 and self.complete_at is None)
104
105 def __eq__(self, other: "AccessRequirements"):
106 return (self.items == other.items and self.progressives == other.progressives and self.rooms == other.rooms and
107 self.letters == other.letters and self.cyans == other.cyans and self.or_logic == other.or_logic and
108 self.complete_at == other.complete_at and self.possibilities == other.possibilities)
109
110 def simplify(self):
111 resimplify = False
112
113 if len(self.or_logic) > 0:
114 old_or_logic = self.or_logic
115
116 def remove_redundant(sub_reqs: "AccessRequirements"):
117 new_reqs = sub_reqs.copy()
118 new_reqs.letters = {l: v for l, v in new_reqs.letters.items() if self.letters.get(l, 0) < v}
119 if new_reqs != sub_reqs:
120 return new_reqs
121 else:
122 return sub_reqs
123
124 self.or_logic = []
125 for disjunction in old_or_logic:
126 new_disjunction = []
127 for ssr in disjunction:
128 new_ssr = remove_redundant(ssr)
129 if not new_ssr.is_empty():
130 new_disjunction.append(new_ssr)
131 else:
132 new_disjunction.clear()
133 break
134 if len(new_disjunction) == 1:
135 self.merge(new_disjunction[0])
136 resimplify = True
137 elif len(new_disjunction) > 1:
138 if all(cjr == new_disjunction[0] for cjr in new_disjunction):
139 self.merge(new_disjunction[0])
140 resimplify = True
141 else:
142 self.or_logic.append(new_disjunction)
143
144 if resimplify:
145 self.simplify()
146
147 def get_referenced_rooms(self):
148 result = set(self.rooms)
149
150 for disjunction in self.or_logic:
151 for sub_req in disjunction:
152 result = result.union(sub_req.get_referenced_rooms())
153
154 for sub_req in self.possibilities:
155 result = result.union(sub_req.get_referenced_rooms())
156
157 return result
158
159 def remove_room(self, room: str):
160 if room in self.rooms:
161 self.rooms.remove(room)
162
163 for disjunction in self.or_logic:
164 for sub_req in disjunction:
165 sub_req.remove_room(room)
166
167 for sub_req in self.possibilities:
168 sub_req.remove_room(room)
169
170 def __repr__(self):
171 parts = []
172 if len(self.items) > 0:
173 parts.append(f"items={self.items}")
174 if len(self.progressives) > 0:
175 parts.append(f"progressives={self.progressives}")
176 if len(self.rooms) > 0:
177 parts.append(f"rooms={self.rooms}")
178 if len(self.letters) > 0:
179 parts.append(f"letters={self.letters}")
180 if self.cyans:
181 parts.append(f"cyans=True")
182 if len(self.or_logic) > 0:
183 parts.append(f"or_logic={self.or_logic}")
184 if self.complete_at is not None:
185 parts.append(f"complete_at={self.complete_at}")
186 if len(self.possibilities) > 0:
187 parts.append(f"possibilities={self.possibilities}")
188 return "AccessRequirements(" + ", ".join(parts) + ")"
55 189
56 190
57class PlayerLocation(NamedTuple): 191class PlayerLocation(NamedTuple):
@@ -59,11 +193,21 @@ class PlayerLocation(NamedTuple):
59 reqs: AccessRequirements 193 reqs: AccessRequirements
60 194
61 195
196class LetterBehavior(IntEnum):
197 VANILLA = auto()
198 ITEM = auto()
199 UNLOCKED = auto()
200
201
62class Lingo2PlayerLogic: 202class Lingo2PlayerLogic:
63 world: "Lingo2World" 203 world: "Lingo2World"
64 204
205 shuffled_maps: set[int]
206
65 locations_by_room: dict[int, list[PlayerLocation]] 207 locations_by_room: dict[int, list[PlayerLocation]]
66 item_by_door: dict[int, str] 208 event_loc_item_by_room: dict[int, dict[str, str]]
209
210 item_by_door: dict[int, tuple[str, int]]
67 211
68 panel_reqs: dict[int, AccessRequirements] 212 panel_reqs: dict[int, AccessRequirements]
69 proxy_reqs: dict[int, dict[str, AccessRequirements]] 213 proxy_reqs: dict[int, dict[str, AccessRequirements]]
@@ -71,39 +215,206 @@ class Lingo2PlayerLogic:
71 215
72 real_items: list[str] 216 real_items: list[str]
73 217
218 double_letter_amount: dict[str, int]
219 goal_room_id: int
220
74 def __init__(self, world: "Lingo2World"): 221 def __init__(self, world: "Lingo2World"):
75 self.world = world 222 self.world = world
76 self.locations_by_room = {} 223 self.locations_by_room = {}
224 self.event_loc_item_by_room = {}
77 self.item_by_door = {} 225 self.item_by_door = {}
78 self.panel_reqs = dict() 226 self.panel_reqs = dict()
79 self.proxy_reqs = dict() 227 self.proxy_reqs = dict()
80 self.door_reqs = dict() 228 self.door_reqs = dict()
81 self.real_items = list() 229 self.real_items = list()
230 self.double_letter_amount = dict()
231
232 def should_shuffle_map(game_map) -> bool:
233 if game_map.type == data_pb2.MapType.NORMAL_MAP:
234 return True
235 elif game_map.type == data_pb2.MapType.ICARUS:
236 return bool(world.options.enable_icarus)
237 elif game_map.type == data_pb2.MapType.GIFT_MAP:
238 if game_map.name == "the_advanced":
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
244 elif game_map.name == "the_fuzzy":
245 return "The Fuzzy" in world.options.enable_gift_maps.value
246 elif game_map.name == "the_stellar":
247 return "The Stellar" in world.options.enable_gift_maps.value
248
249 return False
250
251 self.shuffled_maps = set(game_map.id for game_map in world.static_logic.objects.maps
252 if should_shuffle_map(game_map))
253
254 maximum_masteries = 13 + len(world.options.enable_gift_maps.value)
255 if world.options.enable_icarus:
256 maximum_masteries += 1
257
258 if world.options.masteries_requirement > maximum_masteries:
259 world.options.masteries_requirement.value = maximum_masteries
260
261 if "The Fuzzy" in world.options.enable_gift_maps.value:
262 self.real_items.append("Numbers")
263
264 if self.world.options.shuffle_doors:
265 for progressive in world.static_logic.objects.progressives:
266 for i in range(0, len(progressive.doors)):
267 door = world.static_logic.objects.doors[progressive.doors[i]]
268 if door.map_id not in self.shuffled_maps:
269 continue
270
271 self.item_by_door[progressive.doors[i]] = (progressive.name, i + 1)
272 self.real_items.append(progressive.name)
273
274 for door_group in world.static_logic.objects.door_groups:
275 if door_group.type == data_pb2.DoorGroupType.CONNECTOR:
276 if not self.world.options.shuffle_doors or self.world.options.shuffle_worldports:
277 continue
278 elif door_group.type == data_pb2.DoorGroupType.COLOR_CONNECTOR:
279 if not self.world.options.shuffle_control_center_colors or self.world.options.shuffle_worldports:
280 continue
281 elif door_group.type == data_pb2.DoorGroupType.SHUFFLE_GROUP:
282 if not self.world.options.shuffle_doors:
283 continue
284 else:
285 continue
286
287 shuffleable_doors = [door_id for door_id in door_group.doors
288 if world.static_logic.objects.doors[door_id].map_id in self.shuffled_maps]
289
290 if len(shuffleable_doors) > 0:
291 for door in shuffleable_doors:
292 self.item_by_door[door] = (door_group.name, 1)
293
294 self.real_items.append(door_group.name)
82 295
83 # We iterate through the doors in two parts because it is essential that we determine which doors are shuffled 296 # We iterate through the doors in two parts because it is essential that we determine which doors are shuffled
84 # before we calculate any access requirements. 297 # before we calculate any access requirements.
85 for door in world.static_logic.objects.doors: 298 for door in world.static_logic.objects.doors:
86 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.ITEM_ONLY] and self.world.options.shuffle_doors: 299 if door.map_id not in self.shuffled_maps:
87 door_item_name = self.world.static_logic.get_door_item_name(door.id) 300 continue
88 self.item_by_door[door.id] = door_item_name 301
89 self.real_items.append(door_item_name) 302 if door.type in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]:
303 continue
304
305 if door.id in self.item_by_door:
306 continue
307
308 if (door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.ITEM_ONLY] and
309 not self.world.options.shuffle_doors):
310 continue
311
312 if (door.type == data_pb2.DoorType.CONTROL_CENTER_COLOR and
313 not self.world.options.shuffle_control_center_colors):
314 continue
315
316 if door.type == data_pb2.DoorType.GALLERY_PAINTING and not self.world.options.shuffle_gallery_paintings:
317 continue
318
319 door_item_name = self.world.static_logic.get_door_item_name(door)
320 self.item_by_door[door.id] = (door_item_name, 1)
321 self.real_items.append(door_item_name)
322
323 # We handle cyan_door_behavior = Item after door shuffle, because cyan doors that are impacted by door shuffle
324 # should be exempt from cyan_door_behavior.
325 if world.options.cyan_door_behavior == CyanDoorBehavior.option_item:
326 for door_group in world.static_logic.objects.door_groups:
327 if door_group.type != data_pb2.DoorGroupType.CYAN_DOORS:
328 continue
329
330 shuffleable_doors = [door_id for door_id in door_group.doors
331 if world.static_logic.objects.doors[door_id].map_id in self.shuffled_maps
332 and door_id not in self.item_by_door]
333
334 if len(shuffleable_doors) > 0:
335 for door in shuffleable_doors:
336 self.item_by_door[door] = (door_group.name, 1)
337
338 self.real_items.append(door_group.name)
90 339
91 for door in world.static_logic.objects.doors: 340 for door in world.static_logic.objects.doors:
341 if door.map_id not in self.shuffled_maps:
342 continue
343
92 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: 344 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]:
93 self.locations_by_room.setdefault(door.room_id, []).append(PlayerLocation(door.ap_id, 345 self.locations_by_room.setdefault(door.room_id, []).append(PlayerLocation(door.ap_id,
94 self.get_door_reqs(door.id))) 346 self.get_door_reqs(door.id)))
95 347
96 for letter in world.static_logic.objects.letters: 348 for letter in world.static_logic.objects.letters:
349 if world.static_logic.get_room_object_map_id(letter) not in self.shuffled_maps:
350 continue
351
97 self.locations_by_room.setdefault(letter.room_id, []).append(PlayerLocation(letter.ap_id, 352 self.locations_by_room.setdefault(letter.room_id, []).append(PlayerLocation(letter.ap_id,
98 AccessRequirements())) 353 AccessRequirements()))
354 behavior = self.get_letter_behavior(letter.key, letter.level2)
355 if behavior == LetterBehavior.VANILLA:
356 if not world.for_tracker:
357 letter_name = f"{letter.key.upper()}{'2' if letter.level2 else '1'}"
358 event_name = f"{letter_name} (Collected)"
359 self.event_loc_item_by_room.setdefault(letter.room_id, {})[event_name] = letter.key.upper()
360
361 if letter.level2:
362 event_name = f"{letter_name} (Double Collected)"
363 self.event_loc_item_by_room.setdefault(letter.room_id, {})[event_name] = letter.key.upper()
364 elif behavior == LetterBehavior.ITEM:
365 self.real_items.append(letter.key.upper())
366
367 if behavior != LetterBehavior.UNLOCKED:
368 self.double_letter_amount[letter.key.upper()] = self.double_letter_amount.get(letter.key.upper(), 0) + 1
99 369
100 for mastery in world.static_logic.objects.masteries: 370 for mastery in world.static_logic.objects.masteries:
371 if world.static_logic.get_room_object_map_id(mastery) not in self.shuffled_maps:
372 continue
373
101 self.locations_by_room.setdefault(mastery.room_id, []).append(PlayerLocation(mastery.ap_id, 374 self.locations_by_room.setdefault(mastery.room_id, []).append(PlayerLocation(mastery.ap_id,
102 AccessRequirements())) 375 AccessRequirements()))
103 376
377 if world.options.masteries_requirement > 0:
378 event_name = f"{world.static_logic.get_room_object_map_name(mastery)} - Mastery (Collected)"
379 self.event_loc_item_by_room.setdefault(mastery.room_id, {})[event_name] = "Mastery"
380
104 for ending in world.static_logic.objects.endings: 381 for ending in world.static_logic.objects.endings:
105 self.locations_by_room.setdefault(ending.room_id, []).append(PlayerLocation(ending.ap_id, 382 if world.static_logic.get_room_object_map_id(ending) not in self.shuffled_maps:
106 AccessRequirements())) 383 continue
384
385 # Don't create a location for your selected ending. Also don't create a location for White Ending if it's
386 # necessarily in the postgame, i.e. it requires all 12 other endings.
387 if world.options.victory_condition.current_key.removesuffix("_ending").upper() != ending.name\
388 and (ending.name != "WHITE" or world.options.endings_requirement < 12):
389 self.locations_by_room.setdefault(ending.room_id, []).append(PlayerLocation(ending.ap_id,
390 AccessRequirements()))
391
392 if world.options.victory_condition.current_key.removesuffix("_ending").upper() == ending.name:
393 event_name = f"{ending.name.capitalize()} Ending (Goal)"
394 self.event_loc_item_by_room.setdefault(ending.room_id, {})[event_name] = "Victory"
395 self.goal_room_id = ending.room_id
396
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"
400
401 if self.world.options.keyholder_sanity:
402 for keyholder in world.static_logic.objects.keyholders:
403 if keyholder.HasField("key"):
404 if world.static_logic.get_room_object_map_id(keyholder) not in self.shuffled_maps:
405 continue
406
407 reqs = AccessRequirements()
408
409 if self.get_letter_behavior(keyholder.key, False) != LetterBehavior.UNLOCKED:
410 reqs.letters[keyholder.key.upper()] = 1
411
412 self.locations_by_room.setdefault(keyholder.room_id, []).append(PlayerLocation(keyholder.ap_id,
413 reqs))
414
415 if self.world.options.shuffle_symbols:
416 for symbol_name in SYMBOL_ITEMS.values():
417 self.real_items.append(symbol_name)
107 418
108 def get_panel_reqs(self, panel_id: int, answer: str | None) -> AccessRequirements: 419 def get_panel_reqs(self, panel_id: int, answer: str | None) -> AccessRequirements:
109 if answer is None: 420 if answer is None:
@@ -124,18 +435,38 @@ class Lingo2PlayerLogic:
124 reqs.rooms.add(self.world.static_logic.get_room_region_name(panel.room_id)) 435 reqs.rooms.add(self.world.static_logic.get_room_region_name(panel.room_id))
125 436
126 if answer is not None: 437 if answer is not None:
127 reqs.add_solution(answer) 438 self.add_solution_reqs(reqs, answer)
128 elif len(panel.proxies) > 0: 439 elif len(panel.proxies) > 0:
440 possibilities = []
441 already_filled = False
442
129 for proxy in panel.proxies: 443 for proxy in panel.proxies:
130 proxy_reqs = AccessRequirements() 444 proxy_reqs = AccessRequirements()
131 proxy_reqs.add_solution(proxy.answer) 445 self.add_solution_reqs(proxy_reqs, proxy.answer)
132 446
133 reqs.or_logic.append([proxy_reqs]) 447 if not proxy_reqs.is_empty():
448 possibilities.append(proxy_reqs)
449 else:
450 already_filled = True
451 break
452
453 if not already_filled and not any(proxy.answer == panel.answer for proxy in panel.proxies):
454 proxy_reqs = AccessRequirements()
455 self.add_solution_reqs(proxy_reqs, panel.answer)
456
457 if not proxy_reqs.is_empty():
458 possibilities.append(proxy_reqs)
459 else:
460 already_filled = True
461
462 if not already_filled:
463 reqs.or_logic.append(possibilities)
134 else: 464 else:
135 reqs.add_solution(panel.answer) 465 self.add_solution_reqs(reqs, panel.answer)
136 466
137 for symbol in panel.symbols: 467 if self.world.options.shuffle_symbols:
138 reqs.symbols.add(symbol) 468 for symbol in panel.symbols:
469 reqs.items.add(SYMBOL_ITEMS.get(symbol))
139 470
140 if panel.HasField("required_door"): 471 if panel.HasField("required_door"):
141 door_reqs = self.get_door_open_reqs(panel.required_door) 472 door_reqs = self.get_door_open_reqs(panel.required_door)
@@ -158,32 +489,65 @@ class Lingo2PlayerLogic:
158 door = self.world.static_logic.objects.doors[door_id] 489 door = self.world.static_logic.objects.doors[door_id]
159 reqs = AccessRequirements() 490 reqs = AccessRequirements()
160 491
161 use_item = False 492 if not door.HasField("complete_at") or door.complete_at == 0:
162 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.ITEM_ONLY] and self.world.options.shuffle_doors: 493 for proxy in door.panels:
163 use_item = True 494 panel_reqs = self.get_panel_reqs(proxy.panel, proxy.answer if proxy.HasField("answer") else None)
164 495 reqs.merge(panel_reqs)
165 if use_item: 496 elif door.complete_at == 1:
166 reqs.items.add(self.world.static_logic.get_door_item_name(door.id)) 497 disjunction = []
498 for proxy in door.panels:
499 proxy_reqs = self.get_panel_reqs(proxy.panel, proxy.answer if proxy.HasField("answer") else None)
500 if proxy_reqs.is_empty():
501 disjunction.clear()
502 break
503 else:
504 disjunction.append(proxy_reqs)
505 if len(disjunction) > 0:
506 reqs.or_logic.append(disjunction)
167 else: 507 else:
168 # TODO: complete_at, control_center_color, switches, keyholders 508 reqs.complete_at = door.complete_at
169 if not door.HasField("complete_at") or door.complete_at == 0: 509 for proxy in door.panels:
170 for proxy in door.panels: 510 panel_reqs = self.get_panel_reqs(proxy.panel, proxy.answer if proxy.HasField("answer") else None)
171 panel_reqs = self.get_panel_reqs(proxy.panel, proxy.answer if proxy.HasField("answer") else None) 511 reqs.possibilities.append(panel_reqs)
172 reqs.merge(panel_reqs) 512
173 elif door.complete_at == 1: 513 if door.HasField("control_center_color"):
174 reqs.or_logic.append([self.get_panel_reqs(proxy.panel, 514 reqs.rooms.add("Control Center - Main Area")
175 proxy.answer if proxy.HasField("answer") else None) 515 self.add_solution_reqs(reqs, door.control_center_color)
176 for proxy in door.panels]) 516
177 else: 517 if door.double_letters:
178 # TODO: Handle complete_at > 1 518 if self.world.options.cyan_door_behavior == CyanDoorBehavior.option_collect_h2:
519 reqs.rooms.add("The Repetitive - Main Room")
520 elif self.world.options.cyan_door_behavior == CyanDoorBehavior.option_any_double_letter:
521 if self.world.options.shuffle_letters != ShuffleLetters.option_unlocked:
522 reqs.cyans = True
523 elif self.world.options.cyan_door_behavior == CyanDoorBehavior.option_item:
524 # There shouldn't be any locations that are cyan doors.
179 pass 525 pass
180 526
181 for room in door.rooms: 527 for keyholder_uses in door.keyholders:
182 reqs.rooms.add(self.world.static_logic.get_room_region_name(room)) 528 key_name = keyholder_uses.key.upper()
529 if (self.get_letter_behavior(keyholder_uses.key, False) != LetterBehavior.UNLOCKED
530 and key_name not in reqs.letters):
531 reqs.letters[key_name] = 1
532
533 keyholder = self.world.static_logic.objects.keyholders[keyholder_uses.keyholder]
534 reqs.rooms.add(self.world.static_logic.get_room_region_name(keyholder.room_id))
535
536 for room in door.rooms:
537 reqs.rooms.add(self.world.static_logic.get_room_region_name(room))
538
539 if door.white_ending:
540 if self.world.options.endings_requirement > 0:
541 reqs.progressives["Ending"] = self.world.options.endings_requirement.value
183 542
184 for sub_door_id in door.doors: 543 if self.world.options.masteries_requirement > 0:
185 sub_reqs = self.get_door_open_reqs(sub_door_id) 544 reqs.progressives["Mastery"] = self.world.options.masteries_requirement.value
186 reqs.merge(sub_reqs) 545
546 for sub_door_id in door.doors:
547 sub_reqs = self.get_door_open_reqs(sub_door_id)
548 reqs.merge(sub_reqs)
549
550 reqs.simplify()
187 551
188 return reqs 552 return reqs
189 553
@@ -192,8 +556,53 @@ class Lingo2PlayerLogic:
192 def get_door_open_reqs(self, door_id: int) -> AccessRequirements: 556 def get_door_open_reqs(self, door_id: int) -> AccessRequirements:
193 if door_id in self.item_by_door: 557 if door_id in self.item_by_door:
194 reqs = AccessRequirements() 558 reqs = AccessRequirements()
195 reqs.items.add(self.item_by_door.get(door_id)) 559
560 item_name, amount = self.item_by_door.get(door_id)
561 if amount == 1:
562 reqs.items.add(item_name)
563 else:
564 reqs.progressives[item_name] = amount
196 565
197 return reqs 566 return reqs
198 else: 567 else:
199 return self.get_door_reqs(door_id) 568 return self.get_door_reqs(door_id)
569
570 def get_letter_behavior(self, letter: str, level2: bool) -> LetterBehavior:
571 if self.world.options.shuffle_letters == ShuffleLetters.option_unlocked:
572 return LetterBehavior.UNLOCKED
573
574 if self.world.options.shuffle_letters in [ShuffleLetters.option_vanilla_cyan, ShuffleLetters.option_item_cyan]:
575 if level2:
576 if self.world.options.shuffle_letters == ShuffleLetters.option_vanilla_cyan:
577 return LetterBehavior.VANILLA
578 else:
579 return LetterBehavior.ITEM
580 else:
581 return LetterBehavior.UNLOCKED
582
583 if not level2 and letter in ["h", "i", "n", "t"]:
584 return LetterBehavior.UNLOCKED
585
586 if self.world.options.shuffle_letters == ShuffleLetters.option_progressive:
587 return LetterBehavior.ITEM
588
589 return LetterBehavior.VANILLA
590
591 def add_solution_reqs(self, reqs: AccessRequirements, solution: str):
592 histogram = calculate_letter_histogram(solution)
593
594 for l, a in histogram.items():
595 needed = min(a, 2)
596 level2 = (needed == 2)
597
598 if level2 and self.get_letter_behavior(l.lower(), True) == LetterBehavior.UNLOCKED:
599 needed = 1
600
601 if self.get_letter_behavior(l.lower(), False) == LetterBehavior.UNLOCKED:
602 needed = needed - 1
603
604 if needed > 0:
605 reqs.letters[l] = max(reqs.letters.get(l, 0), needed)
606
607 if any(l.isnumeric() for l in solution):
608 reqs.items.add("Numbers")
diff --git a/apworld/regions.py b/apworld/regions.py index 1c8e672..1118603 100644 --- a/apworld/regions.py +++ b/apworld/regions.py
@@ -1,6 +1,9 @@
1from typing import TYPE_CHECKING 1from typing import TYPE_CHECKING
2 2
3from BaseClasses import Region 3import BaseClasses
4from BaseClasses import Region, ItemClassification, Entrance
5from entrance_rando import randomize_entrances
6from .items import Lingo2Item
4from .locations import Lingo2Location 7from .locations import Lingo2Location
5from .player_logic import AccessRequirements 8from .player_logic import AccessRequirements
6from .rules import make_location_lambda 9from .rules import make_location_lambda
@@ -10,15 +13,42 @@ if TYPE_CHECKING:
10 13
11 14
12def create_region(room, world: "Lingo2World") -> Region: 15def create_region(room, world: "Lingo2World") -> Region:
13 new_region = Region(world.static_logic.get_room_region_name(room.id), world.player, world.multiworld) 16 return Region(world.static_logic.get_room_region_name(room.id), world.player, world.multiworld)
14 17
18
19def create_locations(room, new_region: Region, world: "Lingo2World", regions: dict[str, Region]):
15 for location in world.player_logic.locations_by_room.get(room.id, {}): 20 for location in world.player_logic.locations_by_room.get(room.id, {}):
21 reqs = location.reqs.copy()
22 reqs.remove_room(new_region.name)
23
16 new_location = Lingo2Location(world.player, world.static_logic.location_id_to_name[location.code], 24 new_location = Lingo2Location(world.player, world.static_logic.location_id_to_name[location.code],
17 location.code, new_region) 25 location.code, new_region)
18 new_location.access_rule = make_location_lambda(location.reqs, world) 26 new_location.access_rule = make_location_lambda(reqs, world, regions)
19 new_region.locations.append(new_location) 27 new_region.locations.append(new_location)
20 28
21 return new_region 29 for event_name, item_name in world.player_logic.event_loc_item_by_room.get(room.id, {}).items():
30 new_location = Lingo2Location(world.player, event_name, None, new_region)
31 if world.for_tracker and item_name == "Victory":
32 new_location.goal = True
33
34 event_item = Lingo2Item(item_name, ItemClassification.progression, None, world.player)
35 new_location.place_locked_item(event_item)
36 new_region.locations.append(new_location)
37
38 if world.for_tracker and world.options.shuffle_worldports:
39 for port_id in room.ports:
40 port = world.static_logic.objects.ports[port_id]
41 if port.no_shuffle:
42 continue
43
44 new_location = Lingo2Location(world.player, f"Worldport {port.id} Entered", None, new_region)
45 new_location.port_id = port.id
46
47 if port.HasField("required_door"):
48 new_location.access_rule = \
49 make_location_lambda(world.player_logic.get_door_open_reqs(port.required_door), world, regions)
50
51 new_region.locations.append(new_location)
22 52
23 53
24def create_regions(world: "Lingo2World"): 54def create_regions(world: "Lingo2World"):
@@ -26,16 +56,37 @@ def create_regions(world: "Lingo2World"):
26 "Menu": Region("Menu", world.player, world.multiworld) 56 "Menu": Region("Menu", world.player, world.multiworld)
27 } 57 }
28 58
59 region_and_room = []
60
61 # Create the regions in two stages. First, make the actual region objects and memoize them. Then, add all of the
62 # locations. This allows us to reference the actual region objects in the access rules for the locations, which is
63 # faster than having to look them up during access checking.
29 for room in world.static_logic.objects.rooms: 64 for room in world.static_logic.objects.rooms:
65 if room.map_id not in world.player_logic.shuffled_maps:
66 continue
67
30 region = create_region(room, world) 68 region = create_region(room, world)
31 regions[region.name] = region 69 regions[region.name] = region
70 region_and_room.append((region, room))
71
72 for (region, room) in region_and_room:
73 create_locations(room, region, world, regions)
32 74
33 regions["Menu"].connect(regions["The Entry - Starting Room"], "Start Game") 75 regions["Menu"].connect(regions["The Entry - Starting Room"], "Start Game")
34 76
35 # TODO: The requirements of the opposite trigger also matter.
36 for connection in world.static_logic.objects.connections: 77 for connection in world.static_logic.objects.connections:
78 if connection.roof_access and not world.options.daedalus_roof_access:
79 continue
80
81 if connection.vanilla_only and world.options.shuffle_doors:
82 continue
83
37 from_region = world.static_logic.get_room_region_name(connection.from_room) 84 from_region = world.static_logic.get_room_region_name(connection.from_room)
38 to_region = world.static_logic.get_room_region_name(connection.to_room) 85 to_region = world.static_logic.get_room_region_name(connection.to_room)
86
87 if from_region not in regions or to_region not in regions:
88 continue
89
39 connection_name = f"{from_region} -> {to_region}" 90 connection_name = f"{from_region} -> {to_region}"
40 91
41 reqs = AccessRequirements() 92 reqs = AccessRequirements()
@@ -49,7 +100,10 @@ def create_regions(world: "Lingo2World"):
49 100
50 if connection.HasField("port"): 101 if connection.HasField("port"):
51 port = world.static_logic.objects.ports[connection.port] 102 port = world.static_logic.objects.ports[connection.port]
52 connection_name = f"{connection_name} (via port {port.name})" 103 connection_name = f"{connection_name} (via {port.display_name})"
104
105 if world.options.shuffle_worldports and not port.no_shuffle:
106 continue
53 107
54 if port.HasField("required_door"): 108 if port.HasField("required_door"):
55 reqs.merge(world.player_logic.get_door_open_reqs(port.required_door)) 109 reqs.merge(world.player_logic.get_door_open_reqs(port.required_door))
@@ -72,7 +126,131 @@ def create_regions(world: "Lingo2World"):
72 else: 126 else:
73 connection_name = f"{connection_name} (via panel {panel.name})" 127 connection_name = f"{connection_name} (via panel {panel.name})"
74 128
75 if from_region in regions and to_region in regions: 129 if connection.HasField("purple_ending") and connection.purple_ending and world.options.strict_purple_ending:
76 regions[from_region].connect(regions[to_region], connection_name, make_location_lambda(reqs, world)) 130 world.player_logic.add_solution_reqs(reqs, "abcdefghijklmnopqrstuvwxyz")
131
132 if connection.HasField("cyan_ending") and connection.cyan_ending and world.options.strict_cyan_ending:
133 world.player_logic.add_solution_reqs(reqs, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz")
134
135 reqs.simplify()
136 reqs.remove_room(from_region)
137
138 if to_region in reqs.rooms:
139 # This connection can't ever increase access because you're required to have access to the other side in
140 # order for it to be usable. We will just not create the connection at all, in order to help GER figure out
141 # what regions are dead ends.
142 continue
143
144 connection = Entrance(world.player, connection_name, regions[from_region])
145 connection.access_rule = make_location_lambda(reqs, world, regions)
146
147 regions[from_region].exits.append(connection)
148 connection.connect(regions[to_region])
149
150 for region in reqs.get_referenced_rooms():
151 world.multiworld.register_indirect_condition(regions[region], connection)
77 152
78 world.multiworld.regions += regions.values() 153 world.multiworld.regions += regions.values()
154
155
156def shuffle_entrances(world: "Lingo2World"):
157 er_entrances: list[Entrance] = []
158 er_exits: list[Entrance] = []
159
160 port_id_by_name: dict[str, int] = {}
161
162 shuffleable_ports = [port for port in world.static_logic.objects.ports
163 if not port.no_shuffle
164 and world.static_logic.get_room_object_map_id(port) in world.player_logic.shuffled_maps]
165
166 if len(shuffleable_ports) % 2 == 1:
167 # We have an odd number of shuffleable ports! Pick a port from a room that has more than one, and make it a
168 # redundant warp to another port.
169 redundant_rooms = set(room.id for room in world.static_logic.objects.rooms if len(room.ports) > 1)
170 redundant_ports = [port for port in shuffleable_ports if port.room_id in redundant_rooms]
171 chosen_port = world.random.choice(redundant_ports)
172
173 shuffleable_ports.remove(chosen_port)
174
175 chosen_destination = world.random.choice(shuffleable_ports)
176
177 world.port_pairings[chosen_port.id] = chosen_destination.id
178
179 from_region_name = world.static_logic.get_room_region_name(chosen_port.room_id)
180 to_region_name = world.static_logic.get_room_region_name(chosen_destination.room_id)
181
182 from_region = world.multiworld.get_region(from_region_name, world.player)
183 to_region = world.multiworld.get_region(to_region_name, world.player)
184
185 connection = Entrance(world.player, f"{from_region_name} - {chosen_port.display_name}", from_region)
186 from_region.exits.append(connection)
187 connection.connect(to_region)
188
189 if chosen_port.HasField("required_door"):
190 door_reqs = world.player_logic.get_door_open_reqs(chosen_port.required_door)
191 connection.access_rule = make_location_lambda(door_reqs, world, None)
192
193 for region in door_reqs.get_referenced_rooms():
194 world.multiworld.register_indirect_condition(world.multiworld.get_region(region, world.player),
195 connection)
196
197 for port in shuffleable_ports:
198 port_region_name = world.static_logic.get_room_region_name(port.room_id)
199 port_region = world.multiworld.get_region(port_region_name, world.player)
200
201 connection_name = f"{port_region_name} - {port.display_name}"
202 port_id_by_name[connection_name] = port.id
203
204 entrance = port_region.create_er_target(connection_name)
205 entrance.randomization_type = BaseClasses.EntranceType.TWO_WAY
206
207 er_exit = port_region.create_exit(connection_name)
208 er_exit.randomization_type = BaseClasses.EntranceType.TWO_WAY
209
210 if port.HasField("required_door"):
211 door_reqs = world.player_logic.get_door_open_reqs(port.required_door)
212 er_exit.access_rule = make_location_lambda(door_reqs, world, None)
213
214 for region in door_reqs.get_referenced_rooms():
215 world.multiworld.register_indirect_condition(world.multiworld.get_region(region, world.player),
216 er_exit)
217
218 er_entrances.append(entrance)
219 er_exits.append(er_exit)
220
221 result = randomize_entrances(world, True, {0:[0]}, False, er_entrances,
222 er_exits)
223
224 for (f, to) in result.pairings:
225 world.port_pairings[port_id_by_name[f]] = port_id_by_name[to]
226
227
228def connect_ports_from_ut(port_pairings: dict[int, int], world: "Lingo2World"):
229 for fpid, tpid in port_pairings.items():
230 from_port = world.static_logic.objects.ports[fpid]
231 to_port = world.static_logic.objects.ports[tpid]
232
233 from_region_name = world.static_logic.get_room_region_name(from_port.room_id)
234 to_region_name = world.static_logic.get_room_region_name(to_port.room_id)
235
236 from_region = world.multiworld.get_region(from_region_name, world.player)
237 to_region = world.multiworld.get_region(to_region_name, world.player)
238
239 connection = Entrance(world.player, f"{from_region_name} - {from_port.display_name}", from_region)
240
241 reqs = AccessRequirements()
242 if from_port.HasField("required_door"):
243 reqs = world.player_logic.get_door_open_reqs(from_port.required_door).copy()
244
245 if world.for_tracker:
246 reqs.items.add(f"Worldport {fpid} Entered")
247
248 if not reqs.is_empty():
249 connection.access_rule = make_location_lambda(reqs, world, None)
250
251 for region in reqs.get_referenced_rooms():
252 world.multiworld.register_indirect_condition(world.multiworld.get_region(region, world.player),
253 connection)
254
255 from_region.exits.append(connection)
256 connection.connect(to_region)
diff --git a/apworld/requirements.txt b/apworld/requirements.txt index b701d11..b0c79cc 100644 --- a/apworld/requirements.txt +++ b/apworld/requirements.txt
@@ -1 +1 @@
protobuf>=5.29.3 \ No newline at end of file protobuf
diff --git a/apworld/rules.py b/apworld/rules.py index 05689e9..f859e75 100644 --- a/apworld/rules.py +++ b/apworld/rules.py
@@ -1,27 +1,66 @@
1from collections.abc import Callable 1from collections.abc import Callable
2from typing import TYPE_CHECKING 2from typing import TYPE_CHECKING
3 3
4from BaseClasses import CollectionState 4from BaseClasses import CollectionState, Region
5from .player_logic import AccessRequirements 5from .player_logic import AccessRequirements
6 6
7if TYPE_CHECKING: 7if TYPE_CHECKING:
8 from . import Lingo2World 8 from . import Lingo2World
9 9
10 10
11def lingo2_can_satisfy_requirements(state: CollectionState, reqs: AccessRequirements, world: "Lingo2World") -> bool: 11def lingo2_can_satisfy_requirements(state: CollectionState, reqs: AccessRequirements, regions: list[Region],
12 world: "Lingo2World") -> bool:
12 if not all(state.has(item, world.player) for item in reqs.items): 13 if not all(state.has(item, world.player) for item in reqs.items):
13 return False 14 return False
14 15
16 if not all(state.has(item, world.player, amount) for item, amount in reqs.progressives.items()):
17 return False
18
15 if not all(state.can_reach_region(region_name, world.player) for region_name in reqs.rooms): 19 if not all(state.can_reach_region(region_name, world.player) for region_name in reqs.rooms):
16 return False 20 return False
17 21
18 # TODO: symbols, letters 22 if not all(state.can_reach(region) for region in regions):
23 return False
24
25 for letter_key, letter_level in reqs.letters.items():
26 if not state.has(letter_key, world.player, letter_level):
27 return False
28
29 if reqs.cyans:
30 if not any(state.has(letter, world.player, amount)
31 for letter, amount in world.player_logic.double_letter_amount.items()):
32 return False
33
34 if len(reqs.or_logic) > 0:
35 if not all(any(lingo2_can_satisfy_requirements(state, sub_reqs, [], world) for sub_reqs in subjunction)
36 for subjunction in reqs.or_logic):
37 return False
19 38
20 for disjunction in reqs.or_logic: 39 if reqs.complete_at is not None:
21 if not any(lingo2_can_satisfy_requirements(state, sub_reqs, world) for sub_reqs in disjunction): 40 completed = 0
41 checked = 0
42 for possibility in reqs.possibilities:
43 checked += 1
44 if lingo2_can_satisfy_requirements(state, possibility, [], world):
45 completed += 1
46 if completed >= reqs.complete_at:
47 break
48 elif len(reqs.possibilities) - checked + completed < reqs.complete_at:
49 # There aren't enough remaining possibilities for the check to pass.
50 return False
51 if completed < reqs.complete_at:
22 return False 52 return False
23 53
24 return True 54 return True
25 55
26def make_location_lambda(reqs: AccessRequirements, world: "Lingo2World") -> Callable[[CollectionState], bool]: 56def make_location_lambda(reqs: AccessRequirements, world: "Lingo2World",
27 return lambda state: lingo2_can_satisfy_requirements(state, reqs, world) 57 regions: dict[str, Region] | None) -> Callable[[CollectionState], bool]:
58 # Replace required rooms with regions for the top level requirement, which saves looking up the regions during rule
59 # checking.
60 if regions is not None:
61 required_regions = [regions[room_name] for room_name in reqs.rooms]
62 else:
63 required_regions = [world.multiworld.get_region(room_name, world.player) for room_name in reqs.rooms]
64 new_reqs = reqs.copy()
65 new_reqs.rooms.clear()
66 return lambda state: lingo2_can_satisfy_requirements(state, new_reqs, required_regions, world)
diff --git a/apworld/static_logic.py b/apworld/static_logic.py index 965ce3e..715178e 100644 --- a/apworld/static_logic.py +++ b/apworld/static_logic.py
@@ -1,6 +1,8 @@
1from .generated import data_pb2 as data_pb2 1from .generated import data_pb2 as data_pb2
2from .items import SYMBOL_ITEMS, ANTI_COLLECTABLE_TRAPS
2import pkgutil 3import pkgutil
3 4
5
4class Lingo2StaticLogic: 6class Lingo2StaticLogic:
5 item_id_to_name: dict[int, str] 7 item_id_to_name: dict[int, str]
6 location_id_to_name: dict[int, str] 8 location_id_to_name: dict[int, str]
@@ -8,9 +10,20 @@ class Lingo2StaticLogic:
8 item_name_to_id: dict[str, int] 10 item_name_to_id: dict[str, int]
9 location_name_to_id: dict[str, int] 11 location_name_to_id: dict[str, int]
10 12
13 item_name_groups: dict[str, list[str]]
14 location_name_groups: dict[str, list[str]]
15
16 letter_weights: dict[str, int]
17
18 door_id_by_ap_id: dict[int, int]
19 port_id_by_ap_id: dict[int, int]
20
11 def __init__(self): 21 def __init__(self):
12 self.item_id_to_name = {} 22 self.item_id_to_name = {}
13 self.location_id_to_name = {} 23 self.location_id_to_name = {}
24 self.item_name_groups = {}
25 self.location_name_groups = {}
26 self.letter_weights = {}
14 27
15 file = pkgutil.get_data(__name__, "generated/data.binpb") 28 file = pkgutil.get_data(__name__, "generated/data.binpb")
16 self.objects = data_pb2.AllObjects() 29 self.objects = data_pb2.AllObjects()
@@ -18,38 +31,130 @@ class Lingo2StaticLogic:
18 31
19 for door in self.objects.doors: 32 for door in self.objects.doors:
20 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: 33 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]:
21 location_name = f"{self.get_map_object_map_name(door)} - {door.name}" 34 location_name = self.get_door_location_name(door)
22 self.location_id_to_name[door.ap_id] = location_name 35 self.location_id_to_name[door.ap_id] = location_name
23 36
24 if door.type not in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: 37 if door.type not in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]:
25 item_name = self.get_door_item_name(door.id) 38 item_name = self.get_door_item_name(door)
26 self.item_id_to_name[door.ap_id] = item_name 39 self.item_id_to_name[door.ap_id] = item_name
27 40
28 for letter in self.objects.letters: 41 for letter in self.objects.letters:
29 letter_name = f"{letter.key.upper()}{'2' if letter.level2 else '1'}" 42 letter_name = f"{letter.key.upper()}{'2' if letter.level2 else '1'}"
30 location_name = f"{self.get_room_object_map_name(letter)} - {letter_name}" 43 location_name = f"{self.get_room_object_map_name(letter)} - {letter_name}"
31 self.location_id_to_name[letter.ap_id] = location_name 44 self.location_id_to_name[letter.ap_id] = location_name
45 self.location_name_groups.setdefault("Letters", []).append(location_name)
32 46
33 if not letter.level2: 47 if not letter.level2:
34 self.item_id_to_name[letter.ap_id] = letter_name 48 self.item_id_to_name[letter.ap_id] = letter.key.upper()
49 self.item_name_groups.setdefault("Letters", []).append(letter.key.upper())
35 50
36 for mastery in self.objects.masteries: 51 for mastery in self.objects.masteries:
37 location_name = f"{self.get_room_object_map_name(mastery)} - Mastery" 52 location_name = f"{self.get_room_object_map_name(mastery)} - Mastery"
38 self.location_id_to_name[mastery.ap_id] = location_name 53 self.location_id_to_name[mastery.ap_id] = location_name
54 self.location_name_groups.setdefault("Masteries", []).append(location_name)
39 55
40 for ending in self.objects.endings: 56 for ending in self.objects.endings:
41 location_name = f"{self.get_room_object_map_name(ending)} - {ending.name.title()} Ending" 57 location_name = f"{self.get_room_object_map_name(ending)} - {ending.name.title()} Ending"
42 self.location_id_to_name[ending.ap_id] = location_name 58 self.location_id_to_name[ending.ap_id] = location_name
59 self.location_name_groups.setdefault("Endings", []).append(location_name)
60
61 for progressive in self.objects.progressives:
62 self.item_id_to_name[progressive.ap_id] = progressive.name
63
64 for door_group in self.objects.door_groups:
65 self.item_id_to_name[door_group.ap_id] = door_group.name
66
67 for keyholder in self.objects.keyholders:
68 if keyholder.HasField("key"):
69 location_name = f"{self.get_room_object_location_prefix(keyholder)} - {keyholder.key.upper()} Keyholder"
70 self.location_id_to_name[keyholder.ap_id] = location_name
71 self.location_name_groups.setdefault("Keyholders", []).append(location_name)
72
73 self.item_id_to_name[self.objects.special_ids["A Job Well Done"]] = "A Job Well Done"
74 self.item_id_to_name[self.objects.special_ids["Numbers"]] = "Numbers"
75
76 for symbol_name in SYMBOL_ITEMS.values():
77 self.item_id_to_name[self.objects.special_ids[symbol_name]] = symbol_name
43 78
44 self.item_id_to_name[self.objects.special_ids["Nothing"]] = "Nothing" 79 for trap_name in ANTI_COLLECTABLE_TRAPS:
80 self.item_id_to_name[self.objects.special_ids[trap_name]] = trap_name
45 81
46 self.item_name_to_id = {name: ap_id for ap_id, name in self.item_id_to_name.items()} 82 self.item_name_to_id = {name: ap_id for ap_id, name in self.item_id_to_name.items()}
47 self.location_name_to_id = {name: ap_id for ap_id, name in self.location_id_to_name.items()} 83 self.location_name_to_id = {name: ap_id for ap_id, name in self.location_id_to_name.items()}
48 84
49 def get_door_item_name(self, door_id: int) -> str: 85 for panel in self.objects.panels:
50 door = self.objects.doors[door_id] 86 for letter in panel.answer.upper():
87 if letter.isalpha():
88 self.letter_weights[letter] = self.letter_weights.get(letter, 0) + 1
89
90 self.door_id_by_ap_id = {door.ap_id: door.id for door in self.objects.doors if door.HasField("ap_id")}
91 self.port_id_by_ap_id = {port.ap_id: port.id for port in self.objects.ports if port.HasField("ap_id")}
92
93 def get_door_item_name(self, door: data_pb2.Door) -> str:
51 return f"{self.get_map_object_map_name(door)} - {door.name}" 94 return f"{self.get_map_object_map_name(door)} - {door.name}"
52 95
96 def get_door_item_name_by_id(self, door_id: int) -> str:
97 door = self.objects.doors[door_id]
98 return self.get_door_item_name(door_id)
99
100 def get_door_location_name(self, door: data_pb2.Door) -> str:
101 map_part = self.get_room_object_location_prefix(door)
102
103 if door.HasField("location_name"):
104 return f"{map_part} - {door.location_name}"
105
106 generated_location_name = self.get_generated_door_location_name(door)
107 if generated_location_name is not None:
108 return generated_location_name
109
110 return f"{map_part} - {door.name}"
111
112 def get_generated_door_location_name(self, door: data_pb2.Door) -> str | None:
113 if door.type != data_pb2.DoorType.STANDARD:
114 return None
115
116 if len(door.keyholders) > 0 or door.white_ending or door.HasField("complete_at"):
117 return None
118
119 if len(door.panels) > 4:
120 return None
121
122 map_areas = set()
123 for panel_id in door.panels:
124 panel = self.objects.panels[panel_id.panel]
125 panel_room = self.objects.rooms[panel.room_id]
126 # It's okay if panel_display_name is not present because then it's coalesced with other unnamed areas.
127 map_areas.add(panel_room.panel_display_name)
128
129 if len(map_areas) > 1:
130 return None
131
132 game_map = self.objects.maps[door.map_id]
133 map_area = map_areas.pop()
134 if map_area == "":
135 map_part = game_map.display_name
136 else:
137 map_part = f"{game_map.display_name} ({map_area})"
138
139 def get_panel_display_name(panel: data_pb2.ProxyIdentifier) -> str:
140 panel_data = self.objects.panels[panel.panel]
141 panel_name = panel_data.display_name if panel_data.HasField("display_name") else panel_data.name
142
143 if panel.HasField("answer"):
144 return f"{panel_name}/{panel.answer.upper()}"
145 else:
146 return panel_name
147
148 panel_names = [get_panel_display_name(panel_id)
149 for panel_id in door.panels]
150 panel_names.sort()
151
152 return map_part + " - " + ", ".join(panel_names)
153
154 def get_door_location_name_by_id(self, door_id: int) -> str:
155 door = self.objects.doors[door_id]
156 return self.get_door_location_name(door)
157
53 def get_room_region_name(self, room_id: int) -> str: 158 def get_room_region_name(self, room_id: int) -> str:
54 room = self.objects.rooms[room_id] 159 room = self.objects.rooms[room_id]
55 return f"{self.get_map_object_map_name(room)} - {room.name}" 160 return f"{self.get_map_object_map_name(room)} - {room.name}"
@@ -59,3 +164,19 @@ class Lingo2StaticLogic:
59 164
60 def get_room_object_map_name(self, obj) -> str: 165 def get_room_object_map_name(self, obj) -> str:
61 return self.get_map_object_map_name(self.objects.rooms[obj.room_id]) 166 return self.get_map_object_map_name(self.objects.rooms[obj.room_id])
167
168 def get_room_object_location_prefix(self, obj) -> str:
169 room = self.objects.rooms[obj.room_id]
170 game_map = self.objects.maps[room.map_id]
171
172 if room.HasField("panel_display_name"):
173 return f"{game_map.display_name} ({room.panel_display_name})"
174 else:
175 return game_map.display_name
176
177 def get_room_object_map_id(self, obj) -> int:
178 return self.objects.rooms[obj.room_id].map_id
179
180 def get_data_version(self) -> list[int]:
181 version = self.objects.version
182 return [version.major, version.minor, version.patch]
diff --git a/apworld/tracker.py b/apworld/tracker.py new file mode 100644 index 0000000..a84c3f8 --- /dev/null +++ b/apworld/tracker.py
@@ -0,0 +1,147 @@
1from typing import TYPE_CHECKING, Iterator
2
3from BaseClasses import MultiWorld, CollectionState, ItemClassification, Region, Entrance
4from NetUtils import NetworkItem
5from . import Lingo2World, Lingo2Item
6from .regions import connect_ports_from_ut
7from .options import Lingo2Options, ShuffleLetters
8
9if TYPE_CHECKING:
10 from .context import Lingo2Manager
11
12PLAYER_NUM = 1
13
14
15class Tracker:
16 manager: "Lingo2Manager"
17
18 multiworld: MultiWorld
19 world: Lingo2World
20
21 collected_items: dict[int, int]
22 checked_locations: set[int]
23 accessible_locations: set[int]
24 accessible_worldports: set[int]
25 goal_accessible: bool
26
27 state: CollectionState
28
29 def __init__(self, manager: "Lingo2Manager"):
30 self.manager = manager
31 self.collected_items = {}
32 self.checked_locations = set()
33 self.accessible_locations = set()
34 self.accessible_worldports = set()
35 self.goal_accessible = False
36
37 def setup_slot(self, slot_data):
38 Lingo2World.for_tracker = True
39
40 self.multiworld = MultiWorld(players=PLAYER_NUM)
41 self.world = Lingo2World(self.multiworld, PLAYER_NUM)
42 self.multiworld.worlds[1] = self.world
43 self.world.options = Lingo2Options(**{k: t(slot_data.get(k, t.default))
44 for k, t in Lingo2Options.type_hints.items()})
45
46 self.world.generate_early()
47 self.world.create_regions()
48
49 if self.world.options.shuffle_worldports:
50 port_pairings = {
51 self.world.static_logic.port_id_by_ap_id[int(fp)]: self.world.static_logic.port_id_by_ap_id[int(tp)]
52 for fp, tp in slot_data["port_pairings"].items()
53 }
54 connect_ports_from_ut(port_pairings, self.world)
55
56 self.refresh_state()
57
58 def set_checked_locations(self, checked_locations: set[int]):
59 self.checked_locations = checked_locations.copy()
60
61 def set_collected_items(self, network_items: list[NetworkItem]):
62 self.collected_items = {}
63
64 for item in network_items:
65 self.collected_items[item.item] = self.collected_items.get(item.item, 0) + 1
66
67 self.refresh_state()
68
69 def refresh_state(self):
70 self.state = CollectionState(self.multiworld)
71
72 for item_id, item_amount in self.collected_items.items():
73 for i in range(item_amount):
74 self.state.collect(Lingo2Item(Lingo2World.static_logic.item_id_to_name.get(item_id),
75 ItemClassification.progression, item_id, PLAYER_NUM), prevent_sweep=True)
76
77 for k, v in self.manager.keyboard.items():
78 # Unless all level 1 letters are pre-unlocked, H1 I1 N1 and T1 act differently between the generator and
79 # game. The generator considers them to be unlocked, which means they are not included in logic
80 # requirements, and only one item/event is needed to unlock their level 2 forms. The game considers them to
81 # be vanilla, which means you still have to pick them up in the Starting Room in order for them to appear on
82 # your keyboard. This also means that whether or not you have the level 1 forms should be synced to the
83 # multiworld. The tracker specifically should collect one fewer item for these letters in this scenario.
84 tv = v
85 if k in "hint" and self.world.options.shuffle_letters in [ShuffleLetters.option_vanilla,
86 ShuffleLetters.option_progressive]:
87 tv = max(0, v - 1)
88
89 if tv > 0:
90 for i in range(tv):
91 self.state.collect(Lingo2Item(k.upper(), ItemClassification.progression, None, PLAYER_NUM),
92 prevent_sweep=True)
93
94 for port_id in self.manager.worldports:
95 self.state.collect(Lingo2Item(f"Worldport {port_id} Entered", ItemClassification.progression, None,
96 PLAYER_NUM), prevent_sweep=True)
97
98 self.state.sweep_for_advancements()
99 self.state.update_reachable_regions(PLAYER_NUM)
100
101 self.accessible_locations = set()
102 self.accessible_worldports = set()
103 self.goal_accessible = False
104
105 for region in self.state.reachable_regions[PLAYER_NUM]:
106 for location in region.locations:
107 if location.access_rule(self.state):
108 if location.address is not None:
109 if location.address not in self.checked_locations:
110 self.accessible_locations.add(location.address)
111 elif hasattr(location, "port_id"):
112 if location.port_id not in self.manager.worldports:
113 self.accessible_worldports.add(location.port_id)
114 elif hasattr(location, "goal") and location.goal:
115 if not self.manager.goaled:
116 self.goal_accessible = True
117
118 def get_path_to_location(self, location_id: int) -> list[str] | None:
119 location_name = self.world.location_id_to_name.get(location_id)
120 location = self.multiworld.get_location(location_name, PLAYER_NUM)
121 return self.get_logical_path(location.parent_region)
122
123 def get_path_to_port(self, port_id: int) -> list[str] | None:
124 port = self.world.static_logic.objects.ports[port_id]
125 region_name = self.world.static_logic.get_room_region_name(port.room_id)
126 region = self.multiworld.get_region(region_name, PLAYER_NUM)
127 return self.get_logical_path(region)
128
129 def get_path_to_goal(self):
130 room_id = self.world.player_logic.goal_room_id
131 region_name = self.world.static_logic.get_room_region_name(room_id)
132 region = self.multiworld.get_region(region_name, PLAYER_NUM)
133 return self.get_logical_path(region)
134
135 def get_logical_path(self, region: Region) -> list[str] | None:
136 if region not in self.state.path:
137 return None
138
139 def flist_to_iter(path_value) -> Iterator[str]:
140 while path_value:
141 region_or_entrance, path_value = path_value
142 yield region_or_entrance
143
144 reversed_path = self.state.path.get(region)
145 flat_path = reversed(list(map(str, flist_to_iter(reversed_path))))
146
147 return list(flat_path)[1::2]
diff --git a/client/archipelago.tscn b/client/archipelago.tscn new file mode 100644 index 0000000..1c156a3 --- /dev/null +++ b/client/archipelago.tscn
@@ -0,0 +1,153 @@
1[gd_scene load_steps=3 format=3 uid="uid://b5mj3cq2bcesd"]
2
3[ext_resource type="Theme" uid="uid://7w454egydi41" path="res://assets/themes/baseUI.tres" id="1_mw3f1"]
4
5[sub_resource id=2 type="GDScript"]
6script/source = "extends Node2D
7
8const CACHE_PATH = \"user://apworld_path.txt\"
9
10
11func _ready():
12 if FileAccess.file_exists(CACHE_PATH):
13 var file = FileAccess.open(CACHE_PATH, FileAccess.READ)
14 $Panel/HBoxContainer/LineEdit.text = file.get_as_text()
15 file.close()
16
17
18func _browse_pressed():
19 $FileDialog.popup_centered()
20
21
22func _file_selected(path):
23 $Panel/HBoxContainer/LineEdit.text = path
24
25
26func _start_pressed():
27 var apworld_path = $Panel/HBoxContainer/LineEdit.text
28
29 if not FileAccess.file_exists(apworld_path):
30 $AcceptDialog.popup_centered()
31 return
32
33 var zip_reader = ZIPReader.new()
34 zip_reader.open(apworld_path)
35
36 var inner_path = \"lingo2/client/apworld_runtime.gd\"
37 if not zip_reader.file_exists(inner_path):
38 zip_reader.close()
39 $AcceptDialog.popup_centered()
40 return
41
42 var cache_file = FileAccess.open(CACHE_PATH, FileAccess.WRITE)
43 cache_file.store_string(apworld_path)
44 cache_file.close()
45
46 var runtime_script = GDScript.new()
47 runtime_script.source_code = zip_reader.read_file(inner_path).get_string_from_utf8()
48 runtime_script.reload()
49
50 zip_reader.close()
51
52 var runtime = runtime_script.new(apworld_path)
53 runtime.name = \"Runtime\"
54
55 global.add_child(runtime)
56
57 runtime.load_script_as_scene.call_deferred(\"settings_screen.gd\", \"settings_screen\")
58
59
60func _quit_pressed():
61 get_tree().change_scene_to_file(\"res://objects/scenes/menus/main_menu.tscn\")
62
63"
64
65[node name="Node2D" type="Node2D"]
66script = SubResource( 2 )
67
68[node name="Panel" type="Panel" parent="."]
69anchors_preset = -1
70offset_right = 1920.0
71offset_bottom = 1080.0
72
73[node name="Label" type="Label" parent="Panel"]
74layout_mode = 1
75anchors_preset = -1
76offset_top = 75.0
77offset_right = 1920.0
78offset_bottom = 225.0
79theme = ExtResource("1_mw3f1")
80text = "archipelago"
81horizontal_alignment = 1
82vertical_alignment = 1
83
84[node name="Label2" type="Label" parent="Panel"]
85layout_mode = 1
86anchors_preset = -1
87anchor_right = 1.0
88offset_left = 80.0
89offset_top = 300.0
90offset_right = -80.0
91offset_bottom = 388.0
92theme = ExtResource("1_mw3f1")
93theme_override_font_sizes/font_size = 56
94text = "Put the path to your lingo2.apworld in the below field and click start. Then, open the archipelago launcher and click \"Lingo 2 Client\"."
95horizontal_alignment = 1
96autowrap_mode = 3
97
98[node name="HBoxContainer" type="HBoxContainer" parent="Panel"]
99layout_mode = 1
100anchors_preset = -1
101anchor_right = 1.0
102offset_left = 80.0
103offset_top = 595.0
104offset_right = -80.0
105offset_bottom = 755.0
106theme_override_constants/separation = 32
107
108[node name="LineEdit" type="LineEdit" parent="Panel/HBoxContainer"]
109layout_mode = 2
110size_flags_horizontal = 3
111
112[node name="Button" type="Button" parent="Panel/HBoxContainer"]
113layout_mode = 2
114theme = ExtResource("1_mw3f1")
115text = "browse"
116
117[node name="StartButton" type="Button" parent="Panel"]
118layout_mode = 1
119anchors_preset = -1
120offset_left = 255.0
121offset_top = 875.0
122offset_right = 891.0
123offset_bottom = 1025.0
124theme = ExtResource("1_mw3f1")
125text = "start"
126
127[node name="QuitButton" type="Button" parent="Panel"]
128layout_mode = 1
129anchors_preset = -1
130offset_left = 1102.0
131offset_top = 875.0
132offset_right = 1738.0
133offset_bottom = 1025.0
134theme = ExtResource("1_mw3f1")
135text = "back"
136
137[node name="FileDialog" type="FileDialog" parent="."]
138title = "Open a File"
139size = Vector2i(512, 512)
140ok_button_text = "Open"
141file_mode = 0
142access = 2
143filters = PackedStringArray("*.apworld;Archipelago Worlds")
144show_hidden_files = true
145use_native_dialog = true
146
147[node name="AcceptDialog" type="AcceptDialog" parent="."]
148dialog_text = "Could not open Lingo 2 apworld. Please check that the path is correct."
149
150[connection signal="pressed" from="Panel/HBoxContainer/Button" to="." method="_browse_pressed"]
151[connection signal="pressed" from="Panel/StartButton" to="." method="_start_pressed"]
152[connection signal="pressed" from="Panel/QuitButton" to="." method="_quit_pressed"]
153[connection signal="file_selected" from="FileDialog" to="." method="_file_selected"]
diff --git a/data/MISSING PANELS.txt b/data/MISSING PANELS.txt new file mode 100644 index 0000000..478b8be --- /dev/null +++ b/data/MISSING PANELS.txt
@@ -0,0 +1,32 @@
1Used in vanilla doors:
2
3The Between - RIGHT
4
5
6
7
8Used in a pseudo-connection:
9
10The Sturdy - COLORS
11
12
13
14
15Unsolved panels in letter rooms:
16
17Daedalus (F2 Room) - DEADLY
18Daedalus (F2 Room) - DIMS
19Daedalus (F2 Room) - GRAVE
20Daedalus (F2 Room) - LETHAL
21Daedalus (O2 Room) - ACCEPT
22Daedalus (O2 Room) - FOLLOW
23Daedalus (O2 Room) - PLEDGE
24Daedalus (O2 Room) - WARNING
25Daedalus (U2 Room) - EFFECTIVE
26Daedalus (U2 Room) - HELPFUL
27Daedalus (U2 Room) - INFERNAL
28Daedalus (U2 Room) - PRACTICAL
29Daedalus (U2 Room) - PRODUCTIVE
30Daedalus (U2 Room) - WONDERLAND
31The Digital - EYE
32The Digital - HIGH
diff --git a/data/README.md b/data/README.md new file mode 100644 index 0000000..bf0a51b --- /dev/null +++ b/data/README.md
@@ -0,0 +1,13 @@
1# Lingo 2 Randomizer Data
2
3This folder contains the logic for the Lingo 2 randomizer in a human-readable
4format. This data is compiled into a single file and used in the various parts
5of the randomizer project (client, apworld, etc).
6
7The data is structured using [Protocol Buffers](https://protobuf.dev/). The
8schema for the human-readable format is
9[located in the repository](https://code.fourisland.com/lingo2-archipelago/tree/proto/human.proto).
10
11## Compiling
12
13Hi.
diff --git a/data/connections.txtpb b/data/connections.txtpb index a533e85..8d75dab 100644 --- a/data/connections.txtpb +++ b/data/connections.txtpb
@@ -1,57 +1,3 @@
1# TODO
2# the_entry/Starting Room/HI/thewords
3# the_entry/Lime Room/DAEDALUS
4# the_entry/Link Area/PYRAMID
5# the_entry/Daedalus Entrance/DAEDALUS
6# the_entry/Composite Room Entrance/COMPOSITE
7# four_rooms/Examples Room/DAEDALUS
8# control center -> the_ancient
9# the_bearer/Back Area/TREE
10# the_bearer/Back Area/DAEDALUS
11# the_between/Control Center Side/CC
12# the_digital/Tree Area/TREE
13# the_gallery/Daedalus Extension/EYE
14# the_gallery/Daedalus Extension/PYRAMID
15# the_gallery/Daedalus Extension/TOWER
16# the_gallery/Daedalus Extension/GATE
17# the_gallery/Daedalus Extension/PUMPKIN
18# the_gallery/Daedalus Extension/HOUSE
19# the_gallery/Daedalus Extension/SNAKE
20# the_gallery/Main Area/WISE
21# the_gallery/Main Area/TREE
22# the_gallery/Main Area/CC
23# the_gallery/Main Area/TOWER
24# the_gallery/Main Area/WONDROUS
25# the_gallery/Main Area/RAINBOW
26# the_gallery/Main Area/WORDS
27# the_gallery/Main Area/CASTLE
28# the_great/Purple Room/DAEDALUS
29# the_great/Daedalus Entrance/DAEDALUS (keep in mind the door only blocks one direction of this)
30# the_great/West Side/CC
31# the_great/Back Area/UNKEMPT
32# the_great/Back Area/THREEDOORS
33# the_great/Back Area/TOWER (keep in mind the door only blocks one direction of this)
34# the_great/Back Area/TREE
35# the_great/Talented Entrance/TALENTED
36# the_hinterlands/Main Area/LEFT
37# the_hinterlands/Main Area/RIGHT
38# the_hive/Main Area/DAED1
39# the_hive/Main Area/DAED2
40# the_hive/Main Area/DAED3
41# the_liberated/Painting Room/PYRAMID
42# the_literate/Painting Room/PYRAMID
43# the_partial/Control Center Entrance/CC
44# the_perceptive/Main Area/CC
45# the_plaza/Symbolic Entrance/SYMBOLIC
46# the_quiet/Main Area/DAEDALUS
47# cc -> relentless (don't use port objects)
48# the_repetitive/Main Room/CC
49# cc <-> the shop (keyholder door only needed one way)
50# the_sturdy/S2 Area/RAINBOW
51# the_sun_temple/Entrance/UNKEMPT
52# the_sweet/Main Area/EXIT1
53# the_sweet/Main Area/EXIT2
54# the_unyielding/Central Connected Area/BACK (panel)
55connections { 1connections {
56 from { 2 from {
57 port { 3 port {
@@ -72,7 +18,7 @@ connections {
72 from { 18 from {
73 port { 19 port {
74 map: "the_entry" 20 map: "the_entry"
75 room: "Flipped Second Room" 21 room: "Four Rooms Entrance"
76 name: "FOUR" 22 name: "FOUR"
77 } 23 }
78 } 24 }
@@ -193,7 +139,7 @@ connections {
193 to { 139 to {
194 port { 140 port {
195 map: "the_darkroom" 141 map: "the_darkroom"
196 room: "First Room" 142 room: "Cyan Hallway"
197 name: "COLORFUL" 143 name: "COLORFUL"
198 } 144 }
199 } 145 }
@@ -209,7 +155,7 @@ connections {
209 to { 155 to {
210 port { 156 port {
211 map: "the_darkroom" 157 map: "the_darkroom"
212 room: "Second Room" 158 room: "Congruent Entrance"
213 name: "CONGRUENT" 159 name: "CONGRUENT"
214 } 160 }
215 } 161 }
@@ -285,7 +231,7 @@ connections {
285 from { 231 from {
286 port { 232 port {
287 map: "the_darkroom" 233 map: "the_darkroom"
288 room: "First Room" 234 room: "Double Sided Entrance"
289 name: "DOUBLESIDED" 235 name: "DOUBLESIDED"
290 } 236 }
291 } 237 }
@@ -360,6 +306,23 @@ connections {
360 name: "GALLERY" 306 name: "GALLERY"
361 } 307 }
362 } 308 }
309 oneway: true
310}
311connections {
312 from {
313 port {
314 map: "the_butterfly"
315 room: "Main Area"
316 name: "GALLERY"
317 }
318 }
319 to {
320 room {
321 map: "the_gallery"
322 name: "Main Area"
323 }
324 }
325 oneway: true
363} 326}
364connections { 327connections {
365 from { 328 from {
@@ -670,7 +633,7 @@ connections {
670 from { 633 from {
671 port { 634 port {
672 map: "the_entry" 635 map: "the_entry"
673 room: "Link Area" 636 room: "Liberated Entrance"
674 name: "BLUE" 637 name: "BLUE"
675 } 638 }
676 } 639 }
@@ -718,7 +681,7 @@ connections {
718 from { 681 from {
719 port { 682 port {
720 map: "the_entry" 683 map: "the_entry"
721 room: "Link Area" 684 room: "Literate Entrance"
722 name: "BROWN" 685 name: "BROWN"
723 } 686 }
724 } 687 }
@@ -766,7 +729,7 @@ connections {
766 from { 729 from {
767 port { 730 port {
768 map: "the_orb" 731 map: "the_orb"
769 room: "B Room" 732 room: "Middle Room"
770 name: "MID" 733 name: "MID"
771 } 734 }
772 } 735 }
@@ -893,6 +856,8 @@ connections {
893 } 856 }
894 oneway: true 857 oneway: true
895} 858}
859# Two one-way connections because the CLUE panel only needs to be solved to
860# go from The Great to The Partial.
896connections { 861connections {
897 from { 862 from {
898 port { 863 port {
@@ -908,6 +873,25 @@ connections {
908 name: "GREAT" 873 name: "GREAT"
909 } 874 }
910 } 875 }
876 oneway: true
877}
878connections {
879 from {
880 port {
881 map: "the_partial"
882 room: "Obverse Side"
883 name: "GREAT"
884 }
885 }
886 to {
887 port {
888 map: "the_great"
889 room: "West Side"
890 name: "PARTIAL"
891 }
892 }
893 oneway: true
894 bypass_target_door: true
911} 895}
912connections { 896connections {
913 from { 897 from {
@@ -977,7 +961,7 @@ connections {
977 from { 961 from {
978 port { 962 port {
979 map: "the_entry" 963 map: "the_entry"
980 room: "Lime Room" 964 room: "Revitalized Entrance"
981 name: "REVITALIZED" 965 name: "REVITALIZED"
982 } 966 }
983 } 967 }
@@ -1198,3 +1182,1559 @@ connections {
1198 } 1182 }
1199 } 1183 }
1200} 1184}
1185connections {
1186 from {
1187 port {
1188 map: "daedalus"
1189 room: "Outside Hedges"
1190 name: "REVITALIZED"
1191 }
1192 }
1193 to {
1194 port {
1195 map: "the_revitalized"
1196 room: "Bye Room"
1197 name: "PARTHENON"
1198 }
1199 }
1200 oneway: true
1201}
1202connections {
1203 from {
1204 panel {
1205 map: "daedalus"
1206 room: "Rainbow End"
1207 name: "POT"
1208 }
1209 }
1210 to {
1211 room {
1212 map: "the_gold"
1213 name: "The Whole Thing"
1214 }
1215 }
1216 oneway: true
1217}
1218connections {
1219 from {
1220 room {
1221 map: "daedalus"
1222 name: "Roof"
1223 }
1224 }
1225 to {
1226 room {
1227 map: "the_graveyard"
1228 name: "Outside"
1229 }
1230 }
1231 oneway: true
1232 roof_access: true
1233}
1234connections {
1235 from {
1236 painting {
1237 map: "the_gallery"
1238 room: "Daedalus Extension"
1239 name: "PYRAMID"
1240 }
1241 }
1242 to {
1243 room {
1244 map: "daedalus"
1245 name: "Outside Pyramid"
1246 }
1247 }
1248 oneway: true
1249}
1250connections {
1251 from {
1252 painting {
1253 map: "the_gallery"
1254 room: "Daedalus Extension"
1255 name: "TOWER"
1256 }
1257 }
1258 to {
1259 room {
1260 map: "daedalus"
1261 name: "Outside Hedges"
1262 }
1263 }
1264 oneway: true
1265}
1266connections {
1267 from {
1268 painting {
1269 map: "the_gallery"
1270 room: "Daedalus Extension"
1271 name: "GATE"
1272 }
1273 }
1274 to {
1275 room {
1276 map: "daedalus"
1277 name: "Z2 Room"
1278 }
1279 }
1280 oneway: true
1281}
1282connections {
1283 from {
1284 painting {
1285 map: "the_gallery"
1286 room: "Daedalus Extension"
1287 name: "PUMPKIN"
1288 }
1289 }
1290 to {
1291 room {
1292 map: "daedalus"
1293 name: "Green Color Door"
1294 }
1295 }
1296 oneway: true
1297}
1298connections {
1299 from {
1300 painting {
1301 map: "the_gallery"
1302 room: "Daedalus Extension"
1303 name: "HOUSE"
1304 }
1305 }
1306 to {
1307 room {
1308 map: "daedalus"
1309 name: "Outside House"
1310 }
1311 }
1312 oneway: true
1313}
1314connections {
1315 from {
1316 painting {
1317 map: "the_gallery"
1318 room: "Daedalus Extension"
1319 name: "SNAKE"
1320 }
1321 }
1322 to {
1323 room {
1324 map: "daedalus"
1325 name: "Outside Snake Room"
1326 }
1327 }
1328 oneway: true
1329}
1330connections {
1331 from {
1332 port {
1333 map: "the_entry"
1334 room: "White Hallway To Daedalus"
1335 name: "DAEDALUS"
1336 }
1337 }
1338 to {
1339 port {
1340 map: "daedalus"
1341 room: "White Hallway From Entry"
1342 name: "ENTRY"
1343 }
1344 }
1345}
1346connections {
1347 from {
1348 port {
1349 map: "the_entry"
1350 room: "Daedalus Entrance"
1351 name: "DAEDALUS"
1352 }
1353 }
1354 to {
1355 port {
1356 map: "daedalus"
1357 room: "Entry Shortcut"
1358 name: "ENTRY"
1359 }
1360 }
1361}
1362connections {
1363 from {
1364 port {
1365 map: "the_entry"
1366 room: "Composite Room Entrance"
1367 name: "COMPOSITE"
1368 }
1369 }
1370 to {
1371 port {
1372 map: "daedalus"
1373 room: "Composite Room S"
1374 name: "ENTRY"
1375 }
1376 }
1377}
1378connections {
1379 from {
1380 port {
1381 map: "four_rooms"
1382 room: "Examples Room"
1383 name: "DAEDALUS"
1384 }
1385 }
1386 to {
1387 port {
1388 map: "daedalus"
1389 room: "Yellow Color Door"
1390 name: "FOURROOMS"
1391 }
1392 }
1393}
1394connections {
1395 from {
1396 port {
1397 map: "the_bearer"
1398 room: "Back Area"
1399 name: "DAEDALUS"
1400 }
1401 }
1402 to {
1403 port {
1404 map: "daedalus"
1405 room: "Rain Side"
1406 name: "BEARER"
1407 }
1408 }
1409}
1410connections {
1411 from {
1412 painting {
1413 map: "the_gallery"
1414 room: "Main Area"
1415 name: "RAINBOW"
1416 }
1417 }
1418 to {
1419 painting {
1420 map: "daedalus"
1421 room: "Rainbow Start"
1422 name: "RAINBOW"
1423 }
1424 }
1425 oneway: true
1426}
1427connections {
1428 from {
1429 painting {
1430 map: "the_gallery"
1431 room: "Main Area"
1432 name: "CASTLE"
1433 }
1434 }
1435 to {
1436 room {
1437 map: "daedalus"
1438 name: "Castle"
1439 }
1440 }
1441 oneway: true
1442}
1443connections {
1444 from {
1445 port {
1446 map: "the_great"
1447 room: "Purple Room"
1448 name: "DAEDALUS"
1449 }
1450 }
1451 to {
1452 port {
1453 map: "daedalus"
1454 room: "Purple Hallway From Great"
1455 name: "GREAT"
1456 }
1457 }
1458}
1459connections {
1460 from {
1461 port {
1462 map: "the_great"
1463 room: "Daedalus Entrance"
1464 name: "DAEDALUS"
1465 }
1466 }
1467 to {
1468 port {
1469 map: "daedalus"
1470 room: "Starting Room"
1471 name: "GREAT"
1472 }
1473 }
1474 oneway: true
1475}
1476connections {
1477 from {
1478 port {
1479 map: "daedalus"
1480 room: "Starting Room"
1481 name: "GREAT"
1482 }
1483 }
1484 to {
1485 port {
1486 map: "the_great"
1487 room: "Daedalus Entrance"
1488 name: "DAEDALUS"
1489 }
1490 }
1491 oneway: true
1492 bypass_target_door: true
1493}
1494connections {
1495 from {
1496 port {
1497 map: "the_hive"
1498 room: "Main Area"
1499 name: "DAED1"
1500 }
1501 }
1502 to {
1503 port {
1504 map: "daedalus"
1505 room: "Moat"
1506 name: "HIVE"
1507 }
1508 }
1509}
1510connections {
1511 from {
1512 port {
1513 map: "the_hive"
1514 room: "Main Area"
1515 name: "DAED2"
1516 }
1517 }
1518 to {
1519 port {
1520 map: "daedalus"
1521 room: "Moat"
1522 name: "HIVE"
1523 }
1524 }
1525 oneway: true
1526}
1527connections {
1528 from {
1529 port {
1530 map: "the_hive"
1531 room: "Main Area"
1532 name: "DAED3"
1533 }
1534 }
1535 to {
1536 port {
1537 map: "daedalus"
1538 room: "Moat"
1539 name: "HIVE"
1540 }
1541 }
1542 oneway: true
1543}
1544connections {
1545 from {
1546 port {
1547 map: "the_quiet"
1548 room: "Main Area"
1549 name: "DAEDALUS"
1550 }
1551 }
1552 to {
1553 port {
1554 map: "daedalus"
1555 room: "Quiet Entrance"
1556 name: "QUIET"
1557 }
1558 }
1559}
1560connections {
1561 from {
1562 painting {
1563 map: "the_sturdy"
1564 room: "S2 Area"
1565 name: "RAINBOW2"
1566 }
1567 }
1568 to {
1569 painting {
1570 map: "daedalus"
1571 room: "Rainbow Start"
1572 name: "RAINBOW"
1573 }
1574 }
1575 oneway: true
1576}
1577connections {
1578 from {
1579 painting {
1580 map: "the_sturdy"
1581 room: "Hidden Rainbow"
1582 name: "RAINBOW"
1583 }
1584 }
1585 to {
1586 painting {
1587 map: "daedalus"
1588 room: "Rainbow Start"
1589 name: "RAINBOW"
1590 }
1591 }
1592 oneway: true
1593}
1594connections {
1595 from {
1596 port {
1597 map: "the_sweet"
1598 room: "Main Area"
1599 name: "EXIT1"
1600 }
1601 }
1602 to {
1603 port {
1604 map: "daedalus"
1605 room: "Sweet Foyer"
1606 name: "SWEET1"
1607 }
1608 }
1609}
1610connections {
1611 from {
1612 port {
1613 map: "the_sweet"
1614 room: "Main Area"
1615 name: "EXIT2"
1616 }
1617 }
1618 to {
1619 port {
1620 map: "daedalus"
1621 room: "Sweet Foyer"
1622 name: "SWEET2"
1623 }
1624 }
1625}
1626connections {
1627 from {
1628 painting {
1629 map: "daedalus"
1630 room: "Gallery Entrance"
1631 name: "GALLERY"
1632 }
1633 }
1634 to {
1635 painting {
1636 map: "the_gallery"
1637 room: "Daedalus Extension"
1638 name: "EYE"
1639 }
1640 }
1641 oneway: true
1642}
1643connections {
1644 from {
1645 port {
1646 map: "the_entry"
1647 room: "Rabbit Hole"
1648 name: "HOLE"
1649 }
1650 }
1651 to {
1652 room {
1653 map: "daedalus"
1654 name: "Wonderland"
1655 }
1656 }
1657 oneway: true
1658}
1659connections {
1660 from {
1661 port {
1662 map: "the_plaza"
1663 room: "Symbolic Entrance"
1664 name: "SYMBOLIC"
1665 }
1666 }
1667 to {
1668 port {
1669 map: "the_symbolic"
1670 room: "White Room"
1671 name: "PLAZA"
1672 }
1673 }
1674}
1675connections {
1676 from {
1677 port {
1678 map: "the_great"
1679 room: "Talented Entrance"
1680 name: "TALENTED"
1681 }
1682 }
1683 to {
1684 port {
1685 map: "the_talented"
1686 room: "Main Area"
1687 name: "GREAT"
1688 }
1689 }
1690}
1691connections {
1692 from {
1693 panel {
1694 map: "daedalus"
1695 room: "Wisdom Panel"
1696 name: "INTELLIGENCE"
1697 }
1698 }
1699 to {
1700 room {
1701 map: "the_tenacious"
1702 name: "Wisdom Room"
1703 }
1704 }
1705 oneway: true
1706}
1707connections {
1708 from {
1709 painting {
1710 map: "daedalus"
1711 room: "South Castle Area"
1712 name: "TRIANGLE"
1713 }
1714 }
1715 to {
1716 room {
1717 map: "the_tenacious"
1718 name: "Color Room"
1719 }
1720 }
1721 oneway: true
1722}
1723connections {
1724 from {
1725 port {
1726 map: "daedalus"
1727 room: "Hedges Tower"
1728 name: "TENACIOUS"
1729 }
1730 }
1731 to {
1732 room {
1733 map: "the_tenacious"
1734 name: "Tower Room"
1735 }
1736 }
1737 oneway: true
1738}
1739connections {
1740 from {
1741 port {
1742 map: "the_great"
1743 room: "Back Area"
1744 name: "THREEDOORS"
1745 }
1746 }
1747 to {
1748 port {
1749 map: "the_three_doors"
1750 room: "First Second Room"
1751 name: "GREAT"
1752 }
1753 }
1754}
1755connections {
1756 from {
1757 painting {
1758 map: "the_gallery"
1759 room: "Main Area"
1760 name: "TOWER"
1761 }
1762 }
1763 to {
1764 room {
1765 map: "the_tower"
1766 name: "First Floor"
1767 }
1768 }
1769 oneway: true
1770}
1771connections {
1772 # Two one-way connections because the door only blocks one direction.
1773 from {
1774 port {
1775 map: "the_great"
1776 room: "Back Area"
1777 name: "TOWER"
1778 }
1779 }
1780 to {
1781 port {
1782 map: "the_tower"
1783 room: "First Floor"
1784 name: "GREAT"
1785 }
1786 }
1787 oneway: true
1788}
1789connections {
1790 from {
1791 port {
1792 map: "the_tower"
1793 room: "First Floor"
1794 name: "GREAT"
1795 }
1796 }
1797 to {
1798 port {
1799 map: "the_great"
1800 room: "Back Area"
1801 name: "TOWER"
1802 }
1803 }
1804 oneway: true
1805 bypass_target_door: true
1806}
1807connections {
1808 from {
1809 port {
1810 map: "the_bearer"
1811 room: "Tree Entrance"
1812 name: "TREE"
1813 }
1814 }
1815 to {
1816 port {
1817 map: "the_tree"
1818 room: "Bearer Entrance"
1819 name: "BEARER"
1820 }
1821 }
1822}
1823connections {
1824 from {
1825 port {
1826 map: "the_digital"
1827 room: "Tree Area"
1828 name: "TREE"
1829 }
1830 }
1831 to {
1832 port {
1833 map: "the_tree"
1834 room: "Main Area"
1835 name: "DIGITAL"
1836 }
1837 }
1838}
1839connections {
1840 from {
1841 painting {
1842 map: "the_gallery"
1843 room: "Main Area"
1844 name: "TREE"
1845 }
1846 }
1847 to {
1848 room {
1849 map: "the_tree"
1850 name: "Main Area"
1851 }
1852 }
1853 oneway: true
1854}
1855connections {
1856 from {
1857 port {
1858 map: "the_great"
1859 room: "Back Area"
1860 name: "TREE"
1861 }
1862 }
1863 to {
1864 port {
1865 map: "the_tree"
1866 room: "Main Area"
1867 name: "GREAT"
1868 }
1869 }
1870}
1871connections {
1872 from {
1873 port {
1874 map: "daedalus"
1875 room: "Tree Entrance"
1876 name: "TREE"
1877 }
1878 }
1879 to {
1880 port {
1881 map: "the_tree"
1882 room: "Main Area"
1883 name: "DAEDALUS"
1884 }
1885 }
1886}
1887connections {
1888 from {
1889 port {
1890 map: "the_great"
1891 room: "Back Area"
1892 name: "UNKEMPT"
1893 }
1894 }
1895 to {
1896 port {
1897 map: "the_unkempt"
1898 room: "Main Area"
1899 name: "GREAT"
1900 }
1901 }
1902}
1903connections {
1904 # Two one-way connections because the door only blocks one direction.
1905 from {
1906 port {
1907 map: "the_unkempt"
1908 room: "Main Area"
1909 name: "SUNTEMPLE"
1910 }
1911 }
1912 to {
1913 port {
1914 map: "the_sun_temple"
1915 room: "Entrance"
1916 name: "UNKEMPT"
1917 }
1918 }
1919 oneway: true
1920}
1921connections {
1922 from {
1923 port {
1924 map: "the_sun_temple"
1925 room: "Entrance"
1926 name: "UNKEMPT"
1927 }
1928 }
1929 to {
1930 port {
1931 map: "the_unkempt"
1932 room: "Main Area"
1933 name: "SUNTEMPLE"
1934 }
1935 }
1936 oneway: true
1937 bypass_target_door: true
1938}
1939connections {
1940 from {
1941 port {
1942 map: "the_unkempt"
1943 room: "Daedalus Entrance"
1944 name: "DAEDALUS"
1945 }
1946 }
1947 to {
1948 port {
1949 map: "daedalus"
1950 room: "Unkempt Entrance"
1951 name: "UNKEMPT"
1952 }
1953 }
1954}
1955connections {
1956 from {
1957 port {
1958 map: "the_unkempt"
1959 room: "Main Area"
1960 name: "TREE"
1961 }
1962 }
1963 to {
1964 port {
1965 map: "the_tree"
1966 room: "Main Area"
1967 name: "UNKEMPT"
1968 }
1969 }
1970}
1971connections {
1972 from {
1973 painting {
1974 map: "the_entry"
1975 room: "Link Area"
1976 name: "PYRAMID"
1977 }
1978 }
1979 to {
1980 room {
1981 map: "the_wise"
1982 name: "Entry"
1983 }
1984 }
1985 oneway: true
1986}
1987connections {
1988 from {
1989 painting {
1990 map: "the_gallery"
1991 room: "Main Area"
1992 name: "WISE"
1993 }
1994 }
1995 to {
1996 room {
1997 map: "the_wise"
1998 name: "Entry"
1999 }
2000 }
2001 oneway: true
2002}
2003connections {
2004 from {
2005 painting {
2006 map: "the_liberated"
2007 room: "Painting Room"
2008 name: "PYRAMID"
2009 }
2010 }
2011 to {
2012 room {
2013 map: "the_wise"
2014 name: "Entry"
2015 }
2016 }
2017 oneway: true
2018}
2019connections {
2020 from {
2021 painting {
2022 map: "the_literate"
2023 room: "Painting Room"
2024 name: "PYRAMID"
2025 }
2026 }
2027 to {
2028 room {
2029 map: "the_wise"
2030 name: "Entry"
2031 }
2032 }
2033 oneway: true
2034}
2035connections {
2036 from {
2037 painting {
2038 map: "the_wise"
2039 room: "Entry"
2040 name: "TRIANGLE"
2041 }
2042 }
2043 to {
2044 room {
2045 map: "the_gallery"
2046 name: "Main Area"
2047 }
2048 }
2049 oneway: true
2050}
2051connections {
2052 from {
2053 room {
2054 map: "the_wondrous"
2055 name: "Huge"
2056 }
2057 }
2058 to {
2059 room {
2060 map: "the_door"
2061 name: "Main Area"
2062 }
2063 }
2064 door {
2065 map: "the_wondrous"
2066 name: "Big Door"
2067 }
2068 oneway: true
2069}
2070connections {
2071 from {
2072 painting {
2073 map: "the_gallery"
2074 room: "Main Area"
2075 name: "WONDROUS"
2076 }
2077 }
2078 to {
2079 room {
2080 map: "the_wondrous"
2081 name: "Huge"
2082 }
2083 }
2084 oneway: true
2085}
2086connections {
2087 from {
2088 port {
2089 map: "daedalus"
2090 room: "Wonderland"
2091 name: "WONDROUS"
2092 }
2093 }
2094 to {
2095 port {
2096 map: "the_wondrous"
2097 room: "Entry"
2098 name: "DAEDALUS"
2099 }
2100 }
2101}
2102connections {
2103 from {
2104 panel {
2105 map: "the_entry"
2106 room: "Starting Room"
2107 name: "HI"
2108 answer: "thewords"
2109 }
2110 }
2111 to {
2112 room {
2113 map: "the_words"
2114 name: "Main Area"
2115 }
2116 }
2117 oneway: true
2118}
2119connections {
2120 from {
2121 port {
2122 map: "the_words"
2123 room: "Main Area"
2124 name: "ENTRY"
2125 }
2126 }
2127 to {
2128 room {
2129 map: "the_entry"
2130 name: "Starting Room"
2131 }
2132 }
2133 oneway: true
2134}
2135connections {
2136 from {
2137 painting {
2138 map: "the_gallery"
2139 room: "Main Area"
2140 name: "WORDS"
2141 }
2142 }
2143 to {
2144 room {
2145 map: "the_words"
2146 name: "Main Area"
2147 }
2148 }
2149 oneway: true
2150}
2151connections {
2152 from {
2153 room {
2154 map: "control_center"
2155 name: "Main Area"
2156 }
2157 }
2158 to {
2159 room {
2160 map: "the_relentless"
2161 name: "Turn Room"
2162 }
2163 }
2164 door {
2165 map: "control_center"
2166 name: "Relentless Turn Door"
2167 }
2168}
2169connections {
2170 from {
2171 room {
2172 map: "control_center"
2173 name: "Main Area"
2174 }
2175 }
2176 to {
2177 room {
2178 map: "the_relentless"
2179 name: "Shop Room"
2180 }
2181 }
2182 door {
2183 map: "control_center"
2184 name: "Relentless Shop Door"
2185 }
2186}
2187connections {
2188 from {
2189 room {
2190 map: "control_center"
2191 name: "Main Area"
2192 }
2193 }
2194 to {
2195 room {
2196 map: "the_relentless"
2197 name: "Left Room"
2198 }
2199 }
2200 door {
2201 map: "control_center"
2202 name: "Relentless Left Door"
2203 }
2204}
2205connections {
2206 from {
2207 port {
2208 map: "control_center"
2209 room: "Ancient Entrance"
2210 name: "ANCIENT"
2211 }
2212 }
2213 to {
2214 room {
2215 map: "the_ancient"
2216 name: "Outside"
2217 }
2218 }
2219 oneway: true
2220}
2221connections {
2222 from {
2223 port {
2224 map: "the_between"
2225 room: "Control Center Side"
2226 name: "CC"
2227 }
2228 }
2229 to {
2230 port {
2231 map: "control_center"
2232 room: "Between Entrance"
2233 name: "BETWEEN"
2234 }
2235 }
2236}
2237connections {
2238 from {
2239 painting {
2240 map: "the_gallery"
2241 room: "Main Area"
2242 name: "CC"
2243 }
2244 }
2245 to {
2246 room {
2247 map: "control_center"
2248 name: "Desert Room"
2249 }
2250 }
2251 oneway: true
2252}
2253connections {
2254 from {
2255 port {
2256 map: "the_great"
2257 room: "West Side"
2258 name: "CC"
2259 }
2260 }
2261 to {
2262 port {
2263 map: "control_center"
2264 room: "Entry"
2265 name: "GREAT"
2266 }
2267 }
2268}
2269connections {
2270 from {
2271 port {
2272 map: "the_hinterlands"
2273 room: "Main Area"
2274 name: "LEFT"
2275 }
2276 }
2277 to {
2278 port {
2279 map: "control_center"
2280 room: "Main Area"
2281 name: "LEFT"
2282 }
2283 }
2284}
2285connections {
2286 from {
2287 port {
2288 map: "the_hinterlands"
2289 room: "Main Area"
2290 name: "RIGHT"
2291 }
2292 }
2293 to {
2294 port {
2295 map: "control_center"
2296 room: "Main Area"
2297 name: "RIGHT"
2298 }
2299 }
2300}
2301connections {
2302 from {
2303 port {
2304 map: "the_partial"
2305 room: "Control Center Entrance"
2306 name: "CC"
2307 }
2308 }
2309 to {
2310 port {
2311 map: "control_center"
2312 room: "Partial Entrance"
2313 name: "PARTIAL"
2314 }
2315 }
2316}
2317connections {
2318 from {
2319 port {
2320 map: "the_perceptive"
2321 room: "Main Area"
2322 name: "CC"
2323 }
2324 }
2325 to {
2326 port {
2327 map: "control_center"
2328 room: "Perceptive Entrance"
2329 name: "PERCEPTIVE"
2330 }
2331 }
2332}
2333connections {
2334 from {
2335 port {
2336 map: "the_repetitive"
2337 room: "Main Room"
2338 name: "CC"
2339 }
2340 }
2341 to {
2342 port {
2343 map: "control_center"
2344 room: "Repetitive Entrance"
2345 name: "REPETITIVE"
2346 }
2347 }
2348}
2349connections {
2350 from {
2351 room {
2352 map: "the_shop"
2353 name: "Main Area"
2354 }
2355 }
2356 to {
2357 room {
2358 map: "control_center"
2359 name: "Shop Entrance"
2360 }
2361 }
2362 door {
2363 map: "the_shop"
2364 name: "N Entered"
2365 }
2366 oneway: true
2367}
2368connections {
2369 from {
2370 room {
2371 map: "control_center"
2372 name: "Shop Entrance"
2373 }
2374 }
2375 to {
2376 room {
2377 map: "the_shop"
2378 name: "Main Area"
2379 }
2380 }
2381 oneway: true
2382}
2383connections {
2384 from {
2385 panel {
2386 map: "the_unyielding"
2387 room: "Central Connected Area"
2388 name: "BACK"
2389 }
2390 }
2391 to {
2392 panel {
2393 map: "control_center"
2394 room: "Unyielding Entrance"
2395 name: "FORTH"
2396 }
2397 }
2398}
2399connections {
2400 from {
2401 port {
2402 map: "the_tenacious"
2403 room: "Control Center Entrance"
2404 name: "CC"
2405 }
2406 }
2407 to {
2408 port {
2409 map: "control_center"
2410 room: "Tenacious Entrance"
2411 name: "TENACIOUS"
2412 }
2413 }
2414}
2415connections {
2416 from {
2417 port {
2418 map: "the_unkempt"
2419 room: "Control Center Entrance"
2420 name: "CC"
2421 }
2422 }
2423 to {
2424 port {
2425 map: "control_center"
2426 room: "Unkempt Entrance"
2427 name: "UNKEMPT"
2428 }
2429 }
2430}
2431connections {
2432 from {
2433 panel {
2434 map: "control_center"
2435 room: "Stormy Entrance"
2436 name: "TURN"
2437 }
2438 }
2439 to {
2440 room {
2441 map: "the_stormy"
2442 name: "Center"
2443 }
2444 }
2445 oneway: true
2446}
2447connections {
2448 from {
2449 port {
2450 map: "the_entry"
2451 room: "X Area"
2452 name: "CC"
2453 }
2454 }
2455 to {
2456 port {
2457 map: "control_center"
2458 room: "Entry Entrance"
2459 name: "ENTRY"
2460 }
2461 }
2462}
2463connections {
2464 from {
2465 painting {
2466 map: "the_entry"
2467 room: "Eye Room"
2468 name: "GALLERY"
2469 }
2470 }
2471 to {
2472 room {
2473 map: "the_gallery"
2474 name: "Main Area"
2475 }
2476 }
2477 oneway: true
2478}
2479connections {
2480 from {
2481 room {
2482 map: "the_sun_temple"
2483 name: "Temple"
2484 }
2485 }
2486 to {
2487 room {
2488 map: "the_graveyard"
2489 name: "Outside"
2490 }
2491 }
2492 oneway: true
2493}
2494connections {
2495 from {
2496 room {
2497 map: "daedalus"
2498 name: "Roof"
2499 }
2500 }
2501 to {
2502 port {
2503 map: "icarus"
2504 room: "Welcome Spine (Obverse)"
2505 name: "WORLDPORT"
2506 }
2507 }
2508}
2509connections {
2510 from {
2511 panel {
2512 map: "the_entry"
2513 room: "Starting Room"
2514 name: "Gift Maps"
2515 answer: "icely"
2516 }
2517 }
2518 to {
2519 room {
2520 map: "the_advanced"
2521 name: "Main Area"
2522 }
2523 }
2524 oneway: true
2525}
2526connections {
2527 from {
2528 port {
2529 map: "the_advanced"
2530 room: "Main Area"
2531 name: "WORLDPORT"
2532 }
2533 }
2534 to {
2535 room {
2536 map: "the_entry"
2537 name: "Starting Room"
2538 }
2539 }
2540 oneway: true
2541}
2542connections {
2543 from {
2544 panel {
2545 map: "the_entry"
2546 room: "Starting Room"
2547 name: "Gift Maps"
2548 answer: "souvey"
2549 }
2550 }
2551 to {
2552 room {
2553 map: "the_charismatic"
2554 name: "Main Area"
2555 }
2556 }
2557 oneway: true
2558}
2559connections {
2560 from {
2561 port {
2562 map: "the_charismatic"
2563 room: "Main Area"
2564 name: "WORLDPORT"
2565 }
2566 }
2567 to {
2568 room {
2569 map: "the_entry"
2570 name: "Starting Room"
2571 }
2572 }
2573 oneway: true
2574}
2575connections {
2576 from {
2577 panel {
2578 map: "the_entry"
2579 room: "Starting Room"
2580 name: "Gift Maps"
2581 answer: "q"
2582 }
2583 }
2584 to {
2585 room {
2586 map: "the_crystalline"
2587 name: "Main Area"
2588 }
2589 }
2590 oneway: true
2591}
2592connections {
2593 from {
2594 port {
2595 map: "the_crystalline"
2596 room: "Main Area"
2597 name: "WORLDPORT"
2598 }
2599 }
2600 to {
2601 room {
2602 map: "the_entry"
2603 name: "Starting Room"
2604 }
2605 }
2606 oneway: true
2607}
2608connections {
2609 # Possibly the most cursed connection in the entire game.
2610 from {
2611 room {
2612 map: "the_crystalline"
2613 name: "Flip Area"
2614 }
2615 }
2616 to {
2617 room {
2618 map: "icarus"
2619 name: "Welcome Spine (Obverse)"
2620 }
2621 }
2622 oneway: true
2623}
2624connections {
2625 from {
2626 panel {
2627 map: "the_entry"
2628 room: "Starting Room"
2629 name: "Gift Maps"
2630 answer: "hatkirby"
2631 }
2632 }
2633 to {
2634 room {
2635 map: "the_stellar"
2636 name: "Starting Room"
2637 }
2638 }
2639 oneway: true
2640}
2641connections {
2642 from {
2643 panel {
2644 map: "the_entry"
2645 room: "Starting Room"
2646 name: "Gift Maps"
2647 answer: "kirby"
2648 }
2649 }
2650 to {
2651 room {
2652 map: "the_stellar"
2653 name: "Starting Room"
2654 }
2655 }
2656 oneway: true
2657}
2658connections {
2659 from {
2660 panel {
2661 map: "the_entry"
2662 room: "Starting Room"
2663 name: "Gift Maps"
2664 answer: "star"
2665 }
2666 }
2667 to {
2668 room {
2669 map: "the_stellar"
2670 name: "Starting Room"
2671 }
2672 }
2673 oneway: true
2674}
2675connections {
2676 from {
2677 port {
2678 map: "the_stellar"
2679 room: "Starting Room"
2680 name: "WORLDPORT"
2681 }
2682 }
2683 to {
2684 room {
2685 map: "the_entry"
2686 name: "Starting Room"
2687 }
2688 }
2689 oneway: true
2690}
2691connections {
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}
2708connections {
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}
2725connections {
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/door_groups.txtpb b/data/door_groups.txtpb new file mode 100644 index 0000000..fab75f5 --- /dev/null +++ b/data/door_groups.txtpb
@@ -0,0 +1,171 @@
1door_groups {
2 name: "The Entry - Repetitive Entrance"
3 # This *should* be a CONNECTOR, but currently we're not shuffling these
4 # entrances because we want to guarantee that there's a way to The Repetitive
5 # without missing keys in vanilla doors. Hopefully can be changed eventually.
6 type: SHUFFLE_GROUP
7 doors {
8 map: "the_entry"
9 name: "Starting Room West Wall North Door"
10 }
11 doors {
12 map: "the_repetitive"
13 name: "Entry Entrance"
14 }
15}
16door_groups {
17 name: "The Repetitive - Plaza Entrance"
18 type: CONNECTOR
19 doors {
20 map: "the_repetitive"
21 name: "Black Hallway"
22 }
23 doors {
24 map: "the_plaza"
25 name: "Repetitive Entrance"
26 }
27}
28door_groups {
29 name: "Control Center White Doors"
30 type: COLOR_CONNECTOR
31 doors {
32 map: "daedalus"
33 name: "White Hallway From Entry"
34 }
35 doors {
36 map: "the_entry"
37 name: "Control Center White Door"
38 }
39}
40door_groups {
41 name: "Control Center Purple Doors"
42 type: COLOR_CONNECTOR
43 doors {
44 map: "daedalus"
45 name: "Purple Hallway From Great"
46 }
47 doors {
48 map: "the_great"
49 name: "Control Center Purple Door"
50 }
51}
52door_groups {
53 name: "Control Center Orange Doors"
54 type: COLOR_CONNECTOR
55 doors {
56 map: "daedalus"
57 name: "Control Center Orange Door"
58 }
59 doors {
60 map: "the_unkempt"
61 name: "Control Center Orange Door"
62 }
63}
64door_groups {
65 name: "Control Center Brown Doors"
66 type: COLOR_CONNECTOR
67 doors {
68 map: "the_bearer"
69 name: "Control Center Brown Door"
70 }
71 doors {
72 map: "the_tree"
73 name: "Control Center Brown Door"
74 }
75}
76door_groups {
77 name: "Control Center Blue Doors"
78 type: COLOR_CONNECTOR
79 doors {
80 map: "the_digital"
81 name: "Control Center Blue Door"
82 }
83 doors {
84 map: "the_unyielding"
85 name: "Digital Entrance"
86 }
87}
88door_groups {
89 name: "Cyan Doors"
90 type: CYAN_DOORS
91 doors {
92 map: "daedalus"
93 name: "Eye Painting"
94 }
95 doors {
96 map: "the_bearer"
97 name: "Butterfly Entrance"
98 }
99 doors {
100 map: "the_darkroom"
101 name: "Double Letter Panel Blockers"
102 }
103 doors {
104 map: "the_entry"
105 name: "Starting Room West Wall North Door"
106 }
107 doors {
108 map: "the_entry"
109 name: "Flipped Pyramid Area Entrance"
110 }
111 doors {
112 map: "the_entry"
113 name: "Gift Maps Entrance"
114 }
115 doors {
116 map: "the_entry"
117 name: "Near D Room Painting"
118 }
119 doors {
120 map: "the_graveyard"
121 name: "Double Letters"
122 }
123 doors {
124 map: "the_great"
125 name: "Tower Entrance"
126 }
127 doors {
128 map: "the_great"
129 name: "Cyan Doors"
130 }
131 doors {
132 map: "the_owl"
133 name: "Double Letters"
134 }
135 doors {
136 map: "the_parthenon"
137 name: "Double Letters"
138 }
139 doors {
140 map: "the_unkempt"
141 name: "Cyan Doors"
142 }
143 doors {
144 map: "the_unkempt"
145 name: "Control Center Orange Door"
146 }
147 doors {
148 map: "the_unyielding"
149 name: "Cyan Doors"
150 }
151}
152door_groups {
153 name: "Lavender Cubes"
154 type: SHUFFLE_GROUP
155 doors {
156 map: "daedalus"
157 name: "C Keyholder Blocker"
158 }
159 doors {
160 map: "the_congruent"
161 name: "T Keyholder Blocker"
162 }
163 doors {
164 map: "the_great"
165 name: "Lavender Cube"
166 }
167 doors {
168 map: "the_parthenon"
169 name: "Lavender Cubes"
170 }
171}
diff --git a/data/ids.yaml b/data/ids.yaml index 3083e5b..0042899 100644 --- a/data/ids.yaml +++ b/data/ids.yaml
@@ -1,4 +1,1311 @@
1maps: 1maps:
2 control_center:
3 rooms:
4 Between Entrance:
5 panels:
6 RIGHT: 2721
7 ports:
8 BETWEEN: 3106
9 Desert Room:
10 panels:
11 LESS: 2722
12 Entry:
13 panels:
14 HELLO: 2724
15 ports:
16 GREAT: 3108
17 Entry Entrance:
18 panels:
19 ENTRY: 2723
20 ports:
21 ENTRY: 3107
22 Hide Room:
23 panels:
24 HIDE: 2725
25 Main Area:
26 panels:
27 COLOR: 2726
28 Letters: 2727
29 keyholders:
30 1: 2760
31 2: 2761
32 3: 2762
33 4: 2763
34 ports:
35 LEFT: 3110
36 RIGHT: 3109
37 Partial Entrance:
38 panels:
39 PARTIAL: 2729
40 ports:
41 PARTIAL: 3111
42 Perceptive Entrance:
43 panels:
44 COLORS: 2731
45 PART: 2730
46 ports:
47 PERCEPTIVE: 3112
48 Repetitive Entrance:
49 ports:
50 REPETITIVE: 3113
51 Shop Entrance:
52 panels:
53 HOPS: 2732
54 Stormy Entrance:
55 panels:
56 TURN: 2733
57 Tenacious Entrance:
58 panels:
59 HERO: 2734
60 ports:
61 TENACIOUS: 3114
62 Unkempt Entrance:
63 panels:
64 RETURN: 2735
65 ports:
66 UNKEMPT: 3115
67 Unyielding Entrance:
68 panels:
69 FORTH: 2736
70 SEEK: 2737
71 doors:
72 Ancient Entrance: 2715
73 Between Door: 2716
74 Desert Door: 2717
75 Front Door: 2709
76 Hidden Door: 2840
77 Letters Panel: 3285
78 Near Perceptive Panel: 3284
79 Partial Door: 2713
80 Perceptive From Inside: 2842
81 Perceptive From Outside: 2841
82 Repetitive Entrance: 2714
83 Shop Door: 2718
84 Stormy Entrance: 2710
85 Tenacious Door: 2719
86 Unkempt Door: 2712
87 Unyielding Door: 2720
88 X1 Door: 2711
89 daedalus:
90 rooms:
91 After Bee Room:
92 panels:
93 GAS: 1601
94 ROOM: 1602
95 SINGLED: 1603
96 Amber North 2:
97 panels:
98 SONG: 1604
99 Bee Room Obverse:
100 panels:
101 BLINDER: 1606
102 BLUR: 1608
103 CINDER: 1610
104 FRINGE: 1609
105 FUMBLE: 1611
106 LATCH: 1612
107 SINGLE: 1605
108 SURE: 1607
109 Bee Room Reverse:
110 panels:
111 COUNCIL: 1620
112 FLUME: 1614
113 HEALED: 1615
114 MINORITY: 1617
115 PLANTS: 1619
116 POCKET: 1613
117 SCRATCH: 1616
118 STYLINGS: 1618
119 Beehalls Intersection:
120 panels:
121 CLOUDS: 1621
122 Black Hex:
123 panels:
124 BARK: 1628
125 CLUES: 1626
126 HIDE: 1622
127 MAZE: 1625
128 ORDER: 1623
129 SECRET: 1627
130 TOWER: 1624
131 Blue Hallway:
132 panels:
133 CHOP: 1638
134 SHORT: 1639
135 Blue Hallway Cut Side:
136 panels:
137 CUT: 1629
138 GREEN: 1630
139 Blue Hallway Tall Side:
140 panels:
141 ALL WAY: 1633
142 CHILD: 1636
143 FOUR: 1634
144 NEW: 1637
145 OFFER: 1635
146 SHOO: 1632
147 TALL: 1631
148 Blue Room:
149 panels:
150 BULB: 1646
151 CELEBRATORY: 1649
152 DETECTIVE: 1650
153 MINT: 1648
154 PAPA: 1647
155 PEPPER: 1643
156 RANGE: 1642
157 RED: 1640
158 SALT: 1645
159 TIME: 1644
160 WESTWARD: 1641
161 Blue Smiley:
162 panels:
163 SMILE: 1653
164 Blue Smiley Annex:
165 panels:
166 ORANGE (1): 1651
167 ORANGE (2): 1652
168 Book Room:
169 panels:
170 BOOK (1): 1654
171 BOOK (10): 1663
172 BOOK (11): 1664
173 BOOK (12): 1665
174 BOOK (2): 1655
175 BOOK (3): 1656
176 BOOK (4): 1657
177 BOOK (5): 1658
178 BOOK (6): 1659
179 BOOK (7): 1660
180 BOOK (8): 1661
181 BOOK (9): 1662
182 Bow Side:
183 panels:
184 "?": 1666
185 Brown Smiley:
186 panels:
187 OTHERS: 1667
188 C Keyholder:
189 keyholders:
190 C: 2755
191 Castle:
192 panels:
193 FIVE (Blue): 1673
194 FIVE (Green): 1678
195 FIVE (Hazel): 1688
196 FIVE (Maroon): 1683
197 FOUR (Blue): 1672
198 FOUR (Green): 1677
199 FOUR (Hazel): 1687
200 FOUR (Maroon): 1682
201 NUMBER (1): 1689
202 NUMBER (2): 1690
203 NUMBER (3): 1691
204 NUMBER (4): 1692
205 ONE (Blue): 1669
206 ONE (Green): 1674
207 ONE (Hazel): 1684
208 ONE (Maroon): 1679
209 REVERSE: 1668
210 THREE (Blue): 1670
211 THREE (Green): 1675
212 THREE (Hazel): 1685
213 THREE (Maroon): 1680
214 TWO (Blue): 1671
215 TWO (Green): 1676
216 TWO (Hazel): 1686
217 TWO (Maroon): 1681
218 Coin Tower:
219 panels:
220 RAIN: 1693
221 Composite Room NE:
222 panels:
223 <-: 1694
224 BIRDCALL: 1697
225 CORNERHOME: 1696
226 FEETHIM: 1702
227 FORCEYARD: 1698
228 LIEQUIZ: 1700
229 STARFALL: 1703
230 TEXTBOOK: 1695
231 TIREPOUND: 1699
232 WHITEOUT: 1701
233 Composite Room NW:
234 panels:
235 BEHOUSE: 1704
236 BRAKESTEADY: 1705
237 DEATHSHORT: 1706
238 FAIRWATER: 1712
239 FOGIRON: 1710
240 HELLOTALE: 1715
241 LAIDIN: 1709
242 MOONSENT: 1711
243 OUTGARDEN: 1714
244 PLEADOUT: 1713
245 PLUMPFAMILY: 1707
246 SHEEPBOOK: 1708
247 Composite Room S:
248 panels:
249 AILAND: 1718
250 ANDBITE: 1720
251 ASHHIM: 1721
252 BANGER: 1724
253 BLEAKCARD: 1738
254 BOUGHTHIM: 1730
255 CONCAVE: 1716
256 FAIRYTHINK: 1717
257 FIREFOX: 1733
258 FRIENDPILOT: 1731
259 LEGIT: 1725
260 MISSIONMISSION: 1739
261 MUSCLEIN: 1728
262 OUTEAT: 1726
263 PLAYHOP: 1729
264 PRONOUNPRONOUNPRONOUN: 1722
265 RULERCAT: 1719
266 SKIMFARE: 1736
267 SPOUSEGARDEN: 1723
268 SPRINKLEDRIP: 1734
269 SUMMERIN: 1727
270 TICKETBORNE: 1737
271 TWOGOTHIM: 1735
272 UNDERPANTS: 1732
273 ports:
274 ENTRY: 3116
275 Computer Room:
276 panels:
277 KEYBOARD (1): 1746
278 KEYBOARD (2): 1750
279 MICROPHONE: 1742
280 MONITOR (1): 1741
281 MONITOR (2): 1747
282 MOUSE (1): 1745
283 MOUSE (2): 1749
284 PROCESSOR (1): 1744
285 PROCESSOR (2): 1748
286 SPEAKER: 1743
287 Computer Room Seal:
288 panels:
289 SCROLL: 1740
290 Cyan Room:
291 panels:
292 ACCLIMATE (1): 1755
293 ACCLIMATE (2): 1756
294 CLEAR: 1759
295 COLD: 1760
296 LIFE: 1751
297 METEOROID: 1758
298 P+EMIC: 1757
299 SKIRMISH: 1752
300 SUMMER: 1754
301 WORD: 1753
302 WORDWORD: 1761
303 D Keyholder:
304 keyholders:
305 D: 2759
306 Dark Light Exit:
307 panels:
308 GASKET: 1763
309 Dark Light Room:
310 panels:
311 COIN (1): 1764
312 COIN (2): 1774
313 DARK: 1769
314 DOG (1): 1765
315 DOG (2): 1773
316 HUMAN (1): 1767
317 HUMAN (2): 1771
318 ROSE (1): 1768
319 ROSE (2): 1770
320 SONG (1): 1766
321 SONG (2): 1772
322 Entry Shortcut:
323 panels:
324 WELCOME: 1776
325 ports:
326 ENTRY: 3117
327 Eye Painting:
328 panels:
329 REVILED: 1777
330 F Keyholder:
331 keyholders:
332 F: 2756
333 F2 Room:
334 panels:
335 CAST: 1782
336 CRAFT: 1781
337 DEADLY: 1789
338 DECAY: 1784
339 DIMS: 1790
340 DIRT: 1793
341 DULLS: 1779
342 GRAVE: 1792
343 GRIME: 1780
344 LETHAL: 1791
345 MAKE: 1785
346 RISKY: 1794
347 SHAPE: 1788
348 TRASH: 1787
349 WANES: 1783
350 WEAKENS: 1786
351 Flip Painting Hidden Panel:
352 panels:
353 HIDDEN: 1795
354 Globe Room:
355 panels:
356 BONE: 1800
357 HIDDEN: 1797
358 NORTH: 1796
359 TICK: 1798
360 TONE: 1799
361 WORD: 1801
362 Godot Room:
363 panels:
364 AIRPLANE: 1807
365 AUDIO: 1806
366 IDEA: 1808
367 MANIPULATE: 1805
368 ME: 1803
369 MOTORCYCLE: 1802
370 PAWN: 1804
371 RECORDING: 1810
372 TRAIN: 1809
373 Gray Color Backside:
374 panels:
375 BEGINNING: 1812
376 FOREWARD: 1813
377 GO: 1814
378 LAST: 1815
379 ORANGE: 1811
380 RISE: 1816
381 Gray Color Door:
382 panels:
383 PATCH: 1817
384 Green Color Door:
385 panels:
386 COMELY: 1821
387 OLD (1): 1818
388 OLD (2): 1820
389 SLEEPY: 1819
390 Green Room:
391 panels:
392 BADMINTON: 1832
393 BLAND: 1826
394 DOUBLE: 1831
395 FIXATE: 1828
396 MAILBOX: 1823
397 MILKY: 1824
398 RICE: 1830
399 TAN: 1825
400 THAT: 1829
401 TIMESCALE: 1822
402 WATERCOOLER: 1827
403 Green Smiley:
404 panels:
405 SMILE: 1833
406 Hedges:
407 panels:
408 DOWN: 1840
409 IN: 1836
410 JUMP: 1839
411 ORDER: 1837
412 SMILE: 1843
413 SOLVE: 1834
414 THE: 1842
415 THEN: 1838
416 TOWER: 1841
417 US: 1835
418 Hotel:
419 panels:
420 ART: 1882
421 BALL: 1880
422 BATHING: 1855
423 BEAUTIFUL: 1873
424 BLAZER: 1848
425 BOXING: 1860
426 BRUCE: 1853
427 BUSINESS: 1856
428 CANVAS: 1877
429 CARD: 1894
430 CHOCOLATE: 1863
431 CLAWS: 1889
432 CLOAK: 1885
433 CRESCENT: 1872
434 DEPART: 1896
435 DOROTHY: 1886
436 DROOPED: 1874
437 EVER: 1906
438 EVIL: 1871
439 FADED: 1875
440 FESTIVAL: 1901
441 FLOUNDER: 1852
442 FOOL: 1881
443 FOOT: 1883
444 FULL: 1870
445 HONEY: 1899
446 INVALID: 1900
447 JACKET: 1850
448 JAWS: 1887
449 JUST: 1867
450 LAW: 1893
451 LEAVE: 1897
452 LEVER: 1878
453 MANE: 1846
454 MARLIN: 1844
455 MICRO: 1891
456 NEW: 1868
457 PAIN: 1907
458 PALE: 1866
459 PARKA: 1884
460 POKER: 1862
461 POTATO: 1890
462 QUIT: 1865
463 RAGE: 1904
464 RIVER: 1859
465 ROAD: 1895
466 SALAD: 1854
467 SCULPTURE: 1879
468 SERVICE: 1898
469 TAIL: 1851
470 TALL: 1876
471 TELEPHONE: 1861
472 TREE: 1858
473 TUNING: 1892
474 UNTALENTED: 1869
475 VERGE: 1905
476 WANED: 1903
477 WEDDING: 1857
478 WHAT: 1847
479 WHEN: 1888
480 WHERE: 1849
481 WHO: 1845
482 WILTED: 1902
483 WITHDRAW: 1864
484 House:
485 panels:
486 AMAZE: 1910
487 GOAT: 1909
488 SKINNYHIM: 1911
489 THEO: 1912
490 House Entrance:
491 panels:
492 ADULT: 1908
493 Intense Room:
494 panels:
495 BRILLIANT: 1914
496 COLOSSAL: 1917
497 DELICIOUS: 1922
498 HORRIBLE: 1915
499 INSTANTLY: 1916
500 RUN: 1918
501 SHATTER: 1921
502 SLEEP: 1919
503 TOSS: 1920
504 J2 Vestibule:
505 panels:
506 COLORFUL: 1924
507 Magic Room:
508 panels:
509 1: 1925
510 2: 1926
511 3: 1927
512 4: 1928
513 Maze Paintings Area:
514 panels:
515 Paintings: 1929
516 Moat:
517 ports:
518 HIVE: 3118
519 North Castle Area:
520 panels:
521 A: 1930
522 A SUMMER PLACE: 1933
523 PLACE: 1932
524 SUMMER: 1931
525 Number Paintings Area:
526 panels:
527 GOING: 1934
528 TURN: 1935
529 keyholders:
530 G: 2757
531 Nursery:
532 panels:
533 "?": 1937
534 Paintings: 1936
535 O2 Room:
536 panels:
537 ACCEPT: 1951
538 AJAR: 1943
539 BOND: 1949
540 FOLLOW: 1954
541 HEED: 1944
542 HERALD: 1945
543 HONEST: 1947
544 LISTEN: 1939
545 PLEDGE: 1953
546 PROMISE: 1941
547 PROPHECY: 1948
548 SIGN: 1942
549 UNBLOCKED: 1950
550 UNLOCK: 1940
551 VOW: 1946
552 WARNING: 1952
553 Orange Room:
554 panels:
555 BARE: 1958
556 COAL: 1963
557 ENTER: 1956
558 FORTE: 1960
559 FRANCE: 1955
560 MILKS: 1961
561 OWED: 1964
562 PORT: 1959
563 TURN: 1957
564 VINE: 1962
565 Outside Book Room:
566 panels:
567 TEAL: 1965
568 Outside Eye Temple:
569 panels:
570 Entrance: 1966
571 Outside Hedges:
572 panels:
573 BARK: 1973
574 BUD: 1974
575 GOURD (1): 1967
576 GOURD (2): 1968
577 GOURD (3): 1969
578 GOURD (4): 1970
579 LEAF: 1975
580 PETAL: 1976
581 PLUM (1): 1971
582 PLUM (2): 1972
583 ports:
584 REVITALIZED: 3119
585 Outside Hotel:
586 panels:
587 COLORFUL: 1977
588 Outside House:
589 panels:
590 A: 1985
591 BLITHELY: 1984
592 DOTE: 1980
593 LOCK: 1987
594 RIGHT: 1982
595 SILENCE: 1983
596 VIVID: 1981
597 WALLS: 1986
598 WHISPER: 1978
599 WING: 1979
600 keyholders:
601 H: 2758
602 Outside Magic Room:
603 panels:
604 WIZARD: 1988
605 Outside Orange Room:
606 panels:
607 FALL: 1992
608 KNOT: 1993
609 OWL: 1996
610 SLOT: 1994
611 SMILE: 1989
612 VAN: 1990
613 WAND: 1995
614 WERE: 1991
615 Outside Pyramid:
616 panels:
617 AMID: 1998
618 PEER: 1997
619 Outside Red Room:
620 panels:
621 ROCK: 1999
622 Outside Salt Room:
623 panels:
624 Colors: 2000
625 Outside Snake Room:
626 panels:
627 ACE: 2002
628 ANIMAL: 2007
629 ANSWERS: 2006
630 DEE SIX: 2005
631 ONES: 2008
632 SONG (North): 2004
633 SONG (South): 2003
634 TONGUE: 2001
635 Pains Room:
636 panels:
637 MOO: 2009
638 Pepper Room:
639 panels:
640 SEASONING: 2010
641 Plum Room:
642 panels:
643 CENTER: 2017
644 DEMURRED: 2014
645 FOUROFFERBEAR: 2015
646 GOD: 2011
647 HEALTHY: 2013
648 INJURED: 2012
649 SNAKE: 2016
650 Pumpkin Entrance:
651 panels:
652 JACK: 2018
653 Pumpkin Room:
654 panels:
655 BEASTS: 2023
656 BONE: 2019
657 CACKLE: 2025
658 EMPIRE: 2022
659 HUMAN: 2026
660 JAGUAR: 2027
661 PHARAOH: 2021
662 SHEET: 2020
663 STRAW: 2024
664 Purple Hallway From Great:
665 ports:
666 GREAT: 3120
667 Purple NW Vestibule:
668 panels:
669 LOSE: 2029
670 MESSAGES: 2028
671 SNOWMAN: 2030
672 Purple Room:
673 panels:
674 ALLOW: 2039
675 APATHY: 2043
676 APE: 2042
677 BIRD: 2040
678 CORE: 2037
679 FISH: 2038
680 HOIST: 2036
681 HONK: 2041
682 Purple Room South:
683 panels:
684 ANY: 2034
685 FAREWELL: 2032
686 LAMB: 2033
687 LITTLE: 2031
688 THESE: 2035
689 Purple SE Vestibule:
690 panels:
691 ROADS: 2045
692 RUN: 2044
693 Purple SW Vestibule:
694 panels:
695 INSCRIBE: 2048
696 LETTERS: 2047
697 Purple Smiley:
698 panels:
699 SMILE: 2046
700 Pyramid 3:
701 panels:
702 VEHICLE: 2049
703 Pyramid 4:
704 panels:
705 CAT: 2050
706 Pyramid 5:
707 panels:
708 ROYAL: 2051
709 Pyramid 6:
710 panels:
711 TEA: 2052
712 Pyramid 7:
713 panels:
714 ARTIST: 2053
715 Pyramid 8:
716 panels:
717 INSTRUMENT: 2054
718 Pyramid Entry:
719 panels:
720 SHAPE: 2056
721 TREE: 2055
722 Pyramid Second Floor:
723 panels:
724 BEVERAGE: 2062
725 DIAMOND: 2060
726 INSTRUMENT: 2061
727 ORGAN: 2059
728 SODA: 2058
729 TOOL: 2057
730 Quiet Entrance:
731 panels:
732 HIDDEN: 2064
733 ports:
734 QUIET: 3121
735 Rain Side:
736 panels:
737 "?": 2065
738 ports:
739 BEARER: 3122
740 Rainbow Blue:
741 panels:
742 THEME: 2066
743 Rainbow Color Backside:
744 panels:
745 "?": 2068
746 BACKSIDE: 2067
747 Rainbow Color Doors:
748 panels:
749 CASUAL: 2078
750 CROW: 2069
751 DIRECTION (1): 2070
752 DIRECTION (2): 2071
753 DIRECTION (3): 2072
754 HOURS: 2076
755 INWALK: 2073
756 MISCHIEF: 2077
757 PUMP: 2079
758 PURCHASE: 2075
759 RAIN: 2074
760 Rainbow Cyan:
761 panels:
762 THEME: 2080
763 Rainbow End:
764 panels:
765 POT: 2081
766 Rainbow Green:
767 panels:
768 THEME: 2082
769 Rainbow Orange:
770 panels:
771 THEME: 2083
772 Rainbow Purple:
773 panels:
774 THEME: 2084
775 Rainbow Red:
776 panels:
777 THEME: 2085
778 Rainbow Start:
779 panels:
780 PAINTING: 2086
781 Rainbow Yellow:
782 panels:
783 THEME: 2087
784 Red Color Door:
785 panels:
786 ASH: 2096
787 BACKSIDE: 2092
788 Back (1): 2089
789 Back (2): 2090
790 Colors: 2097
791 FIR: 2095
792 Near Obscured Puzzles: 2088
793 OAK: 2093
794 PINE: 2094
795 WALK BACK: 2091
796 Red Room:
797 panels:
798 BLINDING: 2098
799 CHAIN: 2100
800 ELEGANCE: 2106
801 FLOWER: 2101
802 LOSER: 2103
803 MONTH: 2099
804 OVERCHARGE: 2102
805 PAD: 2104
806 RISE: 2105
807 TAKEOUT: 2108
808 TESTAMENT: 2107
809 Red Smiley:
810 panels:
811 SMILE: 2109
812 Roof:
813 panels:
814 "?": 2110
815 Salt Room:
816 panels:
817 SEASONING: 2111
818 Seasoning Room:
819 panels:
820 PARITY: 2112
821 Snake Room:
822 panels:
823 BARK: 2116
824 BUZZ: 2115
825 HISS: 2113
826 SQUEAK: 2114
827 South Castle Area:
828 panels:
829 AN: 2117
830 AN OFFER VILLAGE BEFORE LAIR: 2122
831 BEFORE: 2120
832 COLOR (1): 2123
833 COLOR (2): 2124
834 COLOR (3): 2125
835 COLOR (4): 2126
836 LAIR: 2121
837 OFFER: 2118
838 VILLAGE: 2119
839 Starting Room:
840 panels:
841 ENTRANCE: 2127
842 ports:
843 GREAT: 3123
844 Sweet Foyer:
845 panels:
846 EQUAL: 2129
847 QUALITY: 2128
848 RENT (1): 2130
849 RENT (2): 2132
850 RENT (3): 2133
851 RENT (4): 2131
852 ports:
853 SWEET1: 3124
854 SWEET2: 3125
855 Tree Entrance:
856 panels:
857 DIFFERENCE: 2135
858 LEANS: 2136
859 QUESTION: 2137
860 RAT: 2134
861 SUNDER: 2139
862 WHERE: 2138
863 ports:
864 TREE: 3126
865 U2 Room:
866 panels:
867 CHAOS: 2147
868 DISCORD: 2144
869 DISORDER: 2146
870 DREAMSCAPE: 2141
871 EFFECTIVE: 2151
872 EVIL: 2145
873 HEAVEN: 2150
874 HELPFUL: 2152
875 INFERNAL: 2155
876 IRREVERENT: 2149
877 PARADISE: 2143
878 PRACTICAL: 2153
879 PRODUCTIVE: 2154
880 TROUBLE: 2148
881 WICKED: 2142
882 WONDERLAND: 2156
883 Unkempt Entrance:
884 ports:
885 UNKEMPT: 3127
886 Welcome Back Area:
887 panels:
888 FAREWELL LITTLE LAMB: 2157
889 GREETINGS OLD FRIEND: 2158
890 Welcome Back Exit:
891 panels:
892 WELCOME: 2159
893 West Castle Area:
894 panels:
895 ALL: 2171
896 AXES: 2173
897 CATHOLIC: 2177
898 CHAT: 2188
899 EACH: 2182
900 EVER: 2172
901 FACE: 2161
902 FALSIFY: 2170
903 FAME: 2191
904 FLIP (1): 2174
905 FLIP (2): 2186
906 HARMONY: 2169
907 LETTERS: 2164
908 LOST: 2189
909 MELODY: 2167
910 PODS: 2190
911 RANK: 2183
912 READ: 2180
913 RHYTHM: 2166
914 SHUT: 2185
915 SISTERLY: 2178
916 SKELETON: 2163
917 SLOT: 2175
918 SONG (1): 2160
919 SONG (2): 2165
920 SONG FACE: 2162
921 SQUEALED: 2179
922 STUN: 2187
923 TEAR: 2184
924 TEXTURE: 2168
925 WICKEDLY: 2176
926 WORD: 2181
927 West Spire:
928 panels:
929 BYE: 2193
930 CAW: 2197
931 CONCEALED: 2196
932 CUT: 2194
933 MISSING: 2192
934 STONES: 2195
935 White Hallway From Entry:
936 ports:
937 ENTRY: 3128
938 Wisdom Panel:
939 panels:
940 INTELLIGENCE: 2198
941 Wonderland:
942 panels:
943 ANGRY: 2201
944 APRIL: 2199
945 ARTS: 2202
946 SONG: 2203
947 UNDER: 2200
948 ports:
949 WONDROUS: 3129
950 Yellow Color Backside:
951 panels:
952 BRASS: 2206
953 REDACTED: 2274
954 STRINGS: 2205
955 WINDS: 2204
956 Yellow Color Door:
957 panels:
958 Paintings: 2210
959 SPIN: 2209
960 SUN: 2208
961 ports:
962 FOURROOMS: 3130
963 Yellow Room:
964 panels:
965 COLOR: 2217
966 EXPLODE: 2215
967 FREE: 2211
968 JAPAN: 2216
969 JAWBREAKER: 2214
970 PARROT: 2219
971 PERSON: 2218
972 PROTON: 2220
973 SPIRIT: 2221
974 TORSO BOUNCE: 2213
975 TORSOBOUNCE: 2212
976 Yellow Smiley Annex:
977 panels:
978 BELL: 2223
979 COW: 2222
980 Z2 Room:
981 panels:
982 AGREEMENT: 2237
983 CAPE: 2234
984 CAR: 2229
985 CAT: 2245
986 CHARGE: 2232
987 DISCORD: 2244
988 EAGLE: 2240
989 EQUINE: 2231
990 EXHIBIT: 2225
991 GLANCE: 2235
992 HORSE: 2228
993 INSECT: 2239
994 JAR: 2236
995 KEY: 2227
996 MAJESTIC: 2241
997 MICROSCOPE: 2226
998 MUST: 2233
999 POLICY: 2243
1000 RINGO: 2242
1001 SOLSTICE: 2230
1002 VOYAGE: 2238
1003 Zoo E:
1004 panels:
1005 CLAW: 2249
1006 FUR: 2250
1007 WHISKER: 2248
1008 WING: 2247
1009 Zoo N:
1010 panels:
1011 BILL: 2251
1012 BLOWHOLE: 2253
1013 FEATHER: 2254
1014 FIN: 2252
1015 LEAF: 2255
1016 Zoo NE:
1017 panels:
1018 Colors: 2260
1019 FANG: 2256
1020 HOOF: 2259
1021 STRIPE (1): 2257
1022 STRIPE (2): 2258
1023 Zoo S:
1024 panels:
1025 FIN: 2262
1026 PINCER: 2263
1027 SCALE: 2264
1028 SHELL: 2261
1029 doors:
1030 Amber East Doors: 1511
1031 Amber North Door: 1510
1032 Amber Room Panels: 3289
1033 Amber South Door: 1509
1034 Bee Room Back Door: 1523
1035 Bee Room Entrance: 1521
1036 Bee Room Obverse: 1524
1037 Bee Room Reverse: 1525
1038 Beehalls Panel: 1465
1039 Black Hexes Door: 1448
1040 Blue Color Backside: 1580
1041 Blue Color Doorway: 1579
1042 Blue Foyer Door: 1494
1043 Blue Hallway North Divider: 1564
1044 Blue Hallway South Divider: 1560
1045 Blue Rainbow Panel: 2270
1046 Blue Rainbow Room: 1538
1047 Blue Room: 1477
1048 Blue Room Entrance: 1476
1049 Blue Smiley Exit To Red: 1547
1050 Book Room Entrance: 1588
1051 Book Room Exit: 1592
1052 Bow Side Panel: 1545
1053 Brown Rainbow Room: 1541
1054 Castle Drawbridge: 1527
1055 Checkered Door: 1519
1056 Coin Tower Part 1: 1456
1057 Composite Room East Door: 1480
1058 Composite Room NE Entrance: 1479
1059 Composite Room NW Entrance: 1483
1060 Composite Room North Door: 1481
1061 Composite Room South Door: 1484
1062 Composite Room West Door: 1482
1063 Computer Room Back Door: 1587
1064 Computer Room Entrance: 1586
1065 Computer Room Exit: 1584
1066 Computer Room Interior Door: 1585
1067 Control Center Orange Door: 1486
1068 Cyan Rainbow Room: 1540
1069 Cyan Room: 1557
1070 Cyan Room Entrance: 1556
1071 Dark Light Room Divider: 1572
1072 Dark Light Room Entrance: 1569
1073 Dark Light Room Exit: 1570
1074 Dark Light Room Exit Panel: 1571
1075 Direction Panels: 3297
1076 Entry Shortcut Secret Exit: 1437
1077 Equality Panels: 3292
1078 Eye Painting: 2751
1079 Eye Painting Exit: 1446
1080 F Keyholder Door: 1551
1081 F2 Room Northwest Door: 1491
1082 F2 Room Southeast Door: 1487
1083 F2 Room Southwest Door: 1490
1084 F2 Room West Door: 1492
1085 Farewell Little Lamb Panels: 3302
1086 Flip Painting Blocker: 1552
1087 Globe Room East Door: 1589
1088 Globe Room South Door: 1591
1089 Globe Room West Door: 1590
1090 Godot Room Entrance: 1463
1091 Godot Room Exit: 1464
1092 Gourd Door: 1526
1093 Green Rainbow Panel: 2269
1094 Green Rainbow Room: 1537
1095 Green Room: 1559
1096 Green Room Entrance: 1558
1097 Green Smiley: 1549
1098 Hedges Entrance: 1508
1099 Hedges Tower: 1473
1100 Hotel Entrance: 1543
1101 Hotel First Floor: 1515
1102 Hotel Fourth Floor: 1518
1103 Hotel Second Floor: 1516
1104 Hotel Third Floor: 1517
1105 House Entrance: 1495
1106 House Side Door: 1566
1107 Intense Room Entrance: 1522
1108 Lime Hexes: 2810
1109 Magenta Hexes: 2272
1110 Magic Room Entrance: 1500
1111 Magic Room Panels: 1499
1112 Maze East Door: 1501
1113 Maze North Door: 1502
1114 Maze South Door: 1503
1115 Near Flip Painting Door: 1474
1116 Near H Keyholder Panel: 3299
1117 Near Pyramid Gate: 1447
1118 Near Sweet Blue Door: 1573
1119 Near Sweet Brown Door: 1561
1120 Near Yellow Room Door: 1565
1121 North Castle Panel: 2742
1122 Nursery Panels: 3298
1123 O2 Room Northeast Door: 1485
1124 O2 Room Southeast Door: 1478
1125 Orange Panels: 3293
1126 Orange Rainbow Panel: 2267
1127 Orange Rainbow Room: 1535
1128 Orange Room: 1507
1129 Orange Room Entrance: 1506
1130 Orange Smiley Exit: 1550
1131 Orchestra Room: 2273
1132 Pains Room Divider: 1512
1133 Pairs Room East Door: 1531
1134 Pairs Room North And South Doors: 1529
1135 Pairs Room West Door: 1530
1136 Pepper Room Entrance: 1542
1137 Pink Hallway: 1555
1138 Planet Room Divider: 1513
1139 Planet Room Secret Door: 1578
1140 Plum Panels: 3300
1141 Plum Room Entrance: 1576
1142 Plum Room Exit: 1577
1143 Pumpkin Door: 1583
1144 Pumpkin Room: 1582
1145 Pumpkin Room Interior: 1581
1146 Purple East Area North Door: 1468
1147 Purple East Area South Door: 1467
1148 Purple Hallway From Great: 1489
1149 Purple NE Vestibule: 1458
1150 Purple NW Vestibule: 1459
1151 Purple Rainbow Panel: 2271
1152 Purple Rainbow Room: 1539
1153 Purple Room: 2741
1154 Purple Room East Entrance: 1472
1155 Purple Room North Entrance: 1469
1156 Purple Room South Entrance: 1470
1157 Purple Room West Entrance: 1471
1158 Purple SE Vestibule: 1457
1159 Purple SW Vestibule: 1460
1160 Purple West Area North Door: 1461
1161 Purple West Area South Door: 1462
1162 Purple West Area West Door: 1466
1163 Pyramid Entrance: 1505
1164 Rain Side Panel: 1546
1165 Rainbow Color Backside Panels: 3286
1166 Rainbow Rooms Entrance: 1533
1167 Red Rainbow Panel: 2266
1168 Red Rainbow Room: 1534
1169 Red Room: 1563
1170 Red Room Entrance: 1562
1171 Red Smiley: 1554
1172 Red Smiley Entrance: 1553
1173 Rent Panels: 3291
1174 Roof Access: 1528
1175 Salt Room Entrance: 1532
1176 Seasoning Doors: 1544
1177 Snake Room Entrance: 1514
1178 South Castle Area Back Door: 1574
1179 South Castle Area Entrance: 1575
1180 South Castle Panel: 2744
1181 Southwest Area Intersection: 1475
1182 Splintering Area Panels: 3287
1183 Splintering Exit North Door: 1449
1184 Splintering Exit South Door: 1450
1185 Starting Room East Wall Center Door: 1439
1186 Starting Room East Wall North Door: 1440
1187 Starting Room North Wall Center Door: 1432
1188 Starting Room North Wall East Door: 1442
1189 Starting Room North Wall West Door: 1441
1190 Starting Room South Wall East Door: 1443
1191 Starting Room South Wall West Door: 1445
1192 Starting Room West Wall Center Door: 1436
1193 Starting Room West Wall North Door: 1438
1194 Starting Room West Wall South Door: 1433
1195 Sticks And Stones Door: 1593
1196 Teal Panel: 3296
1197 Temple of the Eyes Entrance: 1444
1198 Theo Panels: 2811
1199 Tree Panels: 3295
1200 U2 Room East Door: 1498
1201 U2 Room Southeast Door: 1493
1202 U2 Room Southwest Door: 1496
1203 U2 Room West Door: 1497
1204 Welcome Back Door: 1435
1205 Welcome Back Secret Door: 1434
1206 West Castle Panel: 2743
1207 West Spire Panel: 3294
1208 West Sticks And Stones Panel: 3288
1209 White Hallway From Entry: 1488
1210 Wonderland North Door: 1520
1211 Wonderland South Door: 1504
1212 Yellow Rainbow Panel: 2268
1213 Yellow Rainbow Room: 1536
1214 Yellow Roof Puzzles: 3290
1215 Yellow Room: 1568
1216 Yellow Room Entrance: 1567
1217 Yellow Smiley Annex Panels: 3301
1218 Yellow Smiley Door: 1548
1219 Z2 Room Back Exit: 1451
1220 Z2 Room Northeast Door: 1454
1221 Z2 Room Northwest Door: 1453
1222 Z2 Room Southeast Door: 1455
1223 Z2 Room Southwest Door: 1452
1224 Zoo East Entrance: 1595
1225 Zoo East Room: 1597
1226 Zoo North Entrance: 1600
1227 Zoo Northeast Room: 1598
1228 Zoo Prize Door: 1599
1229 Zoo South Entrance: 1596
1230 Zoo West Entrance: 1594
1231 demo:
1232 rooms:
1233 Backside Area:
1234 panels:
1235 BACKSIDE: 3049
1236 DOORWAYS: 3050
1237 ENDS (2): 3052
1238 SEE: 3051
1239 Castle:
1240 panels:
1241 G: 3054
1242 SERIES: 3053
1243 Center Building:
1244 panels:
1245 FUZZIES: 3056
1246 WORLD: 3055
1247 Flower Hallway:
1248 panels:
1249 LACES: 3057
1250 Main Area:
1251 panels:
1252 A: 3089
1253 AGES: 3063
1254 ANY: 3071
1255 ART: 3059
1256 Blank: 3095
1257 C: 3088
1258 CASTS: 3086
1259 CLOCKWISE: 3067
1260 COLORFUL: 3061
1261 COUNTER: 3070
1262 DAZES: 3084
1263 DEN: 3064
1264 DISCOVER: 3096
1265 E (1): 3091
1266 E (2): 3093
1267 END: 3079
1268 FAMILY: 3097
1269 GAZES: 3085
1270 HAZES: 3083
1271 HI: 3058
1272 HID: 3065
1273 MESS: 3066
1274 MIND: 3078
1275 N: 3092
1276 PACES: 3069
1277 POSSIBLE: 3068
1278 R: 3094
1279 RAD: 3080
1280 RODS: 3072
1281 S: 3087
1282 SECRETIVE: 3075
1283 STALK: 3082
1284 TALK: 3074
1285 TEES: 3060
1286 TOADS: 3076
1287 TON: 3077
1288 TOO: 3081
1289 TWO: 3073
1290 V: 3090
1291 WORD: 3062
1292 Mastery:
1293 masteries:
1294 MASTERY: 3098
1295 Tower:
1296 panels:
1297 ENDS (1): 3099
1298 doors:
1299 Castle: 3046
1300 Center Building: 3039
1301 Center Building Panels: 3041
1302 Flower Hallway: 3040
1303 Gold Door: 3048
1304 Orange Door: 3042
1305 Purple Door: 3043
1306 Red Door: 3045
1307 Scavenger Hunt: 3047
1308 Yellow Door: 3044
2 four_rooms: 1309 four_rooms:
3 rooms: 1310 rooms:
4 Examples Room: 1311 Examples Room:
@@ -11,6 +1318,8 @@ maps:
11 SONNET: 12 1318 SONNET: 12
12 SUPERLATIVE: 11 1319 SUPERLATIVE: 11
13 URN: 13 1320 URN: 13
1321 ports:
1322 DAEDALUS: 3131
14 Hallway: 1323 Hallway:
15 panels: 1324 panels:
16 HUNCHBACK: 16 1325 HUNCHBACK: 16
@@ -25,6 +1334,11 @@ maps:
25 SWAY: 24 1334 SWAY: 24
26 TERROR: 20 1335 TERROR: 20
27 TURN: 22 1336 TURN: 22
1337 ports:
1338 IMPRESSIVE: 3132
1339 Keyholder Room:
1340 keyholders:
1341 A: 2773
28 Synonyms Room: 1342 Synonyms Room:
29 panels: 1343 panels:
30 ADORE: 26 1344 ADORE: 26
@@ -35,6 +1349,8 @@ maps:
35 SERIOUS: 31 1349 SERIOUS: 31
36 SURPASS: 29 1350 SURPASS: 29
37 VERSE: 30 1351 VERSE: 30
1352 ports:
1353 ENTRY: 3133
38 Time Room: 1354 Time Room:
39 panels: 1355 panels:
40 BROODING: 33 1356 BROODING: 33
@@ -45,13 +1361,188 @@ maps:
45 RHYTHM: 40 1361 RHYTHM: 40
46 SUSPENSE: 36 1362 SUSPENSE: 36
47 WRITING: 38 1363 WRITING: 38
1364 ports:
1365 OWL: 3134
48 doors: 1366 doors:
49 A2 Door: 4 1367 A2 Door: 4
50 Examples Door: 1 1368 Examples Door: 1
51 Intensify Door: 0 1369 Intensify Door: 2739
52 Keyholder Door: 5 1370 Keyholder Door: 5
53 Synonyms Door: 2 1371 Synonyms Door: 2
54 Time Door: 3 1372 Time Door: 3
1373 icarus:
1374 rooms:
1375 Above Trans Rights:
1376 panels:
1377 ANT: 2877
1378 Big U:
1379 panels:
1380 COLONY: 2879
1381 DECK: 2878
1382 MANOR: 2880
1383 Fatherland:
1384 panels:
1385 FATHERLAND: 2881
1386 Highest Point:
1387 panels:
1388 DIAGNOSIS: 2882
1389 QUEEN: 2883
1390 Mastery:
1391 masteries:
1392 MASTERY: 2994
1393 Maze:
1394 panels:
1395 ANALYSIS: 2887
1396 BOOKS: 2890
1397 KING (1): 2886
1398 MANSLAUGHTER: 2888
1399 MEDIUMS: 2889
1400 Maze Back:
1401 panels:
1402 THESE: 2884
1403 Maze King Panel:
1404 panels:
1405 KING (2): 2885
1406 Mini Icarus 2:
1407 panels:
1408 ANIMALS: 2893
1409 ARROWS: 2894
1410 BATTERY: 2891
1411 SQUAD: 2895
1412 TROUPE: 2892
1413 Pillar Ramp:
1414 panels:
1415 ASTEROID: 2896
1416 BUNCH: 2897
1417 DRONE: 2900
1418 PATRICIDE: 2899
1419 PEA (1): 2901
1420 PRINCES: 2898
1421 Spiral Ramp:
1422 panels:
1423 FIREMAN: 2902
1424 The Orb:
1425 panels:
1426 ADDERS: 2903
1427 AXIS: 2913
1428 BASIS (2): 2912
1429 CLUTCH (1): 2911
1430 CLUTCH (2): 2918
1431 DEADLINE: 2908
1432 DISCUS: 2916
1433 FISH: 2907
1434 HISS: 2915
1435 NEEDLE: 2905
1436 PEA (2): 2909
1437 PUPPY: 2904
1438 SON: 2917
1439 STRAIGHT: 2914
1440 THESIS: 2910
1441 US: 2906
1442 Through Woman (Obverse):
1443 panels:
1444 COW: 2920
1445 HUMAN (2): 2919
1446 Through Woman (Reverse):
1447 panels:
1448 BASIS (1): 2922
1449 PRINCE: 2921
1450 Trans Rights:
1451 panels:
1452 SERVANT (1): 2926
1453 SERVANT (2): 2927
1454 Trans Rights Panels:
1455 panels:
1456 AGENDER: 2923
1457 HUMAN (3): 2924
1458 HUMAN (4): 2925
1459 Welcome Spine (Obverse):
1460 panels:
1461 FISHWIFE: 2928
1462 HUMAN (1): 2929
1463 ports:
1464 WORLDPORT: 3135
1465 Welcome Spine (Reverse):
1466 panels:
1467 FATHER: 2930
1468 SISTER: 2932
1469 TERMITE: 2931
1470 doors:
1471 Agender Door: 2846
1472 Animals Door: 2866
1473 Ant Door: 2855
1474 Arrows Door: 2865
1475 Asteroid Bunch Door: 2852
1476 Battery Door: 2863
1477 Cow Door: 2853
1478 Fatherland Door: 2860
1479 Man Door: 2856
1480 Mediums Door: 2850
1481 Murder Panels: 2871
1482 Near Fireman Wings Painting: 2876
1483 Orb Panels: 2875
1484 Patricide Door: 2873
1485 Pea Door: 2848
1486 Quick Travel 1: 2851
1487 Quick Travel 10: 2862
1488 Quick Travel 2: 2857
1489 Quick Travel 3: 2847
1490 Quick Travel 4: 2858
1491 Quick Travel 5: 2854
1492 Quick Travel 6: 2870
1493 Quick Travel 7: 2849
1494 Quick Travel 8: 2861
1495 Quick Travel 9: 2864
1496 Reversed Arrows Door: 2868
1497 Sun Painting To Drone: 2872
1498 Termite Door: 2869
1499 These Door: 2874
1500 Troupe Door: 2867
1501 Woman Door: 2859
1502 the_advanced:
1503 rooms:
1504 CBA:
1505 panels:
1506 CBA (1): 2938
1507 CBA (2): 2939
1508 CBA (3): 2940
1509 Main Area:
1510 panels:
1511 BIRD: 2955
1512 Blank (1): 2964
1513 Blank (2): 2965
1514 Blank (3): 2966
1515 Blank (4): 2967
1516 Blank (5): 2968
1517 DAIRY (1): 2946
1518 DAIRY (2): 2947
1519 DAIRY SAUCE: 2948
1520 DECK (1): 2961
1521 DECK (2): 2962
1522 DECK (3): 2963
1523 FRUIT (1): 2952
1524 FRUIT (2): 2953
1525 FRUIT FRUIT: 2954
1526 GULLIBLE (1): 2949
1527 GULLIBLE (2): 2950
1528 GULLIBLE (3): 2951
1529 I: 2942
1530 LIVES: 2945
1531 OBSERVE: 2941
1532 ORDER (1): 2958
1533 ORDER (2): 2959
1534 ORDER (3): 2960
1535 ORGANIZATION: 2957
1536 REST: 2943
1537 THE: 2944
1538 UNBOTTLING: 2956
1539 ports:
1540 WORLDPORT: 3136
1541 Mastery:
1542 masteries:
1543 MASTERY: 2969
1544 doors:
1545 Side Room Puzzles: 2934
55 the_ancient: 1546 the_ancient:
56 rooms: 1547 rooms:
57 Inside: 1548 Inside:
@@ -61,7 +1552,6 @@ maps:
61 panels: 1552 panels:
62 THIS: 45 1553 THIS: 45
63 doors: 1554 doors:
64 End Door: 42
65 Front Door: 41 1555 Front Door: 41
66 Lavender Cubes: 43 1556 Lavender Cubes: 43
67 the_bearer: 1557 the_bearer:
@@ -69,6 +1559,8 @@ maps:
69 Back Area: 1559 Back Area:
70 panels: 1560 panels:
71 COLOR: 51 1561 COLOR: 51
1562 ports:
1563 DAEDALUS: 3137
72 Blue Animal (View): 1564 Blue Animal (View):
73 panels: 1565 panels:
74 HALF: 52 1566 HALF: 52
@@ -95,6 +1587,8 @@ maps:
95 SQUISH: 60 1587 SQUISH: 60
96 TOAD: 64 1588 TOAD: 64
97 VIEW: 58 1589 VIEW: 58
1590 ports:
1591 UNYIELDING: 3138
98 Green Planet (View): 1592 Green Planet (View):
99 panels: 1593 panels:
100 SOIL: 66 1594 SOIL: 66
@@ -131,6 +1625,9 @@ maps:
131 Red Vegetable: 1625 Red Vegetable:
132 panels: 1626 panels:
133 CARD: 78 1627 CARD: 78
1628 Tree Entrance:
1629 ports:
1630 TREE: 3139
134 Yellow Planet: 1631 Yellow Planet:
135 panels: 1632 panels:
136 ZEUS: 79 1633 ZEUS: 79
@@ -139,15 +1636,19 @@ maps:
139 CAKE: 80 1636 CAKE: 80
140 doors: 1637 doors:
141 Butterfly Entrance: 50 1638 Butterfly Entrance: 50
1639 Butterfly Room Panels: 3304
142 Control Center Brown Door: 49 1640 Control Center Brown Door: 49
1641 Control Center Color Panel: 3303
143 Exit Door: 47 1642 Exit Door: 47
144 Overlook Door: 46 1643 Overlook Door: 46
145 Q2 Door: 48
146 the_between: 1644 the_between:
147 rooms: 1645 rooms:
148 Control Center Side: 1646 Control Center Side:
149 panels: 1647 panels:
150 RIGHT: 93 1648 RIGHT: 93
1649 ports:
1650 CC: 3140
1651 LIVELY: 3141
151 Main Area: 1652 Main Area:
152 panels: 1653 panels:
153 CAUGHT: 107 1654 CAUGHT: 107
@@ -178,6 +1679,11 @@ maps:
178 SUN KOI: 102 1679 SUN KOI: 102
179 THINK: 119 1680 THINK: 119
180 YOU: 115 1681 YOU: 115
1682 ports:
1683 GREAT: 3142
1684 Plaza Entrance:
1685 ports:
1686 PLAZA: 3143
181 doors: 1687 doors:
182 B2 Door: 91 1688 B2 Door: 91
183 Blue Puzzles: 88 1689 Blue Puzzles: 88
@@ -212,9 +1718,48 @@ maps:
212 SPECIES: 122 1718 SPECIES: 122
213 STRUCTURE: 129 1719 STRUCTURE: 129
214 TEXT: 136 1720 TEXT: 136
1721 ports:
1722 GALLERY: 3144
215 Mastery: 1723 Mastery:
216 masteries: 1724 masteries:
217 MASTERY: 140 1725 MASTERY: 140
1726 the_charismatic:
1727 rooms:
1728 Latitude Middle:
1729 panels:
1730 FUNNY: 2972
1731 Latitude North:
1732 panels:
1733 DEPENDABLE: 2973
1734 Latitude South:
1735 panels:
1736 CHARISMA: 2974
1737 Longitude East:
1738 panels:
1739 FUN: 2975
1740 Longitude Middle:
1741 panels:
1742 INTELLIGENT: 2976
1743 Longitude West:
1744 panels:
1745 CREATIVE: 2977
1746 Main Area:
1747 panels:
1748 AQUA: 2981
1749 ARC: 2978
1750 Blank: 2987
1751 HERE: 2984
1752 IT: 2985
1753 KING: 2979
1754 NAIL: 2983
1755 PINS: 2986
1756 TILE: 2982
1757 TIP: 2980
1758 ports:
1759 WORLDPORT: 3145
1760 Mastery:
1761 masteries:
1762 MASTERY: 2988
218 the_colorful: 1763 the_colorful:
219 rooms: 1764 rooms:
220 Black Room: 1765 Black Room:
@@ -231,6 +1776,9 @@ maps:
231 CHAOS: 159 1776 CHAOS: 159
232 KOI: 157 1777 KOI: 157
233 WISH: 158 1778 WISH: 158
1779 ports:
1780 DARKROOM: 3147
1781 STURDY: 3146
234 Cyan Room: 1782 Cyan Room:
235 panels: 1783 panels:
236 BROTHER: 160 1784 BROTHER: 160
@@ -255,6 +1803,8 @@ maps:
255 White Room: 1803 White Room:
256 panels: 1804 panels:
257 BRIGHT: 170 1805 BRIGHT: 170
1806 ports:
1807 GREAT: 3148
258 Window Room: 1808 Window Room:
259 panels: 1809 panels:
260 FADING: 171 1810 FADING: 171
@@ -265,6 +1815,7 @@ maps:
265 Black Door: 142 1815 Black Door: 142
266 Blue Door: 144 1816 Blue Door: 144
267 Brown Door: 151 1817 Brown Door: 151
1818 Chaos Panel: 3305
268 Cyan Door: 149 1819 Cyan Door: 149
269 Gray Door: 153 1820 Gray Door: 153
270 Green Door: 145 1821 Green Door: 145
@@ -313,10 +1864,15 @@ maps:
313 LIGHT: 209 1864 LIGHT: 209
314 LOVES: 210 1865 LOVES: 210
315 RANGER: 211 1866 RANGER: 211
1867 ports:
1868 DARKROOM: 3149
316 Obverse Yellow Room: 1869 Obverse Yellow Room:
317 panels: 1870 panels:
318 CIVIL: 216 1871 CIVIL: 216
319 CRABS: 217 1872 CRABS: 217
1873 T Keyholder:
1874 keyholders:
1875 T: 2754
320 doors: 1876 doors:
321 C Keyholder Blocker: 176 1877 C Keyholder Blocker: 176
322 C2 Door: 177 1878 C2 Door: 177
@@ -324,13 +1880,39 @@ maps:
324 Flipped Yellow Door: 175 1880 Flipped Yellow Door: 175
325 G Keyholder Blocker: 181 1881 G Keyholder Blocker: 181
326 G2 Door: 182 1882 G2 Door: 182
1883 Main Area Puzzles: 3306
327 Near C Keyholder Puzzles: 180 1884 Near C Keyholder Puzzles: 180
328 Obverse Magenta Door: 173 1885 Obverse Magenta Door: 173
329 Obverse Yellow Door: 178 1886 Obverse Yellow Door: 178
330 Obverse Yellow Puzzles: 179 1887 Obverse Yellow Puzzles: 179
331 T Keyholder Blocker: 183 1888 the_crystalline:
1889 rooms:
1890 Flip Area:
1891 panels:
1892 SUCCEED: 2989
1893 Main Area:
1894 panels:
1895 DROP: 2991
1896 LEAP: 2990
1897 SPIN: 2992
1898 ports:
1899 WORLDPORT: 3150
1900 Mastery:
1901 masteries:
1902 MASTERY: 2993
1903 doors:
1904 Checkpoint Panels: 3307
332 the_darkroom: 1905 the_darkroom:
333 rooms: 1906 rooms:
1907 Congruent Entrance:
1908 ports:
1909 CONGRUENT: 3151
1910 Cyan Hallway:
1911 ports:
1912 COLORFUL: 3152
1913 Double Sided Entrance:
1914 ports:
1915 DOUBLESIDED: 3153
334 First Room: 1916 First Room:
335 panels: 1917 panels:
336 BISON: 225 1918 BISON: 225
@@ -338,6 +1920,11 @@ maps:
338 KOI: 228 1920 KOI: 228
339 SHEEP: 227 1921 SHEEP: 227
340 TUNA: 229 1922 TUNA: 229
1923 ports:
1924 ENTRY: 3155
1925 First Room Exit:
1926 ports:
1927 NEXT: 3154
341 Second Room: 1928 Second Room:
342 panels: 1929 panels:
343 BISON: 231 1930 BISON: 231
@@ -345,6 +1932,11 @@ maps:
345 KOI: 234 1932 KOI: 234
346 SHEEP: 233 1933 SHEEP: 233
347 TUNA: 235 1934 TUNA: 235
1935 ports:
1936 ENTRY: 3157
1937 Second Room Exit:
1938 ports:
1939 NEXT: 3156
348 Third Room: 1940 Third Room:
349 panels: 1941 panels:
350 COINS: 238 1942 COINS: 238
@@ -356,12 +1948,12 @@ maps:
356 LOCKS: 242 1948 LOCKS: 242
357 TOUCHES: 243 1949 TOUCHES: 243
358 TURNS: 237 1950 TURNS: 237
1951 ports:
1952 ENTRY: 3158
359 doors: 1953 doors:
360 Colorful Entrance: 222 1954 Colorful Entrance: 222
361 Congruent Entrance: 223 1955 Congruent Entrance: 223
362 Double Letter Panel Blockers: 218
363 Double Sided Entrance: 224 1956 Double Sided Entrance: 224
364 S1 Door: 221
365 Second Room Entrance: 219 1957 Second Room Entrance: 219
366 Third Room Entrance: 220 1958 Third Room Entrance: 220
367 the_digital: 1959 the_digital:
@@ -377,17 +1969,30 @@ maps:
377 INN: 254 1969 INN: 254
378 OUT: 257 1970 OUT: 257
379 YOU: 255 1971 YOU: 255
1972 Gallery Maze:
1973 ports:
1974 GALLERY: 3159
380 Main Area: 1975 Main Area:
381 panels: 1976 panels:
382 COLOR: 261 1977 COLOR: 261
383 HIT: 258 1978 HIT: 258
384 PAINTING: 260 1979 PAINTING: 260
385 TIN: 259 1980 TIN: 259
1981 ports:
1982 ENTRY1: 3160
1983 ENTRY2: 3161
1984 ENTRY3: 3162
386 Tree Area: 1985 Tree Area:
387 panels: 1986 panels:
388 TREE: 262 1987 TREE: 262
1988 ports:
1989 TREE: 3163
1990 Unyielding Entrance:
1991 ports:
1992 UNYIELDING: 3164
389 doors: 1993 doors:
390 Control Center Blue Door: 246 1994 Control Center Blue Door: 246
1995 Control Center Blue Panel: 3308
391 Gallery Entrance: 245 1996 Gallery Entrance: 245
392 Tree Entrance: 247 1997 Tree Entrance: 247
393 the_door: 1998 the_door:
@@ -451,6 +2056,12 @@ maps:
451 panels: 2056 panels:
452 ATTIC: 285 2057 ATTIC: 285
453 FULL: 286 2058 FULL: 286
2059 ports:
2060 DARKROOM: 3165
2061 doors:
2062 10 Panels: 3310
2063 15 Panels: 3311
2064 5 Panels: 3309
454 the_entry: 2065 the_entry:
455 rooms: 2066 rooms:
456 Blue Alcove: 2067 Blue Alcove:
@@ -460,6 +2071,9 @@ maps:
460 Colored Doors Area: 2071 Colored Doors Area:
461 panels: 2072 panels:
462 OPEN: 327 2073 OPEN: 327
2074 Composite Room Entrance:
2075 ports:
2076 COMPOSITE: 3166
463 Ctrl Tutorial: 2077 Ctrl Tutorial:
464 panels: 2078 panels:
465 RIGHT: 328 2079 RIGHT: 328
@@ -474,16 +2088,23 @@ maps:
474 RED: 332 2088 RED: 332
475 SPRAY: 336 2089 SPRAY: 336
476 SUN: 333 2090 SUN: 333
2091 Daedalus Entrance:
2092 ports:
2093 DAEDALUS: 3167
2094 Digital Entrance:
2095 ports:
2096 DIGITAL: 3168
2097 Entry Exit:
2098 ports:
2099 GREAT: 3169
477 Eye Room: 2100 Eye Room:
478 panels: 2101 panels:
479 I: 339 2102 I: 339
2103 ports:
2104 LIONIZED: 3170
480 Flipped Link Area: 2105 Flipped Link Area:
481 panels: 2106 panels:
482 WANDER: 340 2107 WANDER: 340
483 Flipped Pyramid Area:
484 panels:
485 TURN (1): 341
486 TURN (2): 342
487 Flipped Right Eye: 2108 Flipped Right Eye:
488 panels: 2109 panels:
489 HERE: 344 2110 HERE: 344
@@ -492,9 +2113,14 @@ maps:
492 panels: 2113 panels:
493 CLUE: 345 2114 CLUE: 345
494 SLENDER: 346 2115 SLENDER: 346
2116 Four Rooms Entrance:
2117 ports:
2118 FOUR: 3171
495 Gallery Return: 2119 Gallery Return:
496 panels: 2120 panels:
497 RETURN: 347 2121 RETURN: 347
2122 ports:
2123 GALLERY: 3172
498 Least Blue Last: 2124 Least Blue Last:
499 panels: 2125 panels:
500 AIL: 356 2126 AIL: 356
@@ -507,6 +2133,14 @@ maps:
507 STEALER: 352 2133 STEALER: 352
508 TRUST: 354 2134 TRUST: 354
509 WANT: 351 2135 WANT: 351
2136 ports:
2137 DARKROOM: 3173
2138 Liberated Entrance:
2139 ports:
2140 BLUE: 3174
2141 Liberated Entrance Panel:
2142 panels:
2143 TURN (1): 341
510 Lime Room: 2144 Lime Room:
511 panels: 2145 panels:
512 COLOR: 361 2146 COLOR: 361
@@ -515,12 +2149,26 @@ maps:
515 Link Area: 2149 Link Area:
516 panels: 2150 panels:
517 WANDER: 362 2151 WANDER: 362
2152 Literate Entrance:
2153 ports:
2154 BROWN: 3175
2155 Literate Entrance Panel:
2156 panels:
2157 TURN (2): 342
518 Parthenon Return: 2158 Parthenon Return:
519 panels: 2159 panels:
520 RETURN: 363 2160 RETURN: 363
2161 ports:
2162 PARTHENON: 3176
521 Rabbit Hole: 2163 Rabbit Hole:
522 panels: 2164 panels:
523 PUZZLE: 364 2165 Blank: 364
2166 ports:
2167 HOLE: 3177
2168 Rabbit Hole Lock:
2169 panels:
2170 HOLE: 2749
2171 RABBIT: 2748
524 Red Alcove: 2172 Red Alcove:
525 panels: 2173 panels:
526 BROW: 365 2174 BROW: 365
@@ -534,6 +2182,12 @@ maps:
534 RAIN WOMAN: 373 2182 RAIN WOMAN: 373
535 WANDER: 370 2183 WANDER: 370
536 WOMAN: 372 2184 WOMAN: 372
2185 Repetitive Entrance:
2186 ports:
2187 REPETITIVE: 3178
2188 Revitalized Entrance:
2189 ports:
2190 REVITALIZED: 3179
537 Right Eye: 2191 Right Eye:
538 panels: 2192 panels:
539 EYE: 374 2193 EYE: 374
@@ -542,9 +2196,12 @@ maps:
542 Shop Entrance: 2196 Shop Entrance:
543 panels: 2197 panels:
544 TURN: 377 2198 TURN: 377
2199 ports:
2200 SHOP: 3180
545 Starting Room: 2201 Starting Room:
546 panels: 2202 panels:
547 EYE: 380 2203 EYE: 380
2204 Gift Maps: 2970
548 HI: 378 2205 HI: 378
549 HINT: 381 2206 HINT: 381
550 THAN: 383 2207 THAN: 383
@@ -553,51 +2210,63 @@ maps:
553 Trick Room: 2210 Trick Room:
554 panels: 2211 panels:
555 INK: 388 2212 INK: 388
2213 White Hallway To Daedalus:
2214 ports:
2215 DAEDALUS: 3181
556 Wrath Room: 2216 Wrath Room:
557 panels: 2217 panels:
558 CORN: 393 2218 CORN: 393
559 DICE: 392 2219 DICE: 392
560 HOLE: 390
561 RABBIT: 389
562 WREATH: 391 2220 WREATH: 391
2221 X Area:
2222 ports:
2223 CC: 3182
563 doors: 2224 doors:
2225 Big Eyes: 3316
564 Blue Alcove Entrance: 297 2226 Blue Alcove Entrance: 297
565 Blue Alcove Exit: 293 2227 Blue Alcove Exit: 293
566 Colored Doors Area Entrance: 318 2228 Colored Doors Area Entrance: 318
567 Composite Room Entrance: 309 2229 Composite Room Entrance: 309
568 Control Center White Door: 307 2230 Control Center White Door: 307
2231 Control Center White Panel: 3318
569 Corners Painting: 292 2232 Corners Painting: 292
570 D Room Entrance: 319 2233 D Room Entrance: 319
571 Daedalus Entrance: 311 2234 Daedalus Entrance: 311
572 Flip Area Entrance: 310 2235 Flip Area Entrance: 310
573 Flipped Pyramid Area Entrance: 315 2236 Flipped Right Eye Panels: 3315
574 Flipped Second Room Left Door: 300 2237 Flipped Second Room Left Door: 300
575 Flipped Second Room Right Door: 299 2238 Flipped Second Room Right Door: 299
576 Gallery Entrance: 321 2239 Gallery Entrance: 321
577 L Room Entrance: 322 2240 L Room Entrance: 322
2241 Least Blue Last: 3317
578 Liberated Entrance: 314 2242 Liberated Entrance: 314
579 Lime Room Entrance: 305 2243 Lime Room Entrance: 305
580 Link Area Entrance: 288 2244 Link Area Entrance: 288
581 Literate Entrance: 316 2245 Literate Entrance: 316
582 Near D Room Painting: 320 2246 Near D Room Painting: 320
583 Noon Door: 295 2247 Noon Door: 295
2248 Noon Door Panels: 3312
584 Orange Door Hider: 304 2249 Orange Door Hider: 304
585 Parthenon Entrance: 317 2250 Parthenon Entrance: 317
2251 Rabbit Hole Blank Puzzle: 3319
586 Rabbithole Door: 294 2252 Rabbithole Door: 294
587 Red Alcove Exit: 291 2253 Red Alcove Exit: 291
588 Red Blue Area Left Door: 302 2254 Red Blue Area Left Door: 302
589 Red Blue Area Right Door: 303 2255 Red Blue Area Right Door: 303
590 Red Room Painting: 323 2256 Red Room Painting: 323
591 Repetitive Entrance: 312
592 Revitalized Entrance: 306 2257 Revitalized Entrance: 306
593 Right Eye Entrance: 301 2258 Right Eye Entrance: 301
594 Scarf Door: 296 2259 Scarf Door: 296
2260 Scarf Door Panels: 3313
595 Second Room Left Door: 298 2261 Second Room Left Door: 298
596 Second Room Right Door: 290 2262 Second Room Right Door: 290
597 Shop Entrance: 313 2263 Shop Entrance: 313
2264 Starting Room West Wall North Door: 2781
598 Third Eye Painting: 324 2265 Third Eye Painting: 324
599 Trick Door: 287 2266 Trick Door: 287
600 Trick To Shop Door: 289 2267 Trick To Shop Door: 289
2268 Wander Panels: 3314
2269 Wrath Room Puzzles: 3320
601 X Area Entrance: 308 2270 X Area Entrance: 308
602 the_extravagant: 2271 the_extravagant:
603 rooms: 2272 rooms:
@@ -621,6 +2290,8 @@ maps:
621 X Plus: 2290 X Plus:
622 panels: 2291 panels:
623 ROSE: 405 2292 ROSE: 405
2293 keyholders:
2294 M: 2766
624 X Plus Middle Leg: 2295 X Plus Middle Leg:
625 panels: 2296 panels:
626 COLONY: 403 2297 COLONY: 403
@@ -641,6 +2312,33 @@ maps:
641 panels: 2312 panels:
642 CACTUS: 410 2313 CACTUS: 410
643 TAIL: 411 2314 TAIL: 411
2315 the_fuzzy:
2316 rooms:
2317 Main Area:
2318 panels:
2319 ACHIEVES: 3033
2320 BEFORE: 3028
2321 BOTH: 3036
2322 Blank: 3022
2323 CAGED: 3027
2324 COMBINED: 3032
2325 DICE: 3026
2326 FIRST: 3035
2327 FORGED: 3030
2328 LOTTO: 3024
2329 OTHERS: 3031
2330 TOED: 3029
2331 TUTU: 3023
2332 UNVEILED: 3034
2333 WHERETO: 3025
2334 ports:
2335 WORLDPORT: 3183
2336 Mastery:
2337 masteries:
2338 MASTERY: 3037
2339 doors:
2340 Black Panels: 3021
2341 Green Panels: 3321
644 the_gallery: 2342 the_gallery:
645 rooms: 2343 rooms:
646 Back Room: 2344 Back Room:
@@ -650,6 +2348,11 @@ maps:
650 Daedalus Extension: 2348 Daedalus Extension:
651 panels: 2349 panels:
652 WHERE: 433 2350 WHERE: 433
2351 Main Area:
2352 keyholders:
2353 P: 2765
2354 ports:
2355 ENTRY: 3184
653 doors: 2356 doors:
654 Ancient Painting: 428 2357 Ancient Painting: 428
655 Between Painting: 414 2358 Between Painting: 414
@@ -675,6 +2378,8 @@ maps:
675 The Whole Thing: 2378 The Whole Thing:
676 panels: 2379 panels:
677 PANEL: 434 2380 PANEL: 434
2381 doors:
2382 The Panel: 3322
678 the_graveyard: 2383 the_graveyard:
679 rooms: 2384 rooms:
680 Inside: 2385 Inside:
@@ -684,34 +2389,34 @@ maps:
684 panels: 2389 panels:
685 FOOT: 436 2390 FOOT: 436
686 SEVERE: 437 2391 SEVERE: 437
2392 doors:
2393 Remember Panel: 3323
687 the_great: 2394 the_great:
688 rooms: 2395 rooms:
689 Back Area: 2396 Back Area:
690 panels: 2397 panels:
691 Left Landscape Bottom: 482
692 Left Landscape Left: 483
693 Left Landscape Right: 481
694 Left Landscape Top: 480
695 PAINTING: 474 2398 PAINTING: 474
696 PLANT: 472 2399 PLANT: 472
697 Right Landscape Bottom: 486
698 Right Landscape Left: 487
699 Right Landscape Right: 485
700 Right Landscape Top: 484
701 TOWEL: 475 2400 TOWEL: 475
702 TREE: 473 2401 TREE: 473
703 Top Landscape Bottom: 478 2402 ports:
704 Top Landscape Left: 479 2403 THREEDOORS: 3186
705 Top Landscape Right: 477 2404 TOWER: 3187
706 Top Landscape Top: 476 2405 TREE: 3188
2406 UNKEMPT: 3185
707 Behind Question Area: 2407 Behind Question Area:
708 panels: 2408 panels:
709 DEW: 488 2409 DEW: 488
710 NO: 490 2410 NO: 490
711 YEW: 489 2411 YEW: 489
2412 Colorful Entrance:
2413 ports:
2414 COLORFUL: 3189
712 Daedalus Entrance: 2415 Daedalus Entrance:
713 panels: 2416 panels:
714 MISSING: 491 2417 MISSING: 491
2418 ports:
2419 DAEDALUS: 3190
715 East Landscape: 2420 East Landscape:
716 panels: 2421 panels:
717 COLOR: 492 2422 COLOR: 492
@@ -719,6 +2424,8 @@ maps:
719 Hive Entrance: 2424 Hive Entrance:
720 panels: 2425 panels:
721 LOST: 495 2426 LOST: 495
2427 ports:
2428 HIVE: 3191
722 Jail Part 1: 2429 Jail Part 1:
723 panels: 2430 panels:
724 DECATHLON: 506 2431 DECATHLON: 506
@@ -743,6 +2450,9 @@ maps:
743 NECROTIZE (2): 511 2450 NECROTIZE (2): 511
744 PILGRIM: 513 2451 PILGRIM: 513
745 TORMENTS: 512 2452 TORMENTS: 512
2453 Jubilant Entrance:
2454 ports:
2455 JUBILANT: 3192
746 Magnet Room: 2456 Magnet Room:
747 panels: 2457 panels:
748 AIRPLANE: 516 2458 AIRPLANE: 516
@@ -779,6 +2489,12 @@ maps:
779 SMILE: 539 2489 SMILE: 539
780 WHY: 540 2490 WHY: 540
781 YOU: 537 2491 YOU: 537
2492 ports:
2493 DIGITAL: 3197
2494 ENTRY: 3193
2495 KEEN: 3194
2496 LINEAR: 3196
2497 ORB: 3195
782 Maze Center: 2498 Maze Center:
783 panels: 2499 panels:
784 CHASE: 549 2500 CHASE: 549
@@ -834,6 +2550,10 @@ maps:
834 LAUGH FINISHED: 573 2550 LAUGH FINISHED: 573
835 PLANTS: 570 2551 PLANTS: 570
836 WEATHER: 568 2552 WEATHER: 568
2553 keyholders:
2554 X: 2770
2555 ports:
2556 INVISIBLE: 3198
837 Outside Jail: 2557 Outside Jail:
838 panels: 2558 panels:
839 GUT: 575 2559 GUT: 575
@@ -847,6 +2567,9 @@ maps:
847 FOUR: 581 2567 FOUR: 581
848 HAVE: 580 2568 HAVE: 580
849 TEN: 583 2569 TEN: 583
2570 Purple Room:
2571 ports:
2572 DAEDALUS: 3199
850 Question Room How: 2573 Question Room How:
851 panels: 2574 panels:
852 QUESTION: 584 2575 QUESTION: 584
@@ -859,6 +2582,26 @@ maps:
859 Question Room Who: 2582 Question Room Who:
860 panels: 2583 panels:
861 QUESTION: 587 2584 QUESTION: 587
2585 Salmon Room:
2586 ports:
2587 BETWEEN: 3200
2588 Talented Entrance:
2589 ports:
2590 TALENTED: 3201
2591 The Landscapes:
2592 panels:
2593 Left Landscape Bottom: 482
2594 Left Landscape Left: 483
2595 Left Landscape Right: 481
2596 Left Landscape Top: 480
2597 Right Landscape Bottom: 486
2598 Right Landscape Left: 487
2599 Right Landscape Right: 485
2600 Right Landscape Top: 484
2601 Top Landscape Bottom: 478
2602 Top Landscape Left: 479
2603 Top Landscape Right: 477
2604 Top Landscape Top: 476
862 Under Question Room: 2605 Under Question Room:
863 panels: 2606 panels:
864 QUESTION: 588 2607 QUESTION: 588
@@ -871,6 +2614,10 @@ maps:
871 RIGHT: 591 2614 RIGHT: 591
872 SAVORY: 592 2615 SAVORY: 592
873 TEACH: 590 2616 TEACH: 590
2617 ports:
2618 CC: 3203
2619 IMPRESSIVE: 3202
2620 PARTIAL: 3204
874 Whole Room: 2621 Whole Room:
875 panels: 2622 panels:
876 BATHROOM: 604 2623 BATHROOM: 604
@@ -906,13 +2653,19 @@ maps:
906 SHIFT: 624 2653 SHIFT: 624
907 doors: 2654 doors:
908 Back Area Entrance: 439 2655 Back Area Entrance: 439
2656 Behind Orb Panel: 3336
2657 Behind Question Room Panels: 3332
909 Between Entrance: 440 2658 Between Entrance: 440
910 Big Y: 462 2659 Big Y: 462
2660 Broken Shed Panels: 3333
911 Building Building Gravestone: 468 2661 Building Building Gravestone: 468
912 Colorful Entrance: 455 2662 Colorful Entrance: 455
913 Control Center Gray Door: 446 2663 Control Center Gray Door: 446
2664 Control Center Gray Panel: 3326
914 Control Center Purple Door: 445 2665 Control Center Purple Door: 445
2666 Control Center Purple Panel: 3327
915 Control Center Red Door: 447 2667 Control Center Red Door: 447
2668 Control Center Red Panel: 3328
916 Courtyard Entrance: 442 2669 Courtyard Entrance: 442
917 Courtyard Side Door: 461 2670 Courtyard Side Door: 461
918 Daedalus Entrance: 448 2671 Daedalus Entrance: 448
@@ -922,10 +2675,12 @@ maps:
922 Into The Mouth Gravestone: 457 2675 Into The Mouth Gravestone: 457
923 Invisible Entrance: 465 2676 Invisible Entrance: 465
924 Jail Entrance: 451 2677 Jail Entrance: 451
925 Lavender Cube: 469
926 Magnet Room Entrance: 449 2678 Magnet Room Entrance: 449
2679 Mistreat Panel: 3329
2680 Nature Panels: 3334
927 Nature Room Door: 466 2681 Nature Room Door: 466
928 Nature Room Panels: 467 2682 Nature Room Panels: 467
2683 Near Linear Panels: 3324
929 Near UC Painting Door: 441 2684 Near UC Painting Door: 441
930 North Landscape Entrance: 456 2685 North Landscape Entrance: 456
931 Pillar Room Entrance: 450 2686 Pillar Room Entrance: 450
@@ -934,11 +2689,21 @@ maps:
934 Savory Painting: 452 2689 Savory Painting: 452
935 Spiral Painting: 471 2690 Spiral Painting: 471
936 Talented Entrance: 463 2691 Talented Entrance: 463
2692 Teal Panel: 3335
937 The Landscapes Gravestone: 458 2693 The Landscapes Gravestone: 458
938 The Maze Gravestone: 460 2694 The Maze Gravestone: 460
939 Tower Entrance: 459 2695 Tower Entrance: 459
2696 Tower Panels: 3330
2697 Tree Panels: 3331
940 West/East Divider: 443 2698 West/East Divider: 443
2699 Why Is It Not Red: 3325
941 Zero Room Panels: 470 2700 Zero Room Panels: 470
2701 the_hinterlands:
2702 rooms:
2703 Main Area:
2704 ports:
2705 LEFT: 3206
2706 RIGHT: 3205
942 the_hive: 2707 the_hive:
943 rooms: 2708 rooms:
944 Main Area: 2709 Main Area:
@@ -981,6 +2746,13 @@ maps:
981 WAS: 631 2746 WAS: 631
982 WINGS: 662 2747 WINGS: 662
983 YELL: 636 2748 YELL: 636
2749 keyholders:
2750 B: 2769
2751 ports:
2752 DAED1: 3207
2753 DAED2: 3208
2754 DAED3: 3209
2755 GREAT: 3210
984 Mastery Room: 2756 Mastery Room:
985 masteries: 2757 masteries:
986 MASTERY: 666 2758 MASTERY: 666
@@ -999,28 +2771,40 @@ maps:
999 LEFT: 676 2771 LEFT: 676
1000 RETURN: 674 2772 RETURN: 674
1001 TO: 675 2773 TO: 675
2774 ports:
2775 PLAZA: 3211
1002 Lobby: 2776 Lobby:
1003 panels: 2777 panels:
1004 RIGHT: 677 2778 RIGHT: 677
2779 ports:
2780 GREAT: 3212
1005 Side Area: 2781 Side Area:
1006 panels: 2782 panels:
1007 COLOR: 680 2783 COLOR: 680
2784 ports:
2785 FOURROOMS: 3213
1008 WM Room: 2786 WM Room:
1009 panels: 2787 panels:
1010 LEFT: 682 2788 LEFT: 682
1011 RIGHT: 683 2789 RIGHT: 683
1012 doors: 2790 doors:
1013 Control Center Green Door: 673 2791 Control Center Green Door: 673
2792 Control Center Green Panel: 3338
1014 Front Door: 671 2793 Front Door: 671
2794 Green Eye Panels: 3337
1015 Side Door: 672 2795 Side Door: 672
1016 the_invisible: 2796 the_invisible:
1017 rooms: 2797 rooms:
1018 Entrance: 2798 Entrance:
1019 panels: 2799 panels:
1020 VISIBLE: 685 2800 VISIBLE: 685
2801 ports:
2802 ENTRY: 3214
1021 Maze: 2803 Maze:
1022 masteries: 2804 masteries:
1023 MASTERY: 686 2805 MASTERY: 686
2806 ports:
2807 ENTRY: 3215
1024 doors: 2808 doors:
1025 Maze Entrance: 684 2809 Maze Entrance: 684
1026 the_jubilant: 2810 the_jubilant:
@@ -1039,6 +2823,8 @@ maps:
1039 SPRINT: 695 2823 SPRINT: 695
1040 TREE: 698 2824 TREE: 698
1041 UNFAIR: 694 2825 UNFAIR: 694
2826 ports:
2827 GREAT: 3216
1042 Side Area: 2828 Side Area:
1043 panels: 2829 panels:
1044 CALL: 704 2830 CALL: 704
@@ -1047,8 +2833,11 @@ maps:
1047 FLASHBACK: 705 2833 FLASHBACK: 705
1048 PUSH: 703 2834 PUSH: 703
1049 PUSHBACK: 702 2835 PUSHBACK: 702
2836 keyholders:
2837 J: 2772
1050 doors: 2838 doors:
1051 Side Door: 687 2839 Side Door: 687
2840 Side Room Puzzles: 3339
1052 the_keen: 2841 the_keen:
1053 rooms: 2842 rooms:
1054 Main Area: 2843 Main Area:
@@ -1062,6 +2851,8 @@ maps:
1062 TIN (3): 711 2851 TIN (3): 711
1063 TIN (4): 712 2852 TIN (4): 712
1064 TIN (5): 713 2853 TIN (5): 713
2854 ports:
2855 GREAT: 3217
1065 doors: 2856 doors:
1066 All Panels: 707 2857 All Panels: 707
1067 the_liberated: 2858 the_liberated:
@@ -1076,6 +2867,8 @@ maps:
1076 PERSON: 720 2867 PERSON: 720
1077 SAND: 723 2868 SAND: 723
1078 WOLF: 725 2869 WOLF: 725
2870 ports:
2871 ENTRY: 3218
1079 doors: 2872 doors:
1080 Door: 718 2873 Door: 718
1081 the_linear: 2874 the_linear:
@@ -1090,6 +2883,8 @@ maps:
1090 NOR: 735 2883 NOR: 735
1091 ROT: 731 2884 ROT: 731
1092 TON: 730 2885 TON: 730
2886 ports:
2887 GREAT: 3219
1093 doors: 2888 doors:
1094 Behind The Keen Gravestone: 727 2889 Behind The Keen Gravestone: 727
1095 the_lionized: 2890 the_lionized:
@@ -1104,6 +2899,8 @@ maps:
1104 LION: 741 2899 LION: 741
1105 PIG: 743 2900 PIG: 743
1106 ROCK: 740 2901 ROCK: 740
2902 ports:
2903 ENTRY: 3220
1107 the_literate: 2904 the_literate:
1108 rooms: 2905 rooms:
1109 Puzzle Room: 2906 Puzzle Room:
@@ -1116,6 +2913,8 @@ maps:
1116 SAND: 750 2913 SAND: 750
1117 STICK: 752 2914 STICK: 752
1118 WATER: 746 2915 WATER: 746
2916 ports:
2917 ENTRY: 3221
1119 doors: 2918 doors:
1120 Door: 745 2919 Door: 745
1121 the_lively: 2920 the_lively:
@@ -1130,6 +2929,8 @@ maps:
1130 ROOSTER: 762 2929 ROOSTER: 762
1131 SON: 759 2930 SON: 759
1132 SOPRANO: 757 2931 SOPRANO: 757
2932 ports:
2933 BETWEEN: 3222
1133 the_nuanced: 2934 the_nuanced:
1134 rooms: 2935 rooms:
1135 Back Room: 2936 Back Room:
@@ -1158,12 +2959,20 @@ maps:
1158 NAY: 774 2959 NAY: 774
1159 NIGH: 781 2960 NIGH: 781
1160 TORE: 787 2961 TORE: 787
2962 keyholders:
2963 S: 2767
2964 ports:
2965 UNYIELDING: 3223
1161 doors: 2966 doors:
1162 Left Room Puzzles: 763 2967 Blue Side Puzzles: 763
1163 Main Room Puzzles: 765 2968 Green Side Puzzles: 764
1164 Right Room Puzzles: 764 2969 Main Room Door: 2750
2970 Stores Panel: 3340
1165 the_orb: 2971 the_orb:
1166 rooms: 2972 rooms:
2973 B Room:
2974 ports:
2975 FINAL: 3224
1167 Main Area: 2976 Main Area:
1168 panels: 2977 panels:
1169 ACT: 799 2978 ACT: 799
@@ -1178,6 +2987,11 @@ maps:
1178 STRIKE: 790 2987 STRIKE: 790
1179 THICK: 797 2988 THICK: 797
1180 THIN: 793 2989 THIN: 793
2990 ports:
2991 GREAT: 3225
2992 Middle Room:
2993 ports:
2994 MID: 3226
1181 the_owl: 2995 the_owl:
1182 rooms: 2996 rooms:
1183 Blue Room: 2997 Blue Room:
@@ -1188,6 +3002,7 @@ maps:
1188 COLOR: 823 3002 COLOR: 823
1189 ETCH: 837 3003 ETCH: 837
1190 FAINT: 821 3004 FAINT: 821
3005 FIZZLE: 2745
1191 HAD: 830 3006 HAD: 830
1192 HEAVY: 829 3007 HEAVY: 829
1193 LAY: 834 3008 LAY: 834
@@ -1204,6 +3019,11 @@ maps:
1204 SKETCH: 832 3019 SKETCH: 832
1205 WHITE: 824 3020 WHITE: 824
1206 WING: 826 3021 WING: 826
3022 ports:
3023 FOURROOMS: 3227
3024 Magenta Hallway:
3025 ports:
3026 STURDY: 3228
1207 R1C4 Left: 3027 R1C4 Left:
1208 panels: 3028 panels:
1209 STENCIL: 840 3029 STENCIL: 840
@@ -1216,15 +3036,16 @@ maps:
1216 R2C2 Bottom: 3036 R2C2 Bottom:
1217 panels: 3037 panels:
1218 FOUL: 844 3038 FOUL: 844
3039 ports:
3040 GALLERY: 3229
1219 R2C2 Top: 3041 R2C2 Top:
1220 panels: 3042 panels:
1221 CRUSH: 845 3043 CRUSH: 845
1222 RAY: 846 3044 RAY: 846
1223 R2C2.5 Bottom: 3045 R2C3 Bottom:
1224 panels: 3046 panels:
1225 BLACK: 849 3047 BLACK: 2747
1226 FIGMENT: 848 3048 FIGMENT: 2746
1227 FIZZLE: 847
1228 Z Room: 3049 Z Room:
1229 panels: 3050 panels:
1230 MAZE: 850 3051 MAZE: 850
@@ -1234,12 +3055,22 @@ maps:
1234 Blue Owl: 818 3055 Blue Owl: 818
1235 Brush Door: 804 3056 Brush Door: 804
1236 Control Center Magenta Door: 812 3057 Control Center Magenta Door: 812
3058 Control Center Magenta Panel: 3343
1237 First Door: 808 3059 First Door: 808
1238 First Room Shortcut: 807 3060 First Room Shortcut: 807
1239 Gray Bottom Door: 811 3061 Gray Bottom Door: 811
1240 Gray Owl: 814 3062 Gray Owl: 814
1241 Gray Top Door: 810 3063 Gray Top Door: 810
3064 Near Z1 Panel: 3350
1242 Orange Owl: 815 3065 Orange Owl: 815
3066 R1C1 Panels: 3341
3067 R1C2 Panels: 3342
3068 R1C3 Panels: 3344
3069 R1C4 Panels: 3345
3070 R2C1 Panels: 3346
3071 R2C2 Panels: 3347
3072 R2C3 Panels: 3348
3073 R2C4 Panels: 3349
1243 Sky Bottom Doors: 806 3074 Sky Bottom Doors: 806
1244 Sky Owl: 813 3075 Sky Owl: 813
1245 Sky Top Doors: 805 3076 Sky Top Doors: 805
@@ -1259,13 +3090,23 @@ maps:
1259 CLEOPATRA: 859 3090 CLEOPATRA: 859
1260 NAPOLEON: 860 3091 NAPOLEON: 860
1261 XERXES: 857 3092 XERXES: 857
3093 ports:
3094 ENTRY: 3231
3095 GALLERY: 3230
3096 REVITALIZED: 3232
3097 U Keyholder:
3098 keyholders:
3099 U: 2777
1262 doors: 3100 doors:
1263 K2 Door: 852 3101 K2 Door: 852
3102 Lavender Area Puzzles: 3351
1264 the_partial: 3103 the_partial:
1265 rooms: 3104 rooms:
1266 Control Center Entrance: 3105 Control Center Entrance:
1267 panels: 3106 panels:
1268 RETURN: 867 3107 RETURN: 867
3108 ports:
3109 CC: 3233
1269 Obverse Side: 3110 Obverse Side:
1270 panels: 3111 panels:
1271 CUT: 881 3112 CUT: 881
@@ -1282,6 +3123,10 @@ maps:
1282 TON: 878 3123 TON: 878
1283 TURN: 875 3124 TURN: 875
1284 UP: 870 3125 UP: 870
3126 keyholders:
3127 L: 2771
3128 ports:
3129 GREAT: 3234
1285 Reverse Side: 3130 Reverse Side:
1286 panels: 3131 panels:
1287 BRO: 884 3132 BRO: 884
@@ -1291,8 +3136,14 @@ maps:
1291 doors: 3136 doors:
1292 Control Center Entrance: 865 3137 Control Center Entrance: 865
1293 F Door: 866 3138 F Door: 866
3139 L Entered: 2843
1294 Main Room Puzzles: 863 3140 Main Room Puzzles: 863
1295 P Door: 864 3141 P Door: 864
3142 the_perceptive:
3143 rooms:
3144 Main Area:
3145 ports:
3146 CC: 3235
1296 the_plaza: 3147 the_plaza:
1297 rooms: 3148 rooms:
1298 Bottom Left Room: 3149 Bottom Left Room:
@@ -1326,18 +3177,28 @@ maps:
1326 ASTOUNDING: 919 3177 ASTOUNDING: 919
1327 COURTYARD: 918 3178 COURTYARD: 918
1328 INFLEXIBLE: 920 3179 INFLEXIBLE: 920
3180 ports:
3181 BETWEEN: 3238
3182 IMPRESSIVE: 3237
3183 UNYIELDING: 3236
1329 Mastery: 3184 Mastery:
1330 masteries: 3185 masteries:
1331 MASTERY: 923 3186 MASTERY: 923
1332 Repetitive Entrance: 3187 Repetitive Entrance:
1333 panels: 3188 panels:
1334 TEDIOUS: 924 3189 TEDIOUS: 924
3190 ports:
3191 REPETITIVE: 3239
1335 Sirenic Entrance: 3192 Sirenic Entrance:
1336 panels: 3193 panels:
1337 SIREN: 925 3194 SIREN: 925
3195 ports:
3196 SIRENIC: 3240
1338 Symbolic Entrance: 3197 Symbolic Entrance:
1339 panels: 3198 panels:
1340 FIGURATIVE: 926 3199 FIGURATIVE: 926
3200 ports:
3201 SYMBOLIC: 3241
1341 Top Left Room: 3202 Top Left Room:
1342 panels: 3203 panels:
1343 BACKPACK: 939 3204 BACKPACK: 939
@@ -1386,20 +3247,27 @@ maps:
1386 TYPIST BEAR RIGHT WING: 968 3247 TYPIST BEAR RIGHT WING: 968
1387 WING: 950 3248 WING: 950
1388 doors: 3249 doors:
1389 Bottom Left Door: 894 3250 Near Broken Portal Panel: 3355
1390 Bottom Left Puzzles: 898 3251 Near Repetitive Panel: 3354
1391 Bottom Right Door: 895 3252 Near Sirenic Panel: 3352
1392 Bottom Right Puzzles: 899 3253 Near Symbolic Panel: 3353
3254 Northeast Door: 893
3255 Northeast Puzzles: 897
3256 Northwest Door: 892
3257 Northwest Puzzles: 896
1393 Repetitive Entrance: 888 3258 Repetitive Entrance: 888
1394 Sirenic Entrance: 890 3259 Sirenic Entrance: 890
3260 Southeast Door: 895
3261 Southeast Puzzles: 899
3262 Southwest Door: 894
3263 Southwest Puzzles: 898
1395 Symbolic Entrance: 889 3264 Symbolic Entrance: 889
1396 Top Left Door: 892
1397 Top Left Puzzles: 896
1398 Top Right Door: 893
1399 Top Right Puzzles: 897
1400 Turtle Entrance: 891 3265 Turtle Entrance: 891
1401 the_quiet: 3266 the_quiet:
1402 rooms: 3267 rooms:
3268 Keyholder Room:
3269 keyholders:
3270 Q: 2778
1403 Main Area: 3271 Main Area:
1404 panels: 3272 panels:
1405 BEE: 979 3273 BEE: 979
@@ -1414,6 +3282,8 @@ maps:
1414 RODENT: 972 3282 RODENT: 972
1415 RULE: 974 3283 RULE: 974
1416 SOLID: 971 3284 SOLID: 971
3285 ports:
3286 DAEDALUS: 3242
1417 doors: 3287 doors:
1418 Side Door: 970 3288 Side Door: 970
1419 the_relentless: 3289 the_relentless:
@@ -1470,13 +3340,17 @@ maps:
1470 HIDE (2): 1021 3340 HIDE (2): 1021
1471 MORE: 1022 3341 MORE: 1022
1472 doors: 3342 doors:
3343 Left Only Puzzles: 3020
1473 Left/Turn Door: 984 3344 Left/Turn Door: 984
3345 Shop Only Puzzles: 3019
3346 Turn Only Puzzles: 3018
1474 Turn/Shop Door: 985 3347 Turn/Shop Door: 985
1475 the_repetitive: 3348 the_repetitive:
1476 rooms: 3349 rooms:
1477 Anti Room: 3350 Anti Room:
1478 panels: 3351 panels:
1479 EYE: 1041 3352 EYE (1): 1041
3353 EYE (2): 2813
1480 HA (1): 1035 3354 HA (1): 1035
1481 HA (2): 1036 3355 HA (2): 1036
1482 HA (3): 1037 3356 HA (3): 1037
@@ -1514,6 +3388,9 @@ maps:
1514 TO (2): 1056 3388 TO (2): 1056
1515 TUTU (1): 1054 3389 TUTU (1): 1054
1516 TUTU (2): 1068 3390 TUTU (2): 1068
3391 Entry Connector:
3392 ports:
3393 ENTRY: 3243
1517 Lime Room: 3394 Lime Room:
1518 panels: 3395 panels:
1519 BIRD: 1074 3396 BIRD: 1074
@@ -1566,9 +3443,14 @@ maps:
1566 MISHMASH: 1114 3443 MISHMASH: 1114
1567 QUESTION: 1105 3444 QUESTION: 1105
1568 RICHES: 1112 3445 RICHES: 1112
3446 ports:
3447 CC: 3244
1569 Mastery Room: 3448 Mastery Room:
1570 masteries: 3449 masteries:
1571 MASTERY: 1116 3450 MASTERY: 1116
3451 Plaza Connector:
3452 ports:
3453 PLAZA: 3245
1572 Yellow Room: 3454 Yellow Room:
1573 panels: 3455 panels:
1574 3D: 1123 3456 3D: 1123
@@ -1583,16 +3465,20 @@ maps:
1583 W: 1117 3465 W: 1117
1584 ZEROING: 1118 3466 ZEROING: 1118
1585 doors: 3467 doors:
3468 Anti-Collectable: 2812
1586 Anti-Collectable Room: 1025 3469 Anti-Collectable Room: 1025
3470 Anti-Collectable Room Panels: 3358
3471 Black Hallway: 2780
1587 Cyan Door: 1028 3472 Cyan Door: 1028
1588 Cyan Puzzles: 1032 3473 Cyan Puzzles: 1032
1589 Dot Area Entrance: 1026 3474 Dot Area Entrance: 1026
1590 Entry Entrance: 1023 3475 Entry Entrance: 1023
3476 H2 Room Puzzles: 3357
3477 Hots Panels: 3356
1591 Lime Door: 1027 3478 Lime Door: 1027
1592 Lime Puzzles: 1031 3479 Lime Puzzles: 1031
1593 Magenta Door: 1029 3480 Magenta Door: 1029
1594 Magenta Puzzles: 1033 3481 Magenta Puzzles: 1033
1595 Plaza Entrance: 1024
1596 Yellow Door: 1030 3482 Yellow Door: 1030
1597 Yellow Puzzles: 1034 3483 Yellow Puzzles: 1034
1598 the_revitalized: 3484 the_revitalized:
@@ -1600,6 +3486,8 @@ maps:
1600 Bye Room: 3486 Bye Room:
1601 panels: 3487 panels:
1602 BYE: 1129 3488 BYE: 1129
3489 ports:
3490 PARTHENON: 3246
1603 Hidden Room: 3491 Hidden Room:
1604 panels: 3492 panels:
1605 HIDDEN: 1130 3493 HIDDEN: 1130
@@ -1646,9 +3534,14 @@ maps:
1646 STIM: 1148 3534 STIM: 1148
1647 STONE: 1142 3535 STONE: 1142
1648 TADPOLES: 1159 3536 TADPOLES: 1159
3537 keyholders:
3538 N: 2779
3539 ports:
3540 ENTRY: 3247
1649 doors: 3541 doors:
1650 Books Puzzles: 1136 3542 Books Puzzles: 1136
1651 Games Puzzles: 1137 3543 Games Puzzles: 1137
3544 N Entered: 2971
1652 the_sirenic: 3545 the_sirenic:
1653 rooms: 3546 rooms:
1654 Mastery: 3547 Mastery:
@@ -1675,8 +3568,62 @@ maps:
1675 panels: 3568 panels:
1676 Flipped: 1178 3569 Flipped: 1178
1677 Obverse: 1179 3570 Obverse: 1179
3571 ports:
3572 PLAZA: 3248
1678 doors: 3573 doors:
1679 Entrance: 1161 3574 Entrance: 1161
3575 the_stellar:
3576 rooms:
3577 Blue Panel:
3578 panels:
3579 BLUE: 2996
3580 Connected Area:
3581 panels:
3582 BEHIND: 3003
3583 Blank: 3004
3584 GREETINGS: 3002
3585 HERE: 2997
3586 HI: 3000
3587 QUESTION (1): 2999
3588 QUESTION (2): 3016
3589 START: 3005
3590 WHERE: 3001
3591 Green Area:
3592 panels:
3593 STRAYS: 3006
3594 Green Panel:
3595 panels:
3596 GREEN: 3007
3597 Hi Room:
3598 panels:
3599 HI: 3008
3600 Mastery:
3601 masteries:
3602 MASTERY: 3009
3603 Old Crossroads:
3604 panels:
3605 DOORWAY: 3010
3606 Orange Panel:
3607 panels:
3608 ORANGE: 3011
3609 Purple Panel:
3610 panels:
3611 PURPLE: 3012
3612 Red Panel:
3613 panels:
3614 RED: 3013
3615 Starting Room:
3616 panels:
3617 STARLIKE: 3014
3618 ports:
3619 WORLDPORT: 3249
3620 Yellow Panel:
3621 panels:
3622 YELLOW: 3015
3623 doors:
3624 Entrance: 2995
3625 Question Panels: 3017
3626 Welcome Back Panels: 3359
1680 the_stormy: 3627 the_stormy:
1681 rooms: 3628 rooms:
1682 Center: 3629 Center:
@@ -1685,6 +3632,8 @@ maps:
1685 REACTOR: 1180 3632 REACTOR: 1180
1686 VOLCANO: 1181 3633 VOLCANO: 1181
1687 WIND: 1183 3634 WIND: 1183
3635 ports:
3636 ENTRY: 3250
1688 Nuclear Side: 3637 Nuclear Side:
1689 panels: 3638 panels:
1690 GERM: 1184 3639 GERM: 1184
@@ -1717,6 +3666,9 @@ maps:
1717 MOVE (6): 1198 3666 MOVE (6): 1198
1718 MOVE (7): 1199 3667 MOVE (7): 1199
1719 MOVE (8): 1200 3668 MOVE (8): 1200
3669 ports:
3670 COLORFUL: 3252
3671 OWL: 3251
1720 S2 Area: 3672 S2 Area:
1721 panels: 3673 panels:
1722 COLORS: 1201 3674 COLORS: 1201
@@ -1725,6 +3677,8 @@ maps:
1725 Entrance: 3677 Entrance:
1726 panels: 3678 panels:
1727 SUN: 1212 3679 SUN: 1212
3680 ports:
3681 UNKEMPT: 3253
1728 Mastery: 3682 Mastery:
1729 masteries: 3683 masteries:
1730 MASTERY: 1213 3684 MASTERY: 1213
@@ -1771,8 +3725,563 @@ maps:
1771 SQUISH: 1241 3725 SQUISH: 1241
1772 VEGETABLE: 1232 3726 VEGETABLE: 1232
1773 WATER: 1226 3727 WATER: 1226
3728 ports:
3729 EXIT1: 3254
3730 EXIT2: 3255
3731 the_symbolic:
3732 rooms:
3733 Black Room:
3734 panels:
3735 HERE: 2291
3736 Blue Room:
3737 panels:
3738 DEPLETE: 2292
3739 Green Room:
3740 panels:
3741 INERT: 2293
3742 Last Room:
3743 panels:
3744 BLEAT: 2294
3745 BRAG: 2297
3746 JARGON: 2295
3747 JARGON BLEAT: 2296
3748 Main Area:
3749 panels:
3750 ANYMORE: 2371
3751 BACKFIRES: 2342
3752 BLENDING: 2339
3753 BOOMBOX: 2360
3754 BORED: 2333
3755 BOY (1): 2348
3756 BOY (2): 2349
3757 BRINGING: 2307
3758 CHICKEN: 2346
3759 COUNTER: 2365
3760 COWBOY: 2369
3761 DEAR: 2368
3762 DISCARD: 2327
3763 DISTANT: 2324
3764 DRAW: 2343
3765 EMULATE: 2345
3766 FLIPPER: 2340
3767 GEIGER: 2364
3768 GEM: 2363
3769 HALFTIME (1): 2315
3770 HALFTIME (2): 2316
3771 HEIFER: 2370
3772 HORSEMAN: 2366
3773 IMMATURE: 2312
3774 INJURY: 2356
3775 INMATE: 2319
3776 JUSTICE: 2298
3777 KINDRED: 2362
3778 LIKE: 2372
3779 LIKEABLE: 2351
3780 LINEAGE: 2310
3781 LINEARLY: 2304
3782 MEANINGFULLY: 2352
3783 MIXTURE: 2336
3784 MORE: 2353
3785 MOUTHPIECE: 2354
3786 MS: 2331
3787 NEEDLESS: 2373
3788 NONSENSE: 2323
3789 NORTHERN: 2318
3790 NOTCHES: 2320
3791 NOTICE (1): 2299
3792 NOTICE (2): 2300
3793 NOTICE (3): 2301
3794 NUMERATOR: 2357
3795 OLDTIMER: 2344
3796 PADDING: 2306
3797 PANT: 2341
3798 PASSPORT: 2328
3799 PEAT: 2337
3800 PLUMAGED: 2347
3801 PORT: 2329
3802 QUARTERBACK: 2317
3803 RAMPART: 2355
3804 RATHER: 2367
3805 REINDICT: 2309
3806 RESTLESS: 2374
3807 SADDLED: 2305
3808 SAGE: 2350
3809 SHUFFLEBOARD: 2338
3810 SOME: 2314
3811 SOUNDBITE: 2332
3812 STEREO: 2361
3813 STORMS: 2330
3814 THING: 2313
3815 THOUSANDS: 2308
3816 TIGHT (1): 2325
3817 TIGHT (2): 2326
3818 TINCTURE: 2311
3819 TYPEWRITING: 2358
3820 UNABLE (1): 2302
3821 UNABLE (2): 2303
3822 VIOLET (1): 2321
3823 VIOLET (2): 2322
3824 VOCALIZE: 2334
3825 VOICEMAIL: 2335
3826 WHIRRED: 2359
3827 Mastery:
3828 masteries:
3829 MASTERY: 2375
3830 Orange Room:
3831 panels:
3832 YOUNG: 2376
3833 Poetry Room 1:
3834 panels:
3835 ABSORBED: 2377
3836 PRIMORDIAL: 2378
3837 Poetry Room 2:
3838 panels:
3839 NOT: 2380
3840 NOT THERE: 2381
3841 THERE: 2379
3842 Poetry Room 3:
3843 panels:
3844 NOT: 2383
3845 NOT PRETTY: 2384
3846 PRETTY: 2382
3847 Poetry Room Left:
3848 panels:
3849 NOT: 2394
3850 NOT TRUE: 2395
3851 TRUE: 2393
3852 Poetry Room Left Left:
3853 panels:
3854 LEFT: 2387
3855 NOT (1): 2385
3856 NOT (2): 2386
3857 NOT NOT LEFT: 2388
3858 Poetry Room Left Right:
3859 panels:
3860 MISS: 2389
3861 NOT (1): 2391
3862 NOT (2): 2390
3863 NOT NOT MISS: 2392
3864 Poetry Room Right:
3865 panels:
3866 BETTER: 2404
3867 NOT: 2405
3868 NOT BETTER: 2406
3869 Poetry Room Right Left:
3870 panels:
3871 NOT (1): 2396
3872 NOT (2): 2397
3873 NOT NOT TABLET: 2399
3874 TABLET: 2398
3875 Poetry Room Right Right:
3876 panels:
3877 NOT (1): 2400
3878 NOT (2): 2401
3879 NOT (3): 2402
3880 NOT NOT NOT: 2403
3881 Purple Room:
3882 panels:
3883 TIME: 2407
3884 Red Blue Room:
3885 panels:
3886 RIGHTWARD: 2408
3887 TYPEWRITING: 2409
3888 Red Room:
3889 panels:
3890 SYNONYM: 2410
3891 Tutorial:
3892 panels:
3893 <- (1): 2413
3894 <- (2): 2414
3895 <- (3): 2415
3896 HIGH: 2412
3897 SAME: 2419
3898 SAY: 2411
3899 THIS: 2416
3900 TYPE: 2418
3901 WRITE: 2417
3902 Whirred Room:
3903 panels:
3904 INDEX (1): 2423
3905 INDEX (2): 2424
3906 NAY: 2422
3907 NAYSAYER: 2421
3908 TAIPEI: 2420
3909 White Room:
3910 panels:
3911 WRITE: 2425
3912 ports:
3913 PLAZA: 3256
3914 Yellow Room:
3915 panels:
3916 WHOLE: 2426
3917 doors:
3918 Main Area Fifth Row: 2290
3919 Main Area First Row: 2286
3920 Main Area Fourth Row: 2289
3921 Main Area Second Row: 2287
3922 Main Area Third Row: 2288
3923 Poetry Room Panels: 2285
3924 Tutorial Door: 2754
3925 Tutorial Panels: 2283
3926 Whirred Room Panels: 2284
3927 the_talented:
3928 rooms:
3929 Back Room:
3930 panels:
3931 FEAR: 2430
3932 FILED: 2434
3933 FLEECE: 2431
3934 LONE: 2436
3935 RELEVANT: 2435
3936 SHRINE: 2432
3937 STRIVES: 2433
3938 Main Area:
3939 panels:
3940 ANT (Black): 2443
3941 ANT (Brown): 2450
3942 CHILD (Black): 2441
3943 CHILD (Brown): 2448
3944 DEER (Black): 2437
3945 DEER (Brown): 2444
3946 EARL: 2451
3947 ELEPHANT (Black): 2442
3948 ELEPHANT (Brown): 2449
3949 GOOSE (Black): 2438
3950 GOOSE (Brown): 2445
3951 SWINE (Black): 2439
3952 SWINE (Brown): 2446
3953 WIFE (Black): 2440
3954 WIFE (Brown): 2447
3955 keyholders:
3956 Y: 2764
3957 ports:
3958 GREAT: 3257
3959 doors:
3960 Black Side Panels: 2427
3961 Brown Side Panels: 2428
3962 Keyholder Hint Panel: 3360
3963 Main Room Door: 2429
3964 the_tenacious:
3965 rooms:
3966 Color Room:
3967 panels:
3968 COLOR: 2454
3969 Control Center Entrance:
3970 panels:
3971 ZERO: 2455
3972 ports:
3973 CC: 3258
3974 Main Area:
3975 keyholders:
3976 K: 2768
3977 Mastery:
3978 masteries:
3979 MASTERY: 2456
3980 Paintings Room:
3981 panels:
3982 PAINTINGS: 2457
3983 Tower Room:
3984 panels:
3985 TOWER: 2458
3986 Wisdom Room:
3987 panels:
3988 WISDOM: 2459
3989 doors:
3990 K Entered: 2844
3991 Paintings Door: 2453
3992 the_three_doors:
3993 rooms:
3994 Dead End Room:
3995 panels:
3996 DEAD: 2463
3997 DOOR: 2461
3998 END: 2464
3999 WAYS: 2462
4000 ports:
4001 BEGIN: 3259
4002 BEGIN2: 3260
4003 First Second Room:
4004 panels:
4005 FIRS: 2465
4006 INITIAL: 2466
4007 MINUTE (1): 2467
4008 MINUTE (2): 2468
4009 ports:
4010 GREAT: 3261
4011 TTD: 3262
4012 Loose Strings Room:
4013 panels:
4014 LOOSE: 2469
4015 STRINGS: 2470
4016 ports:
4017 BEGIN: 3263
4018 One Luck Room:
4019 panels:
4020 CHANCE: 2472
4021 LONE: 2471
4022 ports:
4023 BEGIN: 3264
4024 Silver Portal Room:
4025 panels:
4026 GOLD: 2473
4027 Left: 2475
4028 PORT: 2474
4029 Right: 2476
4030 ports:
4031 BEGIN: 3265
4032 NEXT: 3266
4033 doors:
4034 The Three Doors Gravestone: 2460
4035 the_tower:
4036 rooms:
4037 First Floor:
4038 panels:
4039 ADULT: 2493
4040 BUTTER: 2495
4041 CALF: 2494
4042 COLLEGE: 2487
4043 CRAM: 2489
4044 CUP: 2490
4045 HER: 2488
4046 IRE: 2492
4047 IRONY: 2491
4048 PROD: 2485
4049 RIDE: 2484
4050 WARM: 2486
4051 ports:
4052 GREAT: 3267
4053 Tower:
4054 panels:
4055 ANNOY (1): 2508
4056 ANNOY (2): 2509
4057 BARE: 2526
4058 BETTER: 2545
4059 CANON: 2527
4060 CONTINENT: 2516
4061 COPYRIGHT: 2515
4062 COY: 2529
4063 CRUST: 2543
4064 Colors: 2546
4065 Context: 2547
4066 DOUGH: 2503
4067 DUCTS: 2528
4068 ENVELOPE: 2537
4069 ENVELOPES: 2539
4070 ERECTS: 2540
4071 EYE: 2518
4072 FISH: 2497
4073 FLEECE: 2506
4074 FLY: 2524
4075 FOOT: 2517
4076 FUEL: 2502
4077 FUND: 2536
4078 GIGGLING: 2510
4079 GRUMPY: 2499
4080 HEAL: 2522
4081 HIDE (1): 2541
4082 HIDE (2): 2544
4083 HUE: 2542
4084 ICE: 2505
4085 LINEAGE: 2498
4086 LIQUID: 2504
4087 LYNX: 2530
4088 MINUSCULE: 2511
4089 MIX (1): 2521
4090 MIX (2): 2525
4091 NEED: 2507
4092 NUCLEUS: 2520
4093 READJUST: 2513
4094 REINDICT: 2514
4095 RHINO: 2496
4096 RIVER: 2519
4097 ROTE: 2538
4098 SCENTS (1): 2531
4099 SCENTS (2): 2532
4100 SCREW: 2523
4101 SEIZE (1): 2533
4102 SEIZE (2): 2534
4103 SLID: 2501
4104 THROWN: 2535
4105 TYPEWRITER: 2512
4106 ZEBRA: 2500
4107 doors:
4108 Fifth Floor Puzzles: 2482
4109 First Floor Door: 2478
4110 First Floor Puzzles: 2477
4111 Fourth Floor Puzzles: 2481
4112 Second Floor Puzzles: 2479
4113 Third Floor Puzzles: 2480
4114 the_tree:
4115 rooms:
4116 Bearer Entrance:
4117 ports:
4118 BEARER: 3268
4119 Main Area:
4120 panels:
4121 COLOR: 2550
4122 DAMAGE (1): 2551
4123 DAMAGE (2): 2552
4124 DRIZZLE: 2561
4125 GOOD (1): 2566
4126 GOOD (2): 2567
4127 GOOD (3): 2568
4128 GROW (1): 2563
4129 GROW (2): 2564
4130 GROW (3): 2565
4131 HAPPY (1): 2570
4132 HAPPY (2): 2571
4133 HAPPY (3): 2572
4134 HOVER: 2569
4135 JUMP (1): 2559
4136 JUMP (2): 2560
4137 LIGHT (1): 2573
4138 LIGHT (2): 2574
4139 LIGHT (3): 2575
4140 MEAL (1): 2553
4141 MEAL (2): 2554
4142 REST: 2557
4143 SLEEP: 2558
4144 SMALL (1): 2576
4145 SMALL (2): 2577
4146 SMALL (3): 2578
4147 SPRINKLE: 2579
4148 WADE: 2562
4149 WALK (1): 2555
4150 WALK (2): 2556
4151 ports:
4152 DAEDALUS: 3272
4153 DIGITAL: 3270
4154 GREAT: 3271
4155 UNKEMPT: 3269
4156 doors:
4157 Control Center Brown Door: 2548
4158 The Tree Gravestone: 2549
4159 the_unkempt:
4160 rooms:
4161 Control Center Entrance:
4162 panels:
4163 RETURN: 2587
4164 ports:
4165 CC: 3273
4166 Daedalus Entrance:
4167 ports:
4168 DAEDALUS: 3274
4169 Exit Room 2:
4170 panels:
4171 DOOR: 2590
4172 FOUR: 2588
4173 MINE: 2589
4174 WINE: 2591
4175 Exit Room 3:
4176 panels:
4177 ENTER: 2592
4178 Main Area:
4179 panels:
4180 AISLE: 2614
4181 CONTRITE: 2604
4182 COUP: 2610
4183 CRUTCH: 2603
4184 DOUBTER: 2608
4185 EYE: 2597
4186 FLEW: 2611
4187 GUILE: 2612
4188 HEFT: 2596
4189 I: 2593
4190 MOON: 2618
4191 MOONLIGHT: 2602
4192 MUCH: 2609
4193 NOON: 2617
4194 PHASE: 2619
4195 QUITE: 2600
4196 ROUTER: 2605
4197 SCALE: 2620
4198 SHY: 2599
4199 SIGHT: 2598
4200 SOON: 2616
4201 SPY: 2594
4202 STOUTER: 2607
4203 SUCH: 2601
4204 THEFT: 2595
4205 TONIGHT: 2606
4206 TRAIL: 2622
4207 WAYS: 2621
4208 WHILE: 2613
4209 ZOO: 2615
4210 keyholders:
4211 I: 2775
4212 ports:
4213 GREAT: 3275
4214 SUNTEMPLE: 3277
4215 TREE: 3276
4216 Middle Room:
4217 panels:
4218 FELLOW: 2624
4219 FIDDLE: 2626
4220 RIDDLE: 2623
4221 YELLOW: 2625
4222 Right Area:
4223 panels:
4224 BEEN: 2642
4225 BLUFF: 2638
4226 COLOR: 2649
4227 CORN: 2635
4228 DIET: 2647
4229 FLOWER: 2633
4230 FORTH: 2645
4231 FOURTH: 2648
4232 INN: 2639
4233 MOURN: 2634
4234 OFF: 2640
4235 OUTDO: 2629
4236 QUIET: 2646
4237 SCOFF: 2643
4238 SCUFF: 2636
4239 SOUR: 2631
4240 TATTOO: 2630
4241 TOUGH: 2644
4242 TOWER: 2627
4243 TROUGH: 2641
4244 UNTRUE: 2632
4245 WARN: 2628
4246 WIN: 2637
4247 Unsymmetry Room:
4248 panels:
4249 ACCEPT: 2660
4250 ACCIDENTAL: 2657
4251 COMPLETE: 2658
4252 CONFUSE: 2653
4253 DISPROVE: 2661
4254 ENROLL: 2659
4255 ENTERTAIN: 2652
4256 IMPARTIAL: 2651
4257 SCRUTINIZE (Cyan): 2663
4258 SCRUTINIZE (Purple): 2662
4259 UNEXPECTED: 2655
4260 UNINTERESTED: 2650
4261 UNIRONIC: 2656
4262 UNLUCKY: 2654
4263 V Keyholder:
4264 keyholders:
4265 V: 2776
4266 W Keyholder:
4267 keyholders:
4268 W: 2774
4269 doors:
4270 Cog Rhino Hug Rug: 2586
4271 Control Center Orange Door: 2582
4272 Control Center Orange Panel: 3362
4273 East Door: 2580
4274 Honor Our Hint: 2585
4275 I Entered: 2845
4276 Let Untrue Tie: 2583
4277 Near Teal Door Panels: 3361
4278 Routine Out Chute: 2584
4279 W2 Room Door: 2581
1774 the_unyielding: 4280 the_unyielding:
1775 rooms: 4281 rooms:
4282 Bearer Entrance:
4283 ports:
4284 BEARER: 3278
1776 Behind Northeast: 4285 Behind Northeast:
1777 panels: 4286 panels:
1778 FIND: 1260 4287 FIND: 1260
@@ -1860,6 +4369,8 @@ maps:
1860 Digital Entrance: 4369 Digital Entrance:
1861 panels: 4370 panels:
1862 ORANGE: 1326 4371 ORANGE: 1326
4372 ports:
4373 DIGITAL: 3279
1863 Directions Room: 4374 Directions Room:
1864 panels: 4375 panels:
1865 ABS: 1327 4376 ABS: 1327
@@ -1941,6 +4452,9 @@ maps:
1941 RAT: 1380 4452 RAT: 1380
1942 SEE: 1377 4453 SEE: 1377
1943 TIC: 1379 4454 TIC: 1379
4455 Nuanced Entrance:
4456 ports:
4457 NUANCED: 3280
1944 Orange Alcove: 4458 Orange Alcove:
1945 panels: 4459 panels:
1946 ON: 1386 4460 ON: 1386
@@ -1948,6 +4462,8 @@ maps:
1948 panels: 4462 panels:
1949 GEE: 1387 4463 GEE: 1387
1950 SEA: 1388 4464 SEA: 1388
4465 ports:
4466 PLAZA: 3281
1951 Red Eyes: 4467 Red Eyes:
1952 panels: 4468 panels:
1953 RED EYES: 1389 4469 RED EYES: 1389
@@ -2008,8 +4524,11 @@ maps:
2008 HEALTH: 1428 4524 HEALTH: 1428
2009 doors: 4525 doors:
2010 Bearer Entrance: 1259 4526 Bearer Entrance: 1259
4527 Blue D Room Puzzles: 3363
2011 Brown Alcove: 1255 4528 Brown Alcove: 1255
4529 Color Hallway Panels: 3364
2012 Digital Entrance: 1257 4530 Digital Entrance: 1257
4531 East Room 1: 2740
2013 East Room 1 Entrance: 1251 4532 East Room 1 Entrance: 1251
2014 Hero Room Entrance: 1252 4533 Hero Room Entrance: 1252
2015 Jay Painting: 1253 4534 Jay Painting: 1253
@@ -2020,6 +4539,74 @@ maps:
2020 Southwest Corner Behind: 1254 4539 Southwest Corner Behind: 1254
2021 Southwest Room: 1431 4540 Southwest Room: 1431
2022 Yellow Room Puzzles: 1250 4541 Yellow Room Puzzles: 1250
4542 the_wise:
4543 rooms:
4544 Entry:
4545 panels:
4546 INK: 2667
4547 Mastery:
4548 masteries:
4549 MASTERY: 2668
4550 Puzzles:
4551 panels:
4552 BATH: 2679
4553 BOTTLE: 2687
4554 CHAOTIC: 2680
4555 DARKNESS: 2677
4556 EARTHWAR: 2685
4557 ERAS: 2676
4558 EYES: 2681
4559 INTELLIGENCE: 2684
4560 OBSCURE: 2674
4561 PASSED: 2671
4562 PRINCE: 2678
4563 PROPHET: 2675
4564 QUEENDOOM: 2682
4565 RHYME: 2673
4566 SHOUTS: 2683
4567 SLEEPER: 2686
4568 SLUMBERING: 2672
4569 STORY: 2669
4570 VENTURE: 2670
4571 WORDS: 2688
4572 doors:
4573 Front Door: 2666
4574 the_wondrous:
4575 rooms:
4576 Entry:
4577 panels:
4578 WONDER: 2690
4579 ports:
4580 DAEDALUS: 3282
4581 Huge:
4582 panels:
4583 BARK: 2695
4584 BRIE: 2693
4585 CHIME: 2697
4586 HARE: 2696
4587 IRE: 2692
4588 LIBRARY: 2698
4589 SHRINK: 2691
4590 WICK: 2694
4591 Regular:
4592 panels:
4593 SHRINK: 2699
4594 doors:
4595 Shrink Door: 2689
4596 the_words:
4597 rooms:
4598 Main Area:
4599 panels:
4600 CLOTHES: 2707
4601 DAIRY: 2704
4602 FLOWER: 2702
4603 FRUIT: 2701
4604 GEM: 2703
4605 METAL: 2706
4606 SPICE: 2708
4607 TREE: 2705
4608 ports:
4609 ENTRY: 3283
2023letters: 4610letters:
2024 a1: 596 4611 a1: 596
2025 a2: 6 4612 a2: 6
@@ -2028,15 +4615,19 @@ letters:
2028 c1: 248 4615 c1: 248
2029 c2: 184 4616 c2: 184
2030 d1: 329 4617 d1: 329
4618 d2: 1762
2031 e1: 395 4619 e1: 395
2032 e2: 736 4620 e2: 736
2033 f1: 868 4621 f1: 868
4622 f2: 1778
2034 g1: 494 4623 g1: 494
2035 g2: 203 4624 g2: 203
2036 h1: 384 4625 h1: 384
2037 h2: 1115 4626 h2: 1115
2038 i1: 385 4627 i1: 385
4628 i2: 1913
2039 j1: 688 4629 j1: 688
4630 j2: 1923
2040 k1: 708 4631 k1: 708
2041 k2: 853 4632 k2: 853
2042 l1: 358 4633 l1: 358
@@ -2046,29 +4637,101 @@ letters:
2046 n1: 386 4637 n1: 386
2047 n2: 788 4638 n2: 788
2048 o1: 802 4639 o1: 802
4640 o2: 1938
2049 p1: 883 4641 p1: 883
2050 p2: 167 4642 p2: 167
2051 q1: 983 4643 q1: 983
2052 q2: 74 4644 q2: 74
2053 r1: 803 4645 r1: 803
4646 r2: 2063
2054 s1: 230 4647 s1: 230
2055 s2: 1202 4648 s2: 1202
2056 t1: 387 4649 t1: 387
4650 t2: 2452
2057 u1: 263 4651 u1: 263
4652 u2: 2140
4653 v1: 2664
4654 v2: 2246
2058 w1: 681 4655 w1: 681
4656 w2: 2665
2059 x1: 394 4657 x1: 394
2060 x2: 1192 4658 x2: 1192
2061 y1: 621 4659 y1: 621
2062 y2: 1249 4660 y2: 1249
2063 z1: 851 4661 z1: 851
4662 z2: 2224
2064endings: 4663endings:
2065 BLACK: 1208 4664 BLACK: 1208
4665 BLUE: 2700
2066 CYAN: 1209 4666 CYAN: 1209
2067 GOLD: 1207 4667 GOLD: 1207
2068 GRAY: 1204 4668 GRAY: 1204
2069 GREEN: 1203 4669 GREEN: 1203
4670 MINT: 2728
4671 ORANGE: 1775
2070 PLUM: 1205 4672 PLUM: 1205
2071 PURPLE: 1211 4673 PURPLE: 1211
4674 RED: 2483
4675 WHITE: 2738
2072 YELLOW: 1206 4676 YELLOW: 1206
2073special: 4677special:
2074 Nothing: 1160 4678 A Job Well Done: 1160
4679 Age Symbol: 2791
4680 Anagram Symbol: 2792
4681 Anti A: 2814
4682 Anti B: 2815
4683 Anti C: 2816
4684 Anti D: 2817
4685 Anti E: 2818
4686 Anti F: 2819
4687 Anti G: 2820
4688 Anti H: 2821
4689 Anti I: 2822
4690 Anti J: 2823
4691 Anti K: 2824
4692 Anti L: 2825
4693 Anti M: 2826
4694 Anti N: 2827
4695 Anti O: 2828
4696 Anti P: 2829
4697 Anti Q: 2830
4698 Anti R: 2831
4699 Anti S: 2832
4700 Anti T: 2833
4701 Anti U: 2834
4702 Anti V: 2835
4703 Anti W: 2836
4704 Anti X: 2837
4705 Anti Y: 2838
4706 Anti Z: 2839
4707 Boxes Symbol: 2793
4708 Cross Symbol: 2794
4709 Eval Symbol: 2795
4710 Example Symbol: 2796
4711 Gender Symbol: 2797
4712 Job Symbol: 2798
4713 Lingo Symbol: 2799
4714 Null Symbol: 2800
4715 Numbers: 3038
4716 Planet Symbol: 2801
4717 Pyramid Symbol: 2802
4718 Question Symbol: 2803
4719 Sound Symbol: 2804
4720 Sparkles Symbol: 2805
4721 Stars Symbol: 2806
4722 Sun Symbol: 2807
4723 Sweet Symbol: 2808
4724 Zero Symbol: 2809
4725progressives:
4726 Icarus Quick Travel: 2933
4727 Progressive Gold Ending: 2753
4728door_groups:
4729 Control Center Blue Doors: 2788
4730 Control Center Brown Doors: 2787
4731 Control Center Orange Doors: 2786
4732 Control Center Purple Doors: 2785
4733 Control Center White Doors: 2784
4734 Cyan Doors: 2789
4735 Lavender Cubes: 2790
4736 The Entry - Repetitive Entrance: 2782
4737 The Repetitive - Plaza Entrance: 2783
diff --git a/data/maps/control_center/connections.txtpb b/data/maps/control_center/connections.txtpb new file mode 100644 index 0000000..432d39d --- /dev/null +++ b/data/maps/control_center/connections.txtpb
@@ -0,0 +1,85 @@
1connections {
2 from_room: "Entry"
3 to_room: "Main Area"
4 door { name: "Front Door" }
5}
6connections {
7 from_room: "Main Area"
8 to_room: "Stormy Entrance"
9 door { name: "Stormy Entrance" }
10}
11connections {
12 from_room: "Entry"
13 to_room: "Hide Room"
14 door { name: "Hidden Door" }
15}
16connections {
17 from_room: "Main Area"
18 to_room: "Mint Ending"
19 door { name: "Mint Ending Door" }
20}
21connections {
22 from_room: "Main Area"
23 to_room: "Entry Entrance"
24 door { name: "X1 Door" }
25}
26connections {
27 from_room: "Main Area"
28 to_room: "Unkempt Entrance"
29 door { name: "Unkempt Door" }
30}
31connections {
32 from_room: "Main Area"
33 to_room: "Partial Entrance"
34 door { name: "Partial Door" }
35}
36connections {
37 from_room: "Main Area"
38 to_room: "White Ending"
39 door { name: "White Ending Door" }
40}
41connections {
42 from_room: "Main Area"
43 to_room: "Repetitive Entrance"
44 door { name: "Repetitive Entrance" }
45}
46connections {
47 from_room: "Main Area"
48 to_room: "Perceptive Entrance"
49 door { name: "Perceptive From Outside" }
50}
51connections {
52 from_room: "Main Area"
53 to_room: "Perceptive Entrance"
54 door { name: "Perceptive From Inside" }
55}
56connections {
57 from_room: "Main Area"
58 to_room: "Ancient Entrance"
59 door { name: "Ancient Entrance" }
60}
61connections {
62 from_room: "Main Area"
63 to_room: "Between Entrance"
64 door { name: "Between Door" }
65}
66connections {
67 from_room: "Main Area"
68 to_room: "Desert Room"
69 door { name: "Desert Door" }
70}
71connections {
72 from_room: "Main Area"
73 to_room: "Shop Entrance"
74 door { name: "Shop Door" }
75}
76connections {
77 from_room: "Main Area"
78 to_room: "Tenacious Entrance"
79 door { name: "Tenacious Door" }
80}
81connections {
82 from_room: "Main Area"
83 to_room: "Unyielding Entrance"
84 door { name: "Unyielding Door" }
85}
diff --git a/data/maps/control_center/doors.txtpb b/data/maps/control_center/doors.txtpb new file mode 100644 index 0000000..bec8714 --- /dev/null +++ b/data/maps/control_center/doors.txtpb
@@ -0,0 +1,180 @@
1doors {
2 name: "Front Door"
3 type: STANDARD
4 receivers: "Components/Doors/entry_1"
5 panels { room: "Entry" name: "HELLO" }
6 location_room: "Entry"
7}
8doors {
9 name: "Stormy Entrance"
10 type: STANDARD
11 receivers: "Components/Doors/entry_13"
12 panels { room: "Hide Room" name: "HIDE" }
13 location_room: "Hide Room"
14}
15doors {
16 name: "Hidden Door"
17 type: EVENT
18 latch: true
19 receivers: "Components/Doors/entry_12"
20 keyholders { room: "Main Area" name: "1" key: "h" }
21 keyholders { room: "Main Area" name: "2" key: "i" }
22 keyholders { room: "Main Area" name: "3" key: "d" }
23 keyholders { room: "Main Area" name: "4" key: "e" }
24}
25doors {
26 name: "Mint Ending Door"
27 type: EVENT
28 keyholders { room: "Main Area" name: "1" key: "e" }
29 keyholders { room: "Main Area" name: "2" key: "x" }
30 keyholders { room: "Main Area" name: "3" key: "i" }
31 keyholders { room: "Main Area" name: "4" key: "t" }
32}
33doors {
34 name: "Relentless Left Door"
35 type: EVENT
36 keyholders { room: "Main Area" name: "1" key: "l" }
37 keyholders { room: "Main Area" name: "2" key: "e" }
38 keyholders { room: "Main Area" name: "3" key: "f" }
39 keyholders { room: "Main Area" name: "4" key: "t" }
40}
41doors {
42 name: "Relentless Shop Door"
43 type: EVENT
44 keyholders { room: "Main Area" name: "1" key: "s" }
45 keyholders { room: "Main Area" name: "2" key: "h" }
46 keyholders { room: "Main Area" name: "3" key: "o" }
47 keyholders { room: "Main Area" name: "4" key: "p" }
48}
49doors {
50 name: "Relentless Turn Door"
51 type: EVENT
52 keyholders { room: "Main Area" name: "1" key: "t" }
53 keyholders { room: "Main Area" name: "2" key: "u" }
54 keyholders { room: "Main Area" name: "3" key: "r" }
55 keyholders { room: "Main Area" name: "4" key: "n" }
56}
57doors {
58 name: "X1 Door"
59 type: STANDARD
60 receivers: "Components/Doors/entry_3"
61 panels { room: "Entry Entrance" name: "ENTRY" }
62 location_room: "Entry Entrance"
63}
64doors {
65 name: "Unkempt Door"
66 type: STANDARD
67 receivers: "Components/Doors/entry_4"
68 panels { room: "Unkempt Entrance" name: "RETURN" }
69 location_room: "Unkempt Entrance"
70}
71doors {
72 name: "Partial Door"
73 type: STANDARD
74 receivers: "Components/Doors/entry_5"
75 panels { room: "Partial Entrance" name: "PARTIAL" }
76 location_room: "Partial Entrance"
77}
78doors {
79 name: "Link Blocker"
80 type: EVENT
81 panels { room: "Unkempt Entrance" name: "RETURN" }
82 panels { room: "Partial Entrance" name: "PARTIAL" }
83 panels { room: "Shop Entrance" name: "HOPS" }
84 panels { room: "Tenacious Entrance" name: "HERO" }
85}
86doors {
87 name: "White Ending Door"
88 type: EVENT
89 white_ending: true
90}
91doors {
92 name: "Repetitive Entrance"
93 type: STANDARD
94 latch: true
95 receivers: "Components/Doors/entry_7"
96 keyholders { room: "Main Area" name: "1" key: "m" }
97 keyholders { room: "Main Area" name: "2" key: "o" }
98 keyholders { room: "Main Area" name: "3" key: "r" }
99 keyholders { room: "Main Area" name: "4" key: "e" }
100 location_room: "Main Area"
101 location_name: "Keyword MORE"
102}
103doors {
104 name: "Perceptive From Outside"
105 type: STANDARD
106 latch: true
107 receivers: "Components/Doors/entry_26"
108 keyholders { room: "Main Area" name: "1" key: "p" }
109 keyholders { room: "Main Area" name: "2" key: "a" }
110 keyholders { room: "Main Area" name: "3" key: "r" }
111 keyholders { room: "Main Area" name: "4" key: "t" }
112 location_room: "Main Area"
113 location_name: "Keyword PART"
114}
115doors {
116 name: "Perceptive From Inside"
117 type: LOCATION_ONLY
118 panels { room: "Perceptive Entrance" name: "PART" }
119 location_room: "Perceptive Entrance"
120}
121doors {
122 name: "Ancient Entrance"
123 type: STANDARD
124 latch: true
125 receivers: "Components/Doors/entry_20"
126 keyholders { room: "Main Area" name: "1" key: "z" }
127 keyholders { room: "Main Area" name: "2" key: "e" }
128 keyholders { room: "Main Area" name: "3" key: "r" }
129 keyholders { room: "Main Area" name: "4" key: "o" }
130 location_room: "Main Area"
131 location_name: "Keyword ZERO"
132}
133doors {
134 name: "Between Door"
135 type: STANDARD
136 receivers: "Components/Doors/entry_8"
137 panels { room: "Between Entrance" name: "RIGHT" }
138 location_room: "Between Entrance"
139}
140doors {
141 name: "Desert Door"
142 type: STANDARD
143 receivers: "Components/Doors/entry_9"
144 panels { room: "Desert Room" name: "LESS" }
145 location_room: "Desert Room"
146}
147doors {
148 name: "Shop Door"
149 type: STANDARD
150 receivers: "Components/Doors/entry_23"
151 panels { room: "Shop Entrance" name: "HOPS" }
152 location_room: "Shop Entrance"
153}
154doors {
155 name: "Tenacious Door"
156 type: STANDARD
157 receivers: "Components/Doors/entry_24"
158 panels { room: "Tenacious Entrance" name: "HERO" }
159 location_room: "Tenacious Entrance"
160}
161doors {
162 name: "Unyielding Door"
163 type: STANDARD
164 receivers: "Components/Doors/entry_11"
165 panels { room: "Unyielding Entrance" name: "SEEK" }
166 location_room: "Unyielding Entrance"
167}
168doors {
169 name: "Near Perceptive Panel"
170 type: LOCATION_ONLY
171 panels { room: "Perceptive Entrance" name: "COLORS" }
172 location_room: "Perceptive Entrance"
173 location_name: "COLORS"
174}
175doors {
176 name: "Letters Panel"
177 type: LOCATION_ONLY
178 panels { room: "Main Area" name: "Letters" }
179 location_room: "Main Area"
180}
diff --git a/data/maps/control_center/metadata.txtpb b/data/maps/control_center/metadata.txtpb new file mode 100644 index 0000000..bf89670 --- /dev/null +++ b/data/maps/control_center/metadata.txtpb
@@ -0,0 +1 @@
display_name: "Control Center"
diff --git a/data/maps/control_center/rooms/Ancient Entrance.txtpb b/data/maps/control_center/rooms/Ancient Entrance.txtpb new file mode 100644 index 0000000..dc018ba --- /dev/null +++ b/data/maps/control_center/rooms/Ancient Entrance.txtpb
@@ -0,0 +1,12 @@
1name: "Ancient Entrance"
2ports {
3 name: "ANCIENT"
4 display_name: "Ancient Entrance"
5 path: "Components/Warps/worldport8"
6 destination { x: -27 y: 0 z: -34 }
7 rotation: 90
8 # This is because there's no port on the other side of the connection, so if
9 # this connection was removed and gallery paintings aren't shuffled then
10 # there'd be no way into The Ancient.
11 no_shuffle: true
12}
diff --git a/data/maps/control_center/rooms/Between Entrance.txtpb b/data/maps/control_center/rooms/Between Entrance.txtpb new file mode 100644 index 0000000..9da5344 --- /dev/null +++ b/data/maps/control_center/rooms/Between Entrance.txtpb
@@ -0,0 +1,15 @@
1name: "Between Entrance"
2panels {
3 name: "RIGHT"
4 path: "Panels/Hallway Right/entry_4"
5 clue: "right"
6 answer: "left"
7 symbols: SUN
8}
9ports {
10 name: "BETWEEN"
11 display_name: "Between Connector"
12 path: "Components/Warps/worldport5"
13 destination { x: 39 y: 0 z: -17 }
14 rotation: 270
15}
diff --git a/data/maps/control_center/rooms/Desert Room.txtpb b/data/maps/control_center/rooms/Desert Room.txtpb new file mode 100644 index 0000000..fb24faf --- /dev/null +++ b/data/maps/control_center/rooms/Desert Room.txtpb
@@ -0,0 +1,8 @@
1name: "Desert Room"
2panels {
3 name: "LESS"
4 path: "Panels/Hallway Right/entry_5"
5 clue: "less"
6 answer: "more"
7 symbols: SUN
8}
diff --git a/data/maps/control_center/rooms/Entry Entrance.txtpb b/data/maps/control_center/rooms/Entry Entrance.txtpb new file mode 100644 index 0000000..ad882f5 --- /dev/null +++ b/data/maps/control_center/rooms/Entry Entrance.txtpb
@@ -0,0 +1,15 @@
1name: "Entry Entrance"
2panels {
3 name: "ENTRY"
4 path: "Panels/Hallway Right/entry_3"
5 clue: "entry"
6 answer: "exit"
7 symbols: SUN
8}
9ports {
10 name: "ENTRY"
11 display_name: "Entry Connector"
12 path: "Components/Warps/worldport2"
13 destination { x: 26 y: 0 z: -16.5 }
14 rotation: 0
15}
diff --git a/data/maps/control_center/rooms/Entry.txtpb b/data/maps/control_center/rooms/Entry.txtpb new file mode 100644 index 0000000..09c21aa --- /dev/null +++ b/data/maps/control_center/rooms/Entry.txtpb
@@ -0,0 +1,15 @@
1name: "Entry"
2panels {
3 name: "HELLO"
4 path: "Panels/Doors/entry_1"
5 clue: "hello"
6 answer: "hi"
7 symbols: SUN
8}
9ports {
10 name: "GREAT"
11 display_name: "Main Entrance"
12 path: "Components/Warps/worldport"
13 destination { x: 0 y: 0 z: -1.5 }
14 rotation: 0
15}
diff --git a/data/maps/control_center/rooms/Hide Room.txtpb b/data/maps/control_center/rooms/Hide Room.txtpb new file mode 100644 index 0000000..826293b --- /dev/null +++ b/data/maps/control_center/rooms/Hide Room.txtpb
@@ -0,0 +1,8 @@
1name: "Hide Room"
2panels {
3 name: "HIDE"
4 path: "Panels/Doors/entry_4"
5 clue: "hide"
6 answer: "unmask"
7 symbols: SUN
8}
diff --git a/data/maps/control_center/rooms/Main Area.txtpb b/data/maps/control_center/rooms/Main Area.txtpb new file mode 100644 index 0000000..2c1e418 --- /dev/null +++ b/data/maps/control_center/rooms/Main Area.txtpb
@@ -0,0 +1,81 @@
1name: "Main Area"
2panels {
3 name: "COLOR"
4 path: "Panels/Doors/entry_2"
5 clue: "color"
6 answer: "red"
7 proxies { answer: "red" path: "Panels/Colors/color_1" }
8 proxies { answer: "blue" path: "Panels/Colors/color_2" }
9 proxies { answer: "green" path: "Panels/Colors/color_3" }
10 proxies { answer: "yellow" path: "Panels/Colors/color_4" }
11 proxies { answer: "white" path: "Panels/Colors/color_5" }
12 proxies { answer: "black" path: "Panels/Colors/color_6" }
13 proxies { answer: "orange" path: "Panels/Colors/color_7" }
14 proxies { answer: "purple" path: "Panels/Colors/color_8" }
15 proxies { answer: "brown" path: "Panels/Colors/color_9" }
16 proxies { answer: "silver" path: "Panels/Colors/color_10" }
17 proxies { answer: "gold" path: "Panels/Colors/color_11" }
18 proxies { answer: "brass" path: "Panels/Colors/color_12" }
19 proxies { answer: "gray" path: "Panels/Colors/color_13" }
20 proxies { answer: "magenta" path: "Panels/Colors/color_14" }
21}
22panels {
23 name: "Letters"
24 path: "Panels/Doors/entry_6"
25 clue: ""
26 answer: "link"
27 symbols: LINGO
28 required_door { name: "Link Blocker" }
29}
30keyholders {
31 name: "1"
32 path: "Components/KeyHolders/keyHolder"
33 key: "z"
34}
35keyholders {
36 name: "2"
37 path: "Components/KeyHolders/keyHolder2"
38 key: "e"
39}
40keyholders {
41 name: "3"
42 path: "Components/KeyHolders/keyHolder3"
43 key: "r"
44}
45keyholders {
46 name: "4"
47 path: "Components/KeyHolders/keyHolder4"
48 key: "o"
49}
50ports {
51 name: "RIGHT"
52 display_name: "Hinterlands South Entrance"
53 path: "Components/Warps/worldport6"
54 destination { x: 82 y: 0 z: -10 }
55 rotation: 90
56}
57ports {
58 name: "LEFT"
59 display_name: "Hinterlands North Entrance"
60 path: "Components/Warps/worldport7"
61 destination { x: 82 y: 0 z: -48 }
62 rotation: 90
63}
64ports {
65 name: "RELENTLESS_LEFT"
66 display_name: "Relentless LEFT Entrance"
67 path: "Components/Warps/worldport9"
68 no_shuffle: true
69}
70ports {
71 name: "RELENTLESS_SHOP"
72 display_name: "Relentless SHOP Entrance"
73 path: "Components/Warps/worldport11"
74 no_shuffle: true
75}
76ports {
77 name: "RELENTLESS_TURN"
78 display_name: "Relentless TURN Entrance"
79 path: "Components/Warps/worldport10"
80 no_shuffle: true
81}
diff --git a/data/maps/control_center/rooms/Mint Ending.txtpb b/data/maps/control_center/rooms/Mint Ending.txtpb new file mode 100644 index 0000000..7ff9fc4 --- /dev/null +++ b/data/maps/control_center/rooms/Mint Ending.txtpb
@@ -0,0 +1,5 @@
1name: "Mint Ending"
2endings {
3 name: "MINT"
4 path: "Components/Endings/mint_ending"
5}
diff --git a/data/maps/control_center/rooms/Partial Entrance.txtpb b/data/maps/control_center/rooms/Partial Entrance.txtpb new file mode 100644 index 0000000..de5d91a --- /dev/null +++ b/data/maps/control_center/rooms/Partial Entrance.txtpb
@@ -0,0 +1,15 @@
1name: "Partial Entrance"
2panels {
3 name: "PARTIAL"
4 path: "Panels/Hallway Left/entry_5"
5 clue: "partial"
6 answer: "part"
7 symbols: SPARKLES
8}
9ports {
10 name: "PARTIAL"
11 display_name: "Partial Connector"
12 path: "Components/Warps/worldport4"
13 destination { x: 21 y: 0 z: -41 }
14 rotation: 270
15}
diff --git a/data/maps/control_center/rooms/Perceptive Entrance.txtpb b/data/maps/control_center/rooms/Perceptive Entrance.txtpb new file mode 100644 index 0000000..99b100b --- /dev/null +++ b/data/maps/control_center/rooms/Perceptive Entrance.txtpb
@@ -0,0 +1,23 @@
1name: "Perceptive Entrance"
2panels {
3 name: "PART"
4 path: "Panels/Doors/stormyPanel2"
5 clue: "part"
6 answer: "hole"
7 symbols: SUN
8 symbols: ZERO
9}
10panels {
11 name: "COLORS"
12 path: "Panels/Doors/stormyPanel3"
13 clue: "colors"
14 answer: "hues"
15 symbols: SUN
16}
17ports {
18 name: "PERCEPTIVE"
19 display_name: "Perceptive Entrance"
20 path: "Components/Warps/worldport12"
21 destination { x: -23 y: 0 z: -11 }
22 rotation: 0
23}
diff --git a/data/maps/control_center/rooms/Repetitive Entrance.txtpb b/data/maps/control_center/rooms/Repetitive Entrance.txtpb new file mode 100644 index 0000000..0767e2c --- /dev/null +++ b/data/maps/control_center/rooms/Repetitive Entrance.txtpb
@@ -0,0 +1,8 @@
1name: "Repetitive Entrance"
2ports {
3 name: "REPETITIVE"
4 display_name: "Repetitive Entrance"
5 path: "Components/Warps/worldport14"
6 destination { x: -16 y: 0 z: -17.5 }
7 rotation: 0
8}
diff --git a/data/maps/control_center/rooms/Shop Entrance.txtpb b/data/maps/control_center/rooms/Shop Entrance.txtpb new file mode 100644 index 0000000..154c55b --- /dev/null +++ b/data/maps/control_center/rooms/Shop Entrance.txtpb
@@ -0,0 +1,9 @@
1name: "Shop Entrance"
2# The connection to The Shop isn't a worldport.
3panels {
4 name: "HOPS"
5 path: "Panels/Hallway Left/entry_6"
6 clue: "hops"
7 answer: "shop"
8 symbols: ANAGRAM
9}
diff --git a/data/maps/control_center/rooms/Stormy Entrance.txtpb b/data/maps/control_center/rooms/Stormy Entrance.txtpb new file mode 100644 index 0000000..23e48b5 --- /dev/null +++ b/data/maps/control_center/rooms/Stormy Entrance.txtpb
@@ -0,0 +1,8 @@
1name: "Stormy Entrance"
2panels {
3 name: "TURN"
4 path: "Components/Warps/stormyPanel"
5 clue: "turn"
6 answer: "spin"
7 symbols: SUN
8}
diff --git a/data/maps/control_center/rooms/Tenacious Entrance.txtpb b/data/maps/control_center/rooms/Tenacious Entrance.txtpb new file mode 100644 index 0000000..093e4fc --- /dev/null +++ b/data/maps/control_center/rooms/Tenacious Entrance.txtpb
@@ -0,0 +1,15 @@
1name: "Tenacious Entrance"
2panels {
3 name: "HERO"
4 path: "Panels/Hallway Left/entry_7"
5 clue: "hero"
6 answer: "zero"
7 symbols: ZERO
8}
9ports {
10 name: "TENACIOUS"
11 display_name: "Tenacious Connector"
12 path: "Components/Warps/worldport13"
13 destination { x: 56 y: 0 z: -38 }
14 rotation: 180
15}
diff --git a/data/maps/control_center/rooms/Unkempt Entrance.txtpb b/data/maps/control_center/rooms/Unkempt Entrance.txtpb new file mode 100644 index 0000000..a89cceb --- /dev/null +++ b/data/maps/control_center/rooms/Unkempt Entrance.txtpb
@@ -0,0 +1,15 @@
1name: "Unkempt Entrance"
2panels {
3 name: "RETURN"
4 path: "Panels/Hallway Left/entry_4"
5 clue: "return"
6 answer: "turn"
7 symbols: SPARKLES
8}
9ports {
10 name: "UNKEMPT"
11 display_name: "Unkempt Connector"
12 path: "Components/Warps/worldport3"
13 destination { x: 34 y: 0 z: -38.5 }
14 rotation: 90
15}
diff --git a/data/maps/control_center/rooms/Unyielding Entrance.txtpb b/data/maps/control_center/rooms/Unyielding Entrance.txtpb new file mode 100644 index 0000000..ca22b23 --- /dev/null +++ b/data/maps/control_center/rooms/Unyielding Entrance.txtpb
@@ -0,0 +1,15 @@
1name: "Unyielding Entrance"
2panels {
3 name: "FORTH"
4 path: "Components/UnlockListeners/panelPorter"
5 clue: "forth"
6 answer: "back"
7 symbols: SUN
8}
9panels {
10 name: "SEEK"
11 path: "Panels/Hallway Right/entry_6"
12 clue: "seek"
13 answer: "hide"
14 symbols: SUN
15}
diff --git a/data/maps/control_center/rooms/White Ending.txtpb b/data/maps/control_center/rooms/White Ending.txtpb new file mode 100644 index 0000000..62d4a56 --- /dev/null +++ b/data/maps/control_center/rooms/White Ending.txtpb
@@ -0,0 +1,5 @@
1name: "White Ending"
2endings {
3 name: "WHITE"
4 path: "Components/Endings/white_ending"
5}
diff --git a/data/maps/daedalus/connections.txtpb b/data/maps/daedalus/connections.txtpb new file mode 100644 index 0000000..cb27c38 --- /dev/null +++ b/data/maps/daedalus/connections.txtpb
@@ -0,0 +1,1876 @@
1connections {
2 from_room: "Rainbow Color Doors"
3 to_room: "Red Color Door"
4}
5connections {
6 from_room: "Rainbow Color Doors"
7 to_room: "Yellow Color Door"
8}
9connections {
10 from_room: "Rainbow Color Doors"
11 to_room: "Green Color Door"
12}
13connections {
14 from_room: "Rainbow Color Doors"
15 to_room: "Gray Color Door"
16}
17connections {
18 from_room: "Rainbow Color Backside"
19 to_room: "Rainbow Color Doors"
20 oneway: true
21}
22connections {
23 from_room: "Yellow Color Backside"
24 to_room: "Yellow Color Door"
25 oneway: true
26}
27connections {
28 from_room: "Gray Color Backside"
29 to_room: "Gray Color Door"
30 oneway: true
31}
32connections {
33 from_room: "Rainbow Color Doors"
34 to_room: "Welcome Back Area"
35 oneway: true
36}
37connections {
38 from_room: "Outside Hedges"
39 to_room: "Green Color Door"
40 oneway: true
41}
42connections {
43 from_room: "Computer Room Seal"
44 to_room: "Welcome Back Area"
45 oneway: true
46}
47connections {
48 from_room: "Outside Hedges"
49 to_room: "Welcome Back Area"
50 oneway: true
51}
52connections {
53 from_room: "Eye Temple 2F"
54 to_room: "Eye Temple 1F"
55 oneway: true
56}
57connections {
58 from_room: "Eye Temple 2F Side"
59 to_room: "Eye Temple 1F Side"
60 oneway: true
61}
62connections {
63 from_room: "I2 Room"
64 to_room: "Eye Temple 1F"
65 oneway: true
66}
67connections {
68 from_room: "West Spire"
69 to_room: "Purple Room South"
70 oneway: true
71}
72connections {
73 from_room: "Blue Hallway Cut Side"
74 to_room: "Blue Hallway"
75 oneway: true
76}
77connections {
78 from_room: "West Castle Area"
79 to_room: "Outside Snake Room"
80 oneway: true
81}
82connections {
83 from_room: "Amber North 2"
84 to_room: "Outside Snake Room"
85 oneway: true
86}
87connections {
88 from_room: "Z2 Room"
89 to_room: "Welcome Back Area"
90 oneway: true
91}
92connections {
93 from_room: "Blue Hallway Tall Side"
94 to_room: "Blue Hallway"
95 oneway: true
96}
97connections {
98 from_room: "Blue Hallway Tall Side"
99 to_room: "Outside House"
100 oneway: true
101}
102connections {
103 from_room: "Outside House"
104 to_room: "Blue Hallway Tall Side"
105 door { name: "House Side Door" }
106}
107connections {
108 from_room: "Purple SE Vestibule"
109 to_room: "Welcome Back Area"
110 oneway: true
111}
112connections {
113 from_room: "Godot Room"
114 to_room: "Welcome Back Area"
115 oneway: true
116}
117connections {
118 from_room: "Roof"
119 to_room: "Moat"
120 oneway: true
121}
122connections {
123 from_room: "Ending"
124 to_room: "Roof"
125 oneway: true
126}
127connections {
128 from_room: "Purple Room South"
129 to_room: "Flip Painting Hidden Panel"
130 oneway: true
131}
132connections {
133 from_room: "Flip Painting Destination"
134 to_room: "Flip Painting Hidden Panel"
135 oneway: true
136}
137connections {
138 from_room: "Pains Room"
139 to_room: "Purple Room South"
140 oneway: true
141}
142connections {
143 from_room: "Starting Room"
144 to_room: "Purple Room South"
145 door { name: "Starting Room North Wall Center Door" }
146}
147connections {
148 from_room: "Starting Room"
149 to_room: "Welcome Back Exit"
150 door { name: "Starting Room West Wall South Door" }
151}
152connections {
153 from_room: "Welcome Back Area"
154 to_room: "West Spire"
155 door { name: "Welcome Back Secret Door" }
156}
157connections {
158 from_room: "Welcome Back Area"
159 to_room: "Welcome Back Exit"
160 door { name: "Welcome Back Door" }
161}
162connections {
163 from_room: "Starting Room"
164 to_room: "Entry Shortcut"
165 door { name: "Starting Room West Wall Center Door" }
166}
167connections {
168 from_room: "Entry Shortcut"
169 to_room: "West Spire"
170 door { name: "Entry Shortcut Secret Exit" }
171}
172connections {
173 from_room: "Starting Room"
174 to_room: "West Spire"
175 door { name: "Starting Room West Wall North Door" }
176}
177connections {
178 from_room: "Starting Room"
179 to_room: "Nursery"
180 door { name: "Starting Room East Wall Center Door" }
181}
182connections {
183 from_room: "Starting Room"
184 to_room: "Rainbow Color Backside"
185 door { name: "Starting Room East Wall North Door" }
186}
187connections {
188 from_room: "Starting Room"
189 to_room: "Number Paintings Area"
190 door { name: "Starting Room North Wall West Door" }
191}
192connections {
193 from_room: "Starting Room"
194 to_room: "Yellow Color Door"
195 door { name: "Starting Room North Wall East Door" }
196}
197connections {
198 from_room: "Starting Room"
199 to_room: "Gallery Entrance"
200 door { name: "Starting Room South Wall East Door" }
201}
202connections {
203 from_room: "Outside Eye Temple"
204 to_room: "Eye Temple 1F"
205 door { name: "Temple of the Eyes Entrance" }
206}
207connections {
208 from_room: "Eye Painting"
209 to_room: "Starting Room"
210 door { name: "Starting Room South Wall West Door" }
211}
212connections {
213 from_room: "Eye Painting"
214 to_room: "Outside Eye Temple"
215 door { name: "Eye Painting Exit" }
216}
217connections {
218 from_room: "Outside Pyramid"
219 to_room: "Number Paintings Area"
220 door { name: "Near Pyramid Gate" }
221}
222connections {
223 from_room: "Black Hex"
224 to_room: "Post Orange Smiley Three Way"
225 door { name: "Black Hexes Door" }
226}
227connections {
228 from_room: "West Castle Area"
229 to_room: "Post Orange Smiley Three Way"
230 door { name: "Splintering Exit North Door" }
231}
232connections {
233 from_room: "West Castle Area"
234 to_room: "Amber North 2"
235 door { name: "Splintering Exit South Door" }
236}
237connections {
238 from_room: "Z2 Room"
239 to_room: "After Bee Room"
240 door { name: "Z2 Room Back Exit" }
241}
242connections {
243 from_room: "Z2 Room"
244 to_room: "Z2 Prize"
245 door { name: "Z2 Prize" }
246}
247connections {
248 from_room: "Yellow Color Door"
249 to_room: "Coin Tower"
250 door { name: "Coin Tower Part 1" }
251}
252connections {
253 from_room: "Coin Tower"
254 to_room: "Purple Smiley"
255 door { name: "Coin Tower Part 2" }
256}
257connections {
258 from_room: "Purple SE Vestibule"
259 to_room: "Purple Room South"
260 door { name: "Purple SE Vestibule" }
261}
262connections {
263 from_room: "Purple NW Vestibule"
264 to_room: "Outside House"
265 door { name: "Purple NW Vestibule" }
266}
267connections {
268 from_room: "Purple Room West"
269 to_room: "Purple NW Vestibule"
270 door { name: "Purple West Area North Door" }
271}
272connections {
273 from_room: "Purple Room West"
274 to_room: "Purple SW Vestibule"
275 door { name: "Purple West Area South Door" }
276}
277connections {
278 from_room: "Purple SW Vestibule"
279 to_room: "Godot Room"
280 door { name: "Godot Room Entrance" }
281}
282connections {
283 from_room: "Godot Room"
284 to_room: "Purple NW Vestibule"
285 door { name: "Godot Room Exit" }
286}
287connections {
288 from_room: "After Bee Room"
289 to_room: "Beehalls Intersection"
290 door { name: "Beehalls Intersection" }
291}
292connections {
293 from_room: "Outside House"
294 to_room: "Beehalls Intersection"
295 door { name: "Beehalls Intersection" }
296}
297connections {
298 from_room: "Purple NW Vestibule"
299 to_room: "Beehalls Intersection"
300 door { name: "Beehalls Intersection" }
301}
302connections {
303 from_room: "Godot Room"
304 to_room: "Purple Room West"
305 door { name: "Purple West Area West Door" }
306}
307connections {
308 from_room: "Purple SE Vestibule"
309 to_room: "Purple Room East"
310 door { name: "Purple East Area South Door" }
311}
312connections {
313 from_room: "Outside House"
314 to_room: "Purple Room East"
315 door { name: "Purple East Area North Door" }
316}
317connections {
318 from_room: "Outside House"
319 to_room: "Purple Room"
320 door { name: "Purple Room North Entrance" }
321}
322connections {
323 from_room: "Purple Room West"
324 to_room: "Purple Room"
325 door { name: "Purple Room West Entrance" }
326}
327connections {
328 from_room: "Purple Room East"
329 to_room: "Purple Room"
330 door { name: "Purple Room East Entrance" }
331}
332connections {
333 from_room: "Purple Room South"
334 to_room: "Purple Room"
335 door { name: "Purple Room South Entrance" }
336}
337connections {
338 from_room: "Purple Room South"
339 to_room: "Purple SW Vestibule"
340 door { name: "Purple SW Vestibule" }
341}
342connections {
343 from_room: "Hedges"
344 to_room: "Hedges Tower"
345 door { name: "Hedges Tower" }
346}
347connections {
348 from_room: "Purple Room South"
349 to_room: "Rainbow Color Doors"
350 door { name: "Near Flip Painting Door" }
351}
352connections {
353 from_room: "Flip Painting Destination"
354 to_room: "Rainbow Color Backside"
355 door { name: "Near Flip Painting Door" }
356 oneway: true
357}
358connections {
359 from_room: "Globe Room"
360 to_room: "Outside Hotel"
361 door { name: "Southwest Area Intersection" }
362}
363connections {
364 from_room: "Globe Room"
365 to_room: "Outside Snake Room"
366 door { name: "Southwest Area Intersection" }
367}
368connections {
369 from_room: "Globe Room"
370 to_room: "Outside Salt Room"
371 door { name: "Southwest Area Intersection" }
372}
373connections {
374 from_room: "Moat"
375 to_room: "Blue Room"
376 door { name: "Blue Room Entrance" }
377}
378connections {
379 from_room: "O2 Room"
380 to_room: "O2 Prize"
381 door { name: "O2 Prize" }
382}
383connections {
384 from_room: "O2 Room"
385 to_room: "Blue Smiley"
386 door { name: "O2 Room Southeast Door" }
387}
388connections {
389 from_room: "O2 Room"
390 to_room: "Composite Room NE"
391 door { name: "Composite Room NE Entrance" }
392}
393connections {
394 from_room: "Composite Room NE"
395 to_room: "Composite Room S"
396 door { name: "Composite Room East Door" }
397}
398connections {
399 from_room: "Composite Room NE"
400 to_room: "Composite Room NW"
401 door { name: "Composite Room North Door" }
402}
403connections {
404 from_room: "Composite Room S"
405 to_room: "Composite Room NW"
406 door { name: "Composite Room West Door" }
407}
408connections {
409 from_room: "Red Color Door"
410 to_room: "Composite Room NW"
411 door { name: "Composite Room NW Entrance" }
412}
413connections {
414 from_room: "O2 Room"
415 to_room: "Blue Hallway"
416 door { name: "O2 Room Northeast Door" }
417}
418connections {
419 from_room: "O2 Room"
420 to_room: "Unkempt Entrance"
421 door { name: "Control Center Orange Door" }
422}
423connections {
424 from_room: "F2 Room"
425 to_room: "F2 Prize"
426 door { name: "F2 Prize" }
427}
428connections {
429 from_room: "Sweet Foyer"
430 to_room: "F2 Room"
431 door { name: "F2 Room Southeast Door" }
432}
433connections {
434 from_room: "Globe Room"
435 to_room: "White Hallway From Entry"
436 door { name: "White Hallway From Entry" }
437}
438connections {
439 from_room: "Sweet Foyer"
440 to_room: "Purple Hallway From Great"
441 door { name: "Purple Hallway From Great" }
442}
443connections {
444 from_room: "F2 Room"
445 to_room: "Blue Hallway"
446 door { name: "F2 Room Southwest Door" }
447}
448connections {
449 from_room: "F2 Room"
450 to_room: "Outside Salt Room"
451 door { name: "F2 Room Northwest Door" }
452}
453connections {
454 from_room: "F2 Room"
455 to_room: "Red Color Door"
456 door { name: "F2 Room West Door" }
457 oneway: true
458 # This is the red backside, which has nothing in it. Maybe could be its own
459 # region at some point.
460}
461connections {
462 from_room: "U2 Room"
463 to_room: "U2 Prize"
464 door { name: "U2 Prize" }
465}
466connections {
467 from_room: "U2 Room"
468 to_room: "Maze Paintings Area"
469 door { name: "U2 Room Southeast Door" }
470}
471connections {
472 from_room: "Maze Paintings Area"
473 to_room: "Rainbow Color Doors"
474 door { name: "Blue Foyer Door" }
475}
476connections {
477 from_room: "Outside House"
478 to_room: "House"
479 door { name: "House Entrance" }
480}
481connections {
482 from_room: "U2 Room"
483 to_room: "Purple SE Vestibule"
484 door { name: "U2 Room Southwest Door" }
485}
486connections {
487 from_room: "U2 Room"
488 to_room: "Purple Room East"
489 door { name: "U2 Room West Door" }
490}
491connections {
492 from_room: "Maze"
493 to_room: "U2 Room"
494 door { name: "U2 Room East Door" }
495}
496connections {
497 from_room: "Outside Magic Room"
498 to_room: "Magic Room"
499 door { name: "Magic Room Entrance" }
500}
501connections {
502 from_room: "Maze"
503 to_room: "Outside Magic Room"
504 door { name: "Maze East Door" }
505}
506connections {
507 from_room: "Maze"
508 to_room: "Outside House"
509 door { name: "Maze North Door" }
510}
511connections {
512 from_room: "Maze"
513 to_room: "Maze Paintings Area"
514 door { name: "Maze South Door" }
515}
516connections {
517 from_room: "Wonderland"
518 to_room: "Black Hex"
519 door { name: "Wonderland South Door" }
520}
521connections {
522 from_room: "Outside Pyramid"
523 to_room: "Pyramid Entry"
524 door { name: "Pyramid Entrance" }
525}
526connections {
527 from_room: "Z2 Room"
528 to_room: "Black Hex"
529 door { name: "Z2 Room Southwest Door" }
530}
531connections {
532 from_room: "Z2 Room"
533 to_room: "Number Paintings Area"
534 door { name: "Z2 Room Northwest Door" }
535}
536connections {
537 from_room: "Z2 Room"
538 to_room: "Rainbow Color Doors"
539 door { name: "Z2 Room Northeast Door" }
540}
541connections {
542 from_room: "Z2 Room"
543 to_room: "Orange Room Hallway"
544 door { name: "Z2 Room Southeast Door" }
545}
546connections {
547 from_room: "Orange Room Hallway"
548 to_room: "Orange Room"
549 door { name: "Z2 Room Southeast Door" }
550}
551connections {
552 from_room: "Outside Orange Room"
553 to_room: "Orange Room"
554 door { name: "Orange Room Entrance" }
555}
556connections {
557 from_room: "Outside Hedges"
558 to_room: "Hedges"
559 door { name: "Hedges Entrance" }
560}
561connections {
562 from_room: "Outside Snake Room"
563 to_room: "West Castle Area"
564 door { name: "Amber South Door" }
565}
566connections {
567 from_room: "Outside Snake Room"
568 to_room: "Amber North 2"
569 door { name: "Amber North Door" }
570}
571connections {
572 from_room: "Outside Snake Room"
573 to_room: "West Castle Area"
574 door { name: "Amber East Doors" }
575}
576connections {
577 from_room: "Purple Room South"
578 to_room: "Pains Room"
579 door { name: "Pains Room Divider" }
580}
581connections {
582 from_room: "Purple Room South"
583 to_room: "West Spire"
584 door { name: "Planet Room Divider" }
585}
586connections {
587 from_room: "Snake Room"
588 to_room: "Outside Snake Room"
589 door { name: "Snake Room Entrance" }
590}
591connections {
592 from_room: "Outside Snake Room"
593 to_room: "West Spire"
594 door { name: "Checkered Door" }
595}
596connections {
597 from_room: "Outside Snake Room"
598 to_room: "J2 Vestibule"
599 door { name: "J2 Door 1" }
600}
601connections {
602 from_room: "J2 Vestibule"
603 to_room: "J2 Room"
604 door { name: "J2 Door 2" }
605}
606connections {
607 from_room: "Wonderland"
608 to_room: "Number Paintings Area"
609 door { name: "Wonderland North Door" }
610}
611connections {
612 from_room: "Outside House"
613 to_room: "Bee Room Obverse"
614 door { name: "Bee Room Entrance" }
615}
616connections {
617 from_room: "Outside House"
618 to_room: "Intense Room"
619 door { name: "Intense Room Entrance" }
620}
621connections {
622 from_room: "Intense Room"
623 to_room: "D2 Room"
624 door { name: "D2 Room" }
625}
626connections {
627 from_room: "Bee Room Obverse"
628 to_room: "After Bee Room"
629 door { name: "Bee Room Back Door" }
630}
631connections {
632 from_room: "Outside Hedges"
633 to_room: "Green Color Door"
634 door { name: "Gourd Door" }
635}
636connections {
637 from_room: "Roof"
638 to_room: "Castle"
639 door { name: "Castle Drawbridge" }
640}
641connections {
642 from_room: "Rainbow Color Doors"
643 to_room: "Roof"
644 door { name: "Roof Access" }
645}
646connections {
647 from_room: "Roof"
648 to_room: "Rainbow Color Doors"
649 oneway: true
650}
651connections {
652 from_room: "Outside Snake Room"
653 to_room: "Pairs Room"
654 door { name: "Pairs Room North And South Doors" }
655}
656connections {
657 from_room: "West Castle Area"
658 to_room: "Pairs Room"
659 door { name: "Pairs Room West Door" }
660}
661connections {
662 from_room: "West Spire"
663 to_room: "Pairs Room"
664 door { name: "Pairs Room East Door" }
665}
666connections {
667 from_room: "Outside Salt Room"
668 to_room: "Salt Room"
669 door { name: "Salt Room Entrance" }
670}
671connections {
672 from_room: "Tree Entrance"
673 to_room: "Rainbow Start"
674 door { name: "Rainbow Rooms Entrance" }
675}
676connections {
677 from_room: "Rainbow Start"
678 to_room: "Rainbow Red"
679 door { name: "Red Rainbow Room" }
680}
681connections {
682 from_room: "Rainbow Red"
683 to_room: "Rainbow Orange"
684 door { name: "Orange Rainbow Room" }
685}
686connections {
687 from_room: "Rainbow Orange"
688 to_room: "Rainbow Yellow"
689 door { name: "Yellow Rainbow Room" }
690}
691connections {
692 from_room: "Rainbow Yellow"
693 to_room: "Rainbow Green"
694 door { name: "Green Rainbow Room" }
695}
696connections {
697 from_room: "Rainbow Green"
698 to_room: "Rainbow Blue"
699 door { name: "Blue Rainbow Room" }
700}
701connections {
702 from_room: "Rainbow Blue"
703 to_room: "Rainbow Purple"
704 door { name: "Purple Rainbow Room" }
705}
706connections {
707 from_room: "Rainbow Purple"
708 to_room: "Rainbow Cyan"
709 door { name: "Cyan Rainbow Room" }
710}
711connections {
712 from_room: "Rainbow Cyan"
713 to_room: "Brown Smiley"
714 door { name: "Brown Rainbow Room" }
715}
716connections {
717 from_room: "Red Color Door"
718 to_room: "Pepper Room"
719 door { name: "Pepper Room Entrance" }
720}
721connections {
722 from_room: "Outside Hotel"
723 to_room: "Hotel"
724 door { name: "Hotel Entrance" }
725}
726connections {
727 from_room: "Salt Room"
728 to_room: "Seasoning Room"
729 door { name: "Seasoning Doors" }
730}
731connections {
732 from_room: "Pepper Room"
733 to_room: "Seasoning Room"
734 door { name: "Seasoning Doors" }
735}
736connections {
737 from_room: "Brown Smiley"
738 to_room: "Bow Side"
739 door { name: "Bow Side" }
740}
741connections {
742 from_room: "Bow Side"
743 to_room: "Rainbow End"
744 door { name: "Gold Ending Blockers" }
745}
746connections {
747 from_room: "Rain Side"
748 to_room: "Rainbow End"
749 door { name: "Gold Ending Blockers" }
750}
751connections {
752 from_room: "Brown Smiley"
753 to_room: "Outside Orange Room"
754 door { name: "Brown Smiley Shortcut" }
755}
756connections {
757 from_room: "Blue Smiley"
758 to_room: "Outside Red Room"
759 door { name: "Blue Smiley Exit To Red" }
760}
761connections {
762 from_room: "Blue Smiley"
763 to_room: "Blue Smiley Annex"
764 door { name: "Blue Smiley Annex" }
765}
766connections {
767 from_room: "Purple Smiley"
768 to_room: "Blue Hallway"
769 door { name: "Purple Smiley Exit To Hallway" }
770}
771connections {
772 from_room: "Purple Smiley"
773 to_room: "Blue Hallway Tall Side"
774 door { name: "Purple Smiley Exit To Cream Hex" }
775}
776connections {
777 from_room: "Hedges"
778 to_room: "Yellow Smiley Annex"
779 door { name: "Yellow Smiley Annex" }
780}
781connections {
782 from_room: "Hedges"
783 to_room: "Outside Hedges"
784 door { name: "Yellow Smiley Door" }
785}
786connections {
787 from_room: "Green Smiley"
788 to_room: "Red Color Door"
789 door { name: "Green Smiley" }
790}
791connections {
792 from_room: "Outside Orange Room"
793 to_room: "Post Orange Smiley Three Way"
794 door { name: "Orange Smiley Exit" }
795}
796connections {
797 from_room: "Outside Orange Room"
798 to_room: "F Keyholder"
799 door { name: "F Keyholder Door" }
800}
801connections {
802 from_room: "West Castle Area"
803 to_room: "Flip Painting"
804 door { name: "Flip Painting Blocker" }
805}
806connections {
807 from_room: "Number Paintings Area"
808 to_room: "Red Smiley"
809 door { name: "Red Smiley Entrance" }
810}
811connections {
812 from_room: "Number Paintings Area"
813 to_room: "Red Smiley"
814 door { name: "Red Smiley" }
815}
816connections {
817 from_room: "Green Color Door"
818 to_room: "Tree Entrance"
819 door { name: "Pink Hallway" }
820}
821connections {
822 from_room: "Green Color Door"
823 to_room: "Yellow Color Backside"
824 door { name: "Pink Hallway" }
825}
826connections {
827 from_room: "Green Color Door"
828 to_room: "Maze Paintings Area"
829 door { name: "Pink Hallway" }
830}
831connections {
832 from_room: "Outside Snake Room"
833 to_room: "Cyan Room"
834 door { name: "Cyan Room Entrance" }
835}
836connections {
837 from_room: "After Bee Room"
838 to_room: "Green Room"
839 door { name: "Green Room Entrance" }
840}
841connections {
842 from_room: "Blue Hallway"
843 to_room: "Blue Hallway Cut Side"
844 door { name: "Blue Hallway South Divider" }
845}
846connections {
847 from_room: "Sweet Foyer"
848 to_room: "Blue Hallway Cut Side"
849 door { name: "Near Sweet Brown Door" }
850}
851connections {
852 from_room: "Outside Red Room"
853 to_room: "Red Room"
854 door { name: "Red Room Entrance" }
855}
856connections {
857 from_room: "Blue Hallway Cut Side"
858 to_room: "Outside Red Room"
859 door { name: "Blue Hallway To Red Room" }
860}
861connections {
862 from_room: "Blue Hallway"
863 to_room: "Blue Hallway Tall Side"
864 door { name: "Blue Hallway North Divider" }
865}
866connections {
867 from_room: "Yellow Color Door"
868 to_room: "Blue Hallway Tall Side"
869 door { name: "Near Yellow Room Door" }
870}
871connections {
872 from_room: "Outside House"
873 to_room: "House Entrance"
874 door { name: "House Side Door" }
875}
876connections {
877 from_room: "Yellow Color Door"
878 to_room: "Yellow Room"
879 door { name: "Yellow Room Entrance" }
880}
881connections {
882 from_room: "Gray Color Door"
883 to_room: "Dark Light Room"
884 door { name: "Dark Light Room Entrance" }
885}
886connections {
887 from_room: "Dark Light Exit"
888 to_room: "Gray Color Backside"
889 door { name: "Dark Light Room Exit" }
890}
891connections {
892 from_room: "Dark Light Room"
893 to_room: "Dark Light Exit"
894 door { name: "Dark Light Room Divider" }
895}
896connections {
897 from_room: "Gray Color Backside"
898 to_room: "Sweet Foyer"
899 door { name: "Near Sweet Blue Door" }
900}
901connections {
902 from_room: "Gray Color Backside"
903 to_room: "South Castle Area"
904 door { name: "South Castle Area Back Door" }
905}
906connections {
907 from_room: "Gray Color Door"
908 to_room: "South Castle Area"
909 door { name: "South Castle Area Entrance" }
910}
911connections {
912 from_room: "After Bee Room"
913 to_room: "Plum Room"
914 door { name: "Plum Room Entrance" }
915}
916connections {
917 from_room: "Plum Room"
918 to_room: "North Castle Area"
919 door { name: "Plum Room Exit" }
920}
921connections {
922 from_room: "Plum Room"
923 to_room: "D Keyholder"
924 door { name: "D Keyholder Blocker" }
925}
926connections {
927 from_room: "Quiet Entrance"
928 to_room: "Purple SW Vestibule"
929 door { name: "Planet Room Secret Door" }
930}
931connections {
932 from_room: "Quiet Entrance"
933 to_room: "Rainbow Color Doors"
934 door { name: "Blue Color Doorway" }
935}
936connections {
937 from_room: "Outside Snake Room"
938 to_room: "Rainbow Color Doors"
939 door { name: "Blue Color Backside" }
940 oneway: true
941}
942connections {
943 from_room: "Pumpkin Entrance"
944 to_room: "Pumpkin Room"
945 door { name: "Pumpkin Room Interior" }
946}
947connections {
948 from_room: "Pumpkin Entrance"
949 to_room: "Outside Orange Room"
950 door { name: "Pumpkin Room Interior" }
951}
952connections {
953 from_room: "Rainbow Color Doors"
954 to_room: "Pumpkin Room"
955 door { name: "Pumpkin Room Interior" }
956}
957connections {
958 from_room: "Green Color Door"
959 to_room: "Pumpkin Entrance"
960 door { name: "Pumpkin Door" }
961}
962connections {
963 from_room: "Computer Room Seal"
964 to_room: "Outside Eye Temple"
965 door { name: "Computer Room Exit" }
966}
967connections {
968 from_room: "Computer Room"
969 to_room: "Computer Room Seal"
970 door { name: "Computer Room Interior Door" }
971}
972connections {
973 from_room: "Rainbow Color Doors"
974 to_room: "C Keyholder"
975 door { name: "C Keyholder Blocker" }
976}
977connections {
978 from_room: "Rainbow Color Doors"
979 to_room: "Computer Room"
980 door { name: "Computer Room Entrance" }
981}
982connections {
983 from_room: "Computer Room"
984 to_room: "Tree Entrance"
985 door { name: "Computer Room Back Door" }
986}
987connections {
988 from_room: "Outside Book Room"
989 to_room: "Book Room"
990 door { name: "Book Room Entrance" }
991}
992connections {
993 from_room: "Globe Room"
994 to_room: "Outside Book Room"
995 door { name: "Globe Room East Door" }
996}
997connections {
998 from_room: "Globe Room"
999 to_room: "Outside Salt Room"
1000 door { name: "Globe Room West Door" }
1001}
1002connections {
1003 from_room: "Globe Room"
1004 to_room: "Outside Magic Room"
1005 door { name: "Globe Room South Door" }
1006}
1007connections {
1008 from_room: "Book Room"
1009 to_room: "Outside Eye Temple"
1010 door { name: "Book Room Exit" }
1011}
1012connections {
1013 from_room: "Globe Room"
1014 to_room: "Outside Eye Temple"
1015 door { name: "Sticks And Stones Door" }
1016}
1017connections {
1018 from_room: "Castle"
1019 to_room: "Wisdom Panel"
1020 door { name: "Castle Numbers Puzzle" }
1021}
1022connections {
1023 from_room: "After Bee Room"
1024 to_room: "Wisdom Panel"
1025 door { name: "Castle Numbers Puzzle" }
1026}
1027connections {
1028 from_room: "Black Hex"
1029 to_room: "Zoo N"
1030 door { name: "Zoo West Entrance" }
1031}
1032connections {
1033 from_room: "Z2 Room"
1034 to_room: "Zoo E"
1035 door { name: "Zoo East Entrance" }
1036}
1037connections {
1038 from_room: "Outside Snake Room"
1039 to_room: "Zoo SE"
1040 door { name: "Zoo South Entrance" }
1041}
1042connections {
1043 from_room: "Zoo NE"
1044 to_room: "Zoo N"
1045 door { name: "Zoo Proxy North Door" }
1046}
1047connections {
1048 from_room: "Zoo E"
1049 to_room: "Zoo NE"
1050 door { name: "Zoo East Room" }
1051}
1052connections {
1053 from_room: "Zoo Center"
1054 to_room: "Zoo N"
1055 oneway: true
1056}
1057connections {
1058 from_room: "Zoo S"
1059 to_room: "Zoo Center"
1060 door { name: "Zoo Prize Door" }
1061}
1062connections {
1063 from_room: "Zoo SE"
1064 to_room: "Zoo S"
1065 door { name: "Zoo Proxy South Door" }
1066}
1067connections {
1068 from_room: "Outside Pyramid"
1069 to_room: "Zoo N"
1070 door { name: "Zoo North Entrance" }
1071}
1072connections {
1073 from_room: "Castle"
1074 to_room: "Ending"
1075 door { name: "Castle Throne" }
1076 oneway: true
1077}
1078connections {
1079 from {
1080 painting {
1081 room: "North Castle Area"
1082 name: "RELIC2"
1083 }
1084 }
1085 to {
1086 painting {
1087 room: "Green Smiley"
1088 name: "RELIC"
1089 }
1090 }
1091 oneway: true
1092}
1093connections {
1094 from {
1095 painting {
1096 room: "Rainbow Color Doors"
1097 name: "ACHES2"
1098 }
1099 }
1100 to {
1101 painting {
1102 room: "Outside Hedges"
1103 name: "ACHES"
1104 }
1105 }
1106 oneway: true
1107}
1108connections {
1109 from {
1110 painting {
1111 room: "Purple Room South"
1112 name: "PLANET"
1113 }
1114 }
1115 to {
1116 painting {
1117 room: "Quiet Entrance"
1118 name: "PLANET2"
1119 }
1120 }
1121 oneway: true
1122}
1123connections {
1124 from {
1125 painting {
1126 room: "Moat"
1127 name: "CASTLE"
1128 }
1129 }
1130 to {
1131 painting {
1132 room: "Outside House"
1133 name: "CASTLE2"
1134 }
1135 }
1136 oneway: true
1137}
1138connections {
1139 from {
1140 painting {
1141 room: "Purple SW Vestibule"
1142 name: "PAINS2"
1143 }
1144 }
1145 to {
1146 painting {
1147 room: "Pains Room"
1148 name: "PAINS"
1149 }
1150 }
1151 oneway: true
1152}
1153connections {
1154 from {
1155 painting {
1156 room: "Flip Painting"
1157 name: "FLIP2"
1158 }
1159 }
1160 to {
1161 painting {
1162 room: "Flip Painting Destination"
1163 name: "FLIP"
1164 }
1165 }
1166 oneway: true
1167}
1168connections {
1169 from {
1170 painting {
1171 room: "Number Paintings Area"
1172 name: "WON"
1173 }
1174 }
1175 to {
1176 painting {
1177 room: "West Castle Area"
1178 name: "WON2"
1179 }
1180 }
1181 oneway: true
1182}
1183connections {
1184 from {
1185 painting {
1186 room: "Number Paintings Area"
1187 name: "TOO"
1188 }
1189 }
1190 to {
1191 painting {
1192 room: "Outside Snake Room"
1193 name: "TOO2"
1194 }
1195 }
1196 oneway: true
1197}
1198connections {
1199 from {
1200 painting {
1201 room: "Number Paintings Area"
1202 name: "3"
1203 }
1204 }
1205 to {
1206 painting {
1207 room: "Sweet Foyer"
1208 name: "4"
1209 }
1210 }
1211 oneway: true
1212}
1213connections {
1214 from {
1215 painting {
1216 room: "Outside Snake Room"
1217 name: "SNAKE"
1218 }
1219 }
1220 to {
1221 painting {
1222 room: "Snake Room"
1223 name: "SNAKE2"
1224 }
1225 }
1226 oneway: true
1227}
1228connections {
1229 from {
1230 painting {
1231 room: "Bee Room Obverse"
1232 name: "BEE2"
1233 }
1234 }
1235 to {
1236 painting {
1237 room: "Bee Room Reverse"
1238 name: "BEE3"
1239 }
1240 }
1241 oneway: true
1242}
1243connections {
1244 from {
1245 painting {
1246 room: "Bee Room Reverse"
1247 name: "BUTTERFLY2"
1248 }
1249 }
1250 to {
1251 painting {
1252 room: "Bee Room Obverse"
1253 name: "BUTTERFLY"
1254 }
1255 }
1256 oneway: true
1257}
1258connections {
1259 from {
1260 painting {
1261 room: "Yellow Color Door"
1262 name: "EYEREDSTART"
1263 }
1264 }
1265 to {
1266 painting {
1267 room: "Eye Painting"
1268 name: "EYEREDEXITMAIN"
1269 }
1270 }
1271 oneway: true
1272}
1273connections {
1274 from {
1275 painting {
1276 room: "Eye Temple 1F Side"
1277 name: "EYEREDTOEXITMAIN1"
1278 }
1279 }
1280 to {
1281 painting {
1282 room: "Eye Painting"
1283 name: "EYEREDEXITMAIN"
1284 }
1285 }
1286 oneway: true
1287}
1288connections {
1289 from {
1290 painting {
1291 room: "Eye Temple 2F Side"
1292 name: "EYEREDTOEXITMAIN4"
1293 }
1294 }
1295 to {
1296 painting {
1297 room: "Eye Temple Pillar 1"
1298 name: "EYEREDEXITPILLAR1"
1299 }
1300 }
1301 oneway: true
1302}
1303connections {
1304 from {
1305 painting {
1306 room: "Eye Temple 1F Side"
1307 name: "EYEREDTOEXITMAIN5"
1308 }
1309 }
1310 to {
1311 painting {
1312 room: "Eye Temple 2F Side"
1313 name: "EYEREDEXITMAIN4"
1314 }
1315 }
1316 oneway: true
1317}
1318connections {
1319 from {
1320 painting {
1321 room: "Eye Temple 2F"
1322 name: "EYEREDTOSIDE1"
1323 }
1324 }
1325 to {
1326 painting {
1327 room: "Eye Temple 1F Side"
1328 name: "EYEREDSIDE1"
1329 }
1330 }
1331 oneway: true
1332}
1333connections {
1334 from {
1335 painting {
1336 room: "Eye Temple 1F"
1337 name: "EYEREDTOEXITMAIN2"
1338 }
1339 }
1340 to {
1341 painting {
1342 room: "Eye Painting"
1343 name: "EYEREDEXITMAIN"
1344 }
1345 }
1346 oneway: true
1347}
1348connections {
1349 from {
1350 painting {
1351 room: "Eye Temple Pillar 2"
1352 name: "EYEREDTOEXITMAIN3"
1353 }
1354 }
1355 to {
1356 painting {
1357 room: "Eye Painting"
1358 name: "EYEREDEXITMAIN"
1359 }
1360 }
1361 oneway: true
1362}
1363connections {
1364 from {
1365 painting {
1366 room: "Eye Temple Pillar 1"
1367 name: "EYEREDTOBACKSIDE1"
1368 }
1369 }
1370 to {
1371 painting {
1372 room: "Eye Temple 1F"
1373 name: "EYEREDEXITBACKSIDE"
1374 }
1375 }
1376 oneway: true
1377}
1378connections {
1379 from {
1380 painting {
1381 room: "Eye Temple Pillar 2"
1382 name: "EYEREDTOBACKSIDE2"
1383 }
1384 }
1385 to {
1386 painting {
1387 room: "Eye Temple 1F"
1388 name: "EYEREDEXITBACKSIDE"
1389 }
1390 }
1391 oneway: true
1392}
1393connections {
1394 from {
1395 painting {
1396 room: "Eye Temple Pillar 1"
1397 name: "EYEREDTOBACKSIDE4"
1398 }
1399 }
1400 to {
1401 painting {
1402 room: "Eye Temple 2F"
1403 name: "EYEREDEXITTOP1"
1404 }
1405 }
1406 oneway: true
1407}
1408connections {
1409 from {
1410 painting {
1411 room: "Eye Temple 1F"
1412 name: "EYEREDTOBACKSIDE3"
1413 }
1414 }
1415 to {
1416 painting {
1417 room: "Eye Temple 1F"
1418 name: "EYEREDEXITBACKSIDE"
1419 }
1420 }
1421 oneway: true
1422}
1423connections {
1424 from {
1425 painting {
1426 room: "Eye Temple 2F"
1427 name: "EYEREDTOBACKSIDE5"
1428 }
1429 }
1430 to {
1431 painting {
1432 room: "Eye Temple Pillar 2"
1433 name: "EYEREDEXITPILLAR2"
1434 }
1435 }
1436 oneway: true
1437}
1438connections {
1439 from {
1440 painting {
1441 room: "Eye Temple 2F Side"
1442 name: "EYEREDEXITMAIN3"
1443 }
1444 }
1445 to {
1446 painting {
1447 room: "I2 Room"
1448 name: "EYEREDEXITMAIN2"
1449 }
1450 }
1451 oneway: true
1452}
1453connections {
1454 from {
1455 painting {
1456 room: "Eye Temple 1F"
1457 name: "EYEREDTOPILLAR1"
1458 }
1459 }
1460 to {
1461 painting {
1462 room: "Eye Temple Pillar 1"
1463 name: "EYEREDEXITPILLAR1"
1464 }
1465 }
1466 oneway: true
1467}
1468connections {
1469 from {
1470 painting {
1471 room: "Eye Temple 1F"
1472 name: "EYEREDTOPILLAR2"
1473 }
1474 }
1475 to {
1476 painting {
1477 room: "Eye Temple Pillar 2"
1478 name: "EYEREDEXITPILLAR2"
1479 }
1480 }
1481 oneway: true
1482}
1483connections {
1484 from {
1485 painting {
1486 room: "Eye Temple 1F"
1487 name: "EYEREDTOPILLAR3"
1488 }
1489 }
1490 to {
1491 painting {
1492 room: "Eye Temple 1F"
1493 name: "EYEREDEXITBACKSIDE"
1494 }
1495 }
1496 oneway: true
1497}
1498connections {
1499 from {
1500 painting {
1501 room: "Eye Temple 2F"
1502 name: "EYEREDTOTOP1"
1503 }
1504 }
1505 to {
1506 painting {
1507 room: "Eye Temple 2F"
1508 name: "EYEREDEXITTOP1"
1509 }
1510 }
1511 oneway: true
1512}
1513connections {
1514 from_room: "Pyramid Entry"
1515 to_room: "Pyramid 3"
1516 door { name: "Pyramid 3 Door" }
1517}
1518connections {
1519 from_room: "Pyramid 3"
1520 to_room: "Pyramid 6"
1521 door { name: "Pyramid 6 Door" }
1522}
1523connections {
1524 from_room: "Pyramid 6"
1525 to_room: "Pyramid 8"
1526 door { name: "Pyramid 8 Left Door" }
1527}
1528connections {
1529 from_room: "Pyramid 7"
1530 to_room: "Pyramid 8"
1531 door { name: "Pyramid 8 Bottom Door" }
1532}
1533connections {
1534 from_room: "Pyramid Entry"
1535 to_room: "Pyramid 7"
1536 door { name: "Pyramid 7 Door" }
1537}
1538connections {
1539 from_room: "Pyramid 7"
1540 to_room: "Pyramid 4"
1541 door { name: "Pyramid 4 Door" }
1542}
1543connections {
1544 from_room: "Pyramid 4"
1545 to_room: "Pyramid 5"
1546 door { name: "Pyramid 5 Door" }
1547}
1548connections {
1549 from_room: "Pyramid 5"
1550 to_room: "Pyramid Second Floor"
1551 door { name: "Pyramid Second Floor Door" }
1552}
1553connections {
1554 from_room: "Pyramid Second Floor"
1555 to_room: "Pyramid Top"
1556 door { name: "Pyramid Third Floor Door" }
1557}
1558connections {
1559 from_room: "Roof"
1560 to_room: "After Bee Room"
1561 oneway: true
1562 roof_access: true
1563}
1564connections {
1565 from_room: "Roof"
1566 to_room: "Amber North 2"
1567 oneway: true
1568 roof_access: true
1569}
1570connections {
1571 from_room: "Roof"
1572 to_room: "Black Hex"
1573 oneway: true
1574 roof_access: true
1575}
1576connections {
1577 from_room: "Roof"
1578 to_room: "Blue Hallway Tall Side"
1579 oneway: true
1580 roof_access: true
1581}
1582connections {
1583 from_room: "Roof"
1584 to_room: "Blue Hallway"
1585 oneway: true
1586 roof_access: true
1587}
1588# Blue Hallway Cut Side is inside.
1589connections {
1590 from_room: "Roof"
1591 to_room: "Eye Painting"
1592 oneway: true
1593 roof_access: true
1594}
1595connections {
1596 from_room: "Roof"
1597 to_room: "Globe Room"
1598 oneway: true
1599 roof_access: true
1600}
1601connections {
1602 from_room: "Roof"
1603 to_room: "Gray Color Door"
1604 oneway: true
1605 roof_access: true
1606}
1607connections {
1608 from_room: "Roof"
1609 to_room: "Green Color Door"
1610 oneway: true
1611 roof_access: true
1612}
1613connections {
1614 from_room: "Roof"
1615 to_room: "Green Smiley"
1616 oneway: true
1617 roof_access: true
1618}
1619connections {
1620 from_room: "Roof"
1621 to_room: "Hedges"
1622 oneway: true
1623 roof_access: true
1624}
1625connections {
1626 from_room: "Roof"
1627 to_room: "Maze Paintings Area"
1628 oneway: true
1629 roof_access: true
1630}
1631connections {
1632 from_room: "Roof"
1633 to_room: "Maze"
1634 oneway: true
1635 roof_access: true
1636}
1637connections {
1638 from_room: "Roof"
1639 to_room: "North Castle Area"
1640 oneway: true
1641 roof_access: true
1642}
1643connections {
1644 from_room: "Roof"
1645 to_room: "Number Paintings Area"
1646 oneway: true
1647 roof_access: true
1648}
1649connections {
1650 from_room: "Roof"
1651 to_room: "Orange Room Hallway"
1652 oneway: true
1653 roof_access: true
1654}
1655connections {
1656 from_room: "Roof"
1657 to_room: "Outside Book Room"
1658 oneway: true
1659 roof_access: true
1660}
1661connections {
1662 from_room: "Roof"
1663 to_room: "Outside Eye Temple"
1664 oneway: true
1665 roof_access: true
1666}
1667connections {
1668 from_room: "Roof"
1669 to_room: "Outside Hedges"
1670 oneway: true
1671 roof_access: true
1672}
1673connections {
1674 from_room: "Roof"
1675 to_room: "Outside Hotel"
1676 oneway: true
1677 roof_access: true
1678}
1679connections {
1680 from_room: "Roof"
1681 to_room: "Outside House"
1682 oneway: true
1683 roof_access: true
1684}
1685connections {
1686 from_room: "Roof"
1687 to_room: "Outside Magic Room"
1688 oneway: true
1689 roof_access: true
1690}
1691connections {
1692 from_room: "Roof"
1693 to_room: "Outside Orange Room"
1694 oneway: true
1695 roof_access: true
1696}
1697connections {
1698 from_room: "Roof"
1699 to_room: "Outside Pyramid"
1700 oneway: true
1701 roof_access: true
1702}
1703connections {
1704 from_room: "Roof"
1705 to_room: "Outside Red Room"
1706 oneway: true
1707 roof_access: true
1708}
1709connections {
1710 from_room: "Roof"
1711 to_room: "Outside Salt Room"
1712 oneway: true
1713 roof_access: true
1714}
1715connections {
1716 from_room: "Roof"
1717 to_room: "Outside Snake Room"
1718 oneway: true
1719 roof_access: true
1720}
1721connections {
1722 from_room: "Roof"
1723 to_room: "Post Orange Smiley Three Way"
1724 oneway: true
1725 roof_access: true
1726}
1727connections {
1728 from_room: "Roof"
1729 to_room: "Purple NW Vestibule"
1730 oneway: true
1731 roof_access: true
1732}
1733connections {
1734 from_room: "Roof"
1735 to_room: "Purple Room East"
1736 oneway: true
1737 roof_access: true
1738}
1739connections {
1740 from_room: "Roof"
1741 to_room: "Purple Room South"
1742 oneway: true
1743 roof_access: true
1744}
1745connections {
1746 from_room: "Roof"
1747 to_room: "Purple Room West"
1748 oneway: true
1749 roof_access: true
1750}
1751connections {
1752 from_room: "Roof"
1753 to_room: "Purple SE Vestibule"
1754 oneway: true
1755 roof_access: true
1756}
1757connections {
1758 from_room: "Roof"
1759 to_room: "Pyramid Second Floor"
1760 oneway: true
1761 roof_access: true
1762}
1763connections {
1764 from_room: "Roof"
1765 to_room: "Pyramid Top"
1766 oneway: true
1767 roof_access: true
1768}
1769connections {
1770 from_room: "Roof"
1771 to_room: "Quiet Entrance"
1772 oneway: true
1773 roof_access: true
1774}
1775connections {
1776 from_room: "Roof"
1777 to_room: "Red Color Door"
1778 oneway: true
1779 roof_access: true
1780}
1781connections {
1782 from_room: "Roof"
1783 to_room: "South Castle Area"
1784 oneway: true
1785 roof_access: true
1786}
1787connections {
1788 from_room: "Roof"
1789 to_room: "Starting Room"
1790 oneway: true
1791 roof_access: true
1792}
1793connections {
1794 from_room: "Roof"
1795 to_room: "Sweet Foyer"
1796 oneway: true
1797 roof_access: true
1798}
1799connections {
1800 from_room: "Roof"
1801 to_room: "Tree Entrance"
1802 oneway: true
1803 roof_access: true
1804}
1805connections {
1806 from_room: "Roof"
1807 to_room: "West Castle Area"
1808 oneway: true
1809 roof_access: true
1810}
1811connections {
1812 from_room: "Roof"
1813 to_room: "West Spire"
1814 oneway: true
1815 roof_access: true
1816}
1817connections {
1818 from_room: "Roof"
1819 to_room: "Yellow Color Door"
1820 oneway: true
1821 roof_access: true
1822}
1823connections {
1824 from_room: "Roof"
1825 to_room: "Z2 Room"
1826 oneway: true
1827 roof_access: true
1828}
1829connections {
1830 from_room: "Roof"
1831 to_room: "Zoo Center"
1832 oneway: true
1833 roof_access: true
1834}
1835connections {
1836 from_room: "Roof"
1837 to_room: "Zoo E"
1838 oneway: true
1839 roof_access: true
1840}
1841connections {
1842 from_room: "Roof"
1843 to_room: "Zoo N"
1844 oneway: true
1845 roof_access: true
1846}
1847connections {
1848 from_room: "Roof"
1849 to_room: "Zoo NE"
1850 oneway: true
1851 roof_access: true
1852}
1853connections {
1854 from_room: "Roof"
1855 to_room: "Zoo S"
1856 oneway: true
1857 roof_access: true
1858}
1859connections {
1860 from_room: "Roof"
1861 to_room: "Zoo SE"
1862 oneway: true
1863 roof_access: true
1864}
1865connections {
1866 from_room: "Roof"
1867 to_room: "F Keyholder"
1868 oneway: true
1869 roof_access: true
1870}
1871connections {
1872 from_room: "Roof"
1873 to_room: "Yellow Color Backside"
1874 oneway: true
1875 roof_access: true
1876}
diff --git a/data/maps/daedalus/doors.txtpb b/data/maps/daedalus/doors.txtpb new file mode 100644 index 0000000..f2f4592 --- /dev/null +++ b/data/maps/daedalus/doors.txtpb
@@ -0,0 +1,2473 @@
1doors {
2 name: "Snake Room First Door"
3 type: EVENT
4 panels { room: "Snake Room" name: "HISS" answer: "cat" }
5}
6doors {
7 name: "Snake Room Second Door"
8 type: EVENT
9 panels { room: "Snake Room" name: "SQUEAK" answer: "bat" }
10}
11doors {
12 name: "Snake Room Third Door"
13 type: EVENT
14 panels { room: "Snake Room" name: "SQUEAK" answer: "bat" }
15 panels { room: "Snake Room" name: "BUZZ" answer: "fly" }
16}
17doors {
18 name: "West Sticks And Stones Door"
19 type: EVENT
20 panels { room: "West Castle Area" name: "SKELETON" }
21}
22doors {
23 name: "Castle West Hider"
24 type: EVENT
25 panels { room: "West Castle Area" name: "SONG (1)" }
26 panels { room: "West Castle Area" name: "FACE" }
27}
28doors {
29 name: "Castle South Hider"
30 type: EVENT
31 panels { room: "South Castle Area" name: "AN" }
32 panels { room: "South Castle Area" name: "OFFER" }
33 panels { room: "South Castle Area" name: "VILLAGE" }
34 panels { room: "South Castle Area" name: "BEFORE" }
35 panels { room: "South Castle Area" name: "LAIR" }
36}
37doors {
38 name: "Southwest Sticks And Stones Door"
39 type: EVENT
40 panels { room: "Globe Room" name: "TICK" answer: "sticks" }
41 panels { room: "Globe Room" name: "TONE" answer: "stones" }
42 panels { room: "Globe Room" name: "BONE" }
43}
44doors {
45 name: "Castle North Hider"
46 type: EVENT
47 panels { room: "North Castle Area" name: "A" }
48 panels { room: "North Castle Area" name: "SUMMER" }
49 panels { room: "North Castle Area" name: "PLACE" }
50}
51doors {
52 name: "Pyramid 3 Door"
53 type: EVENT
54 panels { room: "Pyramid Entry" name: "TREE" }
55}
56doors {
57 name: "Pyramid 6 Door"
58 type: EVENT
59 panels { room: "Pyramid 7" name: "ARTIST" }
60}
61doors {
62 name: "Pyramid 8 Left Door"
63 type: EVENT
64 panels { room: "Pyramid 5" name: "ROYAL" }
65}
66doors {
67 name: "Pyramid 8 Bottom Door"
68 type: EVENT
69 panels { room: "Pyramid 4" name: "CAT" }
70}
71doors {
72 name: "Pyramid 7 Door"
73 type: EVENT
74 panels { room: "Pyramid Entry" name: "SHAPE" }
75}
76doors {
77 name: "Pyramid 4 Door"
78 type: EVENT
79 panels { room: "Pyramid 3" name: "VEHICLE" }
80}
81doors {
82 name: "Pyramid 5 Door"
83 type: EVENT
84 panels { room: "Pyramid 6" name: "TEA" }
85}
86doors {
87 name: "Pyramid Second Floor Door"
88 type: EVENT
89 panels { room: "Pyramid 8" name: "INSTRUMENT" }
90 panels { room: "Pyramid 5" name: "ROYAL" }
91}
92doors {
93 name: "Pyramid Third Floor Door"
94 type: EVENT
95 panels { room: "Outside Pyramid" name: "PEER" }
96 panels { room: "Outside Pyramid" name: "AMID" }
97 panels { room: "Pyramid Entry" name: "TREE" }
98 panels { room: "Pyramid Entry" name: "SHAPE" }
99 panels { room: "Pyramid 3" name: "VEHICLE" }
100 panels { room: "Pyramid 4" name: "CAT" }
101 panels { room: "Pyramid 5" name: "ROYAL" }
102 panels { room: "Pyramid 6" name: "TEA" }
103 panels { room: "Pyramid 7" name: "ARTIST" }
104 panels { room: "Pyramid 8" name: "INSTRUMENT" }
105 panels { room: "Pyramid Second Floor" name: "TOOL" }
106 panels { room: "Pyramid Second Floor" name: "SODA" }
107 panels { room: "Pyramid Second Floor" name: "ORGAN" }
108 panels { room: "Pyramid Second Floor" name: "DIAMOND" }
109 panels { room: "Pyramid Second Floor" name: "INSTRUMENT" }
110 panels { room: "Pyramid Second Floor" name: "BEVERAGE" }
111}
112doors {
113 name: "Pyramid 9 Blocker"
114 type: EVENT
115 panels { room: "Pyramid Second Floor" name: "TOOL" }
116 panels { room: "Pyramid Second Floor" name: "SODA" }
117 panels { room: "Pyramid Second Floor" name: "ORGAN" }
118}
119doors {
120 name: "Pyramid 14 Blocker"
121 type: EVENT
122 panels { room: "Pyramid Second Floor" name: "SODA" }
123}
124doors {
125 name: "Pyramid 13 Blocker"
126 type: EVENT
127 panels { room: "Pyramid Second Floor" name: "ORGAN" }
128}
129doors {
130 name: "Castle Flipper"
131 type: EVENT
132 panels { room: "Castle" name: "REVERSE" }
133}
134doors {
135 name: "Castle Hazel Stairs"
136 # This is called "yellow" in-game... no way.
137 type: EVENT
138 panels { room: "Castle" name: "ONE (Hazel)" }
139 panels { room: "Castle" name: "TWO (Hazel)" }
140 panels { room: "Castle" name: "THREE (Hazel)" }
141 panels { room: "Castle" name: "FOUR (Hazel)" }
142}
143doors {
144 name: "Castle Maroon Stairs"
145 type: EVENT
146 panels { room: "Castle" name: "ONE (Maroon)" }
147 panels { room: "Castle" name: "TWO (Maroon)" }
148 panels { room: "Castle" name: "THREE (Maroon)" }
149 panels { room: "Castle" name: "FOUR (Maroon)" }
150}
151doors {
152 name: "Castle Green Stairs"
153 type: EVENT
154 panels { room: "Castle" name: "ONE (Green)" }
155 panels { room: "Castle" name: "TWO (Green)" }
156 panels { room: "Castle" name: "THREE (Green)" }
157 panels { room: "Castle" name: "FOUR (Green)" }
158}
159doors {
160 name: "Castle Blue Stairs"
161 type: EVENT
162 panels { room: "Castle" name: "ONE (Blue)" }
163 panels { room: "Castle" name: "TWO (Blue)" }
164 panels { room: "Castle" name: "THREE (Blue)" }
165 panels { room: "Castle" name: "FOUR (Blue)" }
166}
167doors {
168 name: "Castle Throne"
169 type: EVENT
170 panels { room: "Castle" name: "FIVE (Blue)" }
171 panels { room: "Castle" name: "FIVE (Green)" }
172 panels { room: "Castle" name: "FIVE (Maroon)" }
173 panels { room: "Castle" name: "FIVE (Hazel)" }
174}
175doors {
176 name: "Starting Room North Wall Center Door"
177 type: STANDARD
178 receivers: "Components/Doors/Entry/entry_1"
179 panels { room: "Starting Room" name: "ENTRANCE" }
180 location_room: "Starting Room"
181}
182doors {
183 name: "Starting Room West Wall South Door"
184 type: STANDARD
185 receivers: "Components/Doors/Entry/entry_2"
186 panels { room: "Welcome Back Exit" name: "WELCOME" }
187 location_room: "Welcome Back Exit"
188}
189doors {
190 name: "Welcome Back Secret Door"
191 type: STANDARD
192 receivers: "Components/Doors/Entry/entry_13"
193 panels { room: "Welcome Back Area" name: "FAREWELL LITTLE LAMB" }
194 panels { room: "West Spire" name: "BYE" }
195 location_room: "West Spire"
196 location_name: "BYE, FAREWELL LITTLE LAMB"
197}
198doors {
199 name: "Welcome Back Door"
200 type: LOCATION_ONLY
201 #receivers: "Components/Doors/Entry/entry_14"
202 panels { room: "Welcome Back Area" name: "GREETINGS OLD FRIEND" }
203 location_room: "Welcome Back Area"
204 location_name: "GREETINGS OLD FRIEND"
205}
206# entry_3 is the door to SEAL, which we will ignore.
207doors {
208 name: "Starting Room West Wall Center Door"
209 type: STANDARD
210 receivers: "Components/Doors/Entry/entry_4"
211 panels { room: "Entry Shortcut" name: "WELCOME" }
212 location_room: "Entry Shortcut"
213}
214doors {
215 name: "Entry Shortcut Secret Exit"
216 type: ITEM_ONLY
217 receivers: "Components/Doors/Entry/entry_12"
218 panels { room: "Entry Shortcut" name: "WELCOME" }
219 panels { room: "West Spire" name: "CONCEALED" }
220}
221doors {
222 name: "Starting Room West Wall North Door"
223 type: STANDARD
224 receivers: "Components/Doors/Entry/entry_5"
225 panels { room: "West Spire" name: "CONCEALED" }
226 location_room: "West Spire"
227}
228doors {
229 name: "Starting Room East Wall Center Door"
230 type: ITEM_ONLY
231 legacy_location: true
232 receivers: "Components/Doors/Entry/entry_6"
233 panels { room: "Rainbow Color Backside" name: "?" }
234 location_room: "Rainbow Color Backside"
235}
236doors {
237 name: "Rainbow Color Backside Panels"
238 type: LOCATION_ONLY
239 panels { room: "Rainbow Color Backside" name: "?" }
240 panels { room: "Rainbow Color Backside" name: "BACKSIDE" }
241 location_room: "Rainbow Color Backside"
242 location_name: "BACKSIDE, ?"
243}
244doors {
245 name: "Starting Room East Wall North Door"
246 type: ITEM_ONLY
247 receivers: "Components/Doors/Entry/entry_7"
248 panels { room: "Starting Room" name: "ENTRANCE" }
249 panels { room: "Rainbow Color Backside" name: "?" }
250}
251doors {
252 name: "Starting Room North Wall West Door"
253 type: STANDARD
254 receivers: "Components/Doors/Entry/entry_8"
255 receivers: "Components/Doors/Entry/entry_16"
256 panels { room: "Number Paintings Area" name: "TURN" }
257 location_room: "Number Paintings Area"
258}
259doors {
260 name: "Starting Room North Wall East Door"
261 type: STANDARD
262 receivers: "Components/Doors/Entry/entry_9"
263 panels { room: "Yellow Color Door" name: "SPIN" }
264 location_room: "Yellow Color Door"
265}
266doors {
267 name: "Starting Room South Wall East Door"
268 type: ITEM_ONLY
269 receivers: "Components/Doors/Entry/entry_10"
270 panels { room: "Outside Eye Temple" name: "Entrance" }
271}
272doors {
273 name: "Temple of the Eyes Entrance"
274 type: STANDARD
275 receivers: "Components/Doors/Entry/entry_18"
276 panels { room: "Outside Eye Temple" name: "Entrance" }
277 location_room: "Outside Eye Temple"
278}
279doors {
280 name: "Starting Room South Wall West Door"
281 type: ITEM_ONLY
282 receivers: "Components/Doors/Entry/entry_11"
283 panels { room: "Outside Eye Temple" name: "Entrance" }
284}
285doors {
286 name: "Eye Painting Exit"
287 type: STANDARD
288 receivers: "Components/Doors/Entry/entry_15"
289 panels { room: "Eye Painting" name: "REVILED" }
290 location_room: "Eye Painting"
291}
292doors {
293 name: "Near Pyramid Gate"
294 type: STANDARD
295 receivers: "Components/Doors/Entry/gate_1"
296 panels { room: "Number Paintings Area" name: "GOING" }
297 location_room: "Number Paintings Area"
298}
299doors {
300 name: "Black Hexes Door"
301 type: STANDARD
302 receivers: "Components/Doors/Entry/gate_3"
303 panels { room: "Black Hex" name: "HIDE" }
304 panels { room: "Black Hex" name: "ORDER" }
305 panels { room: "Black Hex" name: "TOWER" }
306 panels { room: "Black Hex" name: "MAZE" }
307 panels { room: "Black Hex" name: "CLUES" }
308 panels { room: "Black Hex" name: "SECRET" }
309 location_room: "Black Hex"
310 location_name: "Black Hex"
311}
312doors {
313 name: "Splintering Exit North Door"
314 type: ITEM_ONLY
315 legacy_location: true
316 receivers: "Components/Doors/Entry/gate_4"
317 panels { room: "West Castle Area" name: "EVER" }
318 panels { room: "West Castle Area" name: "AXES" }
319 panels { room: "West Castle Area" name: "FLIP (1)" }
320 panels { room: "West Castle Area" name: "SLOT" }
321 location_room: "West Castle Area"
322}
323doors {
324 name: "Splintering Exit South Door"
325 type: ITEM_ONLY
326 receivers: "Components/Doors/Entry/gate_5"
327 panels { room: "West Castle Area" name: "EVER" }
328 panels { room: "West Castle Area" name: "AXES" }
329 panels { room: "West Castle Area" name: "FLIP (1)" }
330 panels { room: "West Castle Area" name: "SLOT" }
331}
332doors {
333 name: "Splintering Area Panels"
334 type: LOCATION_ONLY
335 panels { room: "West Castle Area" name: "EVER" }
336 panels { room: "West Castle Area" name: "AXES" }
337 panels { room: "West Castle Area" name: "FLIP (1)" }
338 panels { room: "West Castle Area" name: "SLOT" }
339 panels { room: "West Castle Area" name: "WICKEDLY" }
340 panels { room: "West Castle Area" name: "CATHOLIC" }
341 panels { room: "West Castle Area" name: "SISTERLY" }
342 panels { room: "West Castle Area" name: "SQUEALED" }
343 panels { room: "West Castle Area" name: "READ" }
344 panels { room: "West Castle Area" name: "WORD" }
345 panels { room: "West Castle Area" name: "EACH" }
346 panels { room: "West Castle Area" name: "RANK" }
347 panels { room: "West Castle Area" name: "TEAR" }
348 panels { room: "West Castle Area" name: "SHUT" }
349 panels { room: "West Castle Area" name: "FLIP (2)" }
350 panels { room: "West Castle Area" name: "STUN" }
351 panels { room: "West Castle Area" name: "CHAT" }
352 panels { room: "West Castle Area" name: "LOST" }
353 panels { room: "West Castle Area" name: "PODS" }
354 panels { room: "West Castle Area" name: "FAME" }
355 location_room: "West Castle Area"
356}
357doors {
358 name: "West Sticks And Stones Panel"
359 type: LOCATION_ONLY
360 panels { room: "West Castle Area" name: "LETTERS" }
361 location_room: "West Castle Area"
362 location_name: "LETTERS"
363}
364doors {
365 name: "Amber Room Panels"
366 type: LOCATION_ONLY
367 panels { room: "West Castle Area" name: "HARMONY" }
368 panels { room: "West Castle Area" name: "MELODY" }
369 panels { room: "West Castle Area" name: "RHYTHM" }
370 panels { room: "West Castle Area" name: "TEXTURE" }
371 location_room: "West Castle Area"
372 location_name: "HARMONY, MELODY, RHYTHM, TEXTURE"
373}
374doors {
375 name: "Z2 Room Back Exit"
376 type: ITEM_ONLY
377 receivers: "Components/Doors/Entry/gate_2"
378 panels { room: "Z2 Room" name: "MICROSCOPE" }
379 panels { room: "Z2 Room" name: "KEY" }
380 panels { room: "Z2 Room" name: "HORSE" }
381 panels { room: "Z2 Room" name: "CAR" }
382 panels { room: "Z2 Room" name: "SOLSTICE" }
383 panels { room: "Z2 Room" name: "EQUINE" }
384 panels { room: "Z2 Room" name: "CHARGE" }
385 panels { room: "Z2 Room" name: "MUST" }
386 panels { room: "Z2 Room" name: "CAPE" }
387 panels { room: "Z2 Room" name: "GLANCE" }
388 panels { room: "Z2 Room" name: "JAR" }
389 panels { room: "Z2 Room" name: "AGREEMENT" }
390 panels { room: "Z2 Room" name: "VOYAGE" }
391 panels { room: "Z2 Room" name: "INSECT" }
392 panels { room: "Z2 Room" name: "EAGLE" }
393 panels { room: "Z2 Room" name: "MAJESTIC" }
394 panels { room: "Z2 Room" name: "RINGO" }
395 panels { room: "Z2 Room" name: "POLICY" }
396 panels { room: "Z2 Room" name: "DISCORD" }
397 panels { room: "Z2 Room" name: "CAT" }
398 complete_at: 10
399}
400doors {
401 name: "Z2 Prize"
402 type: EVENT
403 # theo_6, theo_7, theo_8, theo_9
404 panels { room: "Z2 Room" name: "MICROSCOPE" }
405 panels { room: "Z2 Room" name: "KEY" }
406 panels { room: "Z2 Room" name: "HORSE" }
407 panels { room: "Z2 Room" name: "CAR" }
408 panels { room: "Z2 Room" name: "SOLSTICE" }
409 panels { room: "Z2 Room" name: "EQUINE" }
410 panels { room: "Z2 Room" name: "CHARGE" }
411 panels { room: "Z2 Room" name: "MUST" }
412 panels { room: "Z2 Room" name: "CAPE" }
413 panels { room: "Z2 Room" name: "GLANCE" }
414 panels { room: "Z2 Room" name: "JAR" }
415 panels { room: "Z2 Room" name: "AGREEMENT" }
416 panels { room: "Z2 Room" name: "VOYAGE" }
417 panels { room: "Z2 Room" name: "INSECT" }
418 panels { room: "Z2 Room" name: "EAGLE" }
419 panels { room: "Z2 Room" name: "MAJESTIC" }
420 panels { room: "Z2 Room" name: "RINGO" }
421 panels { room: "Z2 Room" name: "POLICY" }
422 panels { room: "Z2 Room" name: "DISCORD" }
423 panels { room: "Z2 Room" name: "CAT" }
424}
425doors {
426 name: "Z2 Room Southwest Door"
427 type: STANDARD
428 receivers: "Components/Doors/Halls/theo_1"
429 panels { room: "Z2 Room" name: "MICROSCOPE" }
430 panels { room: "Z2 Room" name: "KEY" }
431 panels { room: "Z2 Room" name: "HORSE" }
432 panels { room: "Z2 Room" name: "CAR" }
433 panels { room: "Z2 Room" name: "SOLSTICE" }
434 panels { room: "Z2 Room" name: "EQUINE" }
435 panels { room: "Z2 Room" name: "CHARGE" }
436 panels { room: "Z2 Room" name: "MUST" }
437 panels { room: "Z2 Room" name: "CAPE" }
438 panels { room: "Z2 Room" name: "GLANCE" }
439 location_room: "Z2 Room"
440 location_name: "West Puzzles"
441}
442doors {
443 name: "Z2 Room Northwest Door"
444 type: ITEM_ONLY
445 receivers: "Components/Doors/Halls/theo_2"
446 panels { room: "Z2 Room" name: "MICROSCOPE" }
447 panels { room: "Z2 Room" name: "KEY" }
448 panels { room: "Z2 Room" name: "HORSE" }
449 panels { room: "Z2 Room" name: "CAR" }
450 panels { room: "Z2 Room" name: "SOLSTICE" }
451 panels { room: "Z2 Room" name: "EQUINE" }
452 panels { room: "Z2 Room" name: "CHARGE" }
453 panels { room: "Z2 Room" name: "MUST" }
454 panels { room: "Z2 Room" name: "CAPE" }
455 panels { room: "Z2 Room" name: "GLANCE" }
456}
457doors {
458 name: "Z2 Room Northeast Door"
459 type: STANDARD
460 receivers: "Components/Doors/Halls/theo_3"
461 panels { room: "Z2 Room" name: "JAR" }
462 panels { room: "Z2 Room" name: "AGREEMENT" }
463 panels { room: "Z2 Room" name: "VOYAGE" }
464 panels { room: "Z2 Room" name: "INSECT" }
465 panels { room: "Z2 Room" name: "EAGLE" }
466 panels { room: "Z2 Room" name: "MAJESTIC" }
467 panels { room: "Z2 Room" name: "RINGO" }
468 panels { room: "Z2 Room" name: "POLICY" }
469 panels { room: "Z2 Room" name: "DISCORD" }
470 panels { room: "Z2 Room" name: "CAT" }
471 location_room: "Z2 Room"
472 location_name: "East Puzzles"
473}
474doors {
475 name: "Z2 Room Southeast Door"
476 type: ITEM_ONLY
477 receivers: "Components/Doors/Halls/theo_4"
478 receivers: "Components/Doors/Halls/theo_5"
479 panels { room: "Z2 Room" name: "JAR" }
480 panels { room: "Z2 Room" name: "AGREEMENT" }
481 panels { room: "Z2 Room" name: "VOYAGE" }
482 panels { room: "Z2 Room" name: "INSECT" }
483 panels { room: "Z2 Room" name: "EAGLE" }
484 panels { room: "Z2 Room" name: "MAJESTIC" }
485 panels { room: "Z2 Room" name: "RINGO" }
486 panels { room: "Z2 Room" name: "POLICY" }
487 panels { room: "Z2 Room" name: "DISCORD" }
488 panels { room: "Z2 Room" name: "CAT" }
489}
490doors {
491 name: "Coin Tower Part 1"
492 type: LOCATION_ONLY
493 panels { room: "Yellow Color Door" name: "Paintings" }
494 location_room: "Yellow Color Door"
495}
496doors {
497 name: "Coin Tower Part 2"
498 type: EVENT
499 panels { room: "Coin Tower" name: "RAIN" }
500}
501doors {
502 name: "Purple SE Vestibule Blocker"
503 type: EVENT
504 #receivers: "Components/Doors/Purple Exterior/purple_3"
505 #receivers: "Components/Doors/Purple Exterior/purple_4"
506 panels { room: "Purple SE Vestibule" name: "RUN" }
507 panels { room: "Purple SE Vestibule" name: "ROADS" }
508}
509doors {
510 name: "Purple SW Vestibule Blocker"
511 type: EVENT
512 #receivers: "Components/Doors/Purple Exterior/purple_15"
513 #receivers: "Components/Doors/Purple Exterior/purple_16"
514 panels { room: "Purple SW Vestibule" name: "LETTERS" }
515 panels { room: "Purple SW Vestibule" name: "INSCRIBE" }
516}
517doors {
518 name: "Purple NW Vestibule Blocker"
519 type: EVENT
520 #receivers: "Components/Doors/Purple Exterior/purple_11"
521 #receivers: "Components/Doors/Purple Exterior/purple_12"
522 panels { room: "Purple NW Vestibule" name: "MESSAGES" }
523 panels { room: "Purple NW Vestibule" name: "LOSE" }
524}
525doors {
526 name: "Purple NE Vestibule Blocker"
527 type: EVENT
528 #receivers: "Components/Doors/Purple Exterior/purple_7"
529 #receivers: "Components/Doors/Purple Exterior/purple_8"
530 panels { room: "Outside House" name: "WALLS" }
531 panels { room: "Outside House" name: "LOCK" }
532}
533doors {
534 name: "Purple SE Vestibule"
535 type: STANDARD
536 receivers: "Components/Doors/Purple Exterior/purple_1"
537 receivers: "Components/Doors/Purple Exterior/purple_2"
538 panels { room: "Purple SE Vestibule" name: "RUN" }
539 panels { room: "Purple SE Vestibule" name: "ROADS" }
540 location_room: "Purple SE Vestibule"
541}
542doors {
543 name: "Purple NE Vestibule"
544 type: LOCATION_ONLY
545 # This has no impact on logic because it's the same room on both sides.
546 #receivers: "Components/Doors/Purple Exterior/purple_5"
547 #receivers: "Components/Doors/Purple Exterior/purple_6"
548 panels { room: "Outside House" name: "WALLS" }
549 panels { room: "Outside House" name: "LOCK" }
550 location_room: "Outside House"
551}
552doors {
553 name: "Purple NW Vestibule"
554 type: STANDARD
555 receivers: "Components/Doors/Purple Exterior/purple_9"
556 receivers: "Components/Doors/Purple Exterior/purple_10"
557 panels { room: "Purple NW Vestibule" name: "MESSAGES" }
558 panels { room: "Purple NW Vestibule" name: "LOSE" }
559 location_room: "Purple NW Vestibule"
560}
561doors {
562 name: "Purple SW Vestibule"
563 type: STANDARD
564 receivers: "Components/Doors/Purple Exterior/purple_13"
565 receivers: "Components/Doors/Purple Exterior/purple_14"
566 panels { room: "Purple SW Vestibule" name: "LETTERS" }
567 panels { room: "Purple SW Vestibule" name: "INSCRIBE" }
568 location_room: "Purple SW Vestibule"
569}
570doors {
571 name: "Purple West Area North Door"
572 type: STANDARD
573 receivers: "Components/Doors/Purple Exterior/purple_17"
574 panels { room: "Outside House" name: "BLITHELY" }
575 panels { room: "Purple Room South" name: "THESE" }
576 location_room: "Outside House"
577 location_name: "West Purple Vestibules"
578}
579doors {
580 name: "Purple West Area South Door"
581 type: ITEM_ONLY
582 receivers: "Components/Doors/Purple Exterior/purple_18"
583 panels { room: "Outside House" name: "BLITHELY" }
584 panels { room: "Purple Room South" name: "THESE" }
585}
586doors {
587 name: "Godot Room Entrance"
588 type: ITEM_ONLY
589 receivers: "Components/Doors/Purple Exterior/purple_25"
590 panels { room: "Purple Room South" name: "THESE" }
591}
592doors {
593 name: "Godot Room Exit"
594 type: STANDARD
595 receivers: "Components/Doors/Purple Exterior/purple_26"
596 panels { room: "Godot Room" name: "MOTORCYCLE" }
597 panels { room: "Godot Room" name: "ME" }
598 panels { room: "Godot Room" name: "PAWN" }
599 panels { room: "Godot Room" name: "MANIPULATE" }
600 panels { room: "Godot Room" name: "AUDIO" }
601 panels { room: "Godot Room" name: "AIRPLANE" }
602 panels { room: "Godot Room" name: "IDEA" }
603 panels { room: "Godot Room" name: "TRAIN" }
604 panels { room: "Godot Room" name: "RECORDING" }
605 location_room: "Godot Room"
606 location_name: "Godot Room"
607}
608doors {
609 name: "Beehalls Intersection"
610 type: EVENT
611 # Unfortunately this has to be an event because the panels block the door
612 # until solved. This means that the door can't give access to the three
613 # entrances. It only blocks access to the fourth panel.
614 panels { room: "After Bee Room" name: "GAS" }
615 panels { room: "Outside House" name: "WHISPER" }
616 panels { room: "Purple NW Vestibule" name: "SNOWMAN" }
617}
618doors {
619 name: "Beehalls Panel"
620 type: LOCATION_ONLY
621 panels { room: "Beehalls Intersection" name: "CLOUDS" }
622 location_room: "Beehalls Intersection"
623}
624doors {
625 name: "Purple West Area West Door"
626 type: ITEM_ONLY
627 receivers: "Components/Doors/Purple Exterior/purple_27"
628 panels { room: "Outside House" name: "BLITHELY" }
629 panels { room: "Purple Room South" name: "THESE" }
630}
631doors {
632 name: "Purple East Area South Door"
633 type: STANDARD
634 receivers: "Components/Doors/Purple Exterior/purple_19"
635 panels { room: "Purple Room South" name: "ANY" }
636 panels { room: "Outside House" name: "A" }
637 location_room: "Outside House"
638 location_name: "East Purple Vestibules"
639}
640doors {
641 name: "Purple East Area North Door"
642 type: ITEM_ONLY
643 receivers: "Components/Doors/Purple Exterior/purple_20"
644 panels { room: "Purple Room South" name: "ANY" }
645 panels { room: "Outside House" name: "A" }
646}
647doors {
648 name: "Purple Room North Entrance"
649 type: STANDARD
650 receivers: "Components/Doors/Purple Exterior/purple_21"
651 panels { room: "Purple Room South" name: "ANY" }
652 panels { room: "Outside House" name: "A" }
653 panels { room: "Outside House" name: "BLITHELY" }
654 panels { room: "Purple Room South" name: "THESE" }
655 location_room: "Outside House"
656 location_name: "Purple Vestibules"
657}
658doors {
659 name: "Purple Room South Entrance"
660 type: ITEM_ONLY
661 receivers: "Components/Doors/Purple Exterior/purple_22"
662 panels { room: "Purple Room South" name: "ANY" }
663 panels { room: "Outside House" name: "A" }
664 panels { room: "Outside House" name: "BLITHELY" }
665 panels { room: "Purple Room South" name: "THESE" }
666}
667doors {
668 name: "Purple Room West Entrance"
669 type: ITEM_ONLY
670 receivers: "Components/Doors/Purple Exterior/purple_23"
671 panels { room: "Purple Room South" name: "ANY" }
672 panels { room: "Outside House" name: "A" }
673 panels { room: "Outside House" name: "BLITHELY" }
674 panels { room: "Purple Room South" name: "THESE" }
675}
676doors {
677 name: "Purple Room East Entrance"
678 type: ITEM_ONLY
679 receivers: "Components/Doors/Purple Exterior/purple_24"
680 panels { room: "Purple Room South" name: "ANY" }
681 panels { room: "Outside House" name: "A" }
682 panels { room: "Outside House" name: "BLITHELY" }
683 panels { room: "Purple Room South" name: "THESE" }
684}
685doors {
686 name: "Purple Room"
687 type: LOCATION_ONLY
688 panels { room: "Purple Room" name: "HOIST" }
689 panels { room: "Purple Room" name: "CORE" }
690 panels { room: "Purple Room" name: "FISH" }
691 panels { room: "Purple Room" name: "ALLOW" }
692 panels { room: "Purple Room" name: "BIRD" }
693 panels { room: "Purple Room" name: "HONK" }
694 panels { room: "Purple Room" name: "APE" }
695 panels { room: "Purple Room" name: "APATHY" }
696 location_room: "Purple Room"
697 location_name: "Puzzles"
698}
699doors {
700 name: "Hedges Tower"
701 type: LOCATION_ONLY
702 latch: true
703 receivers: "Components/Doors/Halls/tower_door"
704 # TODO: Not making this an item right now in order to force the player to
705 # solve the puzzles in order to enter The Tenacious. In the future, I'd like
706 # to make this an item, and make you solve the panels in order to get the
707 # location.
708 panels { room: "Hedges" name: "SOLVE" }
709 panels { room: "Hedges" name: "US" }
710 panels { room: "Hedges" name: "IN" }
711 panels { room: "Hedges" name: "ORDER" }
712 panels { room: "Hedges" name: "THEN" }
713 panels { room: "Hedges" name: "JUMP" }
714 panels { room: "Hedges" name: "DOWN" }
715 panels { room: "Hedges" name: "THE" }
716 panels { room: "Hedges" name: "TOWER" }
717 location_room: "Hedges"
718}
719doors {
720 name: "Near Flip Painting Door"
721 type: STANDARD
722 receivers: "Components/Doors/Halls/halls_1"
723 panels { room: "Flip Painting Hidden Panel" name: "HIDDEN" answer: "secret" }
724 location_room: "Flip Painting Hidden Panel"
725}
726doors {
727 name: "Southwest Area Intersection"
728 type: STANDARD
729 receivers: "Components/Doors/Halls/halls_3"
730 panels { room: "Globe Room" name: "HIDDEN" answer: "secret" }
731 location_room: "Globe Room"
732}
733# halls_4 is some kind of remnant from SEAL and does nothing.
734doors {
735 name: "Blue Room Entrance"
736 type: STANDARD
737 receivers: "Components/Doors/Halls/halls_2"
738 panels { room: "Rainbow Color Doors" name: "CROW" }
739 location_room: "Rainbow Color Doors"
740}
741doors {
742 name: "Blue Room"
743 type: LOCATION_ONLY
744 panels { room: "Blue Room" name: "RED" }
745 panels { room: "Blue Room" name: "WESTWARD" }
746 panels { room: "Blue Room" name: "RANGE" }
747 panels { room: "Blue Room" name: "PEPPER" }
748 panels { room: "Blue Room" name: "TIME" }
749 panels { room: "Blue Room" name: "SALT" }
750 panels { room: "Blue Room" name: "BULB" }
751 panels { room: "Blue Room" name: "PAPA" }
752 panels { room: "Blue Room" name: "MINT" }
753 panels { room: "Blue Room" name: "CELEBRATORY" }
754 panels { room: "Blue Room" name: "DETECTIVE" }
755 location_room: "Blue Room"
756 location_name: "Puzzles"
757}
758doors {
759 name: "O2 Prize"
760 type: EVENT
761 panels { room: "O2 Room" name: "LISTEN" }
762 panels { room: "O2 Room" name: "UNLOCK" }
763 panels { room: "O2 Room" name: "PROMISE" }
764 panels { room: "O2 Room" name: "SIGN" }
765 panels { room: "O2 Room" name: "AJAR" }
766 panels { room: "O2 Room" name: "HEED" }
767 panels { room: "O2 Room" name: "HERALD" }
768 panels { room: "O2 Room" name: "VOW" }
769 panels { room: "O2 Room" name: "HONEST" }
770 panels { room: "O2 Room" name: "PROPHECY" }
771 panels { room: "O2 Room" name: "BOND" }
772 panels { room: "O2 Room" name: "UNBLOCKED" }
773}
774doors {
775 name: "O2 Room Southeast Door"
776 type: STANDARD
777 receivers: "Components/Doors/Halls/oroom_2"
778 panels { room: "O2 Room" name: "HONEST" }
779 location_room: "O2 Room"
780}
781doors {
782 name: "Composite Room NE Entrance"
783 type: STANDARD
784 receivers: "Components/Doors/Halls/oroom_3"
785 panels { room: "O2 Room" name: "UNLOCK" }
786 location_room: "O2 Room"
787}
788doors {
789 name: "Composite Room East Door"
790 type: STANDARD
791 receivers: "Components/Doors/Halls/oroom_5"
792 panels { room: "Composite Room NE" name: "<-" }
793 panels { room: "Composite Room NE" name: "TEXTBOOK" }
794 panels { room: "Composite Room NE" name: "CORNERHOME" }
795 panels { room: "Composite Room NE" name: "BIRDCALL" }
796 panels { room: "Composite Room NE" name: "FORCEYARD" }
797 panels { room: "Composite Room NE" name: "TIREPOUND" }
798 panels { room: "Composite Room NE" name: "LIEQUIZ" }
799 panels { room: "Composite Room NE" name: "WHITEOUT" }
800 panels { room: "Composite Room NE" name: "FEETHIM" }
801 panels { room: "Composite Room NE" name: "STARFALL" }
802 panels { room: "Composite Room S" name: "MUSCLEIN" }
803 panels { room: "Composite Room S" name: "PLAYHOP" }
804 panels { room: "Composite Room S" name: "BOUGHTHIM" }
805 panels { room: "Composite Room S" name: "FRIENDPILOT" }
806 panels { room: "Composite Room S" name: "UNDERPANTS" }
807 panels { room: "Composite Room S" name: "FIREFOX" }
808 panels { room: "Composite Room S" name: "SPRINKLEDRIP" }
809 panels { room: "Composite Room S" name: "TWOGOTHIM" }
810 panels { room: "Composite Room S" name: "SKIMFARE" }
811 panels { room: "Composite Room S" name: "TICKETBORNE" }
812 panels { room: "Composite Room S" name: "BLEAKCARD" }
813 panels { room: "Composite Room S" name: "MISSIONMISSION" }
814 location_room: "Composite Room S"
815 location_name: "East Rooms"
816}
817doors {
818 name: "Composite Room North Door"
819 type: STANDARD
820 receivers: "Components/Doors/Halls/oroom_7"
821 panels { room: "Composite Room NE" name: "<-" }
822 panels { room: "Composite Room NE" name: "TEXTBOOK" }
823 panels { room: "Composite Room NE" name: "CORNERHOME" }
824 panels { room: "Composite Room NE" name: "BIRDCALL" }
825 panels { room: "Composite Room NE" name: "FORCEYARD" }
826 panels { room: "Composite Room NE" name: "TIREPOUND" }
827 panels { room: "Composite Room NE" name: "LIEQUIZ" }
828 panels { room: "Composite Room NE" name: "WHITEOUT" }
829 panels { room: "Composite Room NE" name: "FEETHIM" }
830 panels { room: "Composite Room NE" name: "STARFALL" }
831 panels { room: "Composite Room NW" name: "BEHOUSE" }
832 panels { room: "Composite Room NW" name: "BRAKESTEADY" }
833 panels { room: "Composite Room NW" name: "DEATHSHORT" }
834 panels { room: "Composite Room NW" name: "PLUMPFAMILY" }
835 panels { room: "Composite Room NW" name: "SHEEPBOOK" }
836 panels { room: "Composite Room NW" name: "LAIDIN" }
837 panels { room: "Composite Room NW" name: "FOGIRON" }
838 panels { room: "Composite Room NW" name: "MOONSENT" }
839 panels { room: "Composite Room NW" name: "FAIRWATER" }
840 panels { room: "Composite Room NW" name: "PLEADOUT" }
841 panels { room: "Composite Room NW" name: "OUTGARDEN" }
842 panels { room: "Composite Room NW" name: "HELLOTALE" }
843 location_room: "Composite Room NE"
844 location_name: "North Rooms"
845}
846doors {
847 name: "Composite Room West Door"
848 type: STANDARD
849 receivers: "Components/Doors/Halls/oroom_8"
850 panels { room: "Composite Room NW" name: "BEHOUSE" }
851 panels { room: "Composite Room NW" name: "BRAKESTEADY" }
852 panels { room: "Composite Room NW" name: "DEATHSHORT" }
853 panels { room: "Composite Room NW" name: "PLUMPFAMILY" }
854 panels { room: "Composite Room NW" name: "SHEEPBOOK" }
855 panels { room: "Composite Room NW" name: "LAIDIN" }
856 panels { room: "Composite Room NW" name: "FOGIRON" }
857 panels { room: "Composite Room NW" name: "MOONSENT" }
858 panels { room: "Composite Room NW" name: "FAIRWATER" }
859 panels { room: "Composite Room NW" name: "PLEADOUT" }
860 panels { room: "Composite Room NW" name: "OUTGARDEN" }
861 panels { room: "Composite Room NW" name: "HELLOTALE" }
862 panels { room: "Composite Room S" name: "CONCAVE" }
863 panels { room: "Composite Room S" name: "FAIRYTHINK" }
864 panels { room: "Composite Room S" name: "AILAND" }
865 panels { room: "Composite Room S" name: "RULERCAT" }
866 panels { room: "Composite Room S" name: "ANDBITE" }
867 panels { room: "Composite Room S" name: "ASHHIM" }
868 panels { room: "Composite Room S" name: "PRONOUNPRONOUNPRONOUN" }
869 panels { room: "Composite Room S" name: "SPOUSEGARDEN" }
870 panels { room: "Composite Room S" name: "BANGER" }
871 panels { room: "Composite Room S" name: "LEGIT" }
872 panels { room: "Composite Room S" name: "OUTEAT" }
873 panels { room: "Composite Room S" name: "SUMMERIN" }
874 location_room: "Composite Room NW"
875 location_name: "West Rooms"
876}
877doors {
878 name: "Composite Room NW Entrance"
879 type: ITEM_ONLY
880 legacy_location: true
881 receivers: "Components/Doors/Halls/oroom_10"
882 panels { room: "Red Color Door" name: "Near Obscured Puzzles" }
883 location_room: "Red Color Door"
884}
885doors {
886 name: "Yellow Roof Puzzles"
887 type: LOCATION_ONLY
888 panels { room: "Red Color Door" name: "BACKSIDE" }
889 panels { room: "Red Color Door" name: "WALK BACK" }
890 panels { room: "Red Color Door" name: "Back (1)" }
891 panels { room: "Red Color Door" name: "Back (2)" }
892 panels { room: "Red Color Door" name: "Near Obscured Puzzles" }
893 location_room: "Red Color Door"
894}
895doors {
896 name: "Composite Room South Door"
897 type: LOCATION_ONLY
898 #receivers: "Components/Doors/Halls/oroom_9"
899 panels { room: "Composite Room S" name: "MUSCLEIN" }
900 panels { room: "Composite Room S" name: "PLAYHOP" }
901 panels { room: "Composite Room S" name: "BOUGHTHIM" }
902 panels { room: "Composite Room S" name: "FRIENDPILOT" }
903 panels { room: "Composite Room S" name: "UNDERPANTS" }
904 panels { room: "Composite Room S" name: "FIREFOX" }
905 panels { room: "Composite Room S" name: "SPRINKLEDRIP" }
906 panels { room: "Composite Room S" name: "TWOGOTHIM" }
907 panels { room: "Composite Room S" name: "SKIMFARE" }
908 panels { room: "Composite Room S" name: "TICKETBORNE" }
909 panels { room: "Composite Room S" name: "BLEAKCARD" }
910 panels { room: "Composite Room S" name: "MISSIONMISSION" }
911 panels { room: "Composite Room S" name: "CONCAVE" }
912 panels { room: "Composite Room S" name: "FAIRYTHINK" }
913 panels { room: "Composite Room S" name: "AILAND" }
914 panels { room: "Composite Room S" name: "RULERCAT" }
915 panels { room: "Composite Room S" name: "ANDBITE" }
916 panels { room: "Composite Room S" name: "ASHHIM" }
917 panels { room: "Composite Room S" name: "PRONOUNPRONOUNPRONOUN" }
918 panels { room: "Composite Room S" name: "SPOUSEGARDEN" }
919 panels { room: "Composite Room S" name: "BANGER" }
920 panels { room: "Composite Room S" name: "LEGIT" }
921 panels { room: "Composite Room S" name: "OUTEAT" }
922 panels { room: "Composite Room S" name: "SUMMERIN" }
923 location_room: "Composite Room S"
924 location_name: "South Rooms"
925}
926doors {
927 name: "O2 Room Northeast Door"
928 type: STANDARD
929 receivers: "Components/Doors/Halls/oroom_4"
930 panels { room: "O2 Room" name: "UNBLOCKED" }
931 location_room: "O2 Room"
932}
933doors {
934 name: "Control Center Orange Door"
935 type: CONTROL_CENTER_COLOR
936 latch: true
937 receivers: "Components/Doors/Halls/oroom_6"
938 control_center_color: "orange"
939}
940doors {
941 name: "F2 Prize"
942 type: EVENT
943 panels { room: "F2 Room" name: "DULLS" }
944 panels { room: "F2 Room" name: "GRIME" }
945 panels { room: "F2 Room" name: "CRAFT" }
946 panels { room: "F2 Room" name: "CAST" }
947 panels { room: "F2 Room" name: "WANES" }
948 panels { room: "F2 Room" name: "DECAY" }
949 panels { room: "F2 Room" name: "MAKE" }
950 panels { room: "F2 Room" name: "WEAKENS" }
951 panels { room: "F2 Room" name: "TRASH" }
952 panels { room: "F2 Room" name: "SHAPE" }
953}
954doors {
955 name: "F2 Room Southeast Door"
956 type: ITEM_ONLY
957 legacy_location: true
958 receivers: "Components/Doors/Halls/froom_2"
959 panels { room: "Sweet Foyer" name: "RENT (1)" }
960 location_room: "Sweet Foyer"
961}
962doors {
963 name: "White Hallway From Entry"
964 type: CONTROL_CENTER_COLOR
965 latch: true
966 receivers: "Components/Doors/Halls/froom_6"
967 control_center_color: "white"
968}
969doors {
970 name: "Purple Hallway From Great"
971 type: CONTROL_CENTER_COLOR
972 latch: true
973 receivers: "Components/Doors/Halls/froom_7"
974 control_center_color: "purple"
975}
976doors {
977 name: "F2 Room Southwest Door"
978 type: STANDARD
979 receivers: "Components/Doors/Halls/froom_3"
980 panels { room: "F2 Room" name: "RISKY" }
981 location_room: "F2 Room"
982}
983doors {
984 name: "F2 Room Northwest Door"
985 type: STANDARD
986 receivers: "Components/Doors/Halls/froom_4"
987 panels { room: "F2 Room" name: "SHAPE" }
988 location_room: "F2 Room"
989}
990doors {
991 name: "F2 Room West Door"
992 type: STANDARD
993 receivers: "Components/Doors/Halls/froom_5"
994 panels { room: "F2 Room" name: "DIRT" }
995 location_room: "F2 Room"
996}
997doors {
998 name: "U2 Prize"
999 type: EVENT
1000 panels { room: "U2 Room" name: "DREAMSCAPE" }
1001 panels { room: "U2 Room" name: "WICKED" }
1002 panels { room: "U2 Room" name: "PARADISE" }
1003 panels { room: "U2 Room" name: "DISCORD" }
1004 panels { room: "U2 Room" name: "EVIL" }
1005 panels { room: "U2 Room" name: "DISORDER" }
1006 panels { room: "U2 Room" name: "CHAOS" }
1007 panels { room: "U2 Room" name: "TROUBLE" }
1008 panels { room: "U2 Room" name: "IRREVERENT" }
1009 panels { room: "U2 Room" name: "HEAVEN" }
1010}
1011doors {
1012 name: "U2 Room Southeast Door"
1013 type: STANDARD
1014 receivers: "Components/Doors/Halls/uroom_2"
1015 panels { room: "U2 Room" name: "WICKED" }
1016 location_room: "U2 Room"
1017}
1018doors {
1019 name: "Blue Foyer Door"
1020 type: STANDARD
1021 receivers: "Components/Doors/Halls/blue_foyer_1"
1022 panels { room: "Maze Paintings Area" name: "Paintings" }
1023 location_room: "Maze Paintings Area"
1024}
1025doors {
1026 name: "House Entrance"
1027 type: STANDARD
1028 receivers: "Components/Doors/Halls/theo_door_1"
1029 panels { room: "House Entrance" name: "ADULT" }
1030 location_room: "House Entrance"
1031}
1032doors {
1033 name: "U2 Room Southwest Door"
1034 type: STANDARD
1035 receivers: "Components/Doors/Halls/uroom_3"
1036 panels { room: "U2 Room" name: "HEAVEN" }
1037 location_room: "U2 Room"
1038}
1039doors {
1040 name: "U2 Room West Door"
1041 type: ITEM_ONLY
1042 receivers: "Components/Doors/Halls/uroom_5"
1043 panels { room: "Purple Room South" name: "ANY" }
1044 panels { room: "Outside House" name: "A" }
1045}
1046doors {
1047 name: "U2 Room East Door"
1048 type: ITEM_ONLY
1049 receivers: "Components/Doors/Halls/uroom_4"
1050 panels { room: "Outside Magic Room" name: "WIZARD" }
1051 panels { room: "Magic Room" name: "1" }
1052 panels { room: "Magic Room" name: "2" }
1053 panels { room: "Magic Room" name: "3" }
1054 panels { room: "Magic Room" name: "4" }
1055}
1056doors {
1057 name: "Magic Room Panels"
1058 type: LOCATION_ONLY
1059 panels { room: "Magic Room" name: "1" }
1060 panels { room: "Magic Room" name: "2" }
1061 panels { room: "Magic Room" name: "3" }
1062 panels { room: "Magic Room" name: "4" }
1063 location_room: "Magic Room"
1064}
1065doors {
1066 name: "Magic Room Entrance"
1067 type: STANDARD
1068 receivers: "Components/Doors/Halls/maze_enter_1"
1069 panels { room: "Outside Magic Room" name: "WIZARD" }
1070 location_room: "Outside Magic Room"
1071}
1072doors {
1073 name: "Maze East Door"
1074 type: ITEM_ONLY
1075 receivers: "Components/Doors/Halls/maze_enter_2"
1076 panels { room: "Outside Magic Room" name: "WIZARD" }
1077}
1078doors {
1079 name: "Maze North Door"
1080 type: ITEM_ONLY
1081 receivers: "Components/Doors/Halls/maze_enter_3"
1082 panels { room: "Outside Magic Room" name: "WIZARD" }
1083}
1084doors {
1085 name: "Maze South Door"
1086 type: ITEM_ONLY
1087 receivers: "Components/Doors/Halls/maze_enter_4"
1088 panels { room: "Outside Magic Room" name: "WIZARD" }
1089}
1090doors {
1091 name: "Wonderland South Door"
1092 type: STANDARD
1093 receivers: "Components/Doors/Halls/wonderland_1"
1094 panels { room: "Wonderland" name: "APRIL" }
1095 panels { room: "Wonderland" name: "UNDER" }
1096 panels { room: "Wonderland" name: "ANGRY" }
1097 panels { room: "Wonderland" name: "ARTS" }
1098 panels { room: "Wonderland" name: "SONG" }
1099 location_room: "Wonderland"
1100 location_name: "Wonderland"
1101}
1102doors {
1103 name: "Pyramid Entrance"
1104 type: STANDARD
1105 receivers: "Components/Doors/Halls/pyramid_1"
1106 panels { room: "Outside Pyramid" name: "PEER" }
1107 panels { room: "Outside Pyramid" name: "AMID" }
1108 location_room: "Outside Pyramid"
1109}
1110doors {
1111 name: "Orange Room Entrance"
1112 type: STANDARD
1113 receivers: "Components/Doors/Halls/orange_entry"
1114 panels { room: "Outside Orange Room" name: "VAN" }
1115 location_room: "Outside Orange Room"
1116}
1117doors {
1118 name: "Orange Room"
1119 type: LOCATION_ONLY
1120 panels { room: "Orange Room" name: "FRANCE" }
1121 panels { room: "Orange Room" name: "ENTER" }
1122 panels { room: "Orange Room" name: "TURN" }
1123 panels { room: "Orange Room" name: "BARE" }
1124 panels { room: "Orange Room" name: "PORT" }
1125 panels { room: "Orange Room" name: "FORTE" }
1126 panels { room: "Orange Room" name: "MILKS" }
1127 panels { room: "Orange Room" name: "VINE" }
1128 panels { room: "Orange Room" name: "COAL" }
1129 panels { room: "Orange Room" name: "OWED" }
1130 location_room: "Orange Room"
1131 location_name: "Puzzles"
1132}
1133doors {
1134 name: "Hedges Entrance"
1135 type: STANDARD
1136 receivers: "Components/Doors/Halls/orange_entry2"
1137 panels { room: "Outside Hedges" name: "BARK" }
1138 panels { room: "Outside Hedges" name: "BUD" }
1139 panels { room: "Outside Hedges" name: "LEAF" }
1140 panels { room: "Outside Hedges" name: "PETAL" }
1141 location_room: "Outside Hedges"
1142}
1143doors {
1144 name: "Amber South Door"
1145 type: STANDARD
1146 receivers: "Components/Doors/Halls/amber_1"
1147 panels { room: "Outside Snake Room" name: "SONG (South)" }
1148 panels { room: "West Castle Area" name: "SONG (2)" }
1149 location_room: "West Castle Area"
1150 location_name: "South SONGs"
1151}
1152doors {
1153 name: "Amber North Door"
1154 type: STANDARD
1155 receivers: "Components/Doors/Halls/amber_2"
1156 panels { room: "Outside Snake Room" name: "SONG (North)" }
1157 panels { room: "Amber North 2" name: "SONG" }
1158 location_room: "Amber North 2"
1159 location_name: "North SONGs"
1160}
1161doors {
1162 name: "Amber East Doors"
1163 type: ITEM_ONLY
1164 receivers: "Components/Doors/Halls/amber_3"
1165 receivers: "Components/Doors/Halls/amber_4"
1166 panels { room: "Outside Snake Room" name: "SONG (North)" }
1167 panels { room: "West Castle Area" name: "SONG (2)" }
1168}
1169doors {
1170 name: "Pains Room Divider"
1171 type: STANDARD
1172 receivers: "Components/Doors/Halls/gold_1"
1173 panels { room: "Pains Room" name: "MOO" }
1174 location_room: "Pains Room"
1175}
1176doors {
1177 name: "Planet Room Divider"
1178 type: STANDARD
1179 receivers: "Components/Doors/Halls/gold_2"
1180 panels { room: "West Spire" name: "CAW" }
1181 location_room: "West Spire"
1182}
1183doors {
1184 name: "Snake Room Entrance"
1185 type: STANDARD
1186 receivers: "Components/Doors/Halls/purple_lav_3"
1187 panels { room: "Snake Room" name: "HISS" }
1188 panels { room: "Snake Room" name: "SQUEAK" }
1189 panels { room: "Snake Room" name: "BUZZ" }
1190 panels { room: "Snake Room" name: "BARK" }
1191 location_room: "Snake Room"
1192}
1193doors {
1194 name: "Hotel First Floor"
1195 type: LOCATION_ONLY
1196 panels { room: "Hotel" name: "PARKA" }
1197 panels { room: "Hotel" name: "MARLIN" }
1198 panels { room: "Hotel" name: "WHO" }
1199 panels { room: "Hotel" name: "CLOAK" }
1200 panels { room: "Hotel" name: "MANE" }
1201 panels { room: "Hotel" name: "WHAT" }
1202 panels { room: "Hotel" name: "BLAZER" }
1203 panels { room: "Hotel" name: "WHERE" }
1204 panels { room: "Hotel" name: "DOROTHY" }
1205 panels { room: "Hotel" name: "JACKET" }
1206 panels { room: "Hotel" name: "TAIL" }
1207 panels { room: "Hotel" name: "JAWS" }
1208 panels { room: "Hotel" name: "FLOUNDER" }
1209 panels { room: "Hotel" name: "WHEN" }
1210 panels { room: "Hotel" name: "CLAWS" }
1211 panels { room: "Hotel" name: "BRUCE" }
1212 location_room: "Hotel"
1213}
1214doors {
1215 name: "Hotel Second Floor"
1216 type: LOCATION_ONLY
1217 panels { room: "Hotel" name: "POTATO" }
1218 panels { room: "Hotel" name: "SALAD" }
1219 panels { room: "Hotel" name: "BATHING" }
1220 panels { room: "Hotel" name: "MICRO" }
1221 panels { room: "Hotel" name: "BUSINESS" }
1222 panels { room: "Hotel" name: "WEDDING" }
1223 panels { room: "Hotel" name: "TREE" }
1224 panels { room: "Hotel" name: "RIVER" }
1225 panels { room: "Hotel" name: "TUNING" }
1226 panels { room: "Hotel" name: "BOXING" }
1227 panels { room: "Hotel" name: "TELEPHONE" }
1228 panels { room: "Hotel" name: "LAW" }
1229 panels { room: "Hotel" name: "POKER" }
1230 panels { room: "Hotel" name: "CARD" }
1231 panels { room: "Hotel" name: "ROAD" }
1232 panels { room: "Hotel" name: "CHOCOLATE" }
1233 location_room: "Hotel"
1234}
1235doors {
1236 name: "Hotel Third Floor"
1237 type: LOCATION_ONLY
1238 panels { room: "Hotel" name: "DEPART" }
1239 panels { room: "Hotel" name: "WITHDRAW" }
1240 panels { room: "Hotel" name: "QUIT" }
1241 panels { room: "Hotel" name: "LEAVE" }
1242 panels { room: "Hotel" name: "PALE" }
1243 panels { room: "Hotel" name: "JUST" }
1244 panels { room: "Hotel" name: "NEW" }
1245 panels { room: "Hotel" name: "UNTALENTED" }
1246 panels { room: "Hotel" name: "SERVICE" }
1247 panels { room: "Hotel" name: "FULL" }
1248 panels { room: "Hotel" name: "EVIL" }
1249 panels { room: "Hotel" name: "HONEY" }
1250 panels { room: "Hotel" name: "CRESCENT" }
1251 panels { room: "Hotel" name: "INVALID" }
1252 panels { room: "Hotel" name: "FESTIVAL" }
1253 panels { room: "Hotel" name: "BEAUTIFUL" }
1254 location_room: "Hotel"
1255}
1256doors {
1257 name: "Hotel Fourth Floor"
1258 type: LOCATION_ONLY
1259 panels { room: "Hotel" name: "WILTED" }
1260 panels { room: "Hotel" name: "DROOPED" }
1261 panels { room: "Hotel" name: "FADED" }
1262 panels { room: "Hotel" name: "WANED" }
1263 panels { room: "Hotel" name: "TALL" }
1264 panels { room: "Hotel" name: "CANVAS" }
1265 panels { room: "Hotel" name: "LEVER" }
1266 panels { room: "Hotel" name: "SCULPTURE" }
1267 panels { room: "Hotel" name: "RAGE" }
1268 panels { room: "Hotel" name: "BALL" }
1269 panels { room: "Hotel" name: "FOOL" }
1270 panels { room: "Hotel" name: "VERGE" }
1271 panels { room: "Hotel" name: "ART" }
1272 panels { room: "Hotel" name: "EVER" }
1273 panels { room: "Hotel" name: "PAIN" }
1274 panels { room: "Hotel" name: "FOOT" }
1275 location_room: "Hotel"
1276}
1277doors {
1278 name: "Checkered Door"
1279 type: ITEM_ONLY
1280 receivers: "Components/Doors/Halls/connections_1"
1281 receivers: "Components/Doors/Halls/connections_3"
1282 # These have the same effect as the above, but including them here prevents
1283 # them from opening in door shuffle when the J2 door opens.
1284 receivers: "Components/Triggers/teleportListenerConnections3"
1285 receivers: "Components/Triggers/teleportListenerConnections4"
1286 # This door can open from either solving all panels, or just the smiley ones,
1287 # and the latter is obviously a subset of the former so let's just check for
1288 # that.
1289 panels { room: "Hotel" name: "PARKA" }
1290 panels { room: "Hotel" name: "CLOAK" }
1291 panels { room: "Hotel" name: "DOROTHY" }
1292 panels { room: "Hotel" name: "JAWS" }
1293 panels { room: "Hotel" name: "WHEN" }
1294 panels { room: "Hotel" name: "CLAWS" }
1295 panels { room: "Hotel" name: "POTATO" }
1296 panels { room: "Hotel" name: "MICRO" }
1297 panels { room: "Hotel" name: "TUNING" }
1298 panels { room: "Hotel" name: "LAW" }
1299 panels { room: "Hotel" name: "CARD" }
1300 panels { room: "Hotel" name: "ROAD" }
1301 panels { room: "Hotel" name: "DEPART" }
1302 panels { room: "Hotel" name: "LEAVE" }
1303 panels { room: "Hotel" name: "SERVICE" }
1304 panels { room: "Hotel" name: "HONEY" }
1305 panels { room: "Hotel" name: "INVALID" }
1306 panels { room: "Hotel" name: "FESTIVAL" }
1307 panels { room: "Hotel" name: "WILTED" }
1308 panels { room: "Hotel" name: "WANED" }
1309 panels { room: "Hotel" name: "RAGE" }
1310 panels { room: "Hotel" name: "VERGE" }
1311 panels { room: "Hotel" name: "EVER" }
1312 panels { room: "Hotel" name: "PAIN" }
1313}
1314doors {
1315 name: "J2 Door 1"
1316 type: EVENT
1317 panels { room: "Hotel" name: "PARKA" }
1318 panels { room: "Hotel" name: "CLOAK" }
1319 panels { room: "Hotel" name: "DOROTHY" }
1320 panels { room: "Hotel" name: "JAWS" }
1321 panels { room: "Hotel" name: "WHEN" }
1322 panels { room: "Hotel" name: "CLAWS" }
1323 panels { room: "Hotel" name: "POTATO" }
1324 panels { room: "Hotel" name: "MICRO" }
1325 panels { room: "Hotel" name: "TUNING" }
1326 panels { room: "Hotel" name: "LAW" }
1327 panels { room: "Hotel" name: "CARD" }
1328 panels { room: "Hotel" name: "ROAD" }
1329 panels { room: "Hotel" name: "DEPART" }
1330 panels { room: "Hotel" name: "LEAVE" }
1331 panels { room: "Hotel" name: "SERVICE" }
1332 panels { room: "Hotel" name: "HONEY" }
1333 panels { room: "Hotel" name: "INVALID" }
1334 panels { room: "Hotel" name: "FESTIVAL" }
1335 panels { room: "Hotel" name: "WILTED" }
1336 panels { room: "Hotel" name: "WANED" }
1337 panels { room: "Hotel" name: "RAGE" }
1338 panels { room: "Hotel" name: "VERGE" }
1339 panels { room: "Hotel" name: "EVER" }
1340 panels { room: "Hotel" name: "PAIN" }
1341}
1342doors {
1343 name: "J2 Door 2"
1344 type: EVENT
1345 panels { room: "J2 Vestibule" name: "COLORFUL" }
1346}
1347doors {
1348 name: "Wonderland North Door"
1349 type: ITEM_ONLY
1350 receivers: "Components/Doors/Halls/wonderland_2"
1351 panels { room: "Wonderland" name: "APRIL" }
1352 panels { room: "Wonderland" name: "UNDER" }
1353 panels { room: "Wonderland" name: "ANGRY" }
1354 panels { room: "Wonderland" name: "ARTS" }
1355 panels { room: "Wonderland" name: "SONG" }
1356}
1357doors {
1358 name: "Bee Room Entrance"
1359 type: STANDARD
1360 receivers: "Components/Doors/Halls/bee_entry"
1361 panels { room: "Outside House" name: "WING" }
1362 panels { room: "Outside House" name: "DOTE" }
1363 location_room: "Outside House"
1364}
1365doors {
1366 name: "Intense Room Entrance"
1367 type: STANDARD
1368 receivers: "Components/Doors/Halls/bee_entry2"
1369 panels { room: "Outside House" name: "VIVID" }
1370 panels { room: "Outside House" name: "RIGHT" }
1371 location_room: "Outside House"
1372}
1373doors {
1374 name: "D2 Room"
1375 type: EVENT
1376 panels { room: "Outside House" name: "VIVID" }
1377 panels { room: "Outside House" name: "RIGHT" }
1378 panels { room: "Intense Room" name: "BRILLIANT" }
1379 panels { room: "Intense Room" name: "HORRIBLE" }
1380 panels { room: "Intense Room" name: "INSTANTLY" }
1381 panels { room: "Intense Room" name: "COLOSSAL" }
1382 panels { room: "Intense Room" name: "RUN" }
1383 panels { room: "Intense Room" name: "SLEEP" }
1384 panels { room: "Intense Room" name: "TOSS" }
1385 panels { room: "Intense Room" name: "SHATTER" }
1386 panels { room: "Intense Room" name: "DELICIOUS" }
1387}
1388doors {
1389 name: "Bee Room Back Door"
1390 type: ITEM_ONLY
1391 receivers: "Components/Doors/Halls/bee_exit"
1392 panels { room: "Outside House" name: "WING" }
1393 panels { room: "Outside House" name: "DOTE" }
1394 panels { room: "Bee Room Obverse" name: "SINGLE" }
1395 panels { room: "Bee Room Obverse" name: "BLINDER" }
1396 panels { room: "Bee Room Obverse" name: "SURE" }
1397 panels { room: "Bee Room Obverse" name: "BLUR" }
1398 panels { room: "Bee Room Obverse" name: "FRINGE" }
1399 panels { room: "Bee Room Obverse" name: "CINDER" }
1400 panels { room: "Bee Room Obverse" name: "FUMBLE" }
1401 panels { room: "Bee Room Obverse" name: "LATCH" }
1402 panels { room: "Bee Room Reverse" name: "POCKET" }
1403 panels { room: "Bee Room Reverse" name: "FLUME" }
1404 panels { room: "Bee Room Reverse" name: "HEALED" }
1405 panels { room: "Bee Room Reverse" name: "SCRATCH" }
1406 panels { room: "Bee Room Reverse" name: "MINORITY" }
1407 panels { room: "Bee Room Reverse" name: "STYLINGS" }
1408 panels { room: "Bee Room Reverse" name: "PLANTS" }
1409 panels { room: "Bee Room Reverse" name: "COUNCIL" }
1410}
1411doors {
1412 name: "Bee Room Obverse"
1413 type: LOCATION_ONLY
1414 panels { room: "Bee Room Obverse" name: "SINGLE" }
1415 panels { room: "Bee Room Obverse" name: "BLINDER" }
1416 panels { room: "Bee Room Obverse" name: "SURE" }
1417 panels { room: "Bee Room Obverse" name: "BLUR" }
1418 panels { room: "Bee Room Obverse" name: "FRINGE" }
1419 panels { room: "Bee Room Obverse" name: "CINDER" }
1420 panels { room: "Bee Room Obverse" name: "FUMBLE" }
1421 panels { room: "Bee Room Obverse" name: "LATCH" }
1422 location_room: "Bee Room Obverse"
1423}
1424doors {
1425 name: "Bee Room Reverse"
1426 type: LOCATION_ONLY
1427 panels { room: "Bee Room Reverse" name: "POCKET" }
1428 panels { room: "Bee Room Reverse" name: "FLUME" }
1429 panels { room: "Bee Room Reverse" name: "HEALED" }
1430 panels { room: "Bee Room Reverse" name: "SCRATCH" }
1431 panels { room: "Bee Room Reverse" name: "MINORITY" }
1432 panels { room: "Bee Room Reverse" name: "STYLINGS" }
1433 panels { room: "Bee Room Reverse" name: "PLANTS" }
1434 panels { room: "Bee Room Reverse" name: "COUNCIL" }
1435 location_room: "Bee Room Reverse"
1436}
1437doors {
1438 name: "Gourd Door"
1439 type: STANDARD
1440 receivers: "Components/Doors/Halls/pumpkin_1"
1441 panels { room: "Outside Hedges" name: "GOURD (1)" }
1442 panels { room: "Outside Hedges" name: "GOURD (2)" }
1443 panels { room: "Outside Hedges" name: "GOURD (3)" }
1444 panels { room: "Outside Hedges" name: "GOURD (4)" }
1445 location_room: "Outside Hedges"
1446}
1447doors {
1448 name: "Castle Drawbridge"
1449 type: STANDARD
1450 receivers: "Components/Doors/Castle/Drawbridge/animationListener"
1451 panels { room: "Roof" name: "?" }
1452 location_room: "Roof"
1453}
1454doors {
1455 name: "Roof Access"
1456 type: ITEM_ONLY
1457 receivers: "Components/Doors/Castle/entry_stairs_big"
1458 receivers: "Components/Doors/Castle/entry_stairs_big2"
1459 receivers: "Meshes/Stairs/staircase31/teleportListener"
1460 receivers: "Meshes/Stairs/staircase32/teleportListener2"
1461 receivers: "Meshes/Stairs/staircase33/teleportListener3"
1462 receivers: "Panels/Castle Entrance/castle_direction_1/teleportListener"
1463 receivers: "Panels/Castle Entrance/castle_direction_2/teleportListener"
1464 receivers: "Panels/Castle Entrance/castle_direction_3/teleportListener"
1465 panels { room: "North Castle Area" name: "A SUMMER PLACE" }
1466 panels { room: "West Castle Area" name: "SONG FACE" }
1467 panels { room: "South Castle Area" name: "AN OFFER VILLAGE BEFORE LAIR" }
1468}
1469doors {
1470 name: "North Castle Panel"
1471 type: LOCATION_ONLY
1472 panels { room: "North Castle Area" name: "A SUMMER PLACE" }
1473 location_room: "North Castle Area"
1474}
1475doors {
1476 name: "West Castle Panel"
1477 type: LOCATION_ONLY
1478 panels { room: "West Castle Area" name: "SONG FACE" }
1479 location_room: "West Castle Area"
1480}
1481doors {
1482 name: "South Castle Panel"
1483 type: LOCATION_ONLY
1484 panels { room: "South Castle Area" name: "AN OFFER VILLAGE BEFORE LAIR" }
1485 location_room: "South Castle Area"
1486}
1487doors {
1488 name: "Pairs Room North And South Doors"
1489 type: STANDARD
1490 receivers: "Components/Doors/Pairs/pairs_3"
1491 receivers: "Components/Doors/Pairs/pairs_4"
1492 panels { room: "Outside Snake Room" name: "TONGUE" }
1493 panels { room: "Outside Snake Room" name: "ACE" }
1494 panels { room: "Outside Snake Room" name: "ANIMAL" }
1495 panels { room: "Outside Snake Room" name: "ONES" }
1496 panels { room: "West Castle Area" name: "FALSIFY" }
1497 panels { room: "West Castle Area" name: "ALL" }
1498 panels { room: "West Spire" name: "CUT" }
1499 panels { room: "West Spire" name: "STONES" }
1500 location_room: "West Spire"
1501 location_name: "Pairs Room Puzzles"
1502}
1503doors {
1504 name: "Pairs Room West Door"
1505 type: ITEM_ONLY
1506 receivers: "Components/Doors/Pairs/pairs_2"
1507 panels { room: "Outside Snake Room" name: "TONGUE" }
1508 panels { room: "Outside Snake Room" name: "ACE" }
1509 panels { room: "Outside Snake Room" name: "ANIMAL" }
1510 panels { room: "Outside Snake Room" name: "ONES" }
1511 panels { room: "West Castle Area" name: "FALSIFY" }
1512 panels { room: "West Castle Area" name: "ALL" }
1513 panels { room: "West Spire" name: "CUT" }
1514 panels { room: "West Spire" name: "STONES" }
1515}
1516doors {
1517 name: "Pairs Room East Door"
1518 type: ITEM_ONLY
1519 receivers: "Components/Doors/Pairs/pairs_1"
1520 panels { room: "Outside Snake Room" name: "TONGUE" }
1521 panels { room: "Outside Snake Room" name: "ACE" }
1522 panels { room: "Outside Snake Room" name: "ANIMAL" }
1523 panels { room: "Outside Snake Room" name: "ONES" }
1524 panels { room: "West Castle Area" name: "FALSIFY" }
1525 panels { room: "West Castle Area" name: "ALL" }
1526 panels { room: "West Spire" name: "CUT" }
1527 panels { room: "West Spire" name: "STONES" }
1528}
1529doors {
1530 name: "Salt Room Entrance"
1531 type: STANDARD
1532 receivers: "Components/Doors/Color Reading/door_1"
1533 panels { room: "Outside Salt Room" name: "Colors" }
1534 location_room: "Outside Salt Room"
1535}
1536doors {
1537 name: "Rainbow Rooms Entrance"
1538 type: ITEM_ONLY
1539 receivers: "Components/Doors/Color Reading/door_2"
1540 panels { room: "Rainbow Start" name: "PAINTING" }
1541}
1542doors {
1543 name: "Red Rainbow Room"
1544 type: STANDARD
1545 receivers: "Components/Doors/Color Reading/door_3"
1546 panels { room: "Rainbow Start" name: "PAINTING" }
1547 location_room: "Rainbow Start"
1548}
1549doors {
1550 name: "Orange Rainbow Room"
1551 type: ITEM_ONLY
1552 receivers: "Components/Doors/Color Reading/door_4"
1553 panels { room: "Rainbow Red" name: "THEME" }
1554 panels { room: "Red Smiley" name: "SMILE" }
1555}
1556doors {
1557 name: "Yellow Rainbow Room"
1558 type: ITEM_ONLY
1559 receivers: "Components/Doors/Color Reading/door_17"
1560 panels { room: "Rainbow Orange" name: "THEME" }
1561 panels { room: "Outside Orange Room" name: "SMILE" }
1562}
1563doors {
1564 name: "Green Rainbow Room"
1565 type: ITEM_ONLY
1566 receivers: "Components/Doors/Color Reading/door_5"
1567 panels { room: "Rainbow Yellow" name: "THEME" }
1568 panels { room: "Hedges" name: "SMILE" }
1569}
1570doors {
1571 name: "Blue Rainbow Room"
1572 type: ITEM_ONLY
1573 receivers: "Components/Doors/Color Reading/door_6"
1574 panels { room: "Rainbow Green" name: "THEME" }
1575 panels { room: "Green Smiley" name: "SMILE" }
1576}
1577doors {
1578 name: "Purple Rainbow Room"
1579 type: ITEM_ONLY
1580 receivers: "Components/Doors/Color Reading/door_7"
1581 panels { room: "Rainbow Blue" name: "THEME" }
1582 panels { room: "Blue Smiley" name: "SMILE" }
1583}
1584doors {
1585 name: "Red Rainbow Panel"
1586 type: LOCATION_ONLY
1587 panels { room: "Rainbow Red" name: "THEME" }
1588 location_room: "Rainbow Red"
1589}
1590doors {
1591 name: "Orange Rainbow Panel"
1592 type: LOCATION_ONLY
1593 panels { room: "Rainbow Orange" name: "THEME" }
1594 location_room: "Rainbow Orange"
1595}
1596doors {
1597 name: "Yellow Rainbow Panel"
1598 type: LOCATION_ONLY
1599 panels { room: "Rainbow Yellow" name: "THEME" }
1600 location_room: "Rainbow Yellow"
1601}
1602doors {
1603 name: "Green Rainbow Panel"
1604 type: LOCATION_ONLY
1605 panels { room: "Rainbow Green" name: "THEME" }
1606 location_room: "Rainbow Green"
1607}
1608doors {
1609 name: "Blue Rainbow Panel"
1610 type: LOCATION_ONLY
1611 panels { room: "Rainbow Blue" name: "THEME" }
1612 location_room: "Rainbow Blue"
1613}
1614doors {
1615 name: "Cyan Rainbow Room"
1616 type: ITEM_ONLY
1617 receivers: "Components/Doors/Color Reading/door_18"
1618 panels { room: "Rainbow Purple" name: "THEME" }
1619 panels { room: "Purple Smiley" name: "SMILE" }
1620}
1621doors {
1622 name: "Purple Rainbow Panel"
1623 type: LOCATION_ONLY
1624 panels { room: "Rainbow Purple" name: "THEME" }
1625 location_room: "Rainbow Purple"
1626}
1627doors {
1628 name: "Brown Rainbow Room"
1629 type: STANDARD
1630 receivers: "Components/Doors/Color Reading/door_8"
1631 panels { room: "Rainbow Cyan" name: "THEME" }
1632 location_room: "Rainbow Cyan"
1633 location_name: "Cyan Rainbow Panel"
1634}
1635doors {
1636 name: "Pepper Room Entrance"
1637 type: STANDARD
1638 receivers: "Components/Doors/Color Reading/door_9"
1639 panels { room: "Red Color Door" name: "Colors" }
1640 location_room: "Red Color Door"
1641}
1642doors {
1643 name: "Hotel Entrance"
1644 type: STANDARD
1645 receivers: "Components/Doors/Color Reading/door_14"
1646 panels { room: "Outside Hotel" name: "COLORFUL" }
1647 location_room: "Outside Hotel"
1648}
1649doors {
1650 name: "Seasoning Doors"
1651 type: STANDARD
1652 receivers: "Components/Doors/Color Reading/door_10"
1653 receivers: "Components/Doors/Color Reading/door_11"
1654 panels { room: "Salt Room" name: "SEASONING" }
1655 panels { room: "Pepper Room" name: "SEASONING" }
1656 location_room: "Pepper Room"
1657 location_name: "Seasonings"
1658}
1659doors {
1660 name: "Bow Side"
1661 type: EVENT
1662 panels { room: "Brown Smiley" name: "OTHERS" }
1663}
1664doors {
1665 name: "Brown Smiley Shortcut"
1666 type: EVENT
1667 panels { room: "Brown Smiley" name: "OTHERS" }
1668}
1669doors {
1670 name: "Bow Side Panel"
1671 type: LOCATION_ONLY
1672 panels { room: "Bow Side" name: "?" }
1673 location_room: "Bow Side"
1674}
1675doors {
1676 name: "Rain Side Panel"
1677 type: LOCATION_ONLY
1678 panels { room: "Rain Side" name: "?" }
1679 location_room: "Rain Side"
1680}
1681doors {
1682 name: "Gold Ending Blockers"
1683 type: EVENT
1684 panels { room: "Bow Side" name: "?" }
1685 panels { room: "Rain Side" name: "?" }
1686}
1687doors {
1688 name: "Blue Smiley Exit To Red"
1689 type: LOCATION_ONLY
1690 # Components/Doors/Smileys/blue_1
1691 panels { room: "Blue Smiley" name: "SMILE" }
1692 location_room: "Blue Smiley"
1693 location_name: "Blue SMILE"
1694}
1695doors {
1696 name: "Blue Smiley Annex"
1697 type: EVENT
1698 # Components/Doors/Smileys/blue_2
1699 panels { room: "Blue Smiley" name: "SMILE" }
1700}
1701doors {
1702 name: "Purple Smiley Exit To Hallway"
1703 type: EVENT
1704 # Components/Doors/Smileys/purple_2
1705 panels { room: "Purple Smiley" name: "SMILE" }
1706}
1707doors {
1708 name: "Purple Smiley Exit To Cream Hex"
1709 type: EVENT
1710 # Components/Doors/Smileys/purple_3
1711 panels { room: "Purple Smiley" name: "SMILE" }
1712}
1713doors {
1714 name: "Yellow Smiley Annex"
1715 type: EVENT
1716 # Components/Doors/Smileys/yellow_1
1717 panels { room: "Hedges" name: "SMILE" }
1718}
1719doors {
1720 name: "Yellow Smiley Door"
1721 type: STANDARD
1722 receivers: "Components/Doors/Smileys/yellow_2"
1723 panels { room: "Hedges" name: "SMILE" }
1724 location_room: "Hedges"
1725 location_name: "Yellow SMILE"
1726}
1727doors {
1728 name: "Green Smiley"
1729 type: STANDARD
1730 receivers: "Components/Doors/Smileys/green_1"
1731 receivers: "Components/Doors/Smileys/green_2"
1732 panels { room: "Green Smiley" name: "SMILE" }
1733 location_room: "Green Smiley"
1734 location_name: "Green SMILE"
1735}
1736doors {
1737 name: "Orange Smiley Exit"
1738 type: STANDARD
1739 receivers: "Components/Doors/Smileys/orange_1"
1740 panels { room: "Outside Orange Room" name: "SMILE" }
1741 location_room: "Outside Orange Room"
1742 location_name: "Orange SMILE"
1743}
1744doors {
1745 name: "F Keyholder Door"
1746 type: ITEM_ONLY
1747 receivers: "Components/Doors/Smileys/orange_2"
1748 panels { room: "Outside Orange Room" name: "SMILE" }
1749}
1750doors {
1751 name: "Flip Painting Blocker"
1752 type: ITEM_ONLY
1753 receivers: "Components/Doors/Smileys/orange_3"
1754 panels { room: "Flip Painting Hidden Panel" name: "HIDDEN" answer: "secret" }
1755}
1756doors {
1757 name: "Red Smiley Entrance"
1758 type: ITEM_ONLY
1759 receivers: "Components/Doors/Smileys/red_2"
1760 panels { room: "Outside Red Room" name: "ROCK" }
1761}
1762doors {
1763 name: "Red Smiley"
1764 type: LOCATION_ONLY
1765 panels { room: "Red Smiley" name: "SMILE" }
1766 location_room: "Red Smiley"
1767 location_name: "Red SMILE"
1768}
1769doors {
1770 name: "Pink Hallway"
1771 type: STANDARD
1772 receivers: "Components/Doors/Halls 2/door_19"
1773 receivers: "Components/Doors/Halls 2/door_20"
1774 receivers: "Components/Doors/Halls 2/door_21"
1775 # These two (maze paintings and yellow backside) could maybe be detached.
1776 receivers: "Components/Doors/Halls 2/door_23"
1777 receivers: "Components/Doors/Halls 2/door_24"
1778 panels { room: "Green Color Door" name: "OLD (1)" }
1779 panels { room: "Green Color Door" name: "OLD (2)" }
1780 panels { room: "Green Color Door" name: "SLEEPY" }
1781 panels { room: "Green Color Door" name: "COMELY" }
1782 location_room: "Green Color Door"
1783}
1784doors {
1785 name: "Cyan Room Entrance"
1786 type: STANDARD
1787 receivers: "Components/Doors/Halls 2/brown_entry"
1788 panels { room: "Outside Snake Room" name: "DEE SIX" }
1789 location_room: "Outside Snake Room"
1790}
1791doors {
1792 name: "Cyan Room"
1793 type: LOCATION_ONLY
1794 panels { room: "Cyan Room" name: "LIFE" }
1795 panels { room: "Cyan Room" name: "SKIRMISH" }
1796 panels { room: "Cyan Room" name: "WORD" }
1797 panels { room: "Cyan Room" name: "SUMMER" }
1798 panels { room: "Cyan Room" name: "ACCLIMATE (1)" }
1799 panels { room: "Cyan Room" name: "ACCLIMATE (2)" }
1800 panels { room: "Cyan Room" name: "P+EMIC" }
1801 panels { room: "Cyan Room" name: "METEOROID" }
1802 panels { room: "Cyan Room" name: "CLEAR" }
1803 panels { room: "Cyan Room" name: "COLD" }
1804 panels { room: "Cyan Room" name: "WORDWORD" }
1805 location_room: "Cyan Room"
1806 location_name: "Puzzles"
1807}
1808doors {
1809 name: "Green Room Entrance"
1810 type: STANDARD
1811 receivers: "Components/Doors/Halls 2/green_entry"
1812 panels { room: "After Bee Room" name: "ROOM" }
1813 location_room: "After Bee Room"
1814}
1815doors {
1816 name: "Green Room"
1817 type: LOCATION_ONLY
1818 panels { room: "Green Room" name: "TIMESCALE" }
1819 panels { room: "Green Room" name: "MAILBOX" }
1820 panels { room: "Green Room" name: "MILKY" }
1821 panels { room: "Green Room" name: "TAN" }
1822 panels { room: "Green Room" name: "BLAND" }
1823 panels { room: "Green Room" name: "WATERCOOLER" }
1824 panels { room: "Green Room" name: "FIXATE" }
1825 panels { room: "Green Room" name: "THAT" }
1826 panels { room: "Green Room" name: "RICE" }
1827 panels { room: "Green Room" name: "DOUBLE" }
1828 panels { room: "Green Room" name: "BADMINTON" }
1829 location_room: "Green Room"
1830 location_name: "Puzzles"
1831}
1832doors {
1833 name: "Blue Hallway South Divider"
1834 type: STANDARD
1835 receivers: "Components/Doors/Halls 2/halls_1"
1836 panels { room: "Blue Hallway" name: "SHORT" }
1837 panels { room: "Blue Hallway Cut Side" name: "CUT" }
1838 location_room: "Blue Hallway Cut Side"
1839}
1840doors {
1841 name: "Near Sweet Brown Door"
1842 type: ITEM_ONLY
1843 legacy_location: true
1844 receivers: "Components/Doors/Halls 2/halls_2"
1845 panels { room: "Sweet Foyer" name: "RENT (4)" }
1846 location_room: "Sweet Foyer"
1847}
1848doors {
1849 name: "Rent Panels"
1850 type: LOCATION_ONLY
1851 panels { room: "Sweet Foyer" name: "RENT (1)" }
1852 panels { room: "Sweet Foyer" name: "RENT (2)" }
1853 panels { room: "Sweet Foyer" name: "RENT (3)" }
1854 panels { room: "Sweet Foyer" name: "RENT (4)" }
1855 location_room: "Sweet Foyer"
1856}
1857doors {
1858 name: "Equality Panels"
1859 type: LOCATION_ONLY
1860 panels { room: "Sweet Foyer" name: "EQUAL" }
1861 panels { room: "Sweet Foyer" name: "QUALITY" }
1862 location_room: "Sweet Foyer"
1863 location_name: "EQUAL, QUALITY"
1864}
1865doors {
1866 name: "Orange Panels"
1867 type: LOCATION_ONLY
1868 panels { room: "Blue Smiley Annex" name: "ORANGE (1)" }
1869 panels { room: "Blue Smiley Annex" name: "ORANGE (2)" }
1870 location_room: "Blue Smiley Annex"
1871}
1872doors {
1873 name: "Red Room Entrance"
1874 type: STANDARD
1875 receivers: "Components/Doors/Halls 2/halls_3"
1876 panels { room: "Outside Red Room" name: "ROCK" }
1877 location_room: "Outside Red Room"
1878}
1879doors {
1880 name: "Red Room"
1881 type: LOCATION_ONLY
1882 panels { room: "Red Room" name: "BLINDING" }
1883 panels { room: "Red Room" name: "MONTH" }
1884 panels { room: "Red Room" name: "CHAIN" }
1885 panels { room: "Red Room" name: "FLOWER" }
1886 panels { room: "Red Room" name: "OVERCHARGE" }
1887 panels { room: "Red Room" name: "LOSER" }
1888 panels { room: "Red Room" name: "PAD" }
1889 panels { room: "Red Room" name: "RISE" }
1890 panels { room: "Red Room" name: "ELEGANCE" }
1891 panels { room: "Red Room" name: "TESTAMENT" }
1892 panels { room: "Red Room" name: "TAKEOUT" }
1893 location_room: "Red Room"
1894 location_name: "Puzzles"
1895}
1896doors {
1897 name: "Blue Hallway To Red Room"
1898 type: EVENT
1899 panels { room: "Blue Hallway Cut Side" name: "GREEN" }
1900}
1901doors {
1902 name: "Blue Hallway North Divider"
1903 type: STANDARD
1904 receivers: "Components/Doors/Halls 2/halls_5"
1905 panels { room: "Blue Hallway" name: "CHOP" }
1906 panels { room: "Blue Hallway Tall Side" name: "TALL" }
1907 location_room: "Blue Hallway Tall Side"
1908 location_name: "CHOP, TALL"
1909}
1910doors {
1911 name: "Near Yellow Room Door"
1912 type: STANDARD
1913 receivers: "Components/Doors/Halls 2/halls_6"
1914 panels { room: "Blue Hallway Tall Side" name: "SHOO" }
1915 panels { room: "Blue Hallway Tall Side" name: "ALL WAY" }
1916 panels { room: "Blue Hallway Tall Side" name: "FOUR" }
1917 panels { room: "Blue Hallway Tall Side" name: "OFFER" }
1918 panels { room: "Blue Hallway Tall Side" name: "CHILD" }
1919 panels { room: "Blue Hallway Tall Side" name: "NEW" }
1920 location_room: "Blue Hallway Tall Side"
1921 location_name: "Pink Hex"
1922}
1923doors {
1924 name: "House Side Door"
1925 type: ITEM_ONLY
1926 receivers: "Components/Doors/Halls 2/halls_7"
1927 receivers: "Components/Doors/Halls 2/halls_8"
1928 panels { room: "Blue Hallway Tall Side" name: "SHOO" }
1929 panels { room: "Blue Hallway Tall Side" name: "ALL WAY" }
1930 panels { room: "Blue Hallway Tall Side" name: "FOUR" }
1931 panels { room: "Blue Hallway Tall Side" name: "OFFER" }
1932 panels { room: "Blue Hallway Tall Side" name: "CHILD" }
1933 panels { room: "Blue Hallway Tall Side" name: "NEW" }
1934}
1935doors {
1936 name: "Yellow Room Entrance"
1937 type: STANDARD
1938 receivers: "Components/Doors/Halls 2/yellow_1"
1939 receivers: "Panels/Yellow Room/panel_entry/animationListener"
1940 panels { room: "Yellow Color Door" name: "SUN" }
1941 location_room: "Yellow Color Door"
1942}
1943doors {
1944 name: "Yellow Room"
1945 type: LOCATION_ONLY
1946 panels { room: "Yellow Room" name: "FREE" }
1947 panels { room: "Yellow Room" name: "TORSOBOUNCE" }
1948 panels { room: "Yellow Room" name: "TORSO BOUNCE" }
1949 panels { room: "Yellow Room" name: "JAWBREAKER" }
1950 panels { room: "Yellow Room" name: "EXPLODE" }
1951 panels { room: "Yellow Room" name: "JAPAN" }
1952 panels { room: "Yellow Room" name: "COLOR" }
1953 panels { room: "Yellow Room" name: "PERSON" }
1954 panels { room: "Yellow Room" name: "PARROT" }
1955 panels { room: "Yellow Room" name: "PROTON" }
1956 panels { room: "Yellow Room" name: "SPIRIT" }
1957 location_room: "Yellow Room"
1958 location_name: "Puzzles"
1959}
1960doors {
1961 name: "Dark Light Room Entrance"
1962 type: ITEM_ONLY
1963 receivers: "Components/Doors/Halls 2/hedge_1"
1964 panels { room: "Rainbow Color Doors" name: "INWALK" }
1965 panels { room: "Rainbow Color Doors" name: "RAIN" }
1966 panels { room: "Rainbow Color Doors" name: "PURCHASE" }
1967 panels { room: "Rainbow Color Doors" name: "HOURS" }
1968 panels { room: "Rainbow Color Doors" name: "MISCHIEF" }
1969 panels { room: "Rainbow Color Doors" name: "CASUAL" }
1970 panels { room: "Gray Color Door" name: "PATCH" }
1971}
1972doors {
1973 name: "Dark Light Room Exit"
1974 type: ITEM_ONLY
1975 receivers: "Components/Doors/Halls 2/hedge_4"
1976 panels { room: "Dark Light Room" name: "COIN (1)" }
1977 panels { room: "Dark Light Room" name: "DOG (1)" }
1978 panels { room: "Dark Light Room" name: "SONG (1)" }
1979 panels { room: "Dark Light Room" name: "HUMAN (1)" }
1980 panels { room: "Dark Light Room" name: "ROSE (1)" }
1981 panels { room: "Dark Light Room" name: "DARK" }
1982 panels { room: "Dark Light Room" name: "COIN (2)" }
1983 panels { room: "Dark Light Room" name: "DOG (2)" }
1984 panels { room: "Dark Light Room" name: "SONG (2)" }
1985 panels { room: "Dark Light Room" name: "HUMAN (2)" }
1986 panels { room: "Dark Light Room" name: "ROSE (2)" }
1987 panels { room: "Dark Light Exit" name: "GASKET" }
1988}
1989doors {
1990 name: "Dark Light Room Exit Panel"
1991 type: LOCATION_ONLY
1992 panels { room: "Dark Light Exit" name: "GASKET" }
1993 location_room: "Dark Light Exit"
1994 location_name: "GASKET"
1995}
1996doors {
1997 name: "Dark Light Room Divider"
1998 type: STANDARD
1999 receivers: "Components/Doors/Halls 2/hedge_7"
2000 panels { room: "Dark Light Room" name: "COIN (1)" }
2001 panels { room: "Dark Light Room" name: "DOG (1)" }
2002 panels { room: "Dark Light Room" name: "SONG (1)" }
2003 panels { room: "Dark Light Room" name: "HUMAN (1)" }
2004 panels { room: "Dark Light Room" name: "ROSE (1)" }
2005 panels { room: "Dark Light Room" name: "DARK" }
2006 panels { room: "Dark Light Room" name: "COIN (2)" }
2007 panels { room: "Dark Light Room" name: "DOG (2)" }
2008 panels { room: "Dark Light Room" name: "SONG (2)" }
2009 panels { room: "Dark Light Room" name: "HUMAN (2)" }
2010 panels { room: "Dark Light Room" name: "ROSE (2)" }
2011 # Not technically true; it's complete_at=11 with both rooms, but you couldn't
2012 # get to the other side in vanilla doors anyway.
2013 location_room: "Dark Light Room"
2014 location_name: "Main Puzzles"
2015}
2016doors {
2017 name: "Near Sweet Blue Door"
2018 type: STANDARD
2019 receivers: "Components/Doors/Halls 2/hedge_6"
2020 panels { room: "Gray Color Backside" name: "ORANGE" }
2021 panels { room: "Gray Color Backside" name: "BEGINNING" }
2022 panels { room: "Gray Color Backside" name: "FOREWARD" }
2023 panels { room: "Gray Color Backside" name: "GO" }
2024 panels { room: "Gray Color Backside" name: "LAST" }
2025 panels { room: "Gray Color Backside" name: "RISE" }
2026 location_room: "Gray Color Backside"
2027 location_name: "Pale Green Hex"
2028}
2029doors {
2030 name: "South Castle Area Back Door"
2031 type: ITEM_ONLY
2032 receivers: "Components/Doors/Halls 2/hedge_5"
2033 panels { room: "Gray Color Backside" name: "ORANGE" }
2034 panels { room: "Gray Color Backside" name: "BEGINNING" }
2035 panels { room: "Gray Color Backside" name: "FOREWARD" }
2036 panels { room: "Gray Color Backside" name: "GO" }
2037 panels { room: "Gray Color Backside" name: "LAST" }
2038 panels { room: "Gray Color Backside" name: "RISE" }
2039}
2040doors {
2041 name: "South Castle Area Entrance"
2042 type: STANDARD
2043 receivers: "Components/Doors/Halls 2/hedge_2"
2044 panels { room: "Gray Color Door" name: "PATCH" }
2045 location_room: "Gray Color Door"
2046}
2047# hedge_3 has no impact on logic
2048doors {
2049 name: "Plum Room Entrance"
2050 type: STANDARD
2051 receivers: "Components/Doors/Halls 2/plum_2"
2052 panels { room: "After Bee Room" name: "SINGLED" }
2053 location_room: "After Bee Room"
2054}
2055doors {
2056 name: "Plum Room Exit"
2057 type: STANDARD
2058 receivers: "Components/Doors/Halls 2/plum_3"
2059 panels { room: "Plum Room" name: "GOD" }
2060 panels { room: "Plum Room" name: "INJURED" }
2061 panels { room: "Plum Room" name: "HEALTHY" }
2062 panels { room: "Plum Room" name: "DEMURRED" }
2063 panels { room: "Plum Room" name: "FOUROFFERBEAR" }
2064 panels { room: "Plum Room" name: "SNAKE" }
2065 panels { room: "Plum Room" name: "CENTER" }
2066 location_room: "Plum Room"
2067 location_name: "Plum Room"
2068}
2069doors {
2070 name: "D Keyholder Blocker"
2071 type: EVENT
2072 receivers: "Components/Doors/Halls 2/plum_1"
2073 panels { room: "Plum Room" name: "GOD" }
2074 panels { room: "Plum Room" name: "INJURED" }
2075 panels { room: "Plum Room" name: "HEALTHY" }
2076 panels { room: "Plum Room" name: "DEMURRED" }
2077 panels { room: "Plum Room" name: "FOUROFFERBEAR" }
2078 panels { room: "Plum Room" name: "SNAKE" }
2079 panels { room: "Plum Room" name: "CENTER" }
2080}
2081doors {
2082 name: "Planet Room Secret Door"
2083 type: STANDARD
2084 receivers: "Components/Doors/Halls 2/secret_2"
2085 panels { room: "Quiet Entrance" name: "HIDDEN" answer: "secret" }
2086 location_room: "Quiet Entrance"
2087}
2088doors {
2089 name: "Blue Color Doorway"
2090 type: ITEM_ONLY
2091 receivers: "Components/Doors/Halls 2/secret_3"
2092 panels { room: "Quiet Entrance" name: "HIDDEN" answer: "secret" }
2093 panels { room: "Flip Painting Hidden Panel" name: "HIDDEN" answer: "secret" }
2094 complete_at: 1
2095}
2096doors {
2097 name: "Blue Color Backside"
2098 type: ITEM_ONLY
2099 receivers: "Components/Doors/Halls 2/secret_4"
2100 panels { room: "Quiet Entrance" name: "HIDDEN" answer: "secret" }
2101 panels { room: "Flip Painting Hidden Panel" name: "HIDDEN" answer: "secret" }
2102 complete_at: 1
2103}
2104doors {
2105 name: "Pumpkin Room Interior"
2106 type: STANDARD
2107 receivers: "Components/Doors/Pumpkin/pumpkin_1"
2108 receivers: "Components/Doors/Pumpkin/pumpkin_5"
2109 receivers: "Components/Doors/Pumpkin/pumpkin_7"
2110 receivers: "Components/Doors/Pumpkin/pumpkin_8"
2111 receivers: "Components/Doors/Pumpkin/pumpkin_9"
2112 receivers: "Components/Doors/Pumpkin/pumpkin_10"
2113 receivers: "Components/Doors/Pumpkin/pumpkin_11"
2114 receivers: "Components/Doors/Pumpkin/pumpkin_15"
2115 receivers: "Components/Doors/Pumpkin/pumpkin_12"
2116 receivers: "Components/Doors/Pumpkin/pumpkin_13"
2117 receivers: "Components/Doors/Pumpkin/pumpkin_6"
2118 receivers: "Components/Doors/Pumpkin/pumpkin_4"
2119 receivers: "Components/Doors/Pumpkin/pumpkin_2"
2120 receivers: "Components/Doors/Pumpkin/pumpkin_3"
2121 panels { room: "Pumpkin Entrance" name: "JACK" }
2122 location_room: "Pumpkin Entrance"
2123}
2124doors {
2125 name: "Pumpkin Room"
2126 type: LOCATION_ONLY
2127 panels { room: "Pumpkin Entrance" name: "JACK" }
2128 panels { room: "Rainbow Color Doors" name: "PUMP" }
2129 panels { room: "Pumpkin Room" name: "BONE" }
2130 panels { room: "Pumpkin Room" name: "SHEET" }
2131 panels { room: "Pumpkin Room" name: "PHARAOH" }
2132 panels { room: "Pumpkin Room" name: "EMPIRE" }
2133 panels { room: "Pumpkin Room" name: "BEASTS" }
2134 panels { room: "Pumpkin Room" name: "STRAW" }
2135 panels { room: "Pumpkin Room" name: "CACKLE" }
2136 panels { room: "Pumpkin Room" name: "HUMAN" }
2137 panels { room: "Pumpkin Room" name: "JAGUAR" }
2138 location_room: "Pumpkin Room"
2139}
2140doors {
2141 name: "Pumpkin Door"
2142 type: STANDARD
2143 receivers: "Components/Doors/Pumpkin/pumpkin_14"
2144 panels { room: "Rainbow Color Doors" name: "PUMP" }
2145 location_room: "Rainbow Color Doors"
2146}
2147doors {
2148 name: "Computer Room Exit"
2149 type: STANDARD
2150 receivers: "Components/Doors/Unincorporated/temple_foyer_1"
2151 panels { room: "Computer Room Seal" name: "SCROLL" }
2152 location_room: "Computer Room Seal"
2153}
2154doors {
2155 name: "Computer Room Interior Door"
2156 type: STANDARD
2157 receivers: "Components/Doors/Unincorporated/temple_foyer_8"
2158 panels { room: "Computer Room" name: "MONITOR (1)" }
2159 panels { room: "Computer Room" name: "MICROPHONE" }
2160 panels { room: "Computer Room" name: "SPEAKER" }
2161 panels { room: "Computer Room" name: "PROCESSOR (1)" }
2162 panels { room: "Computer Room" name: "MOUSE (1)" }
2163 panels { room: "Computer Room" name: "KEYBOARD (1)" }
2164 panels { room: "Computer Room" name: "MONITOR (2)" }
2165 panels { room: "Computer Room" name: "PROCESSOR (2)" }
2166 panels { room: "Computer Room" name: "MOUSE (2)" }
2167 panels { room: "Computer Room" name: "KEYBOARD (2)" }
2168 location_room: "Computer Room"
2169 location_name: "Main Puzzles"
2170}
2171doors {
2172 name: "Computer Room Entrance"
2173 type: STANDARD
2174 receivers: "Components/Doors/Unincorporated/temple_foyer_2"
2175 panels { room: "Rainbow Color Doors" name: "INWALK" }
2176 panels { room: "Rainbow Color Doors" name: "RAIN" }
2177 panels { room: "Rainbow Color Doors" name: "PURCHASE" }
2178 panels { room: "Rainbow Color Doors" name: "HOURS" }
2179 panels { room: "Rainbow Color Doors" name: "MISCHIEF" }
2180 panels { room: "Rainbow Color Doors" name: "CASUAL" }
2181 location_room: "Rainbow Color Doors"
2182 location_name: "Red Tower"
2183}
2184doors {
2185 name: "C Keyholder Blocker"
2186 type: EVENT
2187 receivers: "Components/Doors/Unincorporated/temple_foyer_7"
2188 panels {
2189 map: "the_ancient"
2190 room: "Inside"
2191 name: "COLOR"
2192 }
2193}
2194doors {
2195 name: "Computer Room Back Door"
2196 type: ITEM_ONLY
2197 receivers: "Components/Doors/Unincorporated/temple_foyer_3"
2198 panels { room: "Computer Room" name: "MONITOR (1)" }
2199 panels { room: "Computer Room" name: "MICROPHONE" }
2200 panels { room: "Computer Room" name: "SPEAKER" }
2201 panels { room: "Computer Room" name: "PROCESSOR (1)" }
2202 panels { room: "Computer Room" name: "MOUSE (1)" }
2203 panels { room: "Computer Room" name: "KEYBOARD (1)" }
2204 panels { room: "Computer Room" name: "MONITOR (2)" }
2205 panels { room: "Computer Room" name: "PROCESSOR (2)" }
2206 panels { room: "Computer Room" name: "MOUSE (2)" }
2207 panels { room: "Computer Room" name: "KEYBOARD (2)" }
2208}
2209doors {
2210 name: "Book Room Entrance"
2211 type: STANDARD
2212 receivers: "Components/Doors/Unincorporated/temple_foyer_4"
2213 panels { room: "Seasoning Room" name: "PARITY" }
2214 location_room: "Seasoning Room"
2215}
2216doors {
2217 name: "Globe Room East Door"
2218 type: STANDARD
2219 receivers: "Components/Doors/Unincorporated/east"
2220 panels { room: "Globe Room" name: "NORTH" answer: "east" }
2221 location_room: "Globe Room"
2222}
2223doors {
2224 name: "Globe Room West Door"
2225 type: STANDARD
2226 receivers: "Components/Doors/Unincorporated/west"
2227 panels { room: "Globe Room" name: "NORTH" answer: "west" }
2228 location_room: "Globe Room"
2229}
2230doors {
2231 name: "Globe Room South Door"
2232 type: STANDARD
2233 receivers: "Components/Doors/Unincorporated/west2"
2234 panels { room: "Globe Room" name: "NORTH" answer: "south" }
2235 location_room: "Globe Room"
2236}
2237doors {
2238 name: "Book Room Exit"
2239 type: STANDARD
2240 receivers: "Components/Doors/Unincorporated/temple_foyer_5"
2241 panels { room: "Book Room" name: "BOOK (1)" }
2242 panels { room: "Book Room" name: "BOOK (2)" }
2243 panels { room: "Book Room" name: "BOOK (3)" }
2244 panels { room: "Book Room" name: "BOOK (4)" }
2245 panels { room: "Book Room" name: "BOOK (5)" }
2246 panels { room: "Book Room" name: "BOOK (6)" }
2247 panels { room: "Book Room" name: "BOOK (7)" }
2248 panels { room: "Book Room" name: "BOOK (8)" }
2249 panels { room: "Book Room" name: "BOOK (9)" }
2250 panels { room: "Book Room" name: "BOOK (10)" }
2251 panels { room: "Book Room" name: "BOOK (11)" }
2252 panels { room: "Book Room" name: "BOOK (12)" }
2253 location_room: "Book Room"
2254 location_name: "Book Room"
2255}
2256doors {
2257 name: "Sticks And Stones Door"
2258 type: STANDARD
2259 receivers: "Components/Doors/Unincorporated/temple_foyer_6"
2260 panels { room: "Globe Room" name: "WORD" }
2261 location_room: "Globe Room"
2262 location_name: "Sticks and Stones"
2263}
2264doors {
2265 name: "Castle Numbers Puzzle"
2266 type: EVENT
2267 panels { room: "Castle" name: "NUMBER (1)" answer: "two" }
2268 panels { room: "Castle" name: "NUMBER (2)" answer: "zero" }
2269 panels { room: "Castle" name: "NUMBER (3)" answer: "five" }
2270 panels { room: "Castle" name: "NUMBER (4)" answer: "nine" }
2271}
2272doors {
2273 name: "Zoo West Entrance"
2274 type: STANDARD
2275 receivers: "Components/Doors/V Maze/door_8"
2276 receivers: "Components/Doors/V Maze/door_7"
2277 receivers: "Panels/V Maze/door_2/teleportListener"
2278 receivers: "Panels/V Maze/door_1/teleportListener"
2279 panels { room: "Black Hex" name: "BARK" }
2280 panels { room: "Zoo N" name: "LEAF" }
2281 location_room: "Zoo N"
2282 location_name: "BARK, LEAF"
2283}
2284doors {
2285 name: "Zoo East Entrance"
2286 type: STANDARD
2287 receivers: "Components/Doors/V Maze/entry_1"
2288 panels { room: "Z2 Room" name: "EXHIBIT" }
2289 location_room: "Z2 Room"
2290}
2291doors {
2292 name: "Zoo South Entrance"
2293 type: STANDARD
2294 receivers: "Components/Doors/V Maze/entry_2"
2295 panels { room: "Outside Snake Room" name: "ANSWERS" }
2296 location_room: "Outside Snake Room"
2297}
2298doors {
2299 name: "Zoo Proxy North Door"
2300 type: EVENT
2301 #receivers: "Components/Doors/V Maze/door_1"
2302 panels { room: "Zoo NE" name: "Colors" answer: "ode" }
2303}
2304doors {
2305 name: "Zoo East Room"
2306 type: LOCATION_ONLY
2307 panels { room: "Zoo E" name: "WING" }
2308 panels { room: "Zoo E" name: "WHISKER" }
2309 panels { room: "Zoo E" name: "CLAW" }
2310 panels { room: "Zoo E" name: "FUR" }
2311 location_room: "Zoo E"
2312}
2313doors {
2314 name: "Zoo Northeast Room"
2315 type: LOCATION_ONLY
2316 panels { room: "Zoo NE" name: "FANG" }
2317 panels { room: "Zoo NE" name: "STRIPE (1)" }
2318 panels { room: "Zoo NE" name: "STRIPE (2)" }
2319 panels { room: "Zoo NE" name: "HOOF" }
2320 panels { room: "Zoo NE" name: "Colors" }
2321 location_room: "Zoo NE"
2322}
2323doors {
2324 name: "Zoo Prize Door"
2325 type: LOCATION_ONLY
2326 panels { room: "Zoo S" name: "SHELL" }
2327 panels { room: "Zoo S" name: "FIN" }
2328 panels { room: "Zoo S" name: "PINCER" }
2329 panels { room: "Zoo S" name: "SCALE" }
2330 location_room: "Zoo S"
2331}
2332doors {
2333 name: "Zoo Proxy South Door"
2334 type: EVENT
2335 #receivers: "Components/Doors/V Maze/door_5"
2336 panels { room: "Zoo NE" name: "Colors" answer: "abode" }
2337}
2338doors {
2339 name: "Zoo North Entrance"
2340 type: STANDARD
2341 receivers: "Components/Doors/V Maze/door_6"
2342 panels { room: "Zoo N" name: "BILL" }
2343 panels { room: "Zoo N" name: "FIN" }
2344 panels { room: "Zoo N" name: "BLOWHOLE" }
2345 panels { room: "Zoo N" name: "FEATHER" }
2346 location_room: "Zoo N"
2347}
2348doors {
2349 name: "Magenta Hexes"
2350 type: LOCATION_ONLY
2351 panels { room: "Outside Orange Room" name: "WERE" }
2352 panels { room: "Outside Orange Room" name: "FALL" }
2353 panels { room: "Outside Orange Room" name: "KNOT" }
2354 panels { room: "Outside Orange Room" name: "SLOT" }
2355 panels { room: "Outside Orange Room" name: "WAND" }
2356 panels { room: "Outside Orange Room" name: "OWL" }
2357 location_room: "Outside Orange Room"
2358}
2359doors {
2360 name: "Orchestra Room"
2361 type: LOCATION_ONLY
2362 panels { room: "Yellow Color Backside" name: "WINDS" }
2363 panels { room: "Yellow Color Backside" name: "STRINGS" }
2364 panels { room: "Yellow Color Backside" name: "BRASS" }
2365 panels { room: "Yellow Color Backside" name: "REDACTED" }
2366 location_room: "Yellow Color Backside"
2367}
2368doors {
2369 name: "Tenacious Color Painting"
2370 type: EVENT
2371 panels { room: "South Castle Area" name: "COLOR (1)" answer: "red" }
2372 panels { room: "South Castle Area" name: "COLOR (2)" answer: "yellow" }
2373 panels { room: "South Castle Area" name: "COLOR (3)" answer: "purple" }
2374 panels { room: "South Castle Area" name: "COLOR (4)" answer: "green" }
2375}
2376doors {
2377 name: "Eye Painting"
2378 type: ITEM_ONLY
2379 receivers: "Components/Paintings/Temple of the Eyes/eyeRedStart/teleportListener"
2380 double_letters: true
2381}
2382doors {
2383 name: "Lime Hexes"
2384 type: LOCATION_ONLY
2385 panels { room: "Tree Entrance" name: "RAT" }
2386 panels { room: "Tree Entrance" name: "DIFFERENCE" }
2387 panels { room: "Tree Entrance" name: "LEANS" }
2388 panels { room: "Tree Entrance" name: "QUESTION" }
2389 panels { room: "Tree Entrance" name: "WHERE" }
2390 panels { room: "Tree Entrance" name: "SUNDER" }
2391 location_room: "Tree Entrance"
2392}
2393doors {
2394 name: "Theo Panels"
2395 type: LOCATION_ONLY
2396 panels { room: "House" name: "GOAT" }
2397 panels { room: "House" name: "AMAZE" }
2398 panels { room: "House" name: "SKINNYHIM" }
2399 panels { room: "House" name: "THEO" }
2400 location_room: "House"
2401 location_name: "All Puzzles"
2402}
2403doors {
2404 name: "West Spire Panel"
2405 type: LOCATION_ONLY
2406 panels { room: "West Spire" name: "MISSING" }
2407 location_room: "West Spire"
2408 location_name: "MISSING"
2409}
2410doors {
2411 name: "Tree Panels"
2412 type: LOCATION_ONLY
2413 panels { room: "Red Color Door" name: "FIR" }
2414 panels { room: "Red Color Door" name: "OAK" }
2415 panels { room: "Red Color Door" name: "PINE" }
2416 panels { room: "Red Color Door" name: "ASH" }
2417 location_room: "Red Color Door"
2418 location_name: "ASH, FIR, OAK, PINE"
2419}
2420doors {
2421 name: "Teal Panel"
2422 type: LOCATION_ONLY
2423 panels { room: "Outside Book Room" name: "TEAL" }
2424 location_room: "Outside Book Room"
2425 location_name: "TEAL"
2426}
2427doors {
2428 name: "Direction Panels"
2429 type: LOCATION_ONLY
2430 panels { room: "Rainbow Color Doors" name: "DIRECTION (1)" }
2431 panels { room: "Rainbow Color Doors" name: "DIRECTION (2)" }
2432 panels { room: "Rainbow Color Doors" name: "DIRECTION (3)" }
2433 location_room: "Rainbow Color Doors"
2434}
2435doors {
2436 name: "Nursery Panels"
2437 type: LOCATION_ONLY
2438 panels { room: "Nursery" name: "Paintings" }
2439 panels { room: "Nursery" name: "?" }
2440 location_room: "Nursery"
2441 location_name: "Paintings, ?"
2442}
2443doors {
2444 name: "Near H Keyholder Panel"
2445 type: LOCATION_ONLY
2446 panels { room: "Outside House" name: "SILENCE" }
2447 location_room: "Outside House"
2448 location_name: "SILENCE"
2449}
2450doors {
2451 name: "Plum Panels"
2452 type: LOCATION_ONLY
2453 panels { room: "Outside Hedges" name: "PLUM (1)" }
2454 panels { room: "Outside Hedges" name: "PLUM (2)" }
2455 location_room: "Outside Hedges"
2456}
2457doors {
2458 name: "Yellow Smiley Annex Panels"
2459 type: LOCATION_ONLY
2460 panels { room: "Yellow Smiley Annex" name: "BELL" }
2461 panels { room: "Yellow Smiley Annex" name: "COW" }
2462 location_room: "Yellow Smiley Annex"
2463 location_name: "BELL, COW"
2464}
2465doors {
2466 name: "Farewell Little Lamb Panels"
2467 type: LOCATION_ONLY
2468 panels { room: "Purple Room South" name: "FAREWELL" }
2469 panels { room: "Purple Room South" name: "LITTLE" }
2470 panels { room: "Purple Room South" name: "LAMB" }
2471 location_room: "Purple Room South"
2472 location_name: "FAREWELL, LITTLE, LAMB"
2473}
diff --git a/data/maps/daedalus/metadata.txtpb b/data/maps/daedalus/metadata.txtpb new file mode 100644 index 0000000..e0f5148 --- /dev/null +++ b/data/maps/daedalus/metadata.txtpb
@@ -0,0 +1,23 @@
1display_name: "Daedalus"
2# These paintings can't be shuffled because they are behind panels.
3excluded_nodes: "Components/Paintings/Group3/mouse"
4excluded_nodes: "Components/Paintings/Group3/bee"
5excluded_nodes: "Components/Paintings/Group3/coins1"
6excluded_nodes: "Components/Paintings/Group3/coins2"
7excluded_nodes: "Components/Paintings/Group3/coins3"
8excluded_nodes: "Components/Paintings/Group3/coins4"
9# These are all sideways, high up, hint paintings. Theoretically could be
10# exit only and rotated in-game, but not for now.
11excluded_nodes: "Components/Paintings/Group3/coins5"
12excluded_nodes: "Components/Paintings/Group3/coins6"
13excluded_nodes: "Components/Paintings/Group3/coins7"
14excluded_nodes: "Components/Paintings/Group3/coins8"
15# This panel is out of bounds and not intended to be solved.
16excluded_nodes: "Panels/Castle Entrance/castle_direction_4"
17# Let's ignore the second half of the rainbow painting for now.
18excluded_nodes: "Components/Paintings/Group1/rainbow2"
19# This panel is not accessible in vanilla because the door to it requires
20# solving the panel itself.
21excluded_nodes: "Panels/Entry/seal"
22# This is not real.
23excluded_nodes: "Panels/Entry/fake"
diff --git a/data/maps/daedalus/rooms/After Bee Room.txtpb b/data/maps/daedalus/rooms/After Bee Room.txtpb new file mode 100644 index 0000000..c2dfc0f --- /dev/null +++ b/data/maps/daedalus/rooms/After Bee Room.txtpb
@@ -0,0 +1,23 @@
1name: "After Bee Room"
2panel_display_name: "North Area"
3panels {
4 name: "GAS"
5 path: "Panels/Beehalls/beehalls_2"
6 clue: "gas"
7 answer: "plasma"
8 symbols: CROSS
9}
10panels {
11 name: "ROOM"
12 path: "Panels/Green Room/panel_entry"
13 clue: "room"
14 answer: "green"
15 symbols: QUESTION
16}
17panels {
18 name: "SINGLED"
19 path: "Panels/Plum Room/plum_entry"
20 clue: "singled"
21 answer: "doubled"
22 symbols: SUN
23}
diff --git a/data/maps/daedalus/rooms/Amber North 2.txtpb b/data/maps/daedalus/rooms/Amber North 2.txtpb new file mode 100644 index 0000000..7029695 --- /dev/null +++ b/data/maps/daedalus/rooms/Amber North 2.txtpb
@@ -0,0 +1,9 @@
1name: "Amber North 2"
2panel_display_name: "West Area"
3panels {
4 name: "SONG"
5 path: "Panels/Amber/amber_north_2"
6 clue: "song"
7 answer: "outro"
8 symbols: BOXES
9}
diff --git a/data/maps/daedalus/rooms/Bee Room Obverse.txtpb b/data/maps/daedalus/rooms/Bee Room Obverse.txtpb new file mode 100644 index 0000000..7677ed1 --- /dev/null +++ b/data/maps/daedalus/rooms/Bee Room Obverse.txtpb
@@ -0,0 +1,66 @@
1name: "Bee Room Obverse"
2panel_display_name: "Bee Room"
3panels {
4 name: "SINGLE"
5 path: "Panels/Bee Room/bee_1"
6 clue: "single"
7 answer: "mingle"
8 symbols: ZERO
9}
10panels {
11 name: "BLINDER"
12 path: "Panels/Bee Room/bee_2"
13 clue: "blinder"
14 answer: "grinder"
15 symbols: ZERO
16}
17panels {
18 name: "SURE"
19 path: "Panels/Bee Room/bee_3"
20 clue: "sure"
21 answer: "stir"
22 symbols: ZERO
23}
24panels {
25 name: "BLUR"
26 path: "Panels/Bee Room/bee_4"
27 clue: "blur"
28 answer: "her"
29 symbols: ZERO
30}
31panels {
32 name: "FRINGE"
33 path: "Panels/Bee Room/bee_5"
34 clue: "fringe"
35 answer: "hinge"
36 symbols: ZERO
37}
38panels {
39 name: "CINDER"
40 path: "Panels/Bee Room/bee_6"
41 clue: "cinder"
42 answer: "tinder"
43 symbols: ZERO
44}
45panels {
46 name: "FUMBLE"
47 path: "Panels/Bee Room/bee_7"
48 clue: "fumble"
49 answer: "bumble"
50 symbols: ZERO
51}
52panels {
53 name: "LATCH"
54 path: "Panels/Bee Room/bee_8"
55 clue: "latch"
56 answer: "match"
57 symbols: ZERO
58}
59paintings {
60 name: "BEE2"
61 path: "Components/Paintings/Group3/bee2"
62}
63paintings {
64 name: "BUTTERFLY"
65 path: "Components/Paintings/Group3/butterfly"
66}
diff --git a/data/maps/daedalus/rooms/Bee Room Reverse.txtpb b/data/maps/daedalus/rooms/Bee Room Reverse.txtpb new file mode 100644 index 0000000..cba8285 --- /dev/null +++ b/data/maps/daedalus/rooms/Bee Room Reverse.txtpb
@@ -0,0 +1,68 @@
1name: "Bee Room Reverse"
2panel_display_name: "Bee Room"
3panels {
4 name: "POCKET"
5 path: "Panels/Bee Room/bee_9"
6 clue: "pocket"
7 answer: "rocket"
8 symbols: ZERO
9}
10panels {
11 name: "FLUME"
12 path: "Panels/Bee Room/bee_10"
13 clue: "flume"
14 answer: "zoom"
15 symbols: ZERO
16}
17panels {
18 name: "HEALED"
19 path: "Panels/Bee Room/bee_11"
20 clue: "healed"
21 answer: "shield"
22 symbols: ZERO
23}
24panels {
25 name: "SCRATCH"
26 path: "Panels/Bee Room/bee_12"
27 clue: "scratch"
28 answer: "match"
29 symbols: ZERO
30}
31panels {
32 name: "MINORITY"
33 path: "Panels/Bee Room/bee_13"
34 clue: "minority"
35 answer: "authority"
36 symbols: ZERO
37}
38panels {
39 name: "STYLINGS"
40 path: "Panels/Bee Room/bee_14"
41 clue: "stylings"
42 answer: "filings"
43 symbols: ZERO
44}
45panels {
46 name: "PLANTS"
47 path: "Panels/Bee Room/bee_15"
48 clue: "plants"
49 answer: "nature"
50 symbols: BOXES
51}
52panels {
53 name: "COUNCIL"
54 path: "Panels/Bee Room/bee_16"
55 clue: "council"
56 answer: "counsel"
57 symbols: ZERO
58}
59paintings {
60 name: "BEE3"
61 path: "Components/Paintings/Group3/bee3"
62 gravity: Y_PLUS
63}
64paintings {
65 name: "BUTTERFLY2"
66 path: "Components/Paintings/Group3/butterfly2"
67 gravity: Y_PLUS
68}
diff --git a/data/maps/daedalus/rooms/Beehalls Intersection.txtpb b/data/maps/daedalus/rooms/Beehalls Intersection.txtpb new file mode 100644 index 0000000..7ecbe50 --- /dev/null +++ b/data/maps/daedalus/rooms/Beehalls Intersection.txtpb
@@ -0,0 +1,9 @@
1name: "Beehalls Intersection"
2panel_display_name: "North Area"
3panels {
4 name: "CLOUDS"
5 path: "Panels/Halls/beehalls_4"
6 clue: "clouds"
7 answer: "lightning"
8 symbols: CROSS
9}
diff --git a/data/maps/daedalus/rooms/Black Hex.txtpb b/data/maps/daedalus/rooms/Black Hex.txtpb new file mode 100644 index 0000000..1276685 --- /dev/null +++ b/data/maps/daedalus/rooms/Black Hex.txtpb
@@ -0,0 +1,52 @@
1name: "Black Hex"
2panel_display_name: "Northwest Area"
3panels {
4 name: "HIDE"
5 path: "Panels/Hexes/black_1"
6 clue: "hide"
7 answer: "seek"
8 symbols: SUN
9}
10panels {
11 name: "ORDER"
12 path: "Panels/Hexes/black_2"
13 clue: "order"
14 answer: "chaos"
15 symbols: SUN
16}
17panels {
18 name: "TOWER"
19 path: "Panels/Hexes/black_3"
20 clue: "tower"
21 answer: "our"
22 symbols: ZERO
23}
24panels {
25 name: "MAZE"
26 path: "Panels/Hexes/black_4"
27 clue: "maze"
28 answer: "ways"
29 symbols: ZERO
30}
31panels {
32 name: "CLUES"
33 path: "Panels/Hexes/black_5"
34 clue: "clues"
35 answer: "zoos"
36 symbols: ZERO
37}
38panels {
39 name: "SECRET"
40 path: "Panels/Hexes/black_6"
41 clue: "secret"
42 answer: "secrets"
43 symbols: PLANET
44}
45panels {
46 name: "BARK"
47 path: "Panels/V Maze/door_2"
48 clue: "bark"
49 answer: "tree"
50 symbols: BOXES
51 # visible through the tinted door
52}
diff --git a/data/maps/daedalus/rooms/Blue Hallway Cut Side.txtpb b/data/maps/daedalus/rooms/Blue Hallway Cut Side.txtpb new file mode 100644 index 0000000..5a6c081 --- /dev/null +++ b/data/maps/daedalus/rooms/Blue Hallway Cut Side.txtpb
@@ -0,0 +1,16 @@
1name: "Blue Hallway Cut Side"
2panel_display_name: "South Area"
3panels {
4 name: "CUT"
5 path: "Panels/Halls/halls_6"
6 clue: "cut"
7 answer: "chop"
8 symbols: QUESTION
9}
10panels {
11 name: "GREEN"
12 path: "Panels/Halls/halls_8"
13 clue: "green"
14 answer: "red"
15 symbols: SUN
16}
diff --git a/data/maps/daedalus/rooms/Blue Hallway Tall Side.txtpb b/data/maps/daedalus/rooms/Blue Hallway Tall Side.txtpb new file mode 100644 index 0000000..4a775d8 --- /dev/null +++ b/data/maps/daedalus/rooms/Blue Hallway Tall Side.txtpb
@@ -0,0 +1,54 @@
1name: "Blue Hallway Tall Side"
2panel_display_name: "Northeast Area"
3panels {
4 name: "TALL"
5 path: "Panels/Halls/halls_9"
6 clue: "tall"
7 answer: "short"
8 symbols: SUN
9}
10panels {
11 name: "SHOO"
12 path: "Panels/Hexes/cream_1"
13 clue: "shoo"
14 answer: "shoes"
15 symbols: ZERO
16 symbols: PLANET
17}
18panels {
19 name: "ALL WAY"
20 path: "Panels/Hexes/cream_2"
21 clue: "all way"
22 answer: "never"
23 symbols: SUN
24 symbols: ZERO
25 symbols: PLANET
26}
27panels {
28 name: "FOUR"
29 path: "Panels/Hexes/cream_3"
30 clue: "four"
31 answer: "for"
32 symbols: ZERO
33}
34panels {
35 name: "OFFER"
36 path: "Panels/Hexes/cream_4"
37 clue: "offer"
38 answer: "sale"
39 symbols: AGE
40}
41panels {
42 name: "CHILD"
43 path: "Panels/Hexes/cream_5"
44 clue: "child"
45 answer: "baby"
46 symbols: AGE
47}
48panels {
49 name: "NEW"
50 path: "Panels/Hexes/cream_6"
51 clue: "new"
52 answer: "worn"
53 symbols: SUN
54}
diff --git a/data/maps/daedalus/rooms/Blue Hallway.txtpb b/data/maps/daedalus/rooms/Blue Hallway.txtpb new file mode 100644 index 0000000..81bc428 --- /dev/null +++ b/data/maps/daedalus/rooms/Blue Hallway.txtpb
@@ -0,0 +1,16 @@
1name: "Blue Hallway"
2panel_display_name: "South Area"
3panels {
4 name: "CHOP"
5 path: "Panels/Halls/halls_10"
6 clue: "chop"
7 answer: "cut"
8 symbols: SUN
9}
10panels {
11 name: "SHORT"
12 path: "Panels/Halls/halls_5"
13 clue: "short"
14 answer: "tall"
15 symbols: QUESTION
16}
diff --git a/data/maps/daedalus/rooms/Blue Room.txtpb b/data/maps/daedalus/rooms/Blue Room.txtpb new file mode 100644 index 0000000..1d060d8 --- /dev/null +++ b/data/maps/daedalus/rooms/Blue Room.txtpb
@@ -0,0 +1,80 @@
1name: "Blue Room"
2panel_display_name: "Blue Room"
3panels {
4 name: "RED"
5 path: "Panels/Blue Room/panel_1"
6 clue: "red"
7 answer: "ginger"
8 symbols: SUN
9}
10panels {
11 name: "WESTWARD"
12 path: "Panels/Blue Room/panel_2"
13 clue: "westward"
14 answer: "mustard"
15 symbols: SPARKLES
16}
17panels {
18 name: "RANGE"
19 path: "Panels/Blue Room/panel_3"
20 clue: "range"
21 answer: "oregano"
22 symbols: SPARKLES
23 symbols: ANAGRAM
24}
25panels {
26 name: "PEPPER"
27 path: "Panels/Blue Room/panel_4"
28 clue: "pepper"
29 answer: "salt"
30 symbols: EXAMPLE
31}
32panels {
33 name: "TIME"
34 path: "Panels/Blue Room/panel_5"
35 clue: "time"
36 answer: "thyme"
37 symbols: ZERO
38}
39panels {
40 name: "SALT"
41 path: "Panels/Blue Room/panel_6"
42 clue: "salt"
43 answer: "pepper"
44 symbols: EXAMPLE
45}
46panels {
47 name: "BULB"
48 path: "Panels/Blue Room/panel_7"
49 clue: "bulb"
50 answer: "garlic"
51 symbols: AGE
52}
53panels {
54 name: "PAPA"
55 path: "Panels/Blue Room/panel_8"
56 clue: "papa"
57 answer: "paprika"
58 symbols: SPARKLES
59}
60panels {
61 name: "MINT"
62 path: "Panels/Blue Room/panel_9"
63 clue: "mint"
64 answer: "pepper"
65 symbols: EXAMPLE
66}
67panels {
68 name: "CELEBRATORY"
69 path: "Panels/Blue Room/panel_10"
70 clue: "celebratory"
71 answer: "celery"
72 symbols: SPARKLES
73}
74panels {
75 name: "DETECTIVE"
76 path: "Panels/Blue Room/panel_11"
77 clue: "detective"
78 answer: "basil"
79 symbols: EXAMPLE
80}
diff --git a/data/maps/daedalus/rooms/Blue Smiley Annex.txtpb b/data/maps/daedalus/rooms/Blue Smiley Annex.txtpb new file mode 100644 index 0000000..d44bf1a --- /dev/null +++ b/data/maps/daedalus/rooms/Blue Smiley Annex.txtpb
@@ -0,0 +1,16 @@
1name: "Blue Smiley Annex"
2panel_display_name: "South Area"
3panels {
4 name: "ORANGE (1)"
5 path: "Panels/Miscellaneous/yellow"
6 clue: "orange"
7 answer: "color"
8 symbols: EXAMPLE
9}
10panels {
11 name: "ORANGE (2)"
12 path: "Panels/Miscellaneous/yellow2"
13 clue: "orange"
14 answer: "fruit"
15 symbols: EXAMPLE
16}
diff --git a/data/maps/daedalus/rooms/Blue Smiley.txtpb b/data/maps/daedalus/rooms/Blue Smiley.txtpb new file mode 100644 index 0000000..8464525 --- /dev/null +++ b/data/maps/daedalus/rooms/Blue Smiley.txtpb
@@ -0,0 +1,9 @@
1name: "Blue Smiley"
2panel_display_name: "South Area"
3panels {
4 name: "SMILE"
5 path: "Panels/Smiley Rooms/blue"
6 clue: "smile"
7 answer: "blue"
8 symbols: QUESTION
9}
diff --git a/data/maps/daedalus/rooms/Book Room.txtpb b/data/maps/daedalus/rooms/Book Room.txtpb new file mode 100644 index 0000000..534fbfe --- /dev/null +++ b/data/maps/daedalus/rooms/Book Room.txtpb
@@ -0,0 +1,86 @@
1name: "Book Room"
2panel_display_name: "Southwest Area"
3panels {
4 name: "BOOK (1)"
5 path: "Panels/Book Room/book_1"
6 clue: "book"
7 answer: "comic"
8 symbols: EXAMPLE
9}
10panels {
11 name: "BOOK (2)"
12 path: "Panels/Book Room/book_2"
13 clue: "book"
14 answer: "check"
15 symbols: EXAMPLE
16}
17panels {
18 name: "BOOK (3)"
19 path: "Panels/Book Room/book_3"
20 clue: "book"
21 answer: "cook"
22 symbols: EXAMPLE
23}
24panels {
25 name: "BOOK (4)"
26 path: "Panels/Book Room/book_4"
27 clue: "book"
28 answer: "story"
29 symbols: EXAMPLE
30}
31panels {
32 name: "BOOK (5)"
33 path: "Panels/Book Room/book_5"
34 clue: "book"
35 answer: "text"
36 symbols: EXAMPLE
37}
38panels {
39 name: "BOOK (6)"
40 path: "Panels/Book Room/book_6"
41 clue: "book"
42 answer: "year"
43 symbols: EXAMPLE
44}
45panels {
46 name: "BOOK (7)"
47 path: "Panels/Book Room/book_7"
48 clue: "book"
49 answer: "guide"
50 symbols: EXAMPLE
51}
52panels {
53 name: "BOOK (8)"
54 path: "Panels/Book Room/book_8"
55 clue: "book"
56 answer: "log"
57 symbols: EXAMPLE
58}
59panels {
60 name: "BOOK (9)"
61 path: "Panels/Book Room/book_9"
62 clue: "book"
63 answer: "guest"
64 symbols: EXAMPLE
65}
66panels {
67 name: "BOOK (10)"
68 path: "Panels/Book Room/book_10"
69 clue: "book"
70 answer: "scrap"
71 symbols: EXAMPLE
72}
73panels {
74 name: "BOOK (11)"
75 path: "Panels/Book Room/book_11"
76 clue: "book"
77 answer: "sketch"
78 symbols: EXAMPLE
79}
80panels {
81 name: "BOOK (12)"
82 path: "Panels/Book Room/book_12"
83 clue: "book"
84 answer: "school"
85 symbols: EXAMPLE
86}
diff --git a/data/maps/daedalus/rooms/Bow Side.txtpb b/data/maps/daedalus/rooms/Bow Side.txtpb new file mode 100644 index 0000000..f04065d --- /dev/null +++ b/data/maps/daedalus/rooms/Bow Side.txtpb
@@ -0,0 +1,10 @@
1name: "Bow Side"
2panel_display_name: "Rainbow"
3panels {
4 name: "?"
5 path: "Panels/Smiley Rooms/bow"
6 clue: ""
7 answer: "bow"
8 symbols: QUESTION
9 display_name: "? (2)"
10}
diff --git a/data/maps/daedalus/rooms/Brown Smiley.txtpb b/data/maps/daedalus/rooms/Brown Smiley.txtpb new file mode 100644 index 0000000..53783c1 --- /dev/null +++ b/data/maps/daedalus/rooms/Brown Smiley.txtpb
@@ -0,0 +1,9 @@
1name: "Brown Smiley"
2panel_display_name: "Rainbow"
3panels {
4 name: "OTHERS"
5 path: "Panels/Smiley Rooms/rainbow2"
6 clue: "others"
7 answer: "rainbow"
8 symbols: QUESTION
9}
diff --git a/data/maps/daedalus/rooms/C Keyholder.txtpb b/data/maps/daedalus/rooms/C Keyholder.txtpb new file mode 100644 index 0000000..28793b2 --- /dev/null +++ b/data/maps/daedalus/rooms/C Keyholder.txtpb
@@ -0,0 +1,7 @@
1name: "C Keyholder"
2panel_display_name: "East Area"
3keyholders {
4 name: "C"
5 path: "Components/KeyHolders/keyHolderC"
6 key: "c"
7}
diff --git a/data/maps/daedalus/rooms/Castle.txtpb b/data/maps/daedalus/rooms/Castle.txtpb new file mode 100644 index 0000000..7fd9a81 --- /dev/null +++ b/data/maps/daedalus/rooms/Castle.txtpb
@@ -0,0 +1,204 @@
1name: "Castle"
2panel_display_name: "Castle"
3panels {
4 name: "REVERSE"
5 path: "Panels/Castle Interior/panel_flip"
6 clue: "reverse"
7 answer: "flip"
8 symbols: SUN
9}
10panels {
11 name: "ONE (Blue)"
12 path: "Panels/Castle Interior/panel_1"
13 clue: "one"
14 answer: "one"
15 required_door { name: "Castle Flipper" }
16}
17panels {
18 name: "THREE (Blue)"
19 path: "Panels/Castle Interior/panel_3"
20 clue: "three"
21 answer: "three"
22}
23panels {
24 name: "TWO (Blue)"
25 path: "Panels/Castle Interior/panel_2"
26 clue: "two"
27 answer: "two"
28}
29panels {
30 name: "FOUR (Blue)"
31 path: "Panels/Castle Interior/panel_4"
32 clue: "four"
33 answer: "four"
34}
35panels {
36 name: "FIVE (Blue)"
37 path: "Panels/Castle Interior/panel_5"
38 clue: "five"
39 answer: "five"
40 required_door { name: "Castle Blue Stairs" }
41}
42panels {
43 name: "ONE (Green)"
44 path: "Panels/Castle Interior/panel_6"
45 clue: "one"
46 answer: "one"
47 required_door { name: "Castle Flipper" }
48}
49panels {
50 name: "THREE (Green)"
51 path: "Panels/Castle Interior/panel_8"
52 clue: "three"
53 answer: "three"
54}
55panels {
56 name: "TWO (Green)"
57 path: "Panels/Castle Interior/panel_7"
58 clue: "two"
59 answer: "two"
60}
61panels {
62 name: "FOUR (Green)"
63 path: "Panels/Castle Interior/panel_9"
64 clue: "four"
65 answer: "four"
66}
67panels {
68 name: "FIVE (Green)"
69 path: "Panels/Castle Interior/panel_10"
70 clue: "five"
71 answer: "five"
72 required_door { name: "Castle Green Stairs" }
73}
74panels {
75 name: "ONE (Maroon)"
76 path: "Panels/Castle Interior/panel_11"
77 clue: "one"
78 answer: "one"
79}
80panels {
81 name: "THREE (Maroon)"
82 path: "Panels/Castle Interior/panel_13"
83 clue: "three"
84 answer: "three"
85}
86panels {
87 name: "TWO (Maroon)"
88 path: "Panels/Castle Interior/panel_12"
89 clue: "two"
90 answer: "two"
91}
92panels {
93 name: "FOUR (Maroon)"
94 path: "Panels/Castle Interior/panel_14"
95 clue: "four"
96 answer: "four"
97}
98panels {
99 name: "FIVE (Maroon)"
100 path: "Panels/Castle Interior/panel_15"
101 clue: "five"
102 answer: "five"
103 required_door { name: "Castle Maroon Stairs" }
104}
105panels {
106 name: "ONE (Hazel)"
107 path: "Panels/Castle Interior/panel_16"
108 clue: "one"
109 answer: "one"
110 required_door { name: "Castle Flipper" }
111}
112panels {
113 name: "THREE (Hazel)"
114 path: "Panels/Castle Interior/panel_18"
115 clue: "three"
116 answer: "three"
117}
118panels {
119 name: "TWO (Hazel)"
120 path: "Panels/Castle Interior/panel_17"
121 clue: "two"
122 answer: "two"
123}
124panels {
125 name: "FOUR (Hazel)"
126 path: "Panels/Castle Interior/panel_19"
127 clue: "four"
128 answer: "four"
129}
130panels {
131 name: "FIVE (Hazel)"
132 path: "Panels/Castle Interior/panel_20"
133 clue: "five"
134 answer: "five"
135 required_door { name: "Castle Hazel Stairs" }
136}
137panels {
138 name: "NUMBER (1)"
139 path: "Components/Numbers/number_helper_1"
140 clue: "number"
141 answer: "seventy"
142 symbols: EXAMPLE
143 proxies { answer: "zero" path: "Components/Numbers/numbers_proxies_0" }
144 proxies { answer: "one" path: "Components/Numbers/numbers_proxies_1" }
145 proxies { answer: "two" path: "Components/Numbers/numbers_proxies_2" }
146 proxies { answer: "three" path: "Components/Numbers/numbers_proxies_3" }
147 proxies { answer: "four" path: "Components/Numbers/numbers_proxies_4" }
148 proxies { answer: "five" path: "Components/Numbers/numbers_proxies_5" }
149 proxies { answer: "six" path: "Components/Numbers/numbers_proxies_6" }
150 proxies { answer: "seven" path: "Components/Numbers/numbers_proxies_7" }
151 proxies { answer: "eight" path: "Components/Numbers/numbers_proxies_8" }
152 proxies { answer: "nine" path: "Components/Numbers/numbers_proxies_9" }
153}
154panels {
155 name: "NUMBER (2)"
156 path: "Components/Numbers/number_helper_2"
157 clue: "number"
158 answer: "seventy"
159 symbols: EXAMPLE
160 proxies { answer: "zero" path: "Components/Numbers/numbers_proxies_10" }
161 proxies { answer: "one" path: "Components/Numbers/numbers_proxies_11" }
162 proxies { answer: "two" path: "Components/Numbers/numbers_proxies_12" }
163 proxies { answer: "three" path: "Components/Numbers/numbers_proxies_13" }
164 proxies { answer: "four" path: "Components/Numbers/numbers_proxies_14" }
165 proxies { answer: "five" path: "Components/Numbers/numbers_proxies_15" }
166 proxies { answer: "six" path: "Components/Numbers/numbers_proxies_16" }
167 proxies { answer: "seven" path: "Components/Numbers/numbers_proxies_17" }
168 proxies { answer: "eight" path: "Components/Numbers/numbers_proxies_18" }
169 proxies { answer: "nine" path: "Components/Numbers/numbers_proxies_19" }
170}
171panels {
172 name: "NUMBER (3)"
173 path: "Components/Numbers/number_helper_3"
174 clue: "number"
175 answer: "seventy"
176 symbols: EXAMPLE
177 proxies { answer: "zero" path: "Components/Numbers/numbers_proxies_20" }
178 proxies { answer: "one" path: "Components/Numbers/numbers_proxies_21" }
179 proxies { answer: "two" path: "Components/Numbers/numbers_proxies_22" }
180 proxies { answer: "three" path: "Components/Numbers/numbers_proxies_23" }
181 proxies { answer: "four" path: "Components/Numbers/numbers_proxies_24" }
182 proxies { answer: "five" path: "Components/Numbers/numbers_proxies_25" }
183 proxies { answer: "six" path: "Components/Numbers/numbers_proxies_26" }
184 proxies { answer: "seven" path: "Components/Numbers/numbers_proxies_27" }
185 proxies { answer: "eight" path: "Components/Numbers/numbers_proxies_28" }
186 proxies { answer: "nine" path: "Components/Numbers/numbers_proxies_29" }
187}
188panels {
189 name: "NUMBER (4)"
190 path: "Components/Numbers/number_helper_4"
191 clue: "number"
192 answer: "seventy"
193 symbols: EXAMPLE
194 proxies { answer: "zero" path: "Components/Numbers/numbers_proxies_30" }
195 proxies { answer: "one" path: "Components/Numbers/numbers_proxies_31" }
196 proxies { answer: "two" path: "Components/Numbers/numbers_proxies_32" }
197 proxies { answer: "three" path: "Components/Numbers/numbers_proxies_33" }
198 proxies { answer: "four" path: "Components/Numbers/numbers_proxies_34" }
199 proxies { answer: "five" path: "Components/Numbers/numbers_proxies_35" }
200 proxies { answer: "six" path: "Components/Numbers/numbers_proxies_36" }
201 proxies { answer: "seven" path: "Components/Numbers/numbers_proxies_37" }
202 proxies { answer: "eight" path: "Components/Numbers/numbers_proxies_38" }
203 proxies { answer: "nine" path: "Components/Numbers/numbers_proxies_39" }
204}
diff --git a/data/maps/daedalus/rooms/Coin Tower.txtpb b/data/maps/daedalus/rooms/Coin Tower.txtpb new file mode 100644 index 0000000..177fc6e --- /dev/null +++ b/data/maps/daedalus/rooms/Coin Tower.txtpb
@@ -0,0 +1,9 @@
1name: "Coin Tower"
2panel_display_name: "Northeast Area"
3panels {
4 name: "RAIN"
5 path: "Panels/Entry/db_2"
6 clue: "rain"
7 answer: "snow"
8 symbols: CROSS
9}
diff --git a/data/maps/daedalus/rooms/Composite Room NE.txtpb b/data/maps/daedalus/rooms/Composite Room NE.txtpb new file mode 100644 index 0000000..c91a06f --- /dev/null +++ b/data/maps/daedalus/rooms/Composite Room NE.txtpb
@@ -0,0 +1,77 @@
1name: "Composite Room NE"
2panel_display_name: "Composite Room"
3panels {
4 name: "<-"
5 path: "Panels/Combo Room NE/panel_1"
6 clue: ""
7 answer: "workbook"
8 symbols: LINGO
9}
10panels {
11 name: "TEXTBOOK"
12 path: "Panels/Combo Room NE/panel_2"
13 clue: "textbook"
14 answer: "bookstore"
15 symbols: EXAMPLE
16}
17panels {
18 name: "CORNERHOME"
19 path: "Panels/Combo Room NE/panel_3"
20 clue: "cornerhome"
21 answer: "storehouse"
22 symbols: SUN
23 symbols: EXAMPLE
24}
25panels {
26 name: "BIRDCALL"
27 path: "Panels/Combo Room NE/panel_4"
28 clue: "birdcall"
29 answer: "housework"
30 symbols: EXAMPLE
31}
32panels {
33 name: "FORCEYARD"
34 path: "Panels/Combo Room NE/panel_6"
35 clue: "forceyard"
36 answer: "massacre"
37 symbols: BOXES
38}
39panels {
40 name: "TIREPOUND"
41 path: "Panels/Combo Room NE/panel_7"
42 clue: "tirepound"
43 answer: "carton"
44 symbols: BOXES
45}
46panels {
47 name: "LIEQUIZ"
48 path: "Panels/Combo Room NE/panel_8"
49 clue: "liequiz"
50 answer: "contest"
51 symbols: SUN
52 symbols: PYRAMID
53}
54panels {
55 name: "WHITEOUT"
56 path: "Panels/Combo Room NE/panel_9"
57 clue: "whiteout"
58 answer: "within"
59 symbols: SUN
60 symbols: SPARKLES
61}
62panels {
63 name: "FEETHIM"
64 path: "Panels/Combo Room NE/panel_10"
65 clue: "feethim"
66 answer: "feather"
67 symbols: ZERO
68 symbols: GENDER
69}
70panels {
71 name: "STARFALL"
72 path: "Panels/Combo Room NE/panel_11"
73 clue: "starfall"
74 answer: "sunrise"
75 symbols: SUN
76 symbols: EXAMPLE
77}
diff --git a/data/maps/daedalus/rooms/Composite Room NW.txtpb b/data/maps/daedalus/rooms/Composite Room NW.txtpb new file mode 100644 index 0000000..949fe31 --- /dev/null +++ b/data/maps/daedalus/rooms/Composite Room NW.txtpb
@@ -0,0 +1,94 @@
1name: "Composite Room NW"
2panel_display_name: "Composite Room"
3panels {
4 name: "BEHOUSE"
5 path: "Panels/Combo Room NW/panel_1"
6 clue: "behouse"
7 answer: "bedroom"
8 symbols: SPARKLES
9 symbols: BOXES
10}
11panels {
12 name: "BRAKESTEADY"
13 path: "Panels/Combo Room NW/panel_2"
14 clue: "brakesteady"
15 answer: "breakfast"
16 symbols: ZERO
17 symbols: PYRAMID
18}
19panels {
20 name: "DEATHSHORT"
21 path: "Panels/Combo Room NW/panel_3"
22 clue: "deathshort"
23 answer: "lifelong"
24 symbols: SUN
25}
26panels {
27 name: "PLUMPFAMILY"
28 path: "Panels/Combo Room NW/panel_4"
29 clue: "plumpfamily"
30 answer: "pumpkin"
31 symbols: SUN
32 symbols: SPARKLES
33}
34panels {
35 name: "SHEEPBOOK"
36 path: "Panels/Combo Room NW/panel_5"
37 clue: "sheepbook"
38 answer: "rampage"
39 symbols: BOXES
40 symbols: GENDER
41}
42panels {
43 name: "LAIDIN"
44 path: "Panels/Combo Room NW/panel_6"
45 clue: "laidin"
46 answer: "layout"
47 symbols: SUN
48 symbols: AGE
49}
50panels {
51 name: "FOGIRON"
52 path: "Panels/Combo Room NW/panel_7"
53 clue: "fogiron"
54 answer: "mistrust"
55 symbols: SUN
56 symbols: AGE
57}
58panels {
59 name: "MOONSENT"
60 path: "Panels/Combo Room NW/panel_8"
61 clue: "moonsent"
62 answer: "sunset"
63 symbols: SUN
64 symbols: SPARKLES
65}
66panels {
67 name: "FAIRWATER"
68 path: "Panels/Combo Room NW/panel_9"
69 clue: "fairwater"
70 answer: "justice"
71 symbols: SUN
72 symbols: CROSS
73}
74panels {
75 name: "PLEADOUT"
76 path: "Panels/Combo Room NW/panel_10"
77 clue: "pleadout"
78 answer: "begin"
79 symbols: SUN
80}
81panels {
82 name: "OUTGARDEN"
83 path: "Panels/Combo Room NW/panel_11"
84 clue: "outgarden"
85 answer: "intend"
86 symbols: SUN
87}
88panels {
89 name: "HELLOTALE"
90 path: "Panels/Combo Room NW/panel_12"
91 clue: "hellotale"
92 answer: "history"
93 symbols: SUN
94}
diff --git a/data/maps/daedalus/rooms/Composite Room S.txtpb b/data/maps/daedalus/rooms/Composite Room S.txtpb new file mode 100644 index 0000000..0cb69bf --- /dev/null +++ b/data/maps/daedalus/rooms/Composite Room S.txtpb
@@ -0,0 +1,201 @@
1name: "Composite Room S"
2panel_display_name: "Composite Room"
3panels {
4 name: "CONCAVE"
5 path: "Panels/Combo Room SW/panel_1"
6 clue: "concave"
7 answer: "probe"
8 symbols: SUN
9 symbols: SPARKLES
10 symbols: STARS
11}
12panels {
13 name: "FAIRYTHINK"
14 path: "Panels/Combo Room SW/panel_2"
15 clue: "fairythink"
16 answer: "impact"
17 symbols: SUN
18 symbols: EXAMPLE
19}
20panels {
21 name: "AILAND"
22 path: "Panels/Combo Room SW/panel_3"
23 clue: "ailand"
24 answer: "sailor"
25 symbols: SPARKLES
26 symbols: EXAMPLE
27}
28panels {
29 name: "RULERCAT"
30 path: "Panels/Combo Room SW/panel_4"
31 clue: "rulercat"
32 answer: "rebellion"
33 symbols: SUN
34 symbols: EXAMPLE
35}
36panels {
37 name: "ANDBITE"
38 path: "Panels/Combo Room SW/panel_5"
39 clue: "andbite"
40 answer: "orbit"
41 symbols: EXAMPLE
42 symbols: AGE
43}
44panels {
45 name: "ASHHIM"
46 path: "Panels/Combo Room SW/panel_6"
47 clue: "ashhim"
48 answer: "soother"
49 symbols: SUN
50 symbols: GENDER
51}
52panels {
53 name: "PRONOUNPRONOUNPRONOUN"
54 path: "Panels/Combo Room SW/panel_7"
55 clue: "pronounpronounpronoun"
56 answer: "inherit"
57 symbols: SPARKLES
58 symbols: EXAMPLE
59}
60panels {
61 name: "SPOUSEGARDEN"
62 path: "Panels/Combo Room SW/panel_8"
63 clue: "spousegarden"
64 answer: "extend"
65 symbols: SUN
66}
67panels {
68 name: "BANGER"
69 path: "Panels/Combo Room SW/panel_9"
70 clue: "banger"
71 answer: "barrage"
72 symbols: SUN
73 symbols: SPARKLES
74}
75panels {
76 name: "LEGIT"
77 path: "Panels/Combo Room SW/panel_11"
78 clue: "legit"
79 answer: "tablet"
80 symbols: SPARKLES
81 symbols: BOXES
82}
83panels {
84 name: "OUTEAT"
85 path: "Panels/Combo Room SW/panel_12"
86 clue: "outeat"
87 answer: "rotate"
88 symbols: SPARKLES
89 symbols: AGE
90}
91panels {
92 name: "SUMMERIN"
93 path: "Panels/Combo Room SW/panel_13"
94 clue: "summerin"
95 answer: "fallout"
96 symbols: SUN
97 symbols: AGE
98}
99panels {
100 name: "MUSCLEIN"
101 path: "Panels/Combo Room SE/panel_1"
102 clue: "musclein"
103 answer: "about"
104 symbols: SUN
105 symbols: EXAMPLE
106}
107panels {
108 name: "PLAYHOP"
109 path: "Panels/Combo Room SE/panel_2"
110 clue: "playhop"
111 answer: "workshop"
112 symbols: SUN
113 symbols: SPARKLES
114}
115panels {
116 name: "BOUGHTHIM"
117 path: "Panels/Combo Room SE/panel_3"
118 clue: "boughthim"
119 answer: "bother"
120 symbols: ZERO
121 symbols: GENDER
122}
123panels {
124 name: "FRIENDPILOT"
125 path: "Panels/Combo Room SE/panel_4"
126 clue: "friendpilot"
127 answer: "palace"
128 symbols: SUN
129 symbols: EXAMPLE
130}
131panels {
132 name: "UNDERPANTS"
133 path: "Panels/Combo Room SE/panel_5"
134 clue: "underpants"
135 answer: "overshirt"
136 symbols: SUN
137}
138panels {
139 name: "FIREFOX"
140 path: "Panels/Combo Room SE/panel_6"
141 clue: "firefox"
142 answer: "icebox"
143 symbols: SUN
144 symbols: ZERO
145}
146panels {
147 name: "SPRINKLEDRIP"
148 path: "Panels/Combo Room SE/panel_7"
149 clue: "sprinkledrip"
150 answer: "raindrop"
151 symbols: PYRAMID
152}
153panels {
154 name: "TWOGOTHIM"
155 path: "Panels/Combo Room SE/panel_8"
156 clue: "twogothim"
157 answer: "together"
158 symbols: ZERO
159 symbols: GENDER
160 symbols: AGE
161}
162panels {
163 name: "SKIMFARE"
164 path: "Panels/Combo Room SE/panel_9"
165 clue: "skimfare"
166 answer: "readjust"
167 symbols: SUN
168 symbols: ZERO
169 symbols: PYRAMID
170}
171panels {
172 name: "TICKETBORNE"
173 path: "Panels/Combo Room SE/panel_11"
174 clue: "ticketborne"
175 answer: "stubborn"
176 symbols: ZERO
177 symbols: AGE
178}
179panels {
180 name: "BLEAKCARD"
181 path: "Panels/Combo Room SE/panel_12"
182 clue: "bleakcard"
183 answer: "grimace"
184 symbols: SUN
185 symbols: EXAMPLE
186}
187panels {
188 name: "MISSIONMISSION"
189 path: "Panels/Combo Room SE/panel_13"
190 clue: "missionmission"
191 answer: "question"
192 symbols: SUN
193 symbols: SPARKLES
194}
195ports {
196 name: "ENTRY"
197 display_name: "Composite Room Worldport"
198 path: "Components/Warps/Worldports/worldport16"
199 destination { x: -84 y: 0 z: 81 }
200 rotation: 270
201}
diff --git a/data/maps/daedalus/rooms/Computer Room Seal.txtpb b/data/maps/daedalus/rooms/Computer Room Seal.txtpb new file mode 100644 index 0000000..b271a5c --- /dev/null +++ b/data/maps/daedalus/rooms/Computer Room Seal.txtpb
@@ -0,0 +1,9 @@
1name: "Computer Room Seal"
2panel_display_name: "Computer Room"
3panels {
4 name: "SCROLL"
5 path: "Panels/Computer/computer_11"
6 clue: "scroll"
7 answer: "seal"
8 symbols: BOXES
9}
diff --git a/data/maps/daedalus/rooms/Computer Room.txtpb b/data/maps/daedalus/rooms/Computer Room.txtpb new file mode 100644 index 0000000..1d5a56d --- /dev/null +++ b/data/maps/daedalus/rooms/Computer Room.txtpb
@@ -0,0 +1,72 @@
1name: "Computer Room"
2panel_display_name: "Computer Room"
3panels {
4 name: "MONITOR (1)"
5 path: "Panels/Computer/computer_1"
6 clue: "monitor"
7 answer: "television"
8 symbols: AGE
9}
10panels {
11 name: "MICROPHONE"
12 path: "Panels/Computer/computer_2"
13 clue: "microphone"
14 answer: "headset"
15 symbols: BOXES
16}
17panels {
18 name: "SPEAKER"
19 path: "Panels/Computer/computer_3"
20 clue: "speaker"
21 answer: "headset"
22 symbols: BOXES
23}
24panels {
25 name: "PROCESSOR (1)"
26 path: "Panels/Computer/computer_4"
27 clue: "processor"
28 answer: "circuit"
29 symbols: AGE
30}
31panels {
32 name: "MOUSE (1)"
33 path: "Panels/Computer/computer_5"
34 clue: "mouse"
35 answer: "joystick"
36 symbols: EXAMPLE
37}
38panels {
39 name: "KEYBOARD (1)"
40 path: "Panels/Computer/computer_6"
41 clue: "keyboard"
42 answer: "typewriter"
43 symbols: AGE
44}
45panels {
46 name: "MONITOR (2)"
47 path: "Panels/Computer/computer_7"
48 clue: "monitor"
49 answer: "computer"
50 symbols: BOXES
51}
52panels {
53 name: "PROCESSOR (2)"
54 path: "Panels/Computer/computer_8"
55 clue: "processor"
56 answer: "computer"
57 symbols: BOXES
58}
59panels {
60 name: "MOUSE (2)"
61 path: "Panels/Computer/computer_9"
62 clue: "mouse"
63 answer: "computer"
64 symbols: BOXES
65}
66panels {
67 name: "KEYBOARD (2)"
68 path: "Panels/Computer/computer_10"
69 clue: "keyboard"
70 answer: "computer"
71 symbols: BOXES
72}
diff --git a/data/maps/daedalus/rooms/Cyan Room.txtpb b/data/maps/daedalus/rooms/Cyan Room.txtpb new file mode 100644 index 0000000..60a3595 --- /dev/null +++ b/data/maps/daedalus/rooms/Cyan Room.txtpb
@@ -0,0 +1,79 @@
1name: "Cyan Room"
2panel_display_name: "Cyan Room"
3panels {
4 name: "LIFE"
5 path: "Panels/Brown Room/panel_1"
6 clue: "life"
7 answer: "death"
8 symbols: SUN
9}
10panels {
11 name: "SKIRMISH"
12 path: "Panels/Brown Room/panel_2"
13 clue: "skirmish"
14 answer: "war"
15 symbols: PYRAMID
16}
17panels {
18 name: "WORD"
19 path: "Panels/Brown Room/panel_3"
20 clue: "word"
21 answer: "world"
22 symbols: SPARKLES
23}
24panels {
25 name: "SUMMER"
26 path: "Panels/Brown Room/panel_4"
27 clue: "summer"
28 answer: "winter"
29 symbols: SUN
30}
31panels {
32 name: "ACCLIMATE (1)"
33 path: "Panels/Brown Room/panel_5"
34 clue: "acclimate"
35 answer: "climate"
36 symbols: SPARKLES
37}
38panels {
39 name: "ACCLIMATE (2)"
40 path: "Panels/Brown Room/panel_6"
41 clue: "acclimate"
42 answer: "change"
43 symbols: SUN
44}
45panels {
46 name: "P+EMIC"
47 path: "Panels/Brown Room/panel_7"
48 clue: "p+emic"
49 answer: "pandemic"
50 symbols: QUESTION
51}
52panels {
53 name: "METEOROID"
54 path: "Panels/Brown Room/panel_8"
55 clue: "meteoroid"
56 answer: "meteorite"
57 symbols: AGE
58}
59panels {
60 name: "CLEAR"
61 path: "Panels/Brown Room/panel_9"
62 clue: "clear"
63 answer: "nuclear"
64 symbols: SPARKLES
65}
66panels {
67 name: "COLD"
68 path: "Panels/Brown Room/panel_10"
69 clue: "cold"
70 answer: "heat"
71 symbols: SUN
72}
73panels {
74 name: "WORDWORD"
75 path: "Panels/Brown Room/panel_11"
76 clue: "wordword"
77 answer: "AI"
78 symbols: EXAMPLE
79}
diff --git a/data/maps/daedalus/rooms/D Keyholder.txtpb b/data/maps/daedalus/rooms/D Keyholder.txtpb new file mode 100644 index 0000000..a5852be --- /dev/null +++ b/data/maps/daedalus/rooms/D Keyholder.txtpb
@@ -0,0 +1,7 @@
1name: "D Keyholder"
2panel_display_name: "Plum Room"
3keyholders {
4 name: "D"
5 path: "Components/KeyHolders/keyHolderD"
6 key: "d"
7}
diff --git a/data/maps/daedalus/rooms/D2 Room.txtpb b/data/maps/daedalus/rooms/D2 Room.txtpb new file mode 100644 index 0000000..ec41086 --- /dev/null +++ b/data/maps/daedalus/rooms/D2 Room.txtpb
@@ -0,0 +1,7 @@
1name: "D2 Room"
2panel_display_name: "Intense Room"
3letters {
4 key: "d"
5 level2: true
6 path: "Components/Collectables/collectable6"
7}
diff --git a/data/maps/daedalus/rooms/Dark Light Exit.txtpb b/data/maps/daedalus/rooms/Dark Light Exit.txtpb new file mode 100644 index 0000000..9b6ae28 --- /dev/null +++ b/data/maps/daedalus/rooms/Dark Light Exit.txtpb
@@ -0,0 +1,9 @@
1name: "Dark Light Exit"
2panel_display_name: "Dark Light Room"
3panels {
4 name: "GASKET"
5 path: "Panels/Dark Light Room/dark_7"
6 clue: "gasket"
7 answer: "seal"
8 symbols: EXAMPLE
9}
diff --git a/data/maps/daedalus/rooms/Dark Light Room.txtpb b/data/maps/daedalus/rooms/Dark Light Room.txtpb new file mode 100644 index 0000000..45526fd --- /dev/null +++ b/data/maps/daedalus/rooms/Dark Light Room.txtpb
@@ -0,0 +1,79 @@
1name: "Dark Light Room"
2panel_display_name: "Dark Light Room"
3panels {
4 name: "COIN (1)"
5 path: "Panels/Dark Light Room/dark_1"
6 clue: "coin"
7 answer: "tails"
8 symbols: BOXES
9}
10panels {
11 name: "DOG (1)"
12 path: "Panels/Dark Light Room/dark_2"
13 clue: "dog"
14 answer: "tooth"
15 symbols: BOXES
16}
17panels {
18 name: "SONG (1)"
19 path: "Panels/Dark Light Room/dark_3"
20 clue: "song"
21 answer: "lyrics"
22 symbols: BOXES
23}
24panels {
25 name: "HUMAN (1)"
26 path: "Panels/Dark Light Room/dark_4"
27 clue: "human"
28 answer: "brain"
29 symbols: BOXES
30}
31panels {
32 name: "ROSE (1)"
33 path: "Panels/Dark Light Room/dark_5"
34 clue: "rose"
35 answer: "thorn"
36 symbols: BOXES
37}
38panels {
39 name: "DARK"
40 path: "Panels/Dark Light Room/dark_6"
41 clue: "dark"
42 answer: "light"
43 symbols: SUN
44}
45panels {
46 name: "ROSE (2)"
47 path: "Panels/Dark Light Room/light_1"
48 clue: "rose"
49 answer: "petal"
50 symbols: BOXES
51}
52panels {
53 name: "HUMAN (2)"
54 path: "Panels/Dark Light Room/light_2"
55 clue: "human"
56 answer: "heart"
57 symbols: BOXES
58}
59panels {
60 name: "SONG (2)"
61 path: "Panels/Dark Light Room/light_3"
62 clue: "song"
63 answer: "melody"
64 symbols: BOXES
65}
66panels {
67 name: "DOG (2)"
68 path: "Panels/Dark Light Room/light_4"
69 clue: "dog"
70 answer: "tail"
71 symbols: BOXES
72}
73panels {
74 name: "COIN (2)"
75 path: "Panels/Dark Light Room/light_5"
76 clue: "coin"
77 answer: "heads"
78 symbols: BOXES
79}
diff --git a/data/maps/daedalus/rooms/Ending.txtpb b/data/maps/daedalus/rooms/Ending.txtpb new file mode 100644 index 0000000..6b7843c --- /dev/null +++ b/data/maps/daedalus/rooms/Ending.txtpb
@@ -0,0 +1,6 @@
1name: "Ending"
2panel_display_name: "Castle"
3endings {
4 name: "ORANGE"
5 path: "Components/Triggers/orange_ending"
6}
diff --git a/data/maps/daedalus/rooms/Entry Shortcut.txtpb b/data/maps/daedalus/rooms/Entry Shortcut.txtpb new file mode 100644 index 0000000..3c3abb7 --- /dev/null +++ b/data/maps/daedalus/rooms/Entry Shortcut.txtpb
@@ -0,0 +1,17 @@
1name: "Entry Shortcut"
2panel_display_name: "Central"
3panels {
4 name: "WELCOME"
5 path: "Panels/Entry/entry_3"
6 clue: "welcome"
7 answer: "back"
8 symbols: QUESTION
9 display_name: "WELCOME (Red/Blue)"
10}
11ports {
12 name: "ENTRY"
13 display_name: "Starting Room West Wall Middle Worldport"
14 path: "Components/Warps/Worldports/worldport4"
15 destination { x: -21 y: 0 z: -4 }
16 rotation: 90
17}
diff --git a/data/maps/daedalus/rooms/Eye Painting.txtpb b/data/maps/daedalus/rooms/Eye Painting.txtpb new file mode 100644 index 0000000..4214811 --- /dev/null +++ b/data/maps/daedalus/rooms/Eye Painting.txtpb
@@ -0,0 +1,13 @@
1name: "Eye Painting"
2panel_display_name: "Temple of the Eyes"
3panels {
4 name: "REVILED"
5 path: "Panels/Entry/entry_5"
6 clue: "reviled"
7 answer: "evil"
8 symbols: SPARKLES
9}
10paintings {
11 name: "EYEREDEXITMAIN"
12 path: "Components/Paintings/Temple of the Eyes/eyeRedExitMain"
13}
diff --git a/data/maps/daedalus/rooms/Eye Temple 1F Side.txtpb b/data/maps/daedalus/rooms/Eye Temple 1F Side.txtpb new file mode 100644 index 0000000..3eb1a6b --- /dev/null +++ b/data/maps/daedalus/rooms/Eye Temple 1F Side.txtpb
@@ -0,0 +1,14 @@
1name: "Eye Temple 1F Side"
2panel_display_name: "Temple of the Eyes"
3paintings {
4 name: "EYEREDSIDE1"
5 path: "Components/Paintings/Temple of the Eyes/eyeRedSide1"
6}
7paintings {
8 name: "EYEREDTOEXITMAIN5"
9 path: "Components/Paintings/Temple of the Eyes/eyeRedToExitMain5"
10}
11paintings {
12 name: "EYEREDTOEXITMAIN1"
13 path: "Components/Paintings/Temple of the Eyes/eyeRedToExitMain1"
14}
diff --git a/data/maps/daedalus/rooms/Eye Temple 1F.txtpb b/data/maps/daedalus/rooms/Eye Temple 1F.txtpb new file mode 100644 index 0000000..e15afc1 --- /dev/null +++ b/data/maps/daedalus/rooms/Eye Temple 1F.txtpb
@@ -0,0 +1,27 @@
1name: "Eye Temple 1F"
2panel_display_name: "Temple of the Eyes"
3paintings {
4 name: "EYEREDTOEXITMAIN2"
5 path: "Components/Paintings/Temple of the Eyes/eyeRedToExitMain2"
6}
7paintings {
8 name: "EYEREDTOBACKSIDE3"
9 path: "Components/Paintings/Temple of the Eyes/eyeRedToBackside3"
10}
11paintings {
12 name: "EYEREDTOPILLAR3"
13 path: "Components/Paintings/Temple of the Eyes/eyeRedToPillar3"
14}
15paintings {
16 name: "EYEREDTOPILLAR2"
17 path: "Components/Paintings/Temple of the Eyes/eyeRedToPillar2"
18}
19paintings {
20 name: "EYEREDTOPILLAR1"
21 path: "Components/Paintings/Temple of the Eyes/eyeRedToPillar1"
22}
23paintings {
24 name: "EYEREDEXITBACKSIDE"
25 path: "Components/Paintings/Temple of the Eyes/eyeRedExitBackside"
26 exit_only: true
27}
diff --git a/data/maps/daedalus/rooms/Eye Temple 2F Side.txtpb b/data/maps/daedalus/rooms/Eye Temple 2F Side.txtpb new file mode 100644 index 0000000..7a1eb0a --- /dev/null +++ b/data/maps/daedalus/rooms/Eye Temple 2F Side.txtpb
@@ -0,0 +1,14 @@
1name: "Eye Temple 2F Side"
2panel_display_name: "Temple of the Eyes"
3paintings {
4 name: "EYEREDTOEXITMAIN4"
5 path: "Components/Paintings/Temple of the Eyes/eyeRedToExitMain4"
6}
7paintings {
8 name: "EYEREDEXITMAIN3"
9 path: "Components/Paintings/Temple of the Eyes/eyeRedExitMain3"
10}
11paintings {
12 name: "EYEREDEXITMAIN4"
13 path: "Components/Paintings/Temple of the Eyes/eyeRedExitMain4"
14}
diff --git a/data/maps/daedalus/rooms/Eye Temple 2F.txtpb b/data/maps/daedalus/rooms/Eye Temple 2F.txtpb new file mode 100644 index 0000000..d9e06d9 --- /dev/null +++ b/data/maps/daedalus/rooms/Eye Temple 2F.txtpb
@@ -0,0 +1,18 @@
1name: "Eye Temple 2F"
2panel_display_name: "Temple of the Eyes"
3paintings {
4 name: "EYEREDEXITTOP1"
5 path: "Components/Paintings/Temple of the Eyes/eyeRedExitTop1"
6}
7paintings {
8 name: "EYEREDTOTOP1"
9 path: "Components/Paintings/Temple of the Eyes/eyeRedToTop1"
10}
11paintings {
12 name: "EYEREDTOBACKSIDE5"
13 path: "Components/Paintings/Temple of the Eyes/eyeRedToBackside5"
14}
15paintings {
16 name: "EYEREDTOSIDE1"
17 path: "Components/Paintings/Temple of the Eyes/eyeRedToSide1"
18}
diff --git a/data/maps/daedalus/rooms/Eye Temple Pillar 1.txtpb b/data/maps/daedalus/rooms/Eye Temple Pillar 1.txtpb new file mode 100644 index 0000000..8243704 --- /dev/null +++ b/data/maps/daedalus/rooms/Eye Temple Pillar 1.txtpb
@@ -0,0 +1,15 @@
1name: "Eye Temple Pillar 1"
2panel_display_name: "Temple of the Eyes"
3paintings {
4 name: "EYEREDEXITPILLAR1"
5 path: "Components/Paintings/Temple of the Eyes/eyeRedExitPillar1"
6 exit_only: true
7}
8paintings {
9 name: "EYEREDTOBACKSIDE4"
10 path: "Components/Paintings/Temple of the Eyes/eyeRedToBackside4"
11}
12paintings {
13 name: "EYEREDTOBACKSIDE1"
14 path: "Components/Paintings/Temple of the Eyes/eyeRedToBackside1"
15}
diff --git a/data/maps/daedalus/rooms/Eye Temple Pillar 2.txtpb b/data/maps/daedalus/rooms/Eye Temple Pillar 2.txtpb new file mode 100644 index 0000000..445649a --- /dev/null +++ b/data/maps/daedalus/rooms/Eye Temple Pillar 2.txtpb
@@ -0,0 +1,15 @@
1name: "Eye Temple Pillar 2"
2panel_display_name: "Temple of the Eyes"
3paintings {
4 name: "EYEREDEXITPILLAR2"
5 path: "Components/Paintings/Temple of the Eyes/eyeRedExitPillar2"
6 exit_only: true
7}
8paintings {
9 name: "EYEREDTOEXITMAIN3"
10 path: "Components/Paintings/Temple of the Eyes/eyeRedToExitMain3"
11}
12paintings {
13 name: "EYEREDTOBACKSIDE2"
14 path: "Components/Paintings/Temple of the Eyes/eyeRedToBackside2"
15}
diff --git a/data/maps/daedalus/rooms/F Keyholder.txtpb b/data/maps/daedalus/rooms/F Keyholder.txtpb new file mode 100644 index 0000000..b424c6a --- /dev/null +++ b/data/maps/daedalus/rooms/F Keyholder.txtpb
@@ -0,0 +1,7 @@
1name: "F Keyholder"
2panel_display_name: "West Area"
3keyholders {
4 name: "F"
5 path: "Components/KeyHolders/keyHolderF"
6 key: "f"
7}
diff --git a/data/maps/daedalus/rooms/F2 Prize.txtpb b/data/maps/daedalus/rooms/F2 Prize.txtpb new file mode 100644 index 0000000..ac95340 --- /dev/null +++ b/data/maps/daedalus/rooms/F2 Prize.txtpb
@@ -0,0 +1,7 @@
1name: "F2 Prize"
2panel_display_name: "F2 Room"
3letters {
4 key: "f"
5 level2: true
6 path: "Components/Collectables/collectable4"
7}
diff --git a/data/maps/daedalus/rooms/F2 Room.txtpb b/data/maps/daedalus/rooms/F2 Room.txtpb new file mode 100644 index 0000000..96b609e --- /dev/null +++ b/data/maps/daedalus/rooms/F2 Room.txtpb
@@ -0,0 +1,114 @@
1name: "F2 Room"
2panel_display_name: "F2 Room"
3panels {
4 name: "DULLS"
5 path: "Panels/The Big F/o_1"
6 clue: "dulls"
7 answer: "fades"
8 symbols: SUN
9}
10panels {
11 name: "GRIME"
12 path: "Panels/The Big F/o_2"
13 clue: "grime"
14 answer: "filth"
15 symbols: SUN
16}
17panels {
18 name: "CRAFT"
19 path: "Panels/The Big F/o_3"
20 clue: "craft"
21 answer: "forge"
22 symbols: SUN
23}
24panels {
25 name: "CAST"
26 path: "Panels/The Big F/o_4"
27 clue: "cast"
28 answer: "forge"
29 symbols: SUN
30}
31panels {
32 name: "WANES"
33 path: "Panels/The Big F/o_5"
34 clue: "wanes"
35 answer: "fades"
36 symbols: SUN
37}
38panels {
39 name: "DECAY"
40 path: "Panels/The Big F/o_9"
41 clue: "decay"
42 answer: "filth"
43 symbols: SUN
44}
45panels {
46 name: "MAKE"
47 path: "Panels/The Big F/o_10"
48 clue: "make"
49 answer: "forge"
50 symbols: SUN
51}
52panels {
53 name: "WEAKENS"
54 path: "Panels/The Big F/o_11"
55 clue: "weakens"
56 answer: "fades"
57 symbols: SUN
58}
59panels {
60 name: "TRASH"
61 path: "Panels/The Big F/o_12"
62 clue: "trash"
63 answer: "filth"
64 symbols: SUN
65}
66panels {
67 name: "SHAPE"
68 path: "Panels/The Big F/o_13"
69 clue: "shape"
70 answer: "forge"
71 symbols: SUN
72}
73panels {
74 name: "DEADLY"
75 path: "Panels/The Big F Not/o_6"
76 clue: "deadly"
77 answer: "fatal"
78 symbols: SUN
79}
80panels {
81 name: "DIMS"
82 path: "Panels/The Big F Not/o_7"
83 clue: "dims"
84 answer: "fades"
85 symbols: SUN
86}
87panels {
88 name: "LETHAL"
89 path: "Panels/The Big F Not/o_8"
90 clue: "lethal"
91 answer: "fatal"
92 symbols: SUN
93}
94panels {
95 name: "GRAVE"
96 path: "Panels/The Big F Not/o_14"
97 clue: "grave"
98 answer: "fatal"
99 symbols: SUN
100}
101panels {
102 name: "DIRT"
103 path: "Panels/The Big F Not/o_15"
104 clue: "dirt"
105 answer: "filth"
106 symbols: SUN
107}
108panels {
109 name: "RISKY"
110 path: "Panels/The Big F Not/o_16"
111 clue: "risky"
112 answer: "fatal"
113 symbols: SUN
114}
diff --git a/data/maps/daedalus/rooms/Flip Painting Destination.txtpb b/data/maps/daedalus/rooms/Flip Painting Destination.txtpb new file mode 100644 index 0000000..b3ec055 --- /dev/null +++ b/data/maps/daedalus/rooms/Flip Painting Destination.txtpb
@@ -0,0 +1,8 @@
1name: "Flip Painting Destination"
2panel_display_name: "Central"
3paintings {
4 name: "FLIP"
5 path: "Components/Paintings/Group2/flip"
6 exit_only: true
7 gravity: Y_PLUS
8}
diff --git a/data/maps/daedalus/rooms/Flip Painting Hidden Panel.txtpb b/data/maps/daedalus/rooms/Flip Painting Hidden Panel.txtpb new file mode 100644 index 0000000..d597114 --- /dev/null +++ b/data/maps/daedalus/rooms/Flip Painting Hidden Panel.txtpb
@@ -0,0 +1,12 @@
1name: "Flip Painting Hidden Panel"
2panel_display_name: "Central"
3panels {
4 name: "HIDDEN"
5 path: "Panels/Halls/halls_2"
6 clue: "hidden"
7 answer: "ceortv" # ???????
8 symbols: SUN
9 proxies { answer: "covert" path: "Panels/Halls/secret_proxy_1" }
10 proxies { answer: "secret" path: "Panels/Halls/secret_proxy_2" }
11 display_name: "HIDDEN (East)"
12}
diff --git a/data/maps/daedalus/rooms/Flip Painting.txtpb b/data/maps/daedalus/rooms/Flip Painting.txtpb new file mode 100644 index 0000000..6d9bf06 --- /dev/null +++ b/data/maps/daedalus/rooms/Flip Painting.txtpb
@@ -0,0 +1,6 @@
1name: "Flip Painting"
2panel_display_name: "West Area"
3paintings {
4 name: "FLIP2"
5 path: "Components/Paintings/Group2/flip2"
6}
diff --git a/data/maps/daedalus/rooms/Gallery Entrance.txtpb b/data/maps/daedalus/rooms/Gallery Entrance.txtpb new file mode 100644 index 0000000..3616bf7 --- /dev/null +++ b/data/maps/daedalus/rooms/Gallery Entrance.txtpb
@@ -0,0 +1,6 @@
1name: "Gallery Entrance"
2panel_display_name: "Central"
3paintings {
4 name: "GALLERY"
5 path: "Components/Warps/eyeWorldport"
6}
diff --git a/data/maps/daedalus/rooms/Globe Room.txtpb b/data/maps/daedalus/rooms/Globe Room.txtpb new file mode 100644 index 0000000..b090ac6 --- /dev/null +++ b/data/maps/daedalus/rooms/Globe Room.txtpb
@@ -0,0 +1,54 @@
1name: "Globe Room"
2panel_display_name: "Southwest Area"
3panels {
4 name: "NORTH"
5 path: "Panels/Halls/directions_1"
6 clue: "north"
7 answer: "shotu"
8 symbols: EXAMPLE
9 proxies { answer: "south" path: "Panels/Halls/directions_2" }
10 proxies { answer: "west" path: "Panels/Halls/directions_3" }
11 proxies { answer: "east" path: "Panels/Halls/directions_4" }
12}
13panels {
14 name: "HIDDEN"
15 path: "Panels/Halls/halls_16"
16 clue: "hidden"
17 answer: "ceortv"
18 symbols: SUN
19 proxies { answer: "covert" path: "Panels/Halls/secret_proxy_5" }
20 proxies { answer: "secret" path: "Panels/Halls/secret_proxy_6" }
21}
22panels {
23 name: "TICK"
24 path: "Panels/Sticks/stick_1"
25 clue: "tick"
26 answer: "tskci"
27 symbols: SPARKLES
28 proxies { answer: "stick" path: "Panels/Sticks/stick_proxy_1" }
29 proxies { answer: "sticks" path: "Panels/Sticks/stick_proxy_2" }
30}
31panels {
32 name: "TONE"
33 path: "Panels/Sticks/stick_2"
34 clue: "tone"
35 answer: "tsnoe"
36 symbols: SPARKLES
37 proxies { answer: "stone" path: "Panels/Sticks/stick_proxy_3" }
38 proxies { answer: "stones" path: "Panels/Sticks/stick_proxy_4" }
39}
40panels {
41 name: "BONE"
42 path: "Panels/Sticks/stick_3"
43 clue: "bone"
44 answer: "bones"
45 symbols: PLANET
46}
47panels {
48 name: "WORD"
49 path: "Panels/Sticks/stick_4"
50 clue: "word"
51 answer: "words"
52 symbols: PLANET
53 required_door { name: "Southwest Sticks And Stones Door" }
54}
diff --git a/data/maps/daedalus/rooms/Godot Room.txtpb b/data/maps/daedalus/rooms/Godot Room.txtpb new file mode 100644 index 0000000..92cf009 --- /dev/null +++ b/data/maps/daedalus/rooms/Godot Room.txtpb
@@ -0,0 +1,66 @@
1name: "Godot Room"
2panel_display_name: "Central"
3panels {
4 name: "MOTORCYCLE"
5 path: "Panels/Southwest Room/sw_1"
6 clue: "motorcycle"
7 answer: "engine"
8 symbols: BOXES
9}
10panels {
11 name: "ME"
12 path: "Panels/Southwest Room/sw_2"
13 clue: "me"
14 answer: "game"
15 symbols: QUESTION
16 proxies { answer: "godot" path: "Panels/Southwest Room/sw_10" }
17}
18panels {
19 name: "PAWN"
20 path: "Panels/Southwest Room/sw_3"
21 clue: "pawn"
22 answer: "game"
23 symbols: BOXES
24}
25panels {
26 name: "MANIPULATE"
27 path: "Panels/Southwest Room/sw_4"
28 clue: "manipulate"
29 answer: "game"
30 symbols: SUN
31}
32panels {
33 name: "AUDIO"
34 path: "Panels/Southwest Room/sw_5"
35 clue: "audio"
36 answer: "video"
37 symbols: SUN
38}
39panels {
40 name: "AIRPLANE"
41 path: "Panels/Southwest Room/sw_6"
42 clue: "airplane"
43 answer: "engine"
44 symbols: BOXES
45}
46panels {
47 name: "IDEA"
48 path: "Panels/Southwest Room/sw_7"
49 clue: "idea"
50 answer: "video"
51 symbols: SPARKLES
52}
53panels {
54 name: "TRAIN"
55 path: "Panels/Southwest Room/sw_8"
56 clue: "train"
57 answer: "engine"
58 symbols: BOXES
59}
60panels {
61 name: "RECORDING"
62 path: "Panels/Southwest Room/sw_9"
63 clue: "recording"
64 answer: "video"
65 symbols: SUN
66}
diff --git a/data/maps/daedalus/rooms/Gray Color Backside.txtpb b/data/maps/daedalus/rooms/Gray Color Backside.txtpb new file mode 100644 index 0000000..7d90b7f --- /dev/null +++ b/data/maps/daedalus/rooms/Gray Color Backside.txtpb
@@ -0,0 +1,47 @@
1name: "Gray Color Backside"
2panel_display_name: "Outside Pumpkin"
3panels {
4 name: "ORANGE"
5 path: "Panels/Hexes/lightgreen_1"
6 clue: "orange"
7 answer: "blue"
8 symbols: SUN
9}
10panels {
11 name: "BEGINNING"
12 path: "Panels/Hexes/lightgreen_2"
13 clue: "beginning"
14 answer: "ending"
15 symbols: SUN
16}
17panels {
18 name: "FOREWARD"
19 path: "Panels/Hexes/lightgreen_3"
20 clue: "foreward"
21 answer: "forwards"
22 symbols: ZERO
23 symbols: PLANET
24}
25panels {
26 name: "GO"
27 path: "Panels/Hexes/lightgreen_4"
28 clue: "go"
29 answer: "come"
30 symbols: SUN
31}
32panels {
33 name: "LAST"
34 path: "Panels/Hexes/lightgreen_5"
35 clue: "last"
36 answer: "first"
37 symbols: SUN
38}
39panels {
40 name: "RISE"
41 path: "Panels/Hexes/lightgreen_6"
42 clue: "rise"
43 answer: "flowers"
44 symbols: EXAMPLE
45 symbols: PLANET
46 symbols: AGE
47}
diff --git a/data/maps/daedalus/rooms/Gray Color Door.txtpb b/data/maps/daedalus/rooms/Gray Color Door.txtpb new file mode 100644 index 0000000..db46389 --- /dev/null +++ b/data/maps/daedalus/rooms/Gray Color Door.txtpb
@@ -0,0 +1,9 @@
1name: "Gray Color Door"
2panel_display_name: "Outside Pumpkin"
3panels {
4 name: "PATCH"
5 path: "Panels/Halls/halls_3"
6 clue: "patch"
7 answer: "pumpkin"
8 symbols: PLANET
9}
diff --git a/data/maps/daedalus/rooms/Green Color Door.txtpb b/data/maps/daedalus/rooms/Green Color Door.txtpb new file mode 100644 index 0000000..fe52c09 --- /dev/null +++ b/data/maps/daedalus/rooms/Green Color Door.txtpb
@@ -0,0 +1,30 @@
1name: "Green Color Door"
2panel_display_name: "Outside Pumpkin"
3panels {
4 name: "OLD (1)"
5 path: "Panels/Halls/halls_20"
6 clue: "old"
7 answer: "young"
8 symbols: AGE
9}
10panels {
11 name: "SLEEPY"
12 path: "Panels/Halls/halls_21"
13 clue: "sleepy"
14 answer: "restless"
15 symbols: SUN
16}
17panels {
18 name: "OLD (2)"
19 path: "Panels/Halls/halls_22"
20 clue: "old"
21 answer: "bold"
22 symbols: SPARKLES
23}
24panels {
25 name: "COMELY"
26 path: "Panels/Halls/halls_23"
27 clue: "comely"
28 answer: "beautiful"
29 symbols: AGE
30}
diff --git a/data/maps/daedalus/rooms/Green Room.txtpb b/data/maps/daedalus/rooms/Green Room.txtpb new file mode 100644 index 0000000..d93ee4a --- /dev/null +++ b/data/maps/daedalus/rooms/Green Room.txtpb
@@ -0,0 +1,83 @@
1name: "Green Room"
2panel_display_name: "Green Room"
3panels {
4 name: "TIMESCALE"
5 path: "Panels/Green Room/panel_1"
6 clue: "timescale"
7 answer: "herbal"
8 symbols: SPARKLES
9 symbols: ZERO
10 symbols: EXAMPLE
11}
12panels {
13 name: "MAILBOX"
14 path: "Panels/Green Room/panel_2"
15 clue: "mailbox"
16 answer: "black"
17 symbols: EXAMPLE
18}
19panels {
20 name: "MILKY"
21 path: "Panels/Green Room/panel_3"
22 clue: "milky"
23 answer: "white"
24 symbols: SUN
25}
26panels {
27 name: "TAN"
28 path: "Panels/Green Room/panel_4"
29 clue: "tan"
30 answer: "sun"
31 symbols: EXAMPLE
32}
33panels {
34 name: "BLAND"
35 path: "Panels/Green Room/panel_5"
36 clue: "bland"
37 answer: "sweet"
38 symbols: SWEET
39}
40panels {
41 name: "WATERCOOLER"
42 path: "Panels/Green Room/panel_6"
43 clue: "watercooler"
44 answer: "iced"
45 symbols: AGE
46 symbols: EVAL
47}
48panels {
49 name: "FIXATE"
50 path: "Panels/Green Room/panel_7"
51 clue: "fixate"
52 answer: "breakfast"
53 symbols: SUN
54 symbols: AGE
55}
56panels {
57 name: "THAT"
58 path: "Panels/Green Room/panel_8"
59 clue: "that"
60 answer: "thai"
61 symbols: SPARKLES
62}
63panels {
64 name: "RICE"
65 path: "Panels/Green Room/panel_9"
66 clue: "rice"
67 answer: "jasmine"
68 symbols: EXAMPLE
69}
70panels {
71 name: "DOUBLE"
72 path: "Panels/Green Room/panel_10"
73 clue: "double"
74 answer: "bubble"
75 symbols: ZERO
76}
77panels {
78 name: "BADMINTON"
79 path: "Panels/Green Room/panel_11"
80 clue: "badminton"
81 answer: "mint"
82 symbols: SPARKLES
83}
diff --git a/data/maps/daedalus/rooms/Green Smiley.txtpb b/data/maps/daedalus/rooms/Green Smiley.txtpb new file mode 100644 index 0000000..18f067f --- /dev/null +++ b/data/maps/daedalus/rooms/Green Smiley.txtpb
@@ -0,0 +1,13 @@
1name: "Green Smiley"
2panel_display_name: "Southwest Area"
3panels {
4 name: "SMILE"
5 path: "Panels/Smiley Rooms/green"
6 clue: "smile"
7 answer: "green"
8 symbols: QUESTION
9}
10paintings {
11 name: "RELIC"
12 path: "Components/Paintings/Group1/relic"
13}
diff --git a/data/maps/daedalus/rooms/Hedges Tower.txtpb b/data/maps/daedalus/rooms/Hedges Tower.txtpb new file mode 100644 index 0000000..3b88cd7 --- /dev/null +++ b/data/maps/daedalus/rooms/Hedges Tower.txtpb
@@ -0,0 +1,8 @@
1name: "Hedges Tower"
2panel_display_name: "Hedges"
3ports {
4 name: "TENACIOUS"
5 display_name: "Hedge Maze Tower"
6 path: "Components/Warps/Worldports/worldport13"
7 no_shuffle: true
8}
diff --git a/data/maps/daedalus/rooms/Hedges.txtpb b/data/maps/daedalus/rooms/Hedges.txtpb new file mode 100644 index 0000000..69c66a9 --- /dev/null +++ b/data/maps/daedalus/rooms/Hedges.txtpb
@@ -0,0 +1,74 @@
1name: "Hedges"
2panel_display_name: "Hedges"
3panels {
4 name: "SOLVE"
5 path: "Panels/Tower Maze/maze_1"
6 clue: "solve"
7 answer: "unsolve"
8 symbols: SUN
9}
10panels {
11 name: "US"
12 path: "Panels/Tower Maze/maze_2"
13 clue: "us"
14 answer: "the"
15 symbols: SUN
16 symbols: SPARKLES
17}
18panels {
19 name: "IN"
20 path: "Panels/Tower Maze/maze_3"
21 clue: "in"
22 answer: "thin"
23 symbols: SPARKLES
24}
25panels {
26 name: "ORDER"
27 path: "Panels/Tower Maze/maze_4"
28 clue: "order"
29 answer: "chaos"
30 symbols: SUN
31}
32panels {
33 name: "THEN"
34 path: "Panels/Tower Maze/maze_5"
35 clue: "then"
36 answer: "hens"
37 symbols: SPARKLES
38 symbols: PLANET
39}
40panels {
41 name: "JUMP"
42 path: "Panels/Tower Maze/maze_6"
43 clue: "jump"
44 answer: "leap"
45 symbols: SUN
46}
47panels {
48 name: "DOWN"
49 path: "Panels/Tower Maze/maze_7"
50 clue: "down"
51 answer: "up"
52 symbols: SUN
53}
54panels {
55 name: "TOWER"
56 path: "Panels/Tower Maze/maze_9"
57 clue: "tower"
58 answer: "spire"
59 symbols: SUN
60}
61panels {
62 name: "THE"
63 path: "Panels/Tower Maze/maze_8"
64 clue: "the"
65 answer: "tree"
66 symbols: ZERO
67}
68panels {
69 name: "SMILE"
70 path: "Panels/Smiley Rooms/yellow"
71 clue: "smile"
72 answer: "yellow"
73 symbols: QUESTION
74}
diff --git a/data/maps/daedalus/rooms/Hotel.txtpb b/data/maps/daedalus/rooms/Hotel.txtpb new file mode 100644 index 0000000..d590841 --- /dev/null +++ b/data/maps/daedalus/rooms/Hotel.txtpb
@@ -0,0 +1,450 @@
1name: "Hotel"
2panel_display_name: "Southwest Area"
3panels {
4 name: "MARLIN"
5 path: "Panels/Connections/connections_2"
6 clue: "marlin"
7 answer: "fish"
8 symbols: QUESTION
9}
10panels {
11 name: "WHO"
12 path: "Panels/Connections/connections_3"
13 clue: "who"
14 answer: "question"
15 symbols: QUESTION
16}
17panels {
18 name: "MANE"
19 path: "Panels/Connections/connections_5"
20 clue: "mane"
21 answer: "lion"
22 symbols: QUESTION
23}
24panels {
25 name: "WHAT"
26 path: "Panels/Connections/connections_6"
27 clue: "what"
28 answer: "question"
29 symbols: QUESTION
30}
31panels {
32 name: "BLAZER"
33 path: "Panels/Connections/connections_7"
34 clue: "blazer"
35 answer: "coat"
36 symbols: QUESTION
37}
38panels {
39 name: "WHERE"
40 path: "Panels/Connections/connections_8"
41 clue: "where"
42 answer: "question"
43 symbols: QUESTION
44}
45panels {
46 name: "JACKET"
47 path: "Panels/Connections/connections_10"
48 clue: "jacket"
49 answer: "coat"
50 symbols: QUESTION
51}
52panels {
53 name: "TAIL"
54 path: "Panels/Connections/connections_11"
55 clue: "tail"
56 answer: "lion"
57 symbols: QUESTION
58}
59panels {
60 name: "FLOUNDER"
61 path: "Panels/Connections/connections_13"
62 clue: "flounder"
63 answer: "fish"
64 symbols: QUESTION
65}
66panels {
67 name: "BRUCE"
68 path: "Panels/Connections/connections_16"
69 clue: "bruce"
70 answer: "fish"
71 symbols: QUESTION
72}
73panels {
74 name: "SALAD"
75 path: "Panels/Connections/connections_18"
76 clue: "salad"
77 answer: "fork"
78 symbols: QUESTION
79}
80panels {
81 name: "BATHING"
82 path: "Panels/Connections/connections_19"
83 clue: "bathing"
84 answer: "suit"
85 symbols: QUESTION
86}
87panels {
88 name: "BUSINESS"
89 path: "Panels/Connections/connections_21"
90 clue: "business"
91 answer: "suit"
92 symbols: QUESTION
93}
94panels {
95 name: "WEDDING"
96 path: "Panels/Connections/connections_22"
97 clue: "wedding"
98 answer: "ring"
99 symbols: QUESTION
100}
101panels {
102 name: "TREE"
103 path: "Panels/Connections/connections_23"
104 clue: "tree"
105 answer: "ring"
106 symbols: QUESTION
107}
108panels {
109 name: "RIVER"
110 path: "Panels/Connections/connections_24"
111 clue: "river"
112 answer: "fork"
113 symbols: QUESTION
114}
115panels {
116 name: "BOXING"
117 path: "Panels/Connections/connections_26"
118 clue: "boxing"
119 answer: "ring"
120 symbols: QUESTION
121}
122panels {
123 name: "TELEPHONE"
124 path: "Panels/Connections/connections_27"
125 clue: "telephone"
126 answer: "ring"
127 symbols: QUESTION
128}
129panels {
130 name: "POKER"
131 path: "Panels/Connections/connections_29"
132 clue: "poker"
133 answer: "chip"
134 symbols: QUESTION
135}
136panels {
137 name: "CHOCOLATE"
138 path: "Panels/Connections/connections_32"
139 clue: "chocolate"
140 answer: "chip"
141 symbols: QUESTION
142}
143panels {
144 name: "WITHDRAW"
145 path: "Panels/Connections/connections_34"
146 clue: "withdraw"
147 answer: "exit"
148 symbols: QUESTION
149}
150panels {
151 name: "QUIT"
152 path: "Panels/Connections/connections_35"
153 clue: "quit"
154 answer: "exit"
155 symbols: QUESTION
156}
157panels {
158 name: "PALE"
159 path: "Panels/Connections/connections_37"
160 clue: "pale"
161 answer: "fair"
162 symbols: QUESTION
163}
164panels {
165 name: "JUST"
166 path: "Panels/Connections/connections_38"
167 clue: "just"
168 answer: "fair"
169 symbols: QUESTION
170}
171panels {
172 name: "NEW"
173 path: "Panels/Connections/connections_39"
174 clue: "new"
175 answer: "moon"
176 symbols: QUESTION
177}
178panels {
179 name: "UNTALENTED"
180 path: "Panels/Connections/connections_40"
181 clue: "untalented"
182 answer: "good"
183 symbols: QUESTION
184}
185panels {
186 name: "FULL"
187 path: "Panels/Connections/connections_42"
188 clue: "full"
189 answer: "moon"
190 symbols: QUESTION
191}
192panels {
193 name: "EVIL"
194 path: "Panels/Connections/connections_43"
195 clue: "evil"
196 answer: "good"
197 symbols: QUESTION
198}
199panels {
200 name: "CRESCENT"
201 path: "Panels/Connections/connections_45"
202 clue: "crescent"
203 answer: "moon"
204 symbols: QUESTION
205}
206panels {
207 name: "BEAUTIFUL"
208 path: "Panels/Connections/connections_48"
209 clue: "beautiful"
210 answer: "fair"
211 symbols: QUESTION
212}
213panels {
214 name: "DROOPED"
215 path: "Panels/Connections/connections_50"
216 clue: "drooped"
217 answer: "withered"
218 symbols: QUESTION
219}
220panels {
221 name: "FADED"
222 path: "Panels/Connections/connections_51"
223 clue: "faded"
224 answer: "withered"
225 symbols: QUESTION
226}
227panels {
228 name: "TALL"
229 path: "Panels/Connections/connections_53"
230 clue: "tall"
231 answer: "football"
232 symbols: QUESTION
233}
234panels {
235 name: "CANVAS"
236 path: "Panels/Connections/connections_54"
237 clue: "canvas"
238 answer: "painting"
239 symbols: QUESTION
240}
241panels {
242 name: "LEVER"
243 path: "Panels/Connections/connections_55"
244 clue: "lever"
245 answer: "leverage"
246 symbols: QUESTION
247}
248panels {
249 name: "SCULPTURE"
250 path: "Panels/Connections/connections_56"
251 clue: "sculpture"
252 answer: "painting"
253 symbols: QUESTION
254}
255panels {
256 name: "BALL"
257 path: "Panels/Connections/connections_58"
258 clue: "ball"
259 answer: "football"
260 symbols: QUESTION
261}
262panels {
263 name: "FOOL"
264 path: "Panels/Connections/connections_59"
265 clue: "fool"
266 answer: "football"
267 symbols: QUESTION
268}
269panels {
270 name: "ART"
271 path: "Panels/Connections/connections_61"
272 clue: "art"
273 answer: "painting"
274 symbols: QUESTION
275}
276panels {
277 name: "FOOT"
278 path: "Panels/Connections/connections_64"
279 clue: "foot"
280 answer: "football"
281 symbols: QUESTION
282}
283panels {
284 name: "PARKA"
285 path: "Panels/Connections Off/connections_1"
286 clue: "parka"
287 answer: "coat"
288 symbols: QUESTION
289}
290panels {
291 name: "CLOAK"
292 path: "Panels/Connections Off/connections_4"
293 clue: "cloak"
294 answer: "coat"
295 symbols: QUESTION
296}
297panels {
298 name: "DOROTHY"
299 path: "Panels/Connections Off/connections_9"
300 clue: "dorothy"
301 answer: "fish"
302 symbols: QUESTION
303}
304panels {
305 name: "JAWS"
306 path: "Panels/Connections Off/connections_12"
307 clue: "jaws"
308 answer: "lion"
309 symbols: QUESTION
310}
311panels {
312 name: "WHEN"
313 path: "Panels/Connections Off/connections_14"
314 clue: "when"
315 answer: "question"
316 symbols: QUESTION
317}
318panels {
319 name: "CLAWS"
320 path: "Panels/Connections Off/connections_15"
321 clue: "claws"
322 answer: "lion"
323 symbols: QUESTION
324}
325panels {
326 name: "POTATO"
327 path: "Panels/Connections Off/connections_17"
328 clue: "potato"
329 answer: "chip"
330 symbols: QUESTION
331}
332panels {
333 name: "MICRO"
334 path: "Panels/Connections Off/connections_20"
335 clue: "micro"
336 answer: "chip"
337 symbols: QUESTION
338}
339panels {
340 name: "TUNING"
341 path: "Panels/Connections Off/connections_25"
342 clue: "tuning"
343 answer: "fork"
344 symbols: QUESTION
345}
346panels {
347 name: "LAW"
348 path: "Panels/Connections Off/connections_28"
349 clue: "law"
350 answer: "suit"
351 symbols: QUESTION
352}
353panels {
354 name: "CARD"
355 path: "Panels/Connections Off/connections_30"
356 clue: "card"
357 answer: "suit"
358 symbols: QUESTION
359}
360panels {
361 name: "ROAD"
362 path: "Panels/Connections Off/connections_31"
363 clue: "road"
364 answer: "fork"
365 symbols: QUESTION
366}
367panels {
368 name: "DEPART"
369 path: "Panels/Connections Off/connections_33"
370 clue: "depart"
371 answer: "exit"
372 symbols: QUESTION
373}
374panels {
375 name: "LEAVE"
376 path: "Panels/Connections Off/connections_36"
377 clue: "leave"
378 answer: "exit"
379 symbols: QUESTION
380}
381panels {
382 name: "SERVICE"
383 path: "Panels/Connections Off/connections_41"
384 clue: "service"
385 answer: "good"
386 symbols: QUESTION
387}
388panels {
389 name: "HONEY"
390 path: "Panels/Connections Off/connections_44"
391 clue: "honey"
392 answer: "moon"
393 symbols: QUESTION
394}
395panels {
396 name: "INVALID"
397 path: "Panels/Connections Off/connections_46"
398 clue: "invalid"
399 answer: "good"
400 symbols: QUESTION
401}
402panels {
403 name: "FESTIVAL"
404 path: "Panels/Connections Off/connections_47"
405 clue: "festival"
406 answer: "fair"
407 symbols: QUESTION
408}
409panels {
410 name: "WILTED"
411 path: "Panels/Connections Off/connections_49"
412 clue: "wilted"
413 answer: "withered"
414 symbols: QUESTION
415}
416panels {
417 name: "WANED"
418 path: "Panels/Connections Off/connections_52"
419 clue: "waned"
420 answer: "withered"
421 symbols: QUESTION
422}
423panels {
424 name: "RAGE"
425 path: "Panels/Connections Off/connections_57"
426 clue: "rage"
427 answer: "leverage"
428 symbols: QUESTION
429}
430panels {
431 name: "VERGE"
432 path: "Panels/Connections Off/connections_60"
433 clue: "verge"
434 answer: "leverage"
435 symbols: QUESTION
436}
437panels {
438 name: "EVER"
439 path: "Panels/Connections Off/connections_62"
440 clue: "ever"
441 answer: "leverage"
442 symbols: QUESTION
443}
444panels {
445 name: "PAIN"
446 path: "Panels/Connections Off/connections_63"
447 clue: "pain"
448 answer: "painting"
449 symbols: QUESTION
450}
diff --git a/data/maps/daedalus/rooms/House Entrance.txtpb b/data/maps/daedalus/rooms/House Entrance.txtpb new file mode 100644 index 0000000..06dcb3f --- /dev/null +++ b/data/maps/daedalus/rooms/House Entrance.txtpb
@@ -0,0 +1,9 @@
1name: "House Entrance"
2panel_display_name: "Maze"
3panels {
4 name: "ADULT"
5 path: "Panels/Entry/entry_6"
6 clue: "adult"
7 answer: "child"
8 symbols: AGE
9}
diff --git a/data/maps/daedalus/rooms/House.txtpb b/data/maps/daedalus/rooms/House.txtpb new file mode 100644 index 0000000..3cfd4d8 --- /dev/null +++ b/data/maps/daedalus/rooms/House.txtpb
@@ -0,0 +1,30 @@
1name: "House"
2panel_display_name: "House"
3panels {
4 name: "GOAT"
5 path: "Panels/Theos House/panel_1"
6 clue: "goat"
7 answer: "kid"
8 symbols: AGE
9}
10panels {
11 name: "AMAZE"
12 path: "Panels/Theos House/panel_2"
13 clue: "amaze"
14 answer: "wow"
15 symbols: SUN
16}
17panels {
18 name: "SKINNYHIM"
19 path: "Panels/Theos House/panel_3"
20 clue: "skinnyhim"
21 answer: "dad"
22 symbols: SUN
23 symbols: GENDER
24}
25panels {
26 name: "THEO"
27 path: "Panels/Theos House/panel_4"
28 clue: "theo"
29 answer: "theo"
30}
diff --git a/data/maps/daedalus/rooms/I2 Room.txtpb b/data/maps/daedalus/rooms/I2 Room.txtpb new file mode 100644 index 0000000..2735a3b --- /dev/null +++ b/data/maps/daedalus/rooms/I2 Room.txtpb
@@ -0,0 +1,11 @@
1name: "I2 Room"
2panel_display_name: "Temple of the Eyes"
3letters {
4 key: "i"
5 level2: true
6 path: "Components/Collectables/collectable7"
7}
8paintings {
9 name: "EYEREDEXITMAIN2"
10 path: "Components/Paintings/Temple of the Eyes/eyeRedExitMain2"
11}
diff --git a/data/maps/daedalus/rooms/Intense Room.txtpb b/data/maps/daedalus/rooms/Intense Room.txtpb new file mode 100644 index 0000000..30780f9 --- /dev/null +++ b/data/maps/daedalus/rooms/Intense Room.txtpb
@@ -0,0 +1,65 @@
1name: "Intense Room"
2panel_display_name: "Intense Room"
3panels {
4 name: "BRILLIANT"
5 path: "Panels/Intense Room/intense_1"
6 clue: "brilliant"
7 answer: "smart"
8 symbols: PYRAMID
9}
10panels {
11 name: "HORRIBLE"
12 path: "Panels/Intense Room/intense_2"
13 clue: "horrible"
14 answer: "bad"
15 symbols: PYRAMID
16}
17panels {
18 name: "INSTANTLY"
19 path: "Panels/Intense Room/intense_3"
20 clue: "instantly"
21 answer: "quickly"
22 symbols: PYRAMID
23}
24panels {
25 name: "COLOSSAL"
26 path: "Panels/Intense Room/intense_4"
27 clue: "colossal"
28 answer: "big"
29 symbols: PYRAMID
30}
31panels {
32 name: "RUN"
33 path: "Panels/Intense Room/intense_5"
34 clue: "run"
35 answer: "walk"
36 symbols: PYRAMID
37}
38panels {
39 name: "SLEEP"
40 path: "Panels/Intense Room/intense_6"
41 clue: "sleep"
42 answer: "nap"
43 symbols: PYRAMID
44}
45panels {
46 name: "TOSS"
47 path: "Panels/Intense Room/intense_7"
48 clue: "toss"
49 answer: "hurl"
50 symbols: PYRAMID
51}
52panels {
53 name: "SHATTER"
54 path: "Panels/Intense Room/intense_8"
55 clue: "shatter"
56 answer: "break"
57 symbols: PYRAMID
58}
59panels {
60 name: "DELICIOUS"
61 path: "Panels/Intense Room/intense_9"
62 clue: "delicious"
63 answer: "tasty"
64 symbols: PYRAMID
65}
diff --git a/data/maps/daedalus/rooms/J2 Room.txtpb b/data/maps/daedalus/rooms/J2 Room.txtpb new file mode 100644 index 0000000..20211d9 --- /dev/null +++ b/data/maps/daedalus/rooms/J2 Room.txtpb
@@ -0,0 +1,7 @@
1name: "J2 Room"
2panel_display_name: "Southwest Area"
3letters {
4 key: "j"
5 level2: true
6 path: "Components/Collectables/collectable8"
7}
diff --git a/data/maps/daedalus/rooms/J2 Vestibule.txtpb b/data/maps/daedalus/rooms/J2 Vestibule.txtpb new file mode 100644 index 0000000..57f5a4f --- /dev/null +++ b/data/maps/daedalus/rooms/J2 Vestibule.txtpb
@@ -0,0 +1,10 @@
1name: "J2 Vestibule"
2panel_display_name: "Southwest Area"
3panels {
4 name: "COLORFUL"
5 path: "Panels/Entry/hotel_entry2"
6 clue: "colorful"
7 answer: "vivid"
8 symbols: SUN
9 display_name: "COLORFUL (2)"
10}
diff --git a/data/maps/daedalus/rooms/Magic Room.txtpb b/data/maps/daedalus/rooms/Magic Room.txtpb new file mode 100644 index 0000000..66c63ca --- /dev/null +++ b/data/maps/daedalus/rooms/Magic Room.txtpb
@@ -0,0 +1,30 @@
1name: "Magic Room"
2panel_display_name: "Maze"
3panels {
4 name: "1"
5 path: "Panels/Magic Maze/maze_1"
6 clue: ""
7 answer: "game"
8 symbols: LINGO
9}
10panels {
11 name: "2"
12 path: "Panels/Magic Maze/maze_2"
13 clue: ""
14 answer: "image"
15 symbols: LINGO
16}
17panels {
18 name: "3"
19 path: "Panels/Magic Maze/maze_3"
20 clue: ""
21 answer: "magic"
22 symbols: LINGO
23}
24panels {
25 name: "4"
26 path: "Panels/Magic Maze/maze_4"
27 clue: ""
28 answer: "mice"
29 symbols: LINGO
30}
diff --git a/data/maps/daedalus/rooms/Maze Paintings Area.txtpb b/data/maps/daedalus/rooms/Maze Paintings Area.txtpb new file mode 100644 index 0000000..3b070f7 --- /dev/null +++ b/data/maps/daedalus/rooms/Maze Paintings Area.txtpb
@@ -0,0 +1,25 @@
1name: "Maze Paintings Area"
2panel_display_name: "Maze"
3panels {
4 name: "Paintings"
5 path: "Panels/Halls/halls_28"
6 clue: ""
7 answer: "pity"
8 symbols: LINGO
9}
10paintings {
11 name: "PEA"
12 path: "Components/Paintings/Group2/pea"
13}
14paintings {
15 name: "EYERED3"
16 path: "Components/Paintings/Group2/eyeRed3"
17}
18paintings {
19 name: "TEA"
20 path: "Components/Paintings/Group2/tea"
21}
22paintings {
23 name: "WHY_LETTERS"
24 path: "Components/Paintings/Group2/why_letters"
25}
diff --git a/data/maps/daedalus/rooms/Maze.txtpb b/data/maps/daedalus/rooms/Maze.txtpb new file mode 100644 index 0000000..a2bb5a3 --- /dev/null +++ b/data/maps/daedalus/rooms/Maze.txtpb
@@ -0,0 +1,2 @@
1name: "Maze"
2panel_display_name: "Maze"
diff --git a/data/maps/daedalus/rooms/Moat.txtpb b/data/maps/daedalus/rooms/Moat.txtpb new file mode 100644 index 0000000..7bdb040 --- /dev/null +++ b/data/maps/daedalus/rooms/Moat.txtpb
@@ -0,0 +1,13 @@
1name: "Moat"
2panel_display_name: "East Area"
3paintings {
4 name: "CASTLE"
5 path: "Components/Paintings/Group1/castle"
6}
7ports {
8 name: "HIVE"
9 display_name: "Moat Worldport"
10 path: "Components/Warps/Worldports/worldport9"
11 destination { x: 64 y: 1 z: 24.5 }
12 rotation: 0
13}
diff --git a/data/maps/daedalus/rooms/North Castle Area.txtpb b/data/maps/daedalus/rooms/North Castle Area.txtpb new file mode 100644 index 0000000..a549245 --- /dev/null +++ b/data/maps/daedalus/rooms/North Castle Area.txtpb
@@ -0,0 +1,36 @@
1name: "North Castle Area"
2panel_display_name: "North Area"
3panels {
4 name: "A"
5 path: "Panels/Castle Entrance/castle_north_helper"
6 clue: "a"
7 answer: "the"
8 symbols: EXAMPLE
9}
10panels {
11 name: "SUMMER"
12 path: "Panels/Castle Entrance/castle_north_helper2"
13 clue: "summer"
14 answer: "winter"
15 symbols: EXAMPLE
16}
17panels {
18 name: "PLACE"
19 path: "Panels/Castle Entrance/castle_north_helper3"
20 clue: "place"
21 answer: "palace"
22 symbols: SPARKLES
23}
24panels {
25 name: "A SUMMER PLACE"
26 path: "Panels/Castle Entrance/castle_north"
27 clue: ""
28 answer: "castle"
29 symbols: EXAMPLE
30 symbols: LINGO
31 required_door { name: "Castle North Hider" }
32}
33paintings {
34 name: "RELIC2"
35 path: "Components/Paintings/Group1/relic2"
36}
diff --git a/data/maps/daedalus/rooms/Number Paintings Area.txtpb b/data/maps/daedalus/rooms/Number Paintings Area.txtpb new file mode 100644 index 0000000..c89bfcf --- /dev/null +++ b/data/maps/daedalus/rooms/Number Paintings Area.txtpb
@@ -0,0 +1,40 @@
1name: "Number Paintings Area"
2panel_display_name: "Northwest Area"
3panels {
4 name: "GOING"
5 path: "Panels/Entry/g_hedge_1"
6 clue: "going"
7 answer: "gone"
8 symbols: AGE
9}
10panels {
11 name: "TURN"
12 path: "Panels/Entry/chocolate_1"
13 clue: "turn"
14 answer: "return"
15 symbols: SPARKLES
16}
17keyholders {
18 name: "G"
19 path: "Components/KeyHolders/keyHolderG"
20 key: "g"
21}
22paintings {
23 name: "WON"
24 path: "Components/Paintings/Group3/won"
25}
26paintings {
27 name: "TOO"
28 path: "Components/Paintings/Group3/too"
29}
30paintings {
31 name: "3"
32 path: "Components/Paintings/Group3/3"
33}
34paintings {
35 name: "FOR"
36 path: "Components/Paintings/Group3/for"
37 # TODO: This painting is special, and requires something akin to a pilgrimage.
38 # I don't want to deal with that yet. For now, let's have the door in The
39 # Tenacious just automatically be open.
40}
diff --git a/data/maps/daedalus/rooms/Nursery.txtpb b/data/maps/daedalus/rooms/Nursery.txtpb new file mode 100644 index 0000000..c73072d --- /dev/null +++ b/data/maps/daedalus/rooms/Nursery.txtpb
@@ -0,0 +1,32 @@
1name: "Nursery"
2panel_display_name: "Central"
3panels {
4 name: "Paintings"
5 path: "Panels/Entry/entry_2"
6 clue: ""
7 answer: "crib"
8 symbols: LINGO
9}
10panels {
11 name: "?"
12 path: "Panels/Halls/halls_17"
13 clue: ""
14 answer: "welcome"
15 display_name: "Nursery Behind"
16}
17paintings {
18 name: "ARE"
19 path: "Components/Paintings/Group2/are"
20}
21paintings {
22 name: "SEA"
23 path: "Components/Paintings/Group2/sea"
24}
25paintings {
26 name: "EYERED"
27 path: "Components/Paintings/Group2/eyeRed"
28}
29paintings {
30 name: "BEE"
31 path: "Components/Paintings/Group2/bee"
32}
diff --git a/data/maps/daedalus/rooms/O2 Prize.txtpb b/data/maps/daedalus/rooms/O2 Prize.txtpb new file mode 100644 index 0000000..a810182 --- /dev/null +++ b/data/maps/daedalus/rooms/O2 Prize.txtpb
@@ -0,0 +1,7 @@
1name: "O2 Prize"
2panel_display_name: "O2 Room"
3letters {
4 key: "o"
5 level2: true
6 path: "Components/Collectables/collectable"
7}
diff --git a/data/maps/daedalus/rooms/O2 Room.txtpb b/data/maps/daedalus/rooms/O2 Room.txtpb new file mode 100644 index 0000000..b1a839f --- /dev/null +++ b/data/maps/daedalus/rooms/O2 Room.txtpb
@@ -0,0 +1,114 @@
1name: "O2 Room"
2panel_display_name: "O2 Room"
3panels {
4 name: "LISTEN"
5 path: "Panels/The Big O/o_1"
6 clue: "listen"
7 answer: "obey"
8 symbols: SUN
9}
10panels {
11 name: "UNLOCK"
12 path: "Panels/The Big O/o_2"
13 clue: "unlock"
14 answer: "open"
15 symbols: SUN
16}
17panels {
18 name: "PROMISE"
19 path: "Panels/The Big O/o_3"
20 clue: "promise"
21 answer: "oath"
22 symbols: SUN
23}
24panels {
25 name: "SIGN"
26 path: "Panels/The Big O/o_4"
27 clue: "sign"
28 answer: "omen"
29 symbols: SUN
30}
31panels {
32 name: "AJAR"
33 path: "Panels/The Big O/o_5"
34 clue: "ajar"
35 answer: "open"
36 symbols: SUN
37}
38panels {
39 name: "HEED"
40 path: "Panels/The Big O/o_8"
41 clue: "heed"
42 answer: "obey"
43 symbols: SUN
44}
45panels {
46 name: "HERALD"
47 path: "Panels/The Big O/o_9"
48 clue: "herald"
49 answer: "omen"
50 symbols: SUN
51}
52panels {
53 name: "VOW"
54 path: "Panels/The Big O/o_12"
55 clue: "vow"
56 answer: "oath"
57 symbols: SUN
58}
59panels {
60 name: "HONEST"
61 path: "Panels/The Big O/o_13"
62 clue: "honest"
63 answer: "open"
64 symbols: SUN
65}
66panels {
67 name: "PROPHECY"
68 path: "Panels/The Big O/o_14"
69 clue: "prophecy"
70 answer: "omen"
71 symbols: SUN
72}
73panels {
74 name: "BOND"
75 path: "Panels/The Big O/o_15"
76 clue: "bond"
77 answer: "oath"
78 symbols: SUN
79}
80panels {
81 name: "UNBLOCKED"
82 path: "Panels/The Big O/o_16"
83 clue: "unblocked"
84 answer: "open"
85 symbols: SUN
86}
87panels {
88 name: "ACCEPT"
89 path: "Panels/The Big O Not/o_6"
90 clue: "accept"
91 answer: "obey"
92 symbols: SUN
93}
94panels {
95 name: "WARNING"
96 path: "Panels/The Big O Not/o_7"
97 clue: "warning"
98 answer: "omen"
99 symbols: SUN
100}
101panels {
102 name: "PLEDGE"
103 path: "Panels/The Big O Not/o_10"
104 clue: "pledge"
105 answer: "oath"
106 symbols: SUN
107}
108panels {
109 name: "FOLLOW"
110 path: "Panels/The Big O Not/o_11"
111 clue: "follow"
112 answer: "obey"
113 symbols: SUN
114}
diff --git a/data/maps/daedalus/rooms/Orange Room Hallway.txtpb b/data/maps/daedalus/rooms/Orange Room Hallway.txtpb new file mode 100644 index 0000000..915e698 --- /dev/null +++ b/data/maps/daedalus/rooms/Orange Room Hallway.txtpb
@@ -0,0 +1,4 @@
1name: "Orange Room Hallway"
2panel_display_name: "Orange Room"
3# This has the same door at both sides, and mainly just connects Z2 Room and
4# Orange Room. It's separate because you can also get here from the Roof.
diff --git a/data/maps/daedalus/rooms/Orange Room.txtpb b/data/maps/daedalus/rooms/Orange Room.txtpb new file mode 100644 index 0000000..08a0ff2 --- /dev/null +++ b/data/maps/daedalus/rooms/Orange Room.txtpb
@@ -0,0 +1,72 @@
1name: "Orange Room"
2panel_display_name: "Orange Room"
3panels {
4 name: "FRANCE"
5 path: "Panels/Orange Room/panel_1"
6 clue: "france"
7 answer: "freelance"
8 symbols: SPARKLES
9}
10panels {
11 name: "ENTER"
12 path: "Panels/Orange Room/panel_2"
13 clue: "enter"
14 answer: "carpenter"
15 symbols: SPARKLES
16}
17panels {
18 name: "TURN"
19 path: "Panels/Orange Room/panel_3"
20 clue: "turn"
21 answer: "turnpike"
22 symbols: SPARKLES
23}
24panels {
25 name: "BARE"
26 path: "Panels/Orange Room/panel_4"
27 clue: "bare"
28 answer: "barcode"
29 symbols: SPARKLES
30}
31panels {
32 name: "PORT"
33 path: "Panels/Orange Room/panel_5"
34 clue: "port"
35 answer: "portray"
36 symbols: SPARKLES
37}
38panels {
39 name: "FORTE"
40 path: "Panels/Orange Room/panel_6"
41 clue: "forte"
42 answer: "fortunate"
43 symbols: SPARKLES
44}
45panels {
46 name: "MILKS"
47 path: "Panels/Orange Room/panel_7"
48 clue: "milks"
49 answer: "milkshake"
50 symbols: SPARKLES
51}
52panels {
53 name: "VINE"
54 path: "Panels/Orange Room/panel_8"
55 clue: "vine"
56 answer: "vinegar"
57 symbols: SPARKLES
58}
59panels {
60 name: "COAL"
61 path: "Panels/Orange Room/panel_9"
62 clue: "coal"
63 answer: "charcoal"
64 symbols: SPARKLES
65}
66panels {
67 name: "OWED"
68 path: "Panels/Orange Room/panel_10"
69 clue: "owed"
70 answer: "shadowed"
71 symbols: SPARKLES
72}
diff --git a/data/maps/daedalus/rooms/Outside Book Room.txtpb b/data/maps/daedalus/rooms/Outside Book Room.txtpb new file mode 100644 index 0000000..1592217 --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Book Room.txtpb
@@ -0,0 +1,9 @@
1name: "Outside Book Room"
2panel_display_name: "Southwest Area"
3# This is behind a teal wall.
4panels {
5 name: "TEAL"
6 path: "Panels/Entry/teal_1"
7 clue: "teal"
8 answer: "teal"
9}
diff --git a/data/maps/daedalus/rooms/Outside Eye Temple.txtpb b/data/maps/daedalus/rooms/Outside Eye Temple.txtpb new file mode 100644 index 0000000..85a9c19 --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Eye Temple.txtpb
@@ -0,0 +1,9 @@
1name: "Outside Eye Temple"
2panel_display_name: "Temple of the Eyes"
3panels {
4 name: "Entrance"
5 path: "Panels/Halls/eye_temple_entry_1"
6 clue: ""
7 answer: "hi"
8 symbols: LINGO
9}
diff --git a/data/maps/daedalus/rooms/Outside Hedges.txtpb b/data/maps/daedalus/rooms/Outside Hedges.txtpb new file mode 100644 index 0000000..fc765d9 --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Hedges.txtpb
@@ -0,0 +1,83 @@
1name: "Outside Hedges"
2panel_display_name: "Hedges"
3panels {
4 name: "GOURD (1)"
5 path: "Panels/Halls/halls_11"
6 clue: "gourd"
7 answer: "pumpkin"
8 symbols: EXAMPLE
9}
10panels {
11 name: "GOURD (2)"
12 path: "Panels/Halls/halls_12"
13 clue: "gourd"
14 answer: "squash"
15 symbols: EXAMPLE
16}
17panels {
18 name: "GOURD (3)"
19 path: "Panels/Halls/halls_13"
20 clue: "gourd"
21 answer: "cucumber"
22 symbols: EXAMPLE
23}
24panels {
25 name: "GOURD (4)"
26 path: "Panels/Halls/halls_14"
27 clue: "gourd"
28 answer: "melon"
29 symbols: EXAMPLE
30}
31panels {
32 name: "PLUM (1)"
33 path: "Panels/Halls/halls_15"
34 clue: "plum"
35 answer: "color"
36 symbols: EXAMPLE
37}
38panels {
39 name: "PLUM (2)"
40 path: "Panels/Halls/halls_18"
41 clue: "plum"
42 answer: "fruit"
43 symbols: EXAMPLE
44}
45panels {
46 name: "BARK"
47 path: "Panels/Tower Maze/entry_1"
48 clue: "bark"
49 answer: "tree"
50 symbols: BOXES
51}
52panels {
53 name: "BUD"
54 path: "Panels/Tower Maze/entry_2"
55 clue: "bud"
56 answer: "flower"
57 symbols: BOXES
58}
59panels {
60 name: "LEAF"
61 path: "Panels/Tower Maze/entry_3"
62 clue: "leaf"
63 answer: "tree"
64 symbols: BOXES
65}
66panels {
67 name: "PETAL"
68 path: "Panels/Tower Maze/entry_4"
69 clue: "petal"
70 answer: "flower"
71 symbols: BOXES
72}
73paintings {
74 name: "ACHES"
75 path: "Components/Paintings/Group1/aches"
76}
77ports {
78 name: "REVITALIZED"
79 display_name: "Near Hedges Plum Hallway"
80 path: "Components/Warps/Worldports/worldport7"
81 destination { x: 45 y: 0 z: 94 }
82 rotation: 270
83}
diff --git a/data/maps/daedalus/rooms/Outside Hotel.txtpb b/data/maps/daedalus/rooms/Outside Hotel.txtpb new file mode 100644 index 0000000..7766c7d --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Hotel.txtpb
@@ -0,0 +1,10 @@
1name: "Outside Hotel"
2panel_display_name: "Southwest Area"
3panels {
4 name: "COLORFUL"
5 path: "Panels/Entry/hotel_entry"
6 clue: "colorful"
7 answer: "bright"
8 symbols: SUN
9 display_name: "COLORFUL (1)"
10}
diff --git a/data/maps/daedalus/rooms/Outside House.txtpb b/data/maps/daedalus/rooms/Outside House.txtpb new file mode 100644 index 0000000..fed9dda --- /dev/null +++ b/data/maps/daedalus/rooms/Outside House.txtpb
@@ -0,0 +1,83 @@
1name: "Outside House"
2panel_display_name: "Maze"
3panels {
4 name: "WHISPER"
5 path: "Panels/Beehalls/beehalls_1"
6 clue: "whisper"
7 answer: "shout"
8 symbols: CROSS
9}
10panels {
11 name: "WING"
12 path: "Panels/Bee Room/bee_entry_1"
13 clue: "wing"
14 answer: "sting"
15 symbols: ZERO
16}
17panels {
18 name: "DOTE"
19 path: "Panels/Bee Room/bee_entry_2"
20 clue: "dote"
21 answer: "float"
22 symbols: ZERO
23}
24panels {
25 name: "VIVID"
26 path: "Panels/Intense Room/intense_entry_1"
27 clue: "vivid"
28 answer: "bright"
29 symbols: SUN
30}
31panels {
32 name: "RIGHT"
33 path: "Panels/Intense Room/intense_entry_2"
34 clue: "right"
35 answer: "bright"
36 symbols: SPARKLES
37}
38panels {
39 name: "SILENCE"
40 path: "Panels/Entry/entry_7"
41 clue: "silence"
42 answer: "hush"
43 symbols: SUN
44}
45panels {
46 name: "BLITHELY"
47 path: "Panels/Purple Exterior/purple_7"
48 clue: "blithely"
49 answer: "the"
50 symbols: SPARKLES
51 required_door { name: "Purple NW Vestibule Blocker" }
52}
53panels {
54 name: "A"
55 path: "Panels/Purple Exterior/purple_4"
56 clue: "a"
57 answer: "the"
58 symbols: EXAMPLE
59 required_door { name: "Purple NE Vestibule Blocker" }
60}
61panels {
62 name: "WALLS"
63 path: "Panels/Purple Exterior/purple_5"
64 clue: "walls"
65 answer: "doors"
66 symbols: SUN
67}
68panels {
69 name: "LOCK"
70 path: "Panels/Purple Exterior/purple_6"
71 clue: "lock"
72 answer: "unlock"
73 symbols: SUN
74}
75keyholders {
76 name: "H"
77 path: "Components/KeyHolders/keyHolderH"
78 key: "h"
79}
80paintings {
81 name: "CASTLE2"
82 path: "Components/Paintings/Group1/castle2"
83}
diff --git a/data/maps/daedalus/rooms/Outside Magic Room.txtpb b/data/maps/daedalus/rooms/Outside Magic Room.txtpb new file mode 100644 index 0000000..2aa7848 --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Magic Room.txtpb
@@ -0,0 +1,9 @@
1name: "Outside Magic Room"
2panel_display_name: "Maze"
3panels {
4 name: "WIZARD"
5 path: "Panels/Magic Maze/maze_entry_1"
6 clue: "wizard"
7 answer: "magician"
8 symbols: SUN
9}
diff --git a/data/maps/daedalus/rooms/Outside Orange Room.txtpb b/data/maps/daedalus/rooms/Outside Orange Room.txtpb new file mode 100644 index 0000000..55efe34 --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Orange Room.txtpb
@@ -0,0 +1,60 @@
1name: "Outside Orange Room"
2panel_display_name: "East Area"
3panels {
4 name: "SMILE"
5 path: "Panels/Smiley Rooms/orange"
6 clue: "smile"
7 answer: "orange"
8 symbols: QUESTION
9}
10panels {
11 name: "VAN"
12 path: "Panels/Orange Room/panel_entry"
13 clue: "van"
14 answer: "minivan"
15 symbols: PYRAMID
16}
17panels {
18 name: "WERE"
19 path: "Panels/Hexes/magenta_1"
20 clue: "were"
21 answer: "are"
22 symbols: AGE
23}
24panels {
25 name: "FALL"
26 path: "Panels/Hexes/magenta_2"
27 clue: "fall"
28 answer: "all"
29 symbols: SPARKLES
30}
31panels {
32 name: "KNOT"
33 path: "Panels/Hexes/magenta_3"
34 clue: "knot"
35 answer: "not"
36 symbols: ZERO
37}
38panels {
39 name: "SLOT"
40 path: "Panels/Hexes/magenta_4"
41 clue: "slot"
42 answer: "lost"
43 symbols: ANAGRAM
44}
45panels {
46 name: "WAND"
47 path: "Panels/Hexes/magenta_5"
48 clue: "wand"
49 answer: "wander"
50 symbols: SPARKLES
51}
52panels {
53 name: "OWL"
54 path: "Panels/Hexes/magenta_6"
55 clue: "owl"
56 answer: "who"
57 symbols: SPARKLES
58 symbols: ZERO
59 symbols: SOUND
60}
diff --git a/data/maps/daedalus/rooms/Outside Pyramid.txtpb b/data/maps/daedalus/rooms/Outside Pyramid.txtpb new file mode 100644 index 0000000..247d3a8 --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Pyramid.txtpb
@@ -0,0 +1,16 @@
1name: "Outside Pyramid"
2panel_display_name: "Pyramid"
3panels {
4 name: "PEER"
5 path: "Panels/Pyramid/pyramid_entry"
6 clue: "peer"
7 answer: "stare"
8 symbols: SUN
9}
10panels {
11 name: "AMID"
12 path: "Panels/Pyramid/pyramid_entry_2"
13 clue: "amid"
14 answer: "among"
15 symbols: SUN
16}
diff --git a/data/maps/daedalus/rooms/Outside Red Room.txtpb b/data/maps/daedalus/rooms/Outside Red Room.txtpb new file mode 100644 index 0000000..307633b --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Red Room.txtpb
@@ -0,0 +1,9 @@
1name: "Outside Red Room"
2panel_display_name: "Red Room"
3panels {
4 name: "ROCK"
5 path: "Panels/Red Room/red_entry"
6 clue: "rock"
7 answer: "quartz"
8 symbols: EXAMPLE
9}
diff --git a/data/maps/daedalus/rooms/Outside Salt Room.txtpb b/data/maps/daedalus/rooms/Outside Salt Room.txtpb new file mode 100644 index 0000000..f5c4833 --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Salt Room.txtpb
@@ -0,0 +1,10 @@
1name: "Outside Salt Room"
2panel_display_name: "Southwest Area"
3panels {
4 name: "Colors"
5 path: "Panels/Color Reading/cr_1"
6 clue: ""
7 answer: "rob"
8 symbols: LINGO
9 display_name: "Colors (White)"
10}
diff --git a/data/maps/daedalus/rooms/Outside Snake Room.txtpb b/data/maps/daedalus/rooms/Outside Snake Room.txtpb new file mode 100644 index 0000000..31f3281 --- /dev/null +++ b/data/maps/daedalus/rooms/Outside Snake Room.txtpb
@@ -0,0 +1,68 @@
1name: "Outside Snake Room"
2panel_display_name: "West Area"
3panels {
4 name: "TONGUE"
5 path: "Panels/Pairs Room/pairs_7"
6 clue: "tongue"
7 answer: "shoe"
8 symbols: BOXES
9}
10panels {
11 name: "ACE"
12 path: "Panels/Pairs Room/pairs_8"
13 clue: "ace"
14 answer: "laces"
15 symbols: SPARKLES
16 symbols: PLANET
17}
18panels {
19 name: "SONG (South)"
20 path: "Panels/Amber/amber_south_1"
21 clue: "song"
22 answer: "chorus"
23 symbols: BOXES
24}
25panels {
26 name: "SONG (North)"
27 path: "Panels/Amber/amber_north_1"
28 clue: "song"
29 answer: "intro"
30 symbols: BOXES
31}
32panels {
33 name: "DEE SIX"
34 path: "Panels/Brown Room/entry"
35 clue: "dee six"
36 answer: "die"
37 symbols: ZERO
38 symbols: EXAMPLE
39}
40panels {
41 name: "ANSWERS"
42 path: "Panels/V Maze/four_17"
43 clue: "answers"
44 answer: "animals"
45 symbols: QUESTION
46}
47panels {
48 name: "ANIMAL"
49 path: "Panels/Pairs Room/pairs_5"
50 clue: "animal"
51 answer: "head"
52 symbols: BOXES
53}
54panels {
55 name: "ONES"
56 path: "Panels/Pairs Room/pairs_6"
57 clue: "ones"
58 answer: "phones"
59 symbols: SPARKLES
60}
61paintings {
62 name: "TOO2"
63 path: "Components/Paintings/Group3/too2"
64}
65paintings {
66 name: "SNAKE"
67 path: "Components/Paintings/Group3/snake"
68}
diff --git a/data/maps/daedalus/rooms/Pains Room.txtpb b/data/maps/daedalus/rooms/Pains Room.txtpb new file mode 100644 index 0000000..d5c9c4a --- /dev/null +++ b/data/maps/daedalus/rooms/Pains Room.txtpb
@@ -0,0 +1,14 @@
1name: "Pains Room"
2panel_display_name: "Central"
3panels {
4 name: "MOO"
5 path: "Panels/Gold/gold_1"
6 clue: "moo"
7 answer: "bull"
8 symbols: GENDER
9 symbols: SOUND
10}
11paintings {
12 name: "PAINS"
13 path: "Components/Paintings/Group2/pains"
14}
diff --git a/data/maps/daedalus/rooms/Pairs Room.txtpb b/data/maps/daedalus/rooms/Pairs Room.txtpb new file mode 100644 index 0000000..ba484bf --- /dev/null +++ b/data/maps/daedalus/rooms/Pairs Room.txtpb
@@ -0,0 +1,2 @@
1name: "Pairs Room"
2panel_display_name: "West Area"
diff --git a/data/maps/daedalus/rooms/Pepper Room.txtpb b/data/maps/daedalus/rooms/Pepper Room.txtpb new file mode 100644 index 0000000..104efa7 --- /dev/null +++ b/data/maps/daedalus/rooms/Pepper Room.txtpb
@@ -0,0 +1,10 @@
1name: "Pepper Room"
2panel_display_name: "Southwest Area"
3panels {
4 name: "SEASONING"
5 path: "Panels/Color Reading/cr_4"
6 clue: "seasoning"
7 answer: "pepper"
8 symbols: EXAMPLE
9 display_name: "SEASONING (Black)"
10}
diff --git a/data/maps/daedalus/rooms/Plum Room.txtpb b/data/maps/daedalus/rooms/Plum Room.txtpb new file mode 100644 index 0000000..36185b9 --- /dev/null +++ b/data/maps/daedalus/rooms/Plum Room.txtpb
@@ -0,0 +1,53 @@
1name: "Plum Room"
2panel_display_name: "Plum Room"
3panels {
4 name: "GOD"
5 path: "Panels/Plum Room/plum_1"
6 clue: "god"
7 answer: "goddess"
8 symbols: GENDER
9}
10panels {
11 name: "INJURED"
12 path: "Panels/Plum Room/plum_2"
13 clue: "injured"
14 answer: "wounded"
15 symbols: SUN
16}
17panels {
18 name: "HEALTHY"
19 path: "Panels/Plum Room/plum_3"
20 clue: "healthy"
21 answer: "diseased"
22 symbols: SUN
23}
24panels {
25 name: "DEMURRED"
26 path: "Panels/Plum Room/plum_4"
27 clue: "demurred"
28 answer: "murdered"
29 symbols: ANAGRAM
30}
31panels {
32 name: "FOUROFFERBEAR"
33 path: "Panels/Plum Room/plum_5"
34 clue: "fourofferbear"
35 answer: "forbidden"
36 symbols: SUN
37 symbols: ZERO
38 symbols: STARS
39}
40panels {
41 name: "SNAKE"
42 path: "Panels/Plum Room/plum_6"
43 clue: "snake"
44 answer: "adder"
45 symbols: EXAMPLE
46}
47panels {
48 name: "CENTER"
49 path: "Panels/Plum Room/plum_7"
50 clue: "center"
51 answer: "middle"
52 symbols: SUN
53}
diff --git a/data/maps/daedalus/rooms/Post Orange Smiley Three Way.txtpb b/data/maps/daedalus/rooms/Post Orange Smiley Three Way.txtpb new file mode 100644 index 0000000..63463f0 --- /dev/null +++ b/data/maps/daedalus/rooms/Post Orange Smiley Three Way.txtpb
@@ -0,0 +1,2 @@
1name: "Post Orange Smiley Three Way"
2panel_display_name: "West Area"
diff --git a/data/maps/daedalus/rooms/Pumpkin Entrance.txtpb b/data/maps/daedalus/rooms/Pumpkin Entrance.txtpb new file mode 100644 index 0000000..a746746 --- /dev/null +++ b/data/maps/daedalus/rooms/Pumpkin Entrance.txtpb
@@ -0,0 +1,8 @@
1name: "Pumpkin Entrance"
2panel_display_name: "East Area"
3panels {
4 name: "JACK"
5 path: "Panels/Pumpkin Room/pumpkin_2"
6 clue: "jack"
7 answer: "lantern"
8}
diff --git a/data/maps/daedalus/rooms/Pumpkin Room.txtpb b/data/maps/daedalus/rooms/Pumpkin Room.txtpb new file mode 100644 index 0000000..e40693b --- /dev/null +++ b/data/maps/daedalus/rooms/Pumpkin Room.txtpb
@@ -0,0 +1,65 @@
1name: "Pumpkin Room"
2panel_display_name: "East Area"
3panels {
4 name: "BONE"
5 path: "Panels/Pumpkin Room/pumpkin_3"
6 clue: "bone"
7 answer: "skeleton"
8 symbols: BOXES
9}
10panels {
11 name: "SHEET"
12 path: "Panels/Pumpkin Room/pumpkin_4"
13 clue: "sheet"
14 answer: "ghost"
15 symbols: CROSS
16}
17panels {
18 name: "PHARAOH"
19 path: "Panels/Pumpkin Room/pumpkin_5"
20 clue: "pharaoh"
21 answer: "mummy"
22 symbols: AGE
23}
24panels {
25 name: "EMPIRE"
26 path: "Panels/Pumpkin Room/pumpkin_6"
27 clue: "empire"
28 answer: "vampire"
29 symbols: SPARKLES
30}
31panels {
32 name: "BEASTS"
33 path: "Panels/Pumpkin Room/pumpkin_7"
34 clue: "beasts"
35 answer: "bat"
36 symbols: SPARKLES
37}
38panels {
39 name: "STRAW"
40 path: "Panels/Pumpkin Room/pumpkin_8"
41 clue: "straw"
42 answer: "scarecrow"
43 symbols: BOXES
44}
45panels {
46 name: "CACKLE"
47 path: "Panels/Pumpkin Room/pumpkin_9"
48 clue: "cackle"
49 answer: "witch"
50 symbols: SOUND
51}
52panels {
53 name: "HUMAN"
54 path: "Panels/Pumpkin Room/pumpkin_10"
55 clue: "human"
56 answer: "werewolf"
57 symbols: BOXES
58}
59panels {
60 name: "JAGUAR"
61 path: "Panels/Pumpkin Room/pumpkin_11"
62 clue: "jaguar"
63 answer: "cat"
64 symbols: EXAMPLE
65}
diff --git a/data/maps/daedalus/rooms/Purple Hallway From Great.txtpb b/data/maps/daedalus/rooms/Purple Hallway From Great.txtpb new file mode 100644 index 0000000..73f8391 --- /dev/null +++ b/data/maps/daedalus/rooms/Purple Hallway From Great.txtpb
@@ -0,0 +1,9 @@
1name: "Purple Hallway From Great"
2panel_display_name: "South Area"
3ports {
4 name: "GREAT"
5 display_name: "Near Sweet Purple Hallway"
6 path: "Components/Warps/Worldports/worldport17"
7 destination { x: -24 y: 0 z: 61 }
8 rotation: 270
9}
diff --git a/data/maps/daedalus/rooms/Purple NW Vestibule.txtpb b/data/maps/daedalus/rooms/Purple NW Vestibule.txtpb new file mode 100644 index 0000000..0244e6c --- /dev/null +++ b/data/maps/daedalus/rooms/Purple NW Vestibule.txtpb
@@ -0,0 +1,23 @@
1name: "Purple NW Vestibule"
2panel_display_name: "Central"
3panels {
4 name: "MESSAGES"
5 path: "Panels/Purple Exterior/purple_8"
6 clue: "messages"
7 answer: "letters"
8 symbols: EXAMPLE
9}
10panels {
11 name: "LOSE"
12 path: "Panels/Purple Exterior/purple_9"
13 clue: "lose"
14 answer: "find"
15 symbols: SUN
16}
17panels {
18 name: "SNOWMAN"
19 path: "Panels/Beehalls/beehalls_3"
20 clue: "snowman"
21 answer: "puddle"
22 symbols: CROSS
23}
diff --git a/data/maps/daedalus/rooms/Purple Room East.txtpb b/data/maps/daedalus/rooms/Purple Room East.txtpb new file mode 100644 index 0000000..6fa31bd --- /dev/null +++ b/data/maps/daedalus/rooms/Purple Room East.txtpb
@@ -0,0 +1,2 @@
1name: "Purple Room East"
2panel_display_name: "Central"
diff --git a/data/maps/daedalus/rooms/Purple Room South.txtpb b/data/maps/daedalus/rooms/Purple Room South.txtpb new file mode 100644 index 0000000..68a6264 --- /dev/null +++ b/data/maps/daedalus/rooms/Purple Room South.txtpb
@@ -0,0 +1,43 @@
1name: "Purple Room South"
2panel_display_name: "Central"
3panels {
4 name: "LITTLE"
5 path: "Panels/Halls/hof_1"
6 clue: "little"
7 answer: "old"
8 symbols: QUESTION
9}
10panels {
11 name: "FAREWELL"
12 path: "Panels/Halls/hof_2"
13 clue: "farewell"
14 answer: "greetings"
15 symbols: QUESTION
16}
17panels {
18 name: "LAMB"
19 path: "Panels/Halls/hof_3"
20 clue: "lamb"
21 answer: "friend"
22 symbols: QUESTION
23}
24panels {
25 name: "ANY"
26 path: "Panels/Purple Exterior/purple_3"
27 clue: "any"
28 answer: "many"
29 symbols: SPARKLES
30 required_door { name: "Purple SE Vestibule Blocker" }
31}
32panels {
33 name: "THESE"
34 path: "Panels/Purple Exterior/purple_10"
35 clue: "these"
36 answer: "the"
37 symbols: SPARKLES
38 required_door { name: "Purple SW Vestibule Blocker" }
39}
40paintings {
41 name: "PLANET"
42 path: "Components/Paintings/Group1/planet"
43}
diff --git a/data/maps/daedalus/rooms/Purple Room West.txtpb b/data/maps/daedalus/rooms/Purple Room West.txtpb new file mode 100644 index 0000000..9971cd2 --- /dev/null +++ b/data/maps/daedalus/rooms/Purple Room West.txtpb
@@ -0,0 +1,2 @@
1name: "Purple Room West"
2panel_display_name: "Central"
diff --git a/data/maps/daedalus/rooms/Purple Room.txtpb b/data/maps/daedalus/rooms/Purple Room.txtpb new file mode 100644 index 0000000..f34d26c --- /dev/null +++ b/data/maps/daedalus/rooms/Purple Room.txtpb
@@ -0,0 +1,59 @@
1name: "Purple Room"
2panel_display_name: "Purple Room"
3panels {
4 name: "HOIST"
5 path: "Panels/Purple Room/purple_1"
6 clue: "hoist"
7 answer: "jack"
8 symbols: SUN
9}
10panels {
11 name: "CORE"
12 path: "Panels/Purple Room/purple_2"
13 clue: "core"
14 answer: "star"
15 symbols: BOXES
16}
17panels {
18 name: "FISH"
19 path: "Panels/Purple Room/purple_3"
20 clue: "fish"
21 answer: "salmon"
22 symbols: EXAMPLE
23}
24panels {
25 name: "ALLOW"
26 path: "Panels/Purple Room/purple_4"
27 clue: "allow"
28 answer: "banana"
29 symbols: SUN
30 symbols: SPARKLES
31}
32panels {
33 name: "BIRD"
34 path: "Panels/Purple Room/purple_5"
35 clue: "bird"
36 answer: "kiwi"
37 symbols: EXAMPLE
38}
39panels {
40 name: "HONK"
41 path: "Panels/Purple Room/purple_6"
42 clue: "honk"
43 answer: "goose"
44 symbols: SOUND
45}
46panels {
47 name: "APE"
48 path: "Panels/Purple Room/purple_7"
49 clue: "ape"
50 answer: "grape"
51 symbols: SPARKLES
52}
53panels {
54 name: "APATHY"
55 path: "Panels/Purple Room/purple_8"
56 clue: "apathy"
57 answer: "passion"
58 symbols: SUN
59}
diff --git a/data/maps/daedalus/rooms/Purple SE Vestibule.txtpb b/data/maps/daedalus/rooms/Purple SE Vestibule.txtpb new file mode 100644 index 0000000..be86861 --- /dev/null +++ b/data/maps/daedalus/rooms/Purple SE Vestibule.txtpb
@@ -0,0 +1,16 @@
1name: "Purple SE Vestibule"
2panel_display_name: "Central"
3panels {
4 name: "RUN"
5 path: "Panels/Purple Exterior/purple_1"
6 clue: "run"
7 answer: "walk"
8 symbols: PYRAMID
9}
10panels {
11 name: "ROADS"
12 path: "Panels/Purple Exterior/purple_2"
13 clue: "roads"
14 answer: "paths"
15 symbols: AGE
16}
diff --git a/data/maps/daedalus/rooms/Purple SW Vestibule.txtpb b/data/maps/daedalus/rooms/Purple SW Vestibule.txtpb new file mode 100644 index 0000000..fbc5fff --- /dev/null +++ b/data/maps/daedalus/rooms/Purple SW Vestibule.txtpb
@@ -0,0 +1,20 @@
1name: "Purple SW Vestibule"
2panel_display_name: "Central"
3panels {
4 name: "LETTERS"
5 path: "Panels/Purple Exterior/purple_11"
6 clue: "letters"
7 answer: "words"
8 symbols: BOXES
9}
10panels {
11 name: "INSCRIBE"
12 path: "Panels/Purple Exterior/purple_12"
13 clue: "inscribe"
14 answer: "write"
15 symbols: SUN
16}
17paintings {
18 name: "PAINS2"
19 path: "Components/Paintings/Group2/pains2"
20}
diff --git a/data/maps/daedalus/rooms/Purple Smiley.txtpb b/data/maps/daedalus/rooms/Purple Smiley.txtpb new file mode 100644 index 0000000..5f6c989 --- /dev/null +++ b/data/maps/daedalus/rooms/Purple Smiley.txtpb
@@ -0,0 +1,9 @@
1name: "Purple Smiley"
2panel_display_name: "Northeast Area"
3panels {
4 name: "SMILE"
5 path: "Panels/Smiley Rooms/purple"
6 clue: "smile"
7 answer: "purple"
8 symbols: QUESTION
9}
diff --git a/data/maps/daedalus/rooms/Pyramid 3.txtpb b/data/maps/daedalus/rooms/Pyramid 3.txtpb new file mode 100644 index 0000000..be862d1 --- /dev/null +++ b/data/maps/daedalus/rooms/Pyramid 3.txtpb
@@ -0,0 +1,9 @@
1name: "Pyramid 3"
2panel_display_name: "Pyramid"
3panels {
4 name: "VEHICLE"
5 path: "Panels/Pyramid/pyramid_3"
6 clue: "vehicle"
7 answer: "train"
8 symbols: EXAMPLE
9}
diff --git a/data/maps/daedalus/rooms/Pyramid 4.txtpb b/data/maps/daedalus/rooms/Pyramid 4.txtpb new file mode 100644 index 0000000..e67e1c6 --- /dev/null +++ b/data/maps/daedalus/rooms/Pyramid 4.txtpb
@@ -0,0 +1,9 @@
1name: "Pyramid 4"
2panel_display_name: "Pyramid"
3panels {
4 name: "CAT"
5 path: "Panels/Pyramid/pyramid_4"
6 clue: "cat"
7 answer: "tiger"
8 symbols: EXAMPLE
9}
diff --git a/data/maps/daedalus/rooms/Pyramid 5.txtpb b/data/maps/daedalus/rooms/Pyramid 5.txtpb new file mode 100644 index 0000000..42e8a52 --- /dev/null +++ b/data/maps/daedalus/rooms/Pyramid 5.txtpb
@@ -0,0 +1,9 @@
1name: "Pyramid 5"
2panel_display_name: "Pyramid"
3panels {
4 name: "ROYAL"
5 path: "Panels/Pyramid/pyramid_5"
6 clue: "royal"
7 answer: "king"
8 symbols: EXAMPLE
9}
diff --git a/data/maps/daedalus/rooms/Pyramid 6.txtpb b/data/maps/daedalus/rooms/Pyramid 6.txtpb new file mode 100644 index 0000000..3a7346b --- /dev/null +++ b/data/maps/daedalus/rooms/Pyramid 6.txtpb
@@ -0,0 +1,9 @@
1name: "Pyramid 6"
2panel_display_name: "Pyramid"
3panels {
4 name: "TEA"
5 path: "Panels/Pyramid/pyramid_6"
6 clue: "tea"
7 answer: "black"
8 symbols: EXAMPLE
9}
diff --git a/data/maps/daedalus/rooms/Pyramid 7.txtpb b/data/maps/daedalus/rooms/Pyramid 7.txtpb new file mode 100644 index 0000000..2db71ea --- /dev/null +++ b/data/maps/daedalus/rooms/Pyramid 7.txtpb
@@ -0,0 +1,9 @@
1name: "Pyramid 7"
2panel_display_name: "Pyramid"
3panels {
4 name: "ARTIST"
5 path: "Panels/Pyramid/pyramid_7"
6 clue: "artist"
7 answer: "painter"
8 symbols: EXAMPLE
9}
diff --git a/data/maps/daedalus/rooms/Pyramid 8.txtpb b/data/maps/daedalus/rooms/Pyramid 8.txtpb new file mode 100644 index 0000000..6f61340 --- /dev/null +++ b/data/maps/daedalus/rooms/Pyramid 8.txtpb
@@ -0,0 +1,10 @@
1name: "Pyramid 8"
2panel_display_name: "Pyramid"
3panels {
4 name: "INSTRUMENT"
5 path: "Panels/Pyramid/pyramid_8"
6 clue: "instrument"
7 answer: "drum"
8 symbols: EXAMPLE
9 display_name: "INSTRUMENT (1F)"
10}
diff --git a/data/maps/daedalus/rooms/Pyramid Entry.txtpb b/data/maps/daedalus/rooms/Pyramid Entry.txtpb new file mode 100644 index 0000000..2c9e841 --- /dev/null +++ b/data/maps/daedalus/rooms/Pyramid Entry.txtpb
@@ -0,0 +1,16 @@
1name: "Pyramid Entry"
2panel_display_name: "Pyramid"
3panels {
4 name: "TREE"
5 path: "Panels/Pyramid/pyramid_1"
6 clue: "tree"
7 answer: "pine"
8 symbols: EXAMPLE
9}
10panels {
11 name: "SHAPE"
12 path: "Panels/Pyramid/pyramid_2"
13 clue: "shape"
14 answer: "triangle"
15 symbols: EXAMPLE
16}
diff --git a/data/maps/daedalus/rooms/Pyramid Second Floor.txtpb b/data/maps/daedalus/rooms/Pyramid Second Floor.txtpb new file mode 100644 index 0000000..86f5f2a --- /dev/null +++ b/data/maps/daedalus/rooms/Pyramid Second Floor.txtpb
@@ -0,0 +1,48 @@
1name: "Pyramid Second Floor"
2panel_display_name: "Pyramid"
3panels {
4 name: "TOOL"
5 path: "Panels/Pyramid/pyramid_10"
6 clue: "tool"
7 answer: "spade"
8 symbols: EXAMPLE
9}
10panels {
11 name: "SODA"
12 path: "Panels/Pyramid/pyramid_11"
13 clue: "soda"
14 answer: "club"
15 symbols: EXAMPLE
16}
17panels {
18 name: "ORGAN"
19 path: "Panels/Pyramid/pyramid_12"
20 clue: "organ"
21 answer: "heart"
22 symbols: EXAMPLE
23}
24panels {
25 name: "DIAMOND"
26 path: "Panels/Pyramid/pyramid_9"
27 clue: "diamond"
28 answer: "gem"
29 symbols: EXAMPLE
30 required_door { name: "Pyramid 9 Blocker" }
31}
32panels {
33 name: "INSTRUMENT"
34 path: "Panels/Pyramid/pyramid_13"
35 clue: "instrument"
36 answer: "organ"
37 symbols: EXAMPLE
38 required_door { name: "Pyramid 13 Blocker" }
39 display_name: "INSTRUMENT (2F)"
40}
41panels {
42 name: "BEVERAGE"
43 path: "Panels/Pyramid/pyramid_14"
44 clue: "beverage"
45 answer: "soda"
46 symbols: EXAMPLE
47 required_door { name: "Pyramid 14 Blocker" }
48}
diff --git a/data/maps/daedalus/rooms/Pyramid Top.txtpb b/data/maps/daedalus/rooms/Pyramid Top.txtpb new file mode 100644 index 0000000..c017cd6 --- /dev/null +++ b/data/maps/daedalus/rooms/Pyramid Top.txtpb
@@ -0,0 +1,7 @@
1name: "Pyramid Top"
2panel_display_name: "Pyramid"
3letters {
4 key: "r"
5 level2: true
6 path: "Components/Collectables/collectable5"
7}
diff --git a/data/maps/daedalus/rooms/Quiet Entrance.txtpb b/data/maps/daedalus/rooms/Quiet Entrance.txtpb new file mode 100644 index 0000000..cd0d0ed --- /dev/null +++ b/data/maps/daedalus/rooms/Quiet Entrance.txtpb
@@ -0,0 +1,23 @@
1name: "Quiet Entrance"
2panel_display_name: "Central"
3panels {
4 name: "HIDDEN"
5 path: "Panels/Halls/halls_7"
6 clue: "hidden"
7 answer: "ceortv"
8 symbols: SUN
9 proxies { answer: "covert" path: "Panels/Halls/secret_proxy_3" }
10 proxies { answer: "secret" path: "Panels/Halls/secret_proxy_4" }
11 display_name: "HIDDEN (West)"
12}
13paintings {
14 name: "PLANET2"
15 path: "Components/Paintings/Group1/planet2"
16}
17ports {
18 name: "QUIET"
19 display_name: "Near Planet Painting Worldport"
20 path: "Components/Warps/Worldports/worldport5"
21 destination { x: -32 y: 0 z: -40 }
22 rotation: 90
23}
diff --git a/data/maps/daedalus/rooms/Rain Side.txtpb b/data/maps/daedalus/rooms/Rain Side.txtpb new file mode 100644 index 0000000..2a62525 --- /dev/null +++ b/data/maps/daedalus/rooms/Rain Side.txtpb
@@ -0,0 +1,17 @@
1name: "Rain Side"
2panel_display_name: "Rainbow"
3panels {
4 name: "?"
5 path: "Panels/Smiley Rooms/rain"
6 clue: ""
7 answer: "rain"
8 symbols: QUESTION
9 display_name: "? (1)"
10}
11ports {
12 name: "BEARER"
13 display_name: "Rain Panel Worldport"
14 path: "Components/Warps/Worldports/worldport11"
15 destination { x: 93.5 y: 0 z: 27 }
16 rotation: 90
17}
diff --git a/data/maps/daedalus/rooms/Rainbow Blue.txtpb b/data/maps/daedalus/rooms/Rainbow Blue.txtpb new file mode 100644 index 0000000..516a9b6 --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Blue.txtpb
@@ -0,0 +1,10 @@
1name: "Rainbow Blue"
2panel_display_name: "Rainbow"
3panels {
4 name: "THEME"
5 path: "Panels/Smiley Rooms/blue2"
6 clue: "theme"
7 answer: "seasonings"
8 symbols: QUESTION
9 display_name: "THEME (Blue)"
10}
diff --git a/data/maps/daedalus/rooms/Rainbow Color Backside.txtpb b/data/maps/daedalus/rooms/Rainbow Color Backside.txtpb new file mode 100644 index 0000000..d9b49c5 --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Color Backside.txtpb
@@ -0,0 +1,15 @@
1name: "Rainbow Color Backside"
2panel_display_name: "Central"
3panels {
4 name: "BACKSIDE"
5 path: "Panels/Halls/halls_1"
6 clue: "backside"
7 answer: "backside"
8}
9panels {
10 name: "?"
11 path: "Panels/Halls/halls_4"
12 clue: ""
13 answer: "side"
14 display_name: "Backside Behind"
15}
diff --git a/data/maps/daedalus/rooms/Rainbow Color Doors.txtpb b/data/maps/daedalus/rooms/Rainbow Color Doors.txtpb new file mode 100644 index 0000000..df44979 --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Color Doors.txtpb
@@ -0,0 +1,94 @@
1name: "Rainbow Color Doors"
2panel_display_name: "East Area"
3panels {
4 name: "CROW"
5 path: "Panels/Blue Room/panel_entry"
6 clue: "crow"
7 answer: "murder"
8 symbols: PLANET
9}
10# TODO: These three need to be moved onto the roof when the stairs are present,
11# because otherwise they become impossible to solve.
12panels {
13 name: "DIRECTION (1)"
14 path: "Panels/Castle Entrance/castle_direction_1"
15 clue: "direction"
16 answer: "north"
17 symbols: EXAMPLE
18}
19panels {
20 name: "DIRECTION (2)"
21 path: "Panels/Castle Entrance/castle_direction_2"
22 clue: "direction"
23 answer: "south"
24 symbols: EXAMPLE
25}
26panels {
27 name: "DIRECTION (3)"
28 path: "Panels/Castle Entrance/castle_direction_3"
29 clue: "direction"
30 answer: "west"
31 symbols: EXAMPLE
32}
33panels {
34 name: "INWALK"
35 path: "Panels/Hexes/tower_1"
36 clue: "inwalk"
37 answer: "outrun"
38 symbols: SUN
39 symbols: PYRAMID
40}
41panels {
42 name: "RAIN"
43 path: "Panels/Hexes/tower_2"
44 clue: "rain"
45 answer: "runoff"
46 symbols: AGE
47}
48panels {
49 name: "PURCHASE"
50 path: "Panels/Hexes/tower_3"
51 clue: "purchase"
52 answer: "handover"
53 symbols: AGE
54}
55panels {
56 name: "HOURS"
57 path: "Panels/Hexes/tower_4"
58 clue: "hours"
59 answer: "overtime"
60 symbols: AGE
61}
62panels {
63 name: "MISCHIEF"
64 path: "Panels/Hexes/tower_5"
65 clue: "mischief"
66 answer: "timeout"
67 symbols: AGE
68}
69panels {
70 name: "CASUAL"
71 path: "Panels/Hexes/tower_6"
72 clue: "casual"
73 answer: "offhand"
74 symbols: SUN
75}
76panels {
77 name: "PUMP"
78 path: "Panels/Pumpkin Room/pumpkin_1"
79 clue: "pump"
80 answer: "pumpkin"
81 symbols: SPARKLES
82}
83paintings {
84 name: "SEA3"
85 path: "Components/Paintings/Group2/sea3"
86}
87paintings {
88 name: "SEA2"
89 path: "Components/Paintings/Group2/sea2"
90}
91paintings {
92 name: "ACHES2"
93 path: "Components/Paintings/Group1/aches2"
94}
diff --git a/data/maps/daedalus/rooms/Rainbow Cyan.txtpb b/data/maps/daedalus/rooms/Rainbow Cyan.txtpb new file mode 100644 index 0000000..f55b0d2 --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Cyan.txtpb
@@ -0,0 +1,10 @@
1name: "Rainbow Cyan"
2panel_display_name: "Rainbow"
3panels {
4 name: "THEME"
5 path: "Panels/Smiley Rooms/cyan"
6 clue: "theme"
7 answer: "apocalypse"
8 symbols: QUESTION
9 display_name: "THEME (Cyan)"
10}
diff --git a/data/maps/daedalus/rooms/Rainbow End.txtpb b/data/maps/daedalus/rooms/Rainbow End.txtpb new file mode 100644 index 0000000..ec623c7 --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow End.txtpb
@@ -0,0 +1,9 @@
1name: "Rainbow End"
2panel_display_name: "Rainbow"
3panels {
4 name: "POT"
5 path: "Components/Warps/gold"
6 clue: "pot"
7 answer: "gold"
8 symbols: STARS
9}
diff --git a/data/maps/daedalus/rooms/Rainbow Green.txtpb b/data/maps/daedalus/rooms/Rainbow Green.txtpb new file mode 100644 index 0000000..85bb8be --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Green.txtpb
@@ -0,0 +1,10 @@
1name: "Rainbow Green"
2panel_display_name: "Rainbow"
3panels {
4 name: "THEME"
5 path: "Panels/Smiley Rooms/green2"
6 clue: "theme"
7 answer: "tea"
8 symbols: QUESTION
9 display_name: "THEME (Green)"
10}
diff --git a/data/maps/daedalus/rooms/Rainbow Orange.txtpb b/data/maps/daedalus/rooms/Rainbow Orange.txtpb new file mode 100644 index 0000000..785eda8 --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Orange.txtpb
@@ -0,0 +1,10 @@
1name: "Rainbow Orange"
2panel_display_name: "Rainbow"
3panels {
4 name: "THEME"
5 path: "Panels/Smiley Rooms/orange2"
6 clue: "theme"
7 answer: "fish"
8 symbols: QUESTION
9 display_name: "THEME (Orange)"
10}
diff --git a/data/maps/daedalus/rooms/Rainbow Purple.txtpb b/data/maps/daedalus/rooms/Rainbow Purple.txtpb new file mode 100644 index 0000000..1f585dd --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Purple.txtpb
@@ -0,0 +1,10 @@
1name: "Rainbow Purple"
2panel_display_name: "Rainbow"
3panels {
4 name: "THEME"
5 path: "Panels/Smiley Rooms/purple2"
6 clue: "theme"
7 answer: "fruit"
8 symbols: QUESTION
9 display_name: "THEME (Purple)"
10}
diff --git a/data/maps/daedalus/rooms/Rainbow Red.txtpb b/data/maps/daedalus/rooms/Rainbow Red.txtpb new file mode 100644 index 0000000..7ef4db3 --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Red.txtpb
@@ -0,0 +1,10 @@
1name: "Rainbow Red"
2panel_display_name: "Rainbow"
3panels {
4 name: "THEME"
5 path: "Panels/Smiley Rooms/red2"
6 clue: "theme"
7 answer: "names"
8 symbols: QUESTION
9 display_name: "THEME (Red)"
10}
diff --git a/data/maps/daedalus/rooms/Rainbow Start.txtpb b/data/maps/daedalus/rooms/Rainbow Start.txtpb new file mode 100644 index 0000000..c46b762 --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Start.txtpb
@@ -0,0 +1,13 @@
1name: "Rainbow Start"
2panel_display_name: "Rainbow"
3panels {
4 name: "PAINTING"
5 path: "Panels/Smiley Rooms/rainbow"
6 clue: "painting"
7 answer: "rainbow"
8 symbols: QUESTION
9}
10paintings {
11 name: "RAINBOW"
12 path: "Components/Paintings/Group1/rainbow"
13}
diff --git a/data/maps/daedalus/rooms/Rainbow Yellow.txtpb b/data/maps/daedalus/rooms/Rainbow Yellow.txtpb new file mode 100644 index 0000000..bd2cfc5 --- /dev/null +++ b/data/maps/daedalus/rooms/Rainbow Yellow.txtpb
@@ -0,0 +1,10 @@
1name: "Rainbow Yellow"
2panel_display_name: "Rainbow"
3panels {
4 name: "THEME"
5 path: "Panels/Smiley Rooms/yellow2"
6 clue: "theme"
7 answer: "music"
8 symbols: QUESTION
9 display_name: "THEME (Yellow)"
10}
diff --git a/data/maps/daedalus/rooms/Red Color Door.txtpb b/data/maps/daedalus/rooms/Red Color Door.txtpb new file mode 100644 index 0000000..344193e --- /dev/null +++ b/data/maps/daedalus/rooms/Red Color Door.txtpb
@@ -0,0 +1,71 @@
1name: "Red Color Door"
2panel_display_name: "Southwest Area"
3panels {
4 name: "Near Obscured Puzzles"
5 path: "Panels/Halls/wb_1"
6 clue: ""
7 answer: "sidewalk"
8 symbols: LINGO
9}
10panels {
11 name: "Back (1)"
12 path: "Panels/Halls/wb_2"
13 clue: ""
14 answer: "walk"
15}
16panels {
17 name: "Back (2)"
18 path: "Panels/Halls/wb_3"
19 clue: ""
20 answer: "side"
21}
22panels {
23 name: "WALK BACK"
24 path: "Panels/Halls/wb_4"
25 clue: "walk back"
26 answer: "retreat"
27 symbols: SUN
28}
29panels {
30 name: "BACKSIDE"
31 path: "Panels/Halls/wb_5"
32 clue: "backside"
33 answer: "behind"
34 symbols: SUN
35}
36panels {
37 name: "OAK"
38 path: "Panels/Halls/tree_1"
39 clue: "oak"
40 answer: "acorn"
41 symbols: AGE
42}
43panels {
44 name: "PINE"
45 path: "Panels/Halls/tree_2"
46 clue: "pine"
47 answer: "pinecone"
48 symbols: AGE
49}
50panels {
51 name: "FIR"
52 path: "Panels/Halls/tree_3"
53 clue: "fir"
54 answer: "fur"
55 symbols: ZERO
56}
57panels {
58 name: "ASH"
59 path: "Panels/Halls/tree_4"
60 clue: "ash"
61 answer: "soot"
62 symbols: SUN
63}
64panels {
65 name: "Colors"
66 path: "Panels/Color Reading/cr_2"
67 clue: ""
68 answer: "bank"
69 symbols: LINGO
70 display_name: "Colors (Black)"
71}
diff --git a/data/maps/daedalus/rooms/Red Room.txtpb b/data/maps/daedalus/rooms/Red Room.txtpb new file mode 100644 index 0000000..d73f591 --- /dev/null +++ b/data/maps/daedalus/rooms/Red Room.txtpb
@@ -0,0 +1,79 @@
1name: "Red Room"
2panel_display_name: "Red Room"
3panels {
4 name: "BLINDING"
5 path: "Panels/Red Room/red_1"
6 clue: "blinding"
7 answer: "sunny"
8 symbols: PYRAMID
9}
10panels {
11 name: "MONTH"
12 path: "Panels/Red Room/red_2"
13 clue: "month"
14 answer: "april"
15 symbols: EXAMPLE
16}
17panels {
18 name: "CHAIN"
19 path: "Panels/Red Room/red_3"
20 clue: "chain"
21 answer: "link"
22 symbols: BOXES
23}
24panels {
25 name: "FLOWER"
26 path: "Panels/Red Room/red_4"
27 clue: "flower"
28 answer: "daisy"
29 symbols: EXAMPLE
30}
31panels {
32 name: "OVERCHARGE"
33 path: "Panels/Red Room/red_5"
34 clue: "overcharge"
35 answer: "rob"
36 symbols: SUN
37}
38panels {
39 name: "LOSER"
40 path: "Panels/Red Room/red_6"
41 clue: "loser"
42 answer: "victor"
43 symbols: SUN
44}
45panels {
46 name: "PAD"
47 path: "Panels/Red Room/red_7"
48 clue: "pad"
49 answer: "lily"
50 symbols: EXAMPLE
51}
52panels {
53 name: "RISE"
54 path: "Panels/Red Room/red_8"
55 clue: "rise"
56 answer: "rose"
57 symbols: AGE
58}
59panels {
60 name: "ELEGANCE"
61 path: "Panels/Red Room/red_9"
62 clue: "elegance"
63 answer: "grace"
64 symbols: SUN
65}
66panels {
67 name: "TESTAMENT"
68 path: "Panels/Red Room/red_10"
69 clue: "testament"
70 answer: "will"
71 symbols: SUN
72}
73panels {
74 name: "TAKEOUT"
75 path: "Panels/Red Room/red_11"
76 clue: "takeout"
77 answer: "robin"
78 symbols: SUN
79}
diff --git a/data/maps/daedalus/rooms/Red Smiley.txtpb b/data/maps/daedalus/rooms/Red Smiley.txtpb new file mode 100644 index 0000000..28f2a03 --- /dev/null +++ b/data/maps/daedalus/rooms/Red Smiley.txtpb
@@ -0,0 +1,9 @@
1name: "Red Smiley"
2panel_display_name: "Northwest Area"
3panels {
4 name: "SMILE"
5 path: "Panels/Smiley Rooms/red"
6 clue: "smile"
7 answer: "red"
8 symbols: QUESTION
9}
diff --git a/data/maps/daedalus/rooms/Roof.txtpb b/data/maps/daedalus/rooms/Roof.txtpb new file mode 100644 index 0000000..3aba765 --- /dev/null +++ b/data/maps/daedalus/rooms/Roof.txtpb
@@ -0,0 +1,9 @@
1name: "Roof"
2panel_display_name: "Roof"
3panels {
4 name: "?"
5 path: "Panels/Castle Entrance/moat"
6 clue: ""
7 answer: "moat"
8 symbols: QUESTION
9}
diff --git a/data/maps/daedalus/rooms/Salt Room.txtpb b/data/maps/daedalus/rooms/Salt Room.txtpb new file mode 100644 index 0000000..39c9c9f --- /dev/null +++ b/data/maps/daedalus/rooms/Salt Room.txtpb
@@ -0,0 +1,10 @@
1name: "Salt Room"
2panel_display_name: "Southwest Area"
3panels {
4 name: "SEASONING"
5 path: "Panels/Color Reading/cr_3"
6 clue: "seasoning"
7 answer: "salt"
8 symbols: EXAMPLE
9 display_name: "SEASONING (White)"
10}
diff --git a/data/maps/daedalus/rooms/Seasoning Room.txtpb b/data/maps/daedalus/rooms/Seasoning Room.txtpb new file mode 100644 index 0000000..6159134 --- /dev/null +++ b/data/maps/daedalus/rooms/Seasoning Room.txtpb
@@ -0,0 +1,9 @@
1name: "Seasoning Room"
2panel_display_name: "Southwest Area"
3panels {
4 name: "PARITY"
5 path: "Panels/Color Reading/cr_5"
6 clue: "parity"
7 answer: "balance"
8 symbols: SUN
9}
diff --git a/data/maps/daedalus/rooms/Snake Room.txtpb b/data/maps/daedalus/rooms/Snake Room.txtpb new file mode 100644 index 0000000..fb947ab --- /dev/null +++ b/data/maps/daedalus/rooms/Snake Room.txtpb
@@ -0,0 +1,44 @@
1name: "Snake Room"
2panel_display_name: "West Area"
3panels {
4 name: "HISS"
5 path: "Panels/Snake Room/snake_1"
6 clue: "hiss"
7 answer: "aekns"
8 symbols: SOUND
9 proxies { answer: "snake" path: "Panels/Snake Room/snake_2" }
10 proxies { answer: "cat" path: "Panels/Snake Room/snake_3" }
11}
12panels {
13 name: "SQUEAK"
14 path: "Panels/Snake Room/snake_4"
15 clue: "squeak"
16 answer: "emosu"
17 symbols: SOUND
18 proxies { answer: "mouse" path: "Panels/Snake Room/snake_5" }
19 proxies { answer: "bat" path: "Panels/Snake Room/snake_6" }
20 required_door { name: "Snake Room First Door" }
21}
22panels {
23 name: "BUZZ"
24 path: "Panels/Snake Room/snake_7"
25 clue: "buzz"
26 answer: "bee"
27 symbols: SOUND
28 proxies { answer: "fly" path: "Panels/Snake Room/snake_8" }
29 required_door { name: "Snake Room Second Door" }
30}
31panels {
32 name: "BARK"
33 path: "Panels/Snake Room/snake_9"
34 clue: "bark"
35 answer: "dog"
36 symbols: SOUND
37 proxies { answer: "seal" path: "Panels/Snake Room/snake_10" }
38 required_door { name: "Snake Room Third Door" }
39}
40paintings {
41 name: "SNAKE2"
42 path: "Components/Paintings/Group3/snake2"
43}
44# The other paintings in here are not usable because they are behind panels.
diff --git a/data/maps/daedalus/rooms/South Castle Area.txtpb b/data/maps/daedalus/rooms/South Castle Area.txtpb new file mode 100644 index 0000000..4bb73f3 --- /dev/null +++ b/data/maps/daedalus/rooms/South Castle Area.txtpb
@@ -0,0 +1,111 @@
1name: "South Castle Area"
2panel_display_name: "Outside Pumpkin"
3# There is a teal wall in the middle of this room.
4panels {
5 name: "AN"
6 path: "Panels/Castle Entrance/castle_south_helper"
7 clue: "an"
8 answer: "the"
9 symbols: EXAMPLE
10}
11panels {
12 name: "OFFER"
13 path: "Panels/Castle Entrance/castle_south_helper2"
14 clue: "offer"
15 answer: "bid"
16 symbols: SUN
17}
18panels {
19 name: "VILLAGE"
20 path: "Panels/Castle Entrance/castle_south_helper3"
21 clue: "village"
22 answer: "city"
23 symbols: AGE
24}
25panels {
26 name: "BEFORE"
27 path: "Panels/Castle Entrance/castle_south_helper4"
28 clue: "before"
29 answer: "for"
30 symbols: SPARKLES
31 symbols: ZERO
32}
33panels {
34 name: "LAIR"
35 path: "Panels/Castle Entrance/castle_south_helper5"
36 clue: "lair"
37 answer: "den"
38 symbols: SUN
39}
40panels {
41 name: "AN OFFER VILLAGE BEFORE LAIR"
42 path: "Panels/Castle Entrance/castle_south"
43 clue: ""
44 answer: "castle"
45 symbols: EXAMPLE
46 symbols: LINGO
47 required_door { name: "Castle South Hider" }
48}
49panels {
50 name: "COLOR (1)"
51 path: "Panels/Another Path/color_1"
52 clue: "color"
53 answer: "ppleru"
54 symbols: EXAMPLE
55 proxies { answer: "red" path: "Panels/Another Path Proxies/proxy_1_1" }
56 proxies { answer: "blue" path: "Panels/Another Path Proxies/proxy_1_2" }
57 proxies { answer: "green" path: "Panels/Another Path Proxies/proxy_1_3" }
58 proxies { answer: "yellow" path: "Panels/Another Path Proxies/proxy_1_4" }
59 proxies { answer: "purple" path: "Panels/Another Path Proxies/proxy_1_5" }
60 proxies { answer: "orange" path: "Panels/Another Path Proxies/proxy_1_6" }
61 proxies { answer: "brown" path: "Panels/Another Path Proxies/proxy_1_7" }
62}
63panels {
64 name: "COLOR (2)"
65 path: "Panels/Another Path/color_2"
66 clue: "color"
67 answer: "ppleru"
68 symbols: EXAMPLE
69 proxies { answer: "red" path: "Panels/Another Path Proxies/proxy_1_8" }
70 proxies { answer: "blue" path: "Panels/Another Path Proxies/proxy_1_9" }
71 proxies { answer: "green" path: "Panels/Another Path Proxies/proxy_1_10" }
72 proxies { answer: "yellow" path: "Panels/Another Path Proxies/proxy_1_11" }
73 proxies { answer: "purple" path: "Panels/Another Path Proxies/proxy_1_12" }
74 proxies { answer: "orange" path: "Panels/Another Path Proxies/proxy_1_13" }
75 proxies { answer: "brown" path: "Panels/Another Path Proxies/proxy_1_14" }
76}
77panels {
78 name: "COLOR (3)"
79 path: "Panels/Another Path/color_3"
80 clue: "color"
81 answer: "ppleru"
82 symbols: EXAMPLE
83 proxies { answer: "red" path: "Panels/Another Path Proxies/proxy_1_15" }
84 proxies { answer: "blue" path: "Panels/Another Path Proxies/proxy_1_16" }
85 proxies { answer: "green" path: "Panels/Another Path Proxies/proxy_1_17" }
86 proxies { answer: "yellow" path: "Panels/Another Path Proxies/proxy_1_18" }
87 proxies { answer: "purple" path: "Panels/Another Path Proxies/proxy_1_19" }
88 proxies { answer: "orange" path: "Panels/Another Path Proxies/proxy_1_20" }
89 proxies { answer: "brown" path: "Panels/Another Path Proxies/proxy_1_21" }
90}
91panels {
92 name: "COLOR (4)"
93 path: "Panels/Another Path/color_4"
94 clue: "color"
95 answer: "ppleru"
96 symbols: EXAMPLE
97 proxies { answer: "red" path: "Panels/Another Path Proxies/proxy_1_22" }
98 proxies { answer: "blue" path: "Panels/Another Path Proxies/proxy_1_23" }
99 proxies { answer: "green" path: "Panels/Another Path Proxies/proxy_1_24" }
100 proxies { answer: "yellow" path: "Panels/Another Path Proxies/proxy_1_25" }
101 proxies { answer: "purple" path: "Panels/Another Path Proxies/proxy_1_26" }
102 proxies { answer: "orange" path: "Panels/Another Path Proxies/proxy_1_27" }
103 proxies { answer: "brown" path: "Panels/Another Path Proxies/proxy_1_28" }
104}
105paintings {
106 name: "TRIANGLE"
107 path: "Components/Paintings/Group2/triangle"
108 move: true
109 enter_only: true
110 required_door { name: "Tenacious Color Painting" }
111}
diff --git a/data/maps/daedalus/rooms/Starting Room.txtpb b/data/maps/daedalus/rooms/Starting Room.txtpb new file mode 100644 index 0000000..1b07eb4 --- /dev/null +++ b/data/maps/daedalus/rooms/Starting Room.txtpb
@@ -0,0 +1,16 @@
1name: "Starting Room"
2panel_display_name: "Central"
3panels {
4 name: "ENTRANCE"
5 path: "Panels/Entry/entry_1"
6 clue: "entrance"
7 answer: "entry"
8 symbols: SUN
9}
10ports {
11 name: "GREAT"
12 display_name: "Starting Room South Wall Middle Worldport"
13 path: "Components/Warps/Worldports/worldport"
14 destination { x: 0 y: 0 z: 11 }
15 rotation: 0
16}
diff --git a/data/maps/daedalus/rooms/Sweet Foyer.txtpb b/data/maps/daedalus/rooms/Sweet Foyer.txtpb new file mode 100644 index 0000000..d1167eb --- /dev/null +++ b/data/maps/daedalus/rooms/Sweet Foyer.txtpb
@@ -0,0 +1,65 @@
1name: "Sweet Foyer"
2panel_display_name: "South Area"
3panels {
4 name: "QUALITY"
5 path: "Panels/Sweet Foyer/panel_1"
6 clue: "quality"
7 answer: "equality"
8 symbols: SPARKLES
9}
10panels {
11 name: "EQUAL"
12 path: "Panels/Sweet Foyer/panel_2"
13 clue: "equal"
14 answer: "equality"
15 symbols: SPARKLES
16}
17panels {
18 name: "RENT (1)"
19 path: "Panels/Sweet Foyer/panel_5"
20 clue: "rent"
21 answer: "entry"
22 symbols: SPARKLES
23}
24panels {
25 name: "RENT (4)"
26 path: "Panels/Sweet Foyer/panel_6"
27 clue: "rent"
28 answer: "entries"
29 symbols: SPARKLES
30 symbols: PLANET
31}
32panels {
33 name: "RENT (2)"
34 path: "Panels/Sweet Foyer/panel_7"
35 clue: "rent"
36 answer: "sentry"
37 symbols: SPARKLES
38}
39panels {
40 name: "RENT (3)"
41 path: "Panels/Sweet Foyer/panel_8"
42 clue: "rent"
43 answer: "sentries"
44 symbols: SPARKLES
45 symbols: PLANET
46}
47paintings {
48 name: "4"
49 # This one is a picture of a 3. Huh.
50 path: "Components/Paintings/Group3/4"
51}
52ports {
53 name: "SWEET1"
54 display_name: "Sweet East Entrance"
55 path: "Components/Warps/Worldports/worldport14"
56 destination { x: -27 y: 0 z: 76.5 }
57 rotation: 270
58}
59ports {
60 name: "SWEET2"
61 display_name: "Sweet West Entrance"
62 path: "Components/Warps/Worldports/worldport15"
63 destination { x: -36 y: 0 z: 76.5 }
64 rotation: 90
65}
diff --git a/data/maps/daedalus/rooms/Tree Entrance.txtpb b/data/maps/daedalus/rooms/Tree Entrance.txtpb new file mode 100644 index 0000000..1453790 --- /dev/null +++ b/data/maps/daedalus/rooms/Tree Entrance.txtpb
@@ -0,0 +1,55 @@
1name: "Tree Entrance"
2panel_display_name: "Outside Pumpkin"
3panels {
4 name: "RAT"
5 path: "Panels/Hexes/lime_1"
6 clue: "rat"
7 answer: "rated"
8 symbols: SPARKLES
9}
10panels {
11 name: "DIFFERENCE"
12 path: "Panels/Hexes/lime_2"
13 clue: "difference"
14 answer: "some"
15 symbols: SUN
16 symbols: ZERO
17}
18panels {
19 name: "LEANS"
20 path: "Panels/Hexes/lime_3"
21 clue: "leans"
22 answer: "aliens"
23 symbols: SPARKLES
24 symbols: ZERO
25}
26panels {
27 name: "QUESTION"
28 path: "Panels/Hexes/lime_4"
29 clue: "question"
30 answer: "what"
31 symbols: EXAMPLE
32}
33panels {
34 name: "WHERE"
35 path: "Panels/Hexes/lime_5"
36 clue: "where"
37 answer: "are"
38 symbols: SPARKLES
39 symbols: AGE
40}
41panels {
42 name: "SUNDER"
43 path: "Panels/Hexes/lime_6"
44 clue: "sunder"
45 answer: "over"
46 symbols: SUN
47 symbols: SPARKLES
48}
49ports {
50 name: "TREE"
51 display_name: "Near Pumpkin Brown Hallway"
52 path: "Components/Warps/Worldports/worldport12"
53 destination { x: 41 y: 0 z: 50.5 }
54 rotation: 0
55}
diff --git a/data/maps/daedalus/rooms/U2 Prize.txtpb b/data/maps/daedalus/rooms/U2 Prize.txtpb new file mode 100644 index 0000000..571b0c8 --- /dev/null +++ b/data/maps/daedalus/rooms/U2 Prize.txtpb
@@ -0,0 +1,7 @@
1name: "U2 Prize"
2panel_display_name: "U2 Room"
3letters {
4 key: "u"
5 level2: true
6 path: "Components/Collectables/collectable3"
7}
diff --git a/data/maps/daedalus/rooms/U2 Room.txtpb b/data/maps/daedalus/rooms/U2 Room.txtpb new file mode 100644 index 0000000..1e5879a --- /dev/null +++ b/data/maps/daedalus/rooms/U2 Room.txtpb
@@ -0,0 +1,114 @@
1name: "U2 Room"
2panel_display_name: "U2 Room"
3panels {
4 name: "DREAMSCAPE"
5 path: "Panels/The Big U/o_1"
6 clue: "dreamscape"
7 answer: "utopia"
8 symbols: SUN
9}
10panels {
11 name: "WICKED"
12 path: "Panels/The Big U/o_4"
13 clue: "wicked"
14 answer: "unholy"
15 symbols: SUN
16}
17panels {
18 name: "PARADISE"
19 path: "Panels/The Big U/o_5"
20 clue: "paradise"
21 answer: "utopia"
22 symbols: SUN
23}
24panels {
25 name: "DISCORD"
26 path: "Panels/The Big U/o_8"
27 clue: "discord"
28 answer: "unrest"
29 symbols: SUN
30}
31panels {
32 name: "EVIL"
33 path: "Panels/The Big U/o_9"
34 clue: "evil"
35 answer: "unholy"
36 symbols: SUN
37}
38panels {
39 name: "DISORDER"
40 path: "Panels/The Big U/o_12"
41 clue: "disorder"
42 answer: "unrest"
43 symbols: SUN
44}
45panels {
46 name: "CHAOS"
47 path: "Panels/The Big U/o_13"
48 clue: "chaos"
49 answer: "unrest"
50 symbols: SUN
51}
52panels {
53 name: "TROUBLE"
54 path: "Panels/The Big U/o_14"
55 clue: "trouble"
56 answer: "unrest"
57 symbols: SUN
58}
59panels {
60 name: "IRREVERENT"
61 path: "Panels/The Big U/o_15"
62 clue: "irreverent"
63 answer: "unholy"
64 symbols: SUN
65}
66panels {
67 name: "HEAVEN"
68 path: "Panels/The Big U/o_16"
69 clue: "heaven"
70 answer: "utopia"
71 symbols: SUN
72}
73panels {
74 name: "EFFECTIVE"
75 path: "Panels/The Big U Not/o_2"
76 clue: "effective"
77 answer: "useful"
78 symbols: SUN
79}
80panels {
81 name: "HELPFUL"
82 path: "Panels/The Big U Not/o_3"
83 clue: "helpful"
84 answer: "useful"
85 symbols: SUN
86}
87panels {
88 name: "PRACTICAL"
89 path: "Panels/The Big U Not/o_6"
90 clue: "practical"
91 answer: "useful"
92 symbols: SUN
93}
94panels {
95 name: "PRODUCTIVE"
96 path: "Panels/The Big U Not/o_7"
97 clue: "productive"
98 answer: "useful"
99 symbols: SUN
100}
101panels {
102 name: "INFERNAL"
103 path: "Panels/The Big U Not/o_10"
104 clue: "infernal"
105 answer: "unholy"
106 symbols: SUN
107}
108panels {
109 name: "WONDERLAND"
110 path: "Panels/The Big U Not/o_11"
111 clue: "wonderland"
112 answer: "utopia"
113 symbols: SUN
114}
diff --git a/data/maps/daedalus/rooms/Unkempt Entrance.txtpb b/data/maps/daedalus/rooms/Unkempt Entrance.txtpb new file mode 100644 index 0000000..0a39ee0 --- /dev/null +++ b/data/maps/daedalus/rooms/Unkempt Entrance.txtpb
@@ -0,0 +1,9 @@
1name: "Unkempt Entrance"
2panel_display_name: "O2 Room"
3ports {
4 name: "UNKEMPT"
5 display_name: "O2 Room Worldport"
6 path: "Components/Warps/Worldports/worldport6"
7 destination { x: -61 y: 0 z: 95 }
8 rotation: 270
9}
diff --git a/data/maps/daedalus/rooms/Welcome Back Area.txtpb b/data/maps/daedalus/rooms/Welcome Back Area.txtpb new file mode 100644 index 0000000..701baca --- /dev/null +++ b/data/maps/daedalus/rooms/Welcome Back Area.txtpb
@@ -0,0 +1,16 @@
1name: "Welcome Back Area"
2panel_display_name: "Central"
3panels {
4 name: "FAREWELL LITTLE LAMB"
5 path: "Panels/Entry/wb_2"
6 clue: "farewell little lamb"
7 answer: "bye"
8 symbols: QUESTION
9}
10panels {
11 name: "GREETINGS OLD FRIEND"
12 path: "Panels/Entry/wb_3"
13 clue: "greetings old friend"
14 answer: "hi"
15 symbols: QUESTION
16}
diff --git a/data/maps/daedalus/rooms/Welcome Back Exit.txtpb b/data/maps/daedalus/rooms/Welcome Back Exit.txtpb new file mode 100644 index 0000000..ac221c7 --- /dev/null +++ b/data/maps/daedalus/rooms/Welcome Back Exit.txtpb
@@ -0,0 +1,11 @@
1name: "Welcome Back Exit"
2panel_display_name: "Central"
3panels {
4 name: "WELCOME"
5 path: "Panels/Entry/wb_1"
6 clue: "welcome"
7 answer: "welcome"
8 symbols: QUESTION
9 proxies { answer: "back" path: "Panels/Entry/wb_proxy" }
10 display_name: "WELCOME (White)"
11}
diff --git a/data/maps/daedalus/rooms/West Castle Area.txtpb b/data/maps/daedalus/rooms/West Castle Area.txtpb new file mode 100644 index 0000000..010e5d6 --- /dev/null +++ b/data/maps/daedalus/rooms/West Castle Area.txtpb
@@ -0,0 +1,235 @@
1name: "West Castle Area"
2panel_display_name: "West Area"
3panels {
4 name: "SONG (1)"
5 path: "Panels/Castle Entrance/castle_west_helper"
6 clue: "song"
7 answer: "verse"
8 symbols: BOXES
9}
10panels {
11 name: "FACE"
12 path: "Panels/Castle Entrance/castle_west_helper_2"
13 clue: "face"
14 answer: "eye"
15 symbols: BOXES
16}
17panels {
18 name: "SONG FACE"
19 path: "Panels/Castle Entrance/castle_west"
20 clue: ""
21 answer: "castle"
22 symbols: ZERO
23 symbols: EXAMPLE
24 symbols: LINGO
25 required_door { name: "Castle West Hider" }
26}
27panels {
28 name: "SKELETON"
29 path: "Panels/Sticks/stick_5"
30 clue: "skeleton"
31 answer: "bone"
32 symbols: BOXES
33}
34panels {
35 name: "LETTERS"
36 path: "Panels/Sticks/stick_6"
37 clue: "letters"
38 answer: "words"
39 symbols: BOXES
40 required_door { name: "West Sticks And Stones Door" }
41}
42panels {
43 name: "SONG (2)"
44 path: "Panels/Amber/amber_south_2"
45 clue: "song"
46 answer: "verse"
47 symbols: BOXES
48}
49panels {
50 name: "RHYTHM"
51 path: "Panels/Amber/amber_1"
52 clue: "rhythm"
53 answer: "music"
54 symbols: BOXES
55}
56panels {
57 name: "MELODY"
58 path: "Panels/Amber/amber_2"
59 clue: "melody"
60 answer: "music"
61 symbols: BOXES
62}
63panels {
64 name: "TEXTURE"
65 path: "Panels/Amber/amber_3"
66 clue: "texture"
67 answer: "music"
68 symbols: BOXES
69}
70panels {
71 name: "HARMONY"
72 path: "Panels/Amber/amber_4"
73 clue: "harmony"
74 answer: "music"
75 symbols: BOXES
76}
77panels {
78 name: "FALSIFY"
79 path: "Panels/Pairs Room/pairs_3"
80 clue: "falsify"
81 answer: "eye"
82 symbols: ZERO
83}
84panels {
85 name: "ALL"
86 path: "Panels/Pairs Room/pairs_4"
87 clue: "all"
88 answer: "balls"
89 symbols: SPARKLES
90 symbols: PLANET
91}
92panels {
93 name: "EVER"
94 path: "Panels/Splintering Room/exit_1"
95 clue: "ever"
96 answer: "exit"
97 symbols: QUESTION
98}
99panels {
100 name: "AXES"
101 path: "Panels/Splintering Room/exit_2"
102 clue: "axes"
103 answer: "exit"
104 symbols: QUESTION
105}
106panels {
107 name: "FLIP (1)"
108 path: "Panels/Splintering Room/exit_3"
109 clue: "flip"
110 answer: "exit"
111 symbols: QUESTION
112}
113panels {
114 name: "SLOT"
115 path: "Panels/Splintering Room/exit_4"
116 clue: "slot"
117 answer: "exit"
118 symbols: QUESTION
119}
120panels {
121 name: "WICKEDLY"
122 path: "Panels/Splintering Room/panel_1"
123 clue: "wickedly"
124 answer: "withered"
125 symbols: QUESTION
126}
127panels {
128 name: "CATHOLIC"
129 path: "Panels/Splintering Room/panel_2"
130 clue: "catholic"
131 answer: "withered"
132 symbols: QUESTION
133}
134panels {
135 name: "SISTERLY"
136 path: "Panels/Splintering Room/panel_3"
137 clue: "sisterly"
138 answer: "withered"
139 symbols: QUESTION
140}
141panels {
142 name: "SQUEALED"
143 path: "Panels/Splintering Room/panel_4"
144 clue: "squealed"
145 answer: "withered"
146 symbols: QUESTION
147}
148panels {
149 name: "READ"
150 path: "Panels/Splintering Room/panel_5"
151 clue: "read"
152 answer: "rock"
153 symbols: QUESTION
154}
155panels {
156 name: "WORD"
157 path: "Panels/Splintering Room/panel_6"
158 clue: "word"
159 answer: "rock"
160 symbols: QUESTION
161}
162panels {
163 name: "EACH"
164 path: "Panels/Splintering Room/panel_7"
165 clue: "each"
166 answer: "rock"
167 symbols: QUESTION
168}
169panels {
170 name: "RANK"
171 path: "Panels/Splintering Room/panel_8"
172 clue: "rank"
173 answer: "rock"
174 symbols: QUESTION
175}
176panels {
177 name: "TEAR"
178 path: "Panels/Splintering Room/panel_9"
179 clue: "tear"
180 answer: "thin"
181 symbols: QUESTION
182}
183panels {
184 name: "SHUT"
185 path: "Panels/Splintering Room/panel_10"
186 clue: "shut"
187 answer: "thin"
188 symbols: QUESTION
189}
190panels {
191 name: "FLIP (2)"
192 path: "Panels/Splintering Room/panel_11"
193 clue: "flip"
194 answer: "thin"
195 symbols: QUESTION
196}
197panels {
198 name: "STUN"
199 path: "Panels/Splintering Room/panel_12"
200 clue: "stun"
201 answer: "thin"
202 symbols: QUESTION
203}
204panels {
205 name: "CHAT"
206 path: "Panels/Splintering Room/panel_13"
207 clue: "chat"
208 answer: "code"
209 symbols: QUESTION
210}
211panels {
212 name: "LOST"
213 path: "Panels/Splintering Room/panel_14"
214 clue: "lost"
215 answer: "code"
216 symbols: QUESTION
217}
218panels {
219 name: "PODS"
220 path: "Panels/Splintering Room/panel_15"
221 clue: "pods"
222 answer: "code"
223 symbols: QUESTION
224}
225panels {
226 name: "FAME"
227 path: "Panels/Splintering Room/panel_16"
228 clue: "fame"
229 answer: "code"
230 symbols: QUESTION
231}
232paintings {
233 name: "WON2"
234 path: "Components/Paintings/Group3/won2"
235}
diff --git a/data/maps/daedalus/rooms/West Spire.txtpb b/data/maps/daedalus/rooms/West Spire.txtpb new file mode 100644 index 0000000..7cc579f --- /dev/null +++ b/data/maps/daedalus/rooms/West Spire.txtpb
@@ -0,0 +1,44 @@
1name: "West Spire"
2panel_display_name: "West Area"
3panels {
4 name: "MISSING"
5 path: "Panels/Entry/wb_5"
6 clue: "missing"
7 answer: "lost"
8 symbols: SUN
9}
10panels {
11 name: "BYE"
12 path: "Panels/Entry/wb_4"
13 clue: "bye"
14 answer: "lamb"
15 symbols: QUESTION
16}
17panels {
18 name: "CUT"
19 path: "Panels/Pairs Room/pairs_1"
20 clue: "cut"
21 answer: "chop"
22 symbols: SUN
23}
24panels {
25 name: "STONES"
26 path: "Panels/Pairs Room/pairs_2"
27 clue: "stones"
28 answer: "sticks"
29 symbols: QUESTION
30}
31panels {
32 name: "CONCEALED"
33 path: "Panels/Entry/entry_4"
34 clue: "concealed"
35 answer: "hidden"
36 symbols: SUN
37}
38panels {
39 name: "CAW"
40 path: "Panels/Gold/gold_2"
41 clue: "caw"
42 answer: "rooster"
43 symbols: SOUND
44}
diff --git a/data/maps/daedalus/rooms/White Hallway From Entry.txtpb b/data/maps/daedalus/rooms/White Hallway From Entry.txtpb new file mode 100644 index 0000000..d3659d3 --- /dev/null +++ b/data/maps/daedalus/rooms/White Hallway From Entry.txtpb
@@ -0,0 +1,9 @@
1name: "White Hallway From Entry"
2panel_display_name: "Southwest Area"
3ports {
4 name: "ENTRY"
5 display_name: "Near Globe White Hallway"
6 path: "Components/Warps/Worldports/worldport10"
7 destination { x: -46 y: 0 z: 23 }
8 rotation: 90
9}
diff --git a/data/maps/daedalus/rooms/Wisdom Panel.txtpb b/data/maps/daedalus/rooms/Wisdom Panel.txtpb new file mode 100644 index 0000000..d789f2b --- /dev/null +++ b/data/maps/daedalus/rooms/Wisdom Panel.txtpb
@@ -0,0 +1,9 @@
1name: "Wisdom Panel"
2panel_display_name: "Castle"
3panels {
4 name: "INTELLIGENCE"
5 path: "Components/Warps/numbers"
6 clue: "intelligence"
7 answer: "wisdom"
8 symbols: AGE
9}
diff --git a/data/maps/daedalus/rooms/Wonderland.txtpb b/data/maps/daedalus/rooms/Wonderland.txtpb new file mode 100644 index 0000000..b4782d2 --- /dev/null +++ b/data/maps/daedalus/rooms/Wonderland.txtpb
@@ -0,0 +1,44 @@
1name: "Wonderland"
2panel_display_name: "Northwest Area"
3panels {
4 name: "APRIL"
5 path: "Panels/Wonderland/wonderland_1"
6 clue: "april"
7 answer: "march"
8 symbols: EXAMPLE
9}
10panels {
11 name: "UNDER"
12 path: "Panels/Wonderland/wonderland_2"
13 clue: "under"
14 answer: "wonder"
15 symbols: ZERO
16}
17panels {
18 name: "ANGRY"
19 path: "Panels/Wonderland/wonderland_3"
20 clue: "angry"
21 answer: "mad"
22 symbols: SUN
23}
24panels {
25 name: "ARTS"
26 path: "Panels/Wonderland/wonderland_4"
27 clue: "arts"
28 answer: "hearts"
29 symbols: SPARKLES
30}
31panels {
32 name: "SONG"
33 path: "Panels/Wonderland/wonderland_5"
34 clue: "song"
35 answer: "carol"
36 symbols: EXAMPLE
37}
38ports {
39 name: "WONDROUS"
40 display_name: "Wonderland Worldport"
41 path: "Components/Warps/Worldports/worldport3"
42 destination { x: -104 y: 0 z: -69 }
43 rotation: 180
44}
diff --git a/data/maps/daedalus/rooms/Yellow Color Backside.txtpb b/data/maps/daedalus/rooms/Yellow Color Backside.txtpb new file mode 100644 index 0000000..1c29b43 --- /dev/null +++ b/data/maps/daedalus/rooms/Yellow Color Backside.txtpb
@@ -0,0 +1,30 @@
1name: "Yellow Color Backside"
2panel_display_name: "Northeast Area"
3panels {
4 name: "WINDS"
5 path: "Panels/Halls/halls_24"
6 clue: "winds"
7 answer: "orchestra"
8 symbols: BOXES
9}
10panels {
11 name: "STRINGS"
12 path: "Panels/Halls/halls_25"
13 clue: "strings"
14 answer: "orchestra"
15 symbols: BOXES
16}
17panels {
18 name: "BRASS"
19 path: "Panels/Halls/halls_26"
20 clue: "brass"
21 answer: "orchestra"
22 symbols: BOXES
23}
24panels {
25 name: "REDACTED"
26 path: "Panels/Halls/halls_27"
27 clue: "[redacted]"
28 answer: "orchestra"
29 symbols: BOXES
30}
diff --git a/data/maps/daedalus/rooms/Yellow Color Door.txtpb b/data/maps/daedalus/rooms/Yellow Color Door.txtpb new file mode 100644 index 0000000..61d206b --- /dev/null +++ b/data/maps/daedalus/rooms/Yellow Color Door.txtpb
@@ -0,0 +1,37 @@
1name: "Yellow Color Door"
2panel_display_name: "Northeast Area"
3panels {
4 name: "SUN"
5 path: "Panels/Yellow Room/panel_entry"
6 clue: "sun"
7 answer: "star" # me!
8 symbols: EXAMPLE
9}
10panels {
11 name: "SPIN"
12 path: "Panels/Dark Blue/blue_1"
13 clue: "spin"
14 answer: "turn"
15 symbols: PYRAMID
16}
17panels {
18 name: "Paintings"
19 path: "Panels/Entry/db_1"
20 clue: ""
21 answer: "coin"
22 symbols: LINGO
23}
24paintings {
25 name: "EYEREDSTART"
26 path: "Components/Paintings/Temple of the Eyes/eyeRedStart"
27 move: true
28 enter_only: true
29 required_door { name: "Eye Painting" }
30}
31ports {
32 name: "FOURROOMS"
33 display_name: "Near Yellow Worldport"
34 path: "Components/Warps/Worldports/worldport8"
35 destination { x: 92.5 y: 0 z: -62 }
36 rotation: 90
37}
diff --git a/data/maps/daedalus/rooms/Yellow Room.txtpb b/data/maps/daedalus/rooms/Yellow Room.txtpb new file mode 100644 index 0000000..b4d8ff0 --- /dev/null +++ b/data/maps/daedalus/rooms/Yellow Room.txtpb
@@ -0,0 +1,83 @@
1name: "Yellow Room"
2panel_display_name: "Yellow Room"
3panels {
4 name: "FREE"
5 path: "Panels/Yellow Room/panel_1"
6 clue: "free"
7 answer: "trap"
8 symbols: SUN
9}
10panels {
11 name: "TORSOBOUNCE"
12 path: "Panels/Yellow Room/panel_2"
13 clue: "torsobounce"
14 answer: "hiphop"
15 symbols: SUN
16 symbols: BOXES
17}
18panels {
19 name: "TORSO BOUNCE"
20 path: "Panels/Yellow Room/panel_3"
21 clue: "torso bounce"
22 answer: "dance"
23 symbols: SUN
24}
25panels {
26 name: "JAWBREAKER"
27 path: "Panels/Yellow Room/panel_4"
28 clue: "jawbreaker"
29 answer: "rock"
30 symbols: SWEET
31}
32panels {
33 name: "EXPLODE"
34 path: "Panels/Yellow Room/panel_5"
35 clue: "explode"
36 answer: "pop"
37 symbols: SUN
38}
39panels {
40 name: "JAPAN"
41 path: "Panels/Yellow Room/panel_6"
42 clue: "japan"
43 answer: "country"
44 symbols: EXAMPLE
45}
46panels {
47 name: "COLOR"
48 path: "Panels/Yellow Room/panel_7"
49 clue: "color"
50 answer: "blues"
51 symbols: EXAMPLE
52 symbols: PLANET
53}
54panels {
55 name: "PERSON"
56 path: "Panels/Yellow Room/panel_8"
57 clue: "person"
58 answer: "house"
59 symbols: STARS
60}
61panels {
62 name: "PARROT"
63 path: "Panels/Yellow Room/panel_9"
64 clue: "parrot"
65 answer: "rap"
66 symbols: SPARKLES
67 symbols: ANAGRAM
68}
69panels {
70 name: "PROTON"
71 path: "Panels/Yellow Room/panel_10"
72 clue: "proton"
73 answer: "electronic"
74 symbols: SUN
75 symbols: SPARKLES
76}
77panels {
78 name: "SPIRIT"
79 path: "Panels/Yellow Room/panel_11"
80 clue: "spirit"
81 answer: "soul"
82 symbols: SUN
83}
diff --git a/data/maps/daedalus/rooms/Yellow Smiley Annex.txtpb b/data/maps/daedalus/rooms/Yellow Smiley Annex.txtpb new file mode 100644 index 0000000..cb6c402 --- /dev/null +++ b/data/maps/daedalus/rooms/Yellow Smiley Annex.txtpb
@@ -0,0 +1,16 @@
1name: "Yellow Smiley Annex"
2panel_display_name: "Hedges"
3panels {
4 name: "COW"
5 path: "Panels/Miscellaneous/plum1"
6 clue: "cow"
7 answer: "moo"
8 symbols: SOUND
9}
10panels {
11 name: "BELL"
12 path: "Panels/Miscellaneous/plum2"
13 clue: "bell"
14 answer: "ding"
15 symbols: SOUND
16}
diff --git a/data/maps/daedalus/rooms/Z2 Prize.txtpb b/data/maps/daedalus/rooms/Z2 Prize.txtpb new file mode 100644 index 0000000..7b1ceae --- /dev/null +++ b/data/maps/daedalus/rooms/Z2 Prize.txtpb
@@ -0,0 +1,7 @@
1name: "Z2 Prize"
2panel_display_name: "Z2 Room"
3letters {
4 key: "z"
5 level2: true
6 path: "Components/Collectables/collectable2"
7}
diff --git a/data/maps/daedalus/rooms/Z2 Room.txtpb b/data/maps/daedalus/rooms/Z2 Room.txtpb new file mode 100644 index 0000000..513150a --- /dev/null +++ b/data/maps/daedalus/rooms/Z2 Room.txtpb
@@ -0,0 +1,167 @@
1name: "Z2 Room"
2panel_display_name: "Z2 Room"
3panels {
4 name: "EXHIBIT"
5 path: "Panels/V Maze/entry"
6 clue: "exhibit"
7 answer: "zoo"
8 symbols: BOXES
9}
10panels {
11 name: "MICROSCOPE"
12 path: "Panels/Theos Room/theo_1"
13 clue: "microscope"
14 answer: "focus"
15 symbols: BOXES
16}
17panels {
18 name: "KEY"
19 path: "Panels/Theos Room/theo_2"
20 clue: "key"
21 answer: "escape"
22 symbols: EXAMPLE
23}
24panels {
25 name: "HORSE"
26 path: "Panels/Theos Room/theo_3"
27 clue: "horse"
28 answer: "mustang"
29 symbols: EXAMPLE
30}
31panels {
32 name: "CAR"
33 path: "Panels/Theos Room/theo_4"
34 clue: "car"
35 answer: "charger"
36 symbols: SPARKLES
37}
38panels {
39 name: "SOLSTICE"
40 path: "Panels/Theos Room/theo_5"
41 clue: "solstice"
42 answer: "equinox"
43 symbols: SUN
44}
45panels {
46 name: "EQUINE"
47 path: "Panels/Theos Room/theo_6"
48 clue: "equine"
49 answer: "equinox"
50 symbols: SPARKLES
51}
52panels {
53 name: "CHARGE"
54 path: "Panels/Theos Room/theo_7"
55 clue: "charge"
56 answer: "charger"
57 symbols: PYRAMID
58}
59panels {
60 name: "MUST"
61 path: "Panels/Theos Room/theo_8"
62 clue: "must"
63 answer: "mustang"
64 symbols: SPARKLES
65}
66panels {
67 name: "CAPE"
68 path: "Panels/Theos Room/theo_9"
69 clue: "cape"
70 answer: "escape"
71 symbols: SPARKLES
72}
73panels {
74 name: "GLANCE"
75 path: "Panels/Theos Room/theo_10"
76 clue: "glance"
77 answer: "focus"
78 symbols: PYRAMID
79}
80panels {
81 name: "JAR"
82 path: "Panels/Theos Room2/theo_1"
83 clue: "jar"
84 answer: "jaguar"
85 symbols: SPARKLES
86}
87panels {
88 name: "AGREEMENT"
89 path: "Panels/Theos Room2/theo_2"
90 clue: "agreement"
91 answer: "accord"
92 symbols: SUN
93}
94panels {
95 name: "VOYAGE"
96 path: "Panels/Theos Room2/theo_3"
97 clue: "voyage"
98 answer: "odyssey"
99 symbols: SUN
100}
101panels {
102 name: "INSECT"
103 path: "Panels/Theos Room2/theo_4"
104 clue: "insect"
105 answer: "beetle"
106 symbols: EXAMPLE
107}
108panels {
109 name: "EAGLE"
110 path: "Panels/Theos Room2/theo_5"
111 clue: "eagle"
112 answer: "regal"
113 symbols: ZERO
114}
115panels {
116 name: "MAJESTIC"
117 path: "Panels/Theos Room2/theo_6"
118 clue: "majestic"
119 answer: "regal"
120 symbols: SUN
121}
122panels {
123 name: "RINGO"
124 path: "Panels/Theos Room2/theo_7"
125 clue: "ringo"
126 answer: "beetle"
127 symbols: ZERO
128 symbols: BOXES
129 symbols: PLANET
130}
131panels {
132 name: "POLICY"
133 path: "Panels/Theos Room2/theo_8"
134 clue: "policy"
135 answer: "odyssey"
136 symbols: ZERO
137}
138panels {
139 name: "DISCORD"
140 path: "Panels/Theos Room2/theo_9"
141 clue: "discord"
142 answer: "accord"
143 symbols: SUN
144}
145panels {
146 name: "CAT"
147 path: "Panels/Theos Room2/theo_10"
148 clue: "cat"
149 answer: "jaguar"
150 symbols: EXAMPLE
151}
152paintings {
153 name: "IN"
154 path: "Components/Paintings/Group1/in"
155}
156paintings {
157 name: "IN2"
158 path: "Components/Paintings/Group1/in2"
159}
160paintings {
161 name: "IN3"
162 path: "Components/Paintings/Group1/in3"
163}
164paintings {
165 name: "IN4"
166 path: "Components/Paintings/Group1/in4"
167}
diff --git a/data/maps/daedalus/rooms/Zoo Center.txtpb b/data/maps/daedalus/rooms/Zoo Center.txtpb new file mode 100644 index 0000000..5a788db --- /dev/null +++ b/data/maps/daedalus/rooms/Zoo Center.txtpb
@@ -0,0 +1,7 @@
1name: "Zoo Center"
2panel_display_name: "Zoo"
3letters {
4 key: "v"
5 level2: true
6 path: "Components/Collectables/collectable9"
7}
diff --git a/data/maps/daedalus/rooms/Zoo E.txtpb b/data/maps/daedalus/rooms/Zoo E.txtpb new file mode 100644 index 0000000..3195623 --- /dev/null +++ b/data/maps/daedalus/rooms/Zoo E.txtpb
@@ -0,0 +1,30 @@
1name: "Zoo E"
2panel_display_name: "Zoo"
3panels {
4 name: "WING"
5 path: "Panels/V Maze/four_1"
6 clue: "wing"
7 answer: "bat"
8 symbols: BOXES
9}
10panels {
11 name: "WHISKER"
12 path: "Panels/V Maze/four_2"
13 clue: "whisker"
14 answer: "cat"
15 symbols: BOXES
16}
17panels {
18 name: "CLAW"
19 path: "Panels/V Maze/four_3"
20 clue: "claw"
21 answer: "cat"
22 symbols: BOXES
23}
24panels {
25 name: "FUR"
26 path: "Panels/V Maze/four_4"
27 clue: "fur"
28 answer: "bat"
29 symbols: BOXES
30}
diff --git a/data/maps/daedalus/rooms/Zoo N.txtpb b/data/maps/daedalus/rooms/Zoo N.txtpb new file mode 100644 index 0000000..d621ed4 --- /dev/null +++ b/data/maps/daedalus/rooms/Zoo N.txtpb
@@ -0,0 +1,39 @@
1name: "Zoo N"
2panel_display_name: "Zoo"
3panels {
4 name: "BILL"
5 path: "Panels/V Maze/four_13"
6 clue: "bill"
7 answer: "goose"
8 symbols: BOXES
9}
10panels {
11 name: "FIN"
12 path: "Panels/V Maze/four_14"
13 clue: "fin"
14 answer: "whale"
15 symbols: BOXES
16 display_name: "FIN (N)"
17}
18panels {
19 name: "BLOWHOLE"
20 path: "Panels/V Maze/four_15"
21 clue: "blowhole"
22 answer: "whale"
23 symbols: BOXES
24}
25panels {
26 name: "FEATHER"
27 path: "Panels/V Maze/four_16"
28 clue: "feather"
29 answer: "goose"
30 symbols: BOXES
31}
32panels {
33 name: "LEAF"
34 path: "Panels/V Maze/door_1"
35 clue: "leaf"
36 answer: "tree"
37 symbols: BOXES
38 # visible through the tinted door
39}
diff --git a/data/maps/daedalus/rooms/Zoo NE.txtpb b/data/maps/daedalus/rooms/Zoo NE.txtpb new file mode 100644 index 0000000..89bedae --- /dev/null +++ b/data/maps/daedalus/rooms/Zoo NE.txtpb
@@ -0,0 +1,39 @@
1name: "Zoo NE"
2panel_display_name: "Zoo"
3panels {
4 name: "FANG"
5 path: "Panels/V Maze/four_5"
6 clue: "fang"
7 answer: "tiger"
8 symbols: BOXES
9}
10panels {
11 name: "STRIPE (1)"
12 path: "Panels/V Maze/four_6"
13 clue: "stripe"
14 answer: "zebra"
15 symbols: BOXES
16}
17panels {
18 name: "STRIPE (2)"
19 path: "Panels/V Maze/four_7"
20 clue: "stripe"
21 answer: "tiger"
22 symbols: BOXES
23}
24panels {
25 name: "HOOF"
26 path: "Panels/V Maze/four_8"
27 clue: "hoof"
28 answer: "zebra"
29 symbols: BOXES
30}
31panels {
32 name: "Colors"
33 path: "Panels/V Maze/cr_5"
34 clue: ""
35 answer: "deoba"
36 symbols: LINGO
37 proxies { answer: "abode" path: "Panels/V Maze/cr_6" }
38 proxies { answer: "ode" path: "Panels/V Maze/cr_7" }
39}
diff --git a/data/maps/daedalus/rooms/Zoo S.txtpb b/data/maps/daedalus/rooms/Zoo S.txtpb new file mode 100644 index 0000000..3f3a8de --- /dev/null +++ b/data/maps/daedalus/rooms/Zoo S.txtpb
@@ -0,0 +1,31 @@
1name: "Zoo S"
2panel_display_name: "Zoo"
3panels {
4 name: "SHELL"
5 path: "Panels/V Maze/four_9"
6 clue: "shell"
7 answer: "crab"
8 symbols: BOXES
9}
10panels {
11 name: "FIN"
12 path: "Panels/V Maze/four_10"
13 clue: "fin"
14 answer: "fish"
15 symbols: BOXES
16 display_name: "FIN (S)"
17}
18panels {
19 name: "PINCER"
20 path: "Panels/V Maze/four_11"
21 clue: "pincer"
22 answer: "crab"
23 symbols: BOXES
24}
25panels {
26 name: "SCALE"
27 path: "Panels/V Maze/four_12"
28 clue: "scale"
29 answer: "fish"
30 symbols: BOXES
31}
diff --git a/data/maps/daedalus/rooms/Zoo SE.txtpb b/data/maps/daedalus/rooms/Zoo SE.txtpb new file mode 100644 index 0000000..199f234 --- /dev/null +++ b/data/maps/daedalus/rooms/Zoo SE.txtpb
@@ -0,0 +1,2 @@
1name: "Zoo SE"
2panel_display_name: "Zoo"
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/maps/four_rooms/doors.txtpb b/data/maps/four_rooms/doors.txtpb index f0bf060..e58adb2 100644 --- a/data/maps/four_rooms/doors.txtpb +++ b/data/maps/four_rooms/doors.txtpb
@@ -11,6 +11,7 @@ doors {
11 panels { room: "Intensify Room" name: "INJURY" } 11 panels { room: "Intensify Room" name: "INJURY" }
12 panels { room: "Intensify Room" name: "SWAY" } 12 panels { room: "Intensify Room" name: "SWAY" }
13 location_room: "Intensify Room" 13 location_room: "Intensify Room"
14 location_name: "Intensify Room"
14} 15}
15doors { 16doors {
16 name: "Examples Door" 17 name: "Examples Door"
@@ -25,6 +26,7 @@ doors {
25 panels { room: "Examples Room" name: "URN" } 26 panels { room: "Examples Room" name: "URN" }
26 panels { room: "Examples Room" name: "ART" } 27 panels { room: "Examples Room" name: "ART" }
27 location_room: "Examples Room" 28 location_room: "Examples Room"
29 location_name: "Examples Room"
28} 30}
29doors { 31doors {
30 name: "Synonyms Door" 32 name: "Synonyms Door"
@@ -39,6 +41,7 @@ doors {
39 panels { room: "Synonyms Room" name: "SERIOUS" } 41 panels { room: "Synonyms Room" name: "SERIOUS" }
40 panels { room: "Synonyms Room" name: "FURY" } 42 panels { room: "Synonyms Room" name: "FURY" }
41 location_room: "Synonyms Room" 43 location_room: "Synonyms Room"
44 location_name: "Synonyms Room"
42} 45}
43doors { 46doors {
44 name: "Time Door" 47 name: "Time Door"
@@ -53,6 +56,7 @@ doors {
53 panels { room: "Time Room" name: "HOLE" } 56 panels { room: "Time Room" name: "HOLE" }
54 panels { room: "Time Room" name: "RHYTHM" } 57 panels { room: "Time Room" name: "RHYTHM" }
55 location_room: "Time Room" 58 location_room: "Time Room"
59 location_name: "Time Room"
56} 60}
57doors { 61doors {
58 name: "A2 Door" 62 name: "A2 Door"
diff --git a/data/maps/four_rooms/rooms/A2 Room.txtpb b/data/maps/four_rooms/rooms/A2 Room.txtpb index 236ce01..ea2ae64 100644 --- a/data/maps/four_rooms/rooms/A2 Room.txtpb +++ b/data/maps/four_rooms/rooms/A2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "A2 Room" 1name: "A2 Room"
2display_name: "Hallway"
3letters { 2letters {
4 key: "a" 3 key: "a"
5 level2: true 4 level2: true
diff --git a/data/maps/four_rooms/rooms/Examples Room.txtpb b/data/maps/four_rooms/rooms/Examples Room.txtpb index 3d82e22..4146120 100644 --- a/data/maps/four_rooms/rooms/Examples Room.txtpb +++ b/data/maps/four_rooms/rooms/Examples Room.txtpb
@@ -1,5 +1,4 @@
1name: "Examples Room" 1name: "Examples Room"
2display_name: "Examples Room"
3panels { 2panels {
4 name: "SIZE (1)" 3 name: "SIZE (1)"
5 path: "Panels/Room 2 Examples/entry_1" 4 path: "Panels/Room 2 Examples/entry_1"
@@ -58,6 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "DAEDALUS" 59 name: "DAEDALUS"
60 display_name: "Examples Room Worldport"
61 path: "Components/Warps/worldport2" 61 path: "Components/Warps/worldport2"
62 orientation: "north" 62 destination { x: 0 y: 0 z: -40.5 }
63 rotation: 180
63} 64}
diff --git a/data/maps/four_rooms/rooms/Hallway.txtpb b/data/maps/four_rooms/rooms/Hallway.txtpb index f80cf73..124a5b3 100644 --- a/data/maps/four_rooms/rooms/Hallway.txtpb +++ b/data/maps/four_rooms/rooms/Hallway.txtpb
@@ -1,5 +1,4 @@
1name: "Hallway" 1name: "Hallway"
2display_name: "Hallway"
3panels { 2panels {
4 name: "SUSPICION" 3 name: "SUSPICION"
5 path: "Panels/Reward Room/reward_1" 4 path: "Panels/Reward Room/reward_1"
diff --git a/data/maps/four_rooms/rooms/Intensify Room.txtpb b/data/maps/four_rooms/rooms/Intensify Room.txtpb index fb95a1e..8c6924a 100644 --- a/data/maps/four_rooms/rooms/Intensify Room.txtpb +++ b/data/maps/four_rooms/rooms/Intensify Room.txtpb
@@ -1,5 +1,4 @@
1name: "Intensify Room" 1name: "Intensify Room"
2display_name: "Intensify Room"
3panels { 2panels {
4 name: "SMALL" 3 name: "SMALL"
5 path: "Panels/Room 1 Intensify/entry_1" 4 path: "Panels/Room 1 Intensify/entry_1"
@@ -58,6 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "IMPRESSIVE" 59 name: "IMPRESSIVE"
60 display_name: "Intensify Room Worldport"
61 path: "Components/Warps/worldport" 61 path: "Components/Warps/worldport"
62 orientation: "south" 62 destination { x: 0 y: 0 z: 6.5 }
63 rotation: 0
63} 64}
diff --git a/data/maps/four_rooms/rooms/Keyholder Room.txtpb b/data/maps/four_rooms/rooms/Keyholder Room.txtpb index 9605fad..13c3dce 100644 --- a/data/maps/four_rooms/rooms/Keyholder Room.txtpb +++ b/data/maps/four_rooms/rooms/Keyholder Room.txtpb
@@ -1,6 +1,6 @@
1name: "Keyholder Room" 1name: "Keyholder Room"
2display_name: "Hallway"
3keyholders { 2keyholders {
4 name: "A" 3 name: "A"
5 path: "Components/KeyHolders/keyHolderA" 4 path: "Components/KeyHolders/keyHolderA"
5 key: "a"
6} 6}
diff --git a/data/maps/four_rooms/rooms/Synonyms Room.txtpb b/data/maps/four_rooms/rooms/Synonyms Room.txtpb index 054e4ef..bcbf64e 100644 --- a/data/maps/four_rooms/rooms/Synonyms Room.txtpb +++ b/data/maps/four_rooms/rooms/Synonyms Room.txtpb
@@ -1,5 +1,4 @@
1name: "Synonyms Room" 1name: "Synonyms Room"
2display_name: "Synonyms Room"
3panels { 2panels {
4 name: "MINUTE" 3 name: "MINUTE"
5 path: "Panels/Room 3 Synonyms/entry_1" 4 path: "Panels/Room 3 Synonyms/entry_1"
@@ -58,6 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "ENTRY" 59 name: "ENTRY"
60 display_name: "Synonyms Room Worldport"
61 path: "Components/Warps/worldport3" 61 path: "Components/Warps/worldport3"
62 orientation: "south" 62 destination { x: 20 y: 0 z: 6.5 }
63 rotation: 0
63} 64}
diff --git a/data/maps/four_rooms/rooms/Time Room.txtpb b/data/maps/four_rooms/rooms/Time Room.txtpb index 38f529d..74f951d 100644 --- a/data/maps/four_rooms/rooms/Time Room.txtpb +++ b/data/maps/four_rooms/rooms/Time Room.txtpb
@@ -1,5 +1,4 @@
1name: "Time Room" 1name: "Time Room"
2display_name: "Time Room"
3panels { 2panels {
4 name: "BROODING" 3 name: "BROODING"
5 path: "Panels/Room 4 Time/entry_1" 4 path: "Panels/Room 4 Time/entry_1"
@@ -58,6 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "OWL" 59 name: "OWL"
60 display_name: "Time Room Worldport"
61 path: "Components/Warps/worldport4" 61 path: "Components/Warps/worldport4"
62 orientation: "north" 62 destination { x: 20 y: 0 z: -40.5 }
63 rotation: 180
63} 64}
diff --git a/data/maps/icarus/connections.txtpb b/data/maps/icarus/connections.txtpb new file mode 100644 index 0000000..a963424 --- /dev/null +++ b/data/maps/icarus/connections.txtpb
@@ -0,0 +1,766 @@
1# It is supposed to be in logic to jump from Maze to Maze King Painting, but I
2# find this difficult to do, and unshuffled paintings never requires it, so I am
3# making it not in logic.
4connections {
5 from_room: "Welcome Spine (Obverse)"
6 to_room: "Trans Rights"
7 door { name: "Agender Door" }
8}
9connections {
10 from_room: "Through Woman (Obverse)"
11 to_room: "Welcome Spine (Reverse)"
12 door { name: "Agender Door" }
13 oneway: true
14}
15connections {
16 from_room: "Above Trans Rights"
17 to_room: "Through Woman (Reverse)"
18 door { name: "Agender Door" }
19 oneway: true
20}
21connections {
22 from {
23 painting {
24 room: "Big U"
25 name: "GO3"
26 }
27 }
28 to {
29 painting {
30 room: "Trans Rights"
31 name: "STOP2"
32 }
33 }
34 oneway: true
35}
36connections {
37 from_room: "Spiral Ramp"
38 to_room: "Highest Point"
39 door { name: "Pea Door" }
40}
41connections {
42 from {
43 painting {
44 room: "Fatherland Quicktravel"
45 name: "GO7"
46 }
47 }
48 to {
49 painting {
50 room: "Pillar Ramp"
51 name: "STOP6"
52 }
53 }
54 oneway: true
55}
56connections {
57 from_room: "Maze"
58 to_room: "Mediums Quicktravel"
59 door { name: "Mediums Door" }
60}
61connections {
62 from {
63 painting {
64 room: "Big U"
65 name: "GO1"
66 }
67 }
68 to {
69 painting {
70 room: "Pillar Ramp"
71 name: "STOP10"
72 }
73 }
74 oneway: true
75}
76connections {
77 from_room: "Pillar Ramp"
78 to_room: "Banana Belt Door"
79 door { name: "Asteroid Bunch Door" }
80}
81connections {
82 from_room: "Through Woman (Obverse)"
83 to_room: "Cow Quicktravel"
84 door { name: "Cow Door" }
85}
86connections {
87 from {
88 painting {
89 room: "Welcome Spine Quicktravel"
90 name: "GO5"
91 }
92 }
93 to {
94 painting {
95 room: "Cow Quicktravel"
96 name: "STOP4"
97 }
98 }
99 oneway: true
100}
101connections {
102 from_room: "Through Woman (Obverse)"
103 to_room: "Behind Welcome Spine"
104 door { name: "Ant Door" }
105}
106connections {
107 from_room: "Above Trans Rights"
108 to_room: "Behind Welcome Spine"
109 door { name: "Ant Door" }
110 oneway: true
111}
112connections {
113 from_room: "Through Woman (Obverse)"
114 to_room: "Big U"
115 door { name: "Man Door" }
116}
117connections {
118 from {
119 painting {
120 room: "Trans Rights"
121 name: "GO2"
122 }
123 }
124 to {
125 painting {
126 room: "Big U"
127 name: "STOP1"
128 }
129 }
130 oneway: true
131}
132connections {
133 from {
134 painting {
135 room: "Cow Quicktravel"
136 name: "GO4"
137 }
138 }
139 to {
140 painting {
141 room: "Big U"
142 name: "STOP3"
143 }
144 }
145 oneway: true
146}
147connections {
148 from_room: "Welcome Spine (Obverse)"
149 to_room: "Through Woman (Obverse)"
150 door { name: "Woman Door" }
151}
152connections {
153 from_room: "Fatherland"
154 to_room: "Fatherland Quicktravel"
155 door { name: "Fatherland Door" }
156}
157connections {
158 from {
159 painting {
160 room: "Mini Icarus Sun Loop"
161 name: "GO8"
162 }
163 }
164 to {
165 painting {
166 room: "Fatherland Quicktravel"
167 name: "STOP7"
168 }
169 }
170 oneway: true
171}
172connections {
173 from {
174 painting {
175 room: "Pillar Ramp"
176 name: "GO10"
177 }
178 }
179 to {
180 painting {
181 room: "Mediums Quicktravel"
182 name: "STOP9"
183 }
184 }
185 oneway: true
186}
187connections {
188 from_room: "Mini Icarus Wings Painting"
189 to_room: "Mini Icarus 2"
190 door { name: "Battery Door" }
191 oneway: true
192}
193connections {
194 from_room: "Mini Icarus 2"
195 to_room: "Mini Icarus Sun Loop"
196 door { name: "Battery Door" }
197}
198connections {
199 from {
200 painting {
201 room: "Mediums Quicktravel"
202 name: "GO9"
203 }
204 }
205 to {
206 painting {
207 room: "Mini Icarus Sun Loop"
208 name: "STOP8"
209 }
210 }
211 oneway: true
212}
213connections {
214 from_room: "Mini Icarus 2"
215 to_room: "Mini Icarus 3"
216 door { name: "Animals Door" }
217}
218connections {
219 from_room: "Mini Icarus 2"
220 to_room: "Mini Icarus Wings Painting"
221 door { name: "Troupe Door" }
222}
223connections {
224 from_room: "Mini Icarus 2"
225 to_room: "Mini Icarus Sun Loop"
226 door { name: "Reversed Arrows Door" }
227}
228connections {
229 from_room: "Welcome Spine (Reverse)"
230 to_room: "Welcome Spine Quicktravel"
231 door { name: "Termite Door" }
232}
233connections {
234 from {
235 painting {
236 room: "Pillar Ramp"
237 name: "GO6"
238 }
239 }
240 to {
241 painting {
242 room: "Welcome Spine Quicktravel"
243 name: "STOP5"
244 }
245 }
246 oneway: true
247}
248connections {
249 from {
250 painting {
251 room: "Spiral Ramp"
252 name: "SUN5"
253 }
254 }
255 to {
256 painting {
257 room: "Pillar Ramp"
258 name: "SUN6"
259 }
260 }
261 oneway: true
262}
263connections {
264 from_room: "Pillar Ramp"
265 to_room: "Patricide Room"
266 door { name: "Patricide Door" }
267}
268connections {
269 from_room: "Maze"
270 to_room: "Maze Back"
271 door { name: "These Door" }
272}
273connections {
274 from_room: "Welcome Spine (Reverse)"
275 to_room: "Maze Back"
276 oneway: true
277}
278connections {
279 from_room: "Welcome Spine (Obverse)"
280 to_room: "Through Woman (Reverse)"
281 oneway: true
282}
283connections {
284 from {
285 painting {
286 room: "Through Woman (Obverse)"
287 name: "SUN2"
288 }
289 }
290 to {
291 painting {
292 room: "Above Trans Rights"
293 name: "SUN"
294 }
295 }
296 oneway: true
297}
298connections {
299 from {
300 painting {
301 room: "Maze"
302 name: "WINGS14"
303 }
304 }
305 to {
306 painting {
307 room: "Through Woman (Obverse)"
308 name: "WINGS6"
309 }
310 }
311 oneway: true
312}
313connections {
314 from_room: "Through Woman (Obverse)"
315 to_room: "Behind Welcome Spine"
316 door { name: "Woman Door" }
317 oneway: true
318}
319connections {
320 from {
321 painting {
322 room: "Cow Quicktravel"
323 name: "SUN4"
324 }
325 }
326 to {
327 painting {
328 room: "Highest Point"
329 name: "SUN3"
330 }
331 }
332 oneway: true
333}
334connections {
335 from {
336 painting {
337 room: "Through Woman (Reverse)"
338 name: "WINGS8"
339 }
340 }
341 to {
342 painting {
343 room: "Spiral Ramp"
344 name: "WINGS7"
345 }
346 }
347 oneway: true
348}
349connections {
350 from_room: "Through Woman (Reverse)"
351 to_room: "Big U"
352 oneway: true
353}
354connections {
355 from {
356 painting {
357 room: "Spiral Ramp"
358 name: "WINGS6"
359 }
360 }
361 to {
362 painting {
363 room: "Through Woman (Obverse)"
364 name: "WINGS3"
365 }
366 }
367 # rare two-way painting!
368 bypass_target_door: true
369}
370connections {
371 from_room: "Spiral Ramp"
372 to_room: "Pillar Ramp"
373 oneway: true
374}
375connections {
376 from_room: "Pillar Ramp"
377 to_room: "The Orb"
378}
379connections {
380 from {
381 painting {
382 room: "Banana Belt Door"
383 name: "SUN14"
384 }
385 }
386 to {
387 painting {
388 room: "Above Trans Rights"
389 name: "SUN"
390 }
391 }
392 oneway: true
393}
394connections {
395 from_room: "Trans Rights"
396 to_room: "Mini Icarus Wings Painting"
397 oneway: true
398}
399connections {
400 from {
401 painting {
402 room: "Mini Icarus Wings Painting"
403 name: "WINGS4"
404 }
405 }
406 to {
407 painting {
408 room: "Mini Icarus Sun Loop"
409 name: "TROUBLEDESTINATION"
410 }
411 }
412 oneway: true
413}
414connections {
415 from {
416 painting {
417 room: "Painting Maze 1"
418 name: "SUN9"
419 }
420 }
421 to {
422 painting {
423 room: "Mini Icarus 2"
424 name: "SUN10"
425 }
426 }
427 oneway: true
428}
429connections {
430 from {
431 painting {
432 room: "Mini Icarus 2"
433 name: "SUN11"
434 }
435 }
436 to {
437 painting {
438 room: "Mini Icarus Sun Loop"
439 name: "SUN12"
440 }
441 }
442 oneway: true
443}
444connections {
445 from {
446 painting {
447 room: "Mini Icarus Sun Loop"
448 name: "SUN13"
449 }
450 }
451 to {
452 painting {
453 room: "Maze"
454 name: "SUN14"
455 }
456 }
457 oneway: true
458}
459connections {
460 from_room: "Mini Icarus 3"
461 to_room: "Mini Icarus Sun Loop"
462 door { name: "Battery Door" }
463 oneway: true
464}
465connections {
466 from {
467 painting {
468 room: "Maze"
469 name: "SUN5"
470 }
471 }
472 to {
473 painting {
474 room: "Painting Maze 2"
475 name: "SUN6"
476 }
477 }
478 oneway: true
479}
480connections {
481 from {
482 painting {
483 room: "Maze"
484 name: "WINGS16"
485 }
486 }
487 to {
488 painting {
489 room: "Maze Wings Passage"
490 name: "WINGS12"
491 }
492 }
493 oneway: true
494}
495connections {
496 from {
497 painting {
498 room: "Maze Wings Passage"
499 name: "WINGS12"
500 }
501 }
502 to {
503 painting {
504 room: "Patricide Room"
505 name: "WINGS10"
506 }
507 }
508 oneway: true
509}
510connections {
511 from {
512 painting {
513 room: "Patricide Room"
514 name: "SUN4"
515 }
516 }
517 to {
518 painting {
519 room: "Maze"
520 name: "SUN4"
521 }
522 }
523 oneway: true
524}
525connections {
526 from {
527 painting {
528 room: "Maze"
529 name: "WINGS9"
530 }
531 }
532 to {
533 painting {
534 room: "Patricide Room"
535 name: "WINGS10"
536 }
537 }
538 oneway: true
539}
540connections {
541 from_room: "Maze"
542 to_room: "Maze King Panel"
543 oneway: true
544}
545connections {
546 from_room: "Maze King Painting"
547 to_room: "Maze King Panel"
548 oneway: true
549}
550connections {
551 from {
552 painting {
553 room: "Maze King Painting"
554 name: "WINGS13"
555 }
556 }
557 to {
558 painting {
559 room: "Maze Wings Passage"
560 name: "WINGS12"
561 }
562 }
563 oneway: true
564}
565connections {
566 from {
567 painting {
568 room: "Fatherland"
569 name: "SUN7"
570 }
571 }
572 to {
573 painting {
574 room: "Painting Maze 1"
575 name: "SUN8"
576 }
577 }
578 oneway: true
579}
580connections {
581 from {
582 painting {
583 room: "Painting Maze 2"
584 name: "WINGS11"
585 }
586 }
587 to {
588 painting {
589 room: "Fatherland"
590 name: "WINGS2"
591 }
592 }
593 oneway: true
594}
595connections {
596 from {
597 painting {
598 room: "Painting Maze 1"
599 name: "WINGS3"
600 }
601 }
602 to {
603 painting {
604 room: "Maze Wings Passage"
605 name: "WINGS12"
606 }
607 }
608 oneway: true
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}
625# It is possible to fall out of the map from every room, which always sends you
626# back to the beginning.
627connections {
628 from_room: "Above Trans Rights"
629 to_room: "Welcome Spine (Obverse)"
630 oneway: true
631}
632connections {
633 from_room: "Banana Belt Door"
634 to_room: "Welcome Spine (Obverse)"
635 oneway: true
636}
637connections {
638 from_room: "Behind Welcome Spine"
639 to_room: "Welcome Spine (Obverse)"
640 oneway: true
641}
642connections {
643 from_room: "Big U"
644 to_room: "Welcome Spine (Obverse)"
645 oneway: true
646}
647connections {
648 from_room: "Cow Quicktravel"
649 to_room: "Welcome Spine (Obverse)"
650 oneway: true
651}
652connections {
653 from_room: "Fatherland Quicktravel"
654 to_room: "Welcome Spine (Obverse)"
655 oneway: true
656}
657connections {
658 from_room: "Fatherland"
659 to_room: "Welcome Spine (Obverse)"
660 oneway: true
661}
662connections {
663 from_room: "Highest Point"
664 to_room: "Welcome Spine (Obverse)"
665 oneway: true
666}
667connections {
668 from_room: "Maze Back"
669 to_room: "Welcome Spine (Obverse)"
670 oneway: true
671}
672connections {
673 from_room: "Maze King Painting"
674 to_room: "Welcome Spine (Obverse)"
675 oneway: true
676}
677connections {
678 from_room: "Maze Wings Passage"
679 to_room: "Welcome Spine (Obverse)"
680 oneway: true
681}
682connections {
683 from_room: "Maze"
684 to_room: "Welcome Spine (Obverse)"
685 oneway: true
686}
687connections {
688 from_room: "Mediums Quicktravel"
689 to_room: "Welcome Spine (Obverse)"
690 oneway: true
691}
692connections {
693 from_room: "Mini Icarus 2"
694 to_room: "Welcome Spine (Obverse)"
695 oneway: true
696}
697connections {
698 from_room: "Mini Icarus 3"
699 to_room: "Welcome Spine (Obverse)"
700 oneway: true
701}
702connections {
703 from_room: "Mini Icarus Sun Loop"
704 to_room: "Welcome Spine (Obverse)"
705 oneway: true
706}
707connections {
708 from_room: "Mini Icarus Wings Painting"
709 to_room: "Welcome Spine (Obverse)"
710 oneway: true
711}
712connections {
713 from_room: "Painting Maze 1"
714 to_room: "Welcome Spine (Obverse)"
715 oneway: true
716}
717connections {
718 from_room: "Painting Maze 2"
719 to_room: "Welcome Spine (Obverse)"
720 oneway: true
721}
722connections {
723 from_room: "Patricide Room"
724 to_room: "Welcome Spine (Obverse)"
725 oneway: true
726}
727connections {
728 from_room: "Pillar Ramp"
729 to_room: "Welcome Spine (Obverse)"
730 oneway: true
731}
732connections {
733 from_room: "Spiral Ramp"
734 to_room: "Welcome Spine (Obverse)"
735 oneway: true
736}
737connections {
738 from_room: "The Orb"
739 to_room: "Welcome Spine (Obverse)"
740 oneway: true
741}
742connections {
743 from_room: "Through Woman (Obverse)"
744 to_room: "Welcome Spine (Obverse)"
745 oneway: true
746}
747connections {
748 from_room: "Through Woman (Reverse)"
749 to_room: "Welcome Spine (Obverse)"
750 oneway: true
751}
752connections {
753 from_room: "Trans Rights"
754 to_room: "Welcome Spine (Obverse)"
755 oneway: true
756}
757connections {
758 from_room: "Welcome Spine (Reverse)"
759 to_room: "Welcome Spine (Obverse)"
760 oneway: true
761}
762connections {
763 from_room: "Welcome Spine Quicktravel"
764 to_room: "Welcome Spine (Obverse)"
765 oneway: true
766}
diff --git a/data/maps/icarus/doors.txtpb b/data/maps/icarus/doors.txtpb new file mode 100644 index 0000000..a333dea --- /dev/null +++ b/data/maps/icarus/doors.txtpb
@@ -0,0 +1,286 @@
1doors {
2 name: "Agender Door"
3 type: STANDARD
4 receivers: "Components/Doors/quicktravel3"
5 panels { room: "Trans Rights Panels" name: "AGENDER" }
6 location_room: "Trans Rights Panels"
7}
8doors {
9 name: "Quick Travel 3"
10 type: ITEM_ONLY
11 receivers: "Components/Paintings/QuickTravel/go3"
12 panels { room: "Trans Rights Panels" name: "AGENDER" }
13}
14doors {
15 name: "Pea Door"
16 type: STANDARD
17 receivers: "Components/Doors/quicktravel5"
18 panels { room: "Pillar Ramp" name: "PEA (1)" }
19 location_room: "Pillar Ramp"
20}
21doors {
22 name: "Quick Travel 7"
23 type: ITEM_ONLY
24 receivers: "Components/Paintings/QuickTravel/go7"
25 panels { room: "Pillar Ramp" name: "PEA (1)" }
26}
27doors {
28 name: "Mediums Door"
29 type: STANDARD
30 receivers: "Components/Doors/quicktravel12"
31 panels { room: "Maze" name: "MEDIUMS" }
32 location_room: "Maze"
33}
34doors {
35 name: "Quick Travel 1"
36 type: ITEM_ONLY
37 receivers: "Components/Paintings/QuickTravel/go1"
38 panels { room: "Maze" name: "MEDIUMS" }
39}
40doors {
41 name: "Asteroid Bunch Door"
42 type: STANDARD
43 receivers: "Components/Doors/quicktravel13"
44 panels { room: "Pillar Ramp" name: "ASTEROID" }
45 panels { room: "Pillar Ramp" name: "BUNCH" }
46 location_room: "Pillar Ramp"
47}
48doors {
49 name: "Cow Door"
50 type: STANDARD
51 receivers: "Components/Doors/quicktravel2"
52 panels { room: "Through Woman (Obverse)" name: "COW" }
53 location_room: "Through Woman (Obverse)"
54}
55doors {
56 name: "Quick Travel 5"
57 type: STANDARD
58 receivers: "Components/Paintings/QuickTravel/go5"
59 panels { room: "Highest Point" name: "QUEEN" }
60 location_room: "Highest Point"
61}
62doors {
63 name: "Ant Door"
64 type: STANDARD
65 receivers: "Components/Doors/by sun"
66 panels { room: "Above Trans Rights" name: "ANT" }
67 location_room: "Above Trans Rights"
68}
69doors {
70 name: "Man Door"
71 type: STANDARD
72 receivers: "Components/Doors/quicktravel"
73 panels { room: "Through Woman (Obverse)" name: "HUMAN (2)" }
74 location_room: "Through Woman (Obverse)"
75}
76doors {
77 name: "Quick Travel 2"
78 type: ITEM_ONLY
79 receivers: "Components/Paintings/QuickTravel/go2"
80 panels { room: "Through Woman (Obverse)" name: "HUMAN (2)" }
81}
82doors {
83 name: "Quick Travel 4"
84 type: STANDARD
85 receivers: "Components/Paintings/QuickTravel/go4"
86 panels { room: "Big U" name: "COLONY" }
87 location_room: "Big U"
88}
89doors {
90 name: "Woman Door"
91 type: STANDARD
92 receivers: "Components/Doors/entry"
93 panels { room: "Welcome Spine (Obverse)" name: "HUMAN (1)" }
94 location_room: "Welcome Spine (Obverse)"
95}
96doors {
97 name: "Fatherland Door"
98 type: STANDARD
99 receivers: "Components/Doors/quicktravel6"
100 panels { room: "Fatherland" name: "FATHERLAND" }
101 location_room: "Fatherland"
102}
103doors {
104 name: "Quick Travel 8"
105 type: ITEM_ONLY
106 receivers: "Components/Paintings/QuickTravel/go8"
107 panels { room: "Fatherland" name: "FATHERLAND" }
108}
109doors {
110 name: "Quick Travel 10"
111 type: ITEM_ONLY
112 receivers: "Components/Paintings/QuickTravel/go10"
113 panels { room: "Fatherland" name: "FATHERLAND" }
114}
115doors {
116 name: "Battery Door"
117 type: STANDARD
118 receivers: "Components/Doors/quicktravel7"
119 panels { room: "Mini Icarus 2" name: "BATTERY" }
120 location_room: "Mini Icarus 2"
121}
122doors {
123 name: "Quick Travel 9"
124 type: ITEM_ONLY
125 receivers: "Components/Paintings/QuickTravel/go9"
126 panels { room: "Mini Icarus 2" name: "BATTERY" }
127}
128doors {
129 name: "Arrows Door"
130 type: LOCATION_ONLY
131 #receivers: "Components/Doors/quicktravel8"
132 panels { room: "Mini Icarus 2" name: "ARROWS" }
133 location_room: "Mini Icarus 2"
134 location_name: "ARROWS"
135}
136doors {
137 name: "Animals Door"
138 type: STANDARD
139 receivers: "Components/Doors/quicktravel8"
140 panels { room: "Mini Icarus 2" name: "ANIMALS" }
141 location_room: "Mini Icarus 2"
142}
143doors {
144 name: "Troupe Door"
145 type: STANDARD
146 receivers: "Components/Doors/quicktravel10"
147 panels { room: "Mini Icarus 2" name: "TROUPE" }
148 location_room: "Mini Icarus 2"
149}
150doors {
151 name: "Reversed Arrows Door"
152 type: STANDARD
153 receivers: "Components/Doors/quicktravel11"
154 panels { room: "Mini Icarus 2" name: "SQUAD" }
155 location_room: "Mini Icarus 2"
156}
157doors {
158 name: "Termite Door"
159 type: STANDARD
160 receivers: "Components/Doors/quicktravel4"
161 panels { room: "Welcome Spine (Reverse)" name: "TERMITE" }
162 location_room: "Welcome Spine (Reverse)"
163}
164doors {
165 name: "Quick Travel 6"
166 type: ITEM_ONLY
167 receivers: "Components/Paintings/QuickTravel/go6"
168 panels { room: "Welcome Spine (Reverse)" name: "TERMITE" }
169}
170doors {
171 name: "Murder Panels"
172 type: LOCATION_ONLY
173 panels { room: "Maze" name: "MANSLAUGHTER" }
174 panels { room: "Pillar Ramp" name: "PATRICIDE" }
175 location_room: "Maze"
176}
177doors {
178 name: "Sun Painting To Drone"
179 type: STANDARD
180 receivers: "Components/Paintings/sun5"
181 panels { room: "Pillar Ramp" name: "DRONE" }
182 location_room: "Pillar Ramp"
183}
184doors {
185 name: "Patricide Door"
186 type: STANDARD
187 receivers: "Components/Doors/quicktravel15"
188 panels { room: "Pillar Ramp" name: "PATRICIDE" }
189 location_room: "Pillar Ramp"
190}
191doors {
192 name: "These Door"
193 type: STANDARD
194 receivers: "Components/Doors/quicktravel14"
195 panels { room: "Maze Back" name: "THESE" }
196 location_room: "Maze Back"
197}
198doors {
199 name: "Orb Panels"
200 type: LOCATION_ONLY
201 panels { room: "The Orb" name: "ADDERS" }
202 panels { room: "The Orb" name: "PUPPY" }
203 panels { room: "The Orb" name: "NEEDLE" }
204 panels { room: "The Orb" name: "US" }
205 panels { room: "The Orb" name: "FISH" }
206 panels { room: "The Orb" name: "DEADLINE" }
207 panels { room: "The Orb" name: "PEA (2)" }
208 panels { room: "The Orb" name: "THESIS" }
209 panels { room: "The Orb" name: "CLUTCH (1)" }
210 panels { room: "The Orb" name: "BASIS (2)" }
211 panels { room: "The Orb" name: "AXIS" }
212 panels { room: "The Orb" name: "STRAIGHT" }
213 panels { room: "The Orb" name: "HISS" }
214 panels { room: "The Orb" name: "DISCUS" }
215 panels { room: "The Orb" name: "SON" }
216 panels { room: "The Orb" name: "CLUTCH (2)" }
217 location_room: "The Orb"
218}
219doors {
220 name: "Near Fireman Wings Painting"
221 type: STANDARD
222 receivers: "Components/Paintings/oneways/wings6"
223 receivers: "Components/Paintings/oneways/wings3"
224 panels { room: "Spiral Ramp" name: "FIREMAN" }
225 location_room: "Spiral Ramp"
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 new file mode 100644 index 0000000..8512d8e --- /dev/null +++ b/data/maps/icarus/metadata.txtpb
@@ -0,0 +1,4 @@
1display_name: "Icarus"
2type: ICARUS
3# The map's mastery is created at runtime.
4custom_nodes: "Components/Collectables/collectable"
diff --git a/data/maps/icarus/rooms/Above Trans Rights.txtpb b/data/maps/icarus/rooms/Above Trans Rights.txtpb new file mode 100644 index 0000000..66d8220 --- /dev/null +++ b/data/maps/icarus/rooms/Above Trans Rights.txtpb
@@ -0,0 +1,12 @@
1name: "Above Trans Rights"
2panels {
3 name: "ANT"
4 path: "Panels/Room_1/ant"
5 clue: "ant"
6 answer: "colony"
7 symbols: PLANET
8}
9paintings {
10 name: "SUN"
11 path: "Components/Paintings/sun"
12}
diff --git a/data/maps/icarus/rooms/Banana Belt Door.txtpb b/data/maps/icarus/rooms/Banana Belt Door.txtpb new file mode 100644 index 0000000..62127d7 --- /dev/null +++ b/data/maps/icarus/rooms/Banana Belt Door.txtpb
@@ -0,0 +1,5 @@
1name: "Banana Belt Door"
2paintings {
3 name: "SUN14"
4 path: "Components/Paintings/sun14"
5}
diff --git a/data/maps/icarus/rooms/Behind Welcome Spine.txtpb b/data/maps/icarus/rooms/Behind Welcome Spine.txtpb new file mode 100644 index 0000000..41b56b3 --- /dev/null +++ b/data/maps/icarus/rooms/Behind Welcome Spine.txtpb
@@ -0,0 +1 @@
name: "Behind Welcome Spine"
diff --git a/data/maps/icarus/rooms/Big U.txtpb b/data/maps/icarus/rooms/Big U.txtpb new file mode 100644 index 0000000..ea61640 --- /dev/null +++ b/data/maps/icarus/rooms/Big U.txtpb
@@ -0,0 +1,40 @@
1name: "Big U"
2panels {
3 name: "DECK"
4 path: "Panels/Room_1/deck"
5 clue: "deck"
6 answer: "card"
7 symbols: PLANET
8}
9panels {
10 name: "COLONY"
11 path: "Panels/Room_1/ant2"
12 clue: "colony"
13 answer: "ant"
14 symbols: PLANET
15}
16panels {
17 name: "MANOR"
18 path: "Panels/Room_1/manor"
19 clue: "manor"
20 answer: "mentor"
21 symbols: SPARKLES
22 symbols: PLANET
23}
24paintings {
25 name: "STOP3"
26 path: "Components/Paintings/QuickTravel/stop3"
27}
28paintings {
29 name: "GO3"
30 path: "Components/Paintings/QuickTravel/go3"
31 required_door { name: "Quick Travel 3" }
32}
33paintings {
34 name: "STOP1"
35 path: "Components/Paintings/QuickTravel/stop1"
36}
37paintings {
38 name: "GO1"
39 path: "Components/Paintings/QuickTravel/go1"
40}
diff --git a/data/maps/icarus/rooms/Cow Quicktravel.txtpb b/data/maps/icarus/rooms/Cow Quicktravel.txtpb new file mode 100644 index 0000000..9bb5c82 --- /dev/null +++ b/data/maps/icarus/rooms/Cow Quicktravel.txtpb
@@ -0,0 +1,14 @@
1name: "Cow Quicktravel"
2paintings {
3 name: "SUN4"
4 path: "Components/Paintings/sun4"
5}
6paintings {
7 name: "GO4"
8 path: "Components/Paintings/QuickTravel/go4"
9 required_door { name: "Quick Travel 4" }
10}
11paintings {
12 name: "STOP4"
13 path: "Components/Paintings/QuickTravel/stop4"
14}
diff --git a/data/maps/icarus/rooms/Fatherland Quicktravel.txtpb b/data/maps/icarus/rooms/Fatherland Quicktravel.txtpb new file mode 100644 index 0000000..c4c11b5 --- /dev/null +++ b/data/maps/icarus/rooms/Fatherland Quicktravel.txtpb
@@ -0,0 +1,10 @@
1name: "Fatherland Quicktravel"
2paintings {
3 name: "STOP7"
4 path: "Components/Paintings/QuickTravel/stop7"
5}
6paintings {
7 name: "GO7"
8 path: "Components/Paintings/QuickTravel/go7"
9 required_door { name: "Quick Travel 7" }
10}
diff --git a/data/maps/icarus/rooms/Fatherland.txtpb b/data/maps/icarus/rooms/Fatherland.txtpb new file mode 100644 index 0000000..c04ca75 --- /dev/null +++ b/data/maps/icarus/rooms/Fatherland.txtpb
@@ -0,0 +1,16 @@
1name: "Fatherland"
2panels {
3 name: "FATHERLAND"
4 path: "Panels/Room_1/fatherland"
5 clue: "fatherland"
6 answer: "homeland"
7 symbols: GENDER
8}
9paintings {
10 name: "SUN7"
11 path: "Components/Paintings/sun7"
12}
13paintings {
14 name: "WINGS2"
15 path: "Components/Paintings/wings2"
16}
diff --git a/data/maps/icarus/rooms/Highest Point.txtpb b/data/maps/icarus/rooms/Highest Point.txtpb new file mode 100644 index 0000000..c4e740b --- /dev/null +++ b/data/maps/icarus/rooms/Highest Point.txtpb
@@ -0,0 +1,19 @@
1name: "Highest Point"
2panels {
3 name: "DIAGNOSIS"
4 path: "Panels/Room_1/diagnosis"
5 clue: "diagnosis"
6 answer: "diagnose"
7 symbols: PLANET
8}
9panels {
10 name: "QUEEN"
11 path: "Panels/Room_1/queen"
12 clue: "queen"
13 answer: "ant"
14 symbols: GENDER
15}
16paintings {
17 name: "SUN3"
18 path: "Components/Paintings/sun3"
19}
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/Maze Back.txtpb b/data/maps/icarus/rooms/Maze Back.txtpb new file mode 100644 index 0000000..860d183 --- /dev/null +++ b/data/maps/icarus/rooms/Maze Back.txtpb
@@ -0,0 +1,8 @@
1name: "Maze Back"
2panels {
3 name: "THESE"
4 path: "Panels/30DegreePanels/thesis"
5 clue: "these"
6 answer: "thesis"
7 symbols: PLANET
8}
diff --git a/data/maps/icarus/rooms/Maze King Painting.txtpb b/data/maps/icarus/rooms/Maze King Painting.txtpb new file mode 100644 index 0000000..11e2f11 --- /dev/null +++ b/data/maps/icarus/rooms/Maze King Painting.txtpb
@@ -0,0 +1,8 @@
1name: "Maze King Painting"
2paintings {
3 name: "WINGS13"
4 path: "Components/Paintings/30 degrees/wings13"
5 # There's no other entrance to this region (or any entrance at all in vanilla)
6 # so we can't allow this painting to be an entrance.
7 exit_only: true
8}
diff --git a/data/maps/icarus/rooms/Maze King Panel.txtpb b/data/maps/icarus/rooms/Maze King Panel.txtpb new file mode 100644 index 0000000..0654ea2 --- /dev/null +++ b/data/maps/icarus/rooms/Maze King Panel.txtpb
@@ -0,0 +1,8 @@
1name: "Maze King Panel"
2panels {
3 name: "KING (2)"
4 path: "Panels/Other30degree panels/king2"
5 clue: "king"
6 answer: "royal"
7 symbols: GENDER
8}
diff --git a/data/maps/icarus/rooms/Maze Wings Passage.txtpb b/data/maps/icarus/rooms/Maze Wings Passage.txtpb new file mode 100644 index 0000000..2533251 --- /dev/null +++ b/data/maps/icarus/rooms/Maze Wings Passage.txtpb
@@ -0,0 +1,9 @@
1name: "Maze Wings Passage"
2paintings {
3 name: "WINGS12"
4 path: "Components/Paintings/30 degrees/wings12"
5}
6paintings {
7 name: "WINGS15"
8 path: "Components/Paintings/30 degrees/wings15"
9}
diff --git a/data/maps/icarus/rooms/Maze.txtpb b/data/maps/icarus/rooms/Maze.txtpb new file mode 100644 index 0000000..ee317d9 --- /dev/null +++ b/data/maps/icarus/rooms/Maze.txtpb
@@ -0,0 +1,60 @@
1name: "Maze"
2panels {
3 name: "KING (1)"
4 path: "Panels/Other30degree panels/king"
5 clue: "king"
6 answer: "ruler"
7 symbols: GENDER
8}
9panels {
10 name: "ANALYSIS"
11 path: "Panels/Room_1/princes2"
12 clue: "analysis"
13 answer: "analyse"
14 symbols: PLANET
15}
16panels {
17 name: "MANSLAUGHTER"
18 path: "Panels/Room_1/manslaughter"
19 clue: "manslaughter"
20 answer: "murder"
21 symbols: GENDER
22}
23panels {
24 name: "MEDIUMS"
25 path: "Panels/Room_1/mediums"
26 clue: "mediums"
27 answer: "media"
28 symbols: PLANET
29}
30panels {
31 name: "BOOKS"
32 path: "Panels/Other30degree panels/books"
33 clue: "books"
34 answer: "library"
35 symbols: PLANET
36}
37paintings {
38 name: "SUN14"
39 path: "Components/Paintings/30 degrees/sun14"
40}
41paintings {
42 name: "WINGS14"
43 path: "Components/Paintings/30 degrees/wings14"
44}
45paintings {
46 name: "SUN5"
47 path: "Components/Paintings/30 degrees/sun5"
48}
49paintings {
50 name: "WINGS9"
51 path: "Components/Paintings/30 degrees/wings9"
52}
53paintings {
54 name: "SUN4"
55 path: "Components/Paintings/30 degrees/sun4"
56}
57paintings {
58 name: "WINGS16"
59 path: "Components/Paintings/30 degrees/wings16"
60}
diff --git a/data/maps/icarus/rooms/Mediums Quicktravel.txtpb b/data/maps/icarus/rooms/Mediums Quicktravel.txtpb new file mode 100644 index 0000000..9452450 --- /dev/null +++ b/data/maps/icarus/rooms/Mediums Quicktravel.txtpb
@@ -0,0 +1,10 @@
1name: "Mediums Quicktravel"
2paintings {
3 name: "STOP9"
4 path: "Components/Paintings/QuickTravel/stop9"
5}
6paintings {
7 name: "GO9"
8 path: "Components/Paintings/QuickTravel/go9"
9 required_door { name: "Quick Travel 9" }
10}
diff --git a/data/maps/icarus/rooms/Mini Icarus 2.txtpb b/data/maps/icarus/rooms/Mini Icarus 2.txtpb new file mode 100644 index 0000000..b557500 --- /dev/null +++ b/data/maps/icarus/rooms/Mini Icarus 2.txtpb
@@ -0,0 +1,45 @@
1name: "Mini Icarus 2"
2panels {
3 name: "BATTERY"
4 path: "Panels/Room_1/battery"
5 clue: "battery"
6 answer: "cell"
7 symbols: PLANET
8}
9panels {
10 name: "TROUPE"
11 path: "Panels/Room_1/troupe"
12 clue: "troupe"
13 answer: "actor"
14 symbols: PLANET
15}
16panels {
17 name: "ANIMALS"
18 path: "Panels/Room_1/animals"
19 clue: "animals"
20 answer: "zoo"
21 symbols: PLANET
22 # Intended to be solved upside down.
23}
24panels {
25 name: "ARROWS"
26 path: "Panels/Room_1/arrow"
27 clue: "arrows"
28 answer: "quiver"
29 symbols: PLANET
30}
31panels {
32 name: "SQUAD"
33 path: "Panels/Room_1/ammo"
34 clue: "squad"
35 answer: "soldier"
36 symbols: PLANET
37}
38paintings {
39 name: "SUN10"
40 path: "Components/Paintings/sun10"
41}
42paintings {
43 name: "SUN11"
44 path: "Components/Paintings/sun11"
45}
diff --git a/data/maps/icarus/rooms/Mini Icarus 3.txtpb b/data/maps/icarus/rooms/Mini Icarus 3.txtpb new file mode 100644 index 0000000..633bf79 --- /dev/null +++ b/data/maps/icarus/rooms/Mini Icarus 3.txtpb
@@ -0,0 +1 @@
name: "Mini Icarus 3"
diff --git a/data/maps/icarus/rooms/Mini Icarus Sun Loop.txtpb b/data/maps/icarus/rooms/Mini Icarus Sun Loop.txtpb new file mode 100644 index 0000000..450bfdd --- /dev/null +++ b/data/maps/icarus/rooms/Mini Icarus Sun Loop.txtpb
@@ -0,0 +1,22 @@
1name: "Mini Icarus Sun Loop"
2paintings {
3 name: "GO8"
4 path: "Components/Paintings/QuickTravel/go8"
5 required_door { name: "Quick Travel 8" }
6}
7paintings {
8 name: "STOP8"
9 path: "Components/Paintings/QuickTravel/stop8"
10}
11paintings {
12 name: "TROUBLEDESTINATION"
13 path: "Components/Paintings/TroubleDestination"
14}
15paintings {
16 name: "SUN12"
17 path: "Components/Paintings/sun12"
18}
19paintings {
20 name: "SUN13"
21 path: "Components/Paintings/sun13"
22}
diff --git a/data/maps/icarus/rooms/Mini Icarus Wings Painting.txtpb b/data/maps/icarus/rooms/Mini Icarus Wings Painting.txtpb new file mode 100644 index 0000000..16a597c --- /dev/null +++ b/data/maps/icarus/rooms/Mini Icarus Wings Painting.txtpb
@@ -0,0 +1,5 @@
1name: "Mini Icarus Wings Painting"
2paintings {
3 name: "WINGS4"
4 path: "Components/Paintings/wings4"
5}
diff --git a/data/maps/icarus/rooms/Painting Maze 1.txtpb b/data/maps/icarus/rooms/Painting Maze 1.txtpb new file mode 100644 index 0000000..19a3855 --- /dev/null +++ b/data/maps/icarus/rooms/Painting Maze 1.txtpb
@@ -0,0 +1,13 @@
1name: "Painting Maze 1"
2paintings {
3 name: "SUN9"
4 path: "Components/Paintings/sun9"
5}
6paintings {
7 name: "WINGS3"
8 path: "Components/Paintings/wings3"
9}
10paintings {
11 name: "SUN8"
12 path: "Components/Paintings/sun8"
13}
diff --git a/data/maps/icarus/rooms/Painting Maze 2.txtpb b/data/maps/icarus/rooms/Painting Maze 2.txtpb new file mode 100644 index 0000000..7dc6a79 --- /dev/null +++ b/data/maps/icarus/rooms/Painting Maze 2.txtpb
@@ -0,0 +1,13 @@
1name: "Painting Maze 2"
2paintings {
3 name: "WINGS10"
4 path: "Components/Paintings/30 degrees/wings10"
5}
6paintings {
7 name: "WINGS11"
8 path: "Components/Paintings/30 degrees/wings11"
9}
10paintings {
11 name: "SUN6"
12 path: "Components/Paintings/30 degrees/sun6"
13}
diff --git a/data/maps/icarus/rooms/Patricide Room.txtpb b/data/maps/icarus/rooms/Patricide Room.txtpb new file mode 100644 index 0000000..90945de --- /dev/null +++ b/data/maps/icarus/rooms/Patricide Room.txtpb
@@ -0,0 +1,9 @@
1name: "Patricide Room"
2paintings {
3 name: "WINGS10"
4 path: "Components/Paintings/other 30 degrees/wings10"
5}
6paintings {
7 name: "SUN4"
8 path: "Components/Paintings/other 30 degrees/sun4"
9}
diff --git a/data/maps/icarus/rooms/Pillar Ramp.txtpb b/data/maps/icarus/rooms/Pillar Ramp.txtpb new file mode 100644 index 0000000..9b056f7 --- /dev/null +++ b/data/maps/icarus/rooms/Pillar Ramp.txtpb
@@ -0,0 +1,65 @@
1name: "Pillar Ramp"
2panels {
3 name: "ASTEROID"
4 path: "Panels/Room_1/asteroid"
5 clue: "asteroid"
6 answer: "belt"
7 symbols: PLANET
8}
9panels {
10 name: "BUNCH"
11 path: "Panels/Room_1/bunch"
12 clue: "bunch"
13 answer: "banana"
14 symbols: PLANET
15}
16panels {
17 name: "PRINCES"
18 path: "Panels/Room_1/princes"
19 clue: "princes"
20 answer: "princess"
21 symbols: PLANET
22}
23panels {
24 name: "PATRICIDE"
25 path: "Panels/Room_1/patricide"
26 clue: "patricide"
27 answer: "murder"
28 symbols: GENDER
29}
30panels {
31 name: "DRONE"
32 path: "Panels/Room_1/ant3"
33 clue: "drone"
34 answer: "ant"
35 symbols: GENDER
36}
37panels {
38 name: "PEA (1)"
39 path: "Panels/Room_1/pea"
40 clue: "pea"
41 answer: "pod"
42 symbols: PLANET
43}
44paintings {
45 name: "SUN6"
46 path: "Components/Paintings/sun6"
47}
48paintings {
49 name: "GO10"
50 path: "Components/Paintings/QuickTravel/go10"
51 required_door { name: "Quick Travel 10" }
52}
53paintings {
54 name: "STOP10"
55 path: "Components/Paintings/QuickTravel/stop10"
56}
57paintings {
58 name: "GO6"
59 path: "Components/Paintings/QuickTravel/go6"
60 required_door { name: "Quick Travel 6" }
61}
62paintings {
63 name: "STOP6"
64 path: "Components/Paintings/QuickTravel/stop6"
65}
diff --git a/data/maps/icarus/rooms/Spiral Ramp.txtpb b/data/maps/icarus/rooms/Spiral Ramp.txtpb new file mode 100644 index 0000000..bd2013a --- /dev/null +++ b/data/maps/icarus/rooms/Spiral Ramp.txtpb
@@ -0,0 +1,29 @@
1name: "Spiral Ramp"
2panels {
3 name: "FIREMAN"
4 path: "Panels/Room_1/fireman"
5 clue: "fireman"
6 answer: "firefighter"
7 symbols: GENDER
8}
9paintings {
10 name: "WINGS6"
11 path: "Components/Paintings/oneways/wings6"
12 required_door { name: "Near Fireman Wings Painting" }
13}
14paintings {
15 name: "SUN5"
16 path: "Components/Paintings/sun5"
17 required_door { name: "Sun Painting To Drone" }
18}
19paintings {
20 name: "WINGS7"
21 path: "Components/Paintings/oneways/wings7"
22}
23paintings {
24 name: "WINGS11"
25 path: "Components/Paintings/other 30 degrees/wings11"
26 exit_only: true
27 # There is a ledge near the painting so we might want to turn off exit_only
28 # at some point.
29}
diff --git a/data/maps/icarus/rooms/The Orb.txtpb b/data/maps/icarus/rooms/The Orb.txtpb new file mode 100644 index 0000000..c9284d1 --- /dev/null +++ b/data/maps/icarus/rooms/The Orb.txtpb
@@ -0,0 +1,117 @@
1name: "The Orb"
2panels {
3 name: "ADDERS"
4 path: "Panels/Room_1/needle2"
5 clue: "adders"
6 answer: "sum"
7 symbols: PLANET
8}
9panels {
10 name: "PUPPY"
11 path: "Panels/Room_1/puppy"
12 clue: "puppy"
13 answer: "garbage"
14 symbols: SUN
15 symbols: PLANET
16}
17panels {
18 name: "NEEDLE"
19 path: "Panels/Room_1/needle"
20 clue: "needle"
21 answer: "needless"
22 symbols: PLANET
23}
24panels {
25 name: "US"
26 path: "Panels/Room_1/us"
27 clue: "us"
28 answer: "mess"
29 symbols: PLANET
30}
31panels {
32 name: "FISH"
33 path: "Panels/Room_1/fish"
34 clue: "fish"
35 answer: "student"
36 symbols: BOXES
37 symbols: PLANET
38}
39panels {
40 name: "DEADLINE"
41 path: "Panels/Room_1/deadline"
42 clue: "deadline"
43 answer: "deadliness"
44 symbols: PLANET
45}
46panels {
47 name: "PEA (2)"
48 path: "Panels/Room_1/pea2"
49 clue: "pea"
50 answer: "dolphin"
51 symbols: PLANET
52}
53panels {
54 name: "THESIS"
55 path: "Panels/Room_1/thesis"
56 clue: "thesis"
57 answer: "these"
58 symbols: PLANET
59}
60panels {
61 name: "CLUTCH (1)"
62 path: "Panels/Room_1/clutch"
63 clue: "clutch"
64 answer: "dude"
65 symbols: PLANET
66 symbols: GENDER
67}
68panels {
69 name: "BASIS (2)"
70 path: "Panels/Room_1/basis2"
71 clue: "basis"
72 answer: "base"
73 symbols: PLANET
74}
75panels {
76 name: "AXIS"
77 path: "Panels/Room_1/axis"
78 clue: "axis"
79 answer: "Axe"
80 symbols: PLANET
81}
82panels {
83 name: "STRAIGHT"
84 path: "Panels/Room_1/straight"
85 clue: "straight"
86 answer: "queer"
87 symbols: GENDER
88}
89panels {
90 name: "HISS"
91 path: "Panels/Room_1/hiss"
92 clue: "hiss"
93 answer: "their"
94 symbols: PLANET
95 symbols: GENDER
96}
97panels {
98 name: "DISCUS"
99 path: "Panels/Room_1/discus"
100 clue: "discus"
101 answer: "discuss"
102 symbols: PLANET
103}
104panels {
105 name: "SON"
106 path: "Panels/Room_1/son"
107 clue: "son"
108 answer: "child"
109 symbols: GENDER
110}
111panels {
112 name: "CLUTCH (2)"
113 path: "Panels/Room_1/clutch2"
114 clue: "clutch"
115 answer: "chick"
116 symbols: PLANET
117}
diff --git a/data/maps/icarus/rooms/Through Woman (Obverse).txtpb b/data/maps/icarus/rooms/Through Woman (Obverse).txtpb new file mode 100644 index 0000000..c502d3a --- /dev/null +++ b/data/maps/icarus/rooms/Through Woman (Obverse).txtpb
@@ -0,0 +1,28 @@
1name: "Through Woman (Obverse)"
2panels {
3 name: "HUMAN (2)"
4 path: "Panels/Room_1/human"
5 clue: "human"
6 answer: "man"
7 symbols: GENDER
8}
9panels {
10 name: "COW"
11 path: "Panels/Room_1/cow"
12 clue: "cow"
13 answer: "elephant"
14 symbols: GENDER
15}
16paintings {
17 name: "SUN2"
18 path: "Components/Paintings/sun2"
19}
20paintings {
21 name: "WINGS6"
22 path: "Components/Paintings/wings6"
23}
24paintings {
25 name: "WINGS3"
26 path: "Components/Paintings/oneways/wings3"
27 required_door { name: "Near Fireman Wings Painting" }
28}
diff --git a/data/maps/icarus/rooms/Through Woman (Reverse).txtpb b/data/maps/icarus/rooms/Through Woman (Reverse).txtpb new file mode 100644 index 0000000..661be31 --- /dev/null +++ b/data/maps/icarus/rooms/Through Woman (Reverse).txtpb
@@ -0,0 +1,19 @@
1name: "Through Woman (Reverse)"
2panels {
3 name: "PRINCE"
4 path: "Panels/Room_1/prince"
5 clue: "prince"
6 answer: "princess"
7 symbols: GENDER
8}
9panels {
10 name: "BASIS (1)"
11 path: "Panels/Room_1/basis"
12 clue: "basis"
13 answer: "bases"
14 symbols: PLANET
15}
16paintings {
17 name: "WINGS8"
18 path: "Components/Paintings/oneways/wings8"
19}
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 new file mode 100644 index 0000000..2ca98dd --- /dev/null +++ b/data/maps/icarus/rooms/Trans Rights.txtpb
@@ -0,0 +1,25 @@
1name: "Trans Rights"
2# slay
3panels {
4 name: "SERVANT (1)"
5 path: "Panels/Room_1/servant"
6 clue: "servant"
7 answer: "butler"
8 symbols: GENDER
9}
10panels {
11 name: "SERVANT (2)"
12 path: "Panels/Room_1/servant2"
13 clue: "servant"
14 answer: "maid"
15 symbols: GENDER
16}
17paintings {
18 name: "GO2"
19 path: "Components/Paintings/QuickTravel/go2"
20 required_door { name: "Quick Travel 2" }
21}
22paintings {
23 name: "STOP2"
24 path: "Components/Paintings/QuickTravel/stop2"
25}
diff --git a/data/maps/icarus/rooms/Welcome Spine (Obverse).txtpb b/data/maps/icarus/rooms/Welcome Spine (Obverse).txtpb new file mode 100644 index 0000000..63477d5 --- /dev/null +++ b/data/maps/icarus/rooms/Welcome Spine (Obverse).txtpb
@@ -0,0 +1,22 @@
1name: "Welcome Spine (Obverse)"
2panels {
3 name: "FISHWIFE"
4 path: "Panels/Room_1/fishwife"
5 clue: "fishwife"
6 answer: "fishmonger"
7 symbols: GENDER
8}
9panels {
10 name: "HUMAN (1)"
11 path: "Panels/Room_1/human3"
12 clue: "human"
13 answer: "woman"
14 symbols: GENDER
15}
16ports {
17 name: "WORLDPORT"
18 display_name: "Entrance"
19 path: "Components/Signs/worldport"
20 destination { x: 55 y: -3.5 z: 7.75 }
21 rotation: 0
22}
diff --git a/data/maps/icarus/rooms/Welcome Spine (Reverse).txtpb b/data/maps/icarus/rooms/Welcome Spine (Reverse).txtpb new file mode 100644 index 0000000..7605141 --- /dev/null +++ b/data/maps/icarus/rooms/Welcome Spine (Reverse).txtpb
@@ -0,0 +1,22 @@
1name: "Welcome Spine (Reverse)"
2panels {
3 name: "FATHER"
4 path: "Panels/Room_1/father"
5 clue: "father"
6 answer: "parent"
7 symbols: GENDER
8}
9panels {
10 name: "TERMITE"
11 path: "Panels/Room_1/bat"
12 clue: "termite"
13 answer: "colony"
14 symbols: PLANET
15}
16panels {
17 name: "SISTER"
18 path: "Panels/Room_1/sister"
19 clue: "sister"
20 answer: "sibling"
21 symbols: GENDER
22}
diff --git a/data/maps/icarus/rooms/Welcome Spine Quicktravel.txtpb b/data/maps/icarus/rooms/Welcome Spine Quicktravel.txtpb new file mode 100644 index 0000000..8890345 --- /dev/null +++ b/data/maps/icarus/rooms/Welcome Spine Quicktravel.txtpb
@@ -0,0 +1,10 @@
1name: "Welcome Spine Quicktravel"
2paintings {
3 name: "STOP5"
4 path: "Components/Paintings/QuickTravel/stop5"
5}
6paintings {
7 name: "GO5"
8 path: "Components/Paintings/QuickTravel/go5"
9 required_door { name: "Quick Travel 5" }
10}
diff --git a/data/maps/the_advanced/connections.txtpb b/data/maps/the_advanced/connections.txtpb new file mode 100644 index 0000000..4425f3d --- /dev/null +++ b/data/maps/the_advanced/connections.txtpb
@@ -0,0 +1,10 @@
1connections {
2 from_room: "Main Area"
3 to_room: "CBA"
4 door { name: "CBA Door" }
5}
6connections {
7 from_room: "CBA"
8 to_room: "Mastery"
9 door { name: "Mastery" }
10}
diff --git a/data/maps/the_advanced/doors.txtpb b/data/maps/the_advanced/doors.txtpb new file mode 100644 index 0000000..fed24a8 --- /dev/null +++ b/data/maps/the_advanced/doors.txtpb
@@ -0,0 +1,50 @@
1doors {
2 name: "Side Room Puzzles"
3 type: LOCATION_ONLY
4 panels { room: "Main Area" name: "Blank (1)" }
5 panels { room: "Main Area" name: "Blank (2)" }
6 panels { room: "Main Area" name: "Blank (3)" }
7 panels { room: "Main Area" name: "Blank (4)" }
8 panels { room: "Main Area" name: "Blank (5)" }
9 location_room: "Main Area"
10}
11doors {
12 name: "CBA Door"
13 type: EVENT
14 panels { room: "Main Area" name: "Blank (1)" }
15 panels { room: "Main Area" name: "Blank (2)" }
16 panels { room: "Main Area" name: "Blank (3)" }
17 panels { room: "Main Area" name: "Blank (4)" }
18 panels { room: "Main Area" name: "Blank (5)" }
19 panels { room: "Main Area" name: "BIRD" }
20 panels { room: "Main Area" name: "UNBOTTLING" }
21 panels { room: "Main Area" name: "ORGANIZATION" }
22 panels { room: "Main Area" name: "ORDER (1)" }
23 panels { room: "Main Area" name: "ORDER (2)" }
24 panels { room: "Main Area" name: "ORDER (3)" }
25 panels { room: "Main Area" name: "DECK (1)" }
26 panels { room: "Main Area" name: "DECK (2)" }
27 panels { room: "Main Area" name: "DECK (3)" }
28 panels { room: "Main Area" name: "OBSERVE" }
29 panels { room: "Main Area" name: "I" }
30 panels { room: "Main Area" name: "REST" }
31 panels { room: "Main Area" name: "THE" }
32 panels { room: "Main Area" name: "LIVES" }
33 panels { room: "Main Area" name: "DAIRY (1)" }
34 panels { room: "Main Area" name: "DAIRY (2)" }
35 panels { room: "Main Area" name: "DAIRY SAUCE" }
36 panels { room: "Main Area" name: "GULLIBLE (1)" }
37 panels { room: "Main Area" name: "GULLIBLE (2)" }
38 panels { room: "Main Area" name: "GULLIBLE (3)" }
39 panels { room: "Main Area" name: "FRUIT (1)" }
40 panels { room: "Main Area" name: "FRUIT (2)" }
41 panels { room: "Main Area" name: "FRUIT FRUIT" }
42 complete_at: 23 # ????
43}
44doors {
45 name: "Mastery"
46 type: EVENT
47 panels { room: "CBA" name: "CBA (1)" }
48 panels { room: "CBA" name: "CBA (2)" }
49 panels { room: "CBA" name: "CBA (3)" }
50}
diff --git a/data/maps/the_advanced/metadata.txtpb b/data/maps/the_advanced/metadata.txtpb new file mode 100644 index 0000000..cee10b6 --- /dev/null +++ b/data/maps/the_advanced/metadata.txtpb
@@ -0,0 +1,4 @@
1display_name: "The Advanced"
2type: GIFT_MAP
3# The map's mastery is created at runtime.
4custom_nodes: "Components/Collectables/collectable"
diff --git a/data/maps/the_advanced/rooms/CBA.txtpb b/data/maps/the_advanced/rooms/CBA.txtpb new file mode 100644 index 0000000..eefa0d4 --- /dev/null +++ b/data/maps/the_advanced/rooms/CBA.txtpb
@@ -0,0 +1,22 @@
1name: "CBA"
2panels {
3 name: "CBA (1)"
4 path: "Panels/Room_1/panel_29"
5 clue: ""
6 answer: "chess"
7 symbols: QUESTION
8}
9panels {
10 name: "CBA (2)"
11 path: "Panels/Room_1/panel_30"
12 clue: ""
13 answer: "battle"
14 symbols: QUESTION
15}
16panels {
17 name: "CBA (3)"
18 path: "Panels/Room_1/panel_31"
19 clue: ""
20 answer: "advanced"
21 symbols: QUESTION
22}
diff --git a/data/maps/the_advanced/rooms/Main Area.txtpb b/data/maps/the_advanced/rooms/Main Area.txtpb new file mode 100644 index 0000000..42e576e --- /dev/null +++ b/data/maps/the_advanced/rooms/Main Area.txtpb
@@ -0,0 +1,200 @@
1name: "Main Area"
2panels {
3 name: "OBSERVE"
4 path: "Panels/Room_1/panel_1"
5 clue: "observe"
6 answer: "watch"
7 symbols: SUN
8}
9panels {
10 name: "I"
11 path: "Panels/Room_1/panel_2"
12 clue: "i"
13 answer: "eye"
14 symbols: ZERO
15}
16panels {
17 name: "REST"
18 path: "Panels/Room_1/panel_3"
19 clue: "rest"
20 answer: "sleep"
21 symbols: SUN
22}
23panels {
24 name: "THE"
25 path: "Panels/Room_1/panel_4"
26 clue: "the"
27 answer: "a"
28 symbols: ZERO
29}
30panels {
31 name: "LIVES"
32 path: "Panels/Room_1/panel_5"
33 clue: "lives"
34 answer: "souls"
35 symbols: SUN
36}
37panels {
38 name: "DAIRY (1)"
39 path: "Panels/Room_1/panel_6"
40 clue: "dairy"
41 answer: "cheese"
42 symbols: EXAMPLE
43}
44panels {
45 name: "DAIRY (2)"
46 path: "Panels/Room_1/panel_7"
47 clue: "dairy"
48 answer: "butter"
49 symbols: EXAMPLE
50}
51panels {
52 name: "DAIRY SAUCE"
53 path: "Panels/Room_1/panel_8"
54 clue: "dairy? sauce."
55 answer: "alfredo"
56 symbols: EXAMPLE
57}
58panels {
59 name: "GULLIBLE (1)"
60 path: "Panels/Room_1/panel_9"
61 clue: "gullible"
62 answer: "credulous"
63 symbols: SUN
64}
65panels {
66 name: "GULLIBLE (2)"
67 path: "Panels/Room_1/panel_10"
68 clue: "gullible"
69 answer: "bird"
70 symbols: SPARKLES
71 symbols: EXAMPLE
72}
73panels {
74 name: "GULLIBLE (3)"
75 path: "Panels/Room_1/panel_11"
76 clue: "gullible"
77 answer: "advice"
78 symbols: QUESTION
79}
80panels {
81 name: "FRUIT (1)"
82 path: "Panels/Room_1/panel_12"
83 clue: "fruit"
84 answer: "cherry"
85 symbols: EXAMPLE
86}
87panels {
88 name: "FRUIT (2)"
89 path: "Panels/Room_1/panel_13"
90 clue: "fruit"
91 answer: "banana"
92 symbols: EXAMPLE
93}
94panels {
95 name: "FRUIT FRUIT"
96 path: "Panels/Room_1/panel_14"
97 clue: "fruit? fruit!"
98 answer: "avocado"
99 symbols: EXAMPLE
100}
101panels {
102 name: "BIRD"
103 path: "Panels/Room_1/panel_15"
104 clue: "bird"
105 answer: "canary"
106 symbols: EXAMPLE
107}
108panels {
109 name: "UNBOTTLING"
110 path: "Panels/Room_1/panel_16"
111 clue: "unbottling"
112 answer: "bottling"
113 symbols: SUN
114}
115panels {
116 name: "ORGANIZATION"
117 path: "Panels/Room_1/panel_17"
118 clue: "organization"
119 answer: "association"
120 symbols: SUN
121}
122panels {
123 name: "ORDER (1)"
124 path: "Panels/Room_1/panel_18"
125 clue: "order"
126 answer: "chaos"
127 symbols: SUN
128}
129panels {
130 name: "ORDER (2)"
131 path: "Panels/Room_1/panel_19"
132 clue: "order"
133 answer: "border"
134 symbols: SPARKLES
135}
136panels {
137 name: "ORDER (3)"
138 path: "Panels/Room_1/panel_20"
139 clue: "order"
140 answer: "arrange"
141 symbols: SUN
142}
143panels {
144 name: "DECK (1)"
145 path: "Panels/Room_1/panel_21"
146 clue: "deck"
147 answer: "card"
148 symbols: BOXES
149}
150panels {
151 name: "DECK (2)"
152 path: "Panels/Room_1/panel_22"
153 clue: "deck"
154 answer: "black"
155 symbols: BOXES
156}
157panels {
158 name: "DECK (3)"
159 path: "Panels/Room_1/panel_23"
160 clue: "deck"
161 answer: "ace"
162 symbols: BOXES
163}
164panels {
165 name: "Blank (1)"
166 path: "Panels/Room_1/panel_24"
167 clue: ""
168 answer: "identity"
169}
170panels {
171 name: "Blank (2)"
172 path: "Panels/Room_1/panel_25"
173 clue: ""
174 answer: "theft"
175}
176panels {
177 name: "Blank (3)"
178 path: "Panels/Room_1/panel_26"
179 clue: ""
180 answer: "is"
181}
182panels {
183 name: "Blank (4)"
184 path: "Panels/Room_1/panel_27"
185 clue: ""
186 answer: "a"
187}
188panels {
189 name: "Blank (5)"
190 path: "Panels/Room_1/panel_28"
191 clue: ""
192 answer: "crime"
193}
194ports {
195 name: "WORLDPORT"
196 display_name: "Entrance"
197 path: "Components/Warps/worldport"
198 destination { x: 0 y: 0 z: 9.5 }
199 rotation: 0
200}
diff --git a/data/maps/the_advanced/rooms/Mastery.txtpb b/data/maps/the_advanced/rooms/Mastery.txtpb new file mode 100644 index 0000000..bbe8742 --- /dev/null +++ b/data/maps/the_advanced/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_ancient/doors.txtpb b/data/maps/the_ancient/doors.txtpb index 894fbf5..e550306 100644 --- a/data/maps/the_ancient/doors.txtpb +++ b/data/maps/the_ancient/doors.txtpb
@@ -1,18 +1,45 @@
1doors { 1doors {
2 name: "Front Door" 2 name: "Front Door"
3 type: STANDARD 3 type: STANDARD
4 receivers: "Components/Doors/Front N Tree"
4 panels { room: "Outside" name: "THIS" } 5 panels { room: "Outside" name: "THIS" }
5 location_room: "Outside" 6 location_room: "Outside"
6} 7}
7doors { 8doors {
8 name: "End Door" 9 name: "End Door"
9 type: STANDARD 10 type: EVENT
10 # TODO: all the keyholders! 11 keyholders { map: "four_rooms" room: "Keyholder Room" name: "A" key: "a" }
12 keyholders { map: "the_hive" room: "Main Area" name: "B" key: "b" }
13 keyholders { map: "daedalus" room: "C Keyholder" name: "C" key: "c" }
14 keyholders { map: "daedalus" room: "D Keyholder" name: "D" key: "d" }
15 keyholders { map: "control_center" room: "Main Area" name: "2" key: "e" }
16 keyholders { map: "daedalus" room: "F Keyholder" name: "F" key: "f" }
17 keyholders { map: "daedalus" room: "Number Paintings Area" name: "G" key: "g" }
18 keyholders { map: "daedalus" room: "Outside House" name: "H" key: "h" }
19 keyholders { map: "the_unkempt" room: "Main Area" name: "I" key: "i" }
20 keyholders { map: "the_jubilant" room: "Side Area" name: "J" key: "j" }
21 keyholders { map: "the_tenacious" room: "Main Area" name: "K" key: "k" }
22 keyholders { map: "the_partial" room: "Obverse Side" name: "L" key: "l" }
23 keyholders { map: "the_extravagant" room: "X Plus" name: "M" key: "m" }
24 keyholders { map: "the_shop" room: "Main Area" name: "N" key: "n" }
25 keyholders { map: "control_center" room: "Main Area" name: "4" key: "o" }
26 keyholders { map: "the_gallery" room: "Main Area" name: "P" key: "p" }
27 keyholders { map: "the_quiet" room: "Keyholder Room" name: "Q" key: "q" }
28 keyholders { map: "control_center" room: "Main Area" name: "3" key: "r" }
29 keyholders { map: "the_nuanced" room: "Main Room" name: "S" key: "s" }
30 keyholders { map: "the_congruent" room: "T Keyholder" name: "T" key: "t" }
31 keyholders { map: "the_parthenon" room: "U Keyholder" name: "U" key: "u" }
32 keyholders { map: "the_unkempt" room: "V Keyholder" name: "V" key: "v" }
33 keyholders { map: "the_unkempt" room: "W Keyholder" name: "W" key: "w" }
34 keyholders { map: "the_great" room: "North Landscape" name: "X" key: "x" }
35 keyholders { map: "the_talented" room: "Main Area" name: "Y" key: "y" }
36 keyholders { map: "control_center" room: "Main Area" name: "1" key: "z" }
11 location_room: "Inside" 37 location_room: "Inside"
12} 38}
13doors { 39doors {
14 name: "Lavender Cubes" 40 name: "Lavender Cubes"
15 type: STANDARD 41 type: LOCATION_ONLY
16 panels { room: "Inside" name: "COLOR" } 42 panels { room: "Inside" name: "COLOR" }
17 location_room: "Inside" 43 location_room: "Inside"
44 location_name: "COLOR"
18} 45}
diff --git a/data/maps/the_ancient/rooms/Ending.txtpb b/data/maps/the_ancient/rooms/Ending.txtpb index eea1228..df3fe01 100644 --- a/data/maps/the_ancient/rooms/Ending.txtpb +++ b/data/maps/the_ancient/rooms/Ending.txtpb
@@ -1,5 +1,4 @@
1name: "Ending" 1name: "Ending"
2display_name: "Ending"
3endings { 2endings {
4 name: "GREEN" 3 name: "GREEN"
5 path: "Components/Ending/green_ending" 4 path: "Components/Ending/green_ending"
diff --git a/data/maps/the_ancient/rooms/Inside.txtpb b/data/maps/the_ancient/rooms/Inside.txtpb index d088682..3723b2d 100644 --- a/data/maps/the_ancient/rooms/Inside.txtpb +++ b/data/maps/the_ancient/rooms/Inside.txtpb
@@ -1,10 +1,8 @@
1name: "Inside" 1name: "Inside"
2display_name: "Inside"
3panels { 2panels {
4 name: "COLOR" 3 name: "COLOR"
5 path: "Panels/panel_2" 4 path: "Panels/panel_2"
6 clue: "color" 5 clue: "color"
7 answer: "lavender" 6 answer: "lavender"
8 symbols: EXAMPLE 7 symbols: EXAMPLE
9 # TODO: how does this connect to the "lavender_cubes" switch?
10} 8}
diff --git a/data/maps/the_ancient/rooms/Outside.txtpb b/data/maps/the_ancient/rooms/Outside.txtpb index 6f49bba..1458357 100644 --- a/data/maps/the_ancient/rooms/Outside.txtpb +++ b/data/maps/the_ancient/rooms/Outside.txtpb
@@ -1,8 +1,8 @@
1name: "Outside" 1name: "Outside"
2display_name: "Outside"
3panels { 2panels {
4 name: "THIS" 3 name: "THIS"
5 path: "Panels/panel_1" 4 path: "Panels/panel_1"
6 clue: "this" 5 clue: "this"
7 answer: "sphinx" 6 answer: "sphinx"
7 symbols: QUESTION
8} 8}
diff --git a/data/maps/the_bearer/connections.txtpb b/data/maps/the_bearer/connections.txtpb index 8f38791..ba14d83 100644 --- a/data/maps/the_bearer/connections.txtpb +++ b/data/maps/the_bearer/connections.txtpb
@@ -34,6 +34,11 @@ connections {
34 door { name: "Planet Orange -> Red" } 34 door { name: "Planet Orange -> Red" }
35} 35}
36connections { 36connections {
37 from_room: "Red Planet"
38 to_room: "Red Town"
39 door { name: "Red Planet -> Town" }
40}
41connections {
37 from_room: "Yellow Planet" 42 from_room: "Yellow Planet"
38 to_room: "Green Planet" 43 to_room: "Green Planet"
39 door { name: "Planet Yellow -> Green" } 44 door { name: "Planet Yellow -> Green" }
@@ -258,3 +263,8 @@ connections {
258 to_room: "Butterfly Room" 263 to_room: "Butterfly Room"
259 door { name: "Butterfly Entrance" } 264 door { name: "Butterfly Entrance" }
260} 265}
266connections {
267 from_room: "Back Area"
268 to_room: "Tree Entrance"
269 door { name: "Control Center Brown Door" }
270}
diff --git a/data/maps/the_bearer/doors.txtpb b/data/maps/the_bearer/doors.txtpb index 1faddef..acbf86a 100644 --- a/data/maps/the_bearer/doors.txtpb +++ b/data/maps/the_bearer/doors.txtpb
@@ -211,7 +211,7 @@ doors {
211} 211}
212doors { 212doors {
213 name: "Q2 Door" 213 name: "Q2 Door"
214 type: STANDARD 214 type: EVENT
215 receivers: "Components/Doors/entry_3" 215 receivers: "Components/Doors/entry_3"
216 panels { room: "Entry" name: "SQUISH" } 216 panels { room: "Entry" name: "SQUISH" }
217 panels { room: "Entry" name: "MANE" } 217 panels { room: "Entry" name: "MANE" }
@@ -237,11 +237,11 @@ doors {
237 panels { room: "Red Vegetable" name: "CARD" } 237 panels { room: "Red Vegetable" name: "CARD" }
238 panels { room: "Yellow Planet" name: "ZEUS" } 238 panels { room: "Yellow Planet" name: "ZEUS" }
239 panels { room: "Yellow Vegetable" name: "CAKE" } 239 panels { room: "Yellow Vegetable" name: "CAKE" }
240 location_room: "Entry"
241} 240}
242doors { 241doors {
243 name: "Control Center Brown Door" 242 name: "Control Center Brown Door"
244 type: CONTROL_CENTER_COLOR 243 type: CONTROL_CENTER_COLOR
244 latch: true
245 receivers: "Components/Doors/brown_1" 245 receivers: "Components/Doors/brown_1"
246 control_center_color: "brown" 246 control_center_color: "brown"
247} 247}
@@ -249,5 +249,20 @@ doors {
249 name: "Butterfly Entrance" 249 name: "Butterfly Entrance"
250 type: ITEM_ONLY 250 type: ITEM_ONLY
251 receivers: "Components/Doors/brown_2" 251 receivers: "Components/Doors/brown_2"
252 switches: "double_letters" 252 double_letters: true
253}
254doors {
255 name: "Control Center Color Panel"
256 type: LOCATION_ONLY
257 panels { room: "Back Area" name: "COLOR" }
258 location_room: "Back Area"
259 location_name: "COLOR"
260}
261doors {
262 name: "Butterfly Room Panels"
263 type: LOCATION_ONLY
264 panels { room: "Butterfly Room" name: "DARKNESS" }
265 panels { room: "Butterfly Room" name: "VIBRANT" }
266 location_room: "Butterfly Room"
267 location_name: "DARKNESS, VIBRANT"
253} 268}
diff --git a/data/maps/the_bearer/rooms/Back Area.txtpb b/data/maps/the_bearer/rooms/Back Area.txtpb index bd90b50..2be4cb4 100644 --- a/data/maps/the_bearer/rooms/Back Area.txtpb +++ b/data/maps/the_bearer/rooms/Back Area.txtpb
@@ -1,5 +1,4 @@
1name: "Back Area" 1name: "Back Area"
2display_name: "Back Area"
3panels { 2panels {
4 name: "COLOR" 3 name: "COLOR"
5 path: "Panels/Entry/panel_3" 4 path: "Panels/Entry/panel_3"
@@ -8,13 +7,9 @@ panels {
8 symbols: EXAMPLE 7 symbols: EXAMPLE
9} 8}
10ports { 9ports {
11 name: "TREE"
12 path: "Components/Warps/worldport3"
13 orientation: "north"
14 required_door { name: "Control Center Brown Door" }
15}
16ports {
17 name: "DAEDALUS" 10 name: "DAEDALUS"
11 display_name: "Dark Hallway"
18 path: "Components/Warps/worldport2" 12 path: "Components/Warps/worldport2"
19 orientation: "north" 13 destination { x: 10 y: 0 z: -84.5 }
14 rotation: 180
20} 15}
diff --git a/data/maps/the_bearer/rooms/Blue Animal (View).txtpb b/data/maps/the_bearer/rooms/Blue Animal (View).txtpb index a13ce1d..33c278c 100644 --- a/data/maps/the_bearer/rooms/Blue Animal (View).txtpb +++ b/data/maps/the_bearer/rooms/Blue Animal (View).txtpb
@@ -1,5 +1,4 @@
1name: "Blue Animal (View)" 1name: "Blue Animal (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "HALF" 3 name: "HALF"
5 path: "Panels/Blue/panel_2" 4 path: "Panels/Blue/panel_2"
diff --git a/data/maps/the_bearer/rooms/Blue Animal.txtpb b/data/maps/the_bearer/rooms/Blue Animal.txtpb index 49ac048..e503c93 100644 --- a/data/maps/the_bearer/rooms/Blue Animal.txtpb +++ b/data/maps/the_bearer/rooms/Blue Animal.txtpb
@@ -1,2 +1 @@
1name: "Blue Animal" name: "Blue Animal"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Blue Planet (View).txtpb b/data/maps/the_bearer/rooms/Blue Planet (View).txtpb index 172565b..e745718 100644 --- a/data/maps/the_bearer/rooms/Blue Planet (View).txtpb +++ b/data/maps/the_bearer/rooms/Blue Planet (View).txtpb
@@ -1,5 +1,4 @@
1name: "Blue Planet (View)" 1name: "Blue Planet (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "TUNE" 3 name: "TUNE"
5 path: "Panels/Blue/panel_4" 4 path: "Panels/Blue/panel_4"
diff --git a/data/maps/the_bearer/rooms/Blue Planet.txtpb b/data/maps/the_bearer/rooms/Blue Planet.txtpb index b291c35..b044590 100644 --- a/data/maps/the_bearer/rooms/Blue Planet.txtpb +++ b/data/maps/the_bearer/rooms/Blue Planet.txtpb
@@ -1,2 +1 @@
1name: "Blue Planet" name: "Blue Planet"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Blue Town (View).txtpb b/data/maps/the_bearer/rooms/Blue Town (View).txtpb index f66eae9..f57fc9b 100644 --- a/data/maps/the_bearer/rooms/Blue Town (View).txtpb +++ b/data/maps/the_bearer/rooms/Blue Town (View).txtpb
@@ -1,5 +1,4 @@
1name: "Blue Town (View)" 1name: "Blue Town (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "LICE" 3 name: "LICE"
5 path: "Panels/Blue/panel_3" 4 path: "Panels/Blue/panel_3"
diff --git a/data/maps/the_bearer/rooms/Blue Town.txtpb b/data/maps/the_bearer/rooms/Blue Town.txtpb index b24af76..5ceed12 100644 --- a/data/maps/the_bearer/rooms/Blue Town.txtpb +++ b/data/maps/the_bearer/rooms/Blue Town.txtpb
@@ -1,2 +1 @@
1name: "Blue Town" name: "Blue Town"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Blue Vegetable (View).txtpb b/data/maps/the_bearer/rooms/Blue Vegetable (View).txtpb index f9443fd..cf1ffd3 100644 --- a/data/maps/the_bearer/rooms/Blue Vegetable (View).txtpb +++ b/data/maps/the_bearer/rooms/Blue Vegetable (View).txtpb
@@ -1,5 +1,4 @@
1name: "Blue Vegetable (View)" 1name: "Blue Vegetable (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "THORN" 3 name: "THORN"
5 path: "Panels/Blue/panel_1" 4 path: "Panels/Blue/panel_1"
diff --git a/data/maps/the_bearer/rooms/Blue Vegetable.txtpb b/data/maps/the_bearer/rooms/Blue Vegetable.txtpb index 9034471..64ce77d 100644 --- a/data/maps/the_bearer/rooms/Blue Vegetable.txtpb +++ b/data/maps/the_bearer/rooms/Blue Vegetable.txtpb
@@ -1,2 +1 @@
1name: "Blue Vegetable" name: "Blue Vegetable"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Butterfly Room.txtpb b/data/maps/the_bearer/rooms/Butterfly Room.txtpb index bd20505..a702737 100644 --- a/data/maps/the_bearer/rooms/Butterfly Room.txtpb +++ b/data/maps/the_bearer/rooms/Butterfly Room.txtpb
@@ -1,5 +1,4 @@
1name: "Butterfly Room" 1name: "Butterfly Room"
2display_name: "Back Area"
3panels { 2panels {
4 name: "VIBRANT" 3 name: "VIBRANT"
5 path: "Panels/Entry/panel_4" 4 path: "Panels/Entry/panel_4"
diff --git a/data/maps/the_bearer/rooms/Entry.txtpb b/data/maps/the_bearer/rooms/Entry.txtpb index d7a8db6..517088d 100644 --- a/data/maps/the_bearer/rooms/Entry.txtpb +++ b/data/maps/the_bearer/rooms/Entry.txtpb
@@ -1,5 +1,4 @@
1name: "Entry" 1name: "Entry"
2display_name: "Main Area"
3panels { 2panels {
4 name: "VIEW" 3 name: "VIEW"
5 path: "Panels/Entry/panel_1" 4 path: "Panels/Entry/panel_1"
@@ -58,6 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "UNYIELDING" 59 name: "UNYIELDING"
60 display_name: "Main Entrance"
61 path: "Components/Warps/worldport" 61 path: "Components/Warps/worldport"
62 orientation: "east" 62 destination { x: 3 y: 4 z: 15 }
63 rotation: 90
63} 64}
diff --git a/data/maps/the_bearer/rooms/Green Animal.txtpb b/data/maps/the_bearer/rooms/Green Animal.txtpb index 61522cc..147f825 100644 --- a/data/maps/the_bearer/rooms/Green Animal.txtpb +++ b/data/maps/the_bearer/rooms/Green Animal.txtpb
@@ -1,2 +1 @@
1name: "Green Animal" name: "Green Animal"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Green Planet (View).txtpb b/data/maps/the_bearer/rooms/Green Planet (View).txtpb index 79363bc..4d9f449 100644 --- a/data/maps/the_bearer/rooms/Green Planet (View).txtpb +++ b/data/maps/the_bearer/rooms/Green Planet (View).txtpb
@@ -1,5 +1,4 @@
1name: "Green Planet (View)" 1name: "Green Planet (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "SOIL" 3 name: "SOIL"
5 path: "Panels/Green/panel_4" 4 path: "Panels/Green/panel_4"
diff --git a/data/maps/the_bearer/rooms/Green Planet.txtpb b/data/maps/the_bearer/rooms/Green Planet.txtpb index b97b731..efe000a 100644 --- a/data/maps/the_bearer/rooms/Green Planet.txtpb +++ b/data/maps/the_bearer/rooms/Green Planet.txtpb
@@ -1,2 +1 @@
1name: "Green Planet" name: "Green Planet"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Green Town.txtpb b/data/maps/the_bearer/rooms/Green Town.txtpb index 184ded3..fd80201 100644 --- a/data/maps/the_bearer/rooms/Green Town.txtpb +++ b/data/maps/the_bearer/rooms/Green Town.txtpb
@@ -1,2 +1 @@
1name: "Green Town" name: "Green Town"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Green Vegetable (View).txtpb b/data/maps/the_bearer/rooms/Green Vegetable (View).txtpb index 4bbab5d..98fbbe8 100644 --- a/data/maps/the_bearer/rooms/Green Vegetable (View).txtpb +++ b/data/maps/the_bearer/rooms/Green Vegetable (View).txtpb
@@ -1,5 +1,4 @@
1name: "Green Vegetable (View)" 1name: "Green Vegetable (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "SPIN" 3 name: "SPIN"
5 path: "Panels/Green/panel_1" 4 path: "Panels/Green/panel_1"
diff --git a/data/maps/the_bearer/rooms/Green Vegetable.txtpb b/data/maps/the_bearer/rooms/Green Vegetable.txtpb index ccb817a..051a6d3 100644 --- a/data/maps/the_bearer/rooms/Green Vegetable.txtpb +++ b/data/maps/the_bearer/rooms/Green Vegetable.txtpb
@@ -1,2 +1 @@
1name: "Green Vegetable" name: "Green Vegetable"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Orange Planet.txtpb b/data/maps/the_bearer/rooms/Orange Planet.txtpb index 0fbd929..15fae66 100644 --- a/data/maps/the_bearer/rooms/Orange Planet.txtpb +++ b/data/maps/the_bearer/rooms/Orange Planet.txtpb
@@ -1,5 +1,4 @@
1name: "Orange Planet" 1name: "Orange Planet"
2display_name: "Main Area"
3panels { 2panels {
4 name: "MAR" 3 name: "MAR"
5 path: "Panels/Red/panel_4" 4 path: "Panels/Red/panel_4"
diff --git a/data/maps/the_bearer/rooms/Orange Vegetable.txtpb b/data/maps/the_bearer/rooms/Orange Vegetable.txtpb index d4f7b82..e4d59e6 100644 --- a/data/maps/the_bearer/rooms/Orange Vegetable.txtpb +++ b/data/maps/the_bearer/rooms/Orange Vegetable.txtpb
@@ -1,5 +1,4 @@
1name: "Orange Vegetable" 1name: "Orange Vegetable"
2display_name: "Main Area"
3panels { 2panels {
4 name: "POTATO" 3 name: "POTATO"
5 path: "Panels/Red/panel_1" 4 path: "Panels/Red/panel_1"
diff --git a/data/maps/the_bearer/rooms/Overlook.txtpb b/data/maps/the_bearer/rooms/Overlook.txtpb index 384802c..9eadf8f 100644 --- a/data/maps/the_bearer/rooms/Overlook.txtpb +++ b/data/maps/the_bearer/rooms/Overlook.txtpb
@@ -1,2 +1 @@
1name: "Overlook" name: "Overlook"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Purple Animal (View).txtpb b/data/maps/the_bearer/rooms/Purple Animal (View).txtpb index 7122059..04ae0f8 100644 --- a/data/maps/the_bearer/rooms/Purple Animal (View).txtpb +++ b/data/maps/the_bearer/rooms/Purple Animal (View).txtpb
@@ -1,5 +1,4 @@
1name: "Purple Animal (View)" 1name: "Purple Animal (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "SUNBASS" 3 name: "SUNBASS"
5 path: "Panels/Purple/panel_2" 4 path: "Panels/Purple/panel_2"
diff --git a/data/maps/the_bearer/rooms/Purple Animal.txtpb b/data/maps/the_bearer/rooms/Purple Animal.txtpb index 9ddb70e..1c3a52c 100644 --- a/data/maps/the_bearer/rooms/Purple Animal.txtpb +++ b/data/maps/the_bearer/rooms/Purple Animal.txtpb
@@ -1,2 +1 @@
1name: "Purple Animal" name: "Purple Animal"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Purple Planet (View).txtpb b/data/maps/the_bearer/rooms/Purple Planet (View).txtpb index 4ab506d..bacfae6 100644 --- a/data/maps/the_bearer/rooms/Purple Planet (View).txtpb +++ b/data/maps/the_bearer/rooms/Purple Planet (View).txtpb
@@ -1,5 +1,4 @@
1name: "Purple Planet (View)" 1name: "Purple Planet (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "DOG" 3 name: "DOG"
5 path: "Panels/Purple/panel_4" 4 path: "Panels/Purple/panel_4"
diff --git a/data/maps/the_bearer/rooms/Purple Planet.txtpb b/data/maps/the_bearer/rooms/Purple Planet.txtpb index 37f7ddc..03021d5 100644 --- a/data/maps/the_bearer/rooms/Purple Planet.txtpb +++ b/data/maps/the_bearer/rooms/Purple Planet.txtpb
@@ -1,2 +1 @@
1name: "Purple Planet" name: "Purple Planet"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Purple Town (View).txtpb b/data/maps/the_bearer/rooms/Purple Town (View).txtpb index 40927f4..855e3ea 100644 --- a/data/maps/the_bearer/rooms/Purple Town (View).txtpb +++ b/data/maps/the_bearer/rooms/Purple Town (View).txtpb
@@ -1,5 +1,4 @@
1name: "Purple Town (View)" 1name: "Purple Town (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "GRACEFUL" 3 name: "GRACEFUL"
5 path: "Panels/Purple/panel_3" 4 path: "Panels/Purple/panel_3"
diff --git a/data/maps/the_bearer/rooms/Purple Town.txtpb b/data/maps/the_bearer/rooms/Purple Town.txtpb index 768f378..b077178 100644 --- a/data/maps/the_bearer/rooms/Purple Town.txtpb +++ b/data/maps/the_bearer/rooms/Purple Town.txtpb
@@ -1,2 +1 @@
1name: "Purple Town" name: "Purple Town"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Purple Vegetable (View).txtpb b/data/maps/the_bearer/rooms/Purple Vegetable (View).txtpb index 182a5bb..1a6ab04 100644 --- a/data/maps/the_bearer/rooms/Purple Vegetable (View).txtpb +++ b/data/maps/the_bearer/rooms/Purple Vegetable (View).txtpb
@@ -1,5 +1,4 @@
1name: "Purple Vegetable (View)" 1name: "Purple Vegetable (View)"
2display_name: "Main Area"
3panels { 2panels {
4 name: "AUBERGINE" 3 name: "AUBERGINE"
5 path: "Panels/Purple/panel_1" 4 path: "Panels/Purple/panel_1"
diff --git a/data/maps/the_bearer/rooms/Purple Vegetable.txtpb b/data/maps/the_bearer/rooms/Purple Vegetable.txtpb index ef5dd7e..380b909 100644 --- a/data/maps/the_bearer/rooms/Purple Vegetable.txtpb +++ b/data/maps/the_bearer/rooms/Purple Vegetable.txtpb
@@ -1,2 +1 @@
1name: "Purple Vegetable" name: "Purple Vegetable"
2display_name: "Main Area"
diff --git a/data/maps/the_bearer/rooms/Q2 Room.txtpb b/data/maps/the_bearer/rooms/Q2 Room.txtpb index ab5032a..5cdea80 100644 --- a/data/maps/the_bearer/rooms/Q2 Room.txtpb +++ b/data/maps/the_bearer/rooms/Q2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "Q2 Room" 1name: "Q2 Room"
2display_name: "Back Area"
3letters { 2letters {
4 key: "q" 3 key: "q"
5 level2: true 4 level2: true
diff --git a/data/maps/the_bearer/rooms/Red Animal.txtpb b/data/maps/the_bearer/rooms/Red Animal.txtpb index 845fbed..d5ae244 100644 --- a/data/maps/the_bearer/rooms/Red Animal.txtpb +++ b/data/maps/the_bearer/rooms/Red Animal.txtpb
@@ -1,5 +1,4 @@
1name: "Red Animal" 1name: "Red Animal"
2display_name: "Main Area"
3panels { 2panels {
4 name: "FOOLSHARK" 3 name: "FOOLSHARK"
5 path: "Panels/Orange/panel_2" 4 path: "Panels/Orange/panel_2"
diff --git a/data/maps/the_bearer/rooms/Red Planet.txtpb b/data/maps/the_bearer/rooms/Red Planet.txtpb index 55a105d..dd3f2ec 100644 --- a/data/maps/the_bearer/rooms/Red Planet.txtpb +++ b/data/maps/the_bearer/rooms/Red Planet.txtpb
@@ -1,5 +1,4 @@
1name: "Red Planet" 1name: "Red Planet"
2display_name: "Main Area"
3panels { 2panels {
4 name: "FUEL" 3 name: "FUEL"
5 path: "Panels/Red/panel_3" 4 path: "Panels/Red/panel_3"
diff --git a/data/maps/the_bearer/rooms/Red Town.txtpb b/data/maps/the_bearer/rooms/Red Town.txtpb index 8a29ced..ed608cc 100644 --- a/data/maps/the_bearer/rooms/Red Town.txtpb +++ b/data/maps/the_bearer/rooms/Red Town.txtpb
@@ -1,5 +1,4 @@
1name: "Red Town" 1name: "Red Town"
2display_name: "Main Area"
3panels { 2panels {
4 name: "DESTRUCTION" 3 name: "DESTRUCTION"
5 path: "Panels/Orange/panel_3" 4 path: "Panels/Orange/panel_3"
diff --git a/data/maps/the_bearer/rooms/Red Vegetable.txtpb b/data/maps/the_bearer/rooms/Red Vegetable.txtpb index 1494e26..fb694db 100644 --- a/data/maps/the_bearer/rooms/Red Vegetable.txtpb +++ b/data/maps/the_bearer/rooms/Red Vegetable.txtpb
@@ -1,5 +1,4 @@
1name: "Red Vegetable" 1name: "Red Vegetable"
2display_name: "Main Area"
3panels { 2panels {
4 name: "CARD" 3 name: "CARD"
5 path: "Panels/Red/panel_2" 4 path: "Panels/Red/panel_2"
diff --git a/data/maps/the_bearer/rooms/Tree Entrance.txtpb b/data/maps/the_bearer/rooms/Tree Entrance.txtpb new file mode 100644 index 0000000..1b50ddd --- /dev/null +++ b/data/maps/the_bearer/rooms/Tree Entrance.txtpb
@@ -0,0 +1,8 @@
1name: "Tree Entrance"
2ports {
3 name: "TREE"
4 display_name: "Brown Hallway"
5 path: "Components/Warps/worldport3"
6 destination { x: -19 y: 0 z: -83.5 }
7 rotation: 180
8}
diff --git a/data/maps/the_bearer/rooms/Yellow Planet.txtpb b/data/maps/the_bearer/rooms/Yellow Planet.txtpb index 9c6d39d..7f8a86b 100644 --- a/data/maps/the_bearer/rooms/Yellow Planet.txtpb +++ b/data/maps/the_bearer/rooms/Yellow Planet.txtpb
@@ -1,5 +1,4 @@
1name: "Yellow Planet" 1name: "Yellow Planet"
2display_name: "Main Area"
3panels { 2panels {
4 name: "ZEUS" 3 name: "ZEUS"
5 path: "Panels/Orange/panel_4" 4 path: "Panels/Orange/panel_4"
diff --git a/data/maps/the_bearer/rooms/Yellow Vegetable.txtpb b/data/maps/the_bearer/rooms/Yellow Vegetable.txtpb index 26ef491..f37faa5 100644 --- a/data/maps/the_bearer/rooms/Yellow Vegetable.txtpb +++ b/data/maps/the_bearer/rooms/Yellow Vegetable.txtpb
@@ -1,5 +1,4 @@
1name: "Yellow Vegetable" 1name: "Yellow Vegetable"
2display_name: "Main Area"
3panels { 2panels {
4 name: "CAKE" 3 name: "CAKE"
5 path: "Panels/Orange/panel_1" 4 path: "Panels/Orange/panel_1"
diff --git a/data/maps/the_between/rooms/B2 Back Room.txtpb b/data/maps/the_between/rooms/B2 Back Room.txtpb index 132ba56..0972ed9 100644 --- a/data/maps/the_between/rooms/B2 Back Room.txtpb +++ b/data/maps/the_between/rooms/B2 Back Room.txtpb
@@ -1,5 +1,4 @@
1name: "B2 Back Room" 1name: "B2 Back Room"
2display_name: "B2 Room"
3letters { 2letters {
4 key: "b" 3 key: "b"
5 level2: true 4 level2: true
diff --git a/data/maps/the_between/rooms/B2 Front Room.txtpb b/data/maps/the_between/rooms/B2 Front Room.txtpb index 02c09fb..f23ed20 100644 --- a/data/maps/the_between/rooms/B2 Front Room.txtpb +++ b/data/maps/the_between/rooms/B2 Front Room.txtpb
@@ -1,5 +1,4 @@
1name: "B2 Front Room" 1name: "B2 Front Room"
2display_name: "B2 Room"
3paintings { 2paintings {
4 name: "EYES" 3 name: "EYES"
5 path: "Components/Paintings/eyes" 4 path: "Components/Paintings/eyes"
diff --git a/data/maps/the_between/rooms/Control Center Side.txtpb b/data/maps/the_between/rooms/Control Center Side.txtpb index 81bae60..b308586 100644 --- a/data/maps/the_between/rooms/Control Center Side.txtpb +++ b/data/maps/the_between/rooms/Control Center Side.txtpb
@@ -1,5 +1,4 @@
1name: "Control Center Side" 1name: "Control Center Side"
2display_name: "Control Center Side"
3panels { 2panels {
4 name: "RIGHT" 3 name: "RIGHT"
5 path: "Panels/Helpers/panel_1" 4 path: "Panels/Helpers/panel_1"
@@ -14,11 +13,15 @@ paintings {
14} 13}
15ports { 14ports {
16 name: "CC" 15 name: "CC"
16 display_name: "Lavender Structure"
17 path: "Components/Warps/worldport3" 17 path: "Components/Warps/worldport3"
18 orientation: "north" 18 destination { x: 36 y: 0 z: 1 }
19 rotation: 180
19} 20}
20ports { 21ports {
21 name: "LIVELY" 22 name: "LIVELY"
23 display_name: "Near Painting Worldport"
22 path: "Components/Warps/worldport2" 24 path: "Components/Warps/worldport2"
23 orientation: "south" 25 destination { x: 24 y: 0 z: 6.5 }
26 rotation: 0
24} 27}
diff --git a/data/maps/the_between/rooms/Main Area.txtpb b/data/maps/the_between/rooms/Main Area.txtpb index a8e15a9..898b265 100644 --- a/data/maps/the_between/rooms/Main Area.txtpb +++ b/data/maps/the_between/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Main Area"
3panels { 2panels {
4 name: "NEW" 3 name: "NEW"
5 path: "Panels/Room 1/panel_1" 4 path: "Panels/Room 1/panel_1"
@@ -198,6 +197,8 @@ panels {
198} 197}
199ports { 198ports {
200 name: "GREAT" 199 name: "GREAT"
200 display_name: "Salmon Hallway"
201 path: "Components/Warps/worldport" 201 path: "Components/Warps/worldport"
202 orientation: "east" 202 destination { x: -1 y: 0 z: 20 }
203 rotation: 90
203} 204}
diff --git a/data/maps/the_between/rooms/Plaza Entrance.txtpb b/data/maps/the_between/rooms/Plaza Entrance.txtpb index b99081a..894ebae 100644 --- a/data/maps/the_between/rooms/Plaza Entrance.txtpb +++ b/data/maps/the_between/rooms/Plaza Entrance.txtpb
@@ -1,7 +1,8 @@
1name: "Plaza Entrance" 1name: "Plaza Entrance"
2display_name: "Main Area"
3ports { 2ports {
4 name: "PLAZA" 3 name: "PLAZA"
4 display_name: "Trick or Treat Worldport"
5 path: "Components/Warps/worldport4" 5 path: "Components/Warps/worldport4"
6 orientation: "north" 6 destination { x: -38 y: 0 z: 1 }
7 rotation: 180
7} 8}
diff --git a/data/maps/the_butterfly/doors.txtpb b/data/maps/the_butterfly/doors.txtpb index 987c269..1ebc3a2 100644 --- a/data/maps/the_butterfly/doors.txtpb +++ b/data/maps/the_butterfly/doors.txtpb
@@ -1,4 +1,3 @@
1# TODO: The gallery painting
2doors { 1doors {
3 name: "Panels" 2 name: "Panels"
4 type: EVENT 3 type: EVENT
diff --git a/data/maps/the_butterfly/rooms/Main Area.txtpb b/data/maps/the_butterfly/rooms/Main Area.txtpb index 9a8b3d5..453e64a 100644 --- a/data/maps/the_butterfly/rooms/Main Area.txtpb +++ b/data/maps/the_butterfly/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Main Area"
3panels { 2panels {
4 name: "SPECIES" 3 name: "SPECIES"
5 path: "Panels/Room_1/panel_1" 4 path: "Panels/Room_1/panel_1"
@@ -128,6 +127,8 @@ panels {
128} 127}
129ports { 128ports {
130 name: "GALLERY" 129 name: "GALLERY"
130 display_name: "Worldport"
131 path: "Components/Warps/worldport" 131 path: "Components/Warps/worldport"
132 orientation: "southwest" # uhhhh this is new 132 destination { x: -19 y: 0 z: 19 }
133 rotation: 315
133} 134}
diff --git a/data/maps/the_butterfly/rooms/Mastery.txtpb b/data/maps/the_butterfly/rooms/Mastery.txtpb index f494fde..bbe8742 100644 --- a/data/maps/the_butterfly/rooms/Mastery.txtpb +++ b/data/maps/the_butterfly/rooms/Mastery.txtpb
@@ -1,5 +1,4 @@
1name: "Mastery" 1name: "Mastery"
2display_name: "Main Area"
3masteries { 2masteries {
4 name: "MASTERY" 3 name: "MASTERY"
5 path: "Components/Collectables/collectable" 4 path: "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_colorful/doors.txtpb b/data/maps/the_colorful/doors.txtpb index 32470b2..3ce5f71 100644 --- a/data/maps/the_colorful/doors.txtpb +++ b/data/maps/the_colorful/doors.txtpb
@@ -1,4 +1,3 @@
1# TODO: gallery painting
2doors { 1doors {
3 name: "White Door" 2 name: "White Door"
4 type: STANDARD 3 type: STANDARD
@@ -46,13 +45,14 @@ doors {
46 type: STANDARD 45 type: STANDARD
47 receivers: "Components/Doors/entry_7" 46 receivers: "Components/Doors/entry_7"
48 panels { room: "Yellow Room" name: "CIRCLE" } 47 panels { room: "Yellow Room" name: "CIRCLE" }
49 panels { room: "Purple Room" name: "FISH" } 48 panels { room: "Purple Room" name: "FISH" answer: "fish" }
50 location_room: "Purple Room" 49 location_room: "Purple Room"
51} 50}
52doors { 51doors {
53 name: "Purple Side Entrance" 52 name: "Purple Side Entrance"
54 type: STANDARD 53 type: STANDARD
55 receivers: "Components/Doors/entry_7b3" 54 receivers: "Components/Doors/entry_7b3"
55 receivers: "Components/Doors/entry_7b4"
56 panels { room: "Cyan Hallway" name: "KOI" } 56 panels { room: "Cyan Hallway" name: "KOI" }
57 panels { room: "Cyan Hallway" name: "WISH" } 57 panels { room: "Cyan Hallway" name: "WISH" }
58 location_room: "Cyan Hallway" 58 location_room: "Cyan Hallway"
@@ -103,3 +103,10 @@ doors {
103 panels { room: "Gray Room" name: "MEND" } 103 panels { room: "Gray Room" name: "MEND" }
104 location_room: "Gray Room" 104 location_room: "Gray Room"
105} 105}
106doors {
107 name: "Chaos Panel"
108 type: LOCATION_ONLY
109 panels { room: "Cyan Hallway" name: "CHAOS" }
110 location_room: "Cyan Hallway"
111 location_name: "CHAOS"
112}
diff --git a/data/maps/the_colorful/rooms/Black Room.txtpb b/data/maps/the_colorful/rooms/Black Room.txtpb index 75aec81..21a0d41 100644 --- a/data/maps/the_colorful/rooms/Black Room.txtpb +++ b/data/maps/the_colorful/rooms/Black Room.txtpb
@@ -1,5 +1,4 @@
1name: "Black Room" 1name: "Black Room"
2display_name: "Black Room"
3panels { 2panels {
4 name: "STARK" 3 name: "STARK"
5 path: "Panels/Hallway/panel_2" 4 path: "Panels/Hallway/panel_2"
diff --git a/data/maps/the_colorful/rooms/Blue Room.txtpb b/data/maps/the_colorful/rooms/Blue Room.txtpb index c334f6e..ec9337d 100644 --- a/data/maps/the_colorful/rooms/Blue Room.txtpb +++ b/data/maps/the_colorful/rooms/Blue Room.txtpb
@@ -1,5 +1,4 @@
1name: "Blue Room" 1name: "Blue Room"
2display_name: "Blue Room"
3panels { 2panels {
4 name: "VINE" 3 name: "VINE"
5 path: "Panels/Hallway/panel_4" 4 path: "Panels/Hallway/panel_4"
diff --git a/data/maps/the_colorful/rooms/Brown Room.txtpb b/data/maps/the_colorful/rooms/Brown Room.txtpb index 8eec879..a5f590b 100644 --- a/data/maps/the_colorful/rooms/Brown Room.txtpb +++ b/data/maps/the_colorful/rooms/Brown Room.txtpb
@@ -1,5 +1,4 @@
1name: "Brown Room" 1name: "Brown Room"
2display_name: "Brown Room"
3panels { 2panels {
4 name: "FIRE" 3 name: "FIRE"
5 path: "Panels/Hallway/panel_9" 4 path: "Panels/Hallway/panel_9"
diff --git a/data/maps/the_colorful/rooms/Cyan Hallway.txtpb b/data/maps/the_colorful/rooms/Cyan Hallway.txtpb index d6a2425..d94a0a6 100644 --- a/data/maps/the_colorful/rooms/Cyan Hallway.txtpb +++ b/data/maps/the_colorful/rooms/Cyan Hallway.txtpb
@@ -1,5 +1,4 @@
1name: "Cyan Hallway" 1name: "Cyan Hallway"
2display_name: "Cyan Hallway"
3panels { 2panels {
4 name: "KOI" 3 name: "KOI"
5 path: "Panels/Extra/panel_12" 4 path: "Panels/Extra/panel_12"
@@ -24,11 +23,15 @@ panels {
24} 23}
25ports { 24ports {
26 name: "STURDY" 25 name: "STURDY"
26 display_name: "North Cyan Worldport"
27 path: "Components/Warps/worldport3" 27 path: "Components/Warps/worldport3"
28 orientation: "west" 28 destination { x: -17 y: 0 z: -75 }
29 rotation: 270
29} 30}
30ports { 31ports {
31 name: "DARKROOM" 32 name: "DARKROOM"
33 display_name: "South Cyan Worldport"
32 path: "Components/Warps/worldport2" 34 path: "Components/Warps/worldport2"
33 orientation: "west" 35 destination { x: -17 y: 0 z: -51 }
36 rotation: 270
34} 37}
diff --git a/data/maps/the_colorful/rooms/Cyan Room.txtpb b/data/maps/the_colorful/rooms/Cyan Room.txtpb index 09150ab..3568ec1 100644 --- a/data/maps/the_colorful/rooms/Cyan Room.txtpb +++ b/data/maps/the_colorful/rooms/Cyan Room.txtpb
@@ -1,5 +1,4 @@
1name: "Cyan Room" 1name: "Cyan Room"
2display_name: "Cyan Room"
3panels { 2panels {
4 name: "BROTHER" 3 name: "BROTHER"
5 path: "Panels/Cyan/panel_cyan_1" 4 path: "Panels/Cyan/panel_cyan_1"
diff --git a/data/maps/the_colorful/rooms/Ending.txtpb b/data/maps/the_colorful/rooms/Ending.txtpb index 060e72e..3aa2b3c 100644 --- a/data/maps/the_colorful/rooms/Ending.txtpb +++ b/data/maps/the_colorful/rooms/Ending.txtpb
@@ -1,5 +1,4 @@
1name: "Ending" 1name: "Ending"
2display_name: "Ending"
3endings { 2endings {
4 name: "GRAY" 3 name: "GRAY"
5 path: "Components/Endings/gray_ending" 4 path: "Components/Endings/gray_ending"
diff --git a/data/maps/the_colorful/rooms/Gray Room.txtpb b/data/maps/the_colorful/rooms/Gray Room.txtpb index 9d62ebf..6ae6c9c 100644 --- a/data/maps/the_colorful/rooms/Gray Room.txtpb +++ b/data/maps/the_colorful/rooms/Gray Room.txtpb
@@ -1,5 +1,4 @@
1name: "Gray Room" 1name: "Gray Room"
2display_name: "Gray Room"
3panels { 2panels {
4 name: "MEND" 3 name: "MEND"
5 path: "Panels/Hallway/panel_11" 4 path: "Panels/Hallway/panel_11"
diff --git a/data/maps/the_colorful/rooms/Green Room.txtpb b/data/maps/the_colorful/rooms/Green Room.txtpb index 3e9dfd5..e438176 100644 --- a/data/maps/the_colorful/rooms/Green Room.txtpb +++ b/data/maps/the_colorful/rooms/Green Room.txtpb
@@ -1,5 +1,4 @@
1name: "Green Room" 1name: "Green Room"
2display_name: "Green Room"
3panels { 2panels {
4 name: "MOTHER" 3 name: "MOTHER"
5 path: "Panels/Hallway/panel_5" 4 path: "Panels/Hallway/panel_5"
diff --git a/data/maps/the_colorful/rooms/Orange Room.txtpb b/data/maps/the_colorful/rooms/Orange Room.txtpb index b8aa5f8..6728080 100644 --- a/data/maps/the_colorful/rooms/Orange Room.txtpb +++ b/data/maps/the_colorful/rooms/Orange Room.txtpb
@@ -1,5 +1,4 @@
1name: "Orange Room" 1name: "Orange Room"
2display_name: "Orange Room"
3panels { 2panels {
4 name: "CLOUD" 3 name: "CLOUD"
5 path: "Panels/Hallway/panel_8" 4 path: "Panels/Hallway/panel_8"
diff --git a/data/maps/the_colorful/rooms/P2 Room.txtpb b/data/maps/the_colorful/rooms/P2 Room.txtpb index 85dbf20..054d4b4 100644 --- a/data/maps/the_colorful/rooms/P2 Room.txtpb +++ b/data/maps/the_colorful/rooms/P2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "P2 Room" 1name: "P2 Room"
2display_name: "Cyan Room"
3letters { 2letters {
4 key: "p" 3 key: "p"
5 level2: true 4 level2: true
diff --git a/data/maps/the_colorful/rooms/Purple Room.txtpb b/data/maps/the_colorful/rooms/Purple Room.txtpb index 4175c8d..71b6ad6 100644 --- a/data/maps/the_colorful/rooms/Purple Room.txtpb +++ b/data/maps/the_colorful/rooms/Purple Room.txtpb
@@ -1,10 +1,10 @@
1name: "Purple Room" 1name: "Purple Room"
2display_name: "Purple Room"
3panels { 2panels {
4 name: "FISH" 3 name: "FISH"
5 path: "Panels/Hallway/panel_7" 4 path: "Panels/Hallway/panel_7"
6 clue: "fish" 5 clue: "fish"
7 answer: "fish" 6 answer: "fish"
8 symbols: PLANET 7 symbols: PLANET
8 proxies { answer: "fish" path: "Panels/Hallway/panel_7a" }
9 proxies { answer: "fishes" path: "Panels/Hallway/panel_7b" } 9 proxies { answer: "fishes" path: "Panels/Hallway/panel_7b" }
10} 10}
diff --git a/data/maps/the_colorful/rooms/Red Room.txtpb b/data/maps/the_colorful/rooms/Red Room.txtpb index 4d262e4..53bbd3a 100644 --- a/data/maps/the_colorful/rooms/Red Room.txtpb +++ b/data/maps/the_colorful/rooms/Red Room.txtpb
@@ -1,5 +1,4 @@
1name: "Red Room" 1name: "Red Room"
2display_name: "Red Room"
3panels { 2panels {
4 name: "SANDWICH" 3 name: "SANDWICH"
5 path: "Panels/Hallway/panel_3" 4 path: "Panels/Hallway/panel_3"
diff --git a/data/maps/the_colorful/rooms/White Room.txtpb b/data/maps/the_colorful/rooms/White Room.txtpb index 497ecff..73557ed 100644 --- a/data/maps/the_colorful/rooms/White Room.txtpb +++ b/data/maps/the_colorful/rooms/White Room.txtpb
@@ -1,5 +1,4 @@
1name: "White Room" 1name: "White Room"
2display_name: "White Room"
3panels { 2panels {
4 name: "BRIGHT" 3 name: "BRIGHT"
5 path: "Panels/Hallway/panel_1" 4 path: "Panels/Hallway/panel_1"
@@ -9,6 +8,8 @@ panels {
9} 8}
10ports { 9ports {
11 name: "GREAT" 10 name: "GREAT"
11 display_name: "Main Entrance"
12 path: "Components/Warps/worldport" 12 path: "Components/Warps/worldport"
13 orientation: "west" 13 destination { x: -3.5 y: 0 z: 19 }
14 rotation: 270
14} 15}
diff --git a/data/maps/the_colorful/rooms/Window Room.txtpb b/data/maps/the_colorful/rooms/Window Room.txtpb index 9e3f8f4..e11d88c 100644 --- a/data/maps/the_colorful/rooms/Window Room.txtpb +++ b/data/maps/the_colorful/rooms/Window Room.txtpb
@@ -1,5 +1,4 @@
1name: "Window Room" 1name: "Window Room"
2display_name: "Window Room"
3panels { 2panels {
4 name: "FADING" 3 name: "FADING"
5 path: "Panels/Hallway/panel_10" 4 path: "Panels/Hallway/panel_10"
diff --git a/data/maps/the_colorful/rooms/Yellow Room.txtpb b/data/maps/the_colorful/rooms/Yellow Room.txtpb index c65e886..40a4b14 100644 --- a/data/maps/the_colorful/rooms/Yellow Room.txtpb +++ b/data/maps/the_colorful/rooms/Yellow Room.txtpb
@@ -1,5 +1,4 @@
1name: "Yellow Room" 1name: "Yellow Room"
2display_name: "Yellow Room"
3panels { 2panels {
4 name: "CIRCLE" 3 name: "CIRCLE"
5 path: "Panels/Hallway/panel_6" 4 path: "Panels/Hallway/panel_6"
diff --git a/data/maps/the_congruent/doors.txtpb b/data/maps/the_congruent/doors.txtpb index 7c21f55..fab8d95 100644 --- a/data/maps/the_congruent/doors.txtpb +++ b/data/maps/the_congruent/doors.txtpb
@@ -1,12 +1,22 @@
1doors { 1doors {
2 name: "Obverse Magenta Door" 2 name: "Obverse Magenta Door"
3 type: STANDARD 3 type: ITEM_ONLY
4 legacy_location: true
4 receivers: "Components/Doors/magenta_enterer2" 5 receivers: "Components/Doors/magenta_enterer2"
5 panels { room: "Main Area" name: "LAKE" } 6 panels { room: "Main Area" name: "LAKE" }
6 panels { room: "Main Area" name: "DIE" } 7 panels { room: "Main Area" name: "DIE" }
7 location_room: "Main Area" 8 location_room: "Main Area"
8} 9}
9doors { 10doors {
11 name: "Main Area Puzzles"
12 type: LOCATION_ONLY
13 panels { room: "Main Area" name: "LAKE" }
14 panels { room: "Main Area" name: "DIE" }
15 panels { room: "Main Area" name: "LIGHT" }
16 location_room: "Main Area"
17 location_name: "DIE, LAKE, LIGHT"
18}
19doors {
10 name: "Flipped Magenta Door" 20 name: "Flipped Magenta Door"
11 type: STANDARD 21 type: STANDARD
12 receivers: "Components/Doors/magenta_enterer" 22 receivers: "Components/Doors/magenta_enterer"
@@ -17,6 +27,7 @@ doors {
17 panels { room: "Main Area" name: "LABS (1)" } 27 panels { room: "Main Area" name: "LABS (1)" }
18 panels { room: "Main Area" name: "LABS (2)" } 28 panels { room: "Main Area" name: "LABS (2)" }
19 location_room: "Main Area" 29 location_room: "Main Area"
30 location_name: "Obverse Cyan Large Room"
20} 31}
21doors { 32doors {
22 name: "Flipped Yellow Door" 33 name: "Flipped Yellow Door"
@@ -33,6 +44,7 @@ doors {
33 panels { room: "Flipped Magenta Room" name: "LUST" } 44 panels { room: "Flipped Magenta Room" name: "LUST" }
34 panels { room: "Flipped Magenta Room" name: "LAND" } 45 panels { room: "Flipped Magenta Room" name: "LAND" }
35 location_room: "Flipped Magenta Room" 46 location_room: "Flipped Magenta Room"
47 location_name: "Flipped Magenta Room"
36} 48}
37doors { 49doors {
38 name: "C Keyholder Blocker" 50 name: "C Keyholder Blocker"
@@ -47,6 +59,7 @@ doors {
47 panels { room: "Flipped Yellow Room" name: "CAVE (1)" } 59 panels { room: "Flipped Yellow Room" name: "CAVE (1)" }
48 panels { room: "Flipped Yellow Room" name: "CAVE (2)" } 60 panels { room: "Flipped Yellow Room" name: "CAVE (2)" }
49 location_room: "Flipped Yellow Room" 61 location_room: "Flipped Yellow Room"
62 location_name: "Flipped Yellow Room"
50} 63}
51doors { 64doors {
52 name: "C2 Door" 65 name: "C2 Door"
@@ -59,6 +72,7 @@ doors {
59 key: "c" 72 key: "c"
60 } 73 }
61 location_room: "C Keyholder" 74 location_room: "C Keyholder"
75 location_name: "C Keyholder"
62} 76}
63doors { 77doors {
64 name: "Obverse Yellow Door" 78 name: "Obverse Yellow Door"
@@ -111,10 +125,15 @@ doors {
111 key: "g" 125 key: "g"
112 } 126 }
113 location_room: "G Keyholder" 127 location_room: "G Keyholder"
128 location_name: "G Keyholder"
114} 129}
115doors { 130doors {
116 name: "T Keyholder Blocker" 131 name: "T Keyholder Blocker"
117 type: ITEM_ONLY 132 type: EVENT
118 receivers: "Components/Doors/magenta_enterer3" 133 receivers: "Components/Doors/magenta_enterer3"
119 switches: "lavender_cubes" 134 panels {
135 map: "the_ancient"
136 room: "Inside"
137 name: "COLOR"
138 }
120} 139}
diff --git a/data/maps/the_congruent/metadata.txtpb b/data/maps/the_congruent/metadata.txtpb index 16428c4..6260ed4 100644 --- a/data/maps/the_congruent/metadata.txtpb +++ b/data/maps/the_congruent/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Congruent" 1display_name: "The Congruent"
2worldport_entrance {
3 room: "Main Area"
4 name: "DARKROOM"
5}
diff --git a/data/maps/the_congruent/rooms/C Keyholder.txtpb b/data/maps/the_congruent/rooms/C Keyholder.txtpb index 0af0f32..d9a8cf2 100644 --- a/data/maps/the_congruent/rooms/C Keyholder.txtpb +++ b/data/maps/the_congruent/rooms/C Keyholder.txtpb
@@ -1,7 +1,5 @@
1name: "C Keyholder" 1name: "C Keyholder"
2display_name: "Main Area"
3keyholders { 2keyholders {
4 name: "C" 3 name: "C"
5 path: "Components/KeyHolders/keyHolder" 4 path: "Components/KeyHolders/keyHolder"
6 # TODO: This will need to be modified so that it doesn't actually take the letter.
7} 5}
diff --git a/data/maps/the_congruent/rooms/C2 Room.txtpb b/data/maps/the_congruent/rooms/C2 Room.txtpb index 852d4e2..ff53ebd 100644 --- a/data/maps/the_congruent/rooms/C2 Room.txtpb +++ b/data/maps/the_congruent/rooms/C2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "C2 Room" 1name: "C2 Room"
2display_name: "Main Area"
3letters { 2letters {
4 key: "c" 3 key: "c"
5 level2: true 4 level2: true
diff --git a/data/maps/the_congruent/rooms/Flipped Magenta Room.txtpb b/data/maps/the_congruent/rooms/Flipped Magenta Room.txtpb index 402e9e0..a51b667 100644 --- a/data/maps/the_congruent/rooms/Flipped Magenta Room.txtpb +++ b/data/maps/the_congruent/rooms/Flipped Magenta Room.txtpb
@@ -1,5 +1,4 @@
1name: "Flipped Magenta Room" 1name: "Flipped Magenta Room"
2display_name: "Flipped Magenta Room"
3panels { 2panels {
4 name: "LOOK" 3 name: "LOOK"
5 path: "Panels/Side Up 1/panel_1" 4 path: "Panels/Side Up 1/panel_1"
diff --git a/data/maps/the_congruent/rooms/Flipped Yellow Room.txtpb b/data/maps/the_congruent/rooms/Flipped Yellow Room.txtpb index 3952373..b407f0d 100644 --- a/data/maps/the_congruent/rooms/Flipped Yellow Room.txtpb +++ b/data/maps/the_congruent/rooms/Flipped Yellow Room.txtpb
@@ -1,5 +1,4 @@
1name: "Flipped Yellow Room" 1name: "Flipped Yellow Room"
2display_name: "Flipped Yellow Room"
3panels { 2panels {
4 name: "DANCER" 3 name: "DANCER"
5 path: "Panels/Back 1/panel_1" 4 path: "Panels/Back 1/panel_1"
diff --git a/data/maps/the_congruent/rooms/G Keyholder.txtpb b/data/maps/the_congruent/rooms/G Keyholder.txtpb index c52d7ba..cd12419 100644 --- a/data/maps/the_congruent/rooms/G Keyholder.txtpb +++ b/data/maps/the_congruent/rooms/G Keyholder.txtpb
@@ -1,7 +1,5 @@
1name: "G Keyholder" 1name: "G Keyholder"
2display_name: "Obverse Yellow Room"
3keyholders { 2keyholders {
4 name: "G" 3 name: "G"
5 path: "Components/KeyHolders/keyHolder2" 4 path: "Components/KeyHolders/keyHolder2"
6 # TODO: This will need to be modified so that it doesn't actually take the letter.
7} 5}
diff --git a/data/maps/the_congruent/rooms/G2 Room.txtpb b/data/maps/the_congruent/rooms/G2 Room.txtpb index 80a23cb..25490a8 100644 --- a/data/maps/the_congruent/rooms/G2 Room.txtpb +++ b/data/maps/the_congruent/rooms/G2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "G2 Room" 1name: "G2 Room"
2display_name: "Main Area"
3letters { 2letters {
4 key: "g" 3 key: "g"
5 level2: true 4 level2: true
diff --git a/data/maps/the_congruent/rooms/Main Area.txtpb b/data/maps/the_congruent/rooms/Main Area.txtpb index a783eab..2b3f62e 100644 --- a/data/maps/the_congruent/rooms/Main Area.txtpb +++ b/data/maps/the_congruent/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Main Area"
3panels { 2panels {
4 name: "LANE (1)" 3 name: "LANE (1)"
5 path: "Panels/Main/panel_1" 4 path: "Panels/Main/panel_1"
@@ -86,8 +85,10 @@ panels {
86} 85}
87ports { 86ports {
88 name: "DARKROOM" 87 name: "DARKROOM"
88 display_name: "Entrance"
89 path: "Components/Warps/worldport2" 89 path: "Components/Warps/worldport2"
90 orientation: "north" 90 destination { x: -19 y: 0 z: 7.5 }
91 rotation: 180
91} 92}
92paintings { 93paintings {
93 name: "P" 94 name: "P"
diff --git a/data/maps/the_congruent/rooms/Obverse Magenta Room.txtpb b/data/maps/the_congruent/rooms/Obverse Magenta Room.txtpb index b69a4d4..895c4da 100644 --- a/data/maps/the_congruent/rooms/Obverse Magenta Room.txtpb +++ b/data/maps/the_congruent/rooms/Obverse Magenta Room.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Magenta Room" 1name: "Obverse Magenta Room"
2display_name: "Obverse Magenta Room"
3# TODO: Should these two maybe not be randomizable because they hint the keyholder? 2# TODO: Should these two maybe not be randomizable because they hint the keyholder?
4paintings { 3paintings {
5 name: "TEA" 4 name: "TEA"
diff --git a/data/maps/the_congruent/rooms/Obverse Yellow Room.txtpb b/data/maps/the_congruent/rooms/Obverse Yellow Room.txtpb index 334df67..c87efdf 100644 --- a/data/maps/the_congruent/rooms/Obverse Yellow Room.txtpb +++ b/data/maps/the_congruent/rooms/Obverse Yellow Room.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Yellow Room" 1name: "Obverse Yellow Room"
2display_name: "Obverse Yellow Room"
3panels { 2panels {
4 name: "CIVIL" 3 name: "CIVIL"
5 path: "Panels/Main/panel_6" 4 path: "Panels/Main/panel_6"
diff --git a/data/maps/the_congruent/rooms/T Keyholder.txtpb b/data/maps/the_congruent/rooms/T Keyholder.txtpb index 1cfd2bd..143ea53 100644 --- a/data/maps/the_congruent/rooms/T Keyholder.txtpb +++ b/data/maps/the_congruent/rooms/T Keyholder.txtpb
@@ -1,6 +1,6 @@
1name: "T Keyholder" 1name: "T Keyholder"
2display_name: "Obverse Magenta Room"
3keyholders { 2keyholders {
4 name: "T" 3 name: "T"
5 path: "Components/KeyHolders/keyHolderT" 4 path: "Components/KeyHolders/keyHolderT"
5 key: "t"
6} 6}
diff --git a/data/maps/the_crystalline/connections.txtpb b/data/maps/the_crystalline/connections.txtpb new file mode 100644 index 0000000..131335a --- /dev/null +++ b/data/maps/the_crystalline/connections.txtpb
@@ -0,0 +1,26 @@
1connections {
2 from_room: "Main Area"
3 to_room: "Painting Divot"
4 door { name: "Checkpoint Panels" }
5 oneway: true
6}
7connections {
8 from {
9 painting {
10 room: "Painting Divot"
11 name: "SNAKE"
12 }
13 }
14 to {
15 painting {
16 room: "Flip Area"
17 name: "SNAKE2"
18 }
19 }
20 oneway: true
21}
22connections {
23 from_room: "Flip Area"
24 to_room: "Mastery"
25 door { name: "Mastery" }
26}
diff --git a/data/maps/the_crystalline/doors.txtpb b/data/maps/the_crystalline/doors.txtpb new file mode 100644 index 0000000..5930463 --- /dev/null +++ b/data/maps/the_crystalline/doors.txtpb
@@ -0,0 +1,14 @@
1doors {
2 name: "Mastery"
3 type: EVENT
4 panels { room: "Flip Area" name: "SUCCEED" }
5}
6doors {
7 name: "Checkpoint Panels"
8 type: LOCATION_ONLY
9 panels { room: "Main Area" name: "DROP" }
10 panels { room: "Main Area" name: "LEAP" }
11 panels { room: "Main Area" name: "SPIN" }
12 location_room: "Main Area"
13 location_name: "DROP, LEAP, SPIN"
14}
diff --git a/data/maps/the_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_darkroom/connections.txtpb b/data/maps/the_darkroom/connections.txtpb index 4093585..43bca70 100644 --- a/data/maps/the_darkroom/connections.txtpb +++ b/data/maps/the_darkroom/connections.txtpb
@@ -1,7 +1,12 @@
1connections { 1connections {
2 from_room: "First Room"
3 to_room: "First Room Exit"
4 door { name: "Second Room Entrance" }
5}
6connections {
2 from { 7 from {
3 port { 8 port {
4 room: "First Room" 9 room: "First Room Exit"
5 name: "NEXT" 10 name: "NEXT"
6 } 11 }
7 } 12 }
@@ -14,9 +19,14 @@ connections {
14 oneway: true 19 oneway: true
15} 20}
16connections { 21connections {
22 from_room: "Second Room"
23 to_room: "Second Room Exit"
24 door { name: "Third Room Entrance" }
25}
26connections {
17 from { 27 from {
18 port { 28 port {
19 room: "Second Room" 29 room: "Second Room Exit"
20 name: "NEXT" 30 name: "NEXT"
21 } 31 }
22 } 32 }
@@ -33,3 +43,18 @@ connections {
33 to_room: "S Room" 43 to_room: "S Room"
34 door { name: "S1 Door" } 44 door { name: "S1 Door" }
35} 45}
46connections {
47 from_room: "First Room"
48 to_room: "Cyan Hallway"
49 door { name: "Colorful Entrance" }
50}
51connections {
52 from_room: "Second Room"
53 to_room: "Congruent Entrance"
54 door { name: "Congruent Entrance" }
55}
56connections {
57 from_room: "First Room"
58 to_room: "Double Sided Entrance"
59 door { name: "Double Sided Entrance" }
60}
diff --git a/data/maps/the_darkroom/doors.txtpb b/data/maps/the_darkroom/doors.txtpb index bbf6a1d..c4a47a0 100644 --- a/data/maps/the_darkroom/doors.txtpb +++ b/data/maps/the_darkroom/doors.txtpb
@@ -1,11 +1,9 @@
1# TODO: gallery painting
2doors { 1doors {
3 name: "Double Letter Panel Blockers" 2 name: "Double Letter Panel Blockers"
4 type: ITEM_ONLY 3 type: EVENT
5 receivers: "Panels/Room 1/panel_3/visibilityListener" 4 receivers: "Panels/Room 1/panel_3/visibilityListener"
6 receivers: "Panels/Room 2/panel_3/visibilityListener" 5 receivers: "Panels/Room 2/panel_3/visibilityListener"
7 # TODO: honestly idk if this should even exist 6 double_letters: true
8 switches: "double_letters"
9} 7}
10doors { 8doors {
11 name: "Second Room Entrance" 9 name: "Second Room Entrance"
@@ -23,8 +21,7 @@ doors {
23} 21}
24doors { 22doors {
25 name: "S1 Door" 23 name: "S1 Door"
26 type: LOCATION_ONLY 24 type: EVENT
27 receivers: "Components/Doors/entry_3"
28 panels { room: "Third Room" name: "CULTS" } 25 panels { room: "Third Room" name: "CULTS" }
29 panels { room: "Third Room" name: "TURNS" } 26 panels { room: "Third Room" name: "TURNS" }
30 panels { room: "Third Room" name: "COINS" } 27 panels { room: "Third Room" name: "COINS" }
@@ -34,7 +31,6 @@ doors {
34 panels { room: "Third Room" name: "LOCKS" } 31 panels { room: "Third Room" name: "LOCKS" }
35 panels { room: "Third Room" name: "TOUCHES" } 32 panels { room: "Third Room" name: "TOUCHES" }
36 panels { room: "Third Room" name: "KOI" } 33 panels { room: "Third Room" name: "KOI" }
37 location_room: "Third Room"
38} 34}
39doors { 35doors {
40 name: "Colorful Entrance" 36 name: "Colorful Entrance"
@@ -46,6 +42,7 @@ doors {
46 panels { room: "First Room" name: "KOI" } 42 panels { room: "First Room" name: "KOI" }
47 panels { room: "First Room" name: "TUNA" } 43 panels { room: "First Room" name: "TUNA" }
48 location_room: "First Room" 44 location_room: "First Room"
45 location_name: "All Puzzles"
49} 46}
50doors { 47doors {
51 name: "Congruent Entrance" 48 name: "Congruent Entrance"
@@ -57,6 +54,7 @@ doors {
57 panels { room: "Second Room" name: "KOI" } 54 panels { room: "Second Room" name: "KOI" }
58 panels { room: "Second Room" name: "TUNA" } 55 panels { room: "Second Room" name: "TUNA" }
59 location_room: "Second Room" 56 location_room: "Second Room"
57 location_name: "All Puzzles"
60} 58}
61doors { 59doors {
62 name: "Double Sided Entrance" 60 name: "Double Sided Entrance"
diff --git a/data/maps/the_darkroom/rooms/Congruent Entrance.txtpb b/data/maps/the_darkroom/rooms/Congruent Entrance.txtpb new file mode 100644 index 0000000..e6600a2 --- /dev/null +++ b/data/maps/the_darkroom/rooms/Congruent Entrance.txtpb
@@ -0,0 +1,9 @@
1name: "Congruent Entrance"
2panel_display_name: "Second Room"
3ports {
4 name: "CONGRUENT"
5 display_name: "Second Room Gray Hallway"
6 path: "Components/Warps/worldport7"
7 destination { x: 51.5 y: 0 z: 29 }
8 rotation: 90
9}
diff --git a/data/maps/the_darkroom/rooms/Cyan Hallway.txtpb b/data/maps/the_darkroom/rooms/Cyan Hallway.txtpb new file mode 100644 index 0000000..bce0e5b --- /dev/null +++ b/data/maps/the_darkroom/rooms/Cyan Hallway.txtpb
@@ -0,0 +1,9 @@
1name: "Cyan Hallway"
2panel_display_name: "First Room"
3ports {
4 name: "COLORFUL"
5 display_name: "First Room Cyan Hallway"
6 path: "Components/Warps/worldport8"
7 destination { x: 20 y: 0 z: -12 }
8 rotation: 180
9}
diff --git a/data/maps/the_darkroom/rooms/Double Sided Entrance.txtpb b/data/maps/the_darkroom/rooms/Double Sided Entrance.txtpb new file mode 100644 index 0000000..79ca839 --- /dev/null +++ b/data/maps/the_darkroom/rooms/Double Sided Entrance.txtpb
@@ -0,0 +1,9 @@
1name: "Double Sided Entrance"
2panel_display_name: "First Room"
3ports {
4 name: "DOUBLESIDED"
5 display_name: "First Room White Hallway"
6 path: "Components/Warps/worldport6"
7 destination { x: 15 y: 0 z: 23 }
8 rotation: 90
9}
diff --git a/data/maps/the_darkroom/rooms/First Room Exit.txtpb b/data/maps/the_darkroom/rooms/First Room Exit.txtpb new file mode 100644 index 0000000..4a7ebc2 --- /dev/null +++ b/data/maps/the_darkroom/rooms/First Room Exit.txtpb
@@ -0,0 +1,9 @@
1name: "First Room Exit"
2panel_display_name: "First Room"
3ports {
4 name: "NEXT"
5 display_name: "First Room Exit"
6 path: "Components/Warps/worldport2"
7 destination { x: 0 y: 0 z: -15 }
8 rotation: 180
9}
diff --git a/data/maps/the_darkroom/rooms/First Room.txtpb b/data/maps/the_darkroom/rooms/First Room.txtpb index f79d055..1113435 100644 --- a/data/maps/the_darkroom/rooms/First Room.txtpb +++ b/data/maps/the_darkroom/rooms/First Room.txtpb
@@ -1,5 +1,5 @@
1name: "First Room" 1name: "First Room"
2display_name: "First Room" 2panel_display_name: "First Room"
3panels { 3panels {
4 name: "BISON" 4 name: "BISON"
5 path: "Panels/Room 1/panel_1" 5 path: "Panels/Room 1/panel_1"
@@ -33,24 +33,8 @@ panels {
33} 33}
34ports { 34ports {
35 name: "ENTRY" 35 name: "ENTRY"
36 display_name: "First Room Entrance"
36 path: "Components/Warps/worldport" 37 path: "Components/Warps/worldport"
37 orientation: "south" 38 destination { x: -10 y: 0 z: 10 }
38} 39 rotation: 0
39ports {
40 name: "NEXT"
41 path: "Components/Warps/worldport2"
42 orientation: "north"
43 required_door { name: "Second Room Entrance" }
44}
45ports {
46 name: "COLORFUL"
47 path: "Components/Warps/worldport8"
48 orientation: "north"
49 required_door { name: "Colorful Entrance" }
50}
51ports {
52 name: "DOUBLESIDED"
53 path: "Components/Warps/worldport6"
54 orientation: "east"
55 required_door { name: "Double Sided Entrance" }
56} 40}
diff --git a/data/maps/the_darkroom/rooms/S Room.txtpb b/data/maps/the_darkroom/rooms/S Room.txtpb index 0f56af1..9960b86 100644 --- a/data/maps/the_darkroom/rooms/S Room.txtpb +++ b/data/maps/the_darkroom/rooms/S Room.txtpb
@@ -1,5 +1,4 @@
1name: "S Room" 1name: "S Room"
2display_name: "Third Room"
3letters { 2letters {
4 key: "s" 3 key: "s"
5 path: "Components/Collectables/collectable" 4 path: "Components/Collectables/collectable"
diff --git a/data/maps/the_darkroom/rooms/Second Room Exit.txtpb b/data/maps/the_darkroom/rooms/Second Room Exit.txtpb new file mode 100644 index 0000000..d500691 --- /dev/null +++ b/data/maps/the_darkroom/rooms/Second Room Exit.txtpb
@@ -0,0 +1,9 @@
1name: "Second Room Exit"
2panel_display_name: "Second Room"
3ports {
4 name: "NEXT"
5 display_name: "Second Room Exit"
6 path: "Components/Warps/worldport4"
7 destination { x: 48 y: 0 z: -15 }
8 rotation: 180
9}
diff --git a/data/maps/the_darkroom/rooms/Second Room.txtpb b/data/maps/the_darkroom/rooms/Second Room.txtpb index ce780f3..2219895 100644 --- a/data/maps/the_darkroom/rooms/Second Room.txtpb +++ b/data/maps/the_darkroom/rooms/Second Room.txtpb
@@ -1,5 +1,5 @@
1name: "Second Room" 1name: "Second Room"
2display_name: "Second Room" 2panel_display_name: "Second Room"
3panels { 3panels {
4 name: "BISON" 4 name: "BISON"
5 path: "Panels/Room 2/panel_1" 5 path: "Panels/Room 2/panel_1"
@@ -38,18 +38,8 @@ panels {
38} 38}
39ports { 39ports {
40 name: "ENTRY" 40 name: "ENTRY"
41 display_name: "Second Room Entrance"
41 path: "Components/Warps/worldport3" 42 path: "Components/Warps/worldport3"
42 orientation: "south" 43 destination { x: 38 y: 0 z: 10 }
43} 44 rotation: 0
44ports {
45 name: "NEXT"
46 path: "Components/Warps/worldport4"
47 orientation: "north"
48 required_door { name: "Third Room Entrance" }
49}
50ports {
51 name: "CONGRUENT"
52 path: "Components/Warps/worldport7"
53 orientation: "east"
54 required_door { name: "Congruent Entrance" }
55} 45}
diff --git a/data/maps/the_darkroom/rooms/Third Room.txtpb b/data/maps/the_darkroom/rooms/Third Room.txtpb index 5202243..0400476 100644 --- a/data/maps/the_darkroom/rooms/Third Room.txtpb +++ b/data/maps/the_darkroom/rooms/Third Room.txtpb
@@ -1,5 +1,5 @@
1name: "Third Room" 1name: "Third Room"
2display_name: "Third Room" 2panel_display_name: "Third Room"
3panels { 3panels {
4 name: "CULTS" 4 name: "CULTS"
5 path: "Panels/Room 3/panel_1" 5 path: "Panels/Room 3/panel_1"
@@ -65,6 +65,8 @@ panels {
65} 65}
66ports { 66ports {
67 name: "ENTRY" 67 name: "ENTRY"
68 display_name: "Third Room Entrance"
68 path: "Components/Warps/worldport5" 69 path: "Components/Warps/worldport5"
69 orientation: "south" 70 destination { x: 97 y: 0 z: 10 }
71 rotation: 0
70} 72}
diff --git a/data/maps/the_digital/connections.txtpb b/data/maps/the_digital/connections.txtpb index 67cd4dc..a4b02a5 100644 --- a/data/maps/the_digital/connections.txtpb +++ b/data/maps/the_digital/connections.txtpb
@@ -24,11 +24,6 @@ connections {
24 door { name: "Gallery Entrance" } 24 door { name: "Gallery Entrance" }
25} 25}
26connections { 26connections {
27 from_room: "Gallery Maze"
28 to_room: "Main Area"
29 oneway: true
30}
31connections {
32 from_room: "Tree Area" 27 from_room: "Tree Area"
33 to_room: "Main Area" 28 to_room: "Main Area"
34 door { name: "Tree Entrance" } 29 door { name: "Tree Entrance" }
diff --git a/data/maps/the_digital/doors.txtpb b/data/maps/the_digital/doors.txtpb index 3a2e381..6c56c86 100644 --- a/data/maps/the_digital/doors.txtpb +++ b/data/maps/the_digital/doors.txtpb
@@ -42,6 +42,7 @@ doors {
42doors { 42doors {
43 name: "Control Center Blue Door" 43 name: "Control Center Blue Door"
44 type: CONTROL_CENTER_COLOR 44 type: CONTROL_CENTER_COLOR
45 latch: true
45 receivers: "Components/Doors/maze2" 46 receivers: "Components/Doors/maze2"
46 control_center_color: "blue" 47 control_center_color: "blue"
47} 48}
@@ -52,3 +53,10 @@ doors {
52 panels { room: "Tree Area" name: "TREE" } 53 panels { room: "Tree Area" name: "TREE" }
53 location_room: "Tree Area" 54 location_room: "Tree Area"
54} 55}
56doors {
57 name: "Control Center Blue Panel"
58 type: LOCATION_ONLY
59 panels { room: "Main Area" name: "COLOR" }
60 location_room: "Main Area"
61 location_name: "COLOR"
62}
diff --git a/data/maps/the_digital/rooms/C Room.txtpb b/data/maps/the_digital/rooms/C Room.txtpb index 5fdc526..050f090 100644 --- a/data/maps/the_digital/rooms/C Room.txtpb +++ b/data/maps/the_digital/rooms/C Room.txtpb
@@ -1,5 +1,4 @@
1name: "C Room" 1name: "C Room"
2display_name: "Chamber"
3letters { 2letters {
4 key: "c" 3 key: "c"
5 path: "Components/Collectables/c" 4 path: "Components/Collectables/c"
diff --git a/data/maps/the_digital/rooms/Chamber.txtpb b/data/maps/the_digital/rooms/Chamber.txtpb index 19d4b27..d731372 100644 --- a/data/maps/the_digital/rooms/Chamber.txtpb +++ b/data/maps/the_digital/rooms/Chamber.txtpb
@@ -1,5 +1,4 @@
1name: "Chamber" 1name: "Chamber"
2display_name: "Chamber"
3panels { 2panels {
4 name: "I" 3 name: "I"
5 path: "Panels/c1" 4 path: "Panels/c1"
diff --git a/data/maps/the_digital/rooms/Gallery Maze.txtpb b/data/maps/the_digital/rooms/Gallery Maze.txtpb index 9190728..31fa98d 100644 --- a/data/maps/the_digital/rooms/Gallery Maze.txtpb +++ b/data/maps/the_digital/rooms/Gallery Maze.txtpb
@@ -1,7 +1,8 @@
1name: "Gallery Maze" 1name: "Gallery Maze"
2display_name: "Main Area"
3ports { 2ports {
4 name: "GALLERY" 3 name: "GALLERY"
4 display_name: "Gallery Maze Worldport"
5 path: "Components/Warps/worldport4" 5 path: "Components/Warps/worldport4"
6 orientation: "east" 6 destination { x: -58 y: 0 z: -76 }
7 rotation: 90
7} 8}
diff --git a/data/maps/the_digital/rooms/Main Area.txtpb b/data/maps/the_digital/rooms/Main Area.txtpb index ee5c208..26770c2 100644 --- a/data/maps/the_digital/rooms/Main Area.txtpb +++ b/data/maps/the_digital/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Main Area"
3panels { 2panels {
4 name: "HIT" 3 name: "HIT"
5 path: "Panels/open_c" 4 path: "Panels/open_c"
@@ -28,16 +27,22 @@ panels {
28} 27}
29ports { 28ports {
30 name: "ENTRY1" 29 name: "ENTRY1"
30 display_name: "Maze NW Worldport"
31 path: "Components/Worldports/worldport3" 31 path: "Components/Worldports/worldport3"
32 orientation: "west" 32 destination { x: -33 y: 0 z: 28 }
33 rotation: 270
33} 34}
34ports { 35ports {
35 name: "ENTRY2" 36 name: "ENTRY2"
37 display_name: "Maze SW Worldport"
36 path: "Components/Worldports/worldport" 38 path: "Components/Worldports/worldport"
37 orientation: "south" 39 destination { x: -30 y: 0 z: 51 }
40 rotation: 0
38} 41}
39ports { 42ports {
40 name: "ENTRY3" 43 name: "ENTRY3"
44 display_name: "Maze SE Worldport"
41 path: "Components/Worldports/worldport2" 45 path: "Components/Worldports/worldport2"
42 orientation: "south" 46 destination { x: 0 y: 0 z: 51 }
47 rotation: 0
43} 48}
diff --git a/data/maps/the_digital/rooms/Tree Area.txtpb b/data/maps/the_digital/rooms/Tree Area.txtpb index fb90353..c2dc6b9 100644 --- a/data/maps/the_digital/rooms/Tree Area.txtpb +++ b/data/maps/the_digital/rooms/Tree Area.txtpb
@@ -1,5 +1,4 @@
1name: "Tree Area" 1name: "Tree Area"
2display_name: "Main Area"
3panels { 2panels {
4 name: "TREE" 3 name: "TREE"
5 path: "Panels/open_tree" 4 path: "Panels/open_tree"
@@ -9,7 +8,8 @@ panels {
9} 8}
10ports { 9ports {
11 name: "TREE" 10 name: "TREE"
11 display_name: "Brown Hallway"
12 path: "Components/Worldports/worldport4" 12 path: "Components/Worldports/worldport4"
13 orientation: "east" 13 destination { x: -16 y: 0 z: -31 }
14 # This is double sided. 14 rotation: 270
15} 15}
diff --git a/data/maps/the_digital/rooms/U Room.txtpb b/data/maps/the_digital/rooms/U Room.txtpb index 5b3e1cb..6b657d5 100644 --- a/data/maps/the_digital/rooms/U Room.txtpb +++ b/data/maps/the_digital/rooms/U Room.txtpb
@@ -1,5 +1,4 @@
1name: "U Room" 1name: "U Room"
2display_name: "Chamber"
3letters { 2letters {
4 key: "u" 3 key: "u"
5 path: "Components/Collectables/u" 4 path: "Components/Collectables/u"
diff --git a/data/maps/the_digital/rooms/Unyielding Entrance.txtpb b/data/maps/the_digital/rooms/Unyielding Entrance.txtpb index 0370928..f4bc663 100644 --- a/data/maps/the_digital/rooms/Unyielding Entrance.txtpb +++ b/data/maps/the_digital/rooms/Unyielding Entrance.txtpb
@@ -1,6 +1,8 @@
1name: "Unyielding Entrance" 1name: "Unyielding Entrance"
2ports { 2ports {
3 name: "UNYIELDING" 3 name: "UNYIELDING"
4 display_name: "Blue Door Worldport"
4 path: "Components/Warps/worldport5" 5 path: "Components/Warps/worldport5"
5 orientation: "east" 6 destination { x: 14 y: 0 z: 5 }
7 rotation: 90
6} 8}
diff --git a/data/maps/the_door/rooms/Ending.txtpb b/data/maps/the_door/rooms/Ending.txtpb index 4a4a995..37737e3 100644 --- a/data/maps/the_door/rooms/Ending.txtpb +++ b/data/maps/the_door/rooms/Ending.txtpb
@@ -1,5 +1,4 @@
1name: "Ending" 1name: "Ending"
2display_name: "Main Area"
3endings { 2endings {
4 name: "PLUM" 3 name: "PLUM"
5 path: "Components/plum_ending" 4 path: "Components/plum_ending"
diff --git a/data/maps/the_door/rooms/Main Area.txtpb b/data/maps/the_door/rooms/Main Area.txtpb index eb8944f..71e99b1 100644 --- a/data/maps/the_door/rooms/Main Area.txtpb +++ b/data/maps/the_door/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Main Area"
3panels { 2panels {
4 name: "HAIR" 3 name: "HAIR"
5 path: "Panels/Room_1/panel" 4 path: "Panels/Room_1/panel"
diff --git a/data/maps/the_double_sided/doors.txtpb b/data/maps/the_double_sided/doors.txtpb index 02b113a..1ae4324 100644 --- a/data/maps/the_double_sided/doors.txtpb +++ b/data/maps/the_double_sided/doors.txtpb
@@ -113,3 +113,82 @@ doors {
113 # The panel blocks your way; there's no door. 113 # The panel blocks your way; there's no door.
114 panels { room: "Flipped Black Area" name: "SEAPLANE" } 114 panels { room: "Flipped Black Area" name: "SEAPLANE" }
115} 115}
116# These locations are kind of deranged but hey. Welcome to The Double Sided.
117doors {
118 name: "5 Panels"
119 type: LOCATION_ONLY
120 panels { room: "Flipped Black Area" name: "SEAPLANE" }
121 panels { room: "Flipped Blue Area" name: "SKY" }
122 panels { room: "Flipped Blue Area" name: "HEAD" }
123 panels { room: "Flipped Green Area" name: "HIGH" }
124 panels { room: "Flipped Orange Area" name: "HEAVEN" }
125 panels { room: "Flipped Purple Area" name: "CEILING" }
126 panels { room: "Flipped Purple Area" name: "LEAVES" }
127 panels { room: "Flipped Red Area" name: "RAISED" }
128 panels { room: "Flipped Yellow Back Area" name: "ANGELS" }
129 panels { room: "Obverse Black Area" name: "MOUNTAIN" }
130 panels { room: "Obverse Black Area" name: "TRAIN" }
131 panels { room: "Obverse Green Area" name: "UPSIDE" }
132 panels { room: "Obverse Orange Back Area" name: "OVER" }
133 panels { room: "Obverse Orange Front Area" name: "UP" }
134 panels { room: "Obverse Orange Isolated Section" name: "TOP" }
135 panels { room: "Obverse Pink Area" name: "CLOUD" }
136 panels { room: "Obverse Purple Area" name: "DRAGON" }
137 panels { room: "Obverse Purple Area" name: "ABOVE" }
138 panels { room: "Start" name: "ATTIC" }
139 panels { room: "Start" name: "FULL" }
140 location_room: "Start"
141 complete_at: 5
142}
143doors {
144 name: "10 Panels"
145 type: LOCATION_ONLY
146 panels { room: "Flipped Black Area" name: "SEAPLANE" }
147 panels { room: "Flipped Blue Area" name: "SKY" }
148 panels { room: "Flipped Blue Area" name: "HEAD" }
149 panels { room: "Flipped Green Area" name: "HIGH" }
150 panels { room: "Flipped Orange Area" name: "HEAVEN" }
151 panels { room: "Flipped Purple Area" name: "CEILING" }
152 panels { room: "Flipped Purple Area" name: "LEAVES" }
153 panels { room: "Flipped Red Area" name: "RAISED" }
154 panels { room: "Flipped Yellow Back Area" name: "ANGELS" }
155 panels { room: "Obverse Black Area" name: "MOUNTAIN" }
156 panels { room: "Obverse Black Area" name: "TRAIN" }
157 panels { room: "Obverse Green Area" name: "UPSIDE" }
158 panels { room: "Obverse Orange Back Area" name: "OVER" }
159 panels { room: "Obverse Orange Front Area" name: "UP" }
160 panels { room: "Obverse Orange Isolated Section" name: "TOP" }
161 panels { room: "Obverse Pink Area" name: "CLOUD" }
162 panels { room: "Obverse Purple Area" name: "DRAGON" }
163 panels { room: "Obverse Purple Area" name: "ABOVE" }
164 panels { room: "Start" name: "ATTIC" }
165 panels { room: "Start" name: "FULL" }
166 location_room: "Start"
167 complete_at: 10
168}
169doors {
170 name: "15 Panels"
171 type: LOCATION_ONLY
172 panels { room: "Flipped Black Area" name: "SEAPLANE" }
173 panels { room: "Flipped Blue Area" name: "SKY" }
174 panels { room: "Flipped Blue Area" name: "HEAD" }
175 panels { room: "Flipped Green Area" name: "HIGH" }
176 panels { room: "Flipped Orange Area" name: "HEAVEN" }
177 panels { room: "Flipped Purple Area" name: "CEILING" }
178 panels { room: "Flipped Purple Area" name: "LEAVES" }
179 panels { room: "Flipped Red Area" name: "RAISED" }
180 panels { room: "Flipped Yellow Back Area" name: "ANGELS" }
181 panels { room: "Obverse Black Area" name: "MOUNTAIN" }
182 panels { room: "Obverse Black Area" name: "TRAIN" }
183 panels { room: "Obverse Green Area" name: "UPSIDE" }
184 panels { room: "Obverse Orange Back Area" name: "OVER" }
185 panels { room: "Obverse Orange Front Area" name: "UP" }
186 panels { room: "Obverse Orange Isolated Section" name: "TOP" }
187 panels { room: "Obverse Pink Area" name: "CLOUD" }
188 panels { room: "Obverse Purple Area" name: "DRAGON" }
189 panels { room: "Obverse Purple Area" name: "ABOVE" }
190 panels { room: "Start" name: "ATTIC" }
191 panels { room: "Start" name: "FULL" }
192 location_room: "Start"
193 complete_at: 15
194}
diff --git a/data/maps/the_double_sided/metadata.txtpb b/data/maps/the_double_sided/metadata.txtpb index c354fd8..6f56c63 100644 --- a/data/maps/the_double_sided/metadata.txtpb +++ b/data/maps/the_double_sided/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Double Sided" 1display_name: "The Double Sided"
2worldport_entrance {
3 room: "Start"
4 name: "DARKROOM"
5}
diff --git a/data/maps/the_double_sided/rooms/Brown Area.txtpb b/data/maps/the_double_sided/rooms/Brown Area.txtpb index 079a8f2..1752257 100644 --- a/data/maps/the_double_sided/rooms/Brown Area.txtpb +++ b/data/maps/the_double_sided/rooms/Brown Area.txtpb
@@ -1,5 +1,4 @@
1name: "Brown Area" 1name: "Brown Area"
2display_name: "Maze"
3masteries { 2masteries {
4 name: "MASTERY" 3 name: "MASTERY"
5 path: "Components/Collectables/smiley" 4 path: "Components/Collectables/smiley"
diff --git a/data/maps/the_double_sided/rooms/Flipped Black Area.txtpb b/data/maps/the_double_sided/rooms/Flipped Black Area.txtpb index 38eeee6..082d889 100644 --- a/data/maps/the_double_sided/rooms/Flipped Black Area.txtpb +++ b/data/maps/the_double_sided/rooms/Flipped Black Area.txtpb
@@ -1,5 +1,4 @@
1name: "Flipped Black Area" 1name: "Flipped Black Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "SEAPLANE" 3 name: "SEAPLANE"
5 path: "Panels/Maze/panel_15" 4 path: "Panels/Maze/panel_15"
diff --git a/data/maps/the_double_sided/rooms/Flipped Blue Area.txtpb b/data/maps/the_double_sided/rooms/Flipped Blue Area.txtpb index 7a285b9..f650be9 100644 --- a/data/maps/the_double_sided/rooms/Flipped Blue Area.txtpb +++ b/data/maps/the_double_sided/rooms/Flipped Blue Area.txtpb
@@ -1,5 +1,4 @@
1name: "Flipped Blue Area" 1name: "Flipped Blue Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "SKY" 3 name: "SKY"
5 path: "Panels/Maze/panel_5" 4 path: "Panels/Maze/panel_5"
diff --git a/data/maps/the_double_sided/rooms/Flipped Green Area.txtpb b/data/maps/the_double_sided/rooms/Flipped Green Area.txtpb index 68ac4c7..2621f6f 100644 --- a/data/maps/the_double_sided/rooms/Flipped Green Area.txtpb +++ b/data/maps/the_double_sided/rooms/Flipped Green Area.txtpb
@@ -1,5 +1,4 @@
1name: "Flipped Green Area" 1name: "Flipped Green Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "HIGH" 3 name: "HIGH"
5 path: "Panels/Maze/panel_3" 4 path: "Panels/Maze/panel_3"
diff --git a/data/maps/the_double_sided/rooms/Flipped Orange Area.txtpb b/data/maps/the_double_sided/rooms/Flipped Orange Area.txtpb index 30c62f1..58f1a76 100644 --- a/data/maps/the_double_sided/rooms/Flipped Orange Area.txtpb +++ b/data/maps/the_double_sided/rooms/Flipped Orange Area.txtpb
@@ -1,5 +1,4 @@
1name: "Flipped Orange Area" 1name: "Flipped Orange Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "HEAVEN" 3 name: "HEAVEN"
5 path: "Panels/Maze/panel_6" 4 path: "Panels/Maze/panel_6"
diff --git a/data/maps/the_double_sided/rooms/Flipped Pink Area.txtpb b/data/maps/the_double_sided/rooms/Flipped Pink Area.txtpb index dce2880..976dd58 100644 --- a/data/maps/the_double_sided/rooms/Flipped Pink Area.txtpb +++ b/data/maps/the_double_sided/rooms/Flipped Pink Area.txtpb
@@ -1,2 +1 @@
1name: "Flipped Pink Area" name: "Flipped Pink Area"
2display_name: "Maze"
diff --git a/data/maps/the_double_sided/rooms/Flipped Purple Area.txtpb b/data/maps/the_double_sided/rooms/Flipped Purple Area.txtpb index 6228004..02697a8 100644 --- a/data/maps/the_double_sided/rooms/Flipped Purple Area.txtpb +++ b/data/maps/the_double_sided/rooms/Flipped Purple Area.txtpb
@@ -1,5 +1,4 @@
1name: "Flipped Purple Area" 1name: "Flipped Purple Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "CEILING" 3 name: "CEILING"
5 path: "Panels/Maze/panel_8" 4 path: "Panels/Maze/panel_8"
diff --git a/data/maps/the_double_sided/rooms/Flipped Red Area.txtpb b/data/maps/the_double_sided/rooms/Flipped Red Area.txtpb index 9ca8571..9f10cb2 100644 --- a/data/maps/the_double_sided/rooms/Flipped Red Area.txtpb +++ b/data/maps/the_double_sided/rooms/Flipped Red Area.txtpb
@@ -1,5 +1,4 @@
1name: "Flipped Red Area" 1name: "Flipped Red Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "RAISED" 3 name: "RAISED"
5 path: "Panels/Maze/panel_12" 4 path: "Panels/Maze/panel_12"
diff --git a/data/maps/the_double_sided/rooms/Flipped Yellow Back Area.txtpb b/data/maps/the_double_sided/rooms/Flipped Yellow Back Area.txtpb index 81cf7ad..1c3193a 100644 --- a/data/maps/the_double_sided/rooms/Flipped Yellow Back Area.txtpb +++ b/data/maps/the_double_sided/rooms/Flipped Yellow Back Area.txtpb
@@ -1,5 +1,4 @@
1name: "Flipped Yellow Back Area" 1name: "Flipped Yellow Back Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "ANGELS" 3 name: "ANGELS"
5 path: "Panels/Maze/panel_13" 4 path: "Panels/Maze/panel_13"
diff --git a/data/maps/the_double_sided/rooms/Flipped Yellow Front Area.txtpb b/data/maps/the_double_sided/rooms/Flipped Yellow Front Area.txtpb index 00b26b8..00a221d 100644 --- a/data/maps/the_double_sided/rooms/Flipped Yellow Front Area.txtpb +++ b/data/maps/the_double_sided/rooms/Flipped Yellow Front Area.txtpb
@@ -1,2 +1 @@
1name: "Flipped Yellow Front Area" name: "Flipped Yellow Front Area"
2display_name: "Maze"
diff --git a/data/maps/the_double_sided/rooms/Obverse Black Area.txtpb b/data/maps/the_double_sided/rooms/Obverse Black Area.txtpb index e0f631d..ece5789 100644 --- a/data/maps/the_double_sided/rooms/Obverse Black Area.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Black Area.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Black Area" 1name: "Obverse Black Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "MOUNTAIN" 3 name: "MOUNTAIN"
5 path: "Panels/Maze/panel_16" 4 path: "Panels/Maze/panel_16"
diff --git a/data/maps/the_double_sided/rooms/Obverse Blue Area.txtpb b/data/maps/the_double_sided/rooms/Obverse Blue Area.txtpb index d576195..1a21952 100644 --- a/data/maps/the_double_sided/rooms/Obverse Blue Area.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Blue Area.txtpb
@@ -1,2 +1 @@
1name: "Obverse Blue Area" name: "Obverse Blue Area"
2display_name: "Maze"
diff --git a/data/maps/the_double_sided/rooms/Obverse Green Area.txtpb b/data/maps/the_double_sided/rooms/Obverse Green Area.txtpb index 5fe37cf..d66361e 100644 --- a/data/maps/the_double_sided/rooms/Obverse Green Area.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Green Area.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Green Area" 1name: "Obverse Green Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "UPSIDE" 3 name: "UPSIDE"
5 path: "Panels/Maze/panel_7" 4 path: "Panels/Maze/panel_7"
diff --git a/data/maps/the_double_sided/rooms/Obverse Orange Back Area.txtpb b/data/maps/the_double_sided/rooms/Obverse Orange Back Area.txtpb index 724e56b..43642f9 100644 --- a/data/maps/the_double_sided/rooms/Obverse Orange Back Area.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Orange Back Area.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Orange Back Area" 1name: "Obverse Orange Back Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "OVER" 3 name: "OVER"
5 path: "Panels/Maze/panel_2b" 4 path: "Panels/Maze/panel_2b"
diff --git a/data/maps/the_double_sided/rooms/Obverse Orange Front Area.txtpb b/data/maps/the_double_sided/rooms/Obverse Orange Front Area.txtpb index ff393b6..28ec555 100644 --- a/data/maps/the_double_sided/rooms/Obverse Orange Front Area.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Orange Front Area.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Orange Front Area" 1name: "Obverse Orange Front Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "UP" 3 name: "UP"
5 path: "Panels/Maze/panel_2" 4 path: "Panels/Maze/panel_2"
diff --git a/data/maps/the_double_sided/rooms/Obverse Orange Isolated Section.txtpb b/data/maps/the_double_sided/rooms/Obverse Orange Isolated Section.txtpb index 713d737..b563be9 100644 --- a/data/maps/the_double_sided/rooms/Obverse Orange Isolated Section.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Orange Isolated Section.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Orange Isolated Section" 1name: "Obverse Orange Isolated Section"
2display_name: "Maze"
3panels { 2panels {
4 name: "TOP" 3 name: "TOP"
5 path: "Panels/Maze/panel_4" 4 path: "Panels/Maze/panel_4"
diff --git a/data/maps/the_double_sided/rooms/Obverse Pink Area.txtpb b/data/maps/the_double_sided/rooms/Obverse Pink Area.txtpb index 936be17..2e64a37 100644 --- a/data/maps/the_double_sided/rooms/Obverse Pink Area.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Pink Area.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Pink Area" 1name: "Obverse Pink Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "CLOUD" 3 name: "CLOUD"
5 path: "Panels/Maze/panel_14" 4 path: "Panels/Maze/panel_14"
diff --git a/data/maps/the_double_sided/rooms/Obverse Purple Area.txtpb b/data/maps/the_double_sided/rooms/Obverse Purple Area.txtpb index c77032e..ffe3b80 100644 --- a/data/maps/the_double_sided/rooms/Obverse Purple Area.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Purple Area.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Purple Area" 1name: "Obverse Purple Area"
2display_name: "Maze"
3panels { 2panels {
4 name: "DRAGON" 3 name: "DRAGON"
5 path: "Panels/Maze/panel_18" 4 path: "Panels/Maze/panel_18"
diff --git a/data/maps/the_double_sided/rooms/Obverse Red Area.txtpb b/data/maps/the_double_sided/rooms/Obverse Red Area.txtpb index 509a997..90ad07d 100644 --- a/data/maps/the_double_sided/rooms/Obverse Red Area.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Red Area.txtpb
@@ -1,2 +1 @@
1name: "Obverse Red Area" name: "Obverse Red Area"
2display_name: "Maze"
diff --git a/data/maps/the_double_sided/rooms/Obverse Yellow Area.txtpb b/data/maps/the_double_sided/rooms/Obverse Yellow Area.txtpb index 0e40a34..801fa28 100644 --- a/data/maps/the_double_sided/rooms/Obverse Yellow Area.txtpb +++ b/data/maps/the_double_sided/rooms/Obverse Yellow Area.txtpb
@@ -1,2 +1 @@
1name: "Obverse Yellow Area" name: "Obverse Yellow Area"
2display_name: "Maze"
diff --git a/data/maps/the_double_sided/rooms/Start.txtpb b/data/maps/the_double_sided/rooms/Start.txtpb index f47580f..54efb93 100644 --- a/data/maps/the_double_sided/rooms/Start.txtpb +++ b/data/maps/the_double_sided/rooms/Start.txtpb
@@ -1,5 +1,4 @@
1name: "Start" 1name: "Start"
2display_name: "Maze"
3panels { 2panels {
4 name: "ATTIC" 3 name: "ATTIC"
5 path: "Panels/Maze/panel_11" 4 path: "Panels/Maze/panel_11"
@@ -16,6 +15,8 @@ panels {
16} 15}
17ports { 16ports {
18 name: "DARKROOM" 17 name: "DARKROOM"
18 display_name: "Entrance"
19 path: "Components/Warps/worldport" 19 path: "Components/Warps/worldport"
20 orientation: "west" 20 destination { x: -3 y: 0 z: 8 }
21 rotation: 270
21} 22}
diff --git a/data/maps/the_entry/connections.txtpb b/data/maps/the_entry/connections.txtpb index bec0642..6260665 100644 --- a/data/maps/the_entry/connections.txtpb +++ b/data/maps/the_entry/connections.txtpb
@@ -64,6 +64,16 @@ connections {
64 door { name: "Flipped Pyramid Area Entrance" } 64 door { name: "Flipped Pyramid Area Entrance" }
65} 65}
66connections { 66connections {
67 from_room: "Flipped Pyramid Area"
68 to_room: "Liberated Entrance Panel"
69 oneway: true
70}
71connections {
72 from_room: "Flipped Pyramid Area"
73 to_room: "Literate Entrance Panel"
74 oneway: true
75}
76connections {
67 from_room: "Right Eye" 77 from_room: "Right Eye"
68 to_room: "Least Blue Last" 78 to_room: "Least Blue Last"
69 door { name: "Red Blue Area Left Door" } 79 door { name: "Red Blue Area Left Door" }
@@ -90,8 +100,19 @@ connections {
90} 100}
91connections { 101connections {
92 from_room: "Red Blue Halls" 102 from_room: "Red Blue Halls"
103 to_room: "Least Blue Last"
104 oneway: true
105}
106connections {
107 from_room: "Red Blue Halls"
93 to_room: "Wrath Room" 108 to_room: "Wrath Room"
94 door { name: "Noon Door" } 109 door { name: "Noon Door" }
110 oneway: true
111}
112connections {
113 from_room: "Wrath Room"
114 to_room: "Least Blue Last"
115 oneway: true
95} 116}
96connections { 117connections {
97 from_room: "Red Blue Halls" 118 from_room: "Red Blue Halls"
@@ -100,6 +121,11 @@ connections {
100} 121}
101connections { 122connections {
102 from_room: "Wrath Room" 123 from_room: "Wrath Room"
124 to_room: "Rabbit Hole Lock"
125 door { name: "Noon Door" }
126}
127connections {
128 from_room: "Wrath Room"
103 to_room: "Rabbit Hole" 129 to_room: "Rabbit Hole"
104 door { name: "Rabbithole Door" } 130 door { name: "Rabbithole Door" }
105} 131}
@@ -116,7 +142,7 @@ connections {
116connections { 142connections {
117 from_room: "Blue Alcove" 143 from_room: "Blue Alcove"
118 to_room: "Least Blue Last" 144 to_room: "Least Blue Last"
119 door { name: "Red Alcove Exit" } 145 door { name: "Blue Alcove Exit" }
120} 146}
121connections { 147connections {
122 from_room: "Parthenon Return" 148 from_room: "Parthenon Return"
@@ -144,6 +170,11 @@ connections {
144 door { name: "Lime Room Entrance" } 170 door { name: "Lime Room Entrance" }
145} 171}
146connections { 172connections {
173 from_room: "Lime Room"
174 to_room: "Revitalized Entrance"
175 door { name: "Revitalized Entrance" }
176}
177connections {
147 from { painting { room: "Link Area" name: "NEAR" } } 178 from { painting { room: "Link Area" name: "NEAR" } }
148 to { painting { room: "Flipped Link Area" name: "NEAR" } } 179 to { painting { room: "Flipped Link Area" name: "NEAR" } }
149 oneway: true 180 oneway: true
@@ -162,12 +193,12 @@ connections {
162 from_room: "Starting Room" 193 from_room: "Starting Room"
163 to_room: "Digital Entrance" 194 to_room: "Digital Entrance"
164 door { name: "Second Room Left Door" } 195 door { name: "Second Room Left Door" }
165 oneway: true
166} 196}
167connections { 197connections {
168 from_room: "Digital Entrance" 198 from_room: "Digital Entrance"
169 to_room: "Starting Room" 199 to_room: "Starting Room"
170 oneway: true 200 oneway: true
201 vanilla_only: true
171} 202}
172connections { 203connections {
173 from_room: "Starting Room" 204 from_room: "Starting Room"
@@ -182,5 +213,35 @@ connections {
182connections { 213connections {
183 from_room: "Starting Room" 214 from_room: "Starting Room"
184 to_room: "Repetitive Entrance" 215 to_room: "Repetitive Entrance"
185 door { name: "Repetitive Entrance" } 216 door { name: "Starting Room West Wall North Door" }
217}
218connections {
219 from_room: "Lime Room"
220 to_room: "White Hallway To Daedalus"
221 door { name: "Control Center White Door" }
222}
223connections {
224 from_room: "Flipped Second Room"
225 to_room: "Four Rooms Entrance"
226 door { name: "Flipped Second Room Right Door" }
227}
228connections {
229 from_room: "Link Area"
230 to_room: "Liberated Entrance"
231 door { name: "Liberated Entrance" }
232}
233connections {
234 from_room: "Link Area"
235 to_room: "Literate Entrance"
236 door { name: "Literate Entrance" }
237}
238connections {
239 from_room: "Liberated Entrance"
240 to_room: "Liberated Entrance Panel"
241 oneway: true
242}
243connections {
244 from_room: "Literate Entrance"
245 to_room: "Literate Entrance Panel"
246 oneway: true
186} 247}
diff --git a/data/maps/the_entry/doors.txtpb b/data/maps/the_entry/doors.txtpb index 917edc7..3f62338 100644 --- a/data/maps/the_entry/doors.txtpb +++ b/data/maps/the_entry/doors.txtpb
@@ -62,27 +62,47 @@ doors {
62 name: "Rabbithole Door" 62 name: "Rabbithole Door"
63 type: STANDARD 63 type: STANDARD
64 receivers: "Components/Doors/second_right8" 64 receivers: "Components/Doors/second_right8"
65 panels { room: "Wrath Room" name: "RABBIT" } 65 panels { room: "Rabbit Hole Lock" name: "RABBIT" }
66 panels { room: "Wrath Room" name: "HOLE" } 66 panels { room: "Rabbit Hole Lock" name: "HOLE" }
67 location_room: "Wrath Room" 67 location_room: "Rabbit Hole Lock"
68} 68}
69# second_right is vanilla because it's like LOST door. 69# second_right is vanilla because it's like LOST door.
70doors { 70doors {
71 name: "Noon Door" 71 name: "Noon Door"
72 type: STANDARD 72 type: ITEM_ONLY
73 legacy_location: true
73 receivers: "Components/Doors/second_right5" 74 receivers: "Components/Doors/second_right5"
74 receivers: "Components/Doors/second_right10" 75 receivers: "Components/Doors/second_right10"
75 panels { room: "Red Blue Halls" name: "CENTER DAY" } 76 panels { room: "Red Blue Halls" name: "CENTER DAY" }
76 location_room: "Red Blue Halls" 77 location_room: "Red Blue Halls"
77} 78}
78doors { 79doors {
80 name: "Noon Door Panels"
81 type: LOCATION_ONLY
82 panels { room: "Red Blue Halls" name: "CENTER" }
83 panels { room: "Red Blue Halls" name: "DAY" }
84 panels { room: "Red Blue Halls" name: "CENTER DAY" }
85 location_room: "Red Blue Halls"
86 location_name: "CENTER, DAY, CENTER DAY"
87}
88doors {
79 name: "Scarf Door" 89 name: "Scarf Door"
80 type: STANDARD 90 type: ITEM_ONLY
91 legacy_location: true
81 receivers: "Components/Doors/second_right6" 92 receivers: "Components/Doors/second_right6"
82 panels { room: "Red Blue Halls" name: "RAIN WOMAN" } 93 panels { room: "Red Blue Halls" name: "RAIN WOMAN" }
83 location_room: "Red Blue Halls" 94 location_room: "Red Blue Halls"
84} 95}
85doors { 96doors {
97 name: "Scarf Door Panels"
98 type: LOCATION_ONLY
99 panels { room: "Red Blue Halls" name: "RAIN" }
100 panels { room: "Red Blue Halls" name: "WOMAN" }
101 panels { room: "Red Blue Halls" name: "RAIN WOMAN" }
102 location_room: "Red Blue Halls"
103 location_name: "RAIN, WOMAN, RAIN WOMAN"
104}
105doors {
86 name: "Blue Alcove Entrance" 106 name: "Blue Alcove Entrance"
87 type: STANDARD 107 type: STANDARD
88 receivers: "Components/Doors/second_right9" 108 receivers: "Components/Doors/second_right9"
@@ -113,14 +133,14 @@ doors {
113} 133}
114doors { 134doors {
115 name: "Right Eye Entrance" 135 name: "Right Eye Entrance"
116 type: STANDARD 136 type: ITEM_ONLY
117 receivers: "Components/Doors/third_right" 137 receivers: "Components/Doors/third_right"
118 panels { room: "Trick Room" name: "INK" } 138 panels { room: "Trick Room" name: "INK" }
119 location_room: "Trick Room"
120} 139}
121doors { 140doors {
122 name: "Red Blue Area Left Door" 141 name: "Red Blue Area Left Door"
123 type: STANDARD 142 type: ITEM_ONLY
143 legacy_location: true
124 receivers: "Components/Doors/fourth_right" 144 receivers: "Components/Doors/fourth_right"
125 panels { room: "Right Eye" name: "WANDER" } 145 panels { room: "Right Eye" name: "WANDER" }
126 location_room: "Right Eye" 146 location_room: "Right Eye"
@@ -132,14 +152,41 @@ doors {
132 panels { room: "Right Eye" name: "WANDER" } 152 panels { room: "Right Eye" name: "WANDER" }
133 location_room: "Right Eye" 153 location_room: "Right Eye"
134} 154}
155doors {
156 name: "Wander Panels"
157 type: LOCATION_ONLY
158 panels { room: "Right Eye" name: "WANDER" }
159 panels { room: "Red Blue Halls" name: "WANDER" }
160 panels { room: "Link Area" name: "WANDER" }
161 panels { room: "Flipped Link Area" name: "WANDER" }
162 location_room: "Flipped Link Area"
163}
164doors {
165 name: "Flipped Right Eye Panels"
166 type: LOCATION_ONLY
167 panels { room: "Flipped Right Eye" name: "HERE" }
168 panels { room: "Flipped Right Eye" name: "WHERE" }
169 location_room: "Flipped Right Eye"
170 location_name: "HERE, WHERE"
171}
172doors {
173 name: "Big Eyes"
174 type: LOCATION_ONLY
175 panels { room: "Starting Room" name: "EYE" }
176 panels { room: "Right Eye" name: "EYE" }
177 location_room: "Right Eye"
178 location_name: "EYE"
179}
135# Components/Doors/back_left_1, _3, _4, _6 are vanilla because they're nothing. 180# Components/Doors/back_left_1, _3, _4, _6 are vanilla because they're nothing.
136doors { 181doors {
137 name: "Orange Door Hider" 182 name: "Orange Door Hider"
138 type: STANDARD 183 type: STANDARD
139 receivers: "Components/Doors/back_left_2" 184 receivers: "Components/Doors/back_left_2"
140 panels { room: "Colored Doors Area" name: "OPEN" answer: "orange" } 185 panels { room: "Colored Doors Area" name: "OPEN" answer: "orange" }
141 # "wall" is supposed to also work. idk man 186 panels { room: "Colored Doors Area" name: "OPEN" answer: "wall" }
187 complete_at: 1
142 location_room: "Colored Doors Area" 188 location_room: "Colored Doors Area"
189 location_name: "OPEN"
143} 190}
144doors { 191doors {
145 name: "Lime Room Entrance" 192 name: "Lime Room Entrance"
@@ -160,6 +207,7 @@ doors {
160doors { 207doors {
161 name: "Control Center White Door" 208 name: "Control Center White Door"
162 type: CONTROL_CENTER_COLOR 209 type: CONTROL_CENTER_COLOR
210 latch: true
163 receivers: "Components/Doors/back_left_7" 211 receivers: "Components/Doors/back_left_7"
164 control_center_color: "white" 212 control_center_color: "white"
165} 213}
@@ -194,10 +242,10 @@ doors {
194 location_room: "Starting Room" 242 location_room: "Starting Room"
195} 243}
196doors { 244doors {
197 name: "Repetitive Entrance" 245 name: "Starting Room West Wall North Door"
198 type: ITEM_ONLY 246 type: ITEM_ONLY
199 receivers: "Components/Doors/Entry/entry_proxied_9" 247 receivers: "Components/Doors/Entry/entry_proxied_9"
200 switches: "double_letters" 248 double_letters: true
201} 249}
202doors { 250doors {
203 name: "Shop Entrance" 251 name: "Shop Entrance"
@@ -210,20 +258,20 @@ doors {
210 name: "Liberated Entrance" 258 name: "Liberated Entrance"
211 type: STANDARD 259 type: STANDARD
212 receivers: "Components/Doors/Entry/entry_proxied_10" 260 receivers: "Components/Doors/Entry/entry_proxied_10"
213 panels { room: "Flipped Pyramid Area" name: "TURN (1)" } 261 panels { room: "Liberated Entrance Panel" name: "TURN (1)" }
214 location_room: "Flipped Pyramid Area" 262 location_room: "Flipped Pyramid Area"
215} 263}
216doors { 264doors {
217 name: "Flipped Pyramid Area Entrance" 265 name: "Flipped Pyramid Area Entrance"
218 type: ITEM_ONLY 266 type: EVENT
219 receivers: "Components/Doors/Entry/entry_proxied_12" 267 receivers: "Components/Doors/Entry/entry_proxied_12"
220 switches: "double_letters" 268 double_letters: true
221} 269}
222doors { 270doors {
223 name: "Literate Entrance" 271 name: "Literate Entrance"
224 type: STANDARD 272 type: STANDARD
225 receivers: "Components/Doors/Entry/entry_proxied_11" 273 receivers: "Components/Doors/Entry/entry_proxied_11"
226 panels { room: "Flipped Pyramid Area" name: "TURN (2)" } 274 panels { room: "Literate Entrance Panel" name: "TURN (2)" }
227 location_room: "Flipped Pyramid Area" 275 location_room: "Flipped Pyramid Area"
228} 276}
229doors { 277doors {
@@ -252,7 +300,7 @@ doors {
252 type: ITEM_ONLY 300 type: ITEM_ONLY
253 receivers: "Components/Doors/Entry/d_3" 301 receivers: "Components/Doors/Entry/d_3"
254 receivers: "Components/Doors/Entry/d_4" 302 receivers: "Components/Doors/Entry/d_4"
255 switches: "double_letters" 303 double_letters: true
256} 304}
257doors { 305doors {
258 name: "D Room Panels" 306 name: "D Room Panels"
@@ -287,7 +335,8 @@ doors {
287doors { 335doors {
288 name: "Least Blue Last Panels" 336 name: "Least Blue Last Panels"
289 type: EVENT 337 type: EVENT
290 move_paintings { room: "Starting Room" name: "OWL" } 338 #move_paintings { room: "Starting Room" name: "OWL" }
339 #receivers: "Components/Paintings/owl/visibilityListener"
291 panels { room: "Least Blue Last" name: "CAPABLE (1)" } 340 panels { room: "Least Blue Last" name: "CAPABLE (1)" }
292 panels { room: "Least Blue Last" name: "CAPABLE (2)" } 341 panels { room: "Least Blue Last" name: "CAPABLE (2)" }
293 panels { room: "Least Blue Last" name: "LUSTRE" } 342 panels { room: "Least Blue Last" name: "LUSTRE" }
@@ -301,15 +350,56 @@ doors {
301doors { 350doors {
302 name: "Red Room Painting" 351 name: "Red Room Painting"
303 type: STANDARD 352 type: STANDARD
304 move_paintings { room: "Right Eye" name: "PSYCHIC" } 353 receivers: "Components/Paintings/psychic/teleportListener"
305 panels { room: "Right Eye" name: "FAINT" } 354 panels { room: "Right Eye" name: "FAINT" }
306 location_room: "Right Eye" 355 location_room: "Right Eye"
307} 356}
308doors { 357doors {
309 name: "Third Eye Painting" 358 name: "Third Eye Painting"
310 type: LOCATION_ONLY 359 type: LOCATION_ONLY
311 # move_paintings { room: "Eye Room" name: "GALLERY" }
312 # TODO: ummmm 360 # TODO: ummmm
313 panels { room: "Eye Room" name: "I" } 361 panels { room: "Eye Room" name: "I" }
314 location_room: "Eye Room" 362 location_room: "Eye Room"
315} \ No newline at end of file 363}
364doors {
365 name: "Gift Maps Entrance"
366 type: EVENT
367 receivers: "Components/GiftMapEntrance/PanelTeleporter"
368 double_letters: true
369}
370doors {
371 name: "Least Blue Last"
372 type: LOCATION_ONLY
373 panels { room: "Least Blue Last" name: "CAPABLE (1)" }
374 panels { room: "Least Blue Last" name: "CAPABLE (2)" }
375 panels { room: "Least Blue Last" name: "LUSTRE" }
376 panels { room: "Least Blue Last" name: "WANT" }
377 panels { room: "Least Blue Last" name: "STEALER" }
378 panels { room: "Least Blue Last" name: "OLD" }
379 panels { room: "Least Blue Last" name: "TRUST" }
380 panels { room: "Least Blue Last" name: "LABEL" }
381 panels { room: "Least Blue Last" name: "AIL" }
382 location_room: "Least Blue Last"
383}
384doors {
385 name: "Control Center White Panel"
386 type: LOCATION_ONLY
387 panels { room: "Lime Room" name: "COLOR" }
388 location_room: "Lime Room"
389 location_name: "COLOR"
390}
391doors {
392 name: "Rabbit Hole Blank Puzzle"
393 type: LOCATION_ONLY
394 panels { room: "Rabbit Hole" name: "Blank" }
395 location_room: "Rabbit Hole"
396 location_name: "Blank Puzzle"
397}
398doors {
399 name: "Wrath Room Puzzles"
400 type: LOCATION_ONLY
401 panels { room: "Wrath Room" name: "DICE" }
402 panels { room: "Wrath Room" name: "WREATH" }
403 location_room: "Wrath Room"
404 location_name: "DICE, WRATH"
405}
diff --git a/data/maps/the_entry/metadata.txtpb b/data/maps/the_entry/metadata.txtpb index 679454a..da2194b 100644 --- a/data/maps/the_entry/metadata.txtpb +++ b/data/maps/the_entry/metadata.txtpb
@@ -9,3 +9,15 @@ excluded_nodes: "Panels/Back Left/backleft_3_proxied_1"
9excluded_nodes: "Panels/Back Left/backleft_3_proxied_2" 9excluded_nodes: "Panels/Back Left/backleft_3_proxied_2"
10excluded_nodes: "Panels/Back Left/backleft_4_proxied_1" 10excluded_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.
13excluded_nodes: "Panels/Entry/entry_proxied_fake"
14# The gift map entrance is created by the mod.
15custom_nodes: "Components/GiftMapEntrance/GongusPanel"
16custom_nodes: "Components/GiftMapEntrance/HatkirbyPanel"
17custom_nodes: "Components/GiftMapEntrance/IcelyPanel"
18custom_nodes: "Components/GiftMapEntrance/KirbyPanel"
19custom_nodes: "Components/GiftMapEntrance/KiwiPanel"
20custom_nodes: "Components/GiftMapEntrance/Panel"
21custom_nodes: "Components/GiftMapEntrance/QPanel"
22custom_nodes: "Components/GiftMapEntrance/SouveyPanel"
23custom_nodes: "Components/GiftMapEntrance/StarPanel"
diff --git a/data/maps/the_entry/rooms/Blue Alcove.txtpb b/data/maps/the_entry/rooms/Blue Alcove.txtpb index 4c2c48c..3df58b9 100644 --- a/data/maps/the_entry/rooms/Blue Alcove.txtpb +++ b/data/maps/the_entry/rooms/Blue Alcove.txtpb
@@ -1,5 +1,5 @@
1name: "Blue Alcove" 1name: "Blue Alcove"
2display_name: "Red Blue Area" 2panel_display_name: "Red Blue Area"
3panels { 3panels {
4 name: "BLUE" 4 name: "BLUE"
5 path: "Panels/Back Right/br_11" 5 path: "Panels/Back Right/br_11"
diff --git a/data/maps/the_entry/rooms/Colored Doors Area.txtpb b/data/maps/the_entry/rooms/Colored Doors Area.txtpb index 29e89b5..4767387 100644 --- a/data/maps/the_entry/rooms/Colored Doors Area.txtpb +++ b/data/maps/the_entry/rooms/Colored Doors Area.txtpb
@@ -1,5 +1,5 @@
1name: "Colored Doors Area" 1name: "Colored Doors Area"
2display_name: "Colored Doors Area" 2panel_display_name: "Colored Doors Area"
3panels { 3panels {
4 name: "OPEN" 4 name: "OPEN"
5 path: "Panels/Back Left/backleft_proxying_1" 5 path: "Panels/Back Left/backleft_proxying_1"
diff --git a/data/maps/the_entry/rooms/Composite Room Entrance.txtpb b/data/maps/the_entry/rooms/Composite Room Entrance.txtpb index 4c18625..ca9e7f4 100644 --- a/data/maps/the_entry/rooms/Composite Room Entrance.txtpb +++ b/data/maps/the_entry/rooms/Composite Room Entrance.txtpb
@@ -1,7 +1,9 @@
1name: "Composite Room Entrance" 1name: "Composite Room Entrance"
2display_name: "Starting Room" 2panel_display_name: "Starting Room"
3ports { 3ports {
4 name: "COMPOSITE" 4 name: "COMPOSITE"
5 display_name: "Starting Room NE Worldport"
5 path: "Components/Warps/worldport12" 6 path: "Components/Warps/worldport12"
6 orientation: "east" 7 destination { x: 16 y: 0 z: -20 }
8 rotation: 90
7} 9}
diff --git a/data/maps/the_entry/rooms/Ctrl Tutorial.txtpb b/data/maps/the_entry/rooms/Ctrl Tutorial.txtpb index 0819953..fabcd60 100644 --- a/data/maps/the_entry/rooms/Ctrl Tutorial.txtpb +++ b/data/maps/the_entry/rooms/Ctrl Tutorial.txtpb
@@ -1,5 +1,5 @@
1name: "Ctrl Tutorial" 1name: "Ctrl Tutorial"
2display_name: "Colored Doors Area" 2panel_display_name: "Colored Doors Area"
3panels { 3panels {
4 name: "RIGHT" 4 name: "RIGHT"
5 path: "Panels/Back Left/backleft_proxying_2" 5 path: "Panels/Back Left/backleft_proxying_2"
diff --git a/data/maps/the_entry/rooms/D Room Final.txtpb b/data/maps/the_entry/rooms/D Room Final.txtpb index 960cb1c..bb8ee87 100644 --- a/data/maps/the_entry/rooms/D Room Final.txtpb +++ b/data/maps/the_entry/rooms/D Room Final.txtpb
@@ -1,5 +1,5 @@
1name: "D Room Final" 1name: "D Room Final"
2display_name: "D Room" 2panel_display_name: "D Room"
3letters { 3letters {
4 key: "d" 4 key: "d"
5 path: "Components/Collectables/d" 5 path: "Components/Collectables/d"
diff --git a/data/maps/the_entry/rooms/D Room.txtpb b/data/maps/the_entry/rooms/D Room.txtpb index 27a975b..fdf6846 100644 --- a/data/maps/the_entry/rooms/D Room.txtpb +++ b/data/maps/the_entry/rooms/D Room.txtpb
@@ -1,5 +1,5 @@
1name: "D Room" 1name: "D Room"
2display_name: "D Room" 2panel_display_name: "D Room"
3panels { 3panels {
4 name: "BASEBALL" 4 name: "BASEBALL"
5 path: "Panels/D/d_2" 5 path: "Panels/D/d_2"
diff --git a/data/maps/the_entry/rooms/Daedalus Entrance.txtpb b/data/maps/the_entry/rooms/Daedalus Entrance.txtpb index 60b41cb..76dc278 100644 --- a/data/maps/the_entry/rooms/Daedalus Entrance.txtpb +++ b/data/maps/the_entry/rooms/Daedalus Entrance.txtpb
@@ -1,7 +1,9 @@
1name: "Daedalus Entrance" 1name: "Daedalus Entrance"
2display_name: "Starting Room" 2panel_display_name: "Starting Room"
3ports { 3ports {
4 name: "DAEDALUS" 4 name: "DAEDALUS"
5 display_name: "Starting Room North Wall West Worldport"
5 path: "Components/Warps/worldport6" 6 path: "Components/Warps/worldport6"
6 orientation: "west" 7 destination { x: -16 y: 0 z: -20 }
8 rotation: 270
7} 9}
diff --git a/data/maps/the_entry/rooms/Digital Entrance.txtpb b/data/maps/the_entry/rooms/Digital Entrance.txtpb index 5713a8d..b7689bd 100644 --- a/data/maps/the_entry/rooms/Digital Entrance.txtpb +++ b/data/maps/the_entry/rooms/Digital Entrance.txtpb
@@ -1,7 +1,9 @@
1name: "Digital Entrance" 1name: "Digital Entrance"
2display_name: "Starting Room" 2panel_display_name: "Starting Room"
3ports { 3ports {
4 name: "DIGITAL" 4 name: "DIGITAL"
5 display_name: "Second Room Left Worldport"
5 path: "Components/Warps/worldport" 6 path: "Components/Warps/worldport"
6 orientation: "west" 7 destination { x: -78 y: 0 z: -24 }
8 rotation: 270
7} 9}
diff --git a/data/maps/the_entry/rooms/Entry Exit.txtpb b/data/maps/the_entry/rooms/Entry Exit.txtpb index 6b4fadd..e270bf8 100644 --- a/data/maps/the_entry/rooms/Entry Exit.txtpb +++ b/data/maps/the_entry/rooms/Entry Exit.txtpb
@@ -1,7 +1,9 @@
1name: "Entry Exit" 1name: "Entry Exit"
2display_name: "Starting Room" 2panel_display_name: "Starting Room"
3ports { 3ports {
4 name: "GREAT" 4 name: "GREAT"
5 display_name: "Second Room Right Worldport"
5 path: "Components/Warps/worldport2" 6 path: "Components/Warps/worldport2"
6 orientation: "north" 7 destination { x: 18 y: 0 z: -36 }
8 rotation: 180
7} 9}
diff --git a/data/maps/the_entry/rooms/Eye Room.txtpb b/data/maps/the_entry/rooms/Eye Room.txtpb index 8c6290b..00f2534 100644 --- a/data/maps/the_entry/rooms/Eye Room.txtpb +++ b/data/maps/the_entry/rooms/Eye Room.txtpb
@@ -1,5 +1,5 @@
1name: "Eye Room" 1name: "Eye Room"
2display_name: "Eye Room" 2panel_display_name: "Eye Room"
3panels { 3panels {
4 name: "I" 4 name: "I"
5 path: "Panels/Entry/eyes_1" 5 path: "Panels/Entry/eyes_1"
@@ -31,6 +31,8 @@ paintings {
31} 31}
32ports { 32ports {
33 name: "LIONIZED" 33 name: "LIONIZED"
34 display_name: "Eye Room Worldport"
34 path: "Components/Warps/worldport10" 35 path: "Components/Warps/worldport10"
35 orientation: "north" 36 destination { x: 18 y: 0 z: -88.5 }
37 rotation: 180
36} 38}
diff --git a/data/maps/the_entry/rooms/Flipped Link Area.txtpb b/data/maps/the_entry/rooms/Flipped Link Area.txtpb index 5251023..950e9b1 100644 --- a/data/maps/the_entry/rooms/Flipped Link Area.txtpb +++ b/data/maps/the_entry/rooms/Flipped Link Area.txtpb
@@ -1,18 +1,19 @@
1name: "Flipped Link Area" 1name: "Flipped Link Area"
2display_name: "Pyramid Area" 2panel_display_name: "Pyramid Area"
3panels { 3panels {
4 name: "WANDER" 4 name: "WANDER"
5 path: "Panels/Pilgrimage/cream_4" 5 path: "Panels/Pilgrimage/cream_4"
6 clue: "wander" 6 clue: "wander"
7 answer: "roam" 7 answer: "roam"
8 symbols: SUN 8 symbols: SUN
9 display_name: "WANDER (Flipped)"
9} 10}
10paintings { 11paintings {
11 name: "NEAR" 12 name: "NEAR"
12 path: "Components/Paintings/aches2" 13 path: "Components/Paintings/aches2"
13 orientation: "north" 14 orientation: "north"
14 gravity: Y_PLUS 15 gravity: Y_PLUS
15 display_name: "Flipper Near Painting" 16 display_name: "Flipped Near Painting"
16} 17}
17paintings { 18paintings {
18 name: "FAR" 19 name: "FAR"
diff --git a/data/maps/the_entry/rooms/Flipped Pyramid Area.txtpb b/data/maps/the_entry/rooms/Flipped Pyramid Area.txtpb index e2dd992..30e737f 100644 --- a/data/maps/the_entry/rooms/Flipped Pyramid Area.txtpb +++ b/data/maps/the_entry/rooms/Flipped Pyramid Area.txtpb
@@ -1,16 +1,6 @@
1name: "Flipped Pyramid Area" 1name: "Flipped Pyramid Area"
2display_name: "Pyramid Area" 2panel_display_name: "Pyramid Area"
3panels { 3# The fact that the doors here cover up the panels once they open is a problem
4 name: "TURN (1)" 4# since you're not guaranteed to have access to the lower area if painting
5 path: "Panels/Entry/l_opener_3" 5# shuffle is a thing. So we need to edit these doors so that they don't cover up
6 clue: "turn" 6# the panels.
7 answer: "flip"
8 symbols: SUN
9}
10panels {
11 name: "TURN (2)"
12 path: "Panels/Entry/l_opener_4"
13 clue: "turn"
14 answer: "spin"
15 symbols: SUN
16} \ No newline at end of file
diff --git a/data/maps/the_entry/rooms/Flipped Right Eye.txtpb b/data/maps/the_entry/rooms/Flipped Right Eye.txtpb index 429d63e..14f3f5a 100644 --- a/data/maps/the_entry/rooms/Flipped Right Eye.txtpb +++ b/data/maps/the_entry/rooms/Flipped Right Eye.txtpb
@@ -1,5 +1,5 @@
1name: "Flipped Right Eye" 1name: "Flipped Right Eye"
2display_name: "Flip Area" 2panel_display_name: "Flip Area"
3panels { 3panels {
4 name: "WHERE" 4 name: "WHERE"
5 path: "Panels/Pilgrimage/cream_5" 5 path: "Panels/Pilgrimage/cream_5"
diff --git a/data/maps/the_entry/rooms/Flipped Second Room.txtpb b/data/maps/the_entry/rooms/Flipped Second Room.txtpb index d4ee780..0d518bb 100644 --- a/data/maps/the_entry/rooms/Flipped Second Room.txtpb +++ b/data/maps/the_entry/rooms/Flipped Second Room.txtpb
@@ -1,5 +1,5 @@
1name: "Flipped Second Room" 1name: "Flipped Second Room"
2display_name: "Flip Area" 2panel_display_name: "Flip Area"
3panels { 3panels {
4 name: "CLUE" 4 name: "CLUE"
5 path: "Panels/Entry/second_right_top" 5 path: "Panels/Entry/second_right_top"
@@ -21,10 +21,3 @@ paintings {
21 gravity: Y_PLUS 21 gravity: Y_PLUS
22 display_name: "Eye Painting" 22 display_name: "Eye Painting"
23} 23}
24ports {
25 name: "FOUR"
26 path: "Components/Warps/worldport9"
27 orientation: "south"
28 gravity: Y_PLUS
29 required_door { name: "Flipped Second Room Right Door" }
30} \ No newline at end of file
diff --git a/data/maps/the_entry/rooms/Four Rooms Entrance.txtpb b/data/maps/the_entry/rooms/Four Rooms Entrance.txtpb new file mode 100644 index 0000000..d4650f0 --- /dev/null +++ b/data/maps/the_entry/rooms/Four Rooms Entrance.txtpb
@@ -0,0 +1,9 @@
1name: "Four Rooms Entrance"
2ports {
3 name: "FOUR"
4 display_name: "Flipped Second Room Right Worldport"
5 path: "Components/Warps/worldport9"
6 destination { x: -41 y: 6 z: -17.5 }
7 rotation: 0
8 # This isn't actually Y_PLUS gravity! A nearby warp sneakily flips you.
9}
diff --git a/data/maps/the_entry/rooms/Gallery Return.txtpb b/data/maps/the_entry/rooms/Gallery Return.txtpb index 1273928..7235d80 100644 --- a/data/maps/the_entry/rooms/Gallery Return.txtpb +++ b/data/maps/the_entry/rooms/Gallery Return.txtpb
@@ -1,5 +1,5 @@
1name: "Gallery Return" 1name: "Gallery Return"
2display_name: "Starting Room" 2panel_display_name: "Gallery Return"
3panels { 3panels {
4 name: "RETURN" 4 name: "RETURN"
5 path: "Panels/Entry/gallery_return" 5 path: "Panels/Entry/gallery_return"
@@ -9,6 +9,8 @@ panels {
9} 9}
10ports { 10ports {
11 name: "GALLERY" 11 name: "GALLERY"
12 display_name: "Gallery Return"
12 path: "Components/Warps/worldport4" 13 path: "Components/Warps/worldport4"
13 orientation: "north" 14 destination { x: -38 y: 0 z: 8.5 }
15 rotation: 180
14} \ No newline at end of file 16} \ No newline at end of file
diff --git a/data/maps/the_entry/rooms/Least Blue Last.txtpb b/data/maps/the_entry/rooms/Least Blue Last.txtpb index 0f198b7..dde203a 100644 --- a/data/maps/the_entry/rooms/Least Blue Last.txtpb +++ b/data/maps/the_entry/rooms/Least Blue Last.txtpb
@@ -1,5 +1,5 @@
1name: "Least Blue Last" 1name: "Least Blue Last"
2display_name: "Red Blue Area" 2panel_display_name: "Red Blue Area"
3panels { 3panels {
4 name: "CAPABLE (1)" 4 name: "CAPABLE (1)"
5 path: "Panels/LBL/lbl_1" 5 path: "Panels/LBL/lbl_1"
@@ -72,8 +72,10 @@ panels {
72} 72}
73ports { 73ports {
74 name: "DARKROOM" 74 name: "DARKROOM"
75 display_name: "Near L1 Worldport"
75 path: "Components/Warps/worldport5" 76 path: "Components/Warps/worldport5"
76 orientation: "south" 77 destination { x: 43 y: 0 z: -10 }
78 rotation: 0
77} 79}
78paintings { 80paintings {
79 name: "PAINS" 81 name: "PAINS"
diff --git a/data/maps/the_entry/rooms/Liberated Entrance Panel.txtpb b/data/maps/the_entry/rooms/Liberated Entrance Panel.txtpb new file mode 100644 index 0000000..7c5ef71 --- /dev/null +++ b/data/maps/the_entry/rooms/Liberated Entrance Panel.txtpb
@@ -0,0 +1,9 @@
1name: "Liberated Entrance Panel"
2panel_display_name: "Pyramid Area"
3panels {
4 name: "TURN (1)"
5 path: "Panels/Entry/l_opener_3"
6 clue: "turn"
7 answer: "flip"
8 symbols: SUN
9}
diff --git a/data/maps/the_entry/rooms/Liberated Entrance.txtpb b/data/maps/the_entry/rooms/Liberated Entrance.txtpb new file mode 100644 index 0000000..56cc597 --- /dev/null +++ b/data/maps/the_entry/rooms/Liberated Entrance.txtpb
@@ -0,0 +1,8 @@
1name: "Liberated Entrance"
2ports {
3 name: "BLUE"
4 display_name: "Pyramid Area Blue Worldport"
5 path: "worldport8"
6 destination { x: 18 y: 0 z: 55 }
7 rotation: 270
8}
diff --git a/data/maps/the_entry/rooms/Lime Room.txtpb b/data/maps/the_entry/rooms/Lime Room.txtpb index 1e38b62..603fbdc 100644 --- a/data/maps/the_entry/rooms/Lime Room.txtpb +++ b/data/maps/the_entry/rooms/Lime Room.txtpb
@@ -1,5 +1,5 @@
1name: "Lime Room" 1name: "Lime Room"
2display_name: "Colored Doors Area" 2panel_display_name: "Colored Doors Area"
3panels { 3panels {
4 name: "HIDE" 4 name: "HIDE"
5 path: "Panels/Back Left/backleft_proxying_3" 5 path: "Panels/Back Left/backleft_proxying_3"
@@ -19,15 +19,3 @@ panels {
19 answer: "white" 19 answer: "white"
20 symbols: EXAMPLE 20 symbols: EXAMPLE
21} 21}
22ports {
23 name: "DAEDALUS"
24 path: "Components/Warps/worldport11"
25 orientation: "west"
26 required_door { name: "Control Center White Door" }
27}
28ports {
29 name: "REVITALIZED"
30 path: "worldport7"
31 orientation: "north"
32 required_door { name: "Revitalized Entrance" }
33} \ No newline at end of file
diff --git a/data/maps/the_entry/rooms/Link Area.txtpb b/data/maps/the_entry/rooms/Link Area.txtpb index 2866abd..5b68279 100644 --- a/data/maps/the_entry/rooms/Link Area.txtpb +++ b/data/maps/the_entry/rooms/Link Area.txtpb
@@ -1,11 +1,12 @@
1name: "Link Area" 1name: "Link Area"
2display_name: "Pyramid Area" 2panel_display_name: "Pyramid Area"
3panels { 3panels {
4 name: "WANDER" 4 name: "WANDER"
5 path: "Panels/Pilgrimage/cream_3" 5 path: "Panels/Pilgrimage/cream_3"
6 clue: "wander" 6 clue: "wander"
7 answer: "amble" 7 answer: "amble"
8 symbols: SUN 8 symbols: SUN
9 display_name: "WANDER (Obverse)"
9} 10}
10paintings { 11paintings {
11 name: "NEAR" 12 name: "NEAR"
@@ -25,15 +26,3 @@ paintings {
25 orientation: "south" 26 orientation: "south"
26 display_name: "Center Painting" 27 display_name: "Center Painting"
27} 28}
28ports {
29 name: "BLUE"
30 path: "worldport8"
31 orientation: "west"
32 required_door { name: "Liberated Entrance" }
33}
34ports {
35 name: "BROWN"
36 path: "worldport9"
37 orientation: "east"
38 required_door { name: "Literate Entrance" }
39} \ No newline at end of file
diff --git a/data/maps/the_entry/rooms/Literate Entrance Panel.txtpb b/data/maps/the_entry/rooms/Literate Entrance Panel.txtpb new file mode 100644 index 0000000..676598b --- /dev/null +++ b/data/maps/the_entry/rooms/Literate Entrance Panel.txtpb
@@ -0,0 +1,9 @@
1name: "Literate Entrance Panel"
2panel_display_name: "Pyramid Area"
3panels {
4 name: "TURN (2)"
5 path: "Panels/Entry/l_opener_4"
6 clue: "turn"
7 answer: "spin"
8 symbols: SUN
9}
diff --git a/data/maps/the_entry/rooms/Literate Entrance.txtpb b/data/maps/the_entry/rooms/Literate Entrance.txtpb new file mode 100644 index 0000000..b86ac80 --- /dev/null +++ b/data/maps/the_entry/rooms/Literate Entrance.txtpb
@@ -0,0 +1,8 @@
1name: "Literate Entrance"
2ports {
3 name: "BROWN"
4 display_name: "Pyramid Area Brown Worldport"
5 path: "worldport9"
6 destination { x: 39 y: 0 z: 55 }
7 rotation: 90
8}
diff --git a/data/maps/the_entry/rooms/Parthenon Return.txtpb b/data/maps/the_entry/rooms/Parthenon Return.txtpb index 5a7f6b8..bb12964 100644 --- a/data/maps/the_entry/rooms/Parthenon Return.txtpb +++ b/data/maps/the_entry/rooms/Parthenon Return.txtpb
@@ -1,5 +1,5 @@
1name: "Parthenon Return" 1name: "Parthenon Return"
2display_name: "Starting Room" 2panel_display_name: "Parthenon Return"
3panels { 3panels {
4 name: "RETURN" 4 name: "RETURN"
5 path: "Panels/Back Left/backleft_return" 5 path: "Panels/Back Left/backleft_return"
@@ -9,6 +9,8 @@ panels {
9} 9}
10ports { 10ports {
11 name: "PARTHENON" 11 name: "PARTHENON"
12 display_name: "Parthenon Return"
12 path: "Components/Warps/worldport8" 13 path: "Components/Warps/worldport8"
13 orientation: "north" 14 destination { x: -5.5 y: 0 z: 18 }
14} \ No newline at end of file 15 rotation: 180
16}
diff --git a/data/maps/the_entry/rooms/Rabbit Hole Lock.txtpb b/data/maps/the_entry/rooms/Rabbit Hole Lock.txtpb new file mode 100644 index 0000000..78b4f3b --- /dev/null +++ b/data/maps/the_entry/rooms/Rabbit Hole Lock.txtpb
@@ -0,0 +1,18 @@
1name: "Rabbit Hole Lock"
2panel_display_name: "Red Blue Area"
3panels {
4 name: "RABBIT"
5 path: "Panels/Back Right/br_4"
6 clue: "rabbit"
7 answer: "hair"
8 symbols: SUN
9 symbols: ZERO
10}
11panels {
12 name: "HOLE"
13 path: "Panels/Back Right/br_5"
14 clue: "hole"
15 answer: "part"
16 symbols: ZERO
17 symbols: BOXES
18}
diff --git a/data/maps/the_entry/rooms/Rabbit Hole.txtpb b/data/maps/the_entry/rooms/Rabbit Hole.txtpb index 9b18bc8..4799fde 100644 --- a/data/maps/the_entry/rooms/Rabbit Hole.txtpb +++ b/data/maps/the_entry/rooms/Rabbit Hole.txtpb
@@ -1,13 +1,15 @@
1name: "Rabbit Hole" 1name: "Rabbit Hole"
2display_name: "Red Blue Area" 2panel_display_name: "Red Blue Area"
3panels { 3panels {
4 name: "PUZZLE" 4 name: "Blank"
5 path: "Panels/Back Right/br_6" 5 path: "Panels/Back Right/br_6"
6 clue: "" 6 clue: ""
7 answer: "down" 7 answer: "down"
8} 8}
9ports { 9ports {
10 name: "HOLE" 10 name: "HOLE"
11 display_name: "Rabbit Hole"
11 path: "worldport4" 12 path: "worldport4"
12 orientation: "down" 13 destination { x: 74 y: 0 z: -43 }
13} \ No newline at end of file 14 rotation: 0
15}
diff --git a/data/maps/the_entry/rooms/Red Alcove.txtpb b/data/maps/the_entry/rooms/Red Alcove.txtpb index 5c4085e..503b4a9 100644 --- a/data/maps/the_entry/rooms/Red Alcove.txtpb +++ b/data/maps/the_entry/rooms/Red Alcove.txtpb
@@ -1,5 +1,5 @@
1name: "Red Alcove" 1name: "Red Alcove"
2display_name: "Red Blue Area" 2panel_display_name: "Red Blue Area"
3panels { 3panels {
4 name: "BROW" 4 name: "BROW"
5 path: "Panels/Back Right/br_10" 5 path: "Panels/Back Right/br_10"
diff --git a/data/maps/the_entry/rooms/Red Blue Halls.txtpb b/data/maps/the_entry/rooms/Red Blue Halls.txtpb index 7d07f9e..789ca42 100644 --- a/data/maps/the_entry/rooms/Red Blue Halls.txtpb +++ b/data/maps/the_entry/rooms/Red Blue Halls.txtpb
@@ -1,5 +1,5 @@
1name: "Red Blue Halls" 1name: "Red Blue Halls"
2display_name: "Red Blue Area" 2panel_display_name: "Red Blue Area"
3panels { 3panels {
4 name: "CENTER" 4 name: "CENTER"
5 path: "Panels/Back Right/br_1" 5 path: "Panels/Back Right/br_1"
diff --git a/data/maps/the_entry/rooms/Repetitive Entrance.txtpb b/data/maps/the_entry/rooms/Repetitive Entrance.txtpb index 982e3f3..a83eea4 100644 --- a/data/maps/the_entry/rooms/Repetitive Entrance.txtpb +++ b/data/maps/the_entry/rooms/Repetitive Entrance.txtpb
@@ -1,7 +1,9 @@
1name: "Repetitive Entrance" 1name: "Repetitive Entrance"
2display_name: "Starting Room" 2panel_display_name: "Starting Room"
3ports { 3ports {
4 name: "REPETITIVE" 4 name: "REPETITIVE"
5 display_name: "Starting Room West Wall North Worldport"
5 path: "Components/Warps/worldport7" 6 path: "Components/Warps/worldport7"
6 orientation: "north" 7 destination { x: -20 y: 0 z: -16 }
8 rotation: 180
7} 9}
diff --git a/data/maps/the_entry/rooms/Revitalized Entrance.txtpb b/data/maps/the_entry/rooms/Revitalized Entrance.txtpb new file mode 100644 index 0000000..fb5e7e0 --- /dev/null +++ b/data/maps/the_entry/rooms/Revitalized Entrance.txtpb
@@ -0,0 +1,9 @@
1name: "Revitalized Entrance"
2panel_display_name: "Colored Doors Area"
3ports {
4 name: "REVITALIZED"
5 display_name: "Plum Hallway"
6 path: "worldport7"
7 destination { x: -58 y: 0 z: 31.5 }
8 rotation: 180
9}
diff --git a/data/maps/the_entry/rooms/Right Eye.txtpb b/data/maps/the_entry/rooms/Right Eye.txtpb index 1c7bf68..8f6c431 100644 --- a/data/maps/the_entry/rooms/Right Eye.txtpb +++ b/data/maps/the_entry/rooms/Right Eye.txtpb
@@ -1,5 +1,5 @@
1name: "Right Eye" 1name: "Right Eye"
2display_name: "Right Eye Area" 2panel_display_name: "Right Eye Area"
3panels { 3panels {
4 name: "EYE" 4 name: "EYE"
5 path: "Panels/Entry/front_2" 5 path: "Panels/Entry/front_2"
diff --git a/data/maps/the_entry/rooms/Shop Entrance.txtpb b/data/maps/the_entry/rooms/Shop Entrance.txtpb index b52cde7..4a99efa 100644 --- a/data/maps/the_entry/rooms/Shop Entrance.txtpb +++ b/data/maps/the_entry/rooms/Shop Entrance.txtpb
@@ -1,5 +1,5 @@
1name: "Shop Entrance" 1name: "Shop Entrance"
2display_name: "Starting Room" 2panel_display_name: "Shop Entrance"
3panels { 3panels {
4 name: "TURN" 4 name: "TURN"
5 path: "Panels/Entry/l_opener_2" 5 path: "Panels/Entry/l_opener_2"
@@ -9,6 +9,8 @@ panels {
9} 9}
10ports { 10ports {
11 name: "SHOP" 11 name: "SHOP"
12 display_name: "Shop Entrance"
12 path: "Components/Warps/worldport13" 13 path: "Components/Warps/worldport13"
13 orientation: "east" 14 destination { x: 18 y: 0 z: 49 }
15 rotation: 90
14} \ No newline at end of file 16} \ No newline at end of file
diff --git a/data/maps/the_entry/rooms/Starting Room.txtpb b/data/maps/the_entry/rooms/Starting Room.txtpb index aeb66ab..d01d807 100644 --- a/data/maps/the_entry/rooms/Starting Room.txtpb +++ b/data/maps/the_entry/rooms/Starting Room.txtpb
@@ -1,10 +1,11 @@
1name: "Starting Room" 1name: "Starting Room"
2display_name: "Starting Room" 2panel_display_name: "Starting Room"
3panels { 3panels {
4 name: "HI" 4 name: "HI"
5 path: "Panels/Entry/entry_proxying_1" 5 path: "Panels/Entry/entry_proxying_1"
6 clue: "hi" 6 clue: "hi"
7 answer: "hi" 7 answer: "hi"
8 proxies { answer: "hi" path: "Panels/Entry/entry_proxied_1" }
8 proxies { answer: "bye" path: "Panels/Entry/entry_proxied_2" } 9 proxies { answer: "bye" path: "Panels/Entry/entry_proxied_2" }
9 proxies { answer: "hidden" path: "Panels/Entry/entry_proxied_5" } 10 proxies { answer: "hidden" path: "Panels/Entry/entry_proxied_5" }
10 proxies { answer: "high" path: "Panels/Entry/entry_proxied_3" } 11 proxies { answer: "high" path: "Panels/Entry/entry_proxied_3" }
@@ -23,7 +24,9 @@ panels {
23 path: "Panels/Entry/front_1" 24 path: "Panels/Entry/front_1"
24 clue: "eye" 25 clue: "eye"
25 answer: "i" 26 answer: "i"
26 symbols: ZERO 27 #symbols: ZERO
28 # This panel blocks getting N1 and T1. We will mod it to be I/I with no symbol
29 # when symbol shuffle is on.
27} 30}
28panels { 31panels {
29 name: "HINT" 32 name: "HINT"
@@ -43,6 +46,25 @@ panels {
43 clue: "than" 46 clue: "than"
44 answer: "than" 47 answer: "than"
45} 48}
49panels {
50 name: "Gift Maps"
51 # TODO: exclude from panelsanity
52 path: "Components/GiftMapEntrance/Panel"
53 clue: "player"
54 answer: ""
55 # The puzzle solution doesn't matter. We'll change it to the player's name
56 # for fun.
57 symbols: QUESTION
58 proxies { answer: "gongus" path: "Components/GiftMapEntrance/GongusPanel" }
59 proxies { answer: "hatkirby" path: "Components/GiftMapEntrance/HatkirbyPanel" }
60 proxies { answer: "icely" path: "Components/GiftMapEntrance/IcelyPanel" }
61 proxies { answer: "kirby" path: "Components/GiftMapEntrance/KirbyPanel" }
62 proxies { answer: "kiwi" path: "Components/GiftMapEntrance/KiwiPanel" }
63 proxies { answer: "q" path: "Components/GiftMapEntrance/QPanel" }
64 proxies { answer: "souvey" path: "Components/GiftMapEntrance/SouveyPanel" }
65 proxies { answer: "star" path: "Components/GiftMapEntrance/StarPanel" }
66 required_door { name: "Gift Maps Entrance" }
67}
46letters { 68letters {
47 key: "h" 69 key: "h"
48 path: "Components/Collectables/h" 70 path: "Components/Collectables/h"
diff --git a/data/maps/the_entry/rooms/Trick Room.txtpb b/data/maps/the_entry/rooms/Trick Room.txtpb index ff9be38..d20502e 100644 --- a/data/maps/the_entry/rooms/Trick Room.txtpb +++ b/data/maps/the_entry/rooms/Trick Room.txtpb
@@ -1,5 +1,5 @@
1name: "Trick Room" 1name: "Trick Room"
2display_name: "Starting Room" 2panel_display_name: "Starting Room"
3panels { 3panels {
4 name: "INK" 4 name: "INK"
5 path: "Panels/Entry/l_opener_1" 5 path: "Panels/Entry/l_opener_1"
diff --git a/data/maps/the_entry/rooms/White Hallway To Daedalus.txtpb b/data/maps/the_entry/rooms/White Hallway To Daedalus.txtpb new file mode 100644 index 0000000..de0cec2 --- /dev/null +++ b/data/maps/the_entry/rooms/White Hallway To Daedalus.txtpb
@@ -0,0 +1,9 @@
1name: "White Hallway To Daedalus"
2panel_display_name: "Colored Doors Area"
3ports {
4 name: "DAEDALUS"
5 display_name: "White Control Center Hallway"
6 path: "Components/Warps/worldport11"
7 destination { x: -45 y: 0 z: 24 }
8 rotation: 270
9}
diff --git a/data/maps/the_entry/rooms/Wrath Room.txtpb b/data/maps/the_entry/rooms/Wrath Room.txtpb index 29bd1cb..903a0b7 100644 --- a/data/maps/the_entry/rooms/Wrath Room.txtpb +++ b/data/maps/the_entry/rooms/Wrath Room.txtpb
@@ -1,21 +1,5 @@
1name: "Wrath Room" 1name: "Wrath Room"
2display_name: "Red Blue Area" 2panel_display_name: "Red Blue Area"
3panels {
4 name: "RABBIT"
5 path: "Panels/Back Right/br_4"
6 clue: "rabbit"
7 answer: "hair"
8 symbols: SUN
9 symbols: ZERO
10}
11panels {
12 name: "HOLE"
13 path: "Panels/Back Right/br_5"
14 clue: "hole"
15 answer: "part"
16 symbols: ZERO
17 symbols: BOXES
18}
19panels { 3panels {
20 name: "WREATH" 4 name: "WREATH"
21 path: "Panels/Back Right/br_17" 5 path: "Panels/Back Right/br_17"
diff --git a/data/maps/the_entry/rooms/X Area.txtpb b/data/maps/the_entry/rooms/X Area.txtpb index ada16f8..8388b4e 100644 --- a/data/maps/the_entry/rooms/X Area.txtpb +++ b/data/maps/the_entry/rooms/X Area.txtpb
@@ -1,11 +1,13 @@
1name: "X Area" 1name: "X Area"
2display_name: "Starting Room" 2panel_display_name: "Starting Room"
3letters { 3letters {
4 key: "x" 4 key: "x"
5 path: "Components/Collectables/x" 5 path: "Components/Collectables/x"
6} 6}
7ports { 7ports {
8 name: "CC" 8 name: "CC"
9 display_name: "Near X1 Worldport"
9 path: "Components/Warps/worldport3" 10 path: "Components/Warps/worldport3"
10 orientation: "west" 11 destination { x: -12.5 y: 0 z: 60 }
12 rotation: 270
11} 13}
diff --git a/data/maps/the_extravagant/rooms/E Room.txtpb b/data/maps/the_extravagant/rooms/E Room.txtpb index 4b1f284..2f91764 100644 --- a/data/maps/the_extravagant/rooms/E Room.txtpb +++ b/data/maps/the_extravagant/rooms/E Room.txtpb
@@ -1,5 +1,4 @@
1name: "E Room" 1name: "E Room"
2display_name: "3"
3letters { 2letters {
4 key: "e" 3 key: "e"
5 path: "Components/Collectables/e" 4 path: "Components/Collectables/e"
diff --git a/data/maps/the_extravagant/rooms/Engine Room.txtpb b/data/maps/the_extravagant/rooms/Engine Room.txtpb index 79b60fc..18dfcad 100644 --- a/data/maps/the_extravagant/rooms/Engine Room.txtpb +++ b/data/maps/the_extravagant/rooms/Engine Room.txtpb
@@ -1,5 +1,4 @@
1name: "Engine Room" 1name: "Engine Room"
2display_name: "Engine Room"
3panels { 2panels {
4 name: "ENGINE" 3 name: "ENGINE"
5 path: "Panels/panel_8" 4 path: "Panels/panel_8"
@@ -23,7 +22,9 @@ paintings {
23} 22}
24ports { 23ports {
25 name: "GALLERY" 24 name: "GALLERY"
25 display_name: "Engine Room Worldport"
26 path: "Components/Warps/worldport2" 26 path: "Components/Warps/worldport2"
27 gravity: Z_PLUS 27 gravity: Z_PLUS
28 # TODO: orientation is not well defined with Z-axis gravity 28 # TODO: entrance shuffling for non Y_MINUS gravity
29 no_shuffle: true
29} 30}
diff --git a/data/maps/the_extravagant/rooms/Hat Chamber.txtpb b/data/maps/the_extravagant/rooms/Hat Chamber.txtpb index 049959c..a100130 100644 --- a/data/maps/the_extravagant/rooms/Hat Chamber.txtpb +++ b/data/maps/the_extravagant/rooms/Hat Chamber.txtpb
@@ -1,5 +1,4 @@
1name: "Hat Chamber" 1name: "Hat Chamber"
2display_name: "3"
3panels { 2panels {
4 name: "BRIM" 3 name: "BRIM"
5 path: "Panels/panel_14" 4 path: "Panels/panel_14"
diff --git a/data/maps/the_extravagant/rooms/X Minus Middle Leg.txtpb b/data/maps/the_extravagant/rooms/X Minus Middle Leg.txtpb index 660a7dd..1455a4b 100644 --- a/data/maps/the_extravagant/rooms/X Minus Middle Leg.txtpb +++ b/data/maps/the_extravagant/rooms/X Minus Middle Leg.txtpb
@@ -1,5 +1,4 @@
1name: "X Minus Middle Leg" 1name: "X Minus Middle Leg"
2display_name: "W"
3panels { 2panels {
4 name: "ANTENNA" 3 name: "ANTENNA"
5 path: "Panels/panel_7" 4 path: "Panels/panel_7"
diff --git a/data/maps/the_extravagant/rooms/X Minus Right Leg.txtpb b/data/maps/the_extravagant/rooms/X Minus Right Leg.txtpb index ce731b6..ea45e10 100644 --- a/data/maps/the_extravagant/rooms/X Minus Right Leg.txtpb +++ b/data/maps/the_extravagant/rooms/X Minus Right Leg.txtpb
@@ -1,5 +1,4 @@
1name: "X Minus Right Leg" 1name: "X Minus Right Leg"
2display_name: "W"
3panels { 2panels {
4 name: "ROWBOAT" 3 name: "ROWBOAT"
5 path: "Panels/panel_13" 4 path: "Panels/panel_13"
diff --git a/data/maps/the_extravagant/rooms/X Minus.txtpb b/data/maps/the_extravagant/rooms/X Minus.txtpb index 3f389f1..92b15dc 100644 --- a/data/maps/the_extravagant/rooms/X Minus.txtpb +++ b/data/maps/the_extravagant/rooms/X Minus.txtpb
@@ -1,5 +1,4 @@
1name: "X Minus" 1name: "X Minus"
2display_name: "W"
3panels { 2panels {
4 name: "DUO" 3 name: "DUO"
5 path: "Panels/panel_1" 4 path: "Panels/panel_1"
diff --git a/data/maps/the_extravagant/rooms/X Plus Middle Leg.txtpb b/data/maps/the_extravagant/rooms/X Plus Middle Leg.txtpb index c656593..cb7cba6 100644 --- a/data/maps/the_extravagant/rooms/X Plus Middle Leg.txtpb +++ b/data/maps/the_extravagant/rooms/X Plus Middle Leg.txtpb
@@ -1,5 +1,4 @@
1name: "X Plus Middle Leg" 1name: "X Plus Middle Leg"
2display_name: "M"
3panels { 2panels {
4 name: "COLONY" 3 name: "COLONY"
5 path: "Panels/panel_10" 4 path: "Panels/panel_10"
diff --git a/data/maps/the_extravagant/rooms/X Plus Right Leg.txtpb b/data/maps/the_extravagant/rooms/X Plus Right Leg.txtpb index 7c75550..98dfad6 100644 --- a/data/maps/the_extravagant/rooms/X Plus Right Leg.txtpb +++ b/data/maps/the_extravagant/rooms/X Plus Right Leg.txtpb
@@ -1,5 +1,4 @@
1name: "X Plus Right Leg" 1name: "X Plus Right Leg"
2display_name: "M"
3panels { 2panels {
4 name: "HEAD" 3 name: "HEAD"
5 path: "Panels/panel_4" 4 path: "Panels/panel_4"
diff --git a/data/maps/the_extravagant/rooms/X Plus.txtpb b/data/maps/the_extravagant/rooms/X Plus.txtpb index db42770..a1c4b9d 100644 --- a/data/maps/the_extravagant/rooms/X Plus.txtpb +++ b/data/maps/the_extravagant/rooms/X Plus.txtpb
@@ -1,5 +1,4 @@
1name: "X Plus" 1name: "X Plus"
2display_name: "M"
3panels { 2panels {
4 name: "ROSE" 3 name: "ROSE"
5 path: "Panels/panel_16" 4 path: "Panels/panel_16"
@@ -24,4 +23,5 @@ paintings {
24keyholders { 23keyholders {
25 name: "M" 24 name: "M"
26 path: "Components/KeyHolders/keyHolderM" 25 path: "Components/KeyHolders/keyHolderM"
26 key: "m"
27} 27}
diff --git a/data/maps/the_extravagant/rooms/Y Minus First Floor.txtpb b/data/maps/the_extravagant/rooms/Y Minus First Floor.txtpb index 1429fa8..f80d68a 100644 --- a/data/maps/the_extravagant/rooms/Y Minus First Floor.txtpb +++ b/data/maps/the_extravagant/rooms/Y Minus First Floor.txtpb
@@ -1,5 +1,4 @@
1name: "Y Minus First Floor" 1name: "Y Minus First Floor"
2display_name: "3"
3panels { 2panels {
4 name: "RHINO" 3 name: "RHINO"
5 path: "Panels/panel_2" 4 path: "Panels/panel_2"
diff --git a/data/maps/the_extravagant/rooms/Y Minus Second Floor.txtpb b/data/maps/the_extravagant/rooms/Y Minus Second Floor.txtpb index be3238a..34a3c9d 100644 --- a/data/maps/the_extravagant/rooms/Y Minus Second Floor.txtpb +++ b/data/maps/the_extravagant/rooms/Y Minus Second Floor.txtpb
@@ -1,5 +1,4 @@
1name: "Y Minus Second Floor" 1name: "Y Minus Second Floor"
2display_name: "3"
3panels { 2panels {
4 name: "COMPASS" 3 name: "COMPASS"
5 path: "Panels/panel_5" 4 path: "Panels/panel_5"
diff --git a/data/maps/the_extravagant/rooms/Y Minus Third Floor.txtpb b/data/maps/the_extravagant/rooms/Y Minus Third Floor.txtpb index 881d42d..7aa5e1c 100644 --- a/data/maps/the_extravagant/rooms/Y Minus Third Floor.txtpb +++ b/data/maps/the_extravagant/rooms/Y Minus Third Floor.txtpb
@@ -1,5 +1,4 @@
1name: "Y Minus Third Floor" 1name: "Y Minus Third Floor"
2display_name: "3"
3panels { 2panels {
4 name: "WHISKERS" 3 name: "WHISKERS"
5 path: "Panels/panel_11" 4 path: "Panels/panel_11"
diff --git a/data/maps/the_extravagant/rooms/Y Plus First Floor.txtpb b/data/maps/the_extravagant/rooms/Y Plus First Floor.txtpb index 9c8120c..6226aa6 100644 --- a/data/maps/the_extravagant/rooms/Y Plus First Floor.txtpb +++ b/data/maps/the_extravagant/rooms/Y Plus First Floor.txtpb
@@ -1,5 +1,4 @@
1name: "Y Plus First Floor" 1name: "Y Plus First Floor"
2display_name: "E"
3paintings { 2paintings {
4 name: "UNDUE" 3 name: "UNDUE"
5 path: "Components/Paintings/undue4" 4 path: "Components/Paintings/undue4"
diff --git a/data/maps/the_extravagant/rooms/Y Plus Third Floor.txtpb b/data/maps/the_extravagant/rooms/Y Plus Third Floor.txtpb index bdc45b9..1cf0480 100644 --- a/data/maps/the_extravagant/rooms/Y Plus Third Floor.txtpb +++ b/data/maps/the_extravagant/rooms/Y Plus Third Floor.txtpb
@@ -1,6 +1,5 @@
1name: "Y Plus Third Floor" 1name: "Y Plus Third Floor"
2# It's the second floor too... 2# It's the second floor too...
3display_name: "E"
4panels { 3panels {
5 name: "CACTUS" 4 name: "CACTUS"
6 path: "Panels/panel_6" 5 path: "Panels/panel_6"
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 @@
1connections {
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..9c481c9 --- /dev/null +++ b/data/maps/the_fuzzy/doors.txtpb
@@ -0,0 +1,29 @@
1doors {
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}
8doors {
9 name: "Green Panels"
10 type: LOCATION_ONLY
11 panels { room: "Main Area" name: "ACHIEVES" }
12 panels { room: "Main Area" name: "BEFORE" }
13 panels { room: "Main Area" name: "Blank" }
14 panels { room: "Main Area" name: "BOTH" }
15 panels { room: "Main Area" name: "CAGED" }
16 panels { room: "Main Area" name: "DICE" }
17 panels { room: "Main Area" name: "FIRST" }
18 panels { room: "Main Area" name: "FORGED" }
19 panels { room: "Main Area" name: "LOTTO" }
20 panels { room: "Main Area" name: "TOED" }
21 panels { room: "Main Area" name: "TUTU" }
22 panels { room: "Main Area" name: "UNVEILED" }
23 location_room: "Main Area"
24}
25doors {
26 name: "Mastery Door"
27 type: EVENT
28 panels { room: "Main Area" name: "OTHERS" }
29}
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 @@
1display_name: "The Fuzzy"
2type: GIFT_MAP
3# The map's mastery is created at runtime.
4custom_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 @@
1name: "Main Area"
2panels {
3 name: "Blank"
4 path: "Panels/Room_1/panel_1"
5 clue: ""
6 answer: "2475"
7 symbols: LINGO
8 symbols: QUESTION
9}
10panels {
11 name: "TUTU"
12 path: "Panels/Room_1/panel_2"
13 clue: "tutu"
14 answer: "22"
15 symbols: ZERO
16 symbols: EVAL
17}
18panels {
19 name: "LOTTO"
20 path: "Panels/Room_1/panel_3"
21 clue: "lotto"
22 answer: "22222222"
23 symbols: ZERO
24 symbols: EVAL
25}
26panels {
27 name: "WHERETO"
28 path: "Panels/Room_1/panel_10"
29 clue: "whereto"
30 answer: "sides"
31 symbols: QUESTION
32}
33panels {
34 name: "DICE"
35 path: "Panels/Room_1/panel_11"
36 clue: "dice"
37 answer: "4935"
38 symbols: QUESTION
39}
40panels {
41 name: "CAGED"
42 path: "Panels/Room_1/panel_12"
43 clue: "caged"
44 answer: "31754"
45 symbols: QUESTION
46}
47panels {
48 name: "BEFORE"
49 path: "Panels/Room_1/panel_13"
50 clue: "before"
51 answer: "100"
52 symbols: ZERO
53 symbols: EVAL
54}
55panels {
56 name: "TOED"
57 path: "Panels/Room_1/panel_14"
58 clue: "toed"
59 answer: "108"
60 symbols: ZERO
61 symbols: EVAL
62}
63panels {
64 name: "FORGED"
65 path: "Panels/Room_1/panel_15"
66 clue: "forged"
67 answer: "3016"
68 symbols: ZERO
69 symbols: EVAL
70}
71panels {
72 name: "OTHERS"
73 path: "Panels/Room_1/panel_4"
74 clue: "others"
75 answer: "34390869"
76 symbols: QUESTION
77}
78panels {
79 name: "COMBINED"
80 path: "Panels/Room_1/panel_9"
81 clue: "combined"
82 answer: "added"
83 symbols: SUN
84}
85panels {
86 name: "ACHIEVES"
87 path: "Panels/Room_1/panel_5"
88 clue: "achieves"
89 answer: "4214"
90 symbols: QUESTION
91}
92panels {
93 name: "UNVEILED"
94 path: "Panels/Room_1/panel_6"
95 clue: "unveiled"
96 answer: "12122021"
97 symbols: QUESTION
98}
99panels {
100 name: "FIRST"
101 path: "Panels/Room_1/panel_8"
102 clue: "first"
103 answer: "1"
104 symbols: QUESTION
105}
106panels {
107 name: "BOTH"
108 path: "Panels/Room_1/panel_7"
109 clue: "both"
110 answer: "2"
111 symbols: QUESTION
112}
113ports {
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 @@
1name: "Mastery"
2masteries {
3 name: "MASTERY"
4 path: "Components/Collectables/collectable"
5}
diff --git a/data/maps/the_gallery/doors.txtpb b/data/maps/the_gallery/doors.txtpb index 0cab628..9bbc016 100644 --- a/data/maps/the_gallery/doors.txtpb +++ b/data/maps/the_gallery/doors.txtpb
@@ -1,8 +1,9 @@
1# The Gallery is interesting because there's so many cross-map requirements. 1# The Gallery is interesting because there's so many cross-map requirements.
2doors { 2doors {
3 name: "Darkroom Painting" 3 name: "Darkroom Painting"
4 type: ITEM_ONLY 4 type: GALLERY_PAINTING
5 move_paintings { room: "Main Area" name: "DARKROOM" } 5 #move_paintings { room: "Main Area" name: "DARKROOM" }
6 receivers: "Components/Listeners/Hint Room/unlockReaderListenerDarkroom"
6 panels { map: "the_darkroom" room: "First Room" name: "BISON" } 7 panels { map: "the_darkroom" room: "First Room" name: "BISON" }
7 panels { map: "the_darkroom" room: "First Room" name: "FISH" } 8 panels { map: "the_darkroom" room: "First Room" name: "FISH" }
8 panels { map: "the_darkroom" room: "First Room" name: "SHEEP" } 9 panels { map: "the_darkroom" room: "First Room" name: "SHEEP" }
@@ -26,14 +27,16 @@ doors {
26} 27}
27doors { 28doors {
28 name: "Butterfly Painting" 29 name: "Butterfly Painting"
29 type: ITEM_ONLY 30 type: GALLERY_PAINTING
30 move_paintings { room: "Main Area" name: "BUTTERFLY" } 31 #move_paintings { room: "Main Area" name: "BUTTERFLY" }
32 receivers: "Components/Listeners/Hint Room/unlockReaderListenerButterfly"
31 rooms { map: "the_butterfly" name: "Main Area" } 33 rooms { map: "the_butterfly" name: "Main Area" }
32} 34}
33doors { 35doors {
34 name: "Between Painting" 36 name: "Between Painting"
35 type: ITEM_ONLY 37 type: GALLERY_PAINTING
36 move_paintings { room: "Main Area" name: "BETWEEN" } 38 #move_paintings { room: "Main Area" name: "BETWEEN" }
39 receivers: "Components/Listeners/Hint Room/unlockReaderListenerBetween"
37 panels { map: "the_between" room: "Main Area" name: "SUN" } 40 panels { map: "the_between" room: "Main Area" name: "SUN" }
38 panels { map: "the_between" room: "Main Area" name: "KOI" } 41 panels { map: "the_between" room: "Main Area" name: "KOI" }
39 panels { map: "the_between" room: "Main Area" name: "SUN KOI" } 42 panels { map: "the_between" room: "Main Area" name: "SUN KOI" }
@@ -67,86 +70,161 @@ doors {
67} 70}
68doors { 71doors {
69 name: "Entry Painting" 72 name: "Entry Painting"
70 type: ITEM_ONLY 73 type: GALLERY_PAINTING
71 move_paintings { room: "Main Area" name: "ENTRY" } 74 #move_paintings { room: "Main Area" name: "ENTRY" }
75 receivers: "Components/Listeners/Hint Room/unlockReaderListenerEyes"
72 panels { map: "the_entry" room: "Eye Room" name: "I" } 76 panels { map: "the_entry" room: "Eye Room" name: "I" }
73} 77}
74doors { 78doors {
75 name: "Wise Painting" 79 name: "Wise Painting"
76 type: ITEM_ONLY 80 type: GALLERY_PAINTING
77 move_paintings { room: "Main Area" name: "WISE" } 81 #move_paintings { room: "Main Area" name: "WISE" }
78 # TODO: any panel in The Wise 82 receivers: "Components/Listeners/Hint Room/unlockReaderListenerTriangle"
83 panels { map: "the_wise" room: "Entry" name: "INK" }
84 panels { map: "the_wise" room: "Puzzles" name: "STORY" }
85 panels { map: "the_wise" room: "Puzzles" name: "VENTURE" }
86 panels { map: "the_wise" room: "Puzzles" name: "PASSED" }
87 panels { map: "the_wise" room: "Puzzles" name: "SLUMBERING" }
88 panels { map: "the_wise" room: "Puzzles" name: "RHYME" }
89 panels { map: "the_wise" room: "Puzzles" name: "OBSCURE" }
90 panels { map: "the_wise" room: "Puzzles" name: "PROPHET" }
91 panels { map: "the_wise" room: "Puzzles" name: "ERAS" }
92 panels { map: "the_wise" room: "Puzzles" name: "DARKNESS" }
93 panels { map: "the_wise" room: "Puzzles" name: "PRINCE" }
94 panels { map: "the_wise" room: "Puzzles" name: "BATH" }
95 panels { map: "the_wise" room: "Puzzles" name: "CHAOTIC" }
96 panels { map: "the_wise" room: "Puzzles" name: "EYES" }
97 panels { map: "the_wise" room: "Puzzles" name: "QUEENDOOM" }
98 panels { map: "the_wise" room: "Puzzles" name: "SHOUTS" }
99 panels { map: "the_wise" room: "Puzzles" name: "INTELLIGENCE" }
100 panels { map: "the_wise" room: "Puzzles" name: "EARTHWAR" }
101 panels { map: "the_wise" room: "Puzzles" name: "SLEEPER" }
102 panels { map: "the_wise" room: "Puzzles" name: "BOTTLE" }
103 panels { map: "the_wise" room: "Puzzles" name: "WORDS" }
104 complete_at: 1
79} 105}
80doors { 106doors {
81 name: "Tree Painting" 107 name: "Tree Painting"
82 type: ITEM_ONLY 108 type: GALLERY_PAINTING
83 move_paintings { room: "Main Area" name: "TREE" } 109 #move_paintings { room: "Main Area" name: "TREE" }
84 # TODO: any panel in The Tree 110 receivers: "Components/Listeners/Hint Room/unlockReaderListenerTree"
111 panels { map: "the_tree" room: "Main Area" name: "COLOR" }
112 panels { map: "the_tree" room: "Main Area" name: "DAMAGE (1)" }
113 panels { map: "the_tree" room: "Main Area" name: "DAMAGE (2)" }
114 panels { map: "the_tree" room: "Main Area" name: "MEAL (1)" }
115 panels { map: "the_tree" room: "Main Area" name: "MEAL (2)" }
116 panels { map: "the_tree" room: "Main Area" name: "WALK (1)" }
117 panels { map: "the_tree" room: "Main Area" name: "WALK (2)" }
118 panels { map: "the_tree" room: "Main Area" name: "REST" }
119 panels { map: "the_tree" room: "Main Area" name: "SLEEP" }
120 panels { map: "the_tree" room: "Main Area" name: "JUMP (1)" }
121 panels { map: "the_tree" room: "Main Area" name: "JUMP (2)" }
122 panels { map: "the_tree" room: "Main Area" name: "DRIZZLE" }
123 panels { map: "the_tree" room: "Main Area" name: "WADE" }
124 panels { map: "the_tree" room: "Main Area" name: "GROW (1)" }
125 panels { map: "the_tree" room: "Main Area" name: "GROW (2)" }
126 panels { map: "the_tree" room: "Main Area" name: "GROW (3)" }
127 panels { map: "the_tree" room: "Main Area" name: "GOOD (1)" }
128 panels { map: "the_tree" room: "Main Area" name: "GOOD (2)" }
129 panels { map: "the_tree" room: "Main Area" name: "GOOD (3)" }
130 panels { map: "the_tree" room: "Main Area" name: "HOVER" }
131 panels { map: "the_tree" room: "Main Area" name: "HAPPY (1)" }
132 panels { map: "the_tree" room: "Main Area" name: "HAPPY (2)" }
133 panels { map: "the_tree" room: "Main Area" name: "HAPPY (3)" }
134 panels { map: "the_tree" room: "Main Area" name: "LIGHT (1)" }
135 panels { map: "the_tree" room: "Main Area" name: "LIGHT (2)" }
136 panels { map: "the_tree" room: "Main Area" name: "LIGHT (3)" }
137 panels { map: "the_tree" room: "Main Area" name: "SMALL (1)" }
138 panels { map: "the_tree" room: "Main Area" name: "SMALL (2)" }
139 panels { map: "the_tree" room: "Main Area" name: "SMALL (3)" }
140 panels { map: "the_tree" room: "Main Area" name: "SPRINKLE" }
141 complete_at: 1
85} 142}
86doors { 143doors {
87 name: "Unyielding Painting" 144 name: "Unyielding Painting"
88 type: ITEM_ONLY 145 type: GALLERY_PAINTING
89 move_paintings { room: "Main Area" name: "UNYIELDING" } 146 #move_paintings { room: "Main Area" name: "UNYIELDING" }
147 receivers: "Components/Listeners/Hint Room/unlockReaderListenerUnyielding"
90 rooms { map: "the_unyielding" name: "Digital Entrance" } 148 rooms { map: "the_unyielding" name: "Digital Entrance" }
91} 149}
92doors { 150doors {
93 name: "Graveyard Painting" 151 name: "Graveyard Painting"
94 type: ITEM_ONLY 152 type: GALLERY_PAINTING
95 move_paintings { room: "Main Area" name: "GRAVEYARD" } 153 #move_paintings { room: "Main Area" name: "GRAVEYARD" }
154 receivers: "Components/Listeners/Endings/unlockReaderListenerGraveyard"
96 rooms { map: "the_graveyard" name: "Outside" } 155 rooms { map: "the_graveyard" name: "Outside" }
97} 156}
98doors { 157doors {
99 name: "Control Center Painting" 158 name: "Control Center Painting"
100 type: ITEM_ONLY 159 type: GALLERY_PAINTING
101 move_paintings { room: "Main Area" name: "CC" } 160 #move_paintings { room: "Main Area" name: "CC" }
161 receivers: "Components/Listeners/Endings/unlockReaderListenerDesert"
102 rooms { map: "the_impressive" name: "M2 Room" } 162 rooms { map: "the_impressive" name: "M2 Room" }
103} 163}
104doors { 164doors {
105 name: "Tower Painting" 165 name: "Tower Painting"
106 type: ITEM_ONLY 166 type: GALLERY_PAINTING
107 move_paintings { room: "Main Area" name: "TOWER" } 167 #move_paintings { room: "Main Area" name: "TOWER" }
108 # TODO: Enter The Tower 168 receivers: "Components/Listeners/Endings/unlockReaderListenerTower"
169 rooms { map: "the_tower" name: "First Floor" }
109} 170}
110doors { 171doors {
111 name: "Wondrous Painting" 172 name: "Wondrous Painting"
112 type: ITEM_ONLY 173 type: GALLERY_PAINTING
113 move_paintings { room: "Main Area" name: "WONDROUS" } 174 #move_paintings { room: "Main Area" name: "WONDROUS" }
114 # TODO: any panel in The Wondrous 175 receivers: "Components/Listeners/Endings/unlockReaderListenerWonderland"
176 panels { map: "the_wondrous" room: "Entry" name: "WONDER" }
177 panels { map: "the_wondrous" room: "Regular" name: "SHRINK" }
178 panels { map: "the_wondrous" room: "Huge" name: "SHRINK" }
179 panels { map: "the_wondrous" room: "Huge" name: "IRE" }
180 panels { map: "the_wondrous" room: "Huge" name: "BRIE" }
181 panels { map: "the_wondrous" room: "Huge" name: "WICK" }
182 panels { map: "the_wondrous" room: "Huge" name: "BARK" }
183 panels { map: "the_wondrous" room: "Huge" name: "HARE" }
184 panels { map: "the_wondrous" room: "Huge" name: "CHIME" }
185 panels { map: "the_wondrous" room: "Huge" name: "LIBRARY" }
186 complete_at: 1
115} 187}
116doors { 188doors {
117 name: "Rainbow Painting" 189 name: "Rainbow Painting"
118 type: ITEM_ONLY 190 type: GALLERY_PAINTING
119 move_paintings { room: "Main Area" name: "RAINBOW" } 191 #move_paintings { room: "Main Area" name: "RAINBOW" }
120 # TODO: Enter the room with the rainbow painting in Daedalus 192 receivers: "Components/Listeners/Endings/unlockReaderListenerRainbow"
193 rooms { map: "daedalus" name: "Rainbow Start" }
121} 194}
122doors { 195doors {
123 name: "Words Painting" 196 name: "Words Painting"
124 type: ITEM_ONLY 197 type: GALLERY_PAINTING
125 move_paintings { room: "Main Area" name: "WORDS" } 198 #move_paintings { room: "Main Area" name: "WORDS" }
126 # TODO: Enter The Words 199 receivers: "Components/Listeners/Endings/unlockReaderListenerWords"
200 rooms { map: "the_words" name: "Main Area" }
127} 201}
128doors { 202doors {
129 name: "Colorful Painting" 203 name: "Colorful Painting"
130 type: ITEM_ONLY 204 type: GALLERY_PAINTING
131 move_paintings { room: "Main Area" name: "COLORFUL" } 205 #move_paintings { room: "Main Area" name: "COLORFUL" }
206 receivers: "Components/Listeners/Endings/unlockReaderListenerColorful"
132 rooms { map: "the_colorful" name: "White Room" } 207 rooms { map: "the_colorful" name: "White Room" }
133} 208}
134doors { 209doors {
135 name: "Castle Painting" 210 name: "Castle Painting"
136 type: ITEM_ONLY 211 type: GALLERY_PAINTING
137 move_paintings { room: "Main Area" name: "CASTLE" } 212 #move_paintings { room: "Main Area" name: "CASTLE" }
138 # TODO: Enter the castle in Daedalus 213 receivers: "Components/Listeners/Endings/unlockReaderListenerCastle"
214 rooms { map: "daedalus" name: "Castle" }
139} 215}
140doors { 216doors {
141 name: "Sun Temple Painting" 217 name: "Sun Temple Painting"
142 type: ITEM_ONLY 218 type: GALLERY_PAINTING
143 move_paintings { room: "Main Area" name: "SUNTEMPLE" } 219 #move_paintings { room: "Main Area" name: "SUNTEMPLE" }
220 receivers: "Components/Listeners/Endings/unlockReaderListenerTemple"
144 rooms { map: "the_sun_temple" name: "Entrance" } 221 rooms { map: "the_sun_temple" name: "Entrance" }
145} 222}
146doors { 223doors {
147 name: "Ancient Painting" 224 name: "Ancient Painting"
148 type: ITEM_ONLY 225 type: GALLERY_PAINTING
149 move_paintings { room: "Main Area" name: "ANCIENT" } 226 #move_paintings { room: "Main Area" name: "ANCIENT" }
227 receivers: "Components/Listeners/Endings/unlockReaderListenerQuartz"
150 rooms { map: "the_ancient" name: "Outside" } 228 rooms { map: "the_ancient" name: "Outside" }
151} 229}
152doors { 230doors {
@@ -177,7 +255,8 @@ doors {
177 doors { name: "Castle Painting" } 255 doors { name: "Castle Painting" }
178 doors { name: "Sun Temple Painting" } 256 doors { name: "Sun Temple Painting" }
179 doors { name: "Ancient Painting" } 257 doors { name: "Ancient Painting" }
180 doors { name: "Gallery Extension" } 258 panels { room: "Daedalus Extension" name: "WHERE" }
259 double_letters: true
181} 260}
182doors { 261doors {
183 name: "Ending Door" 262 name: "Ending Door"
diff --git a/data/maps/the_gallery/rooms/Back Room.txtpb b/data/maps/the_gallery/rooms/Back Room.txtpb index baf7270..74d5304 100644 --- a/data/maps/the_gallery/rooms/Back Room.txtpb +++ b/data/maps/the_gallery/rooms/Back Room.txtpb
@@ -1,5 +1,4 @@
1name: "Back Room" 1name: "Back Room"
2display_name: "Back Room"
3panels { 2panels {
4 name: "UNYIELDING" 3 name: "UNYIELDING"
5 path: "Panels/entry_2" 4 path: "Panels/entry_2"
diff --git a/data/maps/the_gallery/rooms/Daedalus Extension.txtpb b/data/maps/the_gallery/rooms/Daedalus Extension.txtpb index e525a2c..51d2be5 100644 --- a/data/maps/the_gallery/rooms/Daedalus Extension.txtpb +++ b/data/maps/the_gallery/rooms/Daedalus Extension.txtpb
@@ -1,5 +1,4 @@
1name: "Daedalus Extension" 1name: "Daedalus Extension"
2display_name: "Daedalus Extension"
3panels { 2panels {
4 name: "WHERE" 3 name: "WHERE"
5 path: "Panels/entry_1" 4 path: "Panels/entry_1"
diff --git a/data/maps/the_gallery/rooms/Ending.txtpb b/data/maps/the_gallery/rooms/Ending.txtpb index 72c8e72..f713acc 100644 --- a/data/maps/the_gallery/rooms/Ending.txtpb +++ b/data/maps/the_gallery/rooms/Ending.txtpb
@@ -1,5 +1,4 @@
1name: "Ending" 1name: "Ending"
2display_name: "Back Room"
3endings { 2endings {
4 name: "YELLOW" 3 name: "YELLOW"
5 path: "Components/Endings/yellow_ending" 4 path: "Components/Endings/yellow_ending"
diff --git a/data/maps/the_gallery/rooms/Main Area.txtpb b/data/maps/the_gallery/rooms/Main Area.txtpb index a8fb3c6..e88dc48 100644 --- a/data/maps/the_gallery/rooms/Main Area.txtpb +++ b/data/maps/the_gallery/rooms/Main Area.txtpb
@@ -1,8 +1,8 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Main Area"
3keyholders { 2keyholders {
4 name: "P" 3 name: "P"
5 path: "Components/KeyHolders/keyHolderP" 4 path: "Components/KeyHolders/keyHolderP"
5 key: "p"
6} 6}
7paintings { 7paintings {
8 name: "OWL" 8 name: "OWL"
@@ -162,6 +162,8 @@ paintings {
162} 162}
163ports { 163ports {
164 name: "ENTRY" 164 name: "ENTRY"
165 display_name: "Entrance"
165 path: "Components/Warps/worldport" 166 path: "Components/Warps/worldport"
166 orientation: "west" 167 destination { x: -3.5 y: 0 z: 16 }
168 rotation: 270
167} 169}
diff --git a/data/maps/the_gold/doors.txtpb b/data/maps/the_gold/doors.txtpb new file mode 100644 index 0000000..d3329cb --- /dev/null +++ b/data/maps/the_gold/doors.txtpb
@@ -0,0 +1,7 @@
1doors {
2 name: "The Panel"
3 type: LOCATION_ONLY
4 panels { room: "The Whole Thing" name: "PANEL" }
5 location_room: "The Whole Thing"
6 location_name: "Panel"
7}
diff --git a/data/maps/the_gold/rooms/The Whole Thing.txtpb b/data/maps/the_gold/rooms/The Whole Thing.txtpb index 026e709..4848c1f 100644 --- a/data/maps/the_gold/rooms/The Whole Thing.txtpb +++ b/data/maps/the_gold/rooms/The Whole Thing.txtpb
@@ -1,5 +1,4 @@
1name: "The Whole Thing" 1name: "The Whole Thing"
2display_name: "The Whole Thing"
3panels { 2panels {
4 name: "PANEL" 3 name: "PANEL"
5 path: "Panels/Room_1/panel_1" 4 path: "Panels/Room_1/panel_1"
diff --git a/data/maps/the_graveyard/doors.txtpb b/data/maps/the_graveyard/doors.txtpb index 5743fb7..20e7fcf 100644 --- a/data/maps/the_graveyard/doors.txtpb +++ b/data/maps/the_graveyard/doors.txtpb
@@ -7,9 +7,8 @@ doors {
7 doors { map: "the_great" name: "The Maze Gravestone" } 7 doors { map: "the_great" name: "The Maze Gravestone" }
8 doors { map: "the_great" name: "Building Building Gravestone" } 8 doors { map: "the_great" name: "Building Building Gravestone" }
9 doors { map: "the_linear" name: "Behind The Keen Gravestone" } 9 doors { map: "the_linear" name: "Behind The Keen Gravestone" }
10 # TODO: gravestones 10 doors { map: "the_three_doors" name: "The Three Doors Gravestone" }
11 # The Tree (the_tree) 11 doors { map: "the_tree" name: "The Tree Gravestone" }
12 # The Three Doors (the_three_doors)
13} 12}
14doors { 13doors {
15 name: "Mausoleum Door" 14 name: "Mausoleum Door"
@@ -20,6 +19,14 @@ doors {
20doors { 19doors {
21 name: "Double Letters" 20 name: "Double Letters"
22 type: EVENT 21 type: EVENT
23 switches: "double_letters" 22 receivers: "Panels/panel_3/teleportListener"
24 # TODO: once again, not sure whether this is how it should work 23 receivers: "Components/Paintings/omrt/teleportListener"
24 double_letters: true
25}
26doors {
27 name: "Remember Panel"
28 type: LOCATION_ONLY
29 panels { room: "Inside" name: "REMEMBER" }
30 location_room: "Inside"
31 location_name: "REMEMBER"
25} 32}
diff --git a/data/maps/the_graveyard/rooms/Inside.txtpb b/data/maps/the_graveyard/rooms/Inside.txtpb index fd2fc9d..1f58d3f 100644 --- a/data/maps/the_graveyard/rooms/Inside.txtpb +++ b/data/maps/the_graveyard/rooms/Inside.txtpb
@@ -1,5 +1,4 @@
1name: "Inside" 1name: "Inside"
2display_name: "Inside"
3panels { 2panels {
4 name: "REMEMBER" 3 name: "REMEMBER"
5 path: "Panels/panel_3" 4 path: "Panels/panel_3"
diff --git a/data/maps/the_graveyard/rooms/Outside.txtpb b/data/maps/the_graveyard/rooms/Outside.txtpb index b0e5ee9..db9de1b 100644 --- a/data/maps/the_graveyard/rooms/Outside.txtpb +++ b/data/maps/the_graveyard/rooms/Outside.txtpb
@@ -1,5 +1,4 @@
1name: "Outside" 1name: "Outside"
2display_name: "Outside"
3panels { 2panels {
4 name: "FOOT" 3 name: "FOOT"
5 path: "Panels/panel_1" 4 path: "Panels/panel_1"
diff --git a/data/maps/the_great/connections.txtpb b/data/maps/the_great/connections.txtpb index f1a7e25..171e809 100644 --- a/data/maps/the_great/connections.txtpb +++ b/data/maps/the_great/connections.txtpb
@@ -256,3 +256,7 @@ connections {
256 to_room: "Zero Room" 256 to_room: "Zero Room"
257 door { name: "Lavender Cube" } 257 door { name: "Lavender Cube" }
258} 258}
259connections {
260 from_room: "Back Area"
261 to_room: "The Landscapes"
262}
diff --git a/data/maps/the_great/doors.txtpb b/data/maps/the_great/doors.txtpb index 463eaba..98d9859 100644 --- a/data/maps/the_great/doors.txtpb +++ b/data/maps/the_great/doors.txtpb
@@ -29,6 +29,15 @@ doors {
29 location_room: "Main Area" 29 location_room: "Main Area"
30} 30}
31doors { 31doors {
32 name: "Near Linear Panels"
33 type: LOCATION_ONLY
34 panels { room: "Main Area" name: "DEW" }
35 panels { room: "Main Area" name: "EWE" }
36 panels { room: "Main Area" name: "NO" }
37 location_room: "Main Area"
38 location_name: "DEW, EWE, NO"
39}
40doors {
32 name: "Courtyard Entrance" 41 name: "Courtyard Entrance"
33 type: STANDARD 42 type: STANDARD
34 receivers: "Components/Doors/entry_1" 43 receivers: "Components/Doors/entry_1"
@@ -49,23 +58,27 @@ doors {
49 type: LOCATION_ONLY 58 type: LOCATION_ONLY
50 panels { room: "West Side" name: "ERASE" } 59 panels { room: "West Side" name: "ERASE" }
51 location_room: "West Side" 60 location_room: "West Side"
61 location_name: "ERASE"
52} 62}
53doors { 63doors {
54 name: "Control Center Purple Door" 64 name: "Control Center Purple Door"
55 type: CONTROL_CENTER_COLOR 65 type: CONTROL_CENTER_COLOR
66 latch: true
56 receivers: "Components/Doors/entry_23" 67 receivers: "Components/Doors/entry_23"
57 control_center_color: "purple" 68 control_center_color: "purple"
58} 69}
59doors { 70doors {
60 name: "Control Center Gray Door" 71 name: "Control Center Gray Door"
61 type: CONTROL_CENTER_COLOR 72 type: CONTROL_CENTER_COLOR
62 receivers: "Components/Doors/Gates/Gate" 73 latch: true
74 receivers: "Components/Doors/Gates/Gate/animationListener"
63 control_center_color: "gray" 75 control_center_color: "gray"
64} 76}
65doors { 77doors {
66 name: "Control Center Red Door" 78 name: "Control Center Red Door"
67 type: CONTROL_CENTER_COLOR 79 type: CONTROL_CENTER_COLOR
68 receivers: "Components/Doors/Gates/Gate" 80 latch: true
81 receivers: "Components/Doors/entry_18"
69 control_center_color: "red" 82 control_center_color: "red"
70} 83}
71doors { 84doors {
@@ -98,7 +111,8 @@ doors {
98doors { 111doors {
99 name: "Savory Painting" 112 name: "Savory Painting"
100 type: STANDARD 113 type: STANDARD
101 move_paintings { room: "West Side" name: "EXTRAVAGANT" } 114 #move_paintings { room: "West Side" name: "EXTRAVAGANT" }
115 receivers: "Components/Paintings/unless/teleportListener"
102 panels { room: "West Side" name: "SAVORY" } 116 panels { room: "West Side" name: "SAVORY" }
103 panels { room: "West Side" name: "FLAVORS" } 117 panels { room: "West Side" name: "FLAVORS" }
104 location_room: "West Side" 118 location_room: "West Side"
@@ -122,6 +136,7 @@ doors {
122 panels { room: "Magnet Room" name: "SAW" } 136 panels { room: "Magnet Room" name: "SAW" }
123 panels { room: "Magnet Room" name: "BLENDER" } 137 panels { room: "Magnet Room" name: "BLENDER" }
124 location_room: "Magnet Room" 138 location_room: "Magnet Room"
139 location_name: "Gravestone"
125} 140}
126doors { 141doors {
127 name: "Hive Entrance" 142 name: "Hive Entrance"
@@ -141,6 +156,7 @@ doors {
141 panels { room: "Pillar Room" name: "CAUGHT" } 156 panels { room: "Pillar Room" name: "CAUGHT" }
142 panels { room: "Pillar Room" name: "TEN" } 157 panels { room: "Pillar Room" name: "TEN" }
143 location_room: "Pillar Room" 158 location_room: "Pillar Room"
159 location_name: "Puzzles"
144} 160}
145doors { 161doors {
146 name: "North Landscape Entrance" 162 name: "North Landscape Entrance"
@@ -202,29 +218,31 @@ doors {
202 panels { room: "Jail Part 2" name: "GRIMACE" } 218 panels { room: "Jail Part 2" name: "GRIMACE" }
203 panels { room: "Jail Part 2" name: "COMMENCE" } 219 panels { room: "Jail Part 2" name: "COMMENCE" }
204 location_room: "Jail Part 2" 220 location_room: "Jail Part 2"
221 location_name: "Gravestone"
205} 222}
206doors { 223doors {
207 name: "The Landscapes Gravestone" 224 name: "The Landscapes Gravestone"
208 type: GRAVESTONE 225 type: GRAVESTONE
209 panels { room: "Back Area" name: "Top Landscape Top" } 226 panels { room: "The Landscapes" name: "Top Landscape Top" }
210 panels { room: "Back Area" name: "Top Landscape Right" } 227 panels { room: "The Landscapes" name: "Top Landscape Right" }
211 panels { room: "Back Area" name: "Top Landscape Bottom" } 228 panels { room: "The Landscapes" name: "Top Landscape Bottom" }
212 panels { room: "Back Area" name: "Top Landscape Left" } 229 panels { room: "The Landscapes" name: "Top Landscape Left" }
213 panels { room: "Back Area" name: "Left Landscape Top" } 230 panels { room: "The Landscapes" name: "Left Landscape Top" }
214 panels { room: "Back Area" name: "Left Landscape Right" } 231 panels { room: "The Landscapes" name: "Left Landscape Right" }
215 panels { room: "Back Area" name: "Left Landscape Bottom" } 232 panels { room: "The Landscapes" name: "Left Landscape Bottom" }
216 panels { room: "Back Area" name: "Left Landscape Left" } 233 panels { room: "The Landscapes" name: "Left Landscape Left" }
217 panels { room: "Back Area" name: "Right Landscape Top" } 234 panels { room: "The Landscapes" name: "Right Landscape Top" }
218 panels { room: "Back Area" name: "Right Landscape Right" } 235 panels { room: "The Landscapes" name: "Right Landscape Right" }
219 panels { room: "Back Area" name: "Right Landscape Bottom" } 236 panels { room: "The Landscapes" name: "Right Landscape Bottom" }
220 panels { room: "Back Area" name: "Right Landscape Left" } 237 panels { room: "The Landscapes" name: "Right Landscape Left" }
221 location_room: "Back Area" 238 location_room: "The Landscapes"
239 location_name: "Gravestone"
222} 240}
223doors { 241doors {
224 name: "Tower Entrance" 242 name: "Tower Entrance"
225 type: ITEM_ONLY 243 type: ITEM_ONLY
226 receivers: "Components/Doors/entry_25" 244 receivers: "Components/Doors/entry_25"
227 switches: "double_letters" 245 double_letters: true
228} 246}
229doors { 247doors {
230 name: "Maze Out/South Door" 248 name: "Maze Out/South Door"
@@ -315,6 +333,7 @@ doors {
315 panels { room: "Maze Up Area" name: "UP" } 333 panels { room: "Maze Up Area" name: "UP" }
316 panels { room: "Maze Wreck Area" name: "WRECK" } 334 panels { room: "Maze Wreck Area" name: "WRECK" }
317 location_room: "Maze Slice Area" 335 location_room: "Maze Slice Area"
336 location_name: "Gravestone"
318} 337}
319doors { 338doors {
320 name: "Courtyard Side Door" 339 name: "Courtyard Side Door"
@@ -390,11 +409,13 @@ doors {
390 name: "Big Y" 409 name: "Big Y"
391 type: STANDARD 410 type: STANDARD
392 receivers: "Components/Doors/question_3" 411 receivers: "Components/Doors/question_3"
412 receivers: "Components/Doors/question_12"
393 panels { room: "Question Room What" name: "QUESTION" answer: "why" } 413 panels { room: "Question Room What" name: "QUESTION" answer: "why" }
394 panels { room: "Question Room How" name: "QUESTION" answer: "why" } 414 panels { room: "Question Room How" name: "QUESTION" answer: "why" }
395 panels { room: "Question Room When" name: "QUESTION" answer: "why" } 415 panels { room: "Question Room When" name: "QUESTION" answer: "why" }
396 panels { room: "Question Room Who" name: "QUESTION" answer: "why" } 416 panels { room: "Question Room Who" name: "QUESTION" answer: "why" }
397 location_room: "Question Room Who" 417 location_room: "Question Room Who"
418 location_name: "Whys"
398} 419}
399doors { 420doors {
400 name: "Talented Entrance" 421 name: "Talented Entrance"
@@ -405,7 +426,8 @@ doors {
405} 426}
406doors { 427doors {
407 name: "Question Room Back Door" 428 name: "Question Room Back Door"
408 type: STANDARD 429 type: ITEM_ONLY
430 legacy_location: true
409 receivers: "Components/Doors/question_11" 431 receivers: "Components/Doors/question_11"
410 panels { room: "Behind Question Area" name: "YEW" answer: "ewe" } 432 panels { room: "Behind Question Area" name: "YEW" answer: "ewe" }
411 location_room: "Behind Question Area" 433 location_room: "Behind Question Area"
@@ -414,9 +436,10 @@ doors {
414 name: "Invisible Entrance" 436 name: "Invisible Entrance"
415 type: STANDARD 437 type: STANDARD
416 receivers: "Components/Doors/entry_36" 438 receivers: "Components/Doors/entry_36"
417 panels { room: "Back Area" name: "Right Landscape Top" answer: "tell" } 439 panels { room: "The Landscapes" name: "Right Landscape Top" answer: "tell" }
418 panels { room: "Back Area" name: "Right Landscape Left" answer: "eyes" } 440 panels { room: "The Landscapes" name: "Right Landscape Left" answer: "eyes" }
419 location_room: "Back Area" 441 location_room: "The Landscapes"
442 location_name: "Alternate Answers"
420} 443}
421doors { 444doors {
422 name: "Nature Room Door" 445 name: "Nature Room Door"
@@ -462,12 +485,17 @@ doors {
462 panels { room: "Whole Room" name: "CHIPS" } 485 panels { room: "Whole Room" name: "CHIPS" }
463 panels { room: "Whole Room" name: "TOWER" } 486 panels { room: "Whole Room" name: "TOWER" }
464 location_room: "Whole Room" 487 location_room: "Whole Room"
488 location_name: "Gravestone"
465} 489}
466doors { 490doors {
467 name: "Lavender Cube" 491 name: "Lavender Cube"
468 type: ITEM_ONLY 492 type: EVENT
469 receivers: "Components/Doors/entry_28" 493 receivers: "Components/Doors/entry_28"
470 switches: "lavender_cubes" 494 panels {
495 map: "the_ancient"
496 room: "Inside"
497 name: "COLOR"
498 }
471} 499}
472doors { 500doors {
473 name: "Zero Entrance" 501 name: "Zero Entrance"
@@ -484,6 +512,7 @@ doors {
484 panels { room: "Zero Room" name: "MANY" } 512 panels { room: "Zero Room" name: "MANY" }
485 panels { room: "Zero Room" name: "REMAINING" } 513 panels { room: "Zero Room" name: "REMAINING" }
486 location_room: "Zero Room" 514 location_room: "Zero Room"
515 location_name: "Panels"
487} 516}
488doors { 517doors {
489 name: "Spiral Painting" 518 name: "Spiral Painting"
@@ -492,3 +521,110 @@ doors {
492 panels { room: "Back Area" name: "PAINTING" } 521 panels { room: "Back Area" name: "PAINTING" }
493 location_room: "Back Area" 522 location_room: "Back Area"
494} 523}
524doors {
525 name: "Cyan Doors"
526 type: EVENT
527 receivers: "Panels/General/entry_7/teleportListener"
528 double_letters: true
529}
530doors {
531 name: "Partial Entrance"
532 type: EVENT
533 panels { room: "West Side" name: "CLUE" }
534}
535doors {
536 name: "Why Is It Not Red"
537 type: LOCATION_ONLY
538 panels { room: "Main Area" name: "WHY" }
539 panels { room: "Main Area" name: "IS" }
540 panels { room: "Main Area" name: "IT" }
541 panels { room: "Main Area" name: "NOT" }
542 panels { room: "Main Area" name: "RED" }
543 location_room: "Main Area"
544 location_name: "WHY, IS, IT, NOT, RED"
545}
546doors {
547 name: "Control Center Gray Panel"
548 type: LOCATION_ONLY
549 panels { room: "Main Area" name: "COLOR" }
550 location_room: "Main Area"
551 location_name: "COLOR"
552}
553doors {
554 name: "Control Center Purple Panel"
555 type: LOCATION_ONLY
556 panels { room: "East Landscape" name: "COLOR" }
557 location_room: "East Landscape"
558 location_name: "COLOR"
559}
560doors {
561 name: "Control Center Red Panel"
562 type: LOCATION_ONLY
563 panels { room: "West Side" name: "COLOR" }
564 location_room: "West Side"
565 location_name: "COLOR"
566}
567doors {
568 name: "Mistreat Panel"
569 type: LOCATION_ONLY
570 panels { room: "East Landscape" name: "MISTREAT" }
571 location_room: "East Landscape"
572 location_name: "MISTREAT"
573}
574doors {
575 name: "Tower Panels"
576 type: LOCATION_ONLY
577 panels { room: "Back Area" name: "TOWEL" }
578 panels { room: "Maze Tower" name: "SPIRE" }
579 location_room: "Maze Tower"
580 location_name: "SPIRE, TOWEL"
581}
582doors {
583 name: "Tree Panels"
584 type: LOCATION_ONLY
585 panels { room: "Back Area" name: "PLANT" }
586 panels { room: "Back Area" name: "TREE" }
587 location_room: "Back Area"
588 location_name: "PLANT, TREE"
589}
590doors {
591 name: "Behind Question Room Panels"
592 type: LOCATION_ONLY
593 panels { room: "Behind Question Area" name: "DEW" }
594 panels { room: "Behind Question Area" name: "YEW" answer: "ewe" }
595 panels { room: "Behind Question Area" name: "NO" }
596 location_room: "Behind Question Area"
597 location_name: "DEW, YEW/EWE, NO"
598}
599doors {
600 name: "Broken Shed Panels"
601 type: LOCATION_ONLY
602 panels { room: "North Landscape" name: "LAUGH" }
603 panels { room: "North Landscape" name: "FINISHED" }
604 panels { room: "North Landscape" name: "LAUGH FINISHED" }
605 location_room: "North Landscape"
606 location_name: "LAUGH, FINISHED, LAUGH FINISHED"
607}
608doors {
609 name: "Nature Panels"
610 type: LOCATION_ONLY
611 panels { room: "North Landscape" name: "WEATHER" }
612 panels { room: "North Landscape" name: "ANIMALS" }
613 panels { room: "North Landscape" name: "PLANTS" }
614 location_room: "North Landscape"
615 location_name: "ANIMALS, PLANTS, WEATHER"
616}
617doors {
618 name: "Teal Panel"
619 type: LOCATION_ONLY
620 panels { room: "Maze Wreck Area" name: "MAROON" }
621 location_room: "Maze Wreck Area"
622 location_name: "MAROON"
623}
624doors {
625 name: "Behind Orb Panel"
626 type: LOCATION_ONLY
627 panels { room: "Main Area" name: "BROWN RED ORANGE" }
628 location_room: "Main Area"
629 location_name: "Brown Red Orange"
630}
diff --git a/data/maps/the_great/rooms/Back Area.txtpb b/data/maps/the_great/rooms/Back Area.txtpb index 3701249..33da394 100644 --- a/data/maps/the_great/rooms/Back Area.txtpb +++ b/data/maps/the_great/rooms/Back Area.txtpb
@@ -1,5 +1,5 @@
1name: "Back Area" 1name: "Back Area"
2display_name: "Back Area" 2panel_display_name: "Back Area"
3panels { 3panels {
4 name: "PLANT" 4 name: "PLANT"
5 path: "Panels/General/entry_14" 5 path: "Panels/General/entry_14"
@@ -28,92 +28,6 @@ panels {
28 answer: "tower" 28 answer: "tower"
29 symbols: SPARKLES 29 symbols: SPARKLES
30} 30}
31panels {
32 name: "Top Landscape Top"
33 path: "Panels/Kiwi Room/kiwi_1"
34 clue: ""
35 answer: "one"
36 symbols: QUESTION
37}
38panels {
39 name: "Top Landscape Right"
40 path: "Panels/Kiwi Room/kiwi_2"
41 clue: ""
42 answer: "road"
43 symbols: QUESTION
44}
45panels {
46 name: "Top Landscape Bottom"
47 path: "Panels/Kiwi Room/kiwi_3"
48 clue: ""
49 answer: "many"
50 symbols: QUESTION
51}
52panels {
53 name: "Top Landscape Left"
54 path: "Panels/Kiwi Room/kiwi_4"
55 clue: ""
56 answer: "turns"
57 symbols: QUESTION
58}
59panels {
60 name: "Left Landscape Top"
61 path: "Panels/Kiwi Room/kiwi_5"
62 clue: ""
63 answer: "find"
64 symbols: QUESTION
65}
66panels {
67 name: "Left Landscape Right"
68 path: "Panels/Kiwi Room/kiwi_6"
69 clue: ""
70 answer: "keys"
71 symbols: QUESTION
72}
73panels {
74 name: "Left Landscape Bottom"
75 path: "Panels/Kiwi Room/kiwi_7"
76 clue: ""
77 answer: "write"
78 symbols: QUESTION
79}
80panels {
81 name: "Left Landscape Left"
82 path: "Panels/Kiwi Room/kiwi_8"
83 clue: ""
84 answer: "words"
85 symbols: QUESTION
86}
87panels {
88 name: "Right Landscape Top"
89 path: "Panels/Kiwi Room/kiwi_9"
90 clue: ""
91 answer: "hear"
92 symbols: QUESTION
93 proxies { answer: "tell" path: "Panels/Kiwi Proxies/kiwi_9_proxy_1" }
94}
95panels {
96 name: "Right Landscape Right"
97 path: "Panels/Kiwi Room/kiwi_10"
98 clue: ""
99 answer: "lies"
100 symbols: QUESTION
101}
102panels {
103 name: "Right Landscape Bottom"
104 path: "Panels/Kiwi Room/kiwi_11"
105 clue: ""
106 answer: "the"
107 symbols: QUESTION
108}
109panels {
110 name: "Right Landscape Left"
111 path: "Panels/Kiwi Room/kiwi_12"
112 clue: ""
113 answer: "ears"
114 symbols: QUESTION
115 proxies { answer: "eyes" path: "Panels/Kiwi Proxies/kiwi_12_proxy_1" }
116}
117paintings { 31paintings {
118 name: "SPIRAL" 32 name: "SPIRAL"
119 path: "Components/Paintings/spiral" 33 path: "Components/Paintings/spiral"
@@ -124,23 +38,31 @@ paintings {
124} 38}
125ports { 39ports {
126 name: "UNKEMPT" 40 name: "UNKEMPT"
41 display_name: "Unkempt Entrance"
127 path: "Meshes/Blocks/Warps/worldport5" 42 path: "Meshes/Blocks/Warps/worldport5"
128 orientation: "north" 43 destination { x: 72 y: 0 z: 10.5 }
44 rotation: 180
129} 45}
130ports { 46ports {
131 name: "THREEDOORS" 47 name: "THREEDOORS"
48 display_name: "Three Doors Entrance"
132 path: "Meshes/Blocks/Warps/worldport16" 49 path: "Meshes/Blocks/Warps/worldport16"
133 orientation: "south" 50 destination { x: 77 y: 0 z: 33.5 }
51 rotation: 0
134} 52}
135ports { 53ports {
136 name: "TOWER" 54 name: "TOWER"
55 display_name: "Tower Entrance"
137 path: "Meshes/Blocks/Warps/worldport10" 56 path: "Meshes/Blocks/Warps/worldport10"
138 orientation: "south" 57 destination { x: 0 y: 0 z: 52 }
58 rotation: 0
139 required_door { name: "Tower Entrance" } 59 required_door { name: "Tower Entrance" }
140 # The reverse warp bypasses the door, so there needs to be two oneway connections. 60 # The reverse warp bypasses the door, so there needs to be two oneway connections.
141} 61}
142ports { 62ports {
143 name: "TREE" 63 name: "TREE"
64 display_name: "Tree Entrance"
144 path: "Meshes/Blocks/Warps/worldport17" 65 path: "Meshes/Blocks/Warps/worldport17"
145 orientation: "north" 66 destination { x: 26 y: 0 z: 58 }
67 rotation: 180
146} 68}
diff --git a/data/maps/the_great/rooms/Behind Question Area.txtpb b/data/maps/the_great/rooms/Behind Question Area.txtpb index 88f800f..744d4c4 100644 --- a/data/maps/the_great/rooms/Behind Question Area.txtpb +++ b/data/maps/the_great/rooms/Behind Question Area.txtpb
@@ -1,5 +1,5 @@
1name: "Behind Question Area" 1name: "Behind Question Area"
2display_name: "Main Area" 2panel_display_name: "Question Room"
3panels { 3panels {
4 name: "DEW" 4 name: "DEW"
5 path: "Panels/General/uc_4" 5 path: "Panels/General/uc_4"
diff --git a/data/maps/the_great/rooms/Colorful Entrance.txtpb b/data/maps/the_great/rooms/Colorful Entrance.txtpb index 5d7c9b2..5464698 100644 --- a/data/maps/the_great/rooms/Colorful Entrance.txtpb +++ b/data/maps/the_great/rooms/Colorful Entrance.txtpb
@@ -1,7 +1,9 @@
1name: "Colorful Entrance" 1name: "Colorful Entrance"
2display_name: "Pillar Room" 2panel_display_name: "Pillar Room"
3ports { 3ports {
4 name: "COLORFUL" 4 name: "COLORFUL"
5 display_name: "Pillar Room Worldport"
5 path: "Meshes/Blocks/Warps/worldport13" 6 path: "Meshes/Blocks/Warps/worldport13"
6 orientation: "west" 7 destination { x: -37.5 y: 0 z: 74 }
8 rotation: 270
7} 9}
diff --git a/data/maps/the_great/rooms/Daedalus Entrance.txtpb b/data/maps/the_great/rooms/Daedalus Entrance.txtpb index 7e1d477..abfab99 100644 --- a/data/maps/the_great/rooms/Daedalus Entrance.txtpb +++ b/data/maps/the_great/rooms/Daedalus Entrance.txtpb
@@ -1,5 +1,5 @@
1name: "Daedalus Entrance" 1name: "Daedalus Entrance"
2display_name: "Main Area" 2panel_display_name: "Main Area"
3panels { 3panels {
4 name: "MISSING" 4 name: "MISSING"
5 path: "Panels/General/entry_2" 5 path: "Panels/General/entry_2"
@@ -9,8 +9,10 @@ panels {
9} 9}
10ports { 10ports {
11 name: "DAEDALUS" 11 name: "DAEDALUS"
12 display_name: "Daedalus Entrance"
12 path: "Meshes/Blocks/Warps/worldport8" 13 path: "Meshes/Blocks/Warps/worldport8"
13 orientation: "south" 14 destination { x: 98 y: 2 z: 27.5 }
15 rotation: 0
14 required_door { name: "Daedalus Entrance" } 16 required_door { name: "Daedalus Entrance" }
15 # The reverse warp bypasses the door, so there needs to be two oneway connections. 17 # The reverse warp bypasses the door, so there needs to be two oneway connections.
16} 18}
diff --git a/data/maps/the_great/rooms/East Landscape.txtpb b/data/maps/the_great/rooms/East Landscape.txtpb index 84fc182..44ed2c5 100644 --- a/data/maps/the_great/rooms/East Landscape.txtpb +++ b/data/maps/the_great/rooms/East Landscape.txtpb
@@ -1,5 +1,5 @@
1name: "East Landscape" 1name: "East Landscape"
2display_name: "East Landscape" 2panel_display_name: "East Landscape"
3panels { 3panels {
4 name: "COLOR" 4 name: "COLOR"
5 path: "Panels/General/entry_10" 5 path: "Panels/General/entry_10"
diff --git a/data/maps/the_great/rooms/G Room.txtpb b/data/maps/the_great/rooms/G Room.txtpb index 218a9c1..f93c899 100644 --- a/data/maps/the_great/rooms/G Room.txtpb +++ b/data/maps/the_great/rooms/G Room.txtpb
@@ -1,5 +1,5 @@
1name: "G Room" 1name: "G Room"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3letters { 3letters {
4 key: "g" 4 key: "g"
5 path: "Components/Collectables/g" 5 path: "Components/Collectables/g"
diff --git a/data/maps/the_great/rooms/Hive Entrance.txtpb b/data/maps/the_great/rooms/Hive Entrance.txtpb index ba886b1..56acc22 100644 --- a/data/maps/the_great/rooms/Hive Entrance.txtpb +++ b/data/maps/the_great/rooms/Hive Entrance.txtpb
@@ -1,5 +1,5 @@
1name: "Hive Entrance" 1name: "Hive Entrance"
2display_name: "West Side" 2panel_display_name: "West Side"
3panels { 3panels {
4 name: "LOST" 4 name: "LOST"
5 path: "Panels/Hive Room/hive_1" 5 path: "Panels/Hive Room/hive_1"
@@ -9,6 +9,8 @@ panels {
9} 9}
10ports { 10ports {
11 name: "HIVE" 11 name: "HIVE"
12 display_name: "Hive Entrance"
12 path: "Meshes/Blocks/Warps/worldport19" 13 path: "Meshes/Blocks/Warps/worldport19"
13 orientation: "east" 14 destination { x: -91.5 y: 0 z: 37 }
15 rotation: 90
14} 16}
diff --git a/data/maps/the_great/rooms/Jail Part 1.txtpb b/data/maps/the_great/rooms/Jail Part 1.txtpb index bd468bd..452841b 100644 --- a/data/maps/the_great/rooms/Jail Part 1.txtpb +++ b/data/maps/the_great/rooms/Jail Part 1.txtpb
@@ -1,5 +1,5 @@
1name: "Jail Part 1" 1name: "Jail Part 1"
2display_name: "Jail" 2panel_display_name: "Jail"
3panels { 3panels {
4 name: "FLAP" 4 name: "FLAP"
5 path: "Panels/Throat/throat_1" 5 path: "Panels/Throat/throat_1"
diff --git a/data/maps/the_great/rooms/Jail Part 2.txtpb b/data/maps/the_great/rooms/Jail Part 2.txtpb index 1f54dd5..1a0c975 100644 --- a/data/maps/the_great/rooms/Jail Part 2.txtpb +++ b/data/maps/the_great/rooms/Jail Part 2.txtpb
@@ -1,5 +1,5 @@
1name: "Jail Part 2" 1name: "Jail Part 2"
2display_name: "Jail" 2panel_display_name: "Jail"
3panels { 3panels {
4 name: "DIGEST" 4 name: "DIGEST"
5 path: "Panels/Bowels3/bowels_1" 5 path: "Panels/Bowels3/bowels_1"
diff --git a/data/maps/the_great/rooms/Jubilant Entrance.txtpb b/data/maps/the_great/rooms/Jubilant Entrance.txtpb index eaf9811..b254cc0 100644 --- a/data/maps/the_great/rooms/Jubilant Entrance.txtpb +++ b/data/maps/the_great/rooms/Jubilant Entrance.txtpb
@@ -1,7 +1,9 @@
1name: "Jubilant Entrance" 1name: "Jubilant Entrance"
2display_name: "West Side" 2panel_display_name: "West Side"
3ports { 3ports {
4 name: "JUBILANT" 4 name: "JUBILANT"
5 display_name: "Jubilant Entrance"
5 path: "Meshes/Blocks/Warps/worldport12" 6 path: "Meshes/Blocks/Warps/worldport12"
6 orientation: "east" 7 destination { x: -62 y: 0 z: -19 }
8 rotation: 90
7} 9}
diff --git a/data/maps/the_great/rooms/Magnet Room.txtpb b/data/maps/the_great/rooms/Magnet Room.txtpb index 4cf6433..2d122a4 100644 --- a/data/maps/the_great/rooms/Magnet Room.txtpb +++ b/data/maps/the_great/rooms/Magnet Room.txtpb
@@ -1,5 +1,5 @@
1name: "Magnet Room" 1name: "Magnet Room"
2display_name: "Magnet Room" 2panel_display_name: "Magnet Room"
3panels { 3panels {
4 name: "AIRPLANE" 4 name: "AIRPLANE"
5 path: "Panels/Magnet Room/magnet_2" 5 path: "Panels/Magnet Room/magnet_2"
diff --git a/data/maps/the_great/rooms/Main Area.txtpb b/data/maps/the_great/rooms/Main Area.txtpb index 40c7fbb..a5ed9f3 100644 --- a/data/maps/the_great/rooms/Main Area.txtpb +++ b/data/maps/the_great/rooms/Main Area.txtpb
@@ -1,5 +1,5 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Main Area" 2panel_display_name: "Main Area"
3panels { 3panels {
4 name: "INTRO" 4 name: "INTRO"
5 path: "Panels/General/entry_8" 5 path: "Panels/General/entry_8"
@@ -111,6 +111,7 @@ panels {
111 answer: "high" 111 answer: "high"
112 symbols: SUN 112 symbols: SUN
113 symbols: ZERO 113 symbols: ZERO
114 required_door { name: "Cyan Doors" }
114} 115}
115panels { 116panels {
116 name: "CURT" 117 name: "CURT"
@@ -121,27 +122,37 @@ panels {
121} 122}
122ports { 123ports {
123 name: "ENTRY" 124 name: "ENTRY"
125 display_name: "Entry Building"
124 path: "Meshes/Blocks/Warps/worldport" 126 path: "Meshes/Blocks/Warps/worldport"
125 orientation: "south" 127 destination { x: 33 y: 0 z: 15 }
128 rotation: 0
126} 129}
127ports { 130ports {
128 name: "KEEN" 131 name: "KEEN"
132 display_name: "Keen Building Front"
129 path: "Meshes/Blocks/Warps/worldport6" 133 path: "Meshes/Blocks/Warps/worldport6"
130 orientation: "north" 134 destination { x: 33 y: 0 z: -21 }
135 rotation: 180
131} 136}
132ports { 137ports {
133 name: "ORB" 138 name: "ORB"
139 display_name: "Orb Building"
134 path: "Meshes/Blocks/Warps/worldport3" 140 path: "Meshes/Blocks/Warps/worldport3"
135 orientation: "north" 141 destination { x: 62 y: 0 z: -13 }
142 rotation: 180
136} 143}
137ports { 144ports {
138 name: "LINEAR" 145 name: "LINEAR"
146 display_name: "Keen Building Back"
139 path: "Meshes/Blocks/Warps/worldport15" 147 path: "Meshes/Blocks/Warps/worldport15"
140 orientation: "south" 148 destination { x: 33 y: 0 z: -42.5 }
149 rotation: 0
141} 150}
142ports { 151ports {
143 name: "DIGITAL" 152 name: "DIGITAL"
153 display_name: "Digital Hole"
144 path: "Meshes/Blocks/Warps/worldport4" 154 path: "Meshes/Blocks/Warps/worldport4"
145 orientation: "down" 155 destination { x: -6.5 y: 0 z: 7.5 }
156 rotation: 0
146 required_door { name: "Digital Entrance" } 157 required_door { name: "Digital Entrance" }
147} 158}
diff --git a/data/maps/the_great/rooms/Maze Center.txtpb b/data/maps/the_great/rooms/Maze Center.txtpb index f557eaa..97ff146 100644 --- a/data/maps/the_great/rooms/Maze Center.txtpb +++ b/data/maps/the_great/rooms/Maze Center.txtpb
@@ -1,5 +1,5 @@
1name: "Maze Center" 1name: "Maze Center"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "POOR" 4 name: "POOR"
5 path: "Panels/Maze/maze_7" 5 path: "Panels/Maze/maze_7"
diff --git a/data/maps/the_great/rooms/Maze Cold Area.txtpb b/data/maps/the_great/rooms/Maze Cold Area.txtpb index 5886ca8..70b311e 100644 --- a/data/maps/the_great/rooms/Maze Cold Area.txtpb +++ b/data/maps/the_great/rooms/Maze Cold Area.txtpb
@@ -1,5 +1,5 @@
1name: "Maze Cold Area" 1name: "Maze Cold Area"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "COLD" 4 name: "COLD"
5 path: "Panels/Maze/maze_11" 5 path: "Panels/Maze/maze_11"
diff --git a/data/maps/the_great/rooms/Maze Empty Vestibule.txtpb b/data/maps/the_great/rooms/Maze Empty Vestibule.txtpb index d6f265f..1540ee2 100644 --- a/data/maps/the_great/rooms/Maze Empty Vestibule.txtpb +++ b/data/maps/the_great/rooms/Maze Empty Vestibule.txtpb
@@ -1,2 +1,2 @@
1name: "Maze Empty Vestibule" 1name: "Maze Empty Vestibule"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
diff --git a/data/maps/the_great/rooms/Maze In Area.txtpb b/data/maps/the_great/rooms/Maze In Area.txtpb index 13597a0..8c556aa 100644 --- a/data/maps/the_great/rooms/Maze In Area.txtpb +++ b/data/maps/the_great/rooms/Maze In Area.txtpb
@@ -1,5 +1,5 @@
1name: "Maze In Area" 1name: "Maze In Area"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "IN" 4 name: "IN"
5 path: "Panels/Maze/maze_3" 5 path: "Panels/Maze/maze_3"
diff --git a/data/maps/the_great/rooms/Maze Moon Area.txtpb b/data/maps/the_great/rooms/Maze Moon Area.txtpb index b515224..10af4a1 100644 --- a/data/maps/the_great/rooms/Maze Moon Area.txtpb +++ b/data/maps/the_great/rooms/Maze Moon Area.txtpb
@@ -1,5 +1,5 @@
1name: "Maze Moon Area" 1name: "Maze Moon Area"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "MOON" 4 name: "MOON"
5 path: "Panels/Maze/maze_9" 5 path: "Panels/Maze/maze_9"
diff --git a/data/maps/the_great/rooms/Maze Off Area.txtpb b/data/maps/the_great/rooms/Maze Off Area.txtpb index 2fe7bed..c577129 100644 --- a/data/maps/the_great/rooms/Maze Off Area.txtpb +++ b/data/maps/the_great/rooms/Maze Off Area.txtpb
@@ -1,5 +1,5 @@
1name: "Maze Off Area" 1name: "Maze Off Area"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "OFF" 4 name: "OFF"
5 path: "Panels/Maze/maze_14" 5 path: "Panels/Maze/maze_14"
diff --git a/data/maps/the_great/rooms/Maze Slice Area.txtpb b/data/maps/the_great/rooms/Maze Slice Area.txtpb index d720501..f59d6e5 100644 --- a/data/maps/the_great/rooms/Maze Slice Area.txtpb +++ b/data/maps/the_great/rooms/Maze Slice Area.txtpb
@@ -1,5 +1,5 @@
1name: "Maze Slice Area" 1name: "Maze Slice Area"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "SLICE" 4 name: "SLICE"
5 path: "Panels/Maze/maze_4" 5 path: "Panels/Maze/maze_4"
diff --git a/data/maps/the_great/rooms/Maze Smooth Area.txtpb b/data/maps/the_great/rooms/Maze Smooth Area.txtpb index 8145357..156e885 100644 --- a/data/maps/the_great/rooms/Maze Smooth Area.txtpb +++ b/data/maps/the_great/rooms/Maze Smooth Area.txtpb
@@ -1,5 +1,5 @@
1name: "Maze Smooth Area" 1name: "Maze Smooth Area"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "SMOOTH" 4 name: "SMOOTH"
5 path: "Panels/Maze/maze_5" 5 path: "Panels/Maze/maze_5"
diff --git a/data/maps/the_great/rooms/Maze South Area.txtpb b/data/maps/the_great/rooms/Maze South Area.txtpb index b3708db..e65778d 100644 --- a/data/maps/the_great/rooms/Maze South Area.txtpb +++ b/data/maps/the_great/rooms/Maze South Area.txtpb
@@ -1,5 +1,5 @@
1name: "Maze South Area" 1name: "Maze South Area"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "SOUTH" 4 name: "SOUTH"
5 path: "Panels/Maze/maze_2" 5 path: "Panels/Maze/maze_2"
diff --git a/data/maps/the_great/rooms/Maze Start.txtpb b/data/maps/the_great/rooms/Maze Start.txtpb index 1e89cbe..16a57f5 100644 --- a/data/maps/the_great/rooms/Maze Start.txtpb +++ b/data/maps/the_great/rooms/Maze Start.txtpb
@@ -1,5 +1,5 @@
1name: "Maze Start" 1name: "Maze Start"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "OUT" 4 name: "OUT"
5 path: "Panels/Maze/maze_1" 5 path: "Panels/Maze/maze_1"
diff --git a/data/maps/the_great/rooms/Maze Tower.txtpb b/data/maps/the_great/rooms/Maze Tower.txtpb index 6a815aa..3b1e5fc 100644 --- a/data/maps/the_great/rooms/Maze Tower.txtpb +++ b/data/maps/the_great/rooms/Maze Tower.txtpb
@@ -1,5 +1,4 @@
1name: "Maze Tower" 1name: "Maze Tower"
2display_name: "Courtyard"
3panels { 2panels {
4 name: "FEEL" 3 name: "FEEL"
5 path: "Panels/Maze/maze_12" 4 path: "Panels/Maze/maze_12"
diff --git a/data/maps/the_great/rooms/Maze Up Area.txtpb b/data/maps/the_great/rooms/Maze Up Area.txtpb index 29f175b..0046cef 100644 --- a/data/maps/the_great/rooms/Maze Up Area.txtpb +++ b/data/maps/the_great/rooms/Maze Up Area.txtpb
@@ -1,5 +1,5 @@
1name: "Maze Up Area" 1name: "Maze Up Area"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "UP" 4 name: "UP"
5 path: "Panels/Maze/maze_15" 5 path: "Panels/Maze/maze_15"
diff --git a/data/maps/the_great/rooms/Maze Wreck Area.txtpb b/data/maps/the_great/rooms/Maze Wreck Area.txtpb index 6808fc2..5710df5 100644 --- a/data/maps/the_great/rooms/Maze Wreck Area.txtpb +++ b/data/maps/the_great/rooms/Maze Wreck Area.txtpb
@@ -1,5 +1,5 @@
1name: "Maze Wreck Area" 1name: "Maze Wreck Area"
2display_name: "Courtyard" 2panel_display_name: "Courtyard"
3panels { 3panels {
4 name: "WRECK" 4 name: "WRECK"
5 path: "Panels/Maze/maze_8" 5 path: "Panels/Maze/maze_8"
diff --git a/data/maps/the_great/rooms/Nature Room.txtpb b/data/maps/the_great/rooms/Nature Room.txtpb index 9f798f3..464d3a2 100644 --- a/data/maps/the_great/rooms/Nature Room.txtpb +++ b/data/maps/the_great/rooms/Nature Room.txtpb
@@ -1,5 +1,5 @@
1name: "Nature Room" 1name: "Nature Room"
2display_name: "North Landscape" 2panel_display_name: "North Landscape"
3panels { 3panels {
4 name: "SEVERE" 4 name: "SEVERE"
5 path: "Panels/General/nature_2" 5 path: "Panels/General/nature_2"
diff --git a/data/maps/the_great/rooms/North Landscape.txtpb b/data/maps/the_great/rooms/North Landscape.txtpb index 959f351..f738ed3 100644 --- a/data/maps/the_great/rooms/North Landscape.txtpb +++ b/data/maps/the_great/rooms/North Landscape.txtpb
@@ -1,5 +1,5 @@
1name: "North Landscape" 1name: "North Landscape"
2display_name: "North Landscape" 2panel_display_name: "North Landscape"
3panels { 3panels {
4 name: "WEATHER" 4 name: "WEATHER"
5 path: "Panels/General/platforms_1" 5 path: "Panels/General/platforms_1"
@@ -52,11 +52,13 @@ panels {
52keyholders { 52keyholders {
53 name: "X" 53 name: "X"
54 path: "Components/KeyHolders/keyHolderX" 54 path: "Components/KeyHolders/keyHolderX"
55 key: "x"
55} 56}
56ports { 57ports {
57 name: "INVISIBLE" 58 name: "INVISIBLE"
59 display_name: "Eye Worldport"
58 path: "Meshes/Blocks/Warps/worldport20" 60 path: "Meshes/Blocks/Warps/worldport20"
59 orientation: "north" 61 destination { x: 33 y: 0 z: -66.5 }
60 # Note that this can be easily entered from the other side. 62 rotation: 0
61 required_door { name: "Invisible Entrance" } 63 required_door { name: "Invisible Entrance" }
62} 64}
diff --git a/data/maps/the_great/rooms/Outside Jail.txtpb b/data/maps/the_great/rooms/Outside Jail.txtpb index ab30761..d6dfa71 100644 --- a/data/maps/the_great/rooms/Outside Jail.txtpb +++ b/data/maps/the_great/rooms/Outside Jail.txtpb
@@ -1,5 +1,5 @@
1name: "Outside Jail" 1name: "Outside Jail"
2display_name: "Jail" 2panel_display_name: "Jail"
3panels { 3panels {
4 name: "GUT" 4 name: "GUT"
5 path: "Panels/Head/head_1" 5 path: "Panels/Head/head_1"
diff --git a/data/maps/the_great/rooms/Pillar Room.txtpb b/data/maps/the_great/rooms/Pillar Room.txtpb index 01ff309..648b7b4 100644 --- a/data/maps/the_great/rooms/Pillar Room.txtpb +++ b/data/maps/the_great/rooms/Pillar Room.txtpb
@@ -1,5 +1,5 @@
1name: "Pillar Room" 1name: "Pillar Room"
2display_name: "Pillar Room" 2panel_display_name: "Pillar Room"
3panels { 3panels {
4 name: "EYE" 4 name: "EYE"
5 path: "Panels/Impressive/entry_2" 5 path: "Panels/Impressive/entry_2"
diff --git a/data/maps/the_great/rooms/Purple Room.txtpb b/data/maps/the_great/rooms/Purple Room.txtpb index ff9bd9a..12e79e7 100644 --- a/data/maps/the_great/rooms/Purple Room.txtpb +++ b/data/maps/the_great/rooms/Purple Room.txtpb
@@ -1,7 +1,9 @@
1name: "Purple Room" 1name: "Purple Room"
2display_name: "Main Area" 2panel_display_name: "Main Area"
3ports { 3ports {
4 name: "DAEDALUS" 4 name: "DAEDALUS"
5 display_name: "Purple Hallway"
5 path: "Meshes/Blocks/Warps/worldport18" 6 path: "Meshes/Blocks/Warps/worldport18"
6 orientation: "north" 7 destination { x: 158 y: 0 z: 14 }
8 rotation: 180
7} 9}
diff --git a/data/maps/the_great/rooms/Question Room How.txtpb b/data/maps/the_great/rooms/Question Room How.txtpb index 2f759b8..8f087d0 100644 --- a/data/maps/the_great/rooms/Question Room How.txtpb +++ b/data/maps/the_great/rooms/Question Room How.txtpb
@@ -1,17 +1,18 @@
1name: "Question Room How" 1name: "Question Room How"
2display_name: "Question Room" 2panel_display_name: "Question Room"
3panels { 3panels {
4 name: "QUESTION" 4 name: "QUESTION"
5 path: "Panels/Questions/question_3" 5 path: "Panels/Questions/question_3"
6 clue: "question" 6 clue: "question"
7 answer: "how" 7 answer: "how"
8 symbols: EXAMPLE 8 symbols: EXAMPLE
9 # "Panels/Question Proxies/question_3_proxied" <- this is just how again 9 proxies { answer: "how" path: "Panels/Question Proxies/question_3_proxied" }
10 proxies { answer: "who" path: "Panels/Question Proxies/question_3_proxied2" } 10 proxies { answer: "who" path: "Panels/Question Proxies/question_3_proxied2" }
11 proxies { answer: "why" path: "Panels/Question Proxies/question_3_proxied3" } 11 proxies { answer: "why" path: "Panels/Question Proxies/question_3_proxied3" }
12 proxies { answer: "what" path: "Panels/Question Proxies/question_3_proxied4" } 12 proxies { answer: "what" path: "Panels/Question Proxies/question_3_proxied4" }
13 proxies { answer: "when" path: "Panels/Question Proxies/question_3_proxied5" } 13 proxies { answer: "when" path: "Panels/Question Proxies/question_3_proxied5" }
14 proxies { answer: "where" path: "Panels/Question Proxies/question_3_proxied6" } 14 proxies { answer: "where" path: "Panels/Question Proxies/question_3_proxied6" }
15 display_name: "QUESTION (How)"
15} 16}
16paintings { 17paintings {
17 name: "WHY" 18 name: "WHY"
diff --git a/data/maps/the_great/rooms/Question Room What.txtpb b/data/maps/the_great/rooms/Question Room What.txtpb index 9cfd667..a61ccef 100644 --- a/data/maps/the_great/rooms/Question Room What.txtpb +++ b/data/maps/the_great/rooms/Question Room What.txtpb
@@ -1,15 +1,16 @@
1name: "Question Room What" 1name: "Question Room What"
2display_name: "Question Room" 2panel_display_name: "Question Room"
3panels { 3panels {
4 name: "QUESTION" 4 name: "QUESTION"
5 path: "Panels/Questions/question_4" 5 path: "Panels/Questions/question_4"
6 clue: "question" 6 clue: "question"
7 answer: "what" 7 answer: "what"
8 symbols: EXAMPLE 8 symbols: EXAMPLE
9 proxies { answer: "why" path: "Panels/Question Proxies/question_4_proxied" } 9 proxies { answer: "what" path: "Panels/Question Proxies/question_4_proxied" }
10 proxies { answer: "who" path: "Panels/Question Proxies/question_4_proxied2" } 10 proxies { answer: "why" path: "Panels/Question Proxies/question_4_proxied2" }
11 proxies { answer: "where" path: "Panels/Question Proxies/question_4_proxied3" } 11 proxies { answer: "when" path: "Panels/Question Proxies/question_4_proxied3" }
12 proxies { answer: "how" path: "Panels/Question Proxies/question_4_proxied4" } 12 proxies { answer: "how" path: "Panels/Question Proxies/question_4_proxied4" }
13 # "Panels/Question Proxies/question_4_proxied5" <- this is just what again 13 proxies { answer: "who" path: "Panels/Question Proxies/question_4_proxied5" }
14 proxies { answer: "when" path: "Panels/Question Proxies/question_4_proxied6" } 14 proxies { answer: "where" path: "Panels/Question Proxies/question_4_proxied6" }
15 display_name: "QUESTION (What)"
15} 16}
diff --git a/data/maps/the_great/rooms/Question Room When.txtpb b/data/maps/the_great/rooms/Question Room When.txtpb index e046edd..b3ee2db 100644 --- a/data/maps/the_great/rooms/Question Room When.txtpb +++ b/data/maps/the_great/rooms/Question Room When.txtpb
@@ -1,5 +1,5 @@
1name: "Question Room When" 1name: "Question Room When"
2display_name: "Question Room" 2panel_display_name: "Question Room"
3panels { 3panels {
4 name: "QUESTION" 4 name: "QUESTION"
5 path: "Panels/Questions/question_1" 5 path: "Panels/Questions/question_1"
@@ -8,10 +8,11 @@ panels {
8 symbols: EXAMPLE 8 symbols: EXAMPLE
9 proxies { answer: "when" path: "Panels/Question Proxies/question_1_proxied" } 9 proxies { answer: "when" path: "Panels/Question Proxies/question_1_proxied" }
10 proxies { answer: "why" path: "Panels/Question Proxies/question_1_proxied2" } 10 proxies { answer: "why" path: "Panels/Question Proxies/question_1_proxied2" }
11 # "Panels/Question Proxies/question_1_proxied3" <- this is just what again 11 proxies { answer: "what" path: "Panels/Question Proxies/question_1_proxied3" }
12 proxies { answer: "who" path: "Panels/Question Proxies/question_1_proxied4" } 12 proxies { answer: "who" path: "Panels/Question Proxies/question_1_proxied4" }
13 proxies { answer: "how" path: "Panels/Question Proxies/question_1_proxied5" } 13 proxies { answer: "how" path: "Panels/Question Proxies/question_1_proxied5" }
14 proxies { answer: "where" path: "Panels/Question Proxies/question_1_proxied6" } 14 proxies { answer: "where" path: "Panels/Question Proxies/question_1_proxied6" }
15 display_name: "QUESTION (When)"
15} 16}
16paintings { 17paintings {
17 name: "WHY" 18 name: "WHY"
diff --git a/data/maps/the_great/rooms/Question Room Who.txtpb b/data/maps/the_great/rooms/Question Room Who.txtpb index cbaba4b..eb80882 100644 --- a/data/maps/the_great/rooms/Question Room Who.txtpb +++ b/data/maps/the_great/rooms/Question Room Who.txtpb
@@ -1,5 +1,5 @@
1name: "Question Room Who" 1name: "Question Room Who"
2display_name: "Question Room" 2panel_display_name: "Question Room"
3panels { 3panels {
4 name: "QUESTION" 4 name: "QUESTION"
5 path: "Panels/Questions/question_2" 5 path: "Panels/Questions/question_2"
@@ -7,9 +7,10 @@ panels {
7 answer: "who" 7 answer: "who"
8 symbols: EXAMPLE 8 symbols: EXAMPLE
9 proxies { answer: "why" path: "Panels/Question Proxies/question_2_proxied" } 9 proxies { answer: "why" path: "Panels/Question Proxies/question_2_proxied" }
10 # "Panels/Question Proxies/question_2_proxied2" <- this is just who again 10 proxies { answer: "who" path: "Panels/Question Proxies/question_2_proxied2" }
11 proxies { answer: "where" path: "Panels/Question Proxies/question_2_proxied3" } 11 proxies { answer: "where" path: "Panels/Question Proxies/question_2_proxied3" }
12 proxies { answer: "how" path: "Panels/Question Proxies/question_2_proxied4" } 12 proxies { answer: "how" path: "Panels/Question Proxies/question_2_proxied4" }
13 proxies { answer: "what" path: "Panels/Question Proxies/question_2_proxied5" } 13 proxies { answer: "what" path: "Panels/Question Proxies/question_2_proxied5" }
14 proxies { answer: "when" path: "Panels/Question Proxies/question_2_proxied6" } 14 proxies { answer: "when" path: "Panels/Question Proxies/question_2_proxied6" }
15 display_name: "QUESTION (Who)"
15} 16}
diff --git a/data/maps/the_great/rooms/Salmon Room.txtpb b/data/maps/the_great/rooms/Salmon Room.txtpb index 96efd1a..8458829 100644 --- a/data/maps/the_great/rooms/Salmon Room.txtpb +++ b/data/maps/the_great/rooms/Salmon Room.txtpb
@@ -1,7 +1,9 @@
1name: "Salmon Room" 1name: "Salmon Room"
2display_name: "Main Area" 2panel_display_name: "Main Area"
3ports { 3ports {
4 name: "BETWEEN" 4 name: "BETWEEN"
5 display_name: "Salmon Hallway"
5 path: "Meshes/Blocks/Warps/worldport11" 6 path: "Meshes/Blocks/Warps/worldport11"
6 orientation: "east" 7 destination { x: 83 y: 0 z: -21 }
8 rotation: 90
7} 9}
diff --git a/data/maps/the_great/rooms/Talented Entrance.txtpb b/data/maps/the_great/rooms/Talented Entrance.txtpb index 038c7e7..53c27dc 100644 --- a/data/maps/the_great/rooms/Talented Entrance.txtpb +++ b/data/maps/the_great/rooms/Talented Entrance.txtpb
@@ -1,7 +1,9 @@
1name: "Talented Entrance" 1name: "Talented Entrance"
2display_name: "Question Room" 2panel_display_name: "Question Room"
3ports { 3ports {
4 name: "TALENTED" 4 name: "TALENTED"
5 display_name: "Under Question Room Worldport"
5 path: "Meshes/Blocks/Warps/worldport14" 6 path: "Meshes/Blocks/Warps/worldport14"
6 orientation: "south" 7 destination { x: 109 y: -6 z: -26.5 }
8 rotation: 0
7} 9}
diff --git a/data/maps/the_great/rooms/The Landscapes.txtpb b/data/maps/the_great/rooms/The Landscapes.txtpb new file mode 100644 index 0000000..2912843 --- /dev/null +++ b/data/maps/the_great/rooms/The Landscapes.txtpb
@@ -0,0 +1,88 @@
1name: "The Landscapes"
2panel_display_name: "The Landscapes"
3panels {
4 name: "Top Landscape Top"
5 path: "Panels/Kiwi Room/kiwi_1"
6 clue: ""
7 answer: "one"
8 symbols: QUESTION
9}
10panels {
11 name: "Top Landscape Right"
12 path: "Panels/Kiwi Room/kiwi_2"
13 clue: ""
14 answer: "road"
15 symbols: QUESTION
16}
17panels {
18 name: "Top Landscape Bottom"
19 path: "Panels/Kiwi Room/kiwi_3"
20 clue: ""
21 answer: "many"
22 symbols: QUESTION
23}
24panels {
25 name: "Top Landscape Left"
26 path: "Panels/Kiwi Room/kiwi_4"
27 clue: ""
28 answer: "turns"
29 symbols: QUESTION
30}
31panels {
32 name: "Left Landscape Top"
33 path: "Panels/Kiwi Room/kiwi_5"
34 clue: ""
35 answer: "find"
36 symbols: QUESTION
37}
38panels {
39 name: "Left Landscape Right"
40 path: "Panels/Kiwi Room/kiwi_6"
41 clue: ""
42 answer: "keys"
43 symbols: QUESTION
44}
45panels {
46 name: "Left Landscape Bottom"
47 path: "Panels/Kiwi Room/kiwi_7"
48 clue: ""
49 answer: "write"
50 symbols: QUESTION
51}
52panels {
53 name: "Left Landscape Left"
54 path: "Panels/Kiwi Room/kiwi_8"
55 clue: ""
56 answer: "words"
57 symbols: QUESTION
58}
59panels {
60 name: "Right Landscape Top"
61 path: "Panels/Kiwi Room/kiwi_9"
62 clue: ""
63 answer: "hear"
64 symbols: QUESTION
65 proxies { answer: "tell" path: "Panels/Kiwi Proxies/kiwi_9_proxy_1" }
66}
67panels {
68 name: "Right Landscape Right"
69 path: "Panels/Kiwi Room/kiwi_10"
70 clue: ""
71 answer: "lies"
72 symbols: QUESTION
73}
74panels {
75 name: "Right Landscape Bottom"
76 path: "Panels/Kiwi Room/kiwi_11"
77 clue: ""
78 answer: "the"
79 symbols: QUESTION
80}
81panels {
82 name: "Right Landscape Left"
83 path: "Panels/Kiwi Room/kiwi_12"
84 clue: ""
85 answer: "ears"
86 symbols: QUESTION
87 proxies { answer: "eyes" path: "Panels/Kiwi Proxies/kiwi_12_proxy_1" }
88}
diff --git a/data/maps/the_great/rooms/Under Question Room.txtpb b/data/maps/the_great/rooms/Under Question Room.txtpb index 249c0b4..db751bb 100644 --- a/data/maps/the_great/rooms/Under Question Room.txtpb +++ b/data/maps/the_great/rooms/Under Question Room.txtpb
@@ -1,10 +1,12 @@
1name: "Under Question Room" 1name: "Under Question Room"
2display_name: "Question Room" 2panel_display_name: "Question Room"
3panels { 3panels {
4 name: "QUESTION" 4 name: "QUESTION"
5 path: "Panels/General/question_1" 5 path: "Panels/General/question_1"
6 clue: "question" 6 clue: "question"
7 answer: "which" 7 answer: "which"
8 symbols: EXAMPLE 8 symbols: EXAMPLE
9 proxies { answer: "which" path: "Panels/General/question_1_proxy_1" }
9 proxies { answer: "where" path: "Panels/General/question_1_proxy_2" } 10 proxies { answer: "where" path: "Panels/General/question_1_proxy_2" }
11 display_name: "QUESTION (Where)"
10} 12}
diff --git a/data/maps/the_great/rooms/West Side.txtpb b/data/maps/the_great/rooms/West Side.txtpb index 4723213..9f098ee 100644 --- a/data/maps/the_great/rooms/West Side.txtpb +++ b/data/maps/the_great/rooms/West Side.txtpb
@@ -1,5 +1,5 @@
1name: "West Side" 1name: "West Side"
2display_name: "West Side" 2panel_display_name: "West Side"
3panels { 3panels {
4 name: "ERASE" 4 name: "ERASE"
5 path: "Panels/General/entry_9" 5 path: "Panels/General/entry_9"
@@ -63,17 +63,24 @@ paintings {
63} 63}
64ports { 64ports {
65 name: "IMPRESSIVE" 65 name: "IMPRESSIVE"
66 display_name: "Impressive Entrance"
66 path: "Meshes/Blocks/Warps/worldport2" 67 path: "Meshes/Blocks/Warps/worldport2"
67 orientation: "south" 68 destination { x: -34 y: 0 z: 22.5 }
69 rotation: 0
68} 70}
69ports { 71ports {
70 name: "CC" 72 name: "CC"
73 display_name: "Control Center"
71 path: "Meshes/Blocks/Warps/worldport9" 74 path: "Meshes/Blocks/Warps/worldport9"
72 orientation: "north" 75 destination { x: -59 y: 0 z: -50.5 }
76 rotation: 180
73} 77}
74ports { 78ports {
75 name: "PARTIAL" 79 name: "PARTIAL"
80 display_name: "Red Hallway"
76 path: "Meshes/Blocks/Warps/worldport7" 81 path: "Meshes/Blocks/Warps/worldport7"
77 orientation: "east" 82 destination { x: -62 y: 0 z: 11 }
83 rotation: 90
78 # ER with this is weird; make sure to place on the surface 84 # ER with this is weird; make sure to place on the surface
85 required_door { name: "Partial Entrance" }
79} 86}
diff --git a/data/maps/the_great/rooms/Whole Room.txtpb b/data/maps/the_great/rooms/Whole Room.txtpb index 2f5c855..989241a 100644 --- a/data/maps/the_great/rooms/Whole Room.txtpb +++ b/data/maps/the_great/rooms/Whole Room.txtpb
@@ -1,5 +1,5 @@
1name: "Whole Room" 1name: "Whole Room"
2display_name: "North Landscape" 2panel_display_name: "Building Building"
3panels { 3panels {
4 name: "VAULT" 4 name: "VAULT"
5 path: "Panels/Whole Room/whole_1" 5 path: "Panels/Whole Room/whole_1"
diff --git a/data/maps/the_great/rooms/Y Room.txtpb b/data/maps/the_great/rooms/Y Room.txtpb index b20420c..46c83ea 100644 --- a/data/maps/the_great/rooms/Y Room.txtpb +++ b/data/maps/the_great/rooms/Y Room.txtpb
@@ -1,5 +1,5 @@
1name: "Y Room" 1name: "Y Room"
2display_name: "Question Room" 2panel_display_name: "Question Room"
3letters { 3letters {
4 key: "y" 4 key: "y"
5 path: "Components/Collectables/y" 5 path: "Components/Collectables/y"
diff --git a/data/maps/the_great/rooms/Zero Room.txtpb b/data/maps/the_great/rooms/Zero Room.txtpb index dcbe067..54675bf 100644 --- a/data/maps/the_great/rooms/Zero Room.txtpb +++ b/data/maps/the_great/rooms/Zero Room.txtpb
@@ -1,5 +1,5 @@
1name: "Zero Room" 1name: "Zero Room"
2display_name: "Zero Room" 2panel_display_name: "Zero Room"
3panels { 3panels {
4 name: "HERO" 4 name: "HERO"
5 path: "Panels/General/zero_1" 5 path: "Panels/General/zero_1"
diff --git a/data/maps/the_hinterlands/rooms/Main Area.txtpb b/data/maps/the_hinterlands/rooms/Main Area.txtpb index ad44b38..5cd626b 100644 --- a/data/maps/the_hinterlands/rooms/Main Area.txtpb +++ b/data/maps/the_hinterlands/rooms/Main Area.txtpb
@@ -1,13 +1,16 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Main Area"
3# I'm probably not going to include any of the panels in here. 2# I'm probably not going to include any of the panels in here.
4ports { 3ports {
5 name: "RIGHT" 4 name: "RIGHT"
5 display_name: "South Worldport"
6 path: "Components/Warps/worldport" 6 path: "Components/Warps/worldport"
7 orientation: "east" 7 destination { x: 30 y: 0 z: 19 }
8 rotation: 270
8} 9}
9ports { 10ports {
10 name: "LEFT" 11 name: "LEFT"
12 display_name: "North Worldport"
11 path: "Components/Warps/worldport2" 13 path: "Components/Warps/worldport2"
12 orientation: "east" 14 destination { x: 30 y: 0 z: -76 }
15 rotation: 270
13} 16}
diff --git a/data/maps/the_hive/doors.txtpb b/data/maps/the_hive/doors.txtpb index 4d86e13..48dc892 100644 --- a/data/maps/the_hive/doors.txtpb +++ b/data/maps/the_hive/doors.txtpb
@@ -1,6 +1,7 @@
1doors { 1doors {
2 name: "Room 8 Door" 2 name: "Room 8 Door"
3 type: LOCATION_ONLY 3 type: STANDARD
4 receivers: "Components/Doors/entry_10"
4 panels { room: "Main Area" name: "STEM" } 5 panels { room: "Main Area" name: "STEM" }
5 panels { room: "Main Area" name: "PETAL" } 6 panels { room: "Main Area" name: "PETAL" }
6 panels { room: "Main Area" name: "SOIL" } 7 panels { room: "Main Area" name: "SOIL" }
diff --git a/data/maps/the_hive/rooms/Main Area.txtpb b/data/maps/the_hive/rooms/Main Area.txtpb index de7bdec..aaf8e2a 100644 --- a/data/maps/the_hive/rooms/Main Area.txtpb +++ b/data/maps/the_hive/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Hive"
3panels { 2panels {
4 name: "ASP" 3 name: "ASP"
5 path: "Panels/Room 1/panel_1" 4 path: "Panels/Room 1/panel_1"
@@ -269,24 +268,33 @@ panels {
269keyholders { 268keyholders {
270 name: "B" 269 name: "B"
271 path: "Components/KeyHolders/keyHolderB" 270 path: "Components/KeyHolders/keyHolderB"
271 key: "b"
272} 272}
273ports { 273ports {
274 name: "DAED1" 274 name: "DAED1"
275 display_name: "Blue Area Worldport"
275 path: "Components/Warps/worldport" 276 path: "Components/Warps/worldport"
276 orientation: "west" 277 destination { x: -1.5 y: 0 z: 24 }
278 rotation: 270
277} 279}
278ports { 280ports {
279 name: "DAED2" 281 name: "DAED2"
282 display_name: "Pink Area South Worldport"
280 path: "Components/Warps/worldport2" 283 path: "Components/Warps/worldport2"
281 orientation: "west" 284 destination { x: -26.5 y: 0 z: -22 }
285 rotation: 270
282} 286}
283ports { 287ports {
284 name: "DAED3" 288 name: "DAED3"
289 display_name: "Lime Area Worldport"
285 path: "Components/Warps/worldport3" 290 path: "Components/Warps/worldport3"
286 orientation: "east" 291 destination { x: -44.5 y: 0 z: -13 }
292 rotation: 90
287} 293}
288ports { 294ports {
289 name: "GREAT" 295 name: "GREAT"
296 display_name: "Pink Area North Worldport"
290 path: "Components/Warps/worldport4" 297 path: "Components/Warps/worldport4"
291 orientation: "west" 298 destination { x: -29.5 y: 0 z: -62 }
299 rotation: 270
292} 300}
diff --git a/data/maps/the_hive/rooms/Mastery Room.txtpb b/data/maps/the_hive/rooms/Mastery Room.txtpb index 1884cfd..5e3326c 100644 --- a/data/maps/the_hive/rooms/Mastery Room.txtpb +++ b/data/maps/the_hive/rooms/Mastery Room.txtpb
@@ -1,5 +1,4 @@
1name: "Mastery Room" 1name: "Mastery Room"
2display_name: "Hive"
3masteries { 2masteries {
4 name: "MASTERY" 3 name: "MASTERY"
5 path: "Components/Collectables/smiley" 4 path: "Components/Collectables/smiley"
diff --git a/data/maps/the_hive/rooms/Room 8.txtpb b/data/maps/the_hive/rooms/Room 8.txtpb index e8cbb60..c96440c 100644 --- a/data/maps/the_hive/rooms/Room 8.txtpb +++ b/data/maps/the_hive/rooms/Room 8.txtpb
@@ -1,5 +1,4 @@
1name: "Room 8" 1name: "Room 8"
2display_name: "Hive"
3panels { 2panels {
4 name: "BUMBLE" 3 name: "BUMBLE"
5 path: "Panels/Room 8/panel_1" 4 path: "Panels/Room 8/panel_1"
diff --git a/data/maps/the_impressive/doors.txtpb b/data/maps/the_impressive/doors.txtpb index e27d531..9ab6845 100644 --- a/data/maps/the_impressive/doors.txtpb +++ b/data/maps/the_impressive/doors.txtpb
@@ -30,8 +30,25 @@ doors {
30 panels { room: "Green Eye" name: "LEFT" } 30 panels { room: "Green Eye" name: "LEFT" }
31} 31}
32doors { 32doors {
33 name: "Green Eye Panels"
34 type: LOCATION_ONLY
35 panels { room: "Green Eye" name: "RETURN" }
36 panels { room: "Green Eye" name: "TO" }
37 panels { room: "Green Eye" name: "LEFT" }
38 location_room: "Green Eye"
39 location_name: "RETURN, TO, LEFT"
40}
41doors {
33 name: "Control Center Green Door" 42 name: "Control Center Green Door"
34 type: CONTROL_CENTER_COLOR 43 type: CONTROL_CENTER_COLOR
44 latch: true
35 receivers: "Components/Doors/entry_2" 45 receivers: "Components/Doors/entry_2"
36 control_center_color: "green" 46 control_center_color: "green"
37} 47}
48doors {
49 name: "Control Center Green Panel"
50 type: LOCATION_ONLY
51 panels { room: "Side Area" name: "COLOR" }
52 location_room: "Side Area"
53 location_name: "COLOR"
54}
diff --git a/data/maps/the_impressive/rooms/Green Eye.txtpb b/data/maps/the_impressive/rooms/Green Eye.txtpb index 195099d..aa31b07 100644 --- a/data/maps/the_impressive/rooms/Green Eye.txtpb +++ b/data/maps/the_impressive/rooms/Green Eye.txtpb
@@ -1,5 +1,5 @@
1name: "Green Eye" 1name: "Green Eye"
2display_name: "Impressive" 2panel_display_name: "Outside"
3panels { 3panels {
4 name: "RETURN" 4 name: "RETURN"
5 path: "Panels/entry_5" 5 path: "Panels/entry_5"
@@ -22,6 +22,8 @@ panels {
22} 22}
23ports { 23ports {
24 name: "PLAZA" 24 name: "PLAZA"
25 display_name: "Green Hallway"
25 path: "Components/Warps/worldport3" 26 path: "Components/Warps/worldport3"
26 orientation: "east" 27 destination { x: -33 y: 0 z: 1 }
28 rotation: 90
27} 29}
diff --git a/data/maps/the_impressive/rooms/Lobby.txtpb b/data/maps/the_impressive/rooms/Lobby.txtpb index 5492d67..577a051 100644 --- a/data/maps/the_impressive/rooms/Lobby.txtpb +++ b/data/maps/the_impressive/rooms/Lobby.txtpb
@@ -1,5 +1,5 @@
1name: "Lobby" 1name: "Lobby"
2display_name: "Impressive" 2panel_display_name: "Outside"
3panels { 3panels {
4 name: "RIGHT" 4 name: "RIGHT"
5 path: "Panels/entry_1" 5 path: "Panels/entry_1"
@@ -9,6 +9,8 @@ panels {
9} 9}
10ports { 10ports {
11 name: "GREAT" 11 name: "GREAT"
12 display_name: "Main Entrance"
12 path: "Components/Warps/worldport" 13 path: "Components/Warps/worldport"
13 orientation: "south" 14 destination { x: 0 y: 0 z: 11.5 }
15 rotation: 0
14} 16}
diff --git a/data/maps/the_impressive/rooms/M Room.txtpb b/data/maps/the_impressive/rooms/M Room.txtpb index 1796bb3..2cc71be 100644 --- a/data/maps/the_impressive/rooms/M Room.txtpb +++ b/data/maps/the_impressive/rooms/M Room.txtpb
@@ -1,5 +1,5 @@
1name: "M Room" 1name: "M Room"
2display_name: "Impressive" 2panel_display_name: "Inside"
3letters { 3letters {
4 key: "m" 4 key: "m"
5 path: "Components/Collectables/collectable" 5 path: "Components/Collectables/collectable"
diff --git a/data/maps/the_impressive/rooms/M2 Room.txtpb b/data/maps/the_impressive/rooms/M2 Room.txtpb index d229cbc..3684441 100644 --- a/data/maps/the_impressive/rooms/M2 Room.txtpb +++ b/data/maps/the_impressive/rooms/M2 Room.txtpb
@@ -1,5 +1,5 @@
1name: "M2 Room" 1name: "M2 Room"
2display_name: "Impressive" 2panel_display_name: "Inside"
3letters { 3letters {
4 key: "m" 4 key: "m"
5 level2: true 5 level2: true
diff --git a/data/maps/the_impressive/rooms/Side Area.txtpb b/data/maps/the_impressive/rooms/Side Area.txtpb index 7c3dbd8..d1b28a3 100644 --- a/data/maps/the_impressive/rooms/Side Area.txtpb +++ b/data/maps/the_impressive/rooms/Side Area.txtpb
@@ -1,5 +1,5 @@
1name: "Side Area" 1name: "Side Area"
2display_name: "Impressive" 2panel_display_name: "Outside"
3panels { 3panels {
4 name: "COLOR" 4 name: "COLOR"
5 path: "Panels/entry_4" 5 path: "Panels/entry_4"
@@ -9,6 +9,8 @@ panels {
9} 9}
10ports { 10ports {
11 name: "FOURROOMS" 11 name: "FOURROOMS"
12 display_name: "Four Rooms Entrance"
12 path: "Components/Warps/worldport2" 13 path: "Components/Warps/worldport2"
13 orientation: "south" 14 destination { x: -27 y: 0 z: 25.5 }
15 rotation: 0
14} 16}
diff --git a/data/maps/the_impressive/rooms/W Room.txtpb b/data/maps/the_impressive/rooms/W Room.txtpb index c0616f9..21f1eab 100644 --- a/data/maps/the_impressive/rooms/W Room.txtpb +++ b/data/maps/the_impressive/rooms/W Room.txtpb
@@ -1,5 +1,5 @@
1name: "W Room" 1name: "W Room"
2display_name: "Impressive" 2panel_display_name: "Inside"
3letters { 3letters {
4 key: "w" 4 key: "w"
5 path: "Components/Collectables/collectable2" 5 path: "Components/Collectables/collectable2"
diff --git a/data/maps/the_impressive/rooms/WM Room.txtpb b/data/maps/the_impressive/rooms/WM Room.txtpb index a66f614..dce77ed 100644 --- a/data/maps/the_impressive/rooms/WM Room.txtpb +++ b/data/maps/the_impressive/rooms/WM Room.txtpb
@@ -1,5 +1,5 @@
1name: "WM Room" 1name: "WM Room"
2display_name: "Impressive" 2panel_display_name: "Inside"
3panels { 3panels {
4 name: "LEFT" 4 name: "LEFT"
5 path: "Panels/entry_2" 5 path: "Panels/entry_2"
@@ -13,4 +13,5 @@ panels {
13 clue: "right" 13 clue: "right"
14 answer: "right" 14 answer: "right"
15 proxies { answer: "left" path: "Panels/proxied_1" } 15 proxies { answer: "left" path: "Panels/proxied_1" }
16 proxies { answer: "right" path: "Panels/proxied_2" }
16} 17}
diff --git a/data/maps/the_invisible/rooms/Entrance.txtpb b/data/maps/the_invisible/rooms/Entrance.txtpb index 7fafcb5..c74b968 100644 --- a/data/maps/the_invisible/rooms/Entrance.txtpb +++ b/data/maps/the_invisible/rooms/Entrance.txtpb
@@ -1,5 +1,4 @@
1name: "Entrance" 1name: "Entrance"
2display_name: "Invisible"
3panels { 2panels {
4 name: "VISIBLE" 3 name: "VISIBLE"
5 path: "Panels/Room_1/panel_1" 4 path: "Panels/Room_1/panel_1"
@@ -9,6 +8,8 @@ panels {
9} 8}
10ports { 9ports {
11 name: "ENTRY" 10 name: "ENTRY"
11 display_name: "Entrance"
12 path: "Components/Warps/worldport2" 12 path: "Components/Warps/worldport2"
13 orientation: "north" 13 destination { x: 0 y: 0 z: -57 }
14 rotation: 180
14} 15}
diff --git a/data/maps/the_invisible/rooms/Maze.txtpb b/data/maps/the_invisible/rooms/Maze.txtpb index 4461f08..46f3fbc 100644 --- a/data/maps/the_invisible/rooms/Maze.txtpb +++ b/data/maps/the_invisible/rooms/Maze.txtpb
@@ -1,11 +1,13 @@
1name: "Maze" 1name: "Maze"
2display_name: "Invisible"
3masteries { 2masteries {
4 name: "MASTERY" 3 name: "MASTERY"
5 path: "Components/Collectables/smiley" 4 path: "Components/Collectables/smiley"
6} 5}
7ports { 6ports {
8 name: "ENTRY" 7 name: "ENTRY"
8 display_name: "Exit"
9 path: "Components/Warps/worldport" 9 path: "Components/Warps/worldport"
10 orientation: "south" 10 # Should this be shuffleable? It skips the maze lol.
11 destination { x: 0 y: 0 z: 9.5 }
12 rotation: 0
11} 13}
diff --git a/data/maps/the_jubilant/doors.txtpb b/data/maps/the_jubilant/doors.txtpb index 02db1ff..90bfd0f 100644 --- a/data/maps/the_jubilant/doors.txtpb +++ b/data/maps/the_jubilant/doors.txtpb
@@ -31,3 +31,14 @@ doors {
31 panels { room: "Main Area" name: "QUEEN" answer: "jack" } 31 panels { room: "Main Area" name: "QUEEN" answer: "jack" }
32 location_room: "Main Area" 32 location_room: "Main Area"
33} 33}
34doors {
35 name: "Side Room Puzzles"
36 type: LOCATION_ONLY
37 panels { room: "Side Area" name: "CALLBACK" }
38 panels { room: "Side Area" name: "CALL" }
39 panels { room: "Side Area" name: "PUSHBACK" }
40 panels { room: "Side Area" name: "PUSH" }
41 panels { room: "Side Area" name: "FLASHBACK" }
42 panels { room: "Side Area" name: "FLASH" }
43 location_room: "Side Area"
44}
diff --git a/data/maps/the_jubilant/metadata.txtpb b/data/maps/the_jubilant/metadata.txtpb index 7de7b85..4af1874 100644 --- a/data/maps/the_jubilant/metadata.txtpb +++ b/data/maps/the_jubilant/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Jubilant" 1display_name: "The Jubilant"
2worldport_entrance {
3 room: "Main Area"
4 name: "GREAT"
5}
diff --git a/data/maps/the_jubilant/rooms/J Room.txtpb b/data/maps/the_jubilant/rooms/J Room.txtpb index 35abc54..19425f1 100644 --- a/data/maps/the_jubilant/rooms/J Room.txtpb +++ b/data/maps/the_jubilant/rooms/J Room.txtpb
@@ -1,5 +1,4 @@
1name: "J Room" 1name: "J Room"
2display_name: "Jubilant"
3letters { 2letters {
4 key: "j" 3 key: "j"
5 path: "Components/Collectables/q" # yeah lol 4 path: "Components/Collectables/q" # yeah lol
diff --git a/data/maps/the_jubilant/rooms/Main Area.txtpb b/data/maps/the_jubilant/rooms/Main Area.txtpb index 3d7d31f..b38fafd 100644 --- a/data/maps/the_jubilant/rooms/Main Area.txtpb +++ b/data/maps/the_jubilant/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Jubilant"
3panels { 2panels {
4 name: "GEMSTONE" 3 name: "GEMSTONE"
5 path: "Panels/Main/panel_1" 4 path: "Panels/Main/panel_1"
@@ -98,6 +97,8 @@ panels {
98} 97}
99ports { 98ports {
100 name: "GREAT" 99 name: "GREAT"
100 display_name: "Entrance"
101 path: "Components/Warps/worldport" 101 path: "Components/Warps/worldport"
102 orientation: "west" 102 destination { x: -3 y: 0 z: 9 }
103 rotation: 270
103} 104}
diff --git a/data/maps/the_jubilant/rooms/Side Area.txtpb b/data/maps/the_jubilant/rooms/Side Area.txtpb index 0e904aa..807f044 100644 --- a/data/maps/the_jubilant/rooms/Side Area.txtpb +++ b/data/maps/the_jubilant/rooms/Side Area.txtpb
@@ -1,5 +1,4 @@
1name: "Side Area" 1name: "Side Area"
2display_name: "Jubilant"
3panels { 2panels {
4 name: "CALLBACK" 3 name: "CALLBACK"
5 path: "Panels/Back Helpers/back_1" 4 path: "Panels/Back Helpers/back_1"
@@ -39,4 +38,5 @@ panels {
39keyholders { 38keyholders {
40 name: "J" 39 name: "J"
41 path: "Components/KeyHolders/keyHolderJ" 40 path: "Components/KeyHolders/keyHolderJ"
41 key: "j"
42} 42}
diff --git a/data/maps/the_keen/metadata.txtpb b/data/maps/the_keen/metadata.txtpb index 669f608..909f420 100644 --- a/data/maps/the_keen/metadata.txtpb +++ b/data/maps/the_keen/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Keen" 1display_name: "The Keen"
2worldport_entrance {
3 room: "Main Area"
4 name: "GREAT"
5}
diff --git a/data/maps/the_keen/rooms/K Room.txtpb b/data/maps/the_keen/rooms/K Room.txtpb index 3485856..d8108f5 100644 --- a/data/maps/the_keen/rooms/K Room.txtpb +++ b/data/maps/the_keen/rooms/K Room.txtpb
@@ -1,5 +1,4 @@
1name: "K Room" 1name: "K Room"
2display_name: "Keen"
3letters { 2letters {
4 key: "k" 3 key: "k"
5 path: "Components/Collectables/collectable" 4 path: "Components/Collectables/collectable"
diff --git a/data/maps/the_keen/rooms/Main Area.txtpb b/data/maps/the_keen/rooms/Main Area.txtpb index 616e7e7..32d399a 100644 --- a/data/maps/the_keen/rooms/Main Area.txtpb +++ b/data/maps/the_keen/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Keen"
3panels { 2panels {
4 name: "TIN (1)" 3 name: "TIN (1)"
5 path: "Panels/entry_3" 4 path: "Panels/entry_3"
@@ -70,6 +69,8 @@ panels {
70} 69}
71ports { 70ports {
72 name: "GREAT" 71 name: "GREAT"
72 display_name: "Entrance"
73 path: "Components/Warps/worldport" 73 path: "Components/Warps/worldport"
74 orientation: "south" 74 destination { x: 0 y: 0 z: 7.5 }
75 rotation: 0
75} 76}
diff --git a/data/maps/the_liberated/doors.txtpb b/data/maps/the_liberated/doors.txtpb index becddf9..a7d3c24 100644 --- a/data/maps/the_liberated/doors.txtpb +++ b/data/maps/the_liberated/doors.txtpb
@@ -11,4 +11,5 @@ doors {
11 panels { room: "Puzzle Room" name: "WOLF" } 11 panels { room: "Puzzle Room" name: "WOLF" }
12 panels { room: "Puzzle Room" name: "FOOT" } 12 panels { room: "Puzzle Room" name: "FOOT" }
13 location_room: "Puzzle Room" 13 location_room: "Puzzle Room"
14 location_name: "Puzzles"
14} 15}
diff --git a/data/maps/the_liberated/metadata.txtpb b/data/maps/the_liberated/metadata.txtpb index a92d7e5..b9b4321 100644 --- a/data/maps/the_liberated/metadata.txtpb +++ b/data/maps/the_liberated/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Liberated" 1display_name: "The Liberated"
2worldport_entrance {
3 room: "Puzzle Room"
4 name: "ENTRY"
5}
diff --git a/data/maps/the_liberated/rooms/Painting Room.txtpb b/data/maps/the_liberated/rooms/Painting Room.txtpb index 025281a..f22929c 100644 --- a/data/maps/the_liberated/rooms/Painting Room.txtpb +++ b/data/maps/the_liberated/rooms/Painting Room.txtpb
@@ -1,5 +1,4 @@
1name: "Painting Room" 1name: "Painting Room"
2display_name: "Liberated"
3paintings { 2paintings {
4 name: "PYRAMID" 3 name: "PYRAMID"
5 path: "Components/triangle" 4 path: "Components/triangle"
diff --git a/data/maps/the_liberated/rooms/Puzzle Room.txtpb b/data/maps/the_liberated/rooms/Puzzle Room.txtpb index dcb29c4..2103bfa 100644 --- a/data/maps/the_liberated/rooms/Puzzle Room.txtpb +++ b/data/maps/the_liberated/rooms/Puzzle Room.txtpb
@@ -1,5 +1,4 @@
1name: "Puzzle Room" 1name: "Puzzle Room"
2display_name: "Liberated"
3panels { 2panels {
4 name: "CORPSE" 3 name: "CORPSE"
5 path: "Panels/entry_1" 4 path: "Panels/entry_1"
@@ -58,6 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "ENTRY" 59 name: "ENTRY"
60 display_name: "Entrance"
61 path: "Components/Warps/worldport" 61 path: "Components/Warps/worldport"
62 orientation: "south" 62 destination { x: 0 y: 0 z: 7.5 }
63 rotation: 0
63} 64}
diff --git a/data/maps/the_linear/doors.txtpb b/data/maps/the_linear/doors.txtpb index 63d8ae8..9a57158 100644 --- a/data/maps/the_linear/doors.txtpb +++ b/data/maps/the_linear/doors.txtpb
@@ -10,4 +10,5 @@ doors {
10 panels { room: "Room" name: "INTO" } 10 panels { room: "Room" name: "INTO" }
11 panels { room: "Room" name: "NOR" } 11 panels { room: "Room" name: "NOR" }
12 location_room: "Room" 12 location_room: "Room"
13 location_name: "Gravestone"
13} 14}
diff --git a/data/maps/the_linear/metadata.txtpb b/data/maps/the_linear/metadata.txtpb index 989463d..838bb2b 100644 --- a/data/maps/the_linear/metadata.txtpb +++ b/data/maps/the_linear/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Linear" 1display_name: "The Linear"
2worldport_entrance {
3 room: "Room"
4 name: "GREAT"
5}
diff --git a/data/maps/the_linear/rooms/Room.txtpb b/data/maps/the_linear/rooms/Room.txtpb index abb89c8..ac03fd9 100644 --- a/data/maps/the_linear/rooms/Room.txtpb +++ b/data/maps/the_linear/rooms/Room.txtpb
@@ -1,5 +1,4 @@
1name: "Room" 1name: "Room"
2display_name: "Room"
3panels { 2panels {
4 name: "HORN" 3 name: "HORN"
5 path: "Panels/entry_1" 4 path: "Panels/entry_1"
@@ -58,6 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "GREAT" 59 name: "GREAT"
60 display_name: "Entrance"
61 path: "Components/Warps/worldport" 61 path: "Components/Warps/worldport"
62 orientation: "south" 62 destination { x: 0 y: 0 z: 7.5 }
63 rotation: 0
63} 64}
diff --git a/data/maps/the_lionized/metadata.txtpb b/data/maps/the_lionized/metadata.txtpb index 38fd5c2..8d6168d 100644 --- a/data/maps/the_lionized/metadata.txtpb +++ b/data/maps/the_lionized/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Lionized" 1display_name: "The Lionized"
2worldport_entrance {
3 room: "Puzzle Room"
4 name: "ENTRY"
5}
diff --git a/data/maps/the_lionized/rooms/E2 Room.txtpb b/data/maps/the_lionized/rooms/E2 Room.txtpb index b07d820..e8f81c1 100644 --- a/data/maps/the_lionized/rooms/E2 Room.txtpb +++ b/data/maps/the_lionized/rooms/E2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "E2 Room" 1name: "E2 Room"
2display_name: "Lionized"
3letters { 2letters {
4 key: "e" 3 key: "e"
5 level2: true 4 level2: true
diff --git a/data/maps/the_lionized/rooms/Puzzle Room.txtpb b/data/maps/the_lionized/rooms/Puzzle Room.txtpb index 5754c71..3a5e267 100644 --- a/data/maps/the_lionized/rooms/Puzzle Room.txtpb +++ b/data/maps/the_lionized/rooms/Puzzle Room.txtpb
@@ -1,5 +1,4 @@
1name: "Puzzle Room" 1name: "Puzzle Room"
2display_name: "Lionized"
3panels { 2panels {
4 name: "CHILD" 3 name: "CHILD"
5 path: "Panels/entry_1" 4 path: "Panels/entry_1"
@@ -58,6 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "ENTRY" 59 name: "ENTRY"
60 display_name: "Entrance"
61 path: "Components/Warps/worldport" 61 path: "Components/Warps/worldport"
62 orientation: "south" 62 destination { x: 0 y: 0 z: 6.5 }
63 rotation: 0
63} 64}
diff --git a/data/maps/the_literate/doors.txtpb b/data/maps/the_literate/doors.txtpb index 480f54d..d17d02b 100644 --- a/data/maps/the_literate/doors.txtpb +++ b/data/maps/the_literate/doors.txtpb
@@ -11,4 +11,5 @@ doors {
11 panels { room: "Puzzle Room" name: "STICK" } 11 panels { room: "Puzzle Room" name: "STICK" }
12 panels { room: "Puzzle Room" name: "BREAD" } 12 panels { room: "Puzzle Room" name: "BREAD" }
13 location_room: "Puzzle Room" 13 location_room: "Puzzle Room"
14 location_name: "Puzzles"
14} 15}
diff --git a/data/maps/the_literate/metadata.txtpb b/data/maps/the_literate/metadata.txtpb index 76d1df6..0e04306 100644 --- a/data/maps/the_literate/metadata.txtpb +++ b/data/maps/the_literate/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Literate" 1display_name: "The Literate"
2worldport_entrance {
3 room: "Puzzle Room"
4 name: "ENTRY"
5}
diff --git a/data/maps/the_literate/rooms/Painting Room.txtpb b/data/maps/the_literate/rooms/Painting Room.txtpb index 254e174..f22929c 100644 --- a/data/maps/the_literate/rooms/Painting Room.txtpb +++ b/data/maps/the_literate/rooms/Painting Room.txtpb
@@ -1,5 +1,4 @@
1name: "Painting Room" 1name: "Painting Room"
2display_name: "Literate"
3paintings { 2paintings {
4 name: "PYRAMID" 3 name: "PYRAMID"
5 path: "Components/triangle" 4 path: "Components/triangle"
diff --git a/data/maps/the_literate/rooms/Puzzle Room.txtpb b/data/maps/the_literate/rooms/Puzzle Room.txtpb index 610a87a..c65d408 100644 --- a/data/maps/the_literate/rooms/Puzzle Room.txtpb +++ b/data/maps/the_literate/rooms/Puzzle Room.txtpb
@@ -1,5 +1,4 @@
1name: "Puzzle Room" 1name: "Puzzle Room"
2display_name: "Literate"
3panels { 2panels {
4 name: "WATER" 3 name: "WATER"
5 path: "Panels/entry_1" 4 path: "Panels/entry_1"
@@ -58,6 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "ENTRY" 59 name: "ENTRY"
60 display_name: "Entrance"
61 path: "Components/Warps/worldport" 61 path: "Components/Warps/worldport"
62 orientation: "south" 62 destination { x: 0 y: 0 z: 7.5 }
63 rotation: 0
63} 64}
diff --git a/data/maps/the_lively/metadata.txtpb b/data/maps/the_lively/metadata.txtpb index cbf11c2..acd1177 100644 --- a/data/maps/the_lively/metadata.txtpb +++ b/data/maps/the_lively/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Lively" 1display_name: "The Lively"
2worldport_entrance {
3 room: "Puzzle Room"
4 name: "BETWEEN"
5}
diff --git a/data/maps/the_lively/rooms/L2 Room.txtpb b/data/maps/the_lively/rooms/L2 Room.txtpb index 094ab10..cd75bbd 100644 --- a/data/maps/the_lively/rooms/L2 Room.txtpb +++ b/data/maps/the_lively/rooms/L2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "L2 Room" 1name: "L2 Room"
2display_name: "Lively"
3letters { 2letters {
4 key: "l" 3 key: "l"
5 level2: true 4 level2: true
diff --git a/data/maps/the_lively/rooms/Puzzle Room.txtpb b/data/maps/the_lively/rooms/Puzzle Room.txtpb index f202453..4918476 100644 --- a/data/maps/the_lively/rooms/Puzzle Room.txtpb +++ b/data/maps/the_lively/rooms/Puzzle Room.txtpb
@@ -1,5 +1,4 @@
1name: "Puzzle Room" 1name: "Puzzle Room"
2display_name: "Lively"
3panels { 2panels {
4 name: "LIONESS" 3 name: "LIONESS"
5 path: "Panels/entry_1" 4 path: "Panels/entry_1"
@@ -58,5 +57,8 @@ panels {
58} 57}
59ports { 58ports {
60 name: "BETWEEN" 59 name: "BETWEEN"
60 display_name: "Entrance"
61 path: "Components/Warps/worldport" 61 path: "Components/Warps/worldport"
62 destination { x: 0 y: 0 z: 6.5 }
63 rotation: 0
62} 64}
diff --git a/data/maps/the_nuanced/connections.txtpb b/data/maps/the_nuanced/connections.txtpb index 6c4b0f6..a530472 100644 --- a/data/maps/the_nuanced/connections.txtpb +++ b/data/maps/the_nuanced/connections.txtpb
@@ -1,7 +1,7 @@
1connections { 1connections {
2 from_room: "Main Room" 2 from_room: "Main Room"
3 to_room: "Back Room" 3 to_room: "Back Room"
4 door { name: "Main Room Puzzles" } 4 door { name: "Main Room Door" }
5} 5}
6connections { 6connections {
7 from_room: "Back Room" 7 from_room: "Back Room"
diff --git a/data/maps/the_nuanced/doors.txtpb b/data/maps/the_nuanced/doors.txtpb index 0c66799..300524b 100644 --- a/data/maps/the_nuanced/doors.txtpb +++ b/data/maps/the_nuanced/doors.txtpb
@@ -1,5 +1,5 @@
1doors { 1doors {
2 name: "Left Room Puzzles" 2 name: "Blue Side Puzzles"
3 type: LOCATION_ONLY 3 type: LOCATION_ONLY
4 panels { room: "Main Room" name: "HOARSE" } 4 panels { room: "Main Room" name: "HOARSE" }
5 panels { room: "Main Room" name: "NAY" } 5 panels { room: "Main Room" name: "NAY" }
@@ -11,7 +11,7 @@ doors {
11 location_room: "Main Room" 11 location_room: "Main Room"
12} 12}
13doors { 13doors {
14 name: "Right Room Puzzles" 14 name: "Green Side Puzzles"
15 type: LOCATION_ONLY 15 type: LOCATION_ONLY
16 panels { room: "Main Room" name: "HOSE" } 16 panels { room: "Main Room" name: "HOSE" }
17 panels { room: "Main Room" name: "NIGH" } 17 panels { room: "Main Room" name: "NIGH" }
@@ -23,7 +23,7 @@ doors {
23 location_room: "Main Room" 23 location_room: "Main Room"
24} 24}
25doors { 25doors {
26 name: "Main Room Puzzles" 26 name: "Main Room Door"
27 type: ITEM_ONLY 27 type: ITEM_ONLY
28 receivers: "Components/Doors/entry_1" 28 receivers: "Components/Doors/entry_1"
29 panels { room: "Main Room" name: "HOARSE" } 29 panels { room: "Main Room" name: "HOARSE" }
@@ -52,3 +52,10 @@ doors {
52 panels { room: "Back Room" name: "LIMB" } 52 panels { room: "Back Room" name: "LIMB" }
53 panels { room: "Back Room" name: "SPARE" } 53 panels { room: "Back Room" name: "SPARE" }
54} 54}
55doors {
56 name: "Stores Panel"
57 type: LOCATION_ONLY
58 panels { room: "Main Room" name: "TORE" }
59 location_room: "Main Room"
60 location_name: "TORE"
61}
diff --git a/data/maps/the_nuanced/metadata.txtpb b/data/maps/the_nuanced/metadata.txtpb index 9c39826..4ac9b13 100644 --- a/data/maps/the_nuanced/metadata.txtpb +++ b/data/maps/the_nuanced/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Nuanced" 1display_name: "The Nuanced"
2worldport_entrance {
3 room: "Main Room"
4 name: "UNYIELDING"
5}
diff --git a/data/maps/the_nuanced/rooms/Back Room.txtpb b/data/maps/the_nuanced/rooms/Back Room.txtpb index 37a1c7a..b61e18b 100644 --- a/data/maps/the_nuanced/rooms/Back Room.txtpb +++ b/data/maps/the_nuanced/rooms/Back Room.txtpb
@@ -1,5 +1,4 @@
1name: "Back Room" 1name: "Back Room"
2display_name: "Nuanced"
3panels { 2panels {
4 name: "COURSE" 3 name: "COURSE"
5 path: "Panels/Rhymes/panel_1" 4 path: "Panels/Rhymes/panel_1"
diff --git a/data/maps/the_nuanced/rooms/Main Room.txtpb b/data/maps/the_nuanced/rooms/Main Room.txtpb index 8523b38..ce4310e 100644 --- a/data/maps/the_nuanced/rooms/Main Room.txtpb +++ b/data/maps/the_nuanced/rooms/Main Room.txtpb
@@ -1,5 +1,4 @@
1name: "Main Room" 1name: "Main Room"
2display_name: "Nuanced"
3panels { 2panels {
4 name: "HOARSE" 3 name: "HOARSE"
5 path: "Panels/Eyes/panel_1" 4 path: "Panels/Eyes/panel_1"
@@ -107,10 +106,13 @@ panels {
107} 106}
108ports { 107ports {
109 name: "UNYIELDING" 108 name: "UNYIELDING"
109 display_name: "Entrance"
110 path: "Components/Warps/worldport" 110 path: "Components/Warps/worldport"
111 orientation: "west" 111 destination { x: -3.5 y: 0 z: 21 }
112 rotation: 270
112} 113}
113keyholders { 114keyholders {
114 name: "S" 115 name: "S"
115 path: "Components/KeyHolders/keyHolderS" 116 path: "Components/KeyHolders/keyHolderS"
117 key: "s"
116} 118}
diff --git a/data/maps/the_nuanced/rooms/N2 Room.txtpb b/data/maps/the_nuanced/rooms/N2 Room.txtpb index 492d4a3..eb9f67c 100644 --- a/data/maps/the_nuanced/rooms/N2 Room.txtpb +++ b/data/maps/the_nuanced/rooms/N2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "N2 Room" 1name: "N2 Room"
2display_name: "Nuanced"
3letters { 2letters {
4 key: "n" 3 key: "n"
5 level2: true 4 level2: true
diff --git a/data/maps/the_orb/connections.txtpb b/data/maps/the_orb/connections.txtpb index 62a7643..b902711 100644 --- a/data/maps/the_orb/connections.txtpb +++ b/data/maps/the_orb/connections.txtpb
@@ -10,10 +10,20 @@ connections {
10} 10}
11connections { 11connections {
12 from_room: "Main Area" 12 from_room: "Main Area"
13 to_room: "B Room" 13 to_room: "Middle Room"
14 door { name: "B Puzzles" } 14 door { name: "B Puzzles" }
15} 15}
16connections { 16connections {
17 from_room: "Middle Room"
18 to_room: "B Room"
19 oneway: true
20}
21connections {
22 from_room: "Middle Room"
23 to_room: "Main Area"
24 oneway: true
25}
26connections {
17 from_room: "B Room" 27 from_room: "B Room"
18 to_room: "Main Area" 28 to_room: "Main Area"
19 oneway: true 29 oneway: true
diff --git a/data/maps/the_orb/rooms/B Room.txtpb b/data/maps/the_orb/rooms/B Room.txtpb index 833c659..633232f 100644 --- a/data/maps/the_orb/rooms/B Room.txtpb +++ b/data/maps/the_orb/rooms/B Room.txtpb
@@ -1,5 +1,4 @@
1name: "B Room" 1name: "B Room"
2display_name: "Orb"
3letters { 2letters {
4 key: "b" 3 key: "b"
5 path: "Components/Collectables/b" 4 path: "Components/Collectables/b"
@@ -10,19 +9,10 @@ paintings {
10 # TODO: This is too high up to enter. It's also a hint painting. 9 # TODO: This is too high up to enter. It's also a hint painting.
11 exit_only: true 10 exit_only: true
12} 11}
13# TODO: Should these two be independent for shuffling purposes, or always tied
14# to the Main Area's port?
15ports {
16 name: "MID"
17 path: "Components/Warps/worldport4"
18 orientation: "south"
19 # This port is in the room immediately after solving the B puzzles, which
20 # means it seems like it would be inaccessible if you enter the map from the
21 # painting or from the final port, but entering the O or R areas brings you
22 # back to the beginning.
23}
24ports { 12ports {
25 name: "FINAL" 13 name: "FINAL"
14 display_name: "Final Worldport"
26 path: "Components/Warps/worldport5" 15 path: "Components/Warps/worldport5"
27 orientation: "south" 16 destination { x: -69 y: 0 z: 87 }
17 rotation: 90
28} 18}
diff --git a/data/maps/the_orb/rooms/Main Area.txtpb b/data/maps/the_orb/rooms/Main Area.txtpb index 8d7b7b1..976c489 100644 --- a/data/maps/the_orb/rooms/Main Area.txtpb +++ b/data/maps/the_orb/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Orb"
3panels { 2panels {
4 name: "STRIKE" 3 name: "STRIKE"
5 path: "Panels/O/entry_1" 4 path: "Panels/O/entry_1"
@@ -86,6 +85,8 @@ panels {
86} 85}
87ports { 86ports {
88 name: "GREAT" 87 name: "GREAT"
88 display_name: "Main Entrance"
89 path: "Components/Warps/worldport" 89 path: "Components/Warps/worldport"
90 orientation: "south" 90 destination { x: 38 y: 0 z: 39 }
91 rotation: 90
91} 92}
diff --git a/data/maps/the_orb/rooms/Middle Room.txtpb b/data/maps/the_orb/rooms/Middle Room.txtpb new file mode 100644 index 0000000..ed1a00c --- /dev/null +++ b/data/maps/the_orb/rooms/Middle Room.txtpb
@@ -0,0 +1,12 @@
1name: "Middle Room"
2# This is the room after solving the B puzzles but before getting to B1 itself.
3# It has to be a separate region because if you are shuffling worldports and you
4# warp to the B1 room port, you can't access this port if you're not able to
5# solve the B puzzles.
6ports {
7 name: "MID"
8 display_name: "Middle Worldport"
9 path: "Components/Warps/worldport4"
10 destination { x: -69 y: 0 z: 43 }
11 rotation: 90
12}
diff --git a/data/maps/the_orb/rooms/O Room.txtpb b/data/maps/the_orb/rooms/O Room.txtpb index f997780..cc254a4 100644 --- a/data/maps/the_orb/rooms/O Room.txtpb +++ b/data/maps/the_orb/rooms/O Room.txtpb
@@ -1,5 +1,4 @@
1name: "O Room" 1name: "O Room"
2display_name: "Orb"
3letters { 2letters {
4 key: "o" 3 key: "o"
5 path: "Components/Collectables/o" 4 path: "Components/Collectables/o"
diff --git a/data/maps/the_orb/rooms/R Room.txtpb b/data/maps/the_orb/rooms/R Room.txtpb index c53b7eb..a01726a 100644 --- a/data/maps/the_orb/rooms/R Room.txtpb +++ b/data/maps/the_orb/rooms/R Room.txtpb
@@ -1,5 +1,4 @@
1name: "R Room" 1name: "R Room"
2display_name: "Orb"
3letters { 2letters {
4 key: "r" 3 key: "r"
5 path: "Components/Collectables/r" 4 path: "Components/Collectables/r"
diff --git a/data/maps/the_owl/connections.txtpb b/data/maps/the_owl/connections.txtpb index 87c98b3..cb4bee3 100644 --- a/data/maps/the_owl/connections.txtpb +++ b/data/maps/the_owl/connections.txtpb
@@ -10,12 +10,27 @@ connections {
10} 10}
11connections { 11connections {
12 from_room: "R2C2 Bottom" 12 from_room: "R2C2 Bottom"
13 to_room: "R2C2.5 Bottom" 13 to_room: "R2C2 Top"
14 door { name: "Sky Owl" }
15}
16connections {
17 from_room: "R2C2 Bottom"
18 to_room: "Connected Area"
14 door { name: "Gray Owl" } 19 door { name: "Gray Owl" }
15} 20}
16connections { 21connections {
17 from_room: "R2C2 Bottom" 22 from_room: "R2C2 Bottom"
18 to_room: "R2C2.5 Bottom" 23 to_room: "Connected Area"
24 door { name: "Sky Owl" }
25}
26connections {
27 from_room: "R2C3 Bottom"
28 to_room: "Connected Area"
29 oneway: true
30}
31connections {
32 from_room: "R2C2 Bottom"
33 to_room: "Connected Area"
19 door { name: "First Room Shortcut" } 34 door { name: "First Room Shortcut" }
20} 35}
21connections { 36connections {
@@ -30,18 +45,18 @@ connections {
30} 45}
31connections { 46connections {
32 from_room: "R2C2 Top" 47 from_room: "R2C2 Top"
33 to_room: "R2C2.5 Bottom" 48 to_room: "R2C3 Bottom"
34 door { name: "Gray Bottom Door" } 49 door { name: "Gray Bottom Door" }
35} 50}
36connections { 51connections {
37 from_room: "R2C2 Top" 52 from_room: "Connected Area"
38 to_room: "R2C2.5 Bottom" 53 to_room: "R2C3 Bottom"
39 door { name: "Gray Owl" } 54 door { name: "Gray Owl" }
40} 55}
41connections { 56connections {
42 from_room: "Connected Area" 57 from_room: "Connected Area"
43 to_room: "R2C2.5 Bottom" 58 to_room: "R2C3 Bottom"
44 door { name: "Gray Owl" } 59 door { name: "Sky Owl" }
45} 60}
46connections { 61connections {
47 from_room: "Connected Area" 62 from_room: "Connected Area"
@@ -70,6 +85,11 @@ connections {
70} 85}
71connections { 86connections {
72 from_room: "Connected Area" 87 from_room: "Connected Area"
88 to_room: "R1C4 Left"
89 door { name: "Sky Owl" }
90}
91connections {
92 from_room: "Connected Area"
73 to_room: "R2C1 Left" 93 to_room: "R2C1 Left"
74 door { name: "Sky Top Doors" } 94 door { name: "Sky Top Doors" }
75} 95}
@@ -84,6 +104,11 @@ connections {
84 door { name: "Gray Owl" } 104 door { name: "Gray Owl" }
85} 105}
86connections { 106connections {
107 from_room: "Connected Area"
108 to_room: "R2C1 Left"
109 door { name: "Sky Owl" }
110}
111connections {
87 from { 112 from {
88 painting { 113 painting {
89 room: "Connected Area" 114 room: "Connected Area"
diff --git a/data/maps/the_owl/doors.txtpb b/data/maps/the_owl/doors.txtpb index 2c7f449..2d1c851 100644 --- a/data/maps/the_owl/doors.txtpb +++ b/data/maps/the_owl/doors.txtpb
@@ -1,13 +1,15 @@
1doors { 1doors {
2 name: "Brush Door" 2 name: "Brush Door"
3 type: STANDARD 3 type: ITEM_ONLY
4 legacy_location: true
4 receivers: "Components/Doors/entry_1" 5 receivers: "Components/Doors/entry_1"
5 panels { room: "R2C2 Top" name: "CRUSH" } 6 panels { room: "R2C2 Top" name: "CRUSH" }
6 location_room: "R2C2 Top" 7 location_room: "R2C2 Top"
7} 8}
8doors { 9doors {
9 name: "Sky Top Doors" 10 name: "Sky Top Doors"
10 type: STANDARD 11 type: ITEM_ONLY
12 legacy_location: true
11 receivers: "Components/Doors/entry_2" 13 receivers: "Components/Doors/entry_2"
12 receivers: "Components/Doors/entry_4" 14 receivers: "Components/Doors/entry_4"
13 panels { room: "R2C1 Left" name: "VERB" } 15 panels { room: "R2C1 Left" name: "VERB" }
@@ -15,7 +17,8 @@ doors {
15} 17}
16doors { 18doors {
17 name: "Sky Bottom Doors" 19 name: "Sky Bottom Doors"
18 type: STANDARD 20 type: ITEM_ONLY
21 legacy_location: true
19 receivers: "Components/Doors/entry_3" 22 receivers: "Components/Doors/entry_3"
20 receivers: "Components/Doors/entry_5" 23 receivers: "Components/Doors/entry_5"
21 panels { room: "R2C1 Left" name: "FOIL" } 24 panels { room: "R2C1 Left" name: "FOIL" }
@@ -23,21 +26,24 @@ doors {
23} 26}
24doors { 27doors {
25 name: "First Room Shortcut" 28 name: "First Room Shortcut"
26 type: STANDARD 29 type: ITEM_ONLY
30 legacy_location: true
27 receivers: "Components/Doors/entry_6" 31 receivers: "Components/Doors/entry_6"
28 panels { room: "R2C2.5 Bottom" name: "FIZZLE" } 32 panels { room: "Connected Area" name: "FIZZLE" }
29 location_room: "R2C2.5 Bottom" 33 location_room: "Connected Area"
30} 34}
31doors { 35doors {
32 name: "First Door" 36 name: "First Door"
33 type: STANDARD 37 type: ITEM_ONLY
38 legacy_location: true
34 receivers: "Components/Doors/entry_7" 39 receivers: "Components/Doors/entry_7"
35 panels { room: "R2C2 Bottom" name: "FOUL" } 40 panels { room: "R2C2 Bottom" name: "FOUL" }
36 location_room: "R2C2 Bottom" 41 location_room: "R2C2 Bottom"
37} 42}
38doors { 43doors {
39 name: "Blue Door" 44 name: "Blue Door"
40 type: STANDARD 45 type: ITEM_ONLY
46 legacy_location: true
41 receivers: "Components/Doors/entry_8" 47 receivers: "Components/Doors/entry_8"
42 panels { room: "Connected Area" name: "PAST" } 48 panels { room: "Connected Area" name: "PAST" }
43 panels { room: "Connected Area" name: "LAY" } 49 panels { room: "Connected Area" name: "LAY" }
@@ -59,12 +65,14 @@ doors {
59doors { 65doors {
60 name: "Control Center Magenta Door" 66 name: "Control Center Magenta Door"
61 type: CONTROL_CENTER_COLOR 67 type: CONTROL_CENTER_COLOR
68 latch: true
62 receivers: "Components/Doors/entry_18" 69 receivers: "Components/Doors/entry_18"
63 control_center_color: "magenta" 70 control_center_color: "magenta"
64} 71}
65doors { 72doors {
66 name: "Sky Owl" 73 name: "Sky Owl"
67 type: STANDARD 74 type: ITEM_ONLY
75 legacy_location: true
68 receivers: "Components/Owl/Room 1/LB" 76 receivers: "Components/Owl/Room 1/LB"
69 receivers: "Components/Owl/Room 1/LBG" 77 receivers: "Components/Owl/Room 1/LBG"
70 receivers: "Components/Owl/Room 2/LB" 78 receivers: "Components/Owl/Room 2/LB"
@@ -92,7 +100,8 @@ doors {
92} 100}
93doors { 101doors {
94 name: "Gray Owl" 102 name: "Gray Owl"
95 type: STANDARD 103 type: ITEM_ONLY
104 legacy_location: true
96 receivers: "Components/Owl/Room 1/G" 105 receivers: "Components/Owl/Room 1/G"
97 receivers: "Components/Owl/Room 1/GG" 106 receivers: "Components/Owl/Room 1/GG"
98 receivers: "Components/Owl/Room 2/G" 107 receivers: "Components/Owl/Room 2/G"
@@ -120,7 +129,8 @@ doors {
120} 129}
121doors { 130doors {
122 name: "Orange Owl" 131 name: "Orange Owl"
123 type: STANDARD 132 type: ITEM_ONLY
133 legacy_location: true
124 receivers: "Components/Owl/Room 1/O" 134 receivers: "Components/Owl/Room 1/O"
125 receivers: "Components/Owl/Room 1/OG" 135 receivers: "Components/Owl/Room 1/OG"
126 receivers: "Components/Owl/Room 2/O" 136 receivers: "Components/Owl/Room 2/O"
@@ -148,7 +158,8 @@ doors {
148} 158}
149doors { 159doors {
150 name: "White Owl" 160 name: "White Owl"
151 type: STANDARD 161 type: ITEM_ONLY
162 legacy_location: true
152 receivers: "Components/Owl/Room 1/W" 163 receivers: "Components/Owl/Room 1/W"
153 receivers: "Components/Owl/Room 1/WG" 164 receivers: "Components/Owl/Room 1/WG"
154 receivers: "Components/Owl/Room 2/W" 165 receivers: "Components/Owl/Room 2/W"
@@ -171,12 +182,13 @@ doors {
171 receivers: "Components/Owl/Room 10/WG" 182 receivers: "Components/Owl/Room 10/WG"
172 receivers: "Components/Owl/Room 11/W" 183 receivers: "Components/Owl/Room 11/W"
173 receivers: "Components/Owl/Room 11/WG" 184 receivers: "Components/Owl/Room 11/WG"
174 panels { room: "R2C2.5 Bottom" name: "BLACK" } 185 panels { room: "R2C3 Bottom" name: "BLACK" }
175 location_room: "R2C2.5 Bottom" 186 location_room: "R2C3 Bottom"
176} 187}
177doors { 188doors {
178 name: "Black Owl" 189 name: "Black Owl"
179 type: STANDARD 190 type: ITEM_ONLY
191 legacy_location: true
180 receivers: "Components/Owl/Room 1/BK" 192 receivers: "Components/Owl/Room 1/BK"
181 receivers: "Components/Owl/Room 1/BKG" 193 receivers: "Components/Owl/Room 1/BKG"
182 receivers: "Components/Owl/Room 2/BK" 194 receivers: "Components/Owl/Room 2/BK"
@@ -204,7 +216,8 @@ doors {
204} 216}
205doors { 217doors {
206 name: "Blue Owl" 218 name: "Blue Owl"
207 type: STANDARD 219 type: ITEM_ONLY
220 legacy_location: true
208 receivers: "Components/Owl/Room 1/BL" 221 receivers: "Components/Owl/Room 1/BL"
209 receivers: "Components/Owl/Room 1/BLG" 222 receivers: "Components/Owl/Room 1/BLG"
210 receivers: "Components/Owl/Room 2/BL" 223 receivers: "Components/Owl/Room 2/BL"
@@ -233,19 +246,112 @@ doors {
233doors { 246doors {
234 name: "Gray Panel" 247 name: "Gray Panel"
235 type: EVENT 248 type: EVENT
236 # TODO: Is it okay to have an event with an in-game effect? 249 #receivers: "Panels/Colors/owl_2/animationListener2"
237 receivers: "Panels/Colors/owl_2/animationListener2" 250 panels { room: "Connected Area" name: "RANGE" }
238 doors { name: "Orange Owl" } 251 panels { room: "Connected Area" name: "WHITE" }
239 doors { name: "Black Owl" } 252 panels { room: "Blue Room" name: "SKY" }
240 doors { name: "Blue Owl" }
241} 253}
242doors { 254doors {
243 name: "Owl Painting" 255 name: "Owl Painting"
244 type: EVENT 256 type: EVENT
245 move_paintings { room: "Connected Area" name: "OWL" } 257 #move_paintings { room: "Connected Area" name: "OWL" }
246 doors { name: "Orange Owl" } 258 #receivers: "Components/Paintings/owl/teleportListener"
247 doors { name: "Black Owl" } 259 panels { room: "R2C1 Left" name: "DUSKY" }
248 doors { name: "Blue Owl" } 260 panels { room: "R2C2 Top" name: "RAY" }
249 doors { name: "White Owl" } 261 panels { room: "Connected Area" name: "RANGE" }
250 doors { name: "Sky Owl" } 262 panels { room: "R2C3 Bottom" name: "BLACK" }
263 panels { room: "Connected Area" name: "WHITE" }
264 panels { room: "Blue Room" name: "SKY" }
265}
266doors {
267 name: "R1C1 Panels"
268 type: LOCATION_ONLY
269 panels { room: "Connected Area" name: "ETCH" }
270 panels { room: "Connected Area" name: "SHOE" }
271 panels { room: "Connected Area" name: "MARKER" }
272 location_room: "Connected Area"
273 location_name: "ETCH, MARKER, SHOE"
274}
275doors {
276 name: "R1C2 Panels"
277 type: LOCATION_ONLY
278 panels { room: "Connected Area" name: "FAINT" }
279 panels { room: "Connected Area" name: "PURE" }
280 panels { room: "Connected Area" name: "MODE" }
281 location_room: "Connected Area"
282 location_name: "FAINT, MODE, PURE"
283}
284doors {
285 name: "Control Center Magenta Panel"
286 type: LOCATION_ONLY
287 panels { room: "Connected Area" name: "COLOR" }
288 location_room: "Connected Area"
289 location_name: "COLOR"
290}
291doors {
292 name: "R1C3 Panels"
293 type: LOCATION_ONLY
294 panels { room: "Connected Area" name: "PENCIL" }
295 panels { room: "Connected Area" name: "WING" }
296 location_room: "Connected Area"
297 location_name: "PENCIL, WING"
298}
299doors {
300 name: "R1C4 Panels"
301 type: LOCATION_ONLY
302 panels { room: "Connected Area" name: "SKETCH" }
303 panels { room: "Connected Area" name: "PHOTO" }
304 panels { room: "R1C4 Left" name: "WALK" }
305 panels { room: "R1C4 Left" name: "STENCIL" }
306 location_room: "R1C4 Left"
307 location_name: "PHOTO, SKETCH, STENCIL, WALK"
308}
309doors {
310 name: "R2C1 Panels"
311 type: LOCATION_ONLY
312 panels { room: "Connected Area" name: "LAY" }
313 panels { room: "Connected Area" name: "PAST" }
314 panels { room: "R2C1 Left" name: "VERB" }
315 panels { room: "R2C1 Left" name: "FOIL" }
316 location_room: "R2C1 Left"
317 location_name: "FOIL, LAY, PAST, VERB"
318}
319doors {
320 name: "R2C2 Panels"
321 type: LOCATION_ONLY
322 panels { room: "R2C2 Bottom" name: "FOUL" }
323 panels { room: "R2C2 Top" name: "CRUSH" }
324 panels { room: "Connected Area" name: "FIZZLE" }
325 location_room: "R2C2 Top"
326 location_name: "CRUSH, FOUL, FIZZLE"
327}
328doors {
329 name: "R2C3 Panels"
330 type: LOCATION_ONLY
331 panels { room: "Connected Area" name: "PRIMARY" }
332 panels { room: "R2C3 Bottom" name: "FIGMENT" }
333 location_room: "R2C3 Bottom"
334 location_name: "FIGMENT, PRIMARY"
335}
336doors {
337 name: "R2C4 Panels"
338 type: LOCATION_ONLY
339 panels { room: "Connected Area" name: "SHOW" }
340 panels { room: "Connected Area" name: "HAD" }
341 panels { room: "Connected Area" name: "HEAVY" }
342 location_room: "Connected Area"
343 location_name: "HAD, HEAVY, SHOW"
344}
345doors {
346 name: "Near Z1 Panel"
347 type: LOCATION_ONLY
348 panels { room: "Z Room" name: "MAZE" }
349 location_room: "Z Room"
350 location_name: "MAZE"
351}
352doors {
353 name: "Double Letters"
354 type: EVENT
355 receivers: "Panels/Warps/magenta/visibilityListener"
356 double_letters: true
251} 357}
diff --git a/data/maps/the_owl/rooms/Blue Room.txtpb b/data/maps/the_owl/rooms/Blue Room.txtpb index 7c2d69a..a7298cd 100644 --- a/data/maps/the_owl/rooms/Blue Room.txtpb +++ b/data/maps/the_owl/rooms/Blue Room.txtpb
@@ -1,5 +1,4 @@
1name: "Blue Room" 1name: "Blue Room"
2display_name: "Owl"
3panels { 2panels {
4 name: "SKY" 3 name: "SKY"
5 path: "Panels/Colors/owl_7" 4 path: "Panels/Colors/owl_7"
diff --git a/data/maps/the_owl/rooms/Connected Area.txtpb b/data/maps/the_owl/rooms/Connected Area.txtpb index 18388be..b604cba 100644 --- a/data/maps/the_owl/rooms/Connected Area.txtpb +++ b/data/maps/the_owl/rooms/Connected Area.txtpb
@@ -1,5 +1,4 @@
1name: "Connected Area" 1name: "Connected Area"
2display_name: "Owl"
3panels { 2panels {
4 name: "MODE" 3 name: "MODE"
5 path: "Panels/Noncritical/owl_12" 4 path: "Panels/Noncritical/owl_12"
@@ -27,6 +26,7 @@ panels {
27 clue: "color" 26 clue: "color"
28 answer: "magenta" 27 answer: "magenta"
29 symbols: EXAMPLE 28 symbols: EXAMPLE
29 required_door { name: "Double Letters" }
30} 30}
31panels { 31panels {
32 name: "WHITE" 32 name: "WHITE"
@@ -133,6 +133,13 @@ panels {
133 answer: "orange" 133 answer: "orange"
134 symbols: SPARKLES 134 symbols: SPARKLES
135} 135}
136panels {
137 name: "FIZZLE"
138 path: "Panels/Bottom Mid/owl_10"
139 clue: "fizzle"
140 answer: "chisel"
141 symbols: ZERO
142}
136paintings { 143paintings {
137 name: "OWL" 144 name: "OWL"
138 path: "Components/Paintings/owl" 145 path: "Components/Paintings/owl"
@@ -143,7 +150,9 @@ paintings {
143} 150}
144ports { 151ports {
145 name: "FOURROOMS" 152 name: "FOURROOMS"
153 display_name: "Four Rooms Entrance"
146 path: "Components/Warps/worldport2" 154 path: "Components/Warps/worldport2"
147 orientation: "east" 155 destination { x: 71.5 y: 0 z: -9 }
156 rotation: 90
148 # Note that this is behind teal walls. 157 # Note that this is behind teal walls.
149} 158}
diff --git a/data/maps/the_owl/rooms/Magenta Hallway.txtpb b/data/maps/the_owl/rooms/Magenta Hallway.txtpb index 58a4a5d..14d6f0d 100644 --- a/data/maps/the_owl/rooms/Magenta Hallway.txtpb +++ b/data/maps/the_owl/rooms/Magenta Hallway.txtpb
@@ -1,7 +1,8 @@
1name: "Magenta Hallway" 1name: "Magenta Hallway"
2display_name: "Owl"
3ports { 2ports {
4 name: "STURDY" 3 name: "STURDY"
4 display_name: "Magenta Hallway"
5 path: "Components/Warps/worldport3" 5 path: "Components/Warps/worldport3"
6 orientation: "west" 6 destination { x: 17 y: 0 z: -46 }
7 rotation: 270
7} 8}
diff --git a/data/maps/the_owl/rooms/R1C4 Left.txtpb b/data/maps/the_owl/rooms/R1C4 Left.txtpb index 73c1520..3714842 100644 --- a/data/maps/the_owl/rooms/R1C4 Left.txtpb +++ b/data/maps/the_owl/rooms/R1C4 Left.txtpb
@@ -1,5 +1,4 @@
1name: "R1C4 Left" 1name: "R1C4 Left"
2display_name: "Owl"
3panels { 2panels {
4 name: "WALK" 3 name: "WALK"
5 path: "Panels/Noncritical/owl_5" 4 path: "Panels/Noncritical/owl_5"
diff --git a/data/maps/the_owl/rooms/R2C1 Left.txtpb b/data/maps/the_owl/rooms/R2C1 Left.txtpb index 0f9a2b5..72e7331 100644 --- a/data/maps/the_owl/rooms/R2C1 Left.txtpb +++ b/data/maps/the_owl/rooms/R2C1 Left.txtpb
@@ -1,5 +1,4 @@
1name: "R2C1 Left" 1name: "R2C1 Left"
2display_name: "Owl"
3panels { 2panels {
4 name: "VERB" 3 name: "VERB"
5 path: "Panels/Bottom Left/owl_8" 4 path: "Panels/Bottom Left/owl_8"
diff --git a/data/maps/the_owl/rooms/R2C2 Bottom.txtpb b/data/maps/the_owl/rooms/R2C2 Bottom.txtpb index e7eb9e4..2cfd340 100644 --- a/data/maps/the_owl/rooms/R2C2 Bottom.txtpb +++ b/data/maps/the_owl/rooms/R2C2 Bottom.txtpb
@@ -1,5 +1,4 @@
1name: "R2C2 Bottom" 1name: "R2C2 Bottom"
2display_name: "Owl"
3panels { 2panels {
4 name: "FOUL" 3 name: "FOUL"
5 path: "Panels/Bottom Mid/owl_11" 4 path: "Panels/Bottom Mid/owl_11"
@@ -9,7 +8,10 @@ panels {
9} 8}
10ports { 9ports {
11 name: "GALLERY" 10 name: "GALLERY"
11 display_name: "Gallery Worldport"
12 path: "Components/Warps/worldport" 12 path: "Components/Warps/worldport"
13 orientation: "south" 13 destination { x: 0 y: 0 z: 9 }
14 # Note that this port is accessible from the other side in the Z1 room. Hmm. 14 rotation: 0
15 # TODO: Note that this port is accessible from the other side in the Z1
16 # room. Hmm.
15} 17}
diff --git a/data/maps/the_owl/rooms/R2C2 Top.txtpb b/data/maps/the_owl/rooms/R2C2 Top.txtpb index 87b7705..78ce270 100644 --- a/data/maps/the_owl/rooms/R2C2 Top.txtpb +++ b/data/maps/the_owl/rooms/R2C2 Top.txtpb
@@ -1,5 +1,4 @@
1name: "R2C2 Top" 1name: "R2C2 Top"
2display_name: "Owl"
3panels { 2panels {
4 name: "CRUSH" 3 name: "CRUSH"
5 path: "Panels/Bottom Mid/owl_1" 4 path: "Panels/Bottom Mid/owl_1"
diff --git a/data/maps/the_owl/rooms/R2C2.5 Bottom.txtpb b/data/maps/the_owl/rooms/R2C3 Bottom.txtpb index 41b6265..2b49e26 100644 --- a/data/maps/the_owl/rooms/R2C2.5 Bottom.txtpb +++ b/data/maps/the_owl/rooms/R2C3 Bottom.txtpb
@@ -1,12 +1,4 @@
1name: "R2C2.5 Bottom" 1name: "R2C3 Bottom"
2display_name: "Owl"
3panels {
4 name: "FIZZLE"
5 path: "Panels/Bottom Mid/owl_10"
6 clue: "fizzle"
7 answer: "chisel"
8 symbols: ZERO
9}
10panels { 2panels {
11 name: "FIGMENT" 3 name: "FIGMENT"
12 path: "Panels/Noncritical/owl_14" 4 path: "Panels/Noncritical/owl_14"
diff --git a/data/maps/the_owl/rooms/Z Room.txtpb b/data/maps/the_owl/rooms/Z Room.txtpb index 035d0b4..ab28655 100644 --- a/data/maps/the_owl/rooms/Z Room.txtpb +++ b/data/maps/the_owl/rooms/Z Room.txtpb
@@ -1,5 +1,4 @@
1name: "Z Room" 1name: "Z Room"
2display_name: "Owl"
3panels { 2panels {
4 name: "MAZE" 3 name: "MAZE"
5 path: "Panels/Noncritical/owl_10" 4 path: "Panels/Noncritical/owl_10"
diff --git a/data/maps/the_parthenon/connections.txtpb b/data/maps/the_parthenon/connections.txtpb index a07d858..331ac66 100644 --- a/data/maps/the_parthenon/connections.txtpb +++ b/data/maps/the_parthenon/connections.txtpb
@@ -7,6 +7,7 @@ connections {
7 from_room: "Main Area" 7 from_room: "Main Area"
8 to_room: "Ending" 8 to_room: "Ending"
9 door { name: "Ending Door" } 9 door { name: "Ending Door" }
10 cyan_ending: true
10} 11}
11connections { 12connections {
12 from_room: "Main Area" 13 from_room: "Main Area"
diff --git a/data/maps/the_parthenon/doors.txtpb b/data/maps/the_parthenon/doors.txtpb index 82a2748..05d2e63 100644 --- a/data/maps/the_parthenon/doors.txtpb +++ b/data/maps/the_parthenon/doors.txtpb
@@ -1,12 +1,24 @@
1doors { 1doors {
2 name: "Double Letters" 2 name: "Double Letters"
3 type: EVENT 3 type: EVENT
4 switches: "double_letters" 4 receivers: "Components/Doors/entry_11"
5 receivers: "Components/Doors/entry_5"
6 receivers: "Components/Doors/entry_6"
7 receivers: "Components/Doors/entry_7"
8 receivers: "Components/Doors/entry_8"
9 receivers: "Components/Doors/entry_9"
10 receivers: "Components/Doors/entry_10"
11 double_letters: true
5} 12}
6doors { 13doors {
7 name: "Lavender Cubes" 14 name: "Lavender Cubes"
8 type: EVENT 15 type: EVENT
9 switches: "lavender_cubes" 16 receivers: "Components/Doors/entry_3"
17 panels {
18 map: "the_ancient"
19 room: "Inside"
20 name: "COLOR"
21 }
10} 22}
11doors { 23doors {
12 name: "K2 Door" 24 name: "K2 Door"
@@ -19,6 +31,7 @@ doors {
19 panels { room: "Main Area" name: "ALEXANDER" answer: "greece" } 31 panels { room: "Main Area" name: "ALEXANDER" answer: "greece" }
20 panels { room: "Main Area" name: "CAESAR" answer: "rome" } 32 panels { room: "Main Area" name: "CAESAR" answer: "rome" }
21 location_room: "Main Area" 33 location_room: "Main Area"
34 location_name: "Empires"
22} 35}
23doors { 36doors {
24 name: "Ending Door" 37 name: "Ending Door"
@@ -30,3 +43,12 @@ doors {
30 panels { room: "Main Area" name: "ALEXANDER" answer: "alexander" } 43 panels { room: "Main Area" name: "ALEXANDER" answer: "alexander" }
31 panels { room: "Main Area" name: "CAESAR" answer: "caesar" } 44 panels { room: "Main Area" name: "CAESAR" answer: "caesar" }
32} 45}
46doors {
47 name: "Lavender Area Puzzles"
48 type: LOCATION_ONLY
49 panels { room: "Lavender Area" name: "ME" }
50 panels { room: "Lavender Area" name: "SHEEP" }
51 panels { room: "Lavender Area" name: "WOOD" }
52 location_room: "Lavender Area"
53 location_name: "ME, SHEEP, WOOD"
54}
diff --git a/data/maps/the_parthenon/rooms/Ending.txtpb b/data/maps/the_parthenon/rooms/Ending.txtpb index 8fa805f..789e906 100644 --- a/data/maps/the_parthenon/rooms/Ending.txtpb +++ b/data/maps/the_parthenon/rooms/Ending.txtpb
@@ -1,5 +1,4 @@
1name: "Ending" 1name: "Ending"
2display_name: "Parthenon"
3endings { 2endings {
4 name: "CYAN" 3 name: "CYAN"
5 path: "Components/cyan_end" 4 path: "Components/cyan_end"
diff --git a/data/maps/the_parthenon/rooms/K2 Room.txtpb b/data/maps/the_parthenon/rooms/K2 Room.txtpb index 1c95ad5..596b489 100644 --- a/data/maps/the_parthenon/rooms/K2 Room.txtpb +++ b/data/maps/the_parthenon/rooms/K2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "K2 Room" 1name: "K2 Room"
2display_name: "Parthenon"
3letters { 2letters {
4 key: "k" 3 key: "k"
5 level2: true 4 level2: true
diff --git a/data/maps/the_parthenon/rooms/Lavender Area.txtpb b/data/maps/the_parthenon/rooms/Lavender Area.txtpb index 6f67214..9e62498 100644 --- a/data/maps/the_parthenon/rooms/Lavender Area.txtpb +++ b/data/maps/the_parthenon/rooms/Lavender Area.txtpb
@@ -1,5 +1,4 @@
1name: "Lavender Area" 1name: "Lavender Area"
2display_name: "Parthenon"
3panels { 2panels {
4 name: "ME" 3 name: "ME"
5 path: "Panels/Lavender/panel_7" 4 path: "Panels/Lavender/panel_7"
diff --git a/data/maps/the_parthenon/rooms/Main Area.txtpb b/data/maps/the_parthenon/rooms/Main Area.txtpb index db62c2c..2d989f8 100644 --- a/data/maps/the_parthenon/rooms/Main Area.txtpb +++ b/data/maps/the_parthenon/rooms/Main Area.txtpb
@@ -1,12 +1,11 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Parthenon"
3panels { 2panels {
4 name: "XERXES" 3 name: "XERXES"
5 path: "Panels/Main/panel_1" 4 path: "Panels/Main/panel_1"
6 clue: "xerxes" 5 clue: "xerxes"
7 answer: "xerxes" 6 answer: "xerxes"
8 proxies { answer: "persia" path: "Panels/Empires/panel_7" } 7 proxies { answer: "persia" path: "Panels/Empires/panel_7" }
9 #proxies { answer: "xerxes" path: "Panels/Rulers/panel_13" } 8 proxies { answer: "xerxes" path: "Panels/Rulers/panel_13" }
10 required_door { name: "Double Letters" } 9 required_door { name: "Double Letters" }
11} 10}
12panels { 11panels {
@@ -15,7 +14,7 @@ panels {
15 clue: "arthur" 14 clue: "arthur"
16 answer: "arthur" 15 answer: "arthur"
17 proxies { answer: "england" path: "Panels/Empires/panel_8" } 16 proxies { answer: "england" path: "Panels/Empires/panel_8" }
18 #proxies { answer: "arthur" path: "Panels/Rulers/panel_14" } 17 proxies { answer: "arthur" path: "Panels/Rulers/panel_14" }
19 required_door { name: "Double Letters" } 18 required_door { name: "Double Letters" }
20} 19}
21panels { 20panels {
@@ -24,7 +23,7 @@ panels {
24 clue: "cleopatra" 23 clue: "cleopatra"
25 answer: "cleopatra" 24 answer: "cleopatra"
26 proxies { answer: "egypt" path: "Panels/Empires/panel_9" } 25 proxies { answer: "egypt" path: "Panels/Empires/panel_9" }
27 #proxies { answer: "cleopatra" path: "Panels/Rulers/panel_15" } 26 proxies { answer: "cleopatra" path: "Panels/Rulers/panel_15" }
28 required_door { name: "Double Letters" } 27 required_door { name: "Double Letters" }
29} 28}
30panels { 29panels {
@@ -33,7 +32,7 @@ panels {
33 clue: "napoleon" 32 clue: "napoleon"
34 answer: "napoleon" 33 answer: "napoleon"
35 proxies { answer: "france" path: "Panels/Empires/panel_10" } 34 proxies { answer: "france" path: "Panels/Empires/panel_10" }
36 #proxies { answer: "napoleon" path: "Panels/Rulers/panel_16" } 35 proxies { answer: "napoleon" path: "Panels/Rulers/panel_16" }
37 required_door { name: "Double Letters" } 36 required_door { name: "Double Letters" }
38} 37}
39panels { 38panels {
@@ -42,7 +41,7 @@ panels {
42 clue: "alexander" 41 clue: "alexander"
43 answer: "alexander" 42 answer: "alexander"
44 proxies { answer: "greece" path: "Panels/Empires/panel_11" } 43 proxies { answer: "greece" path: "Panels/Empires/panel_11" }
45 #proxies { answer: "alexander" path: "Panels/Rulers/panel_17" } 44 proxies { answer: "alexander" path: "Panels/Rulers/panel_17" }
46 required_door { name: "Double Letters" } 45 required_door { name: "Double Letters" }
47} 46}
48panels { 47panels {
@@ -51,21 +50,27 @@ panels {
51 clue: "caesar" 50 clue: "caesar"
52 answer: "caesar" 51 answer: "caesar"
53 proxies { answer: "rome" path: "Panels/Empires/panel_12" } 52 proxies { answer: "rome" path: "Panels/Empires/panel_12" }
54 #proxies { answer: "caesar" path: "Panels/Rulers/panel_18" } 53 proxies { answer: "caesar" path: "Panels/Rulers/panel_18" }
55 required_door { name: "Double Letters" } 54 required_door { name: "Double Letters" }
56} 55}
57ports { 56ports {
58 name: "GALLERY" 57 name: "GALLERY"
58 display_name: "Columns Worldport"
59 path: "Components/Warps/worldport" 59 path: "Components/Warps/worldport"
60 orientation: "south" 60 destination { x: 0 y: 0 z: 0 }
61 rotation: 0
61} 62}
62ports { 63ports {
63 name: "ENTRY" 64 name: "ENTRY"
65 display_name: "Building Worldport"
64 path: "Components/Warps/worldport2" 66 path: "Components/Warps/worldport2"
65 orientation: "south" 67 destination { x: 0 y: 0 z: -21 }
68 rotation: 0
66} 69}
67ports { 70ports {
68 name: "REVITALIZED" 71 name: "REVITALIZED"
72 display_name: "Plum Hallway"
69 path: "Components/Warps/worldport3" 73 path: "Components/Warps/worldport3"
70 orientation: "north" 74 destination { x: -24 y: 0 z: -39 }
75 rotation: 180
71} 76}
diff --git a/data/maps/the_parthenon/rooms/U Keyholder.txtpb b/data/maps/the_parthenon/rooms/U Keyholder.txtpb index d3107b4..0a5c31b 100644 --- a/data/maps/the_parthenon/rooms/U Keyholder.txtpb +++ b/data/maps/the_parthenon/rooms/U Keyholder.txtpb
@@ -1,6 +1,6 @@
1name: "U Keyholder" 1name: "U Keyholder"
2display_name: "Parthenon"
3keyholders { 2keyholders {
4 name: "U" 3 name: "U"
5 path: "Components/KeyHolders/keyHolderU" 4 path: "Components/KeyHolders/keyHolderU"
5 key: "u"
6} 6}
diff --git a/data/maps/the_partial/connections.txtpb b/data/maps/the_partial/connections.txtpb index 34ff94f..abadb06 100644 --- a/data/maps/the_partial/connections.txtpb +++ b/data/maps/the_partial/connections.txtpb
@@ -17,13 +17,11 @@ connections {
17 from_room: "Obverse Side" 17 from_room: "Obverse Side"
18 to_room: "Control Center Entrance" 18 to_room: "Control Center Entrance"
19 door { name: "L Entered" } 19 door { name: "L Entered" }
20 oneway: true
21} 20}
22connections { 21connections {
23 from_room: "Control Center Entrance" 22 from_room: "Control Center Entrance"
24 to_room: "Obverse Side" 23 to_room: "Obverse Side"
25 door { name: "Control Center Entrance" } 24 door { name: "Control Center Entrance" }
26 oneway: true
27} 25}
28connections { 26connections {
29 from_room: "Reverse Side" 27 from_room: "Reverse Side"
diff --git a/data/maps/the_partial/doors.txtpb b/data/maps/the_partial/doors.txtpb index fed6951..e37d077 100644 --- a/data/maps/the_partial/doors.txtpb +++ b/data/maps/the_partial/doors.txtpb
@@ -22,6 +22,7 @@ doors {
22 panels { room: "Obverse Side" name: "CUT" } 22 panels { room: "Obverse Side" name: "CUT" }
23 panels { room: "Obverse Side" name: "FUN" } 23 panels { room: "Obverse Side" name: "FUN" }
24 location_room: "Obverse Side" 24 location_room: "Obverse Side"
25 location_name: "Obverse Side Room"
25} 26}
26doors { 27doors {
27 name: "Giant P" 28 name: "Giant P"
@@ -42,15 +43,15 @@ doors {
42doors { 43doors {
43 name: "L Entered" 44 name: "L Entered"
44 type: EVENT 45 type: EVENT
45 # It does this in vanilla, but I'm specifying it so that the Control Center 46 latch: true
46 # Entrance door doesn't override it.
47 receivers: "Components/Doors/controlDoor" 47 receivers: "Components/Doors/controlDoor"
48 keyholders { room: "Obverse Side" name: "L" key: "l" } 48 keyholders { room: "Obverse Side" name: "L" key: "l" }
49} 49}
50doors { 50doors {
51 name: "Control Center Entrance" 51 name: "Control Center Entrance"
52 type: STANDARD 52 type: EVENT
53 receivers: "Components/Doors/controlDoor" 53 legacy_location: true
54 #receivers: "Components/Doors/controlDoor"
54 panels { room: "Control Center Entrance" name: "RETURN" } 55 panels { room: "Control Center Entrance" name: "RETURN" }
55 location_room: "Control Center Entrance" 56 location_room: "Control Center Entrance"
56} 57}
diff --git a/data/maps/the_partial/rooms/Control Center Entrance.txtpb b/data/maps/the_partial/rooms/Control Center Entrance.txtpb index 8d7e228..faccd50 100644 --- a/data/maps/the_partial/rooms/Control Center Entrance.txtpb +++ b/data/maps/the_partial/rooms/Control Center Entrance.txtpb
@@ -1,5 +1,4 @@
1name: "Control Center Entrance" 1name: "Control Center Entrance"
2display_name: "Partial"
3panels { 2panels {
4 name: "RETURN" 3 name: "RETURN"
5 path: "Panels/Control/panel_10" 4 path: "Panels/Control/panel_10"
@@ -9,6 +8,8 @@ panels {
9} 8}
10ports { 9ports {
11 name: "CC" 10 name: "CC"
11 display_name: "Control Center Connector"
12 path: "Components/Warps/worldport2" 12 path: "Components/Warps/worldport2"
13 orientation: "north" 13 destination { x: -19 y: 0 z: 8 }
14 rotation: 180
14} 15}
diff --git a/data/maps/the_partial/rooms/F Room.txtpb b/data/maps/the_partial/rooms/F Room.txtpb index 358c936..d41d039 100644 --- a/data/maps/the_partial/rooms/F Room.txtpb +++ b/data/maps/the_partial/rooms/F Room.txtpb
@@ -1,5 +1,4 @@
1name: "F Room" 1name: "F Room"
2display_name: "Partial"
3letters { 2letters {
4 key: "f" 3 key: "f"
5 path: "Components/Collectables/collectable2" 4 path: "Components/Collectables/collectable2"
diff --git a/data/maps/the_partial/rooms/Obverse Side.txtpb b/data/maps/the_partial/rooms/Obverse Side.txtpb index 0d83c34..462888c 100644 --- a/data/maps/the_partial/rooms/Obverse Side.txtpb +++ b/data/maps/the_partial/rooms/Obverse Side.txtpb
@@ -1,5 +1,4 @@
1name: "Obverse Side" 1name: "Obverse Side"
2display_name: "Partial"
3panels { 2panels {
4 name: "PUN" 3 name: "PUN"
5 path: "Panels/Main/panel_1" 4 path: "Panels/Main/panel_1"
@@ -100,13 +99,16 @@ panels {
100} 99}
101ports { 100ports {
102 name: "GREAT" 101 name: "GREAT"
102 display_name: "Main Entrance"
103 path: "Components/Warps/worldport" 103 path: "Components/Warps/worldport"
104 orientation: "west" 104 destination { x: -3 y: 0 z: 20 }
105 rotation: 270
105} 106}
106keyholders { 107keyholders {
107 # This is one of the ones that's misnamed within the game. 108 # This is one of the ones that's misnamed within the game.
108 name: "L" 109 name: "L"
109 path: "Components/KeyHolders/keyHolderI" 110 path: "Components/KeyHolders/keyHolderI"
111 key: "l"
110} 112}
111paintings { 113paintings {
112 name: "F" 114 name: "F"
diff --git a/data/maps/the_partial/rooms/P Room.txtpb b/data/maps/the_partial/rooms/P Room.txtpb index e7a7a60..618ebd9 100644 --- a/data/maps/the_partial/rooms/P Room.txtpb +++ b/data/maps/the_partial/rooms/P Room.txtpb
@@ -1,5 +1,4 @@
1name: "P Room" 1name: "P Room"
2display_name: "Partial"
3letters { 2letters {
4 key: "p" 3 key: "p"
5 path: "Components/Collectables/collectable" 4 path: "Components/Collectables/collectable"
diff --git a/data/maps/the_partial/rooms/Reverse Side.txtpb b/data/maps/the_partial/rooms/Reverse Side.txtpb index a286737..01858d6 100644 --- a/data/maps/the_partial/rooms/Reverse Side.txtpb +++ b/data/maps/the_partial/rooms/Reverse Side.txtpb
@@ -1,5 +1,4 @@
1name: "Reverse Side" 1name: "Reverse Side"
2display_name: "Partial"
3panels { 2panels {
4 name: "BRO" 3 name: "BRO"
5 path: "Panels/Side 2/panel_2" 4 path: "Panels/Side 2/panel_2"
diff --git a/data/maps/the_perceptive/metadata.txtpb b/data/maps/the_perceptive/metadata.txtpb index e0c64fb..6942cab 100644 --- a/data/maps/the_perceptive/metadata.txtpb +++ b/data/maps/the_perceptive/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Perceptive" 1display_name: "The Perceptive"
2worldport_entrance {
3 room: "Main Area"
4 name: "CC"
5}
diff --git a/data/maps/the_perceptive/rooms/Main Area.txtpb b/data/maps/the_perceptive/rooms/Main Area.txtpb index 75a0343..ebf511d 100644 --- a/data/maps/the_perceptive/rooms/Main Area.txtpb +++ b/data/maps/the_perceptive/rooms/Main Area.txtpb
@@ -1,7 +1,8 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Perceptive"
3ports { 2ports {
4 name: "CC" 3 name: "CC"
4 display_name: "Entrance"
5 path: "Components/Warps/worldport" 5 path: "Components/Warps/worldport"
6 orientation: "east" 6 destination { x: 3 y: 0 z: 13 }
7 rotation: 90
7} 8}
diff --git a/data/maps/the_plaza/connections.txtpb b/data/maps/the_plaza/connections.txtpb index 44586be..6da201c 100644 --- a/data/maps/the_plaza/connections.txtpb +++ b/data/maps/the_plaza/connections.txtpb
@@ -21,22 +21,22 @@ connections {
21connections { 21connections {
22 from_room: "Center Room" 22 from_room: "Center Room"
23 to_room: "Top Left Room" 23 to_room: "Top Left Room"
24 door { name: "Top Left Door" } 24 door { name: "Northwest Door" }
25} 25}
26connections { 26connections {
27 from_room: "Center Room" 27 from_room: "Center Room"
28 to_room: "Top Right Room" 28 to_room: "Top Right Room"
29 door { name: "Top Right Door" } 29 door { name: "Northeast Door" }
30} 30}
31connections { 31connections {
32 from_room: "Center Room" 32 from_room: "Center Room"
33 to_room: "Bottom Left Room" 33 to_room: "Bottom Left Room"
34 door { name: "Bottom Left Door" } 34 door { name: "Southwest Door" }
35} 35}
36connections { 36connections {
37 from_room: "Center Room" 37 from_room: "Center Room"
38 to_room: "Bottom Right Room" 38 to_room: "Bottom Right Room"
39 door { name: "Bottom Right Door" } 39 door { name: "Southeast Door" }
40} 40}
41connections { 41connections {
42 from_room: "Center Room" 42 from_room: "Center Room"
diff --git a/data/maps/the_plaza/doors.txtpb b/data/maps/the_plaza/doors.txtpb index be491ed..fef8954 100644 --- a/data/maps/the_plaza/doors.txtpb +++ b/data/maps/the_plaza/doors.txtpb
@@ -31,7 +31,7 @@ doors {
31 location_room: "Main Area" 31 location_room: "Main Area"
32} 32}
33doors { 33doors {
34 name: "Top Left Door" 34 name: "Northwest Door"
35 type: STANDARD 35 type: STANDARD
36 receivers: "Components/Doors/entry_6" 36 receivers: "Components/Doors/entry_6"
37 panels { room: "Center Room" name: "REPORTER" } 37 panels { room: "Center Room" name: "REPORTER" }
@@ -41,9 +41,10 @@ doors {
41 panels { room: "Center Room" name: "DENTIST" } 41 panels { room: "Center Room" name: "DENTIST" }
42 panels { room: "Center Room" name: "SQUIRREL" } 42 panels { room: "Center Room" name: "SQUIRREL" }
43 location_room: "Center Room" 43 location_room: "Center Room"
44 location_name: "First Room"
44} 45}
45doors { 46doors {
46 name: "Top Right Door" 47 name: "Northeast Door"
47 type: ITEM_ONLY 48 type: ITEM_ONLY
48 receivers: "Components/Doors/entry_7" 49 receivers: "Components/Doors/entry_7"
49 panels { room: "Center Room" name: "REPORTER" } 50 panels { room: "Center Room" name: "REPORTER" }
@@ -54,7 +55,7 @@ doors {
54 panels { room: "Center Room" name: "SQUIRREL" } 55 panels { room: "Center Room" name: "SQUIRREL" }
55} 56}
56doors { 57doors {
57 name: "Bottom Left Door" 58 name: "Southwest Door"
58 type: ITEM_ONLY 59 type: ITEM_ONLY
59 receivers: "Components/Doors/entry_5" 60 receivers: "Components/Doors/entry_5"
60 panels { room: "Center Room" name: "REPORTER" } 61 panels { room: "Center Room" name: "REPORTER" }
@@ -65,7 +66,7 @@ doors {
65 panels { room: "Center Room" name: "SQUIRREL" } 66 panels { room: "Center Room" name: "SQUIRREL" }
66} 67}
67doors { 68doors {
68 name: "Bottom Right Door" 69 name: "Southeast Door"
69 type: ITEM_ONLY 70 type: ITEM_ONLY
70 receivers: "Components/Doors/entry_4" 71 receivers: "Components/Doors/entry_4"
71 panels { room: "Center Room" name: "REPORTER" } 72 panels { room: "Center Room" name: "REPORTER" }
@@ -76,7 +77,7 @@ doors {
76 panels { room: "Center Room" name: "SQUIRREL" } 77 panels { room: "Center Room" name: "SQUIRREL" }
77} 78}
78doors { 79doors {
79 name: "Top Left Puzzles" 80 name: "Northwest Puzzles"
80 type: LOCATION_ONLY 81 type: LOCATION_ONLY
81 panels { room: "Top Left Room" name: "BARE SOD" } 82 panels { room: "Top Left Room" name: "BARE SOD" }
82 panels { room: "Top Left Room" name: "SOD" } 83 panels { room: "Top Left Room" name: "SOD" }
@@ -103,7 +104,7 @@ doors {
103 location_room: "Top Left Room" 104 location_room: "Top Left Room"
104} 105}
105doors { 106doors {
106 name: "Top Right Puzzles" 107 name: "Northeast Puzzles"
107 type: LOCATION_ONLY 108 type: LOCATION_ONLY
108 panels { room: "Top Right Room" name: "RIGHT WING" } 109 panels { room: "Top Right Room" name: "RIGHT WING" }
109 panels { room: "Top Right Room" name: "WING" } 110 panels { room: "Top Right Room" name: "WING" }
@@ -129,7 +130,7 @@ doors {
129 location_room: "Top Right Room" 130 location_room: "Top Right Room"
130} 131}
131doors { 132doors {
132 name: "Bottom Left Puzzles" 133 name: "Southwest Puzzles"
133 type: LOCATION_ONLY 134 type: LOCATION_ONLY
134 panels { room: "Bottom Left Room" name: "SHELL (1)" } 135 panels { room: "Bottom Left Room" name: "SHELL (1)" }
135 panels { room: "Bottom Left Room" name: "SHELL (2)" } 136 panels { room: "Bottom Left Room" name: "SHELL (2)" }
@@ -140,7 +141,7 @@ doors {
140 location_room: "Bottom Left Room" 141 location_room: "Bottom Left Room"
141} 142}
142doors { 143doors {
143 name: "Bottom Right Puzzles" 144 name: "Southeast Puzzles"
144 type: LOCATION_ONLY 145 type: LOCATION_ONLY
145 panels { room: "Bottom Right Room" name: "FLY" } 146 panels { room: "Bottom Right Room" name: "FLY" }
146 panels { room: "Bottom Right Room" name: "DECLOG" } 147 panels { room: "Bottom Right Room" name: "DECLOG" }
@@ -209,3 +210,31 @@ doors {
209 panels { room: "Bottom Right Room" name: "HONEY" } 210 panels { room: "Bottom Right Room" name: "HONEY" }
210 panels { room: "Bottom Right Room" name: "INJECT" } 211 panels { room: "Bottom Right Room" name: "INJECT" }
211} 212}
213doors {
214 name: "Near Sirenic Panel"
215 type: LOCATION_ONLY
216 panels { room: "Sirenic Entrance" name: "SIREN" }
217 location_room: "Sirenic Entrance"
218 location_name: "SIREN"
219}
220doors {
221 name: "Near Symbolic Panel"
222 type: LOCATION_ONLY
223 panels { room: "Symbolic Entrance" name: "FIGURATIVE" }
224 location_room: "Symbolic Entrance"
225 location_name: "FIGURATIVE"
226}
227doors {
228 name: "Near Repetitive Panel"
229 type: LOCATION_ONLY
230 panels { room: "Repetitive Entrance" name: "TEDIOUS" }
231 location_room: "Repetitive Entrance"
232 location_name: "TEDIOUS"
233}
234doors {
235 name: "Near Broken Portal Panel"
236 type: LOCATION_ONLY
237 panels { room: "Main Area" name: "AFFABLE" }
238 location_room: "Main Area"
239 location_name: "AFFABLE"
240}
diff --git a/data/maps/the_plaza/rooms/Bottom Left Room.txtpb b/data/maps/the_plaza/rooms/Bottom Left Room.txtpb index 833ccce..138efc6 100644 --- a/data/maps/the_plaza/rooms/Bottom Left Room.txtpb +++ b/data/maps/the_plaza/rooms/Bottom Left Room.txtpb
@@ -1,5 +1,4 @@
1name: "Bottom Left Room" 1name: "Bottom Left Room"
2display_name: "Plaza"
3panels { 2panels {
4 name: "SHELL (1)" 3 name: "SHELL (1)"
5 path: "Panels/Room 4/panel_1" 4 path: "Panels/Room 4/panel_1"
diff --git a/data/maps/the_plaza/rooms/Bottom Right Room.txtpb b/data/maps/the_plaza/rooms/Bottom Right Room.txtpb index cc38e23..fcd8d37 100644 --- a/data/maps/the_plaza/rooms/Bottom Right Room.txtpb +++ b/data/maps/the_plaza/rooms/Bottom Right Room.txtpb
@@ -1,5 +1,4 @@
1name: "Bottom Right Room" 1name: "Bottom Right Room"
2display_name: "Plaza"
3panels { 2panels {
4 name: "FLY" 3 name: "FLY"
5 path: "Panels/Room 3/panel_1" 4 path: "Panels/Room 3/panel_1"
diff --git a/data/maps/the_plaza/rooms/Center Room.txtpb b/data/maps/the_plaza/rooms/Center Room.txtpb index 4f1c62a..dea2d06 100644 --- a/data/maps/the_plaza/rooms/Center Room.txtpb +++ b/data/maps/the_plaza/rooms/Center Room.txtpb
@@ -1,5 +1,4 @@
1name: "Center Room" 1name: "Center Room"
2display_name: "Plaza"
3panels { 2panels {
4 name: "REPORTER" 3 name: "REPORTER"
5 path: "Panels/Room 2/panel_1" 4 path: "Panels/Room 2/panel_1"
diff --git a/data/maps/the_plaza/rooms/Main Area.txtpb b/data/maps/the_plaza/rooms/Main Area.txtpb index cabfc94..c2fca13 100644 --- a/data/maps/the_plaza/rooms/Main Area.txtpb +++ b/data/maps/the_plaza/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Plaza"
3panels { 2panels {
4 name: "COURTYARD" 3 name: "COURTYARD"
5 path: "Panels/Entrances/panel_1" 4 path: "Panels/Entrances/panel_1"
@@ -37,16 +36,22 @@ panels {
37} 36}
38ports { 37ports {
39 name: "UNYIELDING" 38 name: "UNYIELDING"
39 display_name: "Unyielding Hallway"
40 path: "Components/Warps/worldport" 40 path: "Components/Warps/worldport"
41 orientation: "west" 41 destination { x: 1 y: 0 z: 10 }
42 rotation: 270
42} 43}
43ports { 44ports {
44 name: "IMPRESSIVE" 45 name: "IMPRESSIVE"
46 display_name: "Impressive Hallway"
45 path: "Components/Warps/worldport2" 47 path: "Components/Warps/worldport2"
46 orientation: "west" 48 destination { x: 11 y: 0 z: 10 }
49 rotation: 270
47} 50}
48ports { 51ports {
49 name: "BETWEEN" 52 name: "BETWEEN"
53 display_name: "Between Hallway"
50 path: "Components/Warps/worldport3" 54 path: "Components/Warps/worldport3"
51 orientation: "west" 55 destination { x: -9 y: 0 z: 10 }
56 rotation: 270
52} 57}
diff --git a/data/maps/the_plaza/rooms/Mastery.txtpb b/data/maps/the_plaza/rooms/Mastery.txtpb index 6b8fd5b..749837e 100644 --- a/data/maps/the_plaza/rooms/Mastery.txtpb +++ b/data/maps/the_plaza/rooms/Mastery.txtpb
@@ -1,5 +1,4 @@
1name: "Mastery" 1name: "Mastery"
2display_name: "Plaza"
3masteries { 2masteries {
4 name: "MASTERY" 3 name: "MASTERY"
5 path: "Components/Collectables/smiley" 4 path: "Components/Collectables/smiley"
diff --git a/data/maps/the_plaza/rooms/Repetitive Entrance.txtpb b/data/maps/the_plaza/rooms/Repetitive Entrance.txtpb index 1690c11..59faaa8 100644 --- a/data/maps/the_plaza/rooms/Repetitive Entrance.txtpb +++ b/data/maps/the_plaza/rooms/Repetitive Entrance.txtpb
@@ -1,5 +1,4 @@
1name: "Repetitive Entrance" 1name: "Repetitive Entrance"
2display_name: "Plaza"
3panels { 2panels {
4 name: "TEDIOUS" 3 name: "TEDIOUS"
5 path: "Panels/Entrances/panel_6" 4 path: "Panels/Entrances/panel_6"
@@ -9,6 +8,8 @@ panels {
9} 8}
10ports { 9ports {
11 name: "REPETITIVE" 10 name: "REPETITIVE"
11 display_name: "Repetitive Entrance"
12 path: "Components/Warps/worldport5" 12 path: "Components/Warps/worldport5"
13 orientation: "north" 13 destination { x: -19 y: 0 z: 16 }
14 rotation: 180
14} 15}
diff --git a/data/maps/the_plaza/rooms/Sirenic Entrance.txtpb b/data/maps/the_plaza/rooms/Sirenic Entrance.txtpb index 048359d..524de2b 100644 --- a/data/maps/the_plaza/rooms/Sirenic Entrance.txtpb +++ b/data/maps/the_plaza/rooms/Sirenic Entrance.txtpb
@@ -1,5 +1,4 @@
1name: "Sirenic Entrance" 1name: "Sirenic Entrance"
2display_name: "Plaza"
3panels { 2panels {
4 name: "SIREN" 3 name: "SIREN"
5 path: "Panels/Entrances/panel_8" 4 path: "Panels/Entrances/panel_8"
@@ -9,6 +8,8 @@ panels {
9} 8}
10ports { 9ports {
11 name: "SIRENIC" 10 name: "SIRENIC"
11 display_name: "Sirenic Entrance"
12 path: "Components/Warps/worldport6" 12 path: "Components/Warps/worldport6"
13 orientation: "west" 13 destination { x: -51 y: 0 z: -43 }
14 rotation: 270
14} 15}
diff --git a/data/maps/the_plaza/rooms/Symbolic Entrance.txtpb b/data/maps/the_plaza/rooms/Symbolic Entrance.txtpb index 36b6a9b..e2719b8 100644 --- a/data/maps/the_plaza/rooms/Symbolic Entrance.txtpb +++ b/data/maps/the_plaza/rooms/Symbolic Entrance.txtpb
@@ -1,5 +1,4 @@
1name: "Symbolic Entrance" 1name: "Symbolic Entrance"
2display_name: "Plaza"
3panels { 2panels {
4 name: "FIGURATIVE" 3 name: "FIGURATIVE"
5 path: "Panels/Entrances/panel_5" 4 path: "Panels/Entrances/panel_5"
@@ -9,6 +8,8 @@ panels {
9} 8}
10ports { 9ports {
11 name: "SYMBOLIC" 10 name: "SYMBOLIC"
11 display_name: "Symbolic Entrance"
12 path: "Components/Warps/worldport4" 12 path: "Components/Warps/worldport4"
13 orientation: "south" 13 destination { x: 28 y: 0 z: 4 }
14 rotation: 0
14} 15}
diff --git a/data/maps/the_plaza/rooms/Top Left Room.txtpb b/data/maps/the_plaza/rooms/Top Left Room.txtpb index 4f562e0..d5b7056 100644 --- a/data/maps/the_plaza/rooms/Top Left Room.txtpb +++ b/data/maps/the_plaza/rooms/Top Left Room.txtpb
@@ -1,5 +1,4 @@
1name: "Top Left Room" 1name: "Top Left Room"
2display_name: "Plaza"
3panels { 2panels {
4 name: "BARE SOD" 3 name: "BARE SOD"
5 path: "Panels/Room 6/panel_1" 4 path: "Panels/Room 6/panel_1"
@@ -42,6 +41,7 @@ panels {
42 clue: "knot" 41 clue: "knot"
43 answer: "not" 42 answer: "not"
44 symbols: ZERO 43 symbols: ZERO
44 display_name: "KNOT (TL)"
45} 45}
46panels { 46panels {
47 name: "SURE TEMPER" 47 name: "SURE TEMPER"
@@ -129,6 +129,7 @@ panels {
129 clue: "bear" 129 clue: "bear"
130 answer: "bearer" 130 answer: "bearer"
131 symbols: SPARKLES 131 symbols: SPARKLES
132 display_name: "BEAR (TL)"
132} 133}
133panels { 134panels {
134 name: "CHILL" 135 name: "CHILL"
diff --git a/data/maps/the_plaza/rooms/Top Right Room.txtpb b/data/maps/the_plaza/rooms/Top Right Room.txtpb index 2a169af..7e91cbe 100644 --- a/data/maps/the_plaza/rooms/Top Right Room.txtpb +++ b/data/maps/the_plaza/rooms/Top Right Room.txtpb
@@ -1,5 +1,4 @@
1name: "Top Right Room" 1name: "Top Right Room"
2display_name: "Plaza"
3panels { 2panels {
4 name: "RIGHT WING" 3 name: "RIGHT WING"
5 path: "Panels/Room 5/panel_1" 4 path: "Panels/Room 5/panel_1"
@@ -34,6 +33,7 @@ panels {
34 clue: "bear" 33 clue: "bear"
35 answer: "cave" 34 answer: "cave"
36 symbols: STARS 35 symbols: STARS
36 display_name: "BEAR (TR)"
37} 37}
38panels { 38panels {
39 name: "TYPIST" 39 name: "TYPIST"
@@ -125,6 +125,7 @@ panels {
125 clue: "knot" 125 clue: "knot"
126 answer: "not" 126 answer: "not"
127 symbols: ZERO 127 symbols: ZERO
128 display_name: "KNOT (TR)"
128} 129}
129panels { 130panels {
130 name: "HALVES ANNOYED SOUR GOOD" 131 name: "HALVES ANNOYED SOUR GOOD"
diff --git a/data/maps/the_quiet/metadata.txtpb b/data/maps/the_quiet/metadata.txtpb index 1fa2c46..d7fd0eb 100644 --- a/data/maps/the_quiet/metadata.txtpb +++ b/data/maps/the_quiet/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Quiet" 1display_name: "The Quiet"
2worldport_entrance {
3 room: "Main Area"
4 name: "DAEDALUS"
5}
diff --git a/data/maps/the_quiet/rooms/Keyholder Room.txtpb b/data/maps/the_quiet/rooms/Keyholder Room.txtpb index e2322a8..d3cab73 100644 --- a/data/maps/the_quiet/rooms/Keyholder Room.txtpb +++ b/data/maps/the_quiet/rooms/Keyholder Room.txtpb
@@ -1,6 +1,6 @@
1name: "Keyholder Room" 1name: "Keyholder Room"
2display_name: "Quiet"
3keyholders { 2keyholders {
4 name: "Q" 3 name: "Q"
5 path: "Components/KeyHolders/keyHolderQ" 4 path: "Components/KeyHolders/keyHolderQ"
5 key: "q"
6} 6}
diff --git a/data/maps/the_quiet/rooms/Main Area.txtpb b/data/maps/the_quiet/rooms/Main Area.txtpb index d9c2361..72c0a1e 100644 --- a/data/maps/the_quiet/rooms/Main Area.txtpb +++ b/data/maps/the_quiet/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Quiet"
3panels { 2panels {
4 name: "SOLID" 3 name: "SOLID"
5 path: "Panels/Main/panel_1" 4 path: "Panels/Main/panel_1"
@@ -98,6 +97,8 @@ panels {
98} 97}
99ports { 98ports {
100 name: "DAEDALUS" 99 name: "DAEDALUS"
100 display_name: "Entrance"
101 path: "Components/Warps/worldport" 101 path: "Components/Warps/worldport"
102 orientation: "east" 102 destination { x: 3 y: 0 z: 8 }
103 rotation: 90
103} 104}
diff --git a/data/maps/the_quiet/rooms/Q Room.txtpb b/data/maps/the_quiet/rooms/Q Room.txtpb index 224e71b..368f366 100644 --- a/data/maps/the_quiet/rooms/Q Room.txtpb +++ b/data/maps/the_quiet/rooms/Q Room.txtpb
@@ -1,5 +1,4 @@
1name: "Q Room" 1name: "Q Room"
2display_name: "Quiet"
3letters { 2letters {
4 key: "q" 3 key: "q"
5 path: "Components/Collectables/q" 4 path: "Components/Collectables/q"
diff --git a/data/maps/the_relentless/doors.txtpb b/data/maps/the_relentless/doors.txtpb index 11f6369..e755d0b 100644 --- a/data/maps/the_relentless/doors.txtpb +++ b/data/maps/the_relentless/doors.txtpb
@@ -1,6 +1,33 @@
1doors { 1doors {
2 name: "Left/Turn Door" 2 name: "Turn Only Puzzles"
3 type: LOCATION_ONLY 3 type: LOCATION_ONLY
4 panels { room: "Turn Room" name: "HIDE (1)" }
5 panels { room: "Turn Room" name: "HIDE (2)" }
6 panels { room: "Turn Room" name: "MORE" }
7 location_room: "Turn Room"
8}
9doors {
10 name: "Shop Only Puzzles"
11 type: LOCATION_ONLY
12 panels { room: "Shop Room" name: "LEFT (1)" }
13 panels { room: "Shop Room" name: "LEFT (2)" }
14 panels { room: "Shop Room" name: "EXIT (1)" }
15 panels { room: "Shop Room" name: "EXIT (2)" }
16 panels { room: "Shop Room" name: "EXIT (3)" }
17 location_room: "Shop Room"
18}
19doors {
20 name: "Left Only Puzzles"
21 type: LOCATION_ONLY
22 panels { room: "Left Room" name: "HIDE" }
23 panels { room: "Left Room" name: "LEFT" }
24 panels { room: "Left Room" name: "MORE" }
25 location_room: "Left Room"
26}
27doors {
28 name: "Left/Turn Door"
29 type: EVENT
30 legacy_location: true
4 panels { room: "Left Room" name: "HIDE" } 31 panels { room: "Left Room" name: "HIDE" }
5 panels { room: "Left Room" name: "LEFT" } 32 panels { room: "Left Room" name: "LEFT" }
6 panels { room: "Left Room" name: "MORE" } 33 panels { room: "Left Room" name: "MORE" }
@@ -11,7 +38,8 @@ doors {
11} 38}
12doors { 39doors {
13 name: "Turn/Shop Door" 40 name: "Turn/Shop Door"
14 type: LOCATION_ONLY 41 type: EVENT
42 legacy_location: true
15 panels { room: "Turn Room" name: "HIDE (1)" } 43 panels { room: "Turn Room" name: "HIDE (1)" }
16 panels { room: "Turn Room" name: "HIDE (2)" } 44 panels { room: "Turn Room" name: "HIDE (2)" }
17 panels { room: "Turn Room" name: "MORE" } 45 panels { room: "Turn Room" name: "MORE" }
diff --git a/data/maps/the_relentless/rooms/All.txtpb b/data/maps/the_relentless/rooms/All.txtpb index 12705ba..19238c9 100644 --- a/data/maps/the_relentless/rooms/All.txtpb +++ b/data/maps/the_relentless/rooms/All.txtpb
@@ -1,5 +1,4 @@
1name: "All" 1name: "All"
2display_name: "Relentless"
3panels { 2panels {
4 name: "LEFT (1)" 3 name: "LEFT (1)"
5 path: "Panels/Room_1/panel_6" 4 path: "Panels/Room_1/panel_6"
diff --git a/data/maps/the_relentless/rooms/Left And Turn.txtpb b/data/maps/the_relentless/rooms/Left And Turn.txtpb index 5037f20..f79bb54 100644 --- a/data/maps/the_relentless/rooms/Left And Turn.txtpb +++ b/data/maps/the_relentless/rooms/Left And Turn.txtpb
@@ -1,5 +1,4 @@
1name: "Left And Turn" 1name: "Left And Turn"
2display_name: "Relentless"
3panels { 2panels {
4 name: "HIDE (1)" 3 name: "HIDE (1)"
5 path: "Panels/Room_1/panel_2" 4 path: "Panels/Room_1/panel_2"
diff --git a/data/maps/the_relentless/rooms/Left Room.txtpb b/data/maps/the_relentless/rooms/Left Room.txtpb index 52b5154..4db0075 100644 --- a/data/maps/the_relentless/rooms/Left Room.txtpb +++ b/data/maps/the_relentless/rooms/Left Room.txtpb
@@ -1,5 +1,4 @@
1name: "Left Room" 1name: "Left Room"
2display_name: "Relentless"
3panels { 2panels {
4 name: "HIDE" 3 name: "HIDE"
5 path: "Panels/Room_1/panel_1" 4 path: "Panels/Room_1/panel_1"
diff --git a/data/maps/the_relentless/rooms/Mastery.txtpb b/data/maps/the_relentless/rooms/Mastery.txtpb index 8b12c56..749837e 100644 --- a/data/maps/the_relentless/rooms/Mastery.txtpb +++ b/data/maps/the_relentless/rooms/Mastery.txtpb
@@ -1,5 +1,4 @@
1name: "Mastery" 1name: "Mastery"
2display_name: "Relentless"
3masteries { 2masteries {
4 name: "MASTERY" 3 name: "MASTERY"
5 path: "Components/Collectables/smiley" 4 path: "Components/Collectables/smiley"
diff --git a/data/maps/the_relentless/rooms/Shop Room.txtpb b/data/maps/the_relentless/rooms/Shop Room.txtpb index 22b7acc..be3ff7a 100644 --- a/data/maps/the_relentless/rooms/Shop Room.txtpb +++ b/data/maps/the_relentless/rooms/Shop Room.txtpb
@@ -1,5 +1,4 @@
1name: "Shop Room" 1name: "Shop Room"
2display_name: "Relentless"
3panels { 2panels {
4 name: "LEFT (1)" 3 name: "LEFT (1)"
5 path: "Panels/Room_3/panel_5" 4 path: "Panels/Room_3/panel_5"
diff --git a/data/maps/the_relentless/rooms/Turn And Shop.txtpb b/data/maps/the_relentless/rooms/Turn And Shop.txtpb index 9e61769..b9e257c 100644 --- a/data/maps/the_relentless/rooms/Turn And Shop.txtpb +++ b/data/maps/the_relentless/rooms/Turn And Shop.txtpb
@@ -1,5 +1,4 @@
1name: "Turn And Shop" 1name: "Turn And Shop"
2display_name: "Relentless"
3panels { 2panels {
4 name: "LEFT (1)" 3 name: "LEFT (1)"
5 path: "Panels/Room_2/panel_5" 4 path: "Panels/Room_2/panel_5"
diff --git a/data/maps/the_relentless/rooms/Turn Room.txtpb b/data/maps/the_relentless/rooms/Turn Room.txtpb index 3b5caef..525786c 100644 --- a/data/maps/the_relentless/rooms/Turn Room.txtpb +++ b/data/maps/the_relentless/rooms/Turn Room.txtpb
@@ -1,5 +1,4 @@
1name: "Turn Room" 1name: "Turn Room"
2display_name: "Relentless"
3panels { 2panels {
4 name: "HIDE (1)" 3 name: "HIDE (1)"
5 path: "Panels/Room_2/panel_2" 4 path: "Panels/Room_2/panel_2"
diff --git a/data/maps/the_repetitive/connections.txtpb b/data/maps/the_repetitive/connections.txtpb index 2b115a9..f4c06f2 100644 --- a/data/maps/the_repetitive/connections.txtpb +++ b/data/maps/the_repetitive/connections.txtpb
@@ -6,13 +6,13 @@ connections {
6connections { 6connections {
7 from_room: "Main Room" 7 from_room: "Main Room"
8 to_room: "Plaza Connector" 8 to_room: "Plaza Connector"
9 door { name: "Plaza Entrance" } 9 door { name: "Black Hallway" }
10 oneway: true
11} 10}
12connections { 11connections {
13 from_room: "Plaza Connector" 12 from_room: "Plaza Connector"
14 to_room: "Main Room" 13 to_room: "Main Room"
15 oneway: true 14 oneway: true
15 vanilla_only: true
16} 16}
17connections { 17connections {
18 from_room: "Main Room" 18 from_room: "Main Room"
diff --git a/data/maps/the_repetitive/doors.txtpb b/data/maps/the_repetitive/doors.txtpb index 9e63c1d..95d189f 100644 --- a/data/maps/the_repetitive/doors.txtpb +++ b/data/maps/the_repetitive/doors.txtpb
@@ -6,7 +6,7 @@ doors {
6 location_room: "Main Room" 6 location_room: "Main Room"
7} 7}
8doors { 8doors {
9 name: "Plaza Entrance" 9 name: "Black Hallway"
10 type: STANDARD 10 type: STANDARD
11 receivers: "Components/Doors/Door12" 11 receivers: "Components/Doors/Door12"
12 panels { room: "Main Room" name: "I" } 12 panels { room: "Main Room" name: "I" }
@@ -20,12 +20,21 @@ doors {
20} 20}
21doors { 21doors {
22 name: "Dot Area Entrance" 22 name: "Dot Area Entrance"
23 type: STANDARD 23 type: ITEM_ONLY
24 legacy_location: true
24 receivers: "Components/Doors/Door8" 25 receivers: "Components/Doors/Door8"
25 panels { room: "Main Room" name: "HOTS (2)" } 26 panels { room: "Main Room" name: "HOTS (2)" }
26 location_room: "Main Room" 27 location_room: "Main Room"
27} 28}
28doors { 29doors {
30 name: "Hots Panels"
31 type: LOCATION_ONLY
32 panels { room: "Main Room" name: "HOTS (1)" }
33 panels { room: "Main Room" name: "HOTS (2)" }
34 location_room: "Main Room"
35 location_name: "HOTS (1), HOTS (2)"
36}
37doors {
29 name: "Lime Door" 38 name: "Lime Door"
30 type: STANDARD 39 type: STANDARD
31 receivers: "Components/Doors/Door9" 40 receivers: "Components/Doors/Door9"
@@ -194,3 +203,41 @@ doors {
194 panels { room: "Yellow Room" name: "ASSESSES" } 203 panels { room: "Yellow Room" name: "ASSESSES" }
195 panels { room: "Yellow Room" name: "TINTING" } 204 panels { room: "Yellow Room" name: "TINTING" }
196} 205}
206doors {
207 name: "Anti-Collectable"
208 type: LOCATION_ONLY
209 senders: "Components/Collectables/anticollectable"
210 location_room: "Anti Room"
211}
212doors {
213 name: "H2 Room Puzzles"
214 type: LOCATION_ONLY
215 panels { room: "Main Room" name: "HEIGHT (1)" }
216 panels { room: "Main Room" name: "HEIGHT (2)" }
217 panels { room: "Main Room" name: "HEIGHT (3)" }
218 panels { room: "Main Room" name: "HEIGHT (4)" }
219 panels { room: "Main Room" name: "HEIGHT (5)" }
220 panels { room: "Main Room" name: "HEIGHT (6)" }
221 panels { room: "Main Room" name: "QUESTION" }
222 panels { room: "Main Room" name: "INTUITION" }
223 panels { room: "Main Room" name: "?" }
224 panels { room: "Main Room" name: "HAND" }
225 panels { room: "Main Room" name: "? HAND" }
226 panels { room: "Main Room" name: "RICHES" }
227 panels { room: "Main Room" name: "? RICHES" }
228 panels { room: "Main Room" name: "MISHMASH" }
229 location_room: "Main Room"
230}
231doors {
232 name: "Anti-Collectable Room Panels"
233 type: LOCATION_ONLY
234 panels { room: "Anti Room" name: "EYE (1)" }
235 panels { room: "Anti Room" name: "EYE (2)" }
236 panels { room: "Anti Room" name: "HA (1)" }
237 panels { room: "Anti Room" name: "HA (2)" }
238 panels { room: "Anti Room" name: "HA (3)" }
239 panels { room: "Anti Room" name: "HA (4)" }
240 panels { room: "Anti Room" name: "HA (5)" }
241 panels { room: "Anti Room" name: "TWO" }
242 location_room: "Anti Room"
243}
diff --git a/data/maps/the_repetitive/metadata.txtpb b/data/maps/the_repetitive/metadata.txtpb index 6f5c459..76a0f50 100644 --- a/data/maps/the_repetitive/metadata.txtpb +++ b/data/maps/the_repetitive/metadata.txtpb
@@ -1,10 +1,6 @@
1display_name: "The Repetitive" 1display_name: "The Repetitive"
2# The anti-collectable doesn't fit into our system right now so let's ignore it.
3excluded_nodes: "Components/Collectables/anticollectable"
4# These paintings are directly above/behind panels and thus can't be entered. 2# These paintings are directly above/behind panels and thus can't be entered.
5excluded_nodes: "Meshes/eyeRed3" 3excluded_nodes: "Meshes/eyeRed3"
6excluded_nodes: "Meshes/eyeRed4" 4excluded_nodes: "Meshes/eyeRed4"
7# I do not know what this is.
8excluded_nodes: "Components/Doors/Door3/Hinge/panel_i"
9# This has something to do with the magenta room entrance proxy panel. 5# This has something to do with the magenta room entrance proxy panel.
10excluded_nodes: "Panels/Eval/panel_26_proxyied_fake" 6excluded_nodes: "Panels/Eval/panel_26_proxyied_fake"
diff --git a/data/maps/the_repetitive/rooms/Anti Room.txtpb b/data/maps/the_repetitive/rooms/Anti Room.txtpb index 5451977..65a99ff 100644 --- a/data/maps/the_repetitive/rooms/Anti Room.txtpb +++ b/data/maps/the_repetitive/rooms/Anti Room.txtpb
@@ -1,6 +1,4 @@
1name: "Anti Room" 1name: "Anti Room"
2display_name: "Repetitive"
3# Ignore the collectible. The mod should remove it and the back wall too.
4panels { 2panels {
5 name: "HA (1)" 3 name: "HA (1)"
6 path: "Panels/Entry/panel_7" 4 path: "Panels/Entry/panel_7"
@@ -39,9 +37,17 @@ panels {
39 symbols: EXAMPLE 37 symbols: EXAMPLE
40} 38}
41panels { 39panels {
42 name: "EYE" 40 name: "EYE (1)"
43 path: "Panels/Entry/panel4" 41 path: "Panels/Entry/panel4"
44 clue: "eye" 42 clue: "eye"
45 answer: "iris" 43 answer: "iris"
46 symbols: BOXES 44 symbols: BOXES
47} 45}
46panels {
47 # This appears after grabbing the anti-collectable.
48 name: "EYE (2)"
49 path: "Components/Doors/Door3/Hinge/panel_i"
50 clue: "eye"
51 answer: "i"
52 symbols: ZERO
53}
diff --git a/data/maps/the_repetitive/rooms/Cyan Room.txtpb b/data/maps/the_repetitive/rooms/Cyan Room.txtpb index fb56ac7..d6790f5 100644 --- a/data/maps/the_repetitive/rooms/Cyan Room.txtpb +++ b/data/maps/the_repetitive/rooms/Cyan Room.txtpb
@@ -1,5 +1,4 @@
1name: "Cyan Room" 1name: "Cyan Room"
2display_name: "Repetitive"
3panels { 2panels {
4 name: "ALFA" 3 name: "ALFA"
5 path: "Panels/Lingo2/panel_3" 4 path: "Panels/Lingo2/panel_3"
diff --git a/data/maps/the_repetitive/rooms/Dot Area.txtpb b/data/maps/the_repetitive/rooms/Dot Area.txtpb index 202ed92..c4f4583 100644 --- a/data/maps/the_repetitive/rooms/Dot Area.txtpb +++ b/data/maps/the_repetitive/rooms/Dot Area.txtpb
@@ -1,5 +1,4 @@
1name: "Dot Area" 1name: "Dot Area"
2display_name: "Repetitive"
3panels { 2panels {
4 name: "TUTU (1)" 3 name: "TUTU (1)"
5 path: "Panels/Lingo2/panel" 4 path: "Panels/Lingo2/panel"
@@ -96,7 +95,7 @@ panels {
96 clue: "door" 95 clue: "door"
97 answer: "door" 96 answer: "door"
98 symbols: EVAL 97 symbols: EVAL
99 #proxies { answer: "door" path: "Panels/Eval/panel_26_proxyied_1" } 98 proxies { answer: "door" path: "Panels/Eval/panel_26_proxyied_1" }
100 proxies { answer: "do" path: "Panels/Eval/panel_26_proxyied_2" } 99 proxies { answer: "do" path: "Panels/Eval/panel_26_proxyied_2" }
101} 100}
102panels { 101panels {
diff --git a/data/maps/the_repetitive/rooms/Entry Connector.txtpb b/data/maps/the_repetitive/rooms/Entry Connector.txtpb index 8addc7f..1508145 100644 --- a/data/maps/the_repetitive/rooms/Entry Connector.txtpb +++ b/data/maps/the_repetitive/rooms/Entry Connector.txtpb
@@ -1,7 +1,8 @@
1name: "Entry Connector" 1name: "Entry Connector"
2display_name: "Repetitive"
3ports { 2ports {
4 name: "ENTRY" 3 name: "ENTRY"
4 display_name: "Northwest Worldport"
5 path: "Components/Warps/worldport2" 5 path: "Components/Warps/worldport2"
6 orientation: "south" 6 destination { x: -11 y: 0 z: 13 }
7 rotation: 90
7} 8}
diff --git a/data/maps/the_repetitive/rooms/Lime Room.txtpb b/data/maps/the_repetitive/rooms/Lime Room.txtpb index 71e4c2c..37d4937 100644 --- a/data/maps/the_repetitive/rooms/Lime Room.txtpb +++ b/data/maps/the_repetitive/rooms/Lime Room.txtpb
@@ -1,5 +1,4 @@
1name: "Lime Room" 1name: "Lime Room"
2display_name: "Repetitive"
3panels { 2panels {
4 name: "RAT" 3 name: "RAT"
5 path: "Panels/Lingo2/panel_1" 4 path: "Panels/Lingo2/panel_1"
diff --git a/data/maps/the_repetitive/rooms/Magenta Room.txtpb b/data/maps/the_repetitive/rooms/Magenta Room.txtpb index 827d058..d38e485 100644 --- a/data/maps/the_repetitive/rooms/Magenta Room.txtpb +++ b/data/maps/the_repetitive/rooms/Magenta Room.txtpb
@@ -1,5 +1,4 @@
1name: "Magenta Room" 1name: "Magenta Room"
2display_name: "Repetitive"
3panels { 2panels {
4 name: "WRITE" 3 name: "WRITE"
5 path: "Panels/Eval/panel_9" 4 path: "Panels/Eval/panel_9"
diff --git a/data/maps/the_repetitive/rooms/Main Room.txtpb b/data/maps/the_repetitive/rooms/Main Room.txtpb index 9fd36d4..623204c 100644 --- a/data/maps/the_repetitive/rooms/Main Room.txtpb +++ b/data/maps/the_repetitive/rooms/Main Room.txtpb
@@ -1,5 +1,4 @@
1name: "Main Room" 1name: "Main Room"
2display_name: "Repetitive"
3panels { 2panels {
4 name: "HOTS (2)" 3 name: "HOTS (2)"
5 path: "Panels/Entry/panel_3" 4 path: "Panels/Entry/panel_3"
@@ -139,6 +138,8 @@ paintings {
139} 138}
140ports { 139ports {
141 name: "CC" 140 name: "CC"
141 display_name: "Southwest Worldport"
142 path: "Components/Warps/worldport3" 142 path: "Components/Warps/worldport3"
143 orientation: "east" 143 destination { x: -5.5 y: 0 z: 56 }
144 rotation: 90
144} 145}
diff --git a/data/maps/the_repetitive/rooms/Mastery Room.txtpb b/data/maps/the_repetitive/rooms/Mastery Room.txtpb index 074a825..5e3326c 100644 --- a/data/maps/the_repetitive/rooms/Mastery Room.txtpb +++ b/data/maps/the_repetitive/rooms/Mastery Room.txtpb
@@ -1,5 +1,4 @@
1name: "Mastery Room" 1name: "Mastery Room"
2display_name: "Repetitive"
3masteries { 2masteries {
4 name: "MASTERY" 3 name: "MASTERY"
5 path: "Components/Collectables/smiley" 4 path: "Components/Collectables/smiley"
diff --git a/data/maps/the_repetitive/rooms/Plaza Connector.txtpb b/data/maps/the_repetitive/rooms/Plaza Connector.txtpb index 88f7fc4..b26fdb0 100644 --- a/data/maps/the_repetitive/rooms/Plaza Connector.txtpb +++ b/data/maps/the_repetitive/rooms/Plaza Connector.txtpb
@@ -1,7 +1,8 @@
1name: "Plaza Connector" 1name: "Plaza Connector"
2display_name: "Repetitive"
3ports { 2ports {
4 name: "PLAZA" 3 name: "PLAZA"
4 display_name: "Northeast Worldport"
5 path: "Components/Warps/worldport" 5 path: "Components/Warps/worldport"
6 orientation: "north" 6 destination { x: 15 y: 0 z: 13 }
7 rotation: 0
7} 8}
diff --git a/data/maps/the_repetitive/rooms/Yellow Room.txtpb b/data/maps/the_repetitive/rooms/Yellow Room.txtpb index 65d665f..9b7d619 100644 --- a/data/maps/the_repetitive/rooms/Yellow Room.txtpb +++ b/data/maps/the_repetitive/rooms/Yellow Room.txtpb
@@ -1,5 +1,4 @@
1name: "Yellow Room" 1name: "Yellow Room"
2display_name: "Repetitive"
3panels { 2panels {
4 name: "W" 3 name: "W"
5 path: "Panels/Eval/panel_1" 4 path: "Panels/Eval/panel_1"
diff --git a/data/maps/the_revitalized/rooms/Bye Room.txtpb b/data/maps/the_revitalized/rooms/Bye Room.txtpb index 60726c2..52d8c42 100644 --- a/data/maps/the_revitalized/rooms/Bye Room.txtpb +++ b/data/maps/the_revitalized/rooms/Bye Room.txtpb
@@ -1,5 +1,4 @@
1name: "Bye Room" 1name: "Bye Room"
2display_name: "Revitalized"
3panels { 2panels {
4 name: "BYE" 3 name: "BYE"
5 path: "Panels/panel_1" 4 path: "Panels/panel_1"
@@ -9,6 +8,8 @@ panels {
9} 8}
10ports { 9ports {
11 name: "PARTHENON" 10 name: "PARTHENON"
11 display_name: "Entrance"
12 path: "Components/Warps/worldport" 12 path: "Components/Warps/worldport"
13 orientation: "south" 13 destination { x: 30 y: 0 z: 16 }
14 rotation: 0
14} 15}
diff --git a/data/maps/the_revitalized/rooms/Hidden Room.txtpb b/data/maps/the_revitalized/rooms/Hidden Room.txtpb index c9ec310..61f2e4d 100644 --- a/data/maps/the_revitalized/rooms/Hidden Room.txtpb +++ b/data/maps/the_revitalized/rooms/Hidden Room.txtpb
@@ -1,5 +1,4 @@
1name: "Hidden Room" 1name: "Hidden Room"
2display_name: "Revitalized"
3panels { 2panels {
4 name: "HIDDEN" 3 name: "HIDDEN"
5 path: "Panels/panel_3" 4 path: "Panels/panel_3"
diff --git a/data/maps/the_revitalized/rooms/Hide Room.txtpb b/data/maps/the_revitalized/rooms/Hide Room.txtpb index 6660787..92b29bf 100644 --- a/data/maps/the_revitalized/rooms/Hide Room.txtpb +++ b/data/maps/the_revitalized/rooms/Hide Room.txtpb
@@ -1,5 +1,4 @@
1name: "Hide Room" 1name: "Hide Room"
2display_name: "Revitalized"
3panels { 2panels {
4 name: "HIDE" 3 name: "HIDE"
5 path: "Panels/panel_2" 4 path: "Panels/panel_2"
diff --git a/data/maps/the_revitalized/rooms/High Room.txtpb b/data/maps/the_revitalized/rooms/High Room.txtpb index de8fdaf..e876801 100644 --- a/data/maps/the_revitalized/rooms/High Room.txtpb +++ b/data/maps/the_revitalized/rooms/High Room.txtpb
@@ -1,5 +1,4 @@
1name: "High Room" 1name: "High Room"
2display_name: "Revitalized"
3panels { 2panels {
4 name: "HIGH" 3 name: "HIGH"
5 path: "Panels/panel_4" 4 path: "Panels/panel_4"
diff --git a/data/maps/the_revitalized/rooms/Return Room.txtpb b/data/maps/the_revitalized/rooms/Return Room.txtpb index 1d9d094..d629c8d 100644 --- a/data/maps/the_revitalized/rooms/Return Room.txtpb +++ b/data/maps/the_revitalized/rooms/Return Room.txtpb
@@ -1,5 +1,4 @@
1name: "Return Room" 1name: "Return Room"
2display_name: "Revitalized"
3panels { 2panels {
4 name: "RETURN" 3 name: "RETURN"
5 path: "Components/panel_7" 4 path: "Components/panel_7"
diff --git a/data/maps/the_revitalized/rooms/Too Room.txtpb b/data/maps/the_revitalized/rooms/Too Room.txtpb index a35b80f..819c3cf 100644 --- a/data/maps/the_revitalized/rooms/Too Room.txtpb +++ b/data/maps/the_revitalized/rooms/Too Room.txtpb
@@ -1,5 +1,4 @@
1name: "Too Room" 1name: "Too Room"
2display_name: "Revitalized"
3panels { 2panels {
4 name: "TOO" 3 name: "TOO"
5 path: "Panels/panel_6" 4 path: "Panels/panel_6"
diff --git a/data/maps/the_revitalized/rooms/Won Room.txtpb b/data/maps/the_revitalized/rooms/Won Room.txtpb index 16766fb..8cedd1d 100644 --- a/data/maps/the_revitalized/rooms/Won Room.txtpb +++ b/data/maps/the_revitalized/rooms/Won Room.txtpb
@@ -1,5 +1,4 @@
1name: "Won Room" 1name: "Won Room"
2display_name: "Revitalized"
3panels { 2panels {
4 name: "WON" 3 name: "WON"
5 path: "Panels/panel_5" 4 path: "Panels/panel_5"
diff --git a/data/maps/the_shop/doors.txtpb b/data/maps/the_shop/doors.txtpb index 5362614..2ce7c71 100644 --- a/data/maps/the_shop/doors.txtpb +++ b/data/maps/the_shop/doors.txtpb
@@ -33,5 +33,8 @@ doors {
33doors { 33doors {
34 name: "N Entered" 34 name: "N Entered"
35 type: EVENT 35 type: EVENT
36 latch: true
37 receivers: "Components/Doors/entry_1"
38 receivers: "Components/Doors/entry_2"
36 keyholders { room: "Main Area" name: "N" key: "n" } 39 keyholders { room: "Main Area" name: "N" key: "n" }
37} 40}
diff --git a/data/maps/the_shop/rooms/Main Area.txtpb b/data/maps/the_shop/rooms/Main Area.txtpb index eb0e696..df1cb14 100644 --- a/data/maps/the_shop/rooms/Main Area.txtpb +++ b/data/maps/the_shop/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Shop"
3panels { 2panels {
4 name: "DUCKS" 3 name: "DUCKS"
5 path: "Panels/Books/panel_1" 4 path: "Panels/Books/panel_1"
@@ -156,9 +155,13 @@ panels {
156} 155}
157ports { 156ports {
158 name: "ENTRY" 157 name: "ENTRY"
158 display_name: "Entrance"
159 path: "Components/Warps/worldport" 159 path: "Components/Warps/worldport"
160 destination { x: 4 y: 0 z: 12 }
161 rotation: 90
160} 162}
161keyholders { 163keyholders {
162 name: "N" 164 name: "N"
163 path: "Components/KeyHolders/keyHolderN" 165 path: "Components/KeyHolders/keyHolderN"
166 key: "n"
164} 167}
diff --git a/data/maps/the_sirenic/metadata.txtpb b/data/maps/the_sirenic/metadata.txtpb index 19e26a3..80b1783 100644 --- a/data/maps/the_sirenic/metadata.txtpb +++ b/data/maps/the_sirenic/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Sirenic" 1display_name: "The Sirenic"
2worldport_entrance {
3 room: "Start"
4 name: "PLAZA"
5}
diff --git a/data/maps/the_sirenic/rooms/Mastery.txtpb b/data/maps/the_sirenic/rooms/Mastery.txtpb index 849202b..749837e 100644 --- a/data/maps/the_sirenic/rooms/Mastery.txtpb +++ b/data/maps/the_sirenic/rooms/Mastery.txtpb
@@ -1,5 +1,4 @@
1name: "Mastery" 1name: "Mastery"
2display_name: "Sirenic"
3masteries { 2masteries {
4 name: "MASTERY" 3 name: "MASTERY"
5 path: "Components/Collectables/smiley" 4 path: "Components/Collectables/smiley"
diff --git a/data/maps/the_sirenic/rooms/Puzzles.txtpb b/data/maps/the_sirenic/rooms/Puzzles.txtpb index 6784163..0f62cbd 100644 --- a/data/maps/the_sirenic/rooms/Puzzles.txtpb +++ b/data/maps/the_sirenic/rooms/Puzzles.txtpb
@@ -1,5 +1,4 @@
1name: "Puzzles" 1name: "Puzzles"
2display_name: "Sirenic"
3panels { 2panels {
4 name: "Left Top 1" 3 name: "Left Top 1"
5 path: "Panels/Room_1/pip_1" 4 path: "Panels/Room_1/pip_1"
diff --git a/data/maps/the_sirenic/rooms/Start.txtpb b/data/maps/the_sirenic/rooms/Start.txtpb index 61150d9..532d951 100644 --- a/data/maps/the_sirenic/rooms/Start.txtpb +++ b/data/maps/the_sirenic/rooms/Start.txtpb
@@ -1,5 +1,4 @@
1name: "Start" 1name: "Start"
2display_name: "Sirenic"
3panels { 2panels {
4 name: "Flipped" 3 name: "Flipped"
5 path: "Panels/Entry/entry_2" 4 path: "Panels/Entry/entry_2"
@@ -16,6 +15,8 @@ panels {
16} 15}
17ports { 16ports {
18 name: "PLAZA" 17 name: "PLAZA"
18 display_name: "Entrance"
19 path: "Components/Warps/worldport" 19 path: "Components/Warps/worldport"
20 orientation: "south" 20 destination { x: 0 y: 0 z: 26 }
21 rotation: 0
21} 22}
diff --git a/data/maps/the_stellar/connections.txtpb b/data/maps/the_stellar/connections.txtpb new file mode 100644 index 0000000..3bfea31 --- /dev/null +++ b/data/maps/the_stellar/connections.txtpb
@@ -0,0 +1,70 @@
1connections {
2 from_room: "Starting Room"
3 to_room: "Connected Area"
4 door { name: "Entrance" }
5}
6connections {
7 from_room: "Connected Area"
8 to_room: "Mastery"
9 door { name: "Mastery Door" }
10}
11connections {
12 from_room: "Connected Area"
13 to_room: "Hi Room"
14 door { name: "Hi Room Front Door" }
15}
16connections {
17 from_room: "Connected Area"
18 to_room: "Hi Room"
19 door { name: "Hi Room Back Door" }
20}
21connections {
22 from_room: "Green Area"
23 to_room: "Connected Area"
24 door { name: "Green Area Door" }
25}
26connections {
27 from_room: "Connected Area"
28 to_room: "Old Crossroads"
29 door { name: "Crossroads Shortcut" }
30}
31connections {
32 from_room: "Connected Area"
33 to_room: "Old Crossroads"
34 oneway: true
35}
36connections {
37 from_room: "Old Crossroads"
38 to_room: "Green Area"
39 oneway: true
40}
41connections {
42 from_room: "Connected Area"
43 to_room: "Red Panel"
44 door { name: "Red Panel" }
45}
46connections {
47 from_room: "Connected Area"
48 to_room: "Orange Panel"
49 door { name: "Orange Panel" }
50}
51connections {
52 from_room: "Connected Area"
53 to_room: "Yellow Panel"
54 door { name: "Yellow Panel" }
55}
56connections {
57 from_room: "Green Area"
58 to_room: "Green Panel"
59 door { name: "Green Panel" }
60}
61connections {
62 from_room: "Connected Area"
63 to_room: "Blue Panel"
64 door { name: "Blue Panel" }
65}
66connections {
67 from_room: "Connected Area"
68 to_room: "Purple Panel"
69 door { name: "Purple Panel" }
70}
diff --git a/data/maps/the_stellar/doors.txtpb b/data/maps/the_stellar/doors.txtpb new file mode 100644 index 0000000..1359189 --- /dev/null +++ b/data/maps/the_stellar/doors.txtpb
@@ -0,0 +1,104 @@
1# Shortcuts from Connected Area -> Starting Room:
2# - Components/Doors/entry_3
3# - Components/Doors/entry_11
4# - Components/Doors/entry_12
5# Unopenable door:
6# - Components/Doors/entry_4
7# - Components/Doors/entry_6
8# - Components/Doors/entry_7
9# This opens and closes automatically:
10# - Components/Doors/entry_5
11doors {
12 name: "Entrance"
13 type: STANDARD
14 receivers: "Components/Doors/entry_1"
15 receivers: "Components/Doors/entry_2"
16 panels { room: "Starting Room" name: "STARLIKE" }
17 location_room: "Starting Room"
18}
19doors {
20 name: "Mastery Door"
21 type: EVENT
22 receivers: "Components/Doors/entry_18"
23 panels { room: "Purple Panel" name: "PURPLE" }
24}
25doors {
26 name: "Hi Room Front Door"
27 type: EVENT
28 receivers: "Components/Doors/entry_21"
29 panels { room: "Connected Area" name: "HI" }
30}
31doors {
32 name: "Hi Room Back Door"
33 type: EVENT
34 receivers: "Components/Doors/entry_20"
35 panels { room: "Hi Room" name: "HI" }
36}
37doors {
38 name: "Green Area Door"
39 type: EVENT
40 receivers: "Components/Doors/entry_15"
41 panels { room: "Green Area" name: "STRAYS" }
42}
43doors {
44 name: "Crossroads Shortcut"
45 type: EVENT
46 receivers: "Components/Doors/entry_14"
47 panels { room: "Old Crossroads" name: "DOORWAY" }
48}
49doors {
50 name: "Red Panel"
51 type: EVENT
52 receivers: "Components/Doors/entry_8"
53 panels { room: "Connected Area" name: "START" }
54}
55doors {
56 name: "Orange Panel"
57 type: EVENT
58 receivers: "Components/Doors/entry_19"
59 panels { room: "Red Panel" name: "RED" }
60}
61doors {
62 name: "Yellow Panel"
63 type: EVENT
64 receivers: "Components/Doors/entry_10"
65 receivers: "Components/Doors/entry_17"
66 panels { room: "Connected Area" name: "START" }
67 panels { room: "Orange Panel" name: "ORANGE" }
68}
69doors {
70 name: "Green Panel"
71 type: EVENT
72 receivers: "Components/Doors/entry_16"
73 panels { room: "Yellow Panel" name: "YELLOW" }
74}
75doors {
76 name: "Blue Panel"
77 type: EVENT
78 receivers: "Components/Doors/entry_9"
79 panels { room: "Green Panel" name: "GREEN" }
80}
81doors {
82 name: "Purple Panel"
83 type: EVENT
84 receivers: "Components/Doors/entry_13"
85 panels { room: "Blue Panel" name: "BLUE" }
86}
87doors {
88 name: "Question Panels"
89 type: LOCATION_ONLY
90 panels { room: "Connected Area" name: "HERE" }
91 panels { room: "Connected Area" name: "WHERE" }
92 panels { room: "Connected Area" name: "QUESTION (1)" }
93 panels { room: "Connected Area" name: "QUESTION (2)" }
94 location_room: "Connected Area"
95}
96doors {
97 name: "Welcome Back Panels"
98 type: LOCATION_ONLY
99 panels { room: "Connected Area" name: "GREETINGS" }
100 panels { room: "Connected Area" name: "BEHIND" }
101 panels { room: "Connected Area" name: "Blank" }
102 location_room: "Connected Area"
103 location_name: "BEHIND, GREETINGS, Blank"
104}
diff --git a/data/maps/the_stellar/metadata.txtpb b/data/maps/the_stellar/metadata.txtpb new file mode 100644 index 0000000..aaf6631 --- /dev/null +++ b/data/maps/the_stellar/metadata.txtpb
@@ -0,0 +1,6 @@
1display_name: "The Stellar"
2type: GIFT_MAP
3# This panel does not appear to be accessible without sniping.
4excluded_nodes: "Panels/Room_1/panel_2"
5# The map's mastery is created at runtime.
6custom_nodes: "Components/Collectables/collectable"
diff --git a/data/maps/the_stellar/rooms/Blue Panel.txtpb b/data/maps/the_stellar/rooms/Blue Panel.txtpb new file mode 100644 index 0000000..cba885f --- /dev/null +++ b/data/maps/the_stellar/rooms/Blue Panel.txtpb
@@ -0,0 +1,8 @@
1name: "Blue Panel"
2panels {
3 name: "BLUE"
4 path: "Panels/Colors/blue"
5 clue: "blue"
6 answer: "purple"
7 symbols: BOXES
8}
diff --git a/data/maps/the_stellar/rooms/Connected Area.txtpb b/data/maps/the_stellar/rooms/Connected Area.txtpb new file mode 100644 index 0000000..90d9693 --- /dev/null +++ b/data/maps/the_stellar/rooms/Connected Area.txtpb
@@ -0,0 +1,63 @@
1name: "Connected Area"
2panels {
3 name: "HERE"
4 path: "Panels/Room_1/panel_3"
5 clue: "here"
6 answer: "where"
7 symbols: SPARKLES
8}
9panels {
10 name: "QUESTION (1)"
11 path: "Panels/Room_1/panel_4"
12 clue: "question"
13 answer: "what"
14 symbols: EXAMPLE
15}
16panels {
17 name: "QUESTION (2)"
18 path: "Panels/Room_1/panel_5"
19 clue: "question"
20 answer: "how"
21 symbols: EXAMPLE
22}
23panels {
24 name: "HI"
25 path: "Panels/Room_1/panel_12"
26 clue: "hi"
27 answer: "hi"
28 symbols: QUESTION
29}
30panels {
31 name: "WHERE"
32 path: "Panels/Room_1/panel_6"
33 clue: "where"
34 answer: "there"
35 symbols: SPARKLES
36}
37panels {
38 name: "GREETINGS"
39 path: "Panels/Room_1/panel_7"
40 clue: "greetings"
41 answer: "welcome"
42 symbols: SUN
43}
44panels {
45 name: "BEHIND"
46 path: "Panels/Room_1/panel_8"
47 clue: "behind"
48 answer: "back"
49 symbols: SUN
50}
51panels {
52 name: "Blank"
53 path: "Panels/Room_1/panel_9"
54 clue: ""
55 answer: "behind"
56}
57panels {
58 name: "START"
59 path: "Panels/Colors/start"
60 clue: "start"
61 answer: "red"
62 symbols: QUESTION
63}
diff --git a/data/maps/the_stellar/rooms/Green Area.txtpb b/data/maps/the_stellar/rooms/Green Area.txtpb new file mode 100644 index 0000000..366b5c4 --- /dev/null +++ b/data/maps/the_stellar/rooms/Green Area.txtpb
@@ -0,0 +1,8 @@
1name: "Green Area"
2panels {
3 name: "STRAYS"
4 path: "Panels/Room_1/panel_11"
5 clue: "strays"
6 answer: "maze"
7 symbols: ZERO
8}
diff --git a/data/maps/the_stellar/rooms/Green Panel.txtpb b/data/maps/the_stellar/rooms/Green Panel.txtpb new file mode 100644 index 0000000..5b2f561 --- /dev/null +++ b/data/maps/the_stellar/rooms/Green Panel.txtpb
@@ -0,0 +1,8 @@
1name: "Green Panel"
2panels {
3 name: "GREEN"
4 path: "Panels/Colors/green"
5 clue: "green"
6 answer: "blue"
7 symbols: BOXES
8}
diff --git a/data/maps/the_stellar/rooms/Hi Room.txtpb b/data/maps/the_stellar/rooms/Hi Room.txtpb new file mode 100644 index 0000000..4da7462 --- /dev/null +++ b/data/maps/the_stellar/rooms/Hi Room.txtpb
@@ -0,0 +1,8 @@
1name: "Hi Room"
2panels {
3 name: "HI"
4 path: "Panels/Room_1/panel_13"
5 clue: "hi"
6 answer: "hi"
7 symbols: QUESTION
8}
diff --git a/data/maps/the_stellar/rooms/Mastery.txtpb b/data/maps/the_stellar/rooms/Mastery.txtpb new file mode 100644 index 0000000..bbe8742 --- /dev/null +++ b/data/maps/the_stellar/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_stellar/rooms/Old Crossroads.txtpb b/data/maps/the_stellar/rooms/Old Crossroads.txtpb new file mode 100644 index 0000000..47f1550 --- /dev/null +++ b/data/maps/the_stellar/rooms/Old Crossroads.txtpb
@@ -0,0 +1,8 @@
1name: "Old Crossroads"
2panels {
3 name: "DOORWAY"
4 path: "Panels/Room_1/panel_10"
5 clue: "doorway"
6 answer: "hallway"
7 symbols: BOXES
8}
diff --git a/data/maps/the_stellar/rooms/Orange Panel.txtpb b/data/maps/the_stellar/rooms/Orange Panel.txtpb new file mode 100644 index 0000000..84bfa92 --- /dev/null +++ b/data/maps/the_stellar/rooms/Orange Panel.txtpb
@@ -0,0 +1,8 @@
1name: "Orange Panel"
2panels {
3 name: "ORANGE"
4 path: "Panels/Colors/orange"
5 clue: "orange"
6 answer: "yellow"
7 symbols: BOXES
8}
diff --git a/data/maps/the_stellar/rooms/Purple Panel.txtpb b/data/maps/the_stellar/rooms/Purple Panel.txtpb new file mode 100644 index 0000000..3607679 --- /dev/null +++ b/data/maps/the_stellar/rooms/Purple Panel.txtpb
@@ -0,0 +1,8 @@
1name: "Purple Panel"
2panels {
3 name: "PURPLE"
4 path: "Panels/Colors/purple"
5 clue: "purple"
6 answer: "end"
7 symbols: QUESTION
8}
diff --git a/data/maps/the_stellar/rooms/Red Panel.txtpb b/data/maps/the_stellar/rooms/Red Panel.txtpb new file mode 100644 index 0000000..9d70f03 --- /dev/null +++ b/data/maps/the_stellar/rooms/Red Panel.txtpb
@@ -0,0 +1,8 @@
1name: "Red Panel"
2panels {
3 name: "RED"
4 path: "Panels/Colors/red"
5 clue: "red"
6 answer: "orange"
7 symbols: BOXES
8}
diff --git a/data/maps/the_stellar/rooms/Starting Room.txtpb b/data/maps/the_stellar/rooms/Starting Room.txtpb new file mode 100644 index 0000000..5937509 --- /dev/null +++ b/data/maps/the_stellar/rooms/Starting Room.txtpb
@@ -0,0 +1,15 @@
1name: "Starting Room"
2panels {
3 name: "STARLIKE"
4 path: "Panels/Room_1/panel_1"
5 clue: "starlike"
6 answer: "stellar"
7 symbols: SUN
8}
9ports {
10 name: "WORLDPORT"
11 display_name: "Entrance"
12 path: "Components/Warps/worldport"
13 destination { x: 0 y: 0 z: 0 }
14 rotation: 0
15}
diff --git a/data/maps/the_stellar/rooms/Yellow Panel.txtpb b/data/maps/the_stellar/rooms/Yellow Panel.txtpb new file mode 100644 index 0000000..9d2b0c2 --- /dev/null +++ b/data/maps/the_stellar/rooms/Yellow Panel.txtpb
@@ -0,0 +1,8 @@
1name: "Yellow Panel"
2panels {
3 name: "YELLOW"
4 path: "Panels/Colors/yellow"
5 clue: "yellow"
6 answer: "green"
7 symbols: BOXES
8}
diff --git a/data/maps/the_stormy/rooms/Center.txtpb b/data/maps/the_stormy/rooms/Center.txtpb index 62395ba..6a929a7 100644 --- a/data/maps/the_stormy/rooms/Center.txtpb +++ b/data/maps/the_stormy/rooms/Center.txtpb
@@ -1,5 +1,4 @@
1name: "Center" 1name: "Center"
2display_name: "Stormy"
3panels { 2panels {
4 name: "REACTOR" 3 name: "REACTOR"
5 path: "Panels/Room_1/panel_7" 4 path: "Panels/Room_1/panel_7"
@@ -20,6 +19,7 @@ panels {
20 clue: "cloud" 19 clue: "cloud"
21 answer: "rain" 20 answer: "rain"
22 symbols: AGE 21 symbols: AGE
22 display_name: "CLOUD (1)"
23} 23}
24panels { 24panels {
25 name: "WIND" 25 name: "WIND"
@@ -27,9 +27,12 @@ panels {
27 clue: "wind" 27 clue: "wind"
28 answer: "tornado" 28 answer: "tornado"
29 symbols: CROSS 29 symbols: CROSS
30 display_name: "WIND (1)"
30} 31}
31ports { 32ports {
32 name: "ENTRY" 33 name: "ENTRY"
34 display_name: "Worldport"
33 path: "Components/Warps/worldport" 35 path: "Components/Warps/worldport"
34 orientation: "west" 36 destination { x: -8.5 y: 0 z: 6 }
37 rotation: 270
35} 38}
diff --git a/data/maps/the_stormy/rooms/Nuclear Side.txtpb b/data/maps/the_stormy/rooms/Nuclear Side.txtpb index 15d393b..7704cfb 100644 --- a/data/maps/the_stormy/rooms/Nuclear Side.txtpb +++ b/data/maps/the_stormy/rooms/Nuclear Side.txtpb
@@ -1,5 +1,4 @@
1name: "Nuclear Side" 1name: "Nuclear Side"
2display_name: "Stormy"
3panels { 2panels {
4 name: "GERM" 3 name: "GERM"
5 path: "Panels/Room_1/panel_2" 4 path: "Panels/Room_1/panel_2"
diff --git a/data/maps/the_stormy/rooms/Nuclear Vestibule.txtpb b/data/maps/the_stormy/rooms/Nuclear Vestibule.txtpb index 1d9c46d..34a6715 100644 --- a/data/maps/the_stormy/rooms/Nuclear Vestibule.txtpb +++ b/data/maps/the_stormy/rooms/Nuclear Vestibule.txtpb
@@ -1,5 +1,4 @@
1name: "Nuclear Vestibule" 1name: "Nuclear Vestibule"
2display_name: "Stormy"
3panels { 2panels {
4 name: "STORM" 3 name: "STORM"
5 path: "Panels/Room 2/panel_11" 4 path: "Panels/Room 2/panel_11"
diff --git a/data/maps/the_stormy/rooms/Rain Side.txtpb b/data/maps/the_stormy/rooms/Rain Side.txtpb index cb59a6d..1babef2 100644 --- a/data/maps/the_stormy/rooms/Rain Side.txtpb +++ b/data/maps/the_stormy/rooms/Rain Side.txtpb
@@ -1,11 +1,11 @@
1name: "Rain Side" 1name: "Rain Side"
2display_name: "Stormy"
3panels { 2panels {
4 name: "CLOUD" 3 name: "CLOUD"
5 path: "Panels/Room_1/panel_4" 4 path: "Panels/Room_1/panel_4"
6 clue: "cloud" 5 clue: "cloud"
7 answer: "lightning" 6 answer: "lightning"
8 symbols: CROSS 7 symbols: CROSS
8 display_name: "CLOUD (2)"
9} 9}
10panels { 10panels {
11 name: "WIND" 11 name: "WIND"
@@ -13,4 +13,5 @@ panels {
13 clue: "wind" 13 clue: "wind"
14 answer: "whirlwind" 14 answer: "whirlwind"
15 symbols: PYRAMID 15 symbols: PYRAMID
16 display_name: "WIND (2)"
16} 17}
diff --git a/data/maps/the_stormy/rooms/Tornado Side.txtpb b/data/maps/the_stormy/rooms/Tornado Side.txtpb index d91d057..1e5ca69 100644 --- a/data/maps/the_stormy/rooms/Tornado Side.txtpb +++ b/data/maps/the_stormy/rooms/Tornado Side.txtpb
@@ -1,5 +1,4 @@
1name: "Tornado Side" 1name: "Tornado Side"
2display_name: "Stormy"
3panels { 2panels {
4 name: "PUDDLE" 3 name: "PUDDLE"
5 path: "Panels/Room_1/panel_6" 4 path: "Panels/Room_1/panel_6"
diff --git a/data/maps/the_stormy/rooms/Tornado Vestibule.txtpb b/data/maps/the_stormy/rooms/Tornado Vestibule.txtpb index 9a98c3e..e6c7e60 100644 --- a/data/maps/the_stormy/rooms/Tornado Vestibule.txtpb +++ b/data/maps/the_stormy/rooms/Tornado Vestibule.txtpb
@@ -1,5 +1,4 @@
1name: "Tornado Vestibule" 1name: "Tornado Vestibule"
2display_name: "Stormy"
3panels { 2panels {
4 name: "SHIP" 3 name: "SHIP"
5 path: "Panels/Room 2/panel_12" 4 path: "Panels/Room 2/panel_12"
diff --git a/data/maps/the_stormy/rooms/Volcano Side.txtpb b/data/maps/the_stormy/rooms/Volcano Side.txtpb index bd823d5..73c7ae4 100644 --- a/data/maps/the_stormy/rooms/Volcano Side.txtpb +++ b/data/maps/the_stormy/rooms/Volcano Side.txtpb
@@ -1,5 +1,4 @@
1name: "Volcano Side" 1name: "Volcano Side"
2display_name: "Stormy"
3panels { 2panels {
4 name: "SNOW" 3 name: "SNOW"
5 path: "Panels/Room_1/panel_1" 4 path: "Panels/Room_1/panel_1"
diff --git a/data/maps/the_stormy/rooms/X2 Room.txtpb b/data/maps/the_stormy/rooms/X2 Room.txtpb index 7d46956..3be4def 100644 --- a/data/maps/the_stormy/rooms/X2 Room.txtpb +++ b/data/maps/the_stormy/rooms/X2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "X2 Room" 1name: "X2 Room"
2display_name: "Stormy"
3letters { 2letters {
4 key: "x" 3 key: "x"
5 level2: true 4 level2: true
diff --git a/data/maps/the_sturdy/connections.txtpb b/data/maps/the_sturdy/connections.txtpb index efa67c2..341d99e 100644 --- a/data/maps/the_sturdy/connections.txtpb +++ b/data/maps/the_sturdy/connections.txtpb
@@ -3,3 +3,8 @@ connections {
3 to_room: "S2 Area" 3 to_room: "S2 Area"
4 door { name: "Color Puzzle" } 4 door { name: "Color Puzzle" }
5} 5}
6connections {
7 from_room: "Main Area"
8 to_room: "Hidden Rainbow"
9 door { name: "Hidden Rainbow" }
10}
diff --git a/data/maps/the_sturdy/doors.txtpb b/data/maps/the_sturdy/doors.txtpb index 9d37064..819f568 100644 --- a/data/maps/the_sturdy/doors.txtpb +++ b/data/maps/the_sturdy/doors.txtpb
@@ -10,3 +10,9 @@ doors {
10 panels { room: "Main Area" name: "MOVE (7)" answer: "back" } 10 panels { room: "Main Area" name: "MOVE (7)" answer: "back" }
11 panels { room: "Main Area" name: "MOVE (8)" answer: "down" } 11 panels { room: "Main Area" name: "MOVE (8)" answer: "down" }
12} 12}
13doors {
14 name: "Hidden Rainbow"
15 type: EVENT
16 panels { room: "Main Area" name: "MOVE (2)" answer: "move" }
17 panels { room: "Main Area" name: "MOVE (4)" answer: "move" }
18}
diff --git a/data/maps/the_sturdy/metadata.txtpb b/data/maps/the_sturdy/metadata.txtpb index 9f42137..bdc5a94 100644 --- a/data/maps/the_sturdy/metadata.txtpb +++ b/data/maps/the_sturdy/metadata.txtpb
@@ -1,6 +1,8 @@
1display_name: "The Sturdy" 1display_name: "The Sturdy"
2# Let's ignore the second half of the rainbow for now. 2# Let's ignore the second half of the rainbows for now.
3#excluded_nodes: "Components/Doors/Rainbow2/Hinge/rainbowMirrored" 3#excluded_nodes: "Components/Doors/Rainbow2/Hinge/rainbowMirrored"
4# I don't know why there's a second copy of the rainbow.
5#excluded_nodes: "Components/Doors/Rainbow/Hinge/rainbow"
6#excluded_nodes: "Components/Doors/Rainbow/Hinge/rainbowMirrored" 4#excluded_nodes: "Components/Doors/Rainbow/Hinge/rainbowMirrored"
5# The validator doesn't know that these node exist because they are part of a
6# sub-scene.
7custom_nodes: "Components/Doors/Rainbow/Hinge/rainbow"
8custom_nodes: "Components/Doors/Rainbow2/Hinge/rainbow"
diff --git a/data/maps/the_sturdy/rooms/Hidden Rainbow.txtpb b/data/maps/the_sturdy/rooms/Hidden Rainbow.txtpb new file mode 100644 index 0000000..215def8 --- /dev/null +++ b/data/maps/the_sturdy/rooms/Hidden Rainbow.txtpb
@@ -0,0 +1,6 @@
1name: "Hidden Rainbow"
2paintings {
3 name: "RAINBOW"
4 path: "Components/Doors/Rainbow/Hinge/rainbow"
5 enter_only: true
6}
diff --git a/data/maps/the_sturdy/rooms/Main Area.txtpb b/data/maps/the_sturdy/rooms/Main Area.txtpb index 39a425f..8c81a1e 100644 --- a/data/maps/the_sturdy/rooms/Main Area.txtpb +++ b/data/maps/the_sturdy/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Sturdy"
3panels { 2panels {
4 name: "MOVE (1)" 3 name: "MOVE (1)"
5 path: "Panels/Main/panel_1" 4 path: "Panels/Main/panel_1"
@@ -11,7 +10,7 @@ panels {
11 proxies { answer: "down" path: "Panels/Down/down_1" } 10 proxies { answer: "down" path: "Panels/Down/down_1" }
12 proxies { answer: "left" path: "Panels/Left/left_1" } 11 proxies { answer: "left" path: "Panels/Left/left_1" }
13 proxies { answer: "right" path: "Panels/Right/right_1" } 12 proxies { answer: "right" path: "Panels/Right/right_1" }
14 #proxies { answer: "move" path: "Panels/Secret/secret_1" } 13 proxies { answer: "move" path: "Panels/Secret/secret_1" }
15} 14}
16panels { 15panels {
17 name: "MOVE (2)" 16 name: "MOVE (2)"
@@ -24,7 +23,7 @@ panels {
24 proxies { answer: "down" path: "Panels/Down/down_2" } 23 proxies { answer: "down" path: "Panels/Down/down_2" }
25 proxies { answer: "left" path: "Panels/Left/left_2" } 24 proxies { answer: "left" path: "Panels/Left/left_2" }
26 proxies { answer: "right" path: "Panels/Right/right_2" } 25 proxies { answer: "right" path: "Panels/Right/right_2" }
27 #proxies { answer: "move" path: "Panels/Secret/secret_2" } 26 proxies { answer: "move" path: "Panels/Secret/secret_2" }
28} 27}
29panels { 28panels {
30 name: "MOVE (3)" 29 name: "MOVE (3)"
@@ -37,7 +36,7 @@ panels {
37 proxies { answer: "down" path: "Panels/Down/down_3" } 36 proxies { answer: "down" path: "Panels/Down/down_3" }
38 proxies { answer: "left" path: "Panels/Left/left_3" } 37 proxies { answer: "left" path: "Panels/Left/left_3" }
39 proxies { answer: "right" path: "Panels/Right/right_3" } 38 proxies { answer: "right" path: "Panels/Right/right_3" }
40 #proxies { answer: "move" path: "Panels/Secret/secret_3" } 39 proxies { answer: "move" path: "Panels/Secret/secret_3" }
41} 40}
42panels { 41panels {
43 name: "MOVE (4)" 42 name: "MOVE (4)"
@@ -50,7 +49,7 @@ panels {
50 proxies { answer: "down" path: "Panels/Down/down_4" } 49 proxies { answer: "down" path: "Panels/Down/down_4" }
51 proxies { answer: "left" path: "Panels/Left/left_4" } 50 proxies { answer: "left" path: "Panels/Left/left_4" }
52 proxies { answer: "right" path: "Panels/Right/right_4" } 51 proxies { answer: "right" path: "Panels/Right/right_4" }
53 #proxies { answer: "move" path: "Panels/Secret/secret_4" } 52 proxies { answer: "move" path: "Panels/Secret/secret_4" }
54} 53}
55panels { 54panels {
56 name: "MOVE (5)" 55 name: "MOVE (5)"
@@ -63,7 +62,7 @@ panels {
63 proxies { answer: "down" path: "Panels/Down/down_5" } 62 proxies { answer: "down" path: "Panels/Down/down_5" }
64 proxies { answer: "left" path: "Panels/Left/left_5" } 63 proxies { answer: "left" path: "Panels/Left/left_5" }
65 proxies { answer: "right" path: "Panels/Right/right_5" } 64 proxies { answer: "right" path: "Panels/Right/right_5" }
66 #proxies { answer: "move" path: "Panels/Secret/secret_5" } 65 proxies { answer: "move" path: "Panels/Secret/secret_5" }
67} 66}
68panels { 67panels {
69 name: "MOVE (6)" 68 name: "MOVE (6)"
@@ -76,7 +75,7 @@ panels {
76 proxies { answer: "down" path: "Panels/Down/down_6" } 75 proxies { answer: "down" path: "Panels/Down/down_6" }
77 proxies { answer: "left" path: "Panels/Left/left_6" } 76 proxies { answer: "left" path: "Panels/Left/left_6" }
78 proxies { answer: "right" path: "Panels/Right/right_6" } 77 proxies { answer: "right" path: "Panels/Right/right_6" }
79 #proxies { answer: "move" path: "Panels/Secret/secret_6" } 78 proxies { answer: "move" path: "Panels/Secret/secret_6" }
80} 79}
81panels { 80panels {
82 name: "MOVE (7)" 81 name: "MOVE (7)"
@@ -89,7 +88,7 @@ panels {
89 proxies { answer: "down" path: "Panels/Down/down_7" } 88 proxies { answer: "down" path: "Panels/Down/down_7" }
90 proxies { answer: "left" path: "Panels/Left/left_7" } 89 proxies { answer: "left" path: "Panels/Left/left_7" }
91 proxies { answer: "right" path: "Panels/Right/right_7" } 90 proxies { answer: "right" path: "Panels/Right/right_7" }
92 #proxies { answer: "move" path: "Panels/Secret/secret_7" } 91 proxies { answer: "move" path: "Panels/Secret/secret_7" }
93} 92}
94panels { 93panels {
95 name: "MOVE (8)" 94 name: "MOVE (8)"
@@ -102,13 +101,19 @@ panels {
102 proxies { answer: "down" path: "Panels/Down/down_8" } 101 proxies { answer: "down" path: "Panels/Down/down_8" }
103 proxies { answer: "left" path: "Panels/Left/left_8" } 102 proxies { answer: "left" path: "Panels/Left/left_8" }
104 proxies { answer: "right" path: "Panels/Right/right_8" } 103 proxies { answer: "right" path: "Panels/Right/right_8" }
105 #proxies { answer: "move" path: "Panels/Secret/secret_8" } 104 proxies { answer: "move" path: "Panels/Secret/secret_8" }
106} 105}
107ports { 106ports {
108 name: "OWL" 107 name: "OWL"
108 display_name: "Magenta Hallway"
109 path: "Components/Warps/worldport" 109 path: "Components/Warps/worldport"
110 destination { x: 17 y: 0 z: 41 }
111 rotation: 90
110} 112}
111ports { 113ports {
112 name: "COLORFUL" 114 name: "COLORFUL"
115 display_name: "Cyan Hallway"
113 path: "Components/Warps/worldport2" 116 path: "Components/Warps/worldport2"
117 destination { x: 17 y: 0 z: -33 }
118 rotation: 90
114} 119}
diff --git a/data/maps/the_sturdy/rooms/S2 Area.txtpb b/data/maps/the_sturdy/rooms/S2 Area.txtpb index 118b914..745f78f 100644 --- a/data/maps/the_sturdy/rooms/S2 Area.txtpb +++ b/data/maps/the_sturdy/rooms/S2 Area.txtpb
@@ -1,5 +1,4 @@
1name: "S2 Area" 1name: "S2 Area"
2display_name: "Sturdy"
3panels { 2panels {
4 name: "COLORS" 3 name: "COLORS"
5 path: "Panels/Rainbow/panel_1" 4 path: "Panels/Rainbow/panel_1"
@@ -13,9 +12,7 @@ letters {
13 path: "Components/Collectables/collectable" 12 path: "Components/Collectables/collectable"
14} 13}
15paintings { 14paintings {
16 name: "RAINBOW" 15 name: "RAINBOW2"
17 # The validator is wrong about this node not existing, because it's in a
18 # sub-scene.
19 path: "Components/Doors/Rainbow2/Hinge/rainbow" 16 path: "Components/Doors/Rainbow2/Hinge/rainbow"
20 enter_only: true 17 enter_only: true
21} 18}
diff --git a/data/maps/the_sun_temple/connections.txtpb b/data/maps/the_sun_temple/connections.txtpb index b0b3a0a..ffe4d5d 100644 --- a/data/maps/the_sun_temple/connections.txtpb +++ b/data/maps/the_sun_temple/connections.txtpb
@@ -7,6 +7,7 @@ connections {
7 from_room: "Temple" 7 from_room: "Temple"
8 to_room: "Ending" 8 to_room: "Ending"
9 door { name: "Ending" } 9 door { name: "Ending" }
10 purple_ending: true
10} 11}
11connections { 12connections {
12 from_room: "Temple" 13 from_room: "Temple"
diff --git a/data/maps/the_sun_temple/metadata.txtpb b/data/maps/the_sun_temple/metadata.txtpb index 97f9290..25ed636 100644 --- a/data/maps/the_sun_temple/metadata.txtpb +++ b/data/maps/the_sun_temple/metadata.txtpb
@@ -1 +1,5 @@
1display_name: "The Sun Temple" 1display_name: "The Sun Temple"
2worldport_entrance {
3 room: "Entrance"
4 name: "UNKEMPT"
5}
diff --git a/data/maps/the_sun_temple/rooms/Ending.txtpb b/data/maps/the_sun_temple/rooms/Ending.txtpb index a94e606..975374a 100644 --- a/data/maps/the_sun_temple/rooms/Ending.txtpb +++ b/data/maps/the_sun_temple/rooms/Ending.txtpb
@@ -1,5 +1,4 @@
1name: "Ending" 1name: "Ending"
2display_name: "Sun Temple"
3endings { 2endings {
4 name: "PURPLE" 3 name: "PURPLE"
5 path: "Components/purple_ending" 4 path: "Components/purple_ending"
diff --git a/data/maps/the_sun_temple/rooms/Entrance.txtpb b/data/maps/the_sun_temple/rooms/Entrance.txtpb index 0b2a0bd..07d6e38 100644 --- a/data/maps/the_sun_temple/rooms/Entrance.txtpb +++ b/data/maps/the_sun_temple/rooms/Entrance.txtpb
@@ -1,14 +1,16 @@
1name: "Entrance" 1name: "Entrance"
2display_name: "Sun Temple"
3panels { 2panels {
4 name: "SUN" 3 name: "SUN"
5 path: "Panels/Main/panel_1" 4 path: "Panels/Main/panel_1"
6 clue: "sun" 5 clue: "sun"
7 answer: "sun" 6 answer: "sun"
8 #proxies { answer: "sun" path: "Panels/Sun/panel_8" } 7 proxies { answer: "sun" path: "Panels/Sun/panel_8" }
9 proxies { answer: "moon" path: "Panels/Moon/panel_15" } 8 proxies { answer: "moon" path: "Panels/Moon/panel_15" }
10} 9}
11ports { 10ports {
12 name: "UNKEMPT" 11 name: "UNKEMPT"
12 display_name: "Entrance"
13 path: "Components/Warps/worldport" 13 path: "Components/Warps/worldport"
14 destination { x: 0 y: 0 z: 13 }
15 rotation: 0
14} 16}
diff --git a/data/maps/the_sun_temple/rooms/Mastery.txtpb b/data/maps/the_sun_temple/rooms/Mastery.txtpb index b416a9a..bbe8742 100644 --- a/data/maps/the_sun_temple/rooms/Mastery.txtpb +++ b/data/maps/the_sun_temple/rooms/Mastery.txtpb
@@ -1,5 +1,4 @@
1name: "Mastery" 1name: "Mastery"
2display_name: "Sun Temple"
3masteries { 2masteries {
4 name: "MASTERY" 3 name: "MASTERY"
5 path: "Components/Collectables/collectable" 4 path: "Components/Collectables/collectable"
diff --git a/data/maps/the_sun_temple/rooms/Temple.txtpb b/data/maps/the_sun_temple/rooms/Temple.txtpb index 6281584..4f39737 100644 --- a/data/maps/the_sun_temple/rooms/Temple.txtpb +++ b/data/maps/the_sun_temple/rooms/Temple.txtpb
@@ -1,12 +1,11 @@
1name: "Temple" 1name: "Temple"
2display_name: "Sun Temple"
3panels { 2panels {
4 name: "DELAY" 3 name: "DELAY"
5 path: "Panels/Main/panel_2" 4 path: "Panels/Main/panel_2"
6 clue: "delay" 5 clue: "delay"
7 answer: "day" 6 answer: "day"
8 symbols: SPARKLES 7 symbols: SPARKLES
9 #proxies { answer: "day" path: "Panels/Sun/panel_9" } 8 proxies { answer: "day" path: "Panels/Sun/panel_9" }
10 proxies { answer: "night" path: "Panels/Moon/panel_16" } 9 proxies { answer: "night" path: "Panels/Moon/panel_16" }
11} 10}
12panels { 11panels {
@@ -15,7 +14,7 @@ panels {
15 clue: "lawn" 14 clue: "lawn"
16 answer: "dawn" 15 answer: "dawn"
17 symbols: SPARKLES 16 symbols: SPARKLES
18 #proxies { answer: "dawn" path: "Panels/Sun/panel_10" } 17 proxies { answer: "dawn" path: "Panels/Sun/panel_10" }
19 proxies { answer: "dusk" path: "Panels/Moon/panel_17" } 18 proxies { answer: "dusk" path: "Panels/Moon/panel_17" }
20} 19}
21panels { 20panels {
@@ -24,7 +23,7 @@ panels {
24 clue: "jump" 23 clue: "jump"
25 answer: "spring" 24 answer: "spring"
26 symbols: SUN 25 symbols: SUN
27 #proxies { answer: "spring" path: "Panels/Sun/panel_11" } 26 proxies { answer: "spring" path: "Panels/Sun/panel_11" }
28 proxies { answer: "autumn" path: "Panels/Moon/panel_18" } 27 proxies { answer: "autumn" path: "Panels/Moon/panel_18" }
29} 28}
30panels { 29panels {
@@ -33,7 +32,7 @@ panels {
33 clue: "heavy" 32 clue: "heavy"
34 answer: "light" 33 answer: "light"
35 symbols: SUN 34 symbols: SUN
36 #proxies { answer: "light" path: "Panels/Sun/panel_12" } 35 proxies { answer: "light" path: "Panels/Sun/panel_12" }
37 proxies { answer: "dark" path: "Panels/Moon/panel_19" } 36 proxies { answer: "dark" path: "Panels/Moon/panel_19" }
38} 37}
39panels { 38panels {
@@ -42,7 +41,7 @@ panels {
42 clue: "knife" 41 clue: "knife"
43 answer: "life" 42 answer: "life"
44 symbols: ZERO 43 symbols: ZERO
45 #proxies { answer: "life" path: "Panels/Sun/panel_13" } 44 proxies { answer: "life" path: "Panels/Sun/panel_13" }
46 proxies { answer: "death" path: "Panels/Moon/panel_20" } 45 proxies { answer: "death" path: "Panels/Moon/panel_20" }
47} 46}
48panels { 47panels {
@@ -51,7 +50,7 @@ panels {
51 clue: "arm" 50 clue: "arm"
52 answer: "warmth" 51 answer: "warmth"
53 symbols: SPARKLES 52 symbols: SPARKLES
54 #proxies { answer: "warmth" path: "Panels/Sun/panel_14" } 53 proxies { answer: "warmth" path: "Panels/Sun/panel_14" }
55 proxies { answer: "chill" path: "Panels/Moon/panel_21" } 54 proxies { answer: "chill" path: "Panels/Moon/panel_21" }
56} 55}
57panels { 56panels {
@@ -60,5 +59,5 @@ panels {
60 clue: "equinox" 59 clue: "equinox"
61 answer: "equinox" 60 answer: "equinox"
62 proxies { answer: "solstice" path: "Panels/End/panel_23" } 61 proxies { answer: "solstice" path: "Panels/End/panel_23" }
63 #proxies { answer: "equinox" path: "Panels/End/panel_24" } 62 proxies { answer: "equinox" path: "Panels/End/panel_24" }
64} 63}
diff --git a/data/maps/the_sweet/rooms/Main Area.txtpb b/data/maps/the_sweet/rooms/Main Area.txtpb index b72b6d4..a8976f7 100644 --- a/data/maps/the_sweet/rooms/Main Area.txtpb +++ b/data/maps/the_sweet/rooms/Main Area.txtpb
@@ -1,5 +1,4 @@
1name: "Main Area" 1name: "Main Area"
2display_name: "Sweet"
3panels { 2panels {
4 name: "POTATO" 3 name: "POTATO"
5 path: "Panels/Sweetening Room/panel_1" 4 path: "Panels/Sweetening Room/panel_1"
@@ -201,9 +200,15 @@ panels {
201} 200}
202ports { 201ports {
203 name: "EXIT1" 202 name: "EXIT1"
203 display_name: "South Worldport"
204 path: "Components/Warps/worldport" 204 path: "Components/Warps/worldport"
205 destination { x: 0 y: 0 z: -11.5 }
206 rotation: 180
205} 207}
206ports { 208ports {
207 name: "EXIT2" 209 name: "EXIT2"
210 display_name: "North Worldport"
208 path: "Components/Warps/worldport2" 211 path: "Components/Warps/worldport2"
212 destination { x: 0 y: 0 z: -17.5 }
213 rotation: 0
209} 214}
diff --git a/data/maps/the_sweet/rooms/Y2 Room.txtpb b/data/maps/the_sweet/rooms/Y2 Room.txtpb index 4da87f3..d448f57 100644 --- a/data/maps/the_sweet/rooms/Y2 Room.txtpb +++ b/data/maps/the_sweet/rooms/Y2 Room.txtpb
@@ -1,5 +1,4 @@
1name: "Y2 Room" 1name: "Y2 Room"
2display_name: "Sweet"
3letters { 2letters {
4 key: "y" 3 key: "y"
5 level2: true 4 level2: true
diff --git a/data/maps/the_symbolic/connections.txtpb b/data/maps/the_symbolic/connections.txtpb new file mode 100644 index 0000000..d9d2536 --- /dev/null +++ b/data/maps/the_symbolic/connections.txtpb
@@ -0,0 +1,110 @@
1connections {
2 from_room: "White Room"
3 to_room: "Black Room"
4 door { name: "White Door" }
5}
6connections {
7 from_room: "Black Room"
8 to_room: "Red Room"
9 door { name: "Black Door" }
10}
11connections {
12 from_room: "Red Room"
13 to_room: "Blue Room"
14 door { name: "Red Door" }
15}
16connections {
17 from_room: "Blue Room"
18 to_room: "Green Room"
19 door { name: "Blue Door" }
20}
21connections {
22 from_room: "Green Room"
23 to_room: "Yellow Room"
24 door { name: "Green Door" }
25}
26connections {
27 from_room: "Yellow Room"
28 to_room: "Purple Room"
29 door { name: "Yellow Door" }
30}
31connections {
32 from_room: "Purple Room"
33 to_room: "Orange Room"
34 door { name: "Purple Door" }
35}
36connections {
37 from_room: "Orange Room"
38 to_room: "Tutorial"
39 door { name: "Orange Door" }
40}
41connections {
42 from_room: "Tutorial"
43 to_room: "Red Blue Room"
44 door { name: "Tutorial Door" }
45}
46connections {
47 from_room: "Red Blue Room"
48 to_room: "Main Area"
49 door { name: "Main Area Entrance" }
50}
51connections {
52 from_room: "Red Blue Room"
53 to_room: "Whirred Room"
54 door { name: "Whirred Room Entrance" }
55}
56connections {
57 from_room: "Red Blue Room"
58 to_room: "Poetry Room 1"
59 door { name: "Poetry Room Entrance" }
60}
61connections {
62 from_room: "Poetry Room 1"
63 to_room: "Poetry Room 2"
64 door { name: "Poetry Room Door 1" }
65}
66connections {
67 from_room: "Poetry Room 2"
68 to_room: "Poetry Room 3"
69 door { name: "Poetry Room Door 2" }
70}
71connections {
72 from_room: "Poetry Room 3"
73 to_room: "Poetry Room Left"
74 door { name: "Poetry Room Left" }
75}
76connections {
77 from_room: "Poetry Room Left"
78 to_room: "Poetry Room Left Left"
79 door { name: "Poetry Room Left Left" }
80}
81connections {
82 from_room: "Poetry Room Left"
83 to_room: "Poetry Room Left Right"
84 door { name: "Poetry Room Left Right" }
85}
86connections {
87 from_room: "Poetry Room 3"
88 to_room: "Poetry Room Right"
89 door { name: "Poetry Room Right" }
90}
91connections {
92 from_room: "Poetry Room Right"
93 to_room: "Poetry Room Right Left"
94 door { name: "Poetry Room Right Left" }
95}
96connections {
97 from_room: "Poetry Room Right"
98 to_room: "Poetry Room Right Right"
99 door { name: "Poetry Room Right Right" }
100}
101connections {
102 from_room: "Main Area"
103 to_room: "Last Room"
104 door { name: "Main Area Exit" }
105}
106connections {
107 from_room: "Last Room"
108 to_room: "Mastery"
109 door { name: "Mastery" }
110}
diff --git a/data/maps/the_symbolic/doors.txtpb b/data/maps/the_symbolic/doors.txtpb new file mode 100644 index 0000000..7728e0d --- /dev/null +++ b/data/maps/the_symbolic/doors.txtpb
@@ -0,0 +1,392 @@
1doors {
2 name: "White Door"
3 type: EVENT
4 #receivers: "Components/Doors/Door18"
5 panels { room: "White Room" name: "WRITE" }
6}
7doors {
8 name: "Black Door"
9 type: EVENT
10 #receivers: "Components/Doors/Door19"
11 panels { room: "Black Room" name: "HERE" }
12}
13doors {
14 name: "Red Door"
15 type: EVENT
16 #receivers: "Components/Doors/Door20"
17 panels { room: "Red Room" name: "SYNONYM" }
18}
19doors {
20 name: "Blue Door"
21 type: EVENT
22 #receivers: "Components/Doors/Door21"
23 panels { room: "Blue Room" name: "DEPLETE" }
24}
25doors {
26 name: "Green Door"
27 type: EVENT
28 #receivers: "Components/Doors/Door22"
29 panels { room: "Green Room" name: "INERT" }
30}
31doors {
32 name: "Yellow Door"
33 type: EVENT
34 #receivers: "Components/Doors/Door23"
35 panels { room: "Yellow Room" name: "WHOLE" }
36}
37doors {
38 name: "Purple Door"
39 type: EVENT
40 #receivers: "Components/Doors/Door24"
41 panels { room: "Purple Room" name: "TIME" }
42}
43doors {
44 name: "Orange Door"
45 type: EVENT
46 #receivers: "Components/Doors/Door25"
47 panels { room: "Orange Room" name: "YOUNG" }
48}
49doors {
50 name: "Tutorial Door"
51 type: ITEM_ONLY
52 receivers: "Components/Doors/Door"
53 panels { room: "Tutorial" name: "<- (1)" }
54 panels { room: "Tutorial" name: "<- (2)" }
55 panels { room: "Tutorial" name: "<- (3)" }
56}
57doors {
58 name: "Tutorial Panels"
59 type: LOCATION_ONLY
60 panels { room: "Tutorial" name: "SAY" }
61 panels { room: "Tutorial" name: "HIGH" }
62 panels { room: "Tutorial" name: "<- (1)" }
63 panels { room: "Tutorial" name: "<- (2)" }
64 panels { room: "Tutorial" name: "<- (3)" }
65 panels { room: "Tutorial" name: "THIS" }
66 panels { room: "Tutorial" name: "WRITE" }
67 panels { room: "Tutorial" name: "TYPE" }
68 panels { room: "Tutorial" name: "SAME" }
69 location_room: "Tutorial"
70}
71doors {
72 name: "Main Area Entrance"
73 type: EVENT
74 panels { room: "Red Blue Room" name: "RIGHTWARD" answer: "word" }
75 panels { room: "Red Blue Room" name: "TYPEWRITING" answer: "writing" }
76}
77doors {
78 name: "Whirred Room Entrance"
79 type: EVENT
80 panels { room: "Red Blue Room" name: "RIGHTWARD" answer: "whirred" }
81}
82doors {
83 name: "Whirred Room Panels"
84 type: LOCATION_ONLY
85 panels { room: "Whirred Room" name: "TAIPEI" }
86 panels { room: "Whirred Room" name: "NAYSAYER" }
87 panels { room: "Whirred Room" name: "NAY" }
88 panels { room: "Whirred Room" name: "INDEX (1)" }
89 panels { room: "Whirred Room" name: "INDEX (2)" }
90 location_room: "Whirred Room"
91}
92doors {
93 name: "Poetry Room Entrance"
94 type: EVENT
95 panels { room: "Red Blue Room" name: "TYPEWRITING" answer: "poetry" }
96}
97doors {
98 name: "Poetry Room Door 1"
99 type: EVENT
100 panels { room: "Poetry Room 1" name: "ABSORBED" answer: "bed" }
101 panels { room: "Poetry Room 1" name: "PRIMORDIAL" answer: "prim" }
102 # It has to be the middle two strips of the door.
103}
104doors {
105 name: "Poetry Room Door 2"
106 type: EVENT
107 panels { room: "Poetry Room 2" name: "NOT THERE" }
108}
109doors {
110 name: "Poetry Room Left"
111 type: EVENT
112 panels { room: "Poetry Room 3" name: "NOT PRETTY" answer: "ugly" }
113}
114doors {
115 name: "Poetry Room Right"
116 type: EVENT
117 panels { room: "Poetry Room 3" name: "NOT PRETTY" answer: "prey" }
118}
119doors {
120 name: "Poetry Room Left Left"
121 type: EVENT
122 panels { room: "Poetry Room Left" name: "NOT TRUE" answer: "false" }
123}
124doors {
125 name: "Poetry Room Left Right"
126 type: EVENT
127 panels { room: "Poetry Room Left" name: "NOT TRUE" answer: "rue" }
128}
129doors {
130 name: "Poetry Room Right Left"
131 type: EVENT
132 panels { room: "Poetry Room Right" name: "NOT BETTER" answer: "worse" }
133}
134doors {
135 name: "Poetry Room Right Right"
136 type: EVENT
137 panels { room: "Poetry Room Right" name: "NOT BETTER" answer: "beer" }
138}
139doors {
140 name: "Poetry Room Panels"
141 type: LOCATION_ONLY
142 panels { room: "Poetry Room 2" name: "NOT" }
143 panels { room: "Poetry Room 2" name: "THERE" }
144 panels { room: "Poetry Room 2" name: "NOT THERE" }
145 panels { room: "Poetry Room 3" name: "NOT" }
146 panels { room: "Poetry Room 3" name: "PRETTY" }
147 panels { room: "Poetry Room Left" name: "NOT" }
148 panels { room: "Poetry Room Left" name: "TRUE" }
149 panels { room: "Poetry Room Left Left" name: "NOT (1)" }
150 panels { room: "Poetry Room Left Left" name: "NOT (2)" }
151 panels { room: "Poetry Room Left Left" name: "LEFT" }
152 panels { room: "Poetry Room Left Left" name: "NOT NOT LEFT" }
153 panels { room: "Poetry Room Left Right" name: "NOT (1)" }
154 panels { room: "Poetry Room Left Right" name: "NOT (2)" }
155 panels { room: "Poetry Room Left Right" name: "MISS" }
156 panels { room: "Poetry Room Left Right" name: "NOT NOT MISS" }
157 panels { room: "Poetry Room Right" name: "NOT" }
158 panels { room: "Poetry Room Right" name: "BETTER" }
159 panels { room: "Poetry Room Right Left" name: "NOT (1)" }
160 panels { room: "Poetry Room Right Left" name: "NOT (2)" }
161 panels { room: "Poetry Room Right Left" name: "TABLET" }
162 panels { room: "Poetry Room Right Left" name: "NOT NOT TABLET" }
163 panels { room: "Poetry Room Right Right" name: "NOT (1)" }
164 panels { room: "Poetry Room Right Right" name: "NOT (2)" }
165 panels { room: "Poetry Room Right Right" name: "NOT (3)" }
166 panels { room: "Poetry Room Right Right" name: "NOT NOT NOT" }
167 location_room: "Poetry Room Right Right"
168}
169doors {
170 name: "Main Area First Row"
171 type: LOCATION_ONLY
172 panels { room: "Main Area" name: "JUSTICE" }
173 panels { room: "Main Area" name: "NOTICE (1)" }
174 panels { room: "Main Area" name: "NOTICE (2)" }
175 panels { room: "Main Area" name: "NOTICE (3)" }
176 panels { room: "Main Area" name: "UNABLE (1)" }
177 panels { room: "Main Area" name: "UNABLE (2)" }
178 location_room: "Main Area"
179}
180doors {
181 name: "Main Area Second Row"
182 type: LOCATION_ONLY
183 panels { room: "Main Area" name: "LINEARLY" }
184 panels { room: "Main Area" name: "SADDLED" }
185 panels { room: "Main Area" name: "PADDING" }
186 panels { room: "Main Area" name: "BRINGING" }
187 panels { room: "Main Area" name: "THOUSANDS" }
188 panels { room: "Main Area" name: "REINDICT" }
189 panels { room: "Main Area" name: "LINEAGE" }
190 panels { room: "Main Area" name: "TINCTURE" }
191 panels { room: "Main Area" name: "IMMATURE" }
192 panels { room: "Main Area" name: "THING" }
193 location_room: "Main Area"
194}
195doors {
196 name: "Main Area Third Row"
197 type: LOCATION_ONLY
198 panels { room: "Main Area" name: "SOME" }
199 panels { room: "Main Area" name: "HALFTIME (1)" }
200 panels { room: "Main Area" name: "HALFTIME (2)" }
201 panels { room: "Main Area" name: "QUARTERBACK" }
202 panels { room: "Main Area" name: "NORTHERN" }
203 panels { room: "Main Area" name: "INMATE" }
204 panels { room: "Main Area" name: "NOTCHES" }
205 panels { room: "Main Area" name: "VIOLET (1)" }
206 panels { room: "Main Area" name: "VIOLET (2)" }
207 panels { room: "Main Area" name: "NONSENSE" }
208 panels { room: "Main Area" name: "DISTANT" }
209 panels { room: "Main Area" name: "TIGHT (1)" }
210 panels { room: "Main Area" name: "TIGHT (2)" }
211 panels { room: "Main Area" name: "DISCARD" }
212 panels { room: "Main Area" name: "PASSPORT" }
213 panels { room: "Main Area" name: "PORT" }
214 panels { room: "Main Area" name: "STORMS" }
215 panels { room: "Main Area" name: "MS" }
216 location_room: "Main Area"
217}
218doors {
219 name: "Main Area Fourth Row"
220 type: LOCATION_ONLY
221 panels { room: "Main Area" name: "SOUNDBITE" }
222 panels { room: "Main Area" name: "BORED" }
223 panels { room: "Main Area" name: "VOCALIZE" }
224 panels { room: "Main Area" name: "VOICEMAIL" }
225 panels { room: "Main Area" name: "MIXTURE" }
226 panels { room: "Main Area" name: "PEAT" }
227 panels { room: "Main Area" name: "SHUFFLEBOARD" }
228 panels { room: "Main Area" name: "BLENDING" }
229 panels { room: "Main Area" name: "FLIPPER" }
230 panels { room: "Main Area" name: "PANT" }
231 panels { room: "Main Area" name: "BACKFIRES" }
232 panels { room: "Main Area" name: "DRAW" }
233 panels { room: "Main Area" name: "OLDTIMER" }
234 panels { room: "Main Area" name: "EMULATE" }
235 panels { room: "Main Area" name: "CHICKEN" }
236 panels { room: "Main Area" name: "PLUMAGED" }
237 panels { room: "Main Area" name: "BOY (1)" }
238 panels { room: "Main Area" name: "BOY (2)" }
239 location_room: "Main Area"
240}
241doors {
242 name: "Main Area Fifth Row"
243 type: LOCATION_ONLY
244 panels { room: "Main Area" name: "SAGE" }
245 panels { room: "Main Area" name: "LIKEABLE" }
246 panels { room: "Main Area" name: "MEANINGFULLY" }
247 panels { room: "Main Area" name: "MORE" }
248 panels { room: "Main Area" name: "MOUTHPIECE" }
249 panels { room: "Main Area" name: "RAMPART" }
250 panels { room: "Main Area" name: "INJURY" }
251 panels { room: "Main Area" name: "NUMERATOR" }
252 panels { room: "Main Area" name: "TYPEWRITING" }
253 panels { room: "Main Area" name: "WHIRRED" }
254 panels { room: "Main Area" name: "BOOMBOX" }
255 panels { room: "Main Area" name: "STEREO" }
256 panels { room: "Main Area" name: "KINDRED" }
257 panels { room: "Main Area" name: "GEM" }
258 panels { room: "Main Area" name: "GEIGER" }
259 panels { room: "Main Area" name: "COUNTER" }
260 panels { room: "Main Area" name: "HORSEMAN" }
261 panels { room: "Main Area" name: "RATHER" }
262 panels { room: "Main Area" name: "DEAR" }
263 panels { room: "Main Area" name: "COWBOY" }
264 panels { room: "Main Area" name: "HEIFER" }
265 panels { room: "Main Area" name: "ANYMORE" }
266 panels { room: "Main Area" name: "LIKE" }
267 panels { room: "Main Area" name: "NEEDLESS" }
268 panels { room: "Main Area" name: "RESTLESS" }
269 location_room: "Main Area"
270}
271doors {
272 name: "Main Area Exit"
273 type: EVENT
274 # The game logic here requires you to solve every panel on the map, EXCEPT:
275 # 1) The four panels past the door, and
276 # 2) Any panel that has a proxy.
277 panels { room: "Main Area" name: "JUSTICE" }
278 panels { room: "Main Area" name: "NOTICE (1)" }
279 panels { room: "Main Area" name: "NOTICE (2)" }
280 panels { room: "Main Area" name: "NOTICE (3)" }
281 panels { room: "Main Area" name: "UNABLE (1)" }
282 panels { room: "Main Area" name: "UNABLE (2)" }
283 panels { room: "Main Area" name: "LINEARLY" }
284 panels { room: "Main Area" name: "SADDLED" }
285 panels { room: "Main Area" name: "PADDING" }
286 panels { room: "Main Area" name: "BRINGING" }
287 panels { room: "Main Area" name: "THOUSANDS" }
288 panels { room: "Main Area" name: "REINDICT" }
289 panels { room: "Main Area" name: "LINEAGE" }
290 panels { room: "Main Area" name: "TINCTURE" }
291 panels { room: "Main Area" name: "IMMATURE" }
292 panels { room: "Main Area" name: "THING" }
293 panels { room: "Main Area" name: "SOME" }
294 panels { room: "Main Area" name: "HALFTIME (1)" }
295 panels { room: "Main Area" name: "HALFTIME (2)" }
296 panels { room: "Main Area" name: "QUARTERBACK" }
297 panels { room: "Main Area" name: "NORTHERN" }
298 panels { room: "Main Area" name: "INMATE" }
299 panels { room: "Main Area" name: "NOTCHES" }
300 panels { room: "Main Area" name: "VIOLET (1)" }
301 panels { room: "Main Area" name: "VIOLET (2)" }
302 panels { room: "Main Area" name: "NONSENSE" }
303 panels { room: "Main Area" name: "DISTANT" }
304 panels { room: "Main Area" name: "TIGHT (1)" }
305 panels { room: "Main Area" name: "TIGHT (2)" }
306 panels { room: "Main Area" name: "DISCARD" }
307 panels { room: "Main Area" name: "PASSPORT" }
308 panels { room: "Main Area" name: "PORT" }
309 panels { room: "Main Area" name: "STORMS" }
310 panels { room: "Main Area" name: "MS" }
311 panels { room: "Main Area" name: "SOUNDBITE" }
312 panels { room: "Main Area" name: "BORED" }
313 panels { room: "Main Area" name: "VOCALIZE" }
314 panels { room: "Main Area" name: "VOICEMAIL" }
315 panels { room: "Main Area" name: "MIXTURE" }
316 panels { room: "Main Area" name: "PEAT" }
317 panels { room: "Main Area" name: "SHUFFLEBOARD" }
318 panels { room: "Main Area" name: "BLENDING" }
319 panels { room: "Main Area" name: "FLIPPER" }
320 panels { room: "Main Area" name: "PANT" }
321 panels { room: "Main Area" name: "BACKFIRES" }
322 panels { room: "Main Area" name: "DRAW" }
323 panels { room: "Main Area" name: "OLDTIMER" }
324 panels { room: "Main Area" name: "EMULATE" }
325 panels { room: "Main Area" name: "CHICKEN" }
326 panels { room: "Main Area" name: "PLUMAGED" }
327 panels { room: "Main Area" name: "BOY (1)" }
328 panels { room: "Main Area" name: "BOY (2)" }
329 panels { room: "Main Area" name: "SAGE" }
330 panels { room: "Main Area" name: "LIKEABLE" }
331 panels { room: "Main Area" name: "MEANINGFULLY" }
332 panels { room: "Main Area" name: "MORE" }
333 panels { room: "Main Area" name: "MOUTHPIECE" }
334 panels { room: "Main Area" name: "RAMPART" }
335 panels { room: "Main Area" name: "INJURY" }
336 panels { room: "Main Area" name: "NUMERATOR" }
337 panels { room: "Main Area" name: "TYPEWRITING" }
338 panels { room: "Main Area" name: "WHIRRED" }
339 panels { room: "Main Area" name: "BOOMBOX" }
340 panels { room: "Main Area" name: "STEREO" }
341 panels { room: "Main Area" name: "KINDRED" }
342 panels { room: "Main Area" name: "GEM" }
343 panels { room: "Main Area" name: "GEIGER" }
344 panels { room: "Main Area" name: "COUNTER" }
345 panels { room: "Main Area" name: "HORSEMAN" }
346 panels { room: "Main Area" name: "RATHER" }
347 panels { room: "Main Area" name: "DEAR" }
348 panels { room: "Main Area" name: "COWBOY" }
349 panels { room: "Main Area" name: "HEIFER" }
350 panels { room: "Main Area" name: "ANYMORE" }
351 panels { room: "Main Area" name: "LIKE" }
352 panels { room: "Main Area" name: "NEEDLESS" }
353 panels { room: "Main Area" name: "RESTLESS" }
354 panels { room: "Poetry Room 2" name: "NOT" }
355 panels { room: "Poetry Room 2" name: "THERE" }
356 panels { room: "Poetry Room 2" name: "NOT THERE" }
357 panels { room: "Poetry Room 3" name: "NOT" }
358 panels { room: "Poetry Room 3" name: "PRETTY" }
359 panels { room: "Poetry Room Left" name: "NOT" }
360 panels { room: "Poetry Room Left" name: "TRUE" }
361 panels { room: "Poetry Room Left Left" name: "NOT (1)" }
362 panels { room: "Poetry Room Left Left" name: "NOT (2)" }
363 panels { room: "Poetry Room Left Left" name: "LEFT" }
364 panels { room: "Poetry Room Left Left" name: "NOT NOT LEFT" }
365 panels { room: "Poetry Room Left Right" name: "NOT (1)" }
366 panels { room: "Poetry Room Left Right" name: "NOT (2)" }
367 panels { room: "Poetry Room Left Right" name: "MISS" }
368 panels { room: "Poetry Room Left Right" name: "NOT NOT MISS" }
369 panels { room: "Poetry Room Right" name: "NOT" }
370 panels { room: "Poetry Room Right" name: "BETTER" }
371 panels { room: "Poetry Room Right Left" name: "NOT (1)" }
372 panels { room: "Poetry Room Right Left" name: "NOT (2)" }
373 panels { room: "Poetry Room Right Left" name: "TABLET" }
374 panels { room: "Poetry Room Right Left" name: "NOT NOT TABLET" }
375 panels { room: "Poetry Room Right Right" name: "NOT (1)" }
376 panels { room: "Poetry Room Right Right" name: "NOT (2)" }
377 panels { room: "Poetry Room Right Right" name: "NOT (3)" }
378 panels { room: "Poetry Room Right Right" name: "NOT NOT NOT" }
379 panels { room: "Whirred Room" name: "TAIPEI" }
380 panels { room: "Whirred Room" name: "NAYSAYER" }
381 panels { room: "Whirred Room" name: "NAY" }
382 panels { room: "Whirred Room" name: "INDEX (1)" }
383 panels { room: "Whirred Room" name: "INDEX (2)" }
384}
385doors {
386 name: "Mastery"
387 type: EVENT
388 panels { room: "Last Room" name: "BLEAT" }
389 panels { room: "Last Room" name: "JARGON" }
390 panels { room: "Last Room" name: "JARGON BLEAT" }
391 panels { room: "Last Room" name: "BRAG" }
392}
diff --git a/data/maps/the_symbolic/metadata.txtpb b/data/maps/the_symbolic/metadata.txtpb new file mode 100644 index 0000000..2b37985 --- /dev/null +++ b/data/maps/the_symbolic/metadata.txtpb
@@ -0,0 +1,5 @@
1display_name: "The Symbolic"
2worldport_entrance {
3 room: "White Room"
4 name: "PLAZA"
5}
diff --git a/data/maps/the_symbolic/rooms/Black Room.txtpb b/data/maps/the_symbolic/rooms/Black Room.txtpb new file mode 100644 index 0000000..2fe96ec --- /dev/null +++ b/data/maps/the_symbolic/rooms/Black Room.txtpb
@@ -0,0 +1,8 @@
1name: "Black Room"
2panels {
3 name: "HERE"
4 path: "Panels/Prequel/panel_3"
5 clue: "here"
6 answer: "hear"
7 symbols: ZERO
8}
diff --git a/data/maps/the_symbolic/rooms/Blue Room.txtpb b/data/maps/the_symbolic/rooms/Blue Room.txtpb new file mode 100644 index 0000000..498349a --- /dev/null +++ b/data/maps/the_symbolic/rooms/Blue Room.txtpb
@@ -0,0 +1,8 @@
1name: "Blue Room"
2panels {
3 name: "DEPLETE"
4 path: "Panels/Prequel/panel_5"
5 clue: "deplete"
6 answer: "delete"
7 symbols: SPARKLES
8}
diff --git a/data/maps/the_symbolic/rooms/Green Room.txtpb b/data/maps/the_symbolic/rooms/Green Room.txtpb new file mode 100644 index 0000000..0cd3054 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Green Room.txtpb
@@ -0,0 +1,8 @@
1name: "Green Room"
2panels {
3 name: "INERT"
4 path: "Panels/Prequel/panel_6"
5 clue: "inert"
6 answer: "insert"
7 symbols: SPARKLES
8}
diff --git a/data/maps/the_symbolic/rooms/Last Room.txtpb b/data/maps/the_symbolic/rooms/Last Room.txtpb new file mode 100644 index 0000000..307b0a5 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Last Room.txtpb
@@ -0,0 +1,30 @@
1name: "Last Room"
2panels {
3 name: "BLEAT"
4 path: "Panels/Ending/panel"
5 clue: "bleat"
6 answer: "goat"
7 symbols: SOUND
8}
9panels {
10 name: "JARGON"
11 path: "Panels/Ending/panel2"
12 clue: "jargon"
13 answer: "lingo"
14 symbols: SUN
15}
16panels {
17 name: "JARGON BLEAT"
18 path: "Panels/Ending/panel3"
19 clue: ""
20 answer: "gloat"
21 symbols: EVAL
22 symbols: LINGO
23}
24panels {
25 name: "BRAG"
26 path: "Panels/Ending/panel4"
27 clue: "brag"
28 answer: "gloat"
29 symbols: SUN
30}
diff --git a/data/maps/the_symbolic/rooms/Main Area.txtpb b/data/maps/the_symbolic/rooms/Main Area.txtpb new file mode 100644 index 0000000..37fdb1f --- /dev/null +++ b/data/maps/the_symbolic/rooms/Main Area.txtpb
@@ -0,0 +1,542 @@
1name: "Main Area"
2panels {
3 name: "JUSTICE"
4 path: "Panels/Negation/justice"
5 clue: "justice"
6 answer: "ice"
7 symbols: EVAL
8}
9panels {
10 name: "NOTICE (1)"
11 path: "Panels/Negation/notice"
12 clue: "notice"
13 answer: "water"
14 symbols: EVAL
15}
16panels {
17 name: "NOTICE (2)"
18 path: "Panels/Negation/notice_neg"
19 clue: "notice"
20 answer: "ice"
21 symbols: EVAL
22}
23panels {
24 name: "NOTICE (3)"
25 path: "Panels/Negation/notice_neg2"
26 clue: "notice"
27 answer: "ice"
28 symbols: EVAL
29}
30panels {
31 name: "UNABLE (1)"
32 path: "Panels/Negation/notable"
33 clue: "unable"
34 answer: "notable"
35 symbols: EVAL
36}
37panels {
38 name: "UNABLE (2)"
39 path: "Panels/Negation/unable"
40 clue: "unable"
41 answer: "able"
42 symbols: SUN
43}
44panels {
45 name: "LINEARLY"
46 path: "Panels/Concatenation/linearly"
47 clue: "linearly"
48 answer: "lily"
49 symbols: EVAL
50}
51panels {
52 name: "SADDLED"
53 path: "Panels/Concatenation/saddled"
54 clue: "saddled"
55 answer: "sled"
56 symbols: EVAL
57}
58panels {
59 name: "PADDING"
60 path: "Panels/Concatenation/saddled2"
61 clue: "padding"
62 answer: "pinging"
63 symbols: EVAL
64}
65panels {
66 name: "BRINGING"
67 path: "Panels/Concatenation/stranding"
68 clue: "bringing"
69 answer: "branding"
70 symbols: EVAL
71}
72panels {
73 name: "THOUSANDS"
74 path: "Panels/Concatenation/panda"
75 clue: "thousands"
76 answer: "thou"
77 symbols: EVAL
78}
79panels {
80 name: "REINDICT"
81 path: "Panels/Insertion/reindict"
82 clue: "reindict"
83 answer: "direct"
84 symbols: EVAL
85}
86panels {
87 name: "LINEAGE"
88 path: "Panels/Insertion/lineage"
89 clue: "lineage"
90 answer: "eagle"
91 symbols: EVAL
92}
93panels {
94 name: "TINCTURE"
95 path: "Panels/Insertion/tincture"
96 clue: "tincture"
97 answer: "cure"
98 symbols: EVAL
99}
100panels {
101 name: "IMMATURE"
102 path: "Panels/Insertion/miniature"
103 clue: "immature"
104 answer: "miniature"
105 symbols: EVAL
106}
107panels {
108 name: "THING"
109 path: "Panels/Insertion/hinting"
110 clue: "thing"
111 answer: "hinting"
112 symbols: EVAL
113}
114panels {
115 name: "SOME"
116 path: "Panels/Fractions/wholesome"
117 clue: "some"
118 answer: "wholesome"
119 symbols: EVAL
120}
121panels {
122 name: "HALFTIME (1)"
123 path: "Panels/Fractions/halftime"
124 clue: "halftime"
125 answer: "me"
126 symbols: EVAL
127}
128panels {
129 name: "HALFTIME (2)"
130 path: "Panels/Fractions/halftime2"
131 clue: "halftime"
132 answer: "i"
133 symbols: EVAL
134}
135panels {
136 name: "QUARTERBACK"
137 path: "Panels/Fractions/quarterback"
138 clue: "quarterback"
139 answer: "a"
140 symbols: EVAL
141}
142panels {
143 name: "NORTHERN"
144 path: "Panels/Removal/northern"
145 clue: "northern"
146 answer: "then"
147 symbols: EVAL
148}
149panels {
150 name: "INMATE"
151 path: "Panels/Removal/nominate"
152 clue: "inmate"
153 answer: "nominate"
154 symbols: EVAL
155}
156panels {
157 name: "NOTCHES"
158 path: "Panels/Removal/notches"
159 clue: "notches"
160 answer: "chest"
161 symbols: EVAL
162}
163panels {
164 name: "VIOLET (1)"
165 path: "Panels/Removal/nonviolent"
166 clue: "violet"
167 answer: "nonviolent"
168 symbols: EVAL
169}
170panels {
171 name: "VIOLET (2)"
172 path: "Panels/Removal/violet"
173 clue: "violet"
174 answer: "violent"
175 symbols: SPARKLES
176}
177panels {
178 name: "NONSENSE"
179 path: "Panels/Removal/nonsense"
180 clue: "nonsense"
181 answer: ""
182 symbols: EVAL
183}
184panels {
185 name: "DISTANT"
186 path: "Panels/Replacement/distant"
187 clue: "distant"
188 answer: "and"
189 symbols: EVAL
190}
191panels {
192 name: "TIGHT (1)"
193 path: "Panels/Replacement/fistfight"
194 clue: "tight"
195 answer: "fistfight"
196 symbols: EVAL
197}
198panels {
199 name: "TIGHT (2)"
200 path: "Panels/Replacement/fistfight2"
201 clue: "tight"
202 answer: "fight"
203 symbols: SPARKLES
204}
205panels {
206 name: "DISCARD"
207 path: "Panels/Replacement/discard"
208 clue: "discard"
209 answer: "arc"
210 symbols: EVAL
211}
212panels {
213 name: "PASSPORT"
214 path: "Panels/Replacement/passport"
215 clue: "passport"
216 answer: "sort"
217 symbols: EVAL
218}
219panels {
220 name: "PORT"
221 path: "Panels/Replacement/passport2"
222 clue: "port"
223 answer: "sort"
224 symbols: ZERO
225}
226panels {
227 name: "STORMS"
228 path: "Panels/Replacement/storms"
229 clue: "storms"
230 answer: "mr"
231 symbols: EVAL
232}
233panels {
234 name: "MS"
235 path: "Panels/Replacement/storms2"
236 clue: "ms"
237 answer: "mr"
238 symbols: GENDER
239}
240panels {
241 name: "SOUNDBITE"
242 path: "Panels/Homophones/soundbite"
243 clue: "soundbite"
244 answer: "byte"
245 symbols: EVAL
246}
247panels {
248 name: "BORED"
249 path: "Panels/Homophones/soundboard"
250 clue: "bored"
251 answer: "soundboard"
252 symbols: EVAL
253}
254panels {
255 name: "VOCALIZE"
256 path: "Panels/Homophones/vocalize"
257 clue: "vocalize"
258 answer: "eyes"
259 symbols: EVAL
260}
261panels {
262 name: "VOICEMAIL"
263 path: "Panels/Homophones/voicemail"
264 clue: "voicemail"
265 answer: "male"
266 symbols: EVAL
267}
268panels {
269 name: "MIXTURE"
270 path: "Panels/Anagram/mixture"
271 clue: "mixture"
272 answer: "true"
273 symbols: EVAL
274}
275panels {
276 name: "PEAT"
277 path: "Panels/Anagram/mixtape"
278 clue: "peat"
279 answer: "mixtape"
280 symbols: EVAL
281}
282panels {
283 name: "SHUFFLEBOARD"
284 path: "Panels/Anagram/shuffleboard"
285 clue: "shuffleboard"
286 answer: "broad"
287 symbols: EVAL
288}
289panels {
290 name: "BLENDING"
291 path: "Panels/Anagram/shuffleboard2"
292 clue: "blending"
293 answer: "gin"
294 symbols: EVAL
295}
296panels {
297 name: "FLIPPER"
298 path: "Panels/Reversal/flipper"
299 clue: "flipper"
300 answer: "rep"
301 symbols: EVAL
302}
303panels {
304 name: "PANT"
305 path: "Panels/Reversal/flippant"
306 clue: "pant"
307 answer: "flippant"
308 symbols: EVAL
309}
310panels {
311 name: "BACKFIRES"
312 path: "Panels/Reversal/backfires"
313 clue: "backfires"
314 answer: "serif"
315 symbols: EVAL
316}
317panels {
318 name: "DRAW"
319 path: "Panels/Reversal/backward"
320 clue: "draw"
321 answer: "backward"
322 symbols: EVAL
323}
324panels {
325 name: "OLDTIMER"
326 path: "Panels/Time/oldtimer"
327 clue: "oldtimer"
328 answer: "hourglass"
329 symbols: EVAL
330}
331panels {
332 name: "EMULATE"
333 path: "Panels/Time/emulate"
334 clue: "emulate"
335 answer: "egg"
336 symbols: EVAL
337}
338panels {
339 name: "CHICKEN"
340 path: "Panels/Time/emulate2"
341 clue: "chicken"
342 answer: "egg"
343 symbols: AGE
344}
345panels {
346 name: "PLUMAGED"
347 path: "Panels/Time/plumaged"
348 clue: "plumaged"
349 answer: "prune"
350 symbols: EVAL
351}
352panels {
353 name: "BOY (1)"
354 path: "Panels/Time/managed"
355 clue: "boy"
356 answer: "managed"
357 symbols: EVAL
358}
359panels {
360 name: "BOY (2)"
361 path: "Panels/Time/managed2"
362 clue: "boy"
363 answer: "man"
364 symbols: AGE
365}
366panels {
367 name: "SAGE"
368 path: "Panels/Synonym/likewise"
369 clue: "sage"
370 answer: "likewise"
371 symbols: EVAL
372}
373panels {
374 name: "LIKEABLE"
375 path: "Panels/Synonym/likeable"
376 clue: "likeable"
377 answer: "unable"
378 symbols: EVAL
379}
380panels {
381 name: "MEANINGFULLY"
382 path: "Panels/Synonym/meaningfully"
383 clue: "meaningfully"
384 answer: "entirely"
385 symbols: EVAL
386}
387panels {
388 name: "MORE"
389 path: "Panels/Synonym/meaningless"
390 clue: "more"
391 answer: "meaningless"
392 symbols: EVAL
393}
394panels {
395 name: "MOUTHPIECE"
396 path: "Panels/Part/mouthpiece"
397 clue: "mouthpiece"
398 answer: "face"
399 symbols: EVAL
400}
401panels {
402 name: "RAMPART"
403 path: "Panels/Part/rampart"
404 clue: "rampart"
405 answer: "horn"
406 symbols: EVAL
407}
408panels {
409 name: "INJURY"
410 path: "Panels/Part/injury"
411 clue: "injury"
412 answer: "juror"
413 symbols: EVAL
414}
415panels {
416 name: "NUMERATOR"
417 path: "Panels/Part/infraction"
418 clue: "numerator"
419 answer: "infraction"
420 symbols: EVAL
421}
422panels {
423 name: "TYPEWRITING"
424 path: "Panels/Examples/typewriting"
425 clue: "typewriting"
426 answer: "poetry"
427 symbols: EVAL
428}
429panels {
430 name: "WHIRRED"
431 path: "Panels/Examples/typewriting2"
432 clue: "whirred"
433 answer: "poetry"
434 symbols: EXAMPLE
435 symbols: EVAL
436}
437panels {
438 name: "BOOMBOX"
439 path: "Panels/Examples/boombox"
440 clue: "boombox"
441 answer: "stereotype"
442 symbols: EVAL
443}
444panels {
445 name: "STEREO"
446 path: "Panels/Examples/boombox2"
447 clue: "stereo"
448 answer: "boombox"
449 symbols: EXAMPLE
450}
451panels {
452 name: "KINDRED"
453 path: "Panels/Examples/kindred"
454 clue: "kindred"
455 answer: "ruby"
456 symbols: EVAL
457}
458panels {
459 name: "GEM"
460 path: "Panels/Examples/kindred2"
461 clue: "Gem"
462 answer: "ruby"
463 symbols: EXAMPLE
464}
465panels {
466 name: "GEIGER"
467 path: "Panels/Examples/counterexample"
468 clue: "geiger"
469 answer: "counterexample"
470 symbols: EVAL
471}
472panels {
473 name: "COUNTER"
474 path: "Panels/Examples/counterexample2"
475 clue: "counter"
476 answer: "geiger"
477 symbols: EXAMPLE
478}
479panels {
480 name: "HORSEMAN"
481 path: "Panels/Gender/horseman_neg"
482 clue: "horseman"
483 answer: "mare"
484 symbols: EVAL
485}
486panels {
487 name: "RATHER"
488 path: "Panels/Gender/rather"
489 clue: "rather"
490 answer: "doe"
491 symbols: EVAL
492}
493panels {
494 name: "DEAR"
495 path: "Panels/Gender/rather2"
496 clue: "dear"
497 answer: "doe"
498 symbols: ZERO
499 symbols: GENDER
500}
501panels {
502 name: "COWBOY"
503 path: "Panels/Gender/cowbody"
504 clue: "cowboy"
505 answer: "bull"
506 symbols: EVAL
507}
508panels {
509 name: "HEIFER"
510 path: "Panels/Gender/cowgirl"
511 clue: "heifer"
512 answer: "cowgirl"
513 symbols: EVAL
514}
515panels {
516 name: "ANYMORE"
517 path: "Panels/Intensity/anymore"
518 clue: "anymore"
519 answer: "all"
520 symbols: EVAL
521}
522panels {
523 name: "LIKE"
524 path: "Panels/Intensity/loveless"
525 clue: "like"
526 answer: "loveless"
527 symbols: EVAL
528}
529panels {
530 name: "NEEDLESS"
531 path: "Panels/Intensity/needless"
532 clue: "needless"
533 answer: "want"
534 symbols: EVAL
535}
536panels {
537 name: "RESTLESS"
538 path: "Panels/Intensity/restless"
539 clue: "restless"
540 answer: "sleep"
541 symbols: EVAL
542}
diff --git a/data/maps/the_symbolic/rooms/Mastery.txtpb b/data/maps/the_symbolic/rooms/Mastery.txtpb new file mode 100644 index 0000000..749837e --- /dev/null +++ b/data/maps/the_symbolic/rooms/Mastery.txtpb
@@ -0,0 +1,5 @@
1name: "Mastery"
2masteries {
3 name: "MASTERY"
4 path: "Components/Collectables/smiley"
5}
diff --git a/data/maps/the_symbolic/rooms/Orange Room.txtpb b/data/maps/the_symbolic/rooms/Orange Room.txtpb new file mode 100644 index 0000000..44af36c --- /dev/null +++ b/data/maps/the_symbolic/rooms/Orange Room.txtpb
@@ -0,0 +1,8 @@
1name: "Orange Room"
2panels {
3 name: "YOUNG"
4 path: "Panels/Prequel/panel_8"
5 clue: "young"
6 answer: "old"
7 symbols: AGE
8}
diff --git a/data/maps/the_symbolic/rooms/Poetry Room 1.txtpb b/data/maps/the_symbolic/rooms/Poetry Room 1.txtpb new file mode 100644 index 0000000..a6ae04c --- /dev/null +++ b/data/maps/the_symbolic/rooms/Poetry Room 1.txtpb
@@ -0,0 +1,19 @@
1name: "Poetry Room 1"
2panels {
3 name: "ABSORBED"
4 path: "Panels/Proxy/absorbed_proxying"
5 clue: "absorbed"
6 answer: "abs"
7 symbols: EVAL
8 proxies { answer: "abs" path: "Panels/Proxy/absorbed_proxied_1" }
9 proxies { answer: "bed" path: "Panels/Proxy/absorbed_proxied_2" }
10}
11panels {
12 name: "PRIMORDIAL"
13 path: "Panels/Proxy/primordial_proxying"
14 clue: "primordial"
15 answer: "prim"
16 symbols: EVAL
17 proxies { answer: "prim" path: "Panels/Proxy/primordial_proxied_1" }
18 proxies { answer: "dial" path: "Panels/Proxy/primordial_proxied_2" }
19}
diff --git a/data/maps/the_symbolic/rooms/Poetry Room 2.txtpb b/data/maps/the_symbolic/rooms/Poetry Room 2.txtpb new file mode 100644 index 0000000..91cccd7 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Poetry Room 2.txtpb
@@ -0,0 +1,21 @@
1name: "Poetry Room 2"
2panels {
3 name: "THERE"
4 path: "Panels/NotNoT/panel"
5 clue: "there"
6 answer: "there"
7}
8panels {
9 name: "NOT"
10 path: "Panels/NotNoT/panel2"
11 clue: "not"
12 answer: "not"
13}
14panels {
15 name: "NOT THERE"
16 path: "Panels/NotNoT/not_there"
17 clue: ""
18 answer: "here"
19 symbols: EVAL
20 symbols: LINGO
21}
diff --git a/data/maps/the_symbolic/rooms/Poetry Room 3.txtpb b/data/maps/the_symbolic/rooms/Poetry Room 3.txtpb new file mode 100644 index 0000000..e70be1c --- /dev/null +++ b/data/maps/the_symbolic/rooms/Poetry Room 3.txtpb
@@ -0,0 +1,23 @@
1name: "Poetry Room 3"
2panels {
3 name: "PRETTY"
4 path: "Panels/NotNoT/panel3"
5 clue: "pretty"
6 answer: "pretty"
7}
8panels {
9 name: "NOT"
10 path: "Panels/NotNoT/panel4"
11 clue: "not"
12 answer: "not"
13}
14panels {
15 name: "NOT PRETTY"
16 path: "Panels/NotNoT/not_pretty_proxying"
17 clue: ""
18 answer: "ugly"
19 symbols: EVAL
20 symbols: LINGO
21 proxies { answer: "ugly" path: "Panels/NotNoT/not_pretty_proxied_1" }
22 proxies { answer: "prey" path: "Panels/NotNoT/not_pretty_proxied_2" }
23}
diff --git a/data/maps/the_symbolic/rooms/Poetry Room Left Left.txtpb b/data/maps/the_symbolic/rooms/Poetry Room Left Left.txtpb new file mode 100644 index 0000000..a49f062 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Poetry Room Left Left.txtpb
@@ -0,0 +1,27 @@
1name: "Poetry Room Left Left"
2panels {
3 name: "NOT (1)"
4 path: "Panels/NotNoT/panel11"
5 clue: "not"
6 answer: "not"
7}
8panels {
9 name: "NOT (2)"
10 path: "Panels/NotNoT/panel10"
11 clue: "not"
12 answer: "not"
13}
14panels {
15 name: "LEFT"
16 path: "Panels/NotNoT/panel9"
17 clue: "left"
18 answer: "left"
19}
20panels {
21 name: "NOT NOT LEFT"
22 path: "Panels/NotNoT/not_not_left"
23 clue: ""
24 answer: "wrong"
25 symbols: EVAL
26 symbols: LINGO
27}
diff --git a/data/maps/the_symbolic/rooms/Poetry Room Left Right.txtpb b/data/maps/the_symbolic/rooms/Poetry Room Left Right.txtpb new file mode 100644 index 0000000..744de0c --- /dev/null +++ b/data/maps/the_symbolic/rooms/Poetry Room Left Right.txtpb
@@ -0,0 +1,27 @@
1name: "Poetry Room Left Right"
2panels {
3 name: "MISS"
4 path: "Panels/NotNoT/panel18"
5 clue: "miss"
6 answer: "miss"
7}
8panels {
9 name: "NOT (2)"
10 path: "Panels/NotNoT/panel19"
11 clue: "not"
12 answer: "not"
13}
14panels {
15 name: "NOT (1)"
16 path: "Panels/NotNoT/panel20"
17 clue: "not"
18 answer: "not"
19}
20panels {
21 name: "NOT NOT MISS"
22 path: "Panels/NotNoT/not_not_miss"
23 clue: ""
24 answer: "hi"
25 symbols: EVAL
26 symbols: LINGO
27}
diff --git a/data/maps/the_symbolic/rooms/Poetry Room Left.txtpb b/data/maps/the_symbolic/rooms/Poetry Room Left.txtpb new file mode 100644 index 0000000..2d2eb3f --- /dev/null +++ b/data/maps/the_symbolic/rooms/Poetry Room Left.txtpb
@@ -0,0 +1,23 @@
1name: "Poetry Room Left"
2panels {
3 name: "TRUE"
4 path: "Panels/NotNoT/panel5"
5 clue: "true"
6 answer: "true"
7}
8panels {
9 name: "NOT"
10 path: "Panels/NotNoT/panel6"
11 clue: "not"
12 answer: "not"
13}
14panels {
15 name: "NOT TRUE"
16 path: "Panels/NotNoT/not_true_proxying"
17 clue: ""
18 answer: "false"
19 symbols: EVAL
20 symbols: LINGO
21 proxies { answer: "false" path: "Panels/NotNoT/not_true_proxied_1" }
22 proxies { answer: "rue" path: "Panels/NotNoT/not_true_proxied_2" }
23}
diff --git a/data/maps/the_symbolic/rooms/Poetry Room Right Left.txtpb b/data/maps/the_symbolic/rooms/Poetry Room Right Left.txtpb new file mode 100644 index 0000000..3cf7fc2 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Poetry Room Right Left.txtpb
@@ -0,0 +1,27 @@
1name: "Poetry Room Right Left"
2panels {
3 name: "NOT (1)"
4 path: "Panels/NotNoT/panel15"
5 clue: "not"
6 answer: "not"
7}
8panels {
9 name: "NOT (2)"
10 path: "Panels/NotNoT/panel16"
11 clue: "not"
12 answer: "not"
13}
14panels {
15 name: "TABLET"
16 path: "Panels/NotNoT/panel17"
17 clue: "tablet"
18 answer: "tablet"
19}
20panels {
21 name: "NOT NOT TABLET"
22 path: "Panels/NotNoT/not_not_tablet"
23 clue: ""
24 answer: "unable"
25 symbols: EVAL
26 symbols: LINGO
27}
diff --git a/data/maps/the_symbolic/rooms/Poetry Room Right Right.txtpb b/data/maps/the_symbolic/rooms/Poetry Room Right Right.txtpb new file mode 100644 index 0000000..e808792 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Poetry Room Right Right.txtpb
@@ -0,0 +1,27 @@
1name: "Poetry Room Right Right"
2panels {
3 name: "NOT (1)"
4 path: "Panels/NotNoT/panel12"
5 clue: "not"
6 answer: "not"
7}
8panels {
9 name: "NOT (2)"
10 path: "Panels/NotNoT/panel13"
11 clue: "not"
12 answer: "not"
13}
14panels {
15 name: "NOT (3)"
16 path: "Panels/NotNoT/panel14"
17 clue: "not"
18 answer: "not"
19}
20panels {
21 name: "NOT NOT NOT"
22 path: "Panels/NotNoT/not_not_not"
23 clue: ""
24 answer: "yes"
25 symbols: EVAL
26 symbols: LINGO
27}
diff --git a/data/maps/the_symbolic/rooms/Poetry Room Right.txtpb b/data/maps/the_symbolic/rooms/Poetry Room Right.txtpb new file mode 100644 index 0000000..490a6a7 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Poetry Room Right.txtpb
@@ -0,0 +1,23 @@
1name: "Poetry Room Right"
2panels {
3 name: "BETTER"
4 path: "Panels/NotNoT/panel7"
5 clue: "better"
6 answer: "better"
7}
8panels {
9 name: "NOT"
10 path: "Panels/NotNoT/panel8"
11 clue: "not"
12 answer: "not"
13}
14panels {
15 name: "NOT BETTER"
16 path: "Panels/NotNoT/not_better_proxying"
17 clue: ""
18 answer: "worse"
19 symbols: EVAL
20 symbols: LINGO
21 proxies { answer: "worse" path: "Panels/NotNoT/not_better_proxied_1" }
22 proxies { answer: "beer" path: "Panels/NotNoT/not_better_proxied_2" }
23}
diff --git a/data/maps/the_symbolic/rooms/Purple Room.txtpb b/data/maps/the_symbolic/rooms/Purple Room.txtpb new file mode 100644 index 0000000..367d7e3 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Purple Room.txtpb
@@ -0,0 +1,8 @@
1name: "Purple Room"
2panels {
3 name: "TIME"
4 path: "Panels/Prequel/panel_4"
5 clue: "time"
6 answer: "rhyme"
7 symbols: ZERO
8}
diff --git a/data/maps/the_symbolic/rooms/Red Blue Room.txtpb b/data/maps/the_symbolic/rooms/Red Blue Room.txtpb new file mode 100644 index 0000000..c246853 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Red Blue Room.txtpb
@@ -0,0 +1,20 @@
1name: "Red Blue Room"
2panels {
3 name: "RIGHTWARD"
4 path: "Panels/Entry/rightward_proxying"
5 clue: "rightward"
6 answer: "word"
7 symbols: ZERO
8 symbols: EVAL
9 proxies { answer: "word" path: "Panels/Entry/rightward_proxyied_1" }
10 proxies { answer: "whirred" path: "Panels/Entry/rightward_proxyied_2" }
11}
12panels {
13 name: "TYPEWRITING"
14 path: "Panels/Entry/typewriter_proxying"
15 clue: "typewriting"
16 answer: "writing"
17 symbols: EVAL
18 proxies { answer: "writing" path: "Panels/Entry/typewriter_proxied_1" }
19 proxies { answer: "poetry" path: "Panels/Entry/typewriter_proxied_2" }
20}
diff --git a/data/maps/the_symbolic/rooms/Red Room.txtpb b/data/maps/the_symbolic/rooms/Red Room.txtpb new file mode 100644 index 0000000..e3b1104 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Red Room.txtpb
@@ -0,0 +1,8 @@
1name: "Red Room"
2panels {
3 name: "SYNONYM"
4 path: "Panels/Prequel/panel_2"
5 clue: "synonym"
6 answer: "antonym"
7 symbols: SUN
8}
diff --git a/data/maps/the_symbolic/rooms/Tutorial.txtpb b/data/maps/the_symbolic/rooms/Tutorial.txtpb new file mode 100644 index 0000000..556e2bd --- /dev/null +++ b/data/maps/the_symbolic/rooms/Tutorial.txtpb
@@ -0,0 +1,62 @@
1name: "Tutorial"
2panels {
3 name: "SAY"
4 path: "Panels/Entry/say"
5 clue: "say"
6 answer: "say"
7}
8panels {
9 name: "HIGH"
10 path: "Panels/Entry/high"
11 clue: "high"
12 answer: "hi"
13 symbols: ZERO
14}
15panels {
16 name: "<- (1)"
17 path: "Panels/Entry/say_hi"
18 clue: ""
19 answer: "hi"
20 symbols: EVAL
21 symbols: LINGO
22}
23panels {
24 name: "<- (2)"
25 path: "Panels/Entry/type_this"
26 clue: ""
27 answer: "this"
28 symbols: EVAL
29 symbols: LINGO
30}
31panels {
32 name: "<- (3)"
33 path: "Panels/Entry/write_same"
34 clue: ""
35 answer: "same"
36 symbols: EVAL
37 symbols: LINGO
38}
39panels {
40 name: "THIS"
41 path: "Panels/Entry/type_this2"
42 clue: "this"
43 answer: "this"
44}
45panels {
46 name: "WRITE"
47 path: "Panels/Entry/write_same2"
48 clue: "write"
49 answer: "write"
50}
51panels {
52 name: "TYPE"
53 path: "Panels/Entry/type_this3"
54 clue: "type"
55 answer: "type"
56}
57panels {
58 name: "SAME"
59 path: "Panels/Entry/write_same3"
60 clue: "same"
61 answer: "same"
62}
diff --git a/data/maps/the_symbolic/rooms/Whirred Room.txtpb b/data/maps/the_symbolic/rooms/Whirred Room.txtpb new file mode 100644 index 0000000..133f6cf --- /dev/null +++ b/data/maps/the_symbolic/rooms/Whirred Room.txtpb
@@ -0,0 +1,40 @@
1name: "Whirred Room"
2panels {
3 name: "TAIPEI"
4 path: "Panels/HomChains/taipei"
5 clue: "taipei"
6 answer: "a"
7 symbols: ZERO
8 symbols: EVAL
9}
10panels {
11 name: "NAYSAYER"
12 path: "Panels/HomChains/naysayer"
13 clue: "naysayer"
14 answer: "horse"
15 symbols: ZERO
16 symbols: EVAL
17}
18panels {
19 name: "NAY"
20 path: "Panels/HomChains/naysayer2"
21 clue: "nay"
22 answer: "neigh"
23 symbols: ZERO
24}
25panels {
26 name: "INDEX (1)"
27 path: "Panels/HomChains/index"
28 clue: "index"
29 answer: "cards"
30 symbols: ZERO
31 symbols: EVAL
32}
33panels {
34 name: "INDEX (2)"
35 path: "Panels/HomChains/index2"
36 clue: "index"
37 answer: "cards"
38 symbols: EXAMPLE
39 symbols: PLANET
40}
diff --git a/data/maps/the_symbolic/rooms/White Room.txtpb b/data/maps/the_symbolic/rooms/White Room.txtpb new file mode 100644 index 0000000..d3509cb --- /dev/null +++ b/data/maps/the_symbolic/rooms/White Room.txtpb
@@ -0,0 +1,14 @@
1name: "White Room"
2panels {
3 name: "WRITE"
4 path: "Panels/Prequel/panel_1"
5 clue: "write"
6 answer: "write"
7}
8ports {
9 name: "PLAZA"
10 display_name: "Entrance"
11 path: "Components/Warps/worldport"
12 destination { x: 0 y: 0 z: 2.5 }
13 rotation: 0
14}
diff --git a/data/maps/the_symbolic/rooms/Yellow Room.txtpb b/data/maps/the_symbolic/rooms/Yellow Room.txtpb new file mode 100644 index 0000000..da207f6 --- /dev/null +++ b/data/maps/the_symbolic/rooms/Yellow Room.txtpb
@@ -0,0 +1,8 @@
1name: "Yellow Room"
2panels {
3 name: "WHOLE"
4 path: "Panels/Prequel/panel_7"
5 clue: "whole"
6 answer: "part"
7 symbols: BOXES
8}
diff --git a/data/maps/the_talented/connections.txtpb b/data/maps/the_talented/connections.txtpb new file mode 100644 index 0000000..7296523 --- /dev/null +++ b/data/maps/the_talented/connections.txtpb
@@ -0,0 +1,10 @@
1connections {
2 from_room: "Main Area"
3 to_room: "Back Room"
4 door { name: "Main Room Door" }
5}
6connections {
7 from_room: "Back Room"
8 to_room: "T2 Room"
9 door { name: "Back Room Puzzles" }
10}
diff --git a/data/maps/the_talented/doors.txtpb b/data/maps/the_talented/doors.txtpb new file mode 100644 index 0000000..766e003 --- /dev/null +++ b/data/maps/the_talented/doors.txtpb
@@ -0,0 +1,61 @@
1doors {
2 name: "Black Side Panels"
3 type: LOCATION_ONLY
4 panels { room: "Main Area" name: "DEER (Black)" }
5 panels { room: "Main Area" name: "GOOSE (Black)" }
6 panels { room: "Main Area" name: "SWINE (Black)" }
7 panels { room: "Main Area" name: "WIFE (Black)" }
8 panels { room: "Main Area" name: "CHILD (Black)" }
9 panels { room: "Main Area" name: "ELEPHANT (Black)" }
10 panels { room: "Main Area" name: "ANT (Black)" }
11 location_room: "Main Area"
12}
13doors {
14 name: "Brown Side Panels"
15 type: LOCATION_ONLY
16 panels { room: "Main Area" name: "DEER (Brown)" }
17 panels { room: "Main Area" name: "GOOSE (Brown)" }
18 panels { room: "Main Area" name: "SWINE (Brown)" }
19 panels { room: "Main Area" name: "WIFE (Brown)" }
20 panels { room: "Main Area" name: "CHILD (Brown)" }
21 panels { room: "Main Area" name: "ELEPHANT (Brown)" }
22 panels { room: "Main Area" name: "ANT (Brown)" }
23 location_room: "Main Area"
24}
25doors {
26 name: "Main Room Door"
27 type: ITEM_ONLY
28 receivers: "Components/Doors/entry_1"
29 panels { room: "Main Area" name: "DEER (Black)" }
30 panels { room: "Main Area" name: "GOOSE (Black)" }
31 panels { room: "Main Area" name: "SWINE (Black)" }
32 panels { room: "Main Area" name: "WIFE (Black)" }
33 panels { room: "Main Area" name: "CHILD (Black)" }
34 panels { room: "Main Area" name: "ELEPHANT (Black)" }
35 panels { room: "Main Area" name: "ANT (Black)" }
36 panels { room: "Main Area" name: "DEER (Brown)" }
37 panels { room: "Main Area" name: "GOOSE (Brown)" }
38 panels { room: "Main Area" name: "SWINE (Brown)" }
39 panels { room: "Main Area" name: "WIFE (Brown)" }
40 panels { room: "Main Area" name: "CHILD (Brown)" }
41 panels { room: "Main Area" name: "ELEPHANT (Brown)" }
42 panels { room: "Main Area" name: "ANT (Brown)" }
43}
44doors {
45 name: "Back Room Puzzles"
46 type: EVENT
47 panels { room: "Back Room" name: "FEAR" }
48 panels { room: "Back Room" name: "FLEECE" }
49 panels { room: "Back Room" name: "SHRINE" }
50 panels { room: "Back Room" name: "STRIVES" }
51 panels { room: "Back Room" name: "FILED" }
52 panels { room: "Back Room" name: "RELEVANT" }
53 panels { room: "Back Room" name: "LONE" }
54}
55doors {
56 name: "Keyholder Hint Panel"
57 type: LOCATION_ONLY
58 panels { room: "Main Area" name: "EARL" }
59 location_room: "Main Area"
60 location_name: "EARL"
61}
diff --git a/data/maps/the_talented/metadata.txtpb b/data/maps/the_talented/metadata.txtpb new file mode 100644 index 0000000..943bc69 --- /dev/null +++ b/data/maps/the_talented/metadata.txtpb
@@ -0,0 +1,5 @@
1display_name: "The Talented"
2worldport_entrance {
3 room: "Main Area"
4 name: "GREAT"
5}
diff --git a/data/maps/the_talented/rooms/Back Room.txtpb b/data/maps/the_talented/rooms/Back Room.txtpb new file mode 100644 index 0000000..9dce48f --- /dev/null +++ b/data/maps/the_talented/rooms/Back Room.txtpb
@@ -0,0 +1,50 @@
1name: "Back Room"
2panels {
3 name: "FEAR"
4 path: "Panels/Plum Room/panel_1"
5 clue: "fear"
6 answer: "deer"
7 symbols: ZERO
8}
9panels {
10 name: "FLEECE"
11 path: "Panels/Plum Room/panel_2"
12 clue: "fleece"
13 answer: "geese"
14 symbols: ZERO
15}
16panels {
17 name: "SHRINE"
18 path: "Panels/Plum Room/panel_3"
19 clue: "shrine"
20 answer: "swine"
21 symbols: ZERO
22}
23panels {
24 name: "STRIVES"
25 path: "Panels/Plum Room/panel_4"
26 clue: "strives"
27 answer: "wives"
28 symbols: ZERO
29}
30panels {
31 name: "FILED"
32 path: "Panels/Plum Room/panel_5"
33 clue: "filed"
34 answer: "child"
35 symbols: ZERO
36}
37panels {
38 name: "RELEVANT"
39 path: "Panels/Plum Room/panel_6"
40 clue: "relevant"
41 answer: "elephant"
42 symbols: ZERO
43}
44panels {
45 name: "LONE"
46 path: "Panels/Plum Room/panel_7"
47 clue: "lone"
48 answer: "drone"
49 symbols: ZERO
50}
diff --git a/data/maps/the_talented/rooms/Main Area.txtpb b/data/maps/the_talented/rooms/Main Area.txtpb new file mode 100644 index 0000000..a0dac7b --- /dev/null +++ b/data/maps/the_talented/rooms/Main Area.txtpb
@@ -0,0 +1,118 @@
1name: "Main Area"
2panels {
3 name: "DEER (Black)"
4 path: "Panels/Saturns/panel_1"
5 clue: "deer"
6 answer: "deer"
7 symbols: PLANET
8}
9panels {
10 name: "GOOSE (Black)"
11 path: "Panels/Saturns/panel_2"
12 clue: "goose"
13 answer: "geese"
14 symbols: PLANET
15}
16panels {
17 name: "SWINE (Black)"
18 path: "Panels/Saturns/panel_3"
19 clue: "swine"
20 answer: "swine"
21 symbols: PLANET
22}
23panels {
24 name: "WIFE (Black)"
25 path: "Panels/Saturns/panel_4"
26 clue: "wife"
27 answer: "wives"
28 symbols: PLANET
29}
30panels {
31 name: "CHILD (Black)"
32 path: "Panels/Saturns/panel_5"
33 clue: "child"
34 answer: "children"
35 symbols: PLANET
36}
37panels {
38 name: "ELEPHANT (Black)"
39 path: "Panels/Saturns/panel_6"
40 clue: "elephant"
41 answer: "elephants"
42 symbols: PLANET
43}
44panels {
45 name: "ANT (Black)"
46 path: "Panels/Saturns/panel_7"
47 clue: "ant"
48 answer: "ants"
49 symbols: PLANET
50}
51panels {
52 name: "DEER (Brown)"
53 path: "Panels/Jail Eyes/panel_1"
54 clue: "deer"
55 answer: "buck"
56 symbols: GENDER
57}
58panels {
59 name: "GOOSE (Brown)"
60 path: "Panels/Jail Eyes/panel_2"
61 clue: "goose"
62 answer: "gander"
63 symbols: GENDER
64}
65panels {
66 name: "SWINE (Brown)"
67 path: "Panels/Jail Eyes/panel_3"
68 clue: "swine"
69 answer: "sow"
70 symbols: GENDER
71}
72panels {
73 name: "WIFE (Brown)"
74 path: "Panels/Jail Eyes/panel_4"
75 clue: "wife"
76 answer: "husband"
77 symbols: GENDER
78}
79panels {
80 name: "CHILD (Brown)"
81 path: "Panels/Jail Eyes/panel_5"
82 clue: "child"
83 answer: "girl"
84 symbols: GENDER
85}
86panels {
87 name: "ELEPHANT (Brown)"
88 path: "Panels/Jail Eyes/panel_6"
89 clue: "elephant"
90 answer: "cow"
91 symbols: GENDER
92}
93panels {
94 name: "ANT (Brown)"
95 path: "Panels/Jail Eyes/panel_7"
96 clue: "ant"
97 answer: "drone"
98 symbols: GENDER
99}
100panels {
101 name: "EARL"
102 path: "Panels/Extra/panel_8"
103 clue: "earl"
104 answer: "yearly"
105 symbols: SPARKLES
106}
107keyholders {
108 name: "Y"
109 path: "Components/KeyHolders/keyHolderY"
110 key: "y"
111}
112ports {
113 name: "GREAT"
114 display_name: "Entrance"
115 path: "Components/Warps/worldport"
116 destination { x: -3.5 y: 0 z: 21 }
117 rotation: 270
118}
diff --git a/data/maps/the_talented/rooms/T2 Room.txtpb b/data/maps/the_talented/rooms/T2 Room.txtpb new file mode 100644 index 0000000..8bdc88d --- /dev/null +++ b/data/maps/the_talented/rooms/T2 Room.txtpb
@@ -0,0 +1,6 @@
1name: "T2 Room"
2letters {
3 key: "t"
4 level2: true
5 path: "Components/Collectables/collectable"
6}
diff --git a/data/maps/the_tenacious/connections.txtpb b/data/maps/the_tenacious/connections.txtpb new file mode 100644 index 0000000..56716e0 --- /dev/null +++ b/data/maps/the_tenacious/connections.txtpb
@@ -0,0 +1,35 @@
1connections {
2 from_room: "Control Center Entrance"
3 to_room: "Main Area"
4 door { name: "Control Center Entrance" }
5}
6connections {
7 from_room: "Main Area"
8 to_room: "Control Center Entrance"
9 door { name: "K Entered" }
10}
11connections {
12 from_room: "Paintings Room"
13 to_room: "Main Area"
14 door { name: "Paintings Door" }
15}
16connections {
17 from_room: "Wisdom Room"
18 to_room: "Main Area"
19 door { name: "Wisdom Door" }
20}
21connections {
22 from_room: "Tower Room"
23 to_room: "Main Area"
24 door { name: "Tower Door" }
25}
26connections {
27 from_room: "Color Room"
28 to_room: "Main Area"
29 door { name: "Color Door" }
30}
31connections {
32 from_room: "Main Area"
33 to_room: "Mastery"
34 door { name: "Mastery" }
35}
diff --git a/data/maps/the_tenacious/doors.txtpb b/data/maps/the_tenacious/doors.txtpb new file mode 100644 index 0000000..4c454c1 --- /dev/null +++ b/data/maps/the_tenacious/doors.txtpb
@@ -0,0 +1,41 @@
1doors {
2 name: "Control Center Entrance"
3 type: EVENT
4 panels { room: "Control Center Entrance" name: "ZERO" }
5}
6doors {
7 name: "K Entered"
8 type: EVENT
9 latch: true
10 receivers: "Components/Doors/entry_6"
11 keyholders { room: "Main Area" name: "K" key: "k" }
12}
13doors {
14 name: "Paintings Door"
15 type: ITEM_ONLY
16 receivers: "Components/Doors/entry_3"
17 rooms { name: "Main Area" }
18}
19doors {
20 name: "Wisdom Door"
21 type: EVENT
22 panels { room: "Wisdom Room" name: "WISDOM" }
23}
24doors {
25 name: "Color Door"
26 type: EVENT
27 panels { room: "Color Room" name: "COLOR" }
28}
29doors {
30 name: "Tower Door"
31 type: EVENT
32 panels { room: "Tower Room" name: "TOWER" }
33}
34doors {
35 name: "Mastery"
36 type: EVENT
37 panels { room: "Paintings Room" name: "PAINTINGS" }
38 panels { room: "Wisdom Room" name: "WISDOM" }
39 panels { room: "Color Room" name: "COLOR" }
40 panels { room: "Tower Room" name: "TOWER" }
41}
diff --git a/data/maps/the_tenacious/metadata.txtpb b/data/maps/the_tenacious/metadata.txtpb new file mode 100644 index 0000000..d98e8f2 --- /dev/null +++ b/data/maps/the_tenacious/metadata.txtpb
@@ -0,0 +1 @@
display_name: "The Tenacious"
diff --git a/data/maps/the_tenacious/rooms/Color Room.txtpb b/data/maps/the_tenacious/rooms/Color Room.txtpb new file mode 100644 index 0000000..e2a7a31 --- /dev/null +++ b/data/maps/the_tenacious/rooms/Color Room.txtpb
@@ -0,0 +1,7 @@
1name: "Color Room"
2panels {
3 name: "COLOR"
4 path: "Panels/Room_1/panel_1"
5 clue: "color"
6 answer: "color"
7}
diff --git a/data/maps/the_tenacious/rooms/Control Center Entrance.txtpb b/data/maps/the_tenacious/rooms/Control Center Entrance.txtpb new file mode 100644 index 0000000..05a3af3 --- /dev/null +++ b/data/maps/the_tenacious/rooms/Control Center Entrance.txtpb
@@ -0,0 +1,15 @@
1name: "Control Center Entrance"
2panels {
3 name: "ZERO"
4 path: "Panels/Room_1/panel_5"
5 clue: "zero"
6 answer: "hero"
7 symbols: ZERO
8}
9ports {
10 name: "CC"
11 display_name: "Control Center Connector"
12 path: "Components/Warps/worldport"
13 destination { x: 0 y: 0 z: 10 }
14 rotation: 0
15}
diff --git a/data/maps/the_tenacious/rooms/Main Area.txtpb b/data/maps/the_tenacious/rooms/Main Area.txtpb new file mode 100644 index 0000000..18356e7 --- /dev/null +++ b/data/maps/the_tenacious/rooms/Main Area.txtpb
@@ -0,0 +1,6 @@
1name: "Main Area"
2keyholders {
3 name: "K"
4 path: "Components/KeyHolders/keyHolderK"
5 key: "k"
6}
diff --git a/data/maps/the_tenacious/rooms/Mastery.txtpb b/data/maps/the_tenacious/rooms/Mastery.txtpb new file mode 100644 index 0000000..749837e --- /dev/null +++ b/data/maps/the_tenacious/rooms/Mastery.txtpb
@@ -0,0 +1,5 @@
1name: "Mastery"
2masteries {
3 name: "MASTERY"
4 path: "Components/Collectables/smiley"
5}
diff --git a/data/maps/the_tenacious/rooms/Paintings Room.txtpb b/data/maps/the_tenacious/rooms/Paintings Room.txtpb new file mode 100644 index 0000000..f140ef3 --- /dev/null +++ b/data/maps/the_tenacious/rooms/Paintings Room.txtpb
@@ -0,0 +1,10 @@
1name: "Paintings Room"
2# NOTE: It will be non-trivial to implement the painting pilgrimage in Daedalus,
3# so until then, the door to this room will be an item in door shuffle, and will
4# automatically be open without door shuffle.
5panels {
6 name: "PAINTINGS"
7 path: "Panels/Room_1/panel_3"
8 clue: "paintings"
9 answer: "paintings"
10}
diff --git a/data/maps/the_tenacious/rooms/Tower Room.txtpb b/data/maps/the_tenacious/rooms/Tower Room.txtpb new file mode 100644 index 0000000..d050d80 --- /dev/null +++ b/data/maps/the_tenacious/rooms/Tower Room.txtpb
@@ -0,0 +1,7 @@
1name: "Tower Room"
2panels {
3 name: "TOWER"
4 path: "Panels/Room_1/panel_2"
5 clue: "tower"
6 answer: "tower"
7}
diff --git a/data/maps/the_tenacious/rooms/Wisdom Room.txtpb b/data/maps/the_tenacious/rooms/Wisdom Room.txtpb new file mode 100644 index 0000000..84a1a6d --- /dev/null +++ b/data/maps/the_tenacious/rooms/Wisdom Room.txtpb
@@ -0,0 +1,7 @@
1name: "Wisdom Room"
2panels {
3 name: "WISDOM"
4 path: "Panels/Room_1/panel_4"
5 clue: "wisdom"
6 answer: "wisdom"
7}
diff --git a/data/maps/the_three_doors/connections.txtpb b/data/maps/the_three_doors/connections.txtpb new file mode 100644 index 0000000..e3e80c0 --- /dev/null +++ b/data/maps/the_three_doors/connections.txtpb
@@ -0,0 +1,150 @@
1connections {
2 from_room: "First Second Room"
3 to_room: "Loose Strings Room"
4 door { name: "Firs Door" }
5}
6connections {
7 from_room: "First Second Room"
8 to_room: "Silver Portal Room"
9 door { name: "Initial Door" }
10}
11connections {
12 from {
13 port {
14 room: "First Second Room"
15 name: "TTD"
16 }
17 }
18 to {
19 port {
20 room: "First Second Room"
21 name: "GREAT"
22 }
23 }
24 oneway: true
25}
26connections {
27 from_room: "First Second Room"
28 to_room: "Silver Portal Room"
29 door { name: "Second Left Door" }
30}
31connections {
32 from_room: "First Second Room"
33 to_room: "One Luck Room"
34 door { name: "Second Right Door" }
35}
36connections {
37 from_room: "Silver Portal Room"
38 to_room: "First Second Room"
39 oneway: true
40}
41connections {
42 from {
43 port {
44 room: "Silver Portal Room"
45 name: "BEGIN"
46 }
47 }
48 to {
49 port {
50 room: "First Second Room"
51 name: "GREAT"
52 }
53 }
54 oneway: true
55}
56connections {
57 from {
58 port {
59 room: "Silver Portal Room"
60 name: "NEXT"
61 }
62 }
63 to {
64 port {
65 room: "One Luck Room"
66 name: "BEGIN"
67 }
68 }
69 oneway: true
70}
71connections {
72 from {
73 port {
74 room: "One Luck Room"
75 name: "BEGIN"
76 }
77 }
78 to {
79 port {
80 room: "First Second Room"
81 name: "GREAT"
82 }
83 }
84 oneway: true
85}
86connections {
87 from_room: "One Luck Room"
88 to_room: "Dead End Room"
89 oneway: true
90}
91connections {
92 from_room: "One Luck Room"
93 to_room: "First Second Room"
94 oneway: true
95}
96connections {
97 from_room: "Dead End Room"
98 to_room: "Silver Portal Room"
99 oneway: true
100}
101connections {
102 from {
103 port {
104 room: "Dead End Room"
105 name: "BEGIN"
106 }
107 }
108 to {
109 port {
110 room: "First Second Room"
111 name: "GREAT"
112 }
113 }
114 oneway: true
115}
116connections {
117 from {
118 port {
119 room: "Dead End Room"
120 name: "BEGIN2"
121 }
122 }
123 to {
124 port {
125 room: "First Second Room"
126 name: "GREAT"
127 }
128 }
129 oneway: true
130}
131connections {
132 from_room: "Loose Strings Room"
133 to_room: "First Second Room"
134 oneway: true
135}
136connections {
137 from {
138 port {
139 room: "Loose Strings Room"
140 name: "BEGIN"
141 }
142 }
143 to {
144 port {
145 room: "First Second Room"
146 name: "GREAT"
147 }
148 }
149 oneway: true
150}
diff --git a/data/maps/the_three_doors/doors.txtpb b/data/maps/the_three_doors/doors.txtpb new file mode 100644 index 0000000..5ae9d90 --- /dev/null +++ b/data/maps/the_three_doors/doors.txtpb
@@ -0,0 +1,54 @@
1doors {
2 name: "Firs Door"
3 type: EVENT
4 panels { room: "Silver Portal Room" name: "GOLD" }
5 panels { room: "Silver Portal Room" name: "PORT" }
6 panels { room: "Silver Portal Room" name: "Left" }
7 panels { room: "Silver Portal Room" name: "Right" }
8}
9doors {
10 name: "Initial Door"
11 type: EVENT
12 panels { room: "Silver Portal Room" name: "GOLD" }
13 panels { room: "Silver Portal Room" name: "PORT" }
14 panels { room: "Silver Portal Room" name: "Left" }
15 panels { room: "Silver Portal Room" name: "Right" }
16}
17doors {
18 name: "Second Left Door"
19 type: EVENT
20 panels { room: "First Second Room" name: "FIRS" }
21 panels { room: "First Second Room" name: "INITIAL" }
22 panels { room: "First Second Room" name: "MINUTE (1)" }
23 panels { room: "First Second Room" name: "MINUTE (2)" }
24}
25doors {
26 name: "Second Right Door"
27 type: EVENT
28 panels { room: "Loose Strings Room" name: "LOOSE" }
29 panels { room: "Loose Strings Room" name: "STRINGS" }
30 panels { room: "One Luck Room" name: "LONE" }
31 panels { room: "One Luck Room" name: "CHANCE" }
32}
33doors {
34 name: "The Three Doors Gravestone"
35 type: GRAVESTONE
36 panels { room: "First Second Room" name: "FIRS" }
37 panels { room: "First Second Room" name: "INITIAL" }
38 panels { room: "First Second Room" name: "MINUTE (1)" }
39 panels { room: "First Second Room" name: "MINUTE (2)" }
40 panels { room: "Silver Portal Room" name: "GOLD" }
41 panels { room: "Silver Portal Room" name: "PORT" }
42 panels { room: "Silver Portal Room" name: "Left" }
43 panels { room: "Silver Portal Room" name: "Right" }
44 panels { room: "Loose Strings Room" name: "LOOSE" }
45 panels { room: "Loose Strings Room" name: "STRINGS" }
46 panels { room: "One Luck Room" name: "LONE" }
47 panels { room: "One Luck Room" name: "CHANCE" }
48 panels { room: "Dead End Room" name: "DOOR" }
49 panels { room: "Dead End Room" name: "WAYS" }
50 panels { room: "Dead End Room" name: "DEAD" }
51 panels { room: "Dead End Room" name: "END" }
52 location_room: "Loose Strings Room"
53 location_name: "Gravestone"
54}
diff --git a/data/maps/the_three_doors/metadata.txtpb b/data/maps/the_three_doors/metadata.txtpb new file mode 100644 index 0000000..0c6052a --- /dev/null +++ b/data/maps/the_three_doors/metadata.txtpb
@@ -0,0 +1 @@
display_name: "The Three Doors"
diff --git a/data/maps/the_three_doors/rooms/Dead End Room.txtpb b/data/maps/the_three_doors/rooms/Dead End Room.txtpb new file mode 100644 index 0000000..8bfe193 --- /dev/null +++ b/data/maps/the_three_doors/rooms/Dead End Room.txtpb
@@ -0,0 +1,43 @@
1name: "Dead End Room"
2panels {
3 name: "DOOR"
4 path: "Panels/Dead End/panel3"
5 clue: "door"
6 answer: "knob"
7 symbols: BOXES
8}
9panels {
10 name: "WAYS"
11 path: "Panels/Dead End/panel4"
12 clue: "ways"
13 answer: "sway"
14 symbols: SPARKLES
15}
16panels {
17 name: "DEAD"
18 path: "Panels/Dead End/panel"
19 clue: "dead"
20 answer: "alive"
21 symbols: SUN
22}
23panels {
24 name: "END"
25 path: "Panels/Dead End/panel2"
26 clue: "end"
27 answer: "begin"
28 symbols: SUN
29}
30ports {
31 name: "BEGIN"
32 display_name: "Door Ways Worldport"
33 path: "Components/Warps/worldport6"
34 destination { x: -38 y: 0 z: 41.5 }
35 rotation: 0
36}
37ports {
38 name: "BEGIN2"
39 display_name: "Dead End Worldport"
40 path: "Components/Warps/worldport5"
41 destination { x: -38 y: 0 z: 27.5 }
42 rotation: 180
43}
diff --git a/data/maps/the_three_doors/rooms/First Second Room.txtpb b/data/maps/the_three_doors/rooms/First Second Room.txtpb new file mode 100644 index 0000000..bdf5b49 --- /dev/null +++ b/data/maps/the_three_doors/rooms/First Second Room.txtpb
@@ -0,0 +1,43 @@
1name: "First Second Room"
2panels {
3 name: "FIRS"
4 path: "Panels/First Second/panel"
5 clue: "firs"
6 answer: "first"
7 symbols: SPARKLES
8}
9panels {
10 name: "INITIAL"
11 path: "Panels/First Second/panel2"
12 clue: "initial"
13 answer: "first"
14 symbols: SUN
15}
16panels {
17 name: "MINUTE (1)"
18 path: "Panels/First Second/panel3"
19 clue: "minute"
20 answer: "second"
21 symbols: EXAMPLE
22}
23panels {
24 name: "MINUTE (2)"
25 path: "Panels/First Second/panel4"
26 clue: "minute"
27 answer: "second"
28 symbols: BOXES
29}
30ports {
31 name: "GREAT"
32 display_name: "First Worldport"
33 path: "Components/Warps/worldport"
34 destination { x: -16 y: 0 z: 0.5 }
35 rotation: 180
36}
37ports {
38 name: "TTD"
39 display_name: "Second Worldport"
40 path: "Components/Warps/worldport2"
41 destination { x: -16 y: 0 z: 14.5 }
42 rotation: 0
43}
diff --git a/data/maps/the_three_doors/rooms/Loose Strings Room.txtpb b/data/maps/the_three_doors/rooms/Loose Strings Room.txtpb new file mode 100644 index 0000000..21e3c64 --- /dev/null +++ b/data/maps/the_three_doors/rooms/Loose Strings Room.txtpb
@@ -0,0 +1,22 @@
1name: "Loose Strings Room"
2panels {
3 name: "LOOSE"
4 path: "Panels/Something/panel3"
5 clue: "loose"
6 answer: "lose"
7 symbols: SPARKLES
8}
9panels {
10 name: "STRINGS"
11 path: "Panels/Something/panel4"
12 clue: "strings"
13 answer: "threads"
14 symbols: SUN
15}
16ports {
17 name: "BEGIN"
18 display_name: "Loose Strings Worldport"
19 path: "Components/Warps/worldport7"
20 destination { x: -16 y: 0 z: 41.5 }
21 rotation: 0
22}
diff --git a/data/maps/the_three_doors/rooms/One Luck Room.txtpb b/data/maps/the_three_doors/rooms/One Luck Room.txtpb new file mode 100644 index 0000000..f5053be --- /dev/null +++ b/data/maps/the_three_doors/rooms/One Luck Room.txtpb
@@ -0,0 +1,22 @@
1name: "One Luck Room"
2panels {
3 name: "LONE"
4 path: "Panels/Something/panel"
5 clue: "lone"
6 answer: "one"
7 symbols: SPARKLES
8}
9panels {
10 name: "CHANCE"
11 path: "Panels/Something/panel2"
12 clue: "chance"
13 answer: "luck"
14 symbols: SUN
15}
16ports {
17 name: "BEGIN"
18 display_name: "Lone Chance Worldport"
19 path: "Components/Warps/worldport8"
20 destination { x: -16 y: 0 z: 27.5 }
21 rotation: 180
22}
diff --git a/data/maps/the_three_doors/rooms/Silver Portal Room.txtpb b/data/maps/the_three_doors/rooms/Silver Portal Room.txtpb new file mode 100644 index 0000000..1c00045 --- /dev/null +++ b/data/maps/the_three_doors/rooms/Silver Portal Room.txtpb
@@ -0,0 +1,41 @@
1name: "Silver Portal Room"
2panels {
3 name: "GOLD"
4 path: "Panels/Silver Portal/panel"
5 clue: "gold"
6 answer: "silver"
7 symbols: EXAMPLE
8}
9panels {
10 name: "PORT"
11 path: "Panels/Silver Portal/panel2"
12 clue: "port"
13 answer: "portal"
14 symbols: SPARKLES
15}
16panels {
17 name: "Left"
18 path: "Panels/Silver Portal/panel3"
19 clue: ""
20 answer: "third"
21}
22panels {
23 name: "Right"
24 path: "Panels/Silver Portal/panel4"
25 clue: ""
26 answer: "fourth"
27}
28ports {
29 name: "BEGIN"
30 display_name: "Third Fourth Worldport"
31 path: "Components/Warps/worldport3"
32 destination { x: -38 y: 0 z: 14.5 }
33 rotation: 0
34}
35ports {
36 name: "NEXT"
37 display_name: "Silver Portal Worldport"
38 path: "Components/Warps/worldport4"
39 destination { x: -38 y: 0 z: 0.5 }
40 rotation: 180
41}
diff --git a/data/maps/the_tower/connections.txtpb b/data/maps/the_tower/connections.txtpb new file mode 100644 index 0000000..35fab8e --- /dev/null +++ b/data/maps/the_tower/connections.txtpb
@@ -0,0 +1,10 @@
1connections {
2 from_room: "First Floor"
3 to_room: "Tower"
4 door { name: "First Floor Door" }
5}
6connections {
7 from_room: "Tower"
8 to_room: "Ending"
9 door { name: "Ending" }
10}
diff --git a/data/maps/the_tower/doors.txtpb b/data/maps/the_tower/doors.txtpb new file mode 100644 index 0000000..ccd731b --- /dev/null +++ b/data/maps/the_tower/doors.txtpb
@@ -0,0 +1,181 @@
1doors {
2 name: "First Floor Puzzles"
3 type: LOCATION_ONLY
4 panels { room: "First Floor" name: "RIDE" }
5 panels { room: "First Floor" name: "PROD" }
6 panels { room: "First Floor" name: "WARM" }
7 panels { room: "First Floor" name: "COLLEGE" }
8 panels { room: "First Floor" name: "HER" }
9 panels { room: "First Floor" name: "CRAM" }
10 panels { room: "First Floor" name: "CUP" }
11 panels { room: "First Floor" name: "IRONY" }
12 panels { room: "First Floor" name: "IRE" }
13 panels { room: "First Floor" name: "ADULT" }
14 panels { room: "First Floor" name: "CALF" }
15 panels { room: "First Floor" name: "BUTTER" }
16 location_room: "First Floor"
17}
18doors {
19 name: "First Floor Door"
20 type: ITEM_ONLY
21 receivers: "Components/Doors/entry_1"
22 panels { room: "First Floor" name: "RIDE" }
23 panels { room: "First Floor" name: "PROD" }
24 panels { room: "First Floor" name: "WARM" }
25 panels { room: "First Floor" name: "COLLEGE" }
26 panels { room: "First Floor" name: "HER" }
27 panels { room: "First Floor" name: "CRAM" }
28 panels { room: "First Floor" name: "CUP" }
29 panels { room: "First Floor" name: "IRONY" }
30 panels { room: "First Floor" name: "IRE" }
31 panels { room: "First Floor" name: "ADULT" }
32 panels { room: "First Floor" name: "CALF" }
33 panels { room: "First Floor" name: "BUTTER" }
34 complete_at: 1
35}
36doors {
37 name: "Second Floor Puzzles"
38 type: LOCATION_ONLY
39 panels { room: "Tower" name: "RHINO" }
40 panels { room: "Tower" name: "FISH" }
41 panels { room: "Tower" name: "LINEAGE" }
42 panels { room: "Tower" name: "GRUMPY" }
43 panels { room: "Tower" name: "ZEBRA" }
44 panels { room: "Tower" name: "SLID" }
45 panels { room: "Tower" name: "FUEL" }
46 panels { room: "Tower" name: "DOUGH" }
47 panels { room: "Tower" name: "LIQUID" }
48 panels { room: "Tower" name: "ICE" }
49 panels { room: "Tower" name: "FLEECE" }
50 panels { room: "Tower" name: "NEED" }
51 panels { room: "Tower" name: "ANNOY (1)" }
52 panels { room: "Tower" name: "ANNOY (2)" }
53 panels { room: "Tower" name: "GIGGLING" }
54 location_room: "Tower"
55}
56doors {
57 name: "Third Floor Puzzles"
58 type: LOCATION_ONLY
59 panels { room: "Tower" name: "MINUSCULE" }
60 panels { room: "Tower" name: "TYPEWRITER" }
61 panels { room: "Tower" name: "READJUST" }
62 panels { room: "Tower" name: "REINDICT" }
63 panels { room: "Tower" name: "COPYRIGHT" }
64 panels { room: "Tower" name: "CONTINENT" }
65 panels { room: "Tower" name: "FOOT" }
66 panels { room: "Tower" name: "EYE" }
67 panels { room: "Tower" name: "RIVER" }
68 panels { room: "Tower" name: "NUCLEUS" }
69 panels { room: "Tower" name: "MIX (1)" }
70 panels { room: "Tower" name: "HEAL" }
71 panels { room: "Tower" name: "SCREW" }
72 panels { room: "Tower" name: "FLY" }
73 panels { room: "Tower" name: "MIX (2)" }
74 location_room: "Tower"
75}
76doors {
77 name: "Fourth Floor Puzzles"
78 type: LOCATION_ONLY
79 panels { room: "Tower" name: "BARE" }
80 panels { room: "Tower" name: "CANON" }
81 panels { room: "Tower" name: "DUCTS" }
82 panels { room: "Tower" name: "COY" }
83 panels { room: "Tower" name: "LYNX" }
84 panels { room: "Tower" name: "SCENTS (1)" }
85 panels { room: "Tower" name: "SCENTS (2)" }
86 panels { room: "Tower" name: "SEIZE (1)" }
87 panels { room: "Tower" name: "SEIZE (2)" }
88 panels { room: "Tower" name: "THROWN" }
89 location_room: "Tower"
90}
91doors {
92 name: "Fifth Floor Puzzles"
93 type: LOCATION_ONLY
94 panels { room: "Tower" name: "FUND" }
95 panels { room: "Tower" name: "ENVELOPE" }
96 panels { room: "Tower" name: "ROTE" }
97 panels { room: "Tower" name: "ENVELOPES" }
98 panels { room: "Tower" name: "ERECTS" }
99 panels { room: "Tower" name: "HIDE (1)" }
100 panels { room: "Tower" name: "HUE" }
101 panels { room: "Tower" name: "CRUST" }
102 panels { room: "Tower" name: "HIDE (2)" }
103 panels { room: "Tower" name: "BETTER" }
104 location_room: "Tower"
105}
106doors {
107 name: "Colors Panel"
108 type: EVENT
109 panels { room: "First Floor" name: "RIDE" }
110 panels { room: "First Floor" name: "PROD" }
111 panels { room: "First Floor" name: "WARM" }
112 panels { room: "First Floor" name: "COLLEGE" }
113 panels { room: "First Floor" name: "HER" }
114 panels { room: "First Floor" name: "CRAM" }
115 panels { room: "First Floor" name: "CUP" }
116 panels { room: "First Floor" name: "IRONY" }
117 panels { room: "First Floor" name: "IRE" }
118 panels { room: "First Floor" name: "ADULT" }
119 panels { room: "First Floor" name: "CALF" }
120 panels { room: "First Floor" name: "BUTTER" }
121 panels { room: "Tower" name: "RHINO" }
122 panels { room: "Tower" name: "FISH" }
123 panels { room: "Tower" name: "LINEAGE" }
124 panels { room: "Tower" name: "GRUMPY" }
125 panels { room: "Tower" name: "ZEBRA" }
126 panels { room: "Tower" name: "SLID" }
127 panels { room: "Tower" name: "FUEL" }
128 panels { room: "Tower" name: "DOUGH" }
129 panels { room: "Tower" name: "LIQUID" }
130 panels { room: "Tower" name: "ICE" }
131 panels { room: "Tower" name: "FLEECE" }
132 panels { room: "Tower" name: "NEED" }
133 panels { room: "Tower" name: "ANNOY (1)" }
134 panels { room: "Tower" name: "ANNOY (2)" }
135 panels { room: "Tower" name: "GIGGLING" }
136 panels { room: "Tower" name: "MINUSCULE" }
137 panels { room: "Tower" name: "TYPEWRITER" }
138 panels { room: "Tower" name: "READJUST" }
139 panels { room: "Tower" name: "REINDICT" }
140 panels { room: "Tower" name: "COPYRIGHT" }
141 panels { room: "Tower" name: "CONTINENT" }
142 panels { room: "Tower" name: "FOOT" }
143 panels { room: "Tower" name: "EYE" }
144 panels { room: "Tower" name: "RIVER" }
145 panels { room: "Tower" name: "NUCLEUS" }
146 panels { room: "Tower" name: "MIX (1)" }
147 panels { room: "Tower" name: "HEAL" }
148 panels { room: "Tower" name: "SCREW" }
149 panels { room: "Tower" name: "FLY" }
150 panels { room: "Tower" name: "MIX (2)" }
151 panels { room: "Tower" name: "BARE" }
152 panels { room: "Tower" name: "CANON" }
153 panels { room: "Tower" name: "DUCTS" }
154 panels { room: "Tower" name: "COY" }
155 panels { room: "Tower" name: "LYNX" }
156 panels { room: "Tower" name: "SCENTS (1)" }
157 panels { room: "Tower" name: "SCENTS (2)" }
158 panels { room: "Tower" name: "SEIZE (1)" }
159 panels { room: "Tower" name: "SEIZE (2)" }
160 panels { room: "Tower" name: "THROWN" }
161 panels { room: "Tower" name: "FUND" }
162 panels { room: "Tower" name: "ENVELOPE" }
163 panels { room: "Tower" name: "ROTE" }
164 panels { room: "Tower" name: "ENVELOPES" }
165 panels { room: "Tower" name: "ERECTS" }
166 panels { room: "Tower" name: "HIDE (1)" }
167 panels { room: "Tower" name: "HUE" }
168 panels { room: "Tower" name: "CRUST" }
169 panels { room: "Tower" name: "HIDE (2)" }
170 panels { room: "Tower" name: "BETTER" }
171}
172doors {
173 name: "Context Panel"
174 type: EVENT
175 panels { room: "Tower" name: "Colors" }
176}
177doors {
178 name: "Ending"
179 type: EVENT
180 panels { room: "Tower" name: "Context" }
181}
diff --git a/data/maps/the_tower/metadata.txtpb b/data/maps/the_tower/metadata.txtpb new file mode 100644 index 0000000..3876206 --- /dev/null +++ b/data/maps/the_tower/metadata.txtpb
@@ -0,0 +1,5 @@
1display_name: "The Tower"
2worldport_entrance {
3 room: "First Floor"
4 name: "GREAT"
5}
diff --git a/data/maps/the_tower/rooms/Ending.txtpb b/data/maps/the_tower/rooms/Ending.txtpb new file mode 100644 index 0000000..0c579c6 --- /dev/null +++ b/data/maps/the_tower/rooms/Ending.txtpb
@@ -0,0 +1,5 @@
1name: "Ending"
2endings {
3 name: "RED"
4 path: "Components/end"
5}
diff --git a/data/maps/the_tower/rooms/First Floor.txtpb b/data/maps/the_tower/rooms/First Floor.txtpb new file mode 100644 index 0000000..7a811bf --- /dev/null +++ b/data/maps/the_tower/rooms/First Floor.txtpb
@@ -0,0 +1,104 @@
1name: "First Floor"
2panels {
3 name: "RIDE"
4 path: "Panels/Floor 1/panel_1"
5 clue: "ride"
6 answer: "lion"
7 symbols: SPARKLES
8 symbols: PLANET
9}
10panels {
11 name: "PROD"
12 path: "Panels/Floor 1/panel_2"
13 clue: "prod"
14 answer: "dolphin"
15 symbols: SPARKLES
16 symbols: PLANET
17}
18panels {
19 name: "WARM"
20 path: "Panels/Floor 1/panel_3"
21 clue: "warm"
22 answer: "bee"
23 symbols: SPARKLES
24 symbols: PLANET
25}
26panels {
27 name: "COLLEGE"
28 path: "Panels/Floor 1/panel_4"
29 clue: "college"
30 answer: "fish"
31 symbols: EXAMPLE
32 symbols: PLANET
33}
34panels {
35 name: "HER"
36 path: "Panels/Floor 1/panel_5"
37 clue: "her"
38 answer: "cow"
39 symbols: SPARKLES
40 symbols: PLANET
41}
42panels {
43 name: "CRAM"
44 path: "Panels/Floor 1/panel_6"
45 clue: "cram"
46 answer: "wolf"
47 symbols: SUN
48 symbols: PLANET
49}
50panels {
51 name: "CUP"
52 path: "Panels/Floor 1/panel_7"
53 clue: "cup"
54 answer: "lion"
55 symbols: SPARKLES
56 symbols: AGE
57}
58panels {
59 name: "IRONY"
60 path: "Panels/Floor 1/panel_8"
61 clue: "irony"
62 answer: "rust"
63 symbols: SPARKLES
64 symbols: AGE
65}
66panels {
67 name: "IRE"
68 path: "Panels/Floor 1/panel_9"
69 clue: "ire"
70 answer: "ash"
71 symbols: SPARKLES
72 symbols: AGE
73}
74panels {
75 name: "ADULT"
76 path: "Panels/Floor 1/panel_10"
77 clue: "adult"
78 answer: "children"
79 symbols: PLANET
80 symbols: AGE
81}
82panels {
83 name: "CALF"
84 path: "Panels/Floor 1/panel_11"
85 clue: "calf"
86 answer: "bull"
87 symbols: GENDER
88 symbols: AGE
89}
90panels {
91 name: "BUTTER"
92 path: "Panels/Floor 1/panel_12"
93 clue: "butter"
94 answer: "cram"
95 symbols: SPARKLES
96 symbols: EXAMPLE
97}
98ports {
99 name: "GREAT"
100 display_name: "Entrance"
101 path: "Components/Warps/worldport"
102 destination { x: -0 y: 0 z: 13 }
103 rotation: 0
104}
diff --git a/data/maps/the_tower/rooms/Tower.txtpb b/data/maps/the_tower/rooms/Tower.txtpb new file mode 100644 index 0000000..325c3b6 --- /dev/null +++ b/data/maps/the_tower/rooms/Tower.txtpb
@@ -0,0 +1,409 @@
1name: "Tower"
2panels {
3 name: "RHINO"
4 path: "Panels/Floor 2/panel_1"
5 clue: "rhino"
6 answer: "hornet"
7 symbols: SPARKLES
8 symbols: BOXES
9}
10panels {
11 name: "FISH"
12 path: "Panels/Floor 2/panel_2"
13 clue: "fish"
14 answer: "fishes"
15 symbols: PLANET
16}
17panels {
18 name: "LINEAGE"
19 path: "Panels/Floor 2/panel_3"
20 clue: "lineage"
21 answer: "eaglet"
22 symbols: AGE
23 symbols: EVAL
24}
25panels {
26 name: "GRUMPY"
27 path: "Panels/Floor 2/panel_4"
28 clue: "grumpy"
29 answer: "crab"
30 symbols: SUN
31 symbols: SPARKLES
32}
33panels {
34 name: "ZEBRA"
35 path: "Panels/Floor 2/panel_5"
36 clue: "zebra"
37 answer: "tiger"
38 symbols: BOXES
39}
40panels {
41 name: "SLID"
42 path: "Panels/Floor 2/panel_6"
43 clue: "slid"
44 answer: "liquid"
45 symbols: SPARKLES
46 symbols: CROSS
47}
48panels {
49 name: "FUEL"
50 path: "Panels/Floor 2/panel_7"
51 clue: "fuel"
52 answer: "fir"
53 symbols: SPARKLES
54 symbols: CROSS
55}
56panels {
57 name: "DOUGH"
58 path: "Panels/Floor 2/panel_8"
59 clue: "dough"
60 answer: "sandwich"
61 symbols: BOXES
62 symbols: CROSS
63}
64panels {
65 name: "LIQUID"
66 path: "Panels/Floor 2/panel_9"
67 clue: "liquid"
68 answer: "plasma"
69 symbols: CROSS
70}
71panels {
72 name: "ICE"
73 path: "Panels/Floor 2/panel_10"
74 clue: "ice"
75 answer: "sea"
76 symbols: BOXES
77 symbols: CROSS
78}
79panels {
80 name: "FLEECE"
81 path: "Panels/Floor 2/panel_11"
82 clue: "fleece"
83 answer: "nephew"
84 symbols: ZERO
85 symbols: GENDER
86}
87panels {
88 name: "NEED"
89 path: "Panels/Floor 2/panel_12"
90 clue: "need"
91 answer: "aunt"
92 symbols: ZERO
93 symbols: PYRAMID
94}
95panels {
96 name: "ANNOY (1)"
97 path: "Panels/Floor 2/panel_13"
98 clue: "annoy"
99 answer: "brother"
100 symbols: SPARKLES
101 symbols: PYRAMID
102}
103panels {
104 name: "ANNOY (2)"
105 path: "Panels/Floor 2/panel_14"
106 clue: "annoy"
107 answer: "father"
108 symbols: ZERO
109 symbols: PYRAMID
110}
111panels {
112 name: "GIGGLING"
113 path: "Panels/Floor 2/panel_15"
114 clue: "giggling"
115 answer: "daughter"
116 symbols: SPARKLES
117 symbols: PYRAMID
118}
119panels {
120 name: "MINUSCULE"
121 path: "Panels/Floor 3/panel_1"
122 clue: "minuscule"
123 answer: "tin"
124 symbols: SUN
125 symbols: SPARKLES
126}
127panels {
128 name: "TYPEWRITER"
129 path: "Panels/Floor 3/panel_2"
130 clue: "typewriter"
131 answer: "keyboards"
132 symbols: PLANET
133 symbols: AGE
134}
135panels {
136 name: "READJUST"
137 path: "Panels/Floor 3/panel_3"
138 clue: "readjust"
139 answer: "adjusted"
140 symbols: SPARKLES
141}
142panels {
143 name: "REINDICT"
144 path: "Panels/Floor 3/panel_4"
145 clue: "reindict"
146 answer: "credit"
147 symbols: ANAGRAM
148 symbols: EVAL
149}
150panels {
151 name: "COPYRIGHT"
152 path: "Panels/Floor 3/panel_5"
153 clue: "copyright"
154 answer: "trader"
155 symbols: SUN
156 symbols: SPARKLES
157}
158panels {
159 name: "CONTINENT"
160 path: "Panels/Floor 3/panel_6"
161 clue: "continent"
162 answer: "shop"
163 symbols: BOXES
164}
165panels {
166 name: "FOOT"
167 path: "Panels/Floor 3/panel_7"
168 clue: "foot"
169 answer: "house"
170 symbols: BOXES
171}
172panels {
173 name: "EYE"
174 path: "Panels/Floor 3/panel_8"
175 clue: "eye"
176 answer: "school"
177 symbols: BOXES
178 symbols: STARS
179}
180panels {
181 name: "RIVER"
182 path: "Panels/Floor 3/panel_9"
183 clue: "river"
184 answer: "hospital"
185 symbols: BOXES
186}
187panels {
188 name: "NUCLEUS"
189 path: "Panels/Floor 3/panel_10"
190 clue: "nucleus"
191 answer: "jail"
192 symbols: BOXES
193}
194panels {
195 name: "MIX (1)"
196 path: "Panels/Floor 3/panel_11"
197 clue: "mix"
198 answer: "bar"
199 symbols: JOB
200 symbols: STARS
201}
202panels {
203 name: "HEAL"
204 path: "Panels/Floor 3/panel_12"
205 clue: "heal"
206 answer: "hospital"
207 symbols: JOB
208 symbols: STARS
209}
210panels {
211 name: "SCREW"
212 path: "Panels/Floor 3/panel_13"
213 clue: "screw"
214 answer: "toolbox"
215 symbols: JOB
216 symbols: STARS
217}
218panels {
219 name: "FLY"
220 path: "Panels/Floor 3/panel_14"
221 clue: "fly"
222 answer: "airplane"
223 symbols: JOB
224 symbols: STARS
225}
226panels {
227 name: "MIX (2)"
228 path: "Panels/Floor 3/panel_15"
229 clue: "mix"
230 answer: "kitchen"
231 symbols: JOB
232 symbols: STARS
233}
234panels {
235 name: "BARE"
236 path: "Panels/Floor 4/panel_1"
237 clue: "bare"
238 answer: "cub"
239 symbols: ZERO
240 symbols: AGE
241}
242panels {
243 name: "CANON"
244 path: "Panels/Floor 4/panel_2"
245 clue: "canon"
246 answer: "boom"
247 symbols: ZERO
248 symbols: SOUND
249}
250panels {
251 name: "DUCTS"
252 path: "Panels/Floor 4/panel_3"
253 clue: "ducts"
254 answer: "quack"
255 symbols: ZERO
256 symbols: SOUND
257}
258panels {
259 name: "COY"
260 path: "Panels/Floor 4/panel_4"
261 clue: "coy"
262 answer: "fish"
263 symbols: ZERO
264 symbols: EXAMPLE
265}
266panels {
267 name: "LYNX"
268 path: "Panels/Floor 4/panel_5"
269 clue: "lynx"
270 answer: "slink"
271 symbols: ZERO
272 symbols: ANAGRAM
273}
274panels {
275 name: "SCENTS (1)"
276 path: "Panels/Floor 4/panel_6"
277 clue: "scents"
278 answer: "dollars"
279 symbols: ZERO
280 symbols: BOXES
281}
282panels {
283 name: "SCENTS (2)"
284 path: "Panels/Floor 4/panel_7"
285 clue: "scents"
286 answer: "sight"
287 symbols: ZERO
288 symbols: EXAMPLE
289}
290panels {
291 name: "SEIZE (1)"
292 path: "Panels/Floor 4/panel_8"
293 clue: "seize"
294 answer: "oceans"
295 symbols: ZERO
296 symbols: PYRAMID
297}
298panels {
299 name: "SEIZE (2)"
300 path: "Panels/Floor 4/panel_9"
301 clue: "seize"
302 answer: "eye"
303 symbols: ZERO
304 symbols: PLANET
305 symbols: JOB
306}
307panels {
308 name: "THROWN"
309 path: "Panels/Floor 4/panel_10"
310 clue: "thrown"
311 answer: "chair"
312 symbols: ZERO
313 symbols: EXAMPLE
314}
315panels {
316 name: "FUND"
317 path: "Panels/Floor 5/panel_1"
318 clue: "fund"
319 answer: "find"
320 symbols: SPARKLES
321 symbols: AGE
322}
323panels {
324 name: "ENVELOPE"
325 path: "Panels/Floor 5/panel_2"
326 clue: "envelope"
327 answer: "letters"
328 symbols: PLANET
329 symbols: STARS
330}
331panels {
332 name: "ROTE"
333 path: "Panels/Floor 5/panel_3"
334 clue: "rote"
335 answer: "write"
336 symbols: ZERO
337 symbols: AGE
338}
339panels {
340 name: "ENVELOPES"
341 path: "Panels/Floor 5/panel_4"
342 clue: "envelopes"
343 answer: "words"
344 symbols: BOXES
345 symbols: STARS
346}
347panels {
348 name: "ERECTS"
349 path: "Panels/Floor 5/panel_5"
350 clue: "erects"
351 answer: "hidden"
352 symbols: SUN
353 symbols: ANAGRAM
354}
355panels {
356 name: "HIDE (1)"
357 path: "Panels/Floor 5/panel_6"
358 clue: "hide"
359 answer: "see"
360 symbols: SUN
361 symbols: SPARKLES
362}
363panels {
364 name: "HUE"
365 path: "Panels/Floor 5/panel_7"
366 clue: "hue"
367 answer: "colors"
368 symbols: SUN
369 symbols: PLANET
370}
371panels {
372 name: "CRUST"
373 path: "Panels/Floor 5/panel_8"
374 clue: "crust"
375 answer: "read"
376 symbols: SPARKLES
377 symbols: BOXES
378}
379panels {
380 name: "HIDE (2)"
381 path: "Panels/Floor 5/panel_9"
382 clue: "hide"
383 answer: "secret"
384 symbols: SUN
385 symbols: SPARKLES
386}
387panels {
388 name: "BETTER"
389 path: "Panels/Floor 5/panel_10"
390 clue: "better"
391 answer: "letters"
392 symbols: ZERO
393 symbols: PLANET
394}
395panels {
396 name: "Colors"
397 path: "Panels/End/panel_1"
398 clue: ""
399 answer: "backdoor"
400 symbols: QUESTION
401 required_door { name: "Colors Panel" }
402}
403panels {
404 name: "Context"
405 path: "Panels/End/panel_2"
406 clue: ""
407 answer: "door"
408 required_door { name: "Context Panel" }
409}
diff --git a/data/maps/the_tree/connections.txtpb b/data/maps/the_tree/connections.txtpb new file mode 100644 index 0000000..b455a6c --- /dev/null +++ b/data/maps/the_tree/connections.txtpb
@@ -0,0 +1,5 @@
1connections {
2 from_room: "Main Area"
3 to_room: "Bearer Entrance"
4 door { name: "Control Center Brown Door" }
5}
diff --git a/data/maps/the_tree/doors.txtpb b/data/maps/the_tree/doors.txtpb new file mode 100644 index 0000000..1932aa7 --- /dev/null +++ b/data/maps/the_tree/doors.txtpb
@@ -0,0 +1,43 @@
1doors {
2 name: "Control Center Brown Door"
3 type: CONTROL_CENTER_COLOR
4 latch: true
5 receivers: "Components/Doors/entry_1"
6 control_center_color: "brown"
7}
8doors {
9 name: "The Tree Gravestone"
10 type: GRAVESTONE
11 panels { room: "Main Area" name: "COLOR" }
12 panels { room: "Main Area" name: "DAMAGE (1)" }
13 panels { room: "Main Area" name: "DAMAGE (2)" }
14 panels { room: "Main Area" name: "MEAL (1)" }
15 panels { room: "Main Area" name: "MEAL (2)" }
16 panels { room: "Main Area" name: "WALK (1)" }
17 panels { room: "Main Area" name: "WALK (2)" }
18 panels { room: "Main Area" name: "REST" }
19 panels { room: "Main Area" name: "SLEEP" }
20 panels { room: "Main Area" name: "JUMP (1)" }
21 panels { room: "Main Area" name: "JUMP (2)" }
22 panels { room: "Main Area" name: "DRIZZLE" }
23 panels { room: "Main Area" name: "WADE" }
24 panels { room: "Main Area" name: "GROW (1)" }
25 panels { room: "Main Area" name: "GROW (2)" }
26 panels { room: "Main Area" name: "GROW (3)" }
27 panels { room: "Main Area" name: "GOOD (1)" }
28 panels { room: "Main Area" name: "GOOD (2)" }
29 panels { room: "Main Area" name: "GOOD (3)" }
30 panels { room: "Main Area" name: "HOVER" }
31 panels { room: "Main Area" name: "HAPPY (1)" }
32 panels { room: "Main Area" name: "HAPPY (2)" }
33 panels { room: "Main Area" name: "HAPPY (3)" }
34 panels { room: "Main Area" name: "LIGHT (1)" }
35 panels { room: "Main Area" name: "LIGHT (2)" }
36 panels { room: "Main Area" name: "LIGHT (3)" }
37 panels { room: "Main Area" name: "SMALL (1)" }
38 panels { room: "Main Area" name: "SMALL (2)" }
39 panels { room: "Main Area" name: "SMALL (3)" }
40 panels { room: "Main Area" name: "SPRINKLE" }
41 location_room: "Main Area"
42 location_name: "Gravestone"
43}
diff --git a/data/maps/the_tree/metadata.txtpb b/data/maps/the_tree/metadata.txtpb new file mode 100644 index 0000000..6090384 --- /dev/null +++ b/data/maps/the_tree/metadata.txtpb
@@ -0,0 +1 @@
display_name: "The Tree"
diff --git a/data/maps/the_tree/rooms/Bearer Entrance.txtpb b/data/maps/the_tree/rooms/Bearer Entrance.txtpb new file mode 100644 index 0000000..263a8e8 --- /dev/null +++ b/data/maps/the_tree/rooms/Bearer Entrance.txtpb
@@ -0,0 +1,8 @@
1name: "Bearer Entrance"
2ports {
3 name: "BEARER"
4 display_name: "Brown Control Center Hallway"
5 path: "Components/Warps/worldport"
6 destination { x: -15.5 y: 0 z: 20 }
7 rotation: 270
8}
diff --git a/data/maps/the_tree/rooms/Main Area.txtpb b/data/maps/the_tree/rooms/Main Area.txtpb new file mode 100644 index 0000000..bd22c2b --- /dev/null +++ b/data/maps/the_tree/rooms/Main Area.txtpb
@@ -0,0 +1,253 @@
1name: "Main Area"
2panels {
3 name: "COLOR"
4 path: "Panels/Room_1/panel_1"
5 clue: "color"
6 answer: "brown"
7 symbols: EXAMPLE
8}
9panels {
10 name: "DAMAGE (1)"
11 path: "Panels/Room_1/panel_2"
12 clue: "damage"
13 answer: "dent"
14 symbols: PYRAMID
15}
16panels {
17 name: "DAMAGE (2)"
18 path: "Panels/Room_1/panel_3"
19 clue: "damage"
20 answer: "ruin"
21 symbols: PYRAMID
22}
23panels {
24 name: "MEAL (1)"
25 path: "Panels/Room_1/panel_4"
26 clue: "meal"
27 answer: "snack"
28 symbols: PYRAMID
29}
30panels {
31 name: "MEAL (2)"
32 path: "Panels/Room_1/panel_5"
33 clue: "meal"
34 answer: "feast"
35 symbols: PYRAMID
36}
37panels {
38 name: "WALK (1)"
39 path: "Panels/Room_1/panel_6"
40 clue: "walk"
41 answer: "run"
42 symbols: PYRAMID
43}
44panels {
45 name: "WALK (2)"
46 path: "Panels/Room_1/panel_7"
47 clue: "walk"
48 answer: "sprint"
49 symbols: PYRAMID
50}
51panels {
52 name: "REST"
53 path: "Panels/Room_1/panel_8"
54 clue: "rest"
55 answer: "lounge"
56 symbols: PYRAMID
57}
58panels {
59 name: "SLEEP"
60 path: "Panels/Room_1/panel_9"
61 clue: "sleep"
62 answer: "rest"
63 symbols: PYRAMID
64}
65panels {
66 name: "JUMP (1)"
67 path: "Panels/Room_1/panel_10"
68 clue: "jump"
69 answer: "hop"
70 symbols: PYRAMID
71}
72panels {
73 name: "JUMP (2)"
74 path: "Panels/Room_1/panel_11"
75 clue: "jump"
76 answer: "leap"
77 symbols: PYRAMID
78}
79panels {
80 name: "DRIZZLE"
81 path: "Panels/Room_1/panel_12"
82 clue: "drizzle"
83 answer: "pour"
84 symbols: PYRAMID
85}
86panels {
87 name: "WADE"
88 path: "Panels/Room_1/panel_13"
89 clue: "wade"
90 answer: "dive"
91 symbols: PYRAMID
92}
93panels {
94 name: "GROW (1)"
95 path: "Panels/Room_1/panel_14"
96 clue: "grow"
97 answer: "sprout"
98 symbols: PYRAMID
99}
100panels {
101 name: "GROW (2)"
102 path: "Panels/Room_1/panel_15"
103 clue: "grow"
104 answer: "flourish"
105 symbols: PYRAMID
106}
107panels {
108 name: "GROW (3)"
109 path: "Panels/Room_1/panel_16"
110 clue: "grow"
111 answer: "die"
112 symbols: SUN
113}
114panels {
115 name: "GOOD (1)"
116 path: "Panels/Room_1/panel_17"
117 clue: "good"
118 answer: "bad"
119 symbols: SUN
120}
121panels {
122 name: "GOOD (2)"
123 path: "Panels/Room_1/panel_18"
124 clue: "good"
125 answer: "okay"
126 symbols: PYRAMID
127}
128panels {
129 name: "GOOD (3)"
130 path: "Panels/Room_1/panel_19"
131 clue: "good"
132 answer: "great"
133 symbols: PYRAMID
134}
135panels {
136 name: "HOVER"
137 path: "Panels/Room_1/panel_20"
138 clue: "hover"
139 answer: "fly"
140 symbols: PYRAMID
141}
142panels {
143 name: "HAPPY (1)"
144 path: "Panels/Room_1/panel_21"
145 clue: "happy"
146 answer: "glad"
147 symbols: PYRAMID
148}
149panels {
150 name: "HAPPY (2)"
151 path: "Panels/Room_1/panel_22"
152 clue: "happy"
153 answer: "joyful"
154 symbols: PYRAMID
155}
156panels {
157 name: "HAPPY (3)"
158 path: "Panels/Room_1/panel_23"
159 clue: "happy"
160 answer: "sad"
161 symbols: SUN
162}
163panels {
164 name: "LIGHT (1)"
165 path: "Panels/Room_1/panel_24"
166 clue: "light"
167 answer: "dim"
168 symbols: PYRAMID
169}
170panels {
171 name: "LIGHT (2)"
172 path: "Panels/Room_1/panel_25"
173 clue: "light"
174 answer: "bright"
175 symbols: PYRAMID
176}
177panels {
178 name: "LIGHT (3)"
179 path: "Panels/Room_1/panel_26"
180 clue: "light"
181 answer: "dark"
182 symbols: SUN
183}
184panels {
185 name: "SMALL (1)"
186 path: "Panels/Room_1/panel_27"
187 clue: "small"
188 answer: "big"
189 symbols: SUN
190}
191panels {
192 name: "SMALL (2)"
193 path: "Panels/Room_1/panel_28"
194 clue: "small"
195 answer: "modest"
196 symbols: PYRAMID
197}
198panels {
199 name: "SMALL (3)"
200 path: "Panels/Room_1/panel_29"
201 clue: "small"
202 answer: "tiny"
203 symbols: PYRAMID
204}
205panels {
206 name: "SPRINKLE"
207 path: "Panels/Room_1/panel_30"
208 clue: "sprinkle"
209 answer: "rain"
210 symbols: PYRAMID
211}
212ports {
213 name: "UNKEMPT"
214 display_name: "SW Worldport"
215 path: "Components/Warps/worldport4"
216 destination { x: -21 y: 0 z: 7 }
217 rotation: 0
218 # enterable from either side
219}
220ports {
221 name: "DIGITAL"
222 display_name: "NW Worldport"
223 path: "Components/Warps/worldport5"
224 destination { x: -21 y: 0 z: -7 }
225 rotation: 180
226 # enterable from either side
227}
228ports {
229 name: "GREAT"
230 display_name: "E Worldport"
231 path: "Components/Warps/worldport2"
232 destination { x: 21 y: 0 z: -4 }
233 rotation: 180
234}
235ports {
236 name: "DAEDALUS"
237 display_name: "NE Worldport"
238 path: "Components/Warps/worldport3"
239 destination { x: 15.5 y: 0 z: -19 }
240 rotation: 90
241}
242paintings {
243 name: "SEA"
244 path: "Components/Paintings/sea"
245}
246paintings {
247 name: "EYERED"
248 path: "Components/Paintings/eyeRed"
249}
250paintings {
251 name: "WHY_LETTERS"
252 path: "Components/Paintings/why_letters"
253}
diff --git a/data/maps/the_unkempt/connections.txtpb b/data/maps/the_unkempt/connections.txtpb new file mode 100644 index 0000000..d4a046c --- /dev/null +++ b/data/maps/the_unkempt/connections.txtpb
@@ -0,0 +1,60 @@
1connections {
2 from_room: "Main Area"
3 to_room: "Right Area"
4 door { name: "East Door" }
5}
6connections {
7 from_room: "Middle Room"
8 to_room: "Unsymmetry Room"
9 door { name: "W2 Room Door" }
10}
11connections {
12 from_room: "Main Area"
13 to_room: "Middle Room"
14 door { name: "Cyan Doors" }
15}
16connections {
17 from_room: "Main Area"
18 to_room: "Exit Room 2"
19 door { name: "Exit Door 1" }
20}
21connections {
22 from_room: "Exit Room 2"
23 to_room: "Exit Room 3"
24 door { name: "Exit Door 2" }
25}
26connections {
27 from_room: "Main Area"
28 to_room: "Control Center Entrance"
29 door { name: "I Entered" }
30}
31connections {
32 from_room: "Main Area"
33 to_room: "Control Center Entrance"
34 door { name: "Control Center Entrance" }
35}
36connections {
37 from_room: "Right Area"
38 to_room: "V1 Room"
39 door { name: "V1 Door" }
40}
41connections {
42 from_room: "Right Area"
43 to_room: "Daedalus Entrance"
44 door { name: "Control Center Orange Door" }
45}
46connections {
47 from_room: "Unsymmetry Room"
48 to_room: "W2 Room"
49 door { name: "W2 Door" }
50}
51connections {
52 from_room: "Unsymmetry Room"
53 to_room: "V Keyholder"
54 door { name: "V Keyholder" }
55}
56connections {
57 from_room: "Unsymmetry Room"
58 to_room: "W Keyholder"
59 door { name: "W Keyholder" }
60}
diff --git a/data/maps/the_unkempt/doors.txtpb b/data/maps/the_unkempt/doors.txtpb new file mode 100644 index 0000000..f758369 --- /dev/null +++ b/data/maps/the_unkempt/doors.txtpb
@@ -0,0 +1,203 @@
1doors {
2 name: "East Door"
3 type: STANDARD
4 receivers: "Components/Doors/entry_2"
5 panels { room: "Main Area" name: "EYE" }
6 panels { room: "Main Area" name: "SIGHT" }
7 panels { room: "Main Area" name: "SHY" }
8 panels { room: "Main Area" name: "QUITE" }
9 location_room: "Main Area"
10}
11doors {
12 name: "W2 Room Door"
13 type: STANDARD
14 receivers: "Components/Doors/entry_1"
15 panels { room: "Middle Room" name: "RIDDLE" }
16 panels { room: "Middle Room" name: "FELLOW" }
17 panels { room: "Middle Room" name: "YELLOW" }
18 panels { room: "Middle Room" name: "FIDDLE" }
19 location_room: "Middle Room"
20}
21doors {
22 name: "Cyan Doors"
23 type: EVENT
24 receivers: "Components/Doors/entry_12"
25 double_letters: true
26}
27doors {
28 name: "Sun Temple Entrance"
29 type: EVENT
30 panels { room: "Exit Room 3" name: "ENTER" }
31}
32doors {
33 name: "Exit Door 1"
34 type: EVENT
35 panels { room: "Main Area" name: "PHASE" }
36 panels { room: "Main Area" name: "SCALE" }
37 panels { room: "Main Area" name: "WAYS" }
38 panels { room: "Main Area" name: "TRAIL" }
39}
40doors {
41 name: "Exit Door 2"
42 type: EVENT
43 panels { room: "Exit Room 2" name: "FOUR" }
44 panels { room: "Exit Room 2" name: "MINE" }
45 panels { room: "Exit Room 2" name: "DOOR" }
46 panels { room: "Exit Room 2" name: "WINE" }
47}
48doors {
49 name: "I Entered"
50 type: EVENT
51 latch: true
52 receivers: "Components/Doors/entry_4"
53 keyholders { room: "Main Area" name: "I" key: "i" }
54}
55doors {
56 name: "Control Center Entrance"
57 type: EVENT
58 panels { room: "Control Center Entrance" name: "RETURN" }
59}
60doors {
61 name: "V1 Door"
62 type: EVENT
63 panels { room: "Right Area" name: "QUIET" }
64 panels { room: "Right Area" name: "DIET" }
65 panels { room: "Right Area" name: "FOURTH" }
66 panels { room: "Right Area" name: "FORTH" }
67}
68doors {
69 name: "Control Center Orange Door"
70 type: CONTROL_CENTER_COLOR
71 latch: true
72 receivers: "Components/Doors/entry_6"
73 receivers: "Components/Doors/entry_13"
74 control_center_color: "orange"
75 double_letters: true
76}
77doors {
78 name: "W2 Door"
79 type: EVENT
80 panels { room: "Unsymmetry Room" name: "UNINTERESTED" }
81 panels { room: "Unsymmetry Room" name: "IMPARTIAL" }
82 panels { room: "Unsymmetry Room" name: "ENTERTAIN" }
83 panels { room: "Unsymmetry Room" name: "CONFUSE" }
84 panels { room: "Unsymmetry Room" name: "UNLUCKY" }
85 panels { room: "Unsymmetry Room" name: "UNEXPECTED" }
86 panels { room: "Unsymmetry Room" name: "UNIRONIC" }
87 panels { room: "Unsymmetry Room" name: "ACCIDENTAL" }
88 panels { room: "Unsymmetry Room" name: "COMPLETE" }
89 panels { room: "Unsymmetry Room" name: "ENROLL" }
90 panels { room: "Unsymmetry Room" name: "ACCEPT" }
91 panels { room: "Unsymmetry Room" name: "DISPROVE" }
92 panels { room: "Unsymmetry Room" name: "SCRUTINIZE (Purple)" }
93 panels { room: "Unsymmetry Room" name: "SCRUTINIZE (Cyan)" }
94}
95doors {
96 name: "V Keyholder"
97 type: EVENT
98 panels { room: "Unsymmetry Room" name: "UNINTERESTED" }
99 panels { room: "Unsymmetry Room" name: "IMPARTIAL" }
100 panels { room: "Unsymmetry Room" name: "ENTERTAIN" }
101 panels { room: "Unsymmetry Room" name: "CONFUSE" }
102 panels { room: "Unsymmetry Room" name: "UNLUCKY" }
103 panels { room: "Unsymmetry Room" name: "UNEXPECTED" }
104 panels { room: "Unsymmetry Room" name: "UNIRONIC" }
105 panels { room: "Unsymmetry Room" name: "ACCIDENTAL" }
106 panels { room: "Unsymmetry Room" name: "COMPLETE" }
107 panels { room: "Unsymmetry Room" name: "ENROLL" }
108 panels { room: "Unsymmetry Room" name: "ACCEPT" }
109 panels { room: "Unsymmetry Room" name: "DISPROVE" }
110 panels { room: "Unsymmetry Room" name: "SCRUTINIZE (Purple)" }
111 panels { room: "Unsymmetry Room" name: "SCRUTINIZE (Cyan)" }
112}
113doors {
114 name: "W Keyholder"
115 type: EVENT
116 panels { room: "Unsymmetry Room" name: "UNINTERESTED" }
117 panels { room: "Unsymmetry Room" name: "IMPARTIAL" }
118 panels { room: "Unsymmetry Room" name: "ENTERTAIN" }
119 panels { room: "Unsymmetry Room" name: "CONFUSE" }
120 panels { room: "Unsymmetry Room" name: "UNLUCKY" }
121 panels { room: "Unsymmetry Room" name: "UNEXPECTED" }
122 panels { room: "Unsymmetry Room" name: "UNIRONIC" }
123 panels { room: "Unsymmetry Room" name: "ACCIDENTAL" }
124 panels { room: "Unsymmetry Room" name: "COMPLETE" }
125 panels { room: "Unsymmetry Room" name: "ENROLL" }
126 panels { room: "Unsymmetry Room" name: "ACCEPT" }
127 panels { room: "Unsymmetry Room" name: "DISPROVE" }
128 panels { room: "Unsymmetry Room" name: "SCRUTINIZE (Purple)" }
129 panels { room: "Unsymmetry Room" name: "SCRUTINIZE (Cyan)" }
130}
131doors {
132 name: "Let Untrue Tie"
133 type: LOCATION_ONLY
134 panels { room: "Main Area" name: "COUP" }
135 panels { room: "Main Area" name: "FLEW" }
136 panels { room: "Main Area" name: "GUILE" }
137 panels { room: "Main Area" name: "WHILE" }
138 panels { room: "Main Area" name: "AISLE" }
139 panels { room: "Main Area" name: "ZOO" }
140 panels { room: "Main Area" name: "SOON" }
141 panels { room: "Main Area" name: "NOON" }
142 panels { room: "Main Area" name: "MOON" }
143 location_room: "Main Area"
144}
145doors {
146 name: "Routine Out Chute"
147 type: LOCATION_ONLY
148 panels { room: "Main Area" name: "SUCH" }
149 panels { room: "Main Area" name: "MOONLIGHT" }
150 panels { room: "Main Area" name: "CRUTCH" }
151 panels { room: "Main Area" name: "CONTRITE" }
152 panels { room: "Main Area" name: "ROUTER" }
153 panels { room: "Main Area" name: "TONIGHT" }
154 panels { room: "Main Area" name: "STOUTER" }
155 panels { room: "Main Area" name: "DOUBTER" }
156 panels { room: "Main Area" name: "MUCH" }
157 location_room: "Main Area"
158}
159doors {
160 name: "Honor Our Hint"
161 type: LOCATION_ONLY
162 panels { room: "Right Area" name: "TOWER" }
163 panels { room: "Right Area" name: "WARN" }
164 panels { room: "Right Area" name: "OUTDO" }
165 panels { room: "Right Area" name: "TATTOO" }
166 panels { room: "Right Area" name: "SOUR" }
167 panels { room: "Right Area" name: "UNTRUE" }
168 panels { room: "Right Area" name: "FLOWER" }
169 panels { room: "Right Area" name: "MOURN" }
170 panels { room: "Right Area" name: "CORN" }
171 location_room: "Right Area"
172}
173doors {
174 name: "Cog Rhino Hug Rug"
175 type: LOCATION_ONLY
176 panels { room: "Right Area" name: "SCUFF" }
177 panels { room: "Right Area" name: "WIN" }
178 panels { room: "Right Area" name: "BLUFF" }
179 panels { room: "Right Area" name: "INN" }
180 panels { room: "Right Area" name: "OFF" }
181 panels { room: "Right Area" name: "TROUGH" }
182 panels { room: "Right Area" name: "BEEN" }
183 panels { room: "Right Area" name: "SCOFF" }
184 panels { room: "Right Area" name: "TOUGH" }
185 location_room: "Right Area"
186}
187doors {
188 name: "Near Teal Door Panels"
189 type: LOCATION_ONLY
190 panels { room: "Main Area" name: "I" }
191 panels { room: "Main Area" name: "SPY" }
192 panels { room: "Main Area" name: "HEFT" }
193 panels { room: "Main Area" name: "THEFT" }
194 location_room: "Main Area"
195 location_name: "HEFT, I, SPY, THEFT"
196}
197doors {
198 name: "Control Center Orange Panel"
199 type: LOCATION_ONLY
200 panels { room: "Right Area" name: "COLOR" }
201 location_room: "Right Area"
202 location_name: "COLOR"
203}
diff --git a/data/maps/the_unkempt/metadata.txtpb b/data/maps/the_unkempt/metadata.txtpb new file mode 100644 index 0000000..f2862bc --- /dev/null +++ b/data/maps/the_unkempt/metadata.txtpb
@@ -0,0 +1 @@
display_name: "The Unkempt"
diff --git a/data/maps/the_unkempt/rooms/Control Center Entrance.txtpb b/data/maps/the_unkempt/rooms/Control Center Entrance.txtpb new file mode 100644 index 0000000..7971cf7 --- /dev/null +++ b/data/maps/the_unkempt/rooms/Control Center Entrance.txtpb
@@ -0,0 +1,15 @@
1name: "Control Center Entrance"
2panels {
3 name: "RETURN"
4 path: "Panels/Entry/panel_1"
5 clue: "return"
6 answer: "turn"
7 symbols: SPARKLES
8}
9ports {
10 name: "CC"
11 display_name: "Control Center Connector"
12 path: "Components/Warps/worldport2"
13 destination { x: -4.5 y: 0 z: 7 }
14 rotation: 0
15}
diff --git a/data/maps/the_unkempt/rooms/Daedalus Entrance.txtpb b/data/maps/the_unkempt/rooms/Daedalus Entrance.txtpb new file mode 100644 index 0000000..f20d2cf --- /dev/null +++ b/data/maps/the_unkempt/rooms/Daedalus Entrance.txtpb
@@ -0,0 +1,8 @@
1name: "Daedalus Entrance"
2ports {
3 name: "DAEDALUS"
4 display_name: "Orange Hallway"
5 path: "Components/Warps/worldport4"
6 destination { x: 33 y: 0 z: -10 }
7 rotation: 90
8}
diff --git a/data/maps/the_unkempt/rooms/Exit Room 2.txtpb b/data/maps/the_unkempt/rooms/Exit Room 2.txtpb new file mode 100644 index 0000000..9212780 --- /dev/null +++ b/data/maps/the_unkempt/rooms/Exit Room 2.txtpb
@@ -0,0 +1,29 @@
1name: "Exit Room 2"
2panels {
3 name: "FOUR"
4 path: "Panels/Room 9/panel_5"
5 clue: "four"
6 answer: "more"
7 symbols: ZERO
8}
9panels {
10 name: "MINE"
11 path: "Panels/Room 9/panel_6"
12 clue: "mine"
13 answer: "vine"
14 symbols: ZERO
15}
16panels {
17 name: "DOOR"
18 path: "Panels/Room 9/panel_7"
19 clue: "door"
20 answer: "more"
21 symbols: ZERO
22}
23panels {
24 name: "WINE"
25 path: "Panels/Room 9/panel_8"
26 clue: "wine"
27 answer: "vine"
28 symbols: ZERO
29}
diff --git a/data/maps/the_unkempt/rooms/Exit Room 3.txtpb b/data/maps/the_unkempt/rooms/Exit Room 3.txtpb new file mode 100644 index 0000000..3f996b5 --- /dev/null +++ b/data/maps/the_unkempt/rooms/Exit Room 3.txtpb
@@ -0,0 +1,8 @@
1name: "Exit Room 3"
2panels {
3 name: "ENTER"
4 path: "Panels/Room 9/panel_9"
5 clue: "enter"
6 answer: "exit"
7 symbols: SUN
8}
diff --git a/data/maps/the_unkempt/rooms/Main Area.txtpb b/data/maps/the_unkempt/rooms/Main Area.txtpb new file mode 100644 index 0000000..f98220d --- /dev/null +++ b/data/maps/the_unkempt/rooms/Main Area.txtpb
@@ -0,0 +1,238 @@
1name: "Main Area"
2panels {
3 name: "I"
4 path: "Panels/Room 1/panel_1"
5 clue: "i"
6 answer: "hi"
7 symbols: ZERO
8}
9panels {
10 name: "SPY"
11 path: "Panels/Room 1/panel_2"
12 clue: "spy"
13 answer: "hi"
14 symbols: ZERO
15}
16panels {
17 name: "THEFT"
18 path: "Panels/Room 1/panel_3"
19 clue: "theft"
20 answer: "left"
21 symbols: ZERO
22}
23panels {
24 name: "HEFT"
25 path: "Panels/Room 1/panel_4"
26 clue: "heft"
27 answer: "left"
28 symbols: ZERO
29}
30panels {
31 name: "EYE"
32 path: "Panels/Room 2/panel_1"
33 clue: "eye"
34 answer: "hi"
35 symbols: ZERO
36}
37panels {
38 name: "SIGHT"
39 path: "Panels/Room 2/panel_2"
40 clue: "sight"
41 answer: "right"
42 symbols: ZERO
43}
44panels {
45 name: "SHY"
46 path: "Panels/Room 2/panel_3"
47 clue: "shy"
48 answer: "hi"
49 symbols: ZERO
50}
51panels {
52 name: "QUITE"
53 path: "Panels/Room 2/panel_4"
54 clue: "quite"
55 answer: "right"
56 symbols: ZERO
57}
58panels {
59 name: "SUCH"
60 path: "Panels/Room 6/panel_1"
61 clue: "such"
62 answer: "touch"
63 symbols: ZERO
64}
65panels {
66 name: "MOONLIGHT"
67 path: "Panels/Room 6/panel_2"
68 clue: "moonlight"
69 answer: "unite"
70 symbols: ZERO
71}
72panels {
73 name: "CRUTCH"
74 path: "Panels/Room 6/panel_3"
75 clue: "crutch"
76 answer: "touch"
77 symbols: ZERO
78}
79panels {
80 name: "CONTRITE"
81 path: "Panels/Room 6/panel_4"
82 clue: "contrite"
83 answer: "unite"
84 symbols: ZERO
85}
86panels {
87 name: "ROUTER"
88 path: "Panels/Room 6/panel_5"
89 clue: "router"
90 answer: "outer"
91 symbols: ZERO
92}
93panels {
94 name: "TONIGHT"
95 path: "Panels/Room 6/panel_6"
96 clue: "tonight"
97 answer: "unite"
98 symbols: ZERO
99}
100panels {
101 name: "STOUTER"
102 path: "Panels/Room 6/panel_7"
103 clue: "stouter"
104 answer: "outer"
105 symbols: ZERO
106}
107panels {
108 name: "DOUBTER"
109 path: "Panels/Room 6/panel_8"
110 clue: "doubter"
111 answer: "outer"
112 symbols: ZERO
113}
114panels {
115 name: "MUCH"
116 path: "Panels/Room 6/panel_9"
117 clue: "much"
118 answer: "touch"
119 symbols: ZERO
120}
121panels {
122 name: "COUP"
123 path: "Panels/Room 7/panel_1"
124 clue: "coup"
125 answer: "true"
126 symbols: ZERO
127}
128panels {
129 name: "FLEW"
130 path: "Panels/Room 7/panel_2"
131 clue: "flew"
132 answer: "true"
133 symbols: ZERO
134}
135panels {
136 name: "GUILE"
137 path: "Panels/Room 7/panel_3"
138 clue: "guile"
139 answer: "tile"
140 symbols: ZERO
141}
142panels {
143 name: "WHILE"
144 path: "Panels/Room 7/panel_4"
145 clue: "while"
146 answer: "tile"
147 symbols: ZERO
148}
149panels {
150 name: "AISLE"
151 path: "Panels/Room 7/panel_5"
152 clue: "aisle"
153 answer: "tile"
154 symbols: ZERO
155}
156panels {
157 name: "ZOO"
158 path: "Panels/Room 7/panel_6"
159 clue: "zoo"
160 answer: "true"
161 symbols: ZERO
162}
163panels {
164 name: "SOON"
165 path: "Panels/Room 7/panel_7"
166 clue: "soon"
167 answer: "tune"
168 symbols: ZERO
169}
170panels {
171 name: "NOON"
172 path: "Panels/Room 7/panel_8"
173 clue: "noon"
174 answer: "tune"
175 symbols: ZERO
176}
177panels {
178 name: "MOON"
179 path: "Panels/Room 7/panel_9"
180 clue: "moon"
181 answer: "tune"
182 symbols: ZERO
183}
184panels {
185 name: "PHASE"
186 path: "Panels/Room 9/panel_1"
187 clue: "phase"
188 answer: "maze"
189 symbols: ZERO
190}
191panels {
192 name: "SCALE"
193 path: "Panels/Room 9/panel_2"
194 clue: "scale"
195 answer: "jail"
196 symbols: ZERO
197}
198panels {
199 name: "WAYS"
200 path: "Panels/Room 9/panel_3"
201 clue: "ways"
202 answer: "maze"
203 symbols: ZERO
204}
205panels {
206 name: "TRAIL"
207 path: "Panels/Room 9/panel_4"
208 clue: "trail"
209 answer: "jail"
210 symbols: ZERO
211}
212keyholders {
213 name: "I"
214 path: "Components/KeyHolders/keyHolderL"
215 key: "i"
216}
217ports {
218 name: "GREAT"
219 display_name: "Main Entrance"
220 path: "Components/Warps/worldport"
221 destination { x: -3 y: 0 z: 11 }
222 rotation: 270
223}
224ports {
225 name: "TREE"
226 display_name: "Brown Hallway"
227 path: "Components/Warps/worldport5"
228 destination { x: -34 y: 0 z: 7 }
229 rotation: 270
230}
231ports {
232 name: "SUNTEMPLE"
233 display_name: "Sun Temple Entrance"
234 path: "Components/Warps/worldport3"
235 destination { x: -42 y: 0 z: -2 }
236 rotation: 270
237 required_door { name: "Sun Temple Entrance" }
238}
diff --git a/data/maps/the_unkempt/rooms/Middle Room.txtpb b/data/maps/the_unkempt/rooms/Middle Room.txtpb new file mode 100644 index 0000000..f47f37b --- /dev/null +++ b/data/maps/the_unkempt/rooms/Middle Room.txtpb
@@ -0,0 +1,29 @@
1name: "Middle Room"
2panels {
3 name: "RIDDLE"
4 path: "Panels/Room 5/panel_1"
5 clue: "riddle"
6 answer: "middle"
7 symbols: ZERO
8}
9panels {
10 name: "FELLOW"
11 path: "Panels/Room 5/panel_2"
12 clue: "fellow"
13 answer: "hello"
14 symbols: ZERO
15}
16panels {
17 name: "YELLOW"
18 path: "Panels/Room 5/panel_3"
19 clue: "yellow"
20 answer: "hello"
21 symbols: ZERO
22}
23panels {
24 name: "FIDDLE"
25 path: "Panels/Room 5/panel_4"
26 clue: "fiddle"
27 answer: "middle"
28 symbols: ZERO
29}
diff --git a/data/maps/the_unkempt/rooms/Right Area.txtpb b/data/maps/the_unkempt/rooms/Right Area.txtpb new file mode 100644 index 0000000..313c276 --- /dev/null +++ b/data/maps/the_unkempt/rooms/Right Area.txtpb
@@ -0,0 +1,162 @@
1name: "Right Area"
2panels {
3 name: "TOWER"
4 path: "Panels/Room 3/panel_1"
5 clue: "tower"
6 answer: "hour"
7 symbols: ZERO
8}
9panels {
10 name: "WARN"
11 path: "Panels/Room 3/panel_2"
12 clue: "warn"
13 answer: "horn"
14 symbols: ZERO
15}
16panels {
17 name: "OUTDO"
18 path: "Panels/Room 3/panel_3"
19 clue: "outdo"
20 answer: "into"
21 symbols: ZERO
22}
23panels {
24 name: "TATTOO"
25 path: "Panels/Room 3/panel_4"
26 clue: "tattoo"
27 answer: "into"
28 symbols: ZERO
29}
30panels {
31 name: "SOUR"
32 path: "Panels/Room 3/panel_5"
33 clue: "sour"
34 answer: "hour"
35 symbols: ZERO
36}
37panels {
38 name: "UNTRUE"
39 path: "Panels/Room 3/panel_6"
40 clue: "untrue"
41 answer: "into"
42 symbols: ZERO
43}
44panels {
45 name: "FLOWER"
46 path: "Panels/Room 3/panel_7"
47 clue: "flower"
48 answer: "hour"
49 symbols: ZERO
50}
51panels {
52 name: "MOURN"
53 path: "Panels/Room 3/panel_8"
54 clue: "mourn"
55 answer: "horn"
56 symbols: ZERO
57}
58panels {
59 name: "CORN"
60 path: "Panels/Room 3/panel_9"
61 clue: "corn"
62 answer: "horn"
63 symbols: ZERO
64}
65panels {
66 name: "SCUFF"
67 path: "Panels/Room 4/panel_1"
68 clue: "scuff"
69 answer: "rough"
70 symbols: ZERO
71}
72panels {
73 name: "WIN"
74 path: "Panels/Room 4/panel_2"
75 clue: "win"
76 answer: "grin"
77 symbols: ZERO
78}
79panels {
80 name: "BLUFF"
81 path: "Panels/Room 4/panel_3"
82 clue: "bluff"
83 answer: "rough"
84 symbols: ZERO
85}
86panels {
87 name: "INN"
88 path: "Panels/Room 4/panel_4"
89 clue: "inn"
90 answer: "grin"
91 symbols: ZERO
92}
93panels {
94 name: "OFF"
95 path: "Panels/Room 4/panel_5"
96 clue: "off"
97 answer: "cough"
98 symbols: ZERO
99}
100panels {
101 name: "TROUGH"
102 path: "Panels/Room 4/panel_6"
103 clue: "trough"
104 answer: "cough"
105 symbols: ZERO
106}
107panels {
108 name: "BEEN"
109 path: "Panels/Room 4/panel_7"
110 clue: "been"
111 answer: "grin"
112 symbols: ZERO
113}
114panels {
115 name: "SCOFF"
116 path: "Panels/Room 4/panel_8"
117 clue: "scoff"
118 answer: "cough"
119 symbols: ZERO
120}
121panels {
122 name: "TOUGH"
123 path: "Panels/Room 4/panel_9"
124 clue: "tough"
125 answer: "rough"
126 symbols: ZERO
127}
128panels {
129 name: "FORTH"
130 path: "Panels/Room 8/panel_1"
131 clue: "forth"
132 answer: "north"
133 symbols: ZERO
134}
135panels {
136 name: "QUIET"
137 path: "Panels/Room 8/panel_2"
138 clue: "quiet"
139 answer: "riot"
140 symbols: ZERO
141}
142panels {
143 name: "DIET"
144 path: "Panels/Room 8/panel_3"
145 clue: "diet"
146 answer: "riot"
147 symbols: ZERO
148}
149panels {
150 name: "FOURTH"
151 path: "Panels/Room 8/panel_4"
152 clue: "fourth"
153 answer: "north"
154 symbols: ZERO
155}
156panels {
157 name: "COLOR"
158 path: "Panels/Assorted/panel_1"
159 clue: "color"
160 answer: "orange"
161 symbols: EXAMPLE
162}
diff --git a/data/maps/the_unkempt/rooms/Unsymmetry Room.txtpb b/data/maps/the_unkempt/rooms/Unsymmetry Room.txtpb new file mode 100644 index 0000000..ff96ba1 --- /dev/null +++ b/data/maps/the_unkempt/rooms/Unsymmetry Room.txtpb
@@ -0,0 +1,99 @@
1name: "Unsymmetry Room"
2panels {
3 name: "UNINTERESTED"
4 path: "Panels/Unsymmetry Room/panel_a_1"
5 clue: "uninterested"
6 answer: "interested"
7 symbols: SUN
8}
9panels {
10 name: "IMPARTIAL"
11 path: "Panels/Unsymmetry Room/panel_b_1"
12 clue: "impartial"
13 answer: "disinterested"
14 symbols: SUN
15}
16panels {
17 name: "ENTERTAIN"
18 path: "Panels/Unsymmetry Room/panel_a_2"
19 clue: "entertain"
20 answer: "amuse"
21 symbols: SUN
22}
23panels {
24 name: "CONFUSE"
25 path: "Panels/Unsymmetry Room/panel_b_2"
26 clue: "confuse"
27 answer: "bemuse"
28 symbols: SUN
29}
30panels {
31 name: "UNLUCKY"
32 path: "Panels/Unsymmetry Room/panel_a_3"
33 clue: "unlucky"
34 answer: "lucky"
35 symbols: SUN
36}
37panels {
38 name: "UNEXPECTED"
39 path: "Panels/Unsymmetry Room/panel_b_3"
40 clue: "unexpected"
41 answer: "fortuitous"
42 symbols: SUN
43}
44panels {
45 name: "UNIRONIC"
46 path: "Panels/Unsymmetry Room/panel_a_4"
47 clue: "unironic"
48 answer: "ironic"
49 symbols: SUN
50}
51panels {
52 name: "ACCIDENTAL"
53 path: "Panels/Unsymmetry Room/panel_b_4"
54 clue: "accidental"
55 answer: "coincidental"
56 symbols: SUN
57}
58panels {
59 name: "COMPLETE"
60 path: "Panels/Unsymmetry Room/panel_a_5"
61 clue: "complete"
62 answer: "graduate"
63 symbols: SUN
64}
65panels {
66 name: "ENROLL"
67 path: "Panels/Unsymmetry Room/panel_b_5"
68 clue: "enroll"
69 answer: "matriculate"
70 symbols: SUN
71}
72panels {
73 name: "ACCEPT"
74 path: "Panels/Unsymmetry Room/panel_a_6"
75 clue: "accept"
76 answer: "deny"
77 symbols: SUN
78}
79panels {
80 name: "DISPROVE"
81 path: "Panels/Unsymmetry Room/panel_b_6"
82 clue: "disprove"
83 answer: "refute"
84 symbols: SUN
85}
86panels {
87 name: "SCRUTINIZE (Purple)"
88 path: "Panels/Unsymmetry Room/panel_a_7"
89 clue: "scrutinize"
90 answer: "skim"
91 symbols: SUN
92}
93panels {
94 name: "SCRUTINIZE (Cyan)"
95 path: "Panels/Unsymmetry Room/panel_b_7"
96 clue: "scrutinize"
97 answer: "peruse"
98 symbols: SUN
99}
diff --git a/data/maps/the_unkempt/rooms/V Keyholder.txtpb b/data/maps/the_unkempt/rooms/V Keyholder.txtpb new file mode 100644 index 0000000..8a4941d --- /dev/null +++ b/data/maps/the_unkempt/rooms/V Keyholder.txtpb
@@ -0,0 +1,6 @@
1name: "V Keyholder"
2keyholders {
3 name: "V"
4 path: "Components/KeyHolders/keyHolderV"
5 key: "v"
6}
diff --git a/data/maps/the_unkempt/rooms/V1 Room.txtpb b/data/maps/the_unkempt/rooms/V1 Room.txtpb new file mode 100644 index 0000000..078cb37 --- /dev/null +++ b/data/maps/the_unkempt/rooms/V1 Room.txtpb
@@ -0,0 +1,5 @@
1name: "V1 Room"
2letters {
3 key: "v"
4 path: "Components/Collectables/v"
5}
diff --git a/data/maps/the_unkempt/rooms/W Keyholder.txtpb b/data/maps/the_unkempt/rooms/W Keyholder.txtpb new file mode 100644 index 0000000..e16f997 --- /dev/null +++ b/data/maps/the_unkempt/rooms/W Keyholder.txtpb
@@ -0,0 +1,6 @@
1name: "W Keyholder"
2keyholders {
3 name: "W"
4 path: "Components/KeyHolders/keyHolderW"
5 key: "w"
6}
diff --git a/data/maps/the_unkempt/rooms/W2 Room.txtpb b/data/maps/the_unkempt/rooms/W2 Room.txtpb new file mode 100644 index 0000000..2fa07d4 --- /dev/null +++ b/data/maps/the_unkempt/rooms/W2 Room.txtpb
@@ -0,0 +1,6 @@
1name: "W2 Room"
2letters {
3 key: "w"
4 level2: true
5 path: "Components/Collectables/w2"
6}
diff --git a/data/maps/the_unyielding/connections.txtpb b/data/maps/the_unyielding/connections.txtpb index ffbb756..b541676 100644 --- a/data/maps/the_unyielding/connections.txtpb +++ b/data/maps/the_unyielding/connections.txtpb
@@ -109,6 +109,11 @@ connections {
109 door { name: "Cyan Alcove" } 109 door { name: "Cyan Alcove" }
110} 110}
111connections { 111connections {
112 from_room: "Star Rooms"
113 to_room: "Black Alcove"
114 door { name: "Black Alcove" }
115}
116connections {
112 from_room: "White Corners" 117 from_room: "White Corners"
113 to_room: "Northeast Room 1" 118 to_room: "Northeast Room 1"
114 door { name: "Northeast Room 1 Entrance" } 119 door { name: "Northeast Room 1 Entrance" }
diff --git a/data/maps/the_unyielding/doors.txtpb b/data/maps/the_unyielding/doors.txtpb index c0b2c19..265442c 100644 --- a/data/maps/the_unyielding/doors.txtpb +++ b/data/maps/the_unyielding/doors.txtpb
@@ -183,6 +183,21 @@ doors {
183 panels { room: "Central Connected Area" name: "CHIN" } 183 panels { room: "Central Connected Area" name: "CHIN" }
184 panels { room: "Central Connected Area" name: "DING" } 184 panels { room: "Central Connected Area" name: "DING" }
185 location_room: "Central Connected Area" 185 location_room: "Central Connected Area"
186 location_name: "East Room 2"
187}
188doors {
189 name: "East Room 1"
190 type: LOCATION_ONLY
191 panels { room: "East Room 1" name: "CHIN" }
192 panels { room: "East Room 1" name: "HEAT" }
193 panels { room: "East Room 1" name: "END" }
194 panels { room: "East Room 1" name: "FLY" }
195 panels { room: "East Room 1" name: "OUCH" }
196 panels { room: "East Room 1" name: "HAG" }
197 panels { room: "East Room 1" name: "TIN" }
198 panels { room: "East Room 1" name: "RID" }
199 panels { room: "East Room 1" name: "TUG" }
200 location_room: "East Room 1"
186} 201}
187doors { 202doors {
188 name: "Orange Alcove" 203 name: "Orange Alcove"
@@ -198,6 +213,15 @@ doors {
198 panels { room: "Central Connected Area" name: "MET" } 213 panels { room: "Central Connected Area" name: "MET" }
199} 214}
200doors { 215doors {
216 name: "Black Alcove"
217 type: EVENT
218 panels { room: "Star Rooms" name: "TURN" }
219 panels { room: "Central Connected Area" name: "HAD" }
220 panels { room: "Central Connected Area" name: "SOW" }
221 panels { room: "Central Connected Area" name: "ARK" }
222 panels { room: "Central Connected Area" name: "MET" }
223}
224doors {
201 name: "Hero Room Entrance" 225 name: "Hero Room Entrance"
202 type: LOCATION_ONLY 226 type: LOCATION_ONLY
203 panels { room: "Northeast Room 1" name: "HAT" } 227 panels { room: "Northeast Room 1" name: "HAT" }
@@ -210,6 +234,7 @@ doors {
210 panels { room: "Northeast Room 1" name: "CAR" } 234 panels { room: "Northeast Room 1" name: "CAR" }
211 panels { room: "Northeast Room 1" name: "SIR" } 235 panels { room: "Northeast Room 1" name: "SIR" }
212 location_room: "Northeast Room 1" 236 location_room: "Northeast Room 1"
237 location_name: "Northeast Room 1"
213} 238}
214doors { 239doors {
215 name: "Northeast Corner Behind" 240 name: "Northeast Corner Behind"
@@ -237,6 +262,7 @@ doors {
237 panels { room: "Northwest Room" name: "HER" } 262 panels { room: "Northwest Room" name: "HER" }
238 panels { room: "Northwest Room" name: "DAM" } 263 panels { room: "Northwest Room" name: "DAM" }
239 location_room: "Northwest Room" 264 location_room: "Northwest Room"
265 location_name: "Northwest Room"
240} 266}
241doors { 267doors {
242 name: "Cyan Alcove" 268 name: "Cyan Alcove"
@@ -266,6 +292,7 @@ doors {
266 panels { room: "Southwest Room 3" name: "HOST" } 292 panels { room: "Southwest Room 3" name: "HOST" }
267 panels { room: "Southwest Room 3" name: "MUG" } 293 panels { room: "Southwest Room 3" name: "MUG" }
268 location_room: "Southwest Room 3" 294 location_room: "Southwest Room 3"
295 location_name: "Southwest Room 3"
269} 296}
270doors { 297doors {
271 name: "Southwest Room 2 Entrance" 298 name: "Southwest Room 2 Entrance"
@@ -285,6 +312,7 @@ doors {
285 panels { room: "Southwest Room 2" name: "ION" } 312 panels { room: "Southwest Room 2" name: "ION" }
286 panels { room: "Southwest Room 2" name: "INN" } 313 panels { room: "Southwest Room 2" name: "INN" }
287 location_room: "Southwest Room 2" 314 location_room: "Southwest Room 2"
315 location_name: "Southwest Room 2"
288} 316}
289doors { 317doors {
290 name: "Southwest 4" 318 name: "Southwest 4"
@@ -403,6 +431,7 @@ doors {
403 panels { room: "Central Connected Area" name: "SON (1)" } 431 panels { room: "Central Connected Area" name: "SON (1)" }
404 panels { room: "Central Connected Area" name: "URGE" } 432 panels { room: "Central Connected Area" name: "URGE" }
405 location_room: "Central Connected Area" 433 location_room: "Central Connected Area"
434 location_name: "Northeast Room 2"
406} 435}
407doors { 436doors {
408 name: "South Right Painting" 437 name: "South Right Painting"
@@ -470,5 +499,47 @@ doors {
470doors { 499doors {
471 name: "Cyan Doors" 500 name: "Cyan Doors"
472 type: EVENT 501 type: EVENT
473 switches: "double_letters" 502 receivers: "Components/Doors/entry_4"
503 receivers: "Panels/Miscellaneous/entry_2/teleportListener"
504 receivers: "Panels/Miscellaneous/entry_3/teleportListener"
505 double_letters: true
506}
507doors {
508 name: "Blue D Room Puzzles"
509 type: LOCATION_ONLY
510 panels { room: "Central Connected Area" name: "FOX" }
511 panels { room: "Central Connected Area" name: "LOCKS" }
512 panels { room: "Central Connected Area" name: "BOX" }
513 panels { room: "Central Connected Area" name: "SQUAWKS" }
514 panels { room: "Central Connected Area" name: "HAWKS" }
515 panels { room: "Central Connected Area" name: "TALKS" }
516 location_room: "Central Connected Area"
517}
518doors {
519 name: "Color Hallway Panels"
520 type: LOCATION_ONLY
521 panels { room: "Brown Alcove" name: "BROW" }
522 panels { room: "Central Connected Area" name: "RANGE" }
523 panels { room: "Central Connected Area" name: "WHIT" }
524 panels { room: "Central Connected Area" name: "ALMOND" }
525 panels { room: "Central Connected Area" name: "DAY" }
526 panels { room: "Central Connected Area" name: "REAM" }
527 panels { room: "Central Connected Area" name: "SON (2)" }
528 panels { room: "Central Connected Area" name: "RAY" }
529 panels { room: "Central Connected Area" name: "BURROWING" }
530 panels { room: "Orange Alcove" name: "ON" }
531 panels { room: "Plaza Entrance" name: "GEE" }
532 panels { room: "Plaza Entrance" name: "SEA" }
533 panels { room: "Gray Alcove" name: "GRAVELY" }
534 panels { room: "Cyan Alcove" name: "CAN" }
535 panels { room: "Star Rooms" name: "CYANIDE" }
536 panels { room: "Star Rooms" name: "BACK" }
537 panels { room: "Black Alcove" name: "LACK" }
538 panels { room: "White Corners" name: "ARCH" }
539 panels { room: "White Corners" name: "ZERO" }
540 panels { room: "White Corners" name: "DAM" }
541 panels { room: "White Corners" name: "WHEN" }
542 panels { room: "Hero Room" name: "HER" }
543 panels { room: "Daisy Alcove" name: "CYANIDES" }
544 location_room: "Central Connected Area"
474} 545}
diff --git a/data/maps/the_unyielding/rooms/Bearer Entrance.txtpb b/data/maps/the_unyielding/rooms/Bearer Entrance.txtpb index 4c1440f..6ce69da 100644 --- a/data/maps/the_unyielding/rooms/Bearer Entrance.txtpb +++ b/data/maps/the_unyielding/rooms/Bearer Entrance.txtpb
@@ -1,5 +1,8 @@
1name: "Bearer Entrance" 1name: "Bearer Entrance"
2ports { 2ports {
3 name: "BEARER" 3 name: "BEARER"
4 display_name: "East of Yellow Worldport"
4 path: "Components/Warps/worldport4" 5 path: "Components/Warps/worldport4"
6 destination { x: 23 y: 0 z: -29 }
7 rotation: 90
5} 8}
diff --git a/data/maps/the_unyielding/rooms/Digital Entrance.txtpb b/data/maps/the_unyielding/rooms/Digital Entrance.txtpb index 74665a2..853c5f0 100644 --- a/data/maps/the_unyielding/rooms/Digital Entrance.txtpb +++ b/data/maps/the_unyielding/rooms/Digital Entrance.txtpb
@@ -8,5 +8,8 @@ panels {
8} 8}
9ports { 9ports {
10 name: "DIGITAL" 10 name: "DIGITAL"
11 display_name: "South of Yellow Worldport"
11 path: "Components/Warps/worldport" 12 path: "Components/Warps/worldport"
13 destination { x: 0 y: 0 z: 0 }
14 rotation: 0
12} 15}
diff --git a/data/maps/the_unyielding/rooms/Nuanced Entrance.txtpb b/data/maps/the_unyielding/rooms/Nuanced Entrance.txtpb index f011b32..454dc3f 100644 --- a/data/maps/the_unyielding/rooms/Nuanced Entrance.txtpb +++ b/data/maps/the_unyielding/rooms/Nuanced Entrance.txtpb
@@ -1,5 +1,8 @@
1name: "Nuanced Entrance" 1name: "Nuanced Entrance"
2ports { 2ports {
3 name: "NUANCED" 3 name: "NUANCED"
4 display_name: "West of Yellow Worldport"
4 path: "Components/Warps/worldport3" 5 path: "Components/Warps/worldport3"
6 destination { x: -23 y: 0 z: -29 }
7 rotation: 270
5} 8}
diff --git a/data/maps/the_unyielding/rooms/Plaza Entrance.txtpb b/data/maps/the_unyielding/rooms/Plaza Entrance.txtpb index 0bc60a7..f866d87 100644 --- a/data/maps/the_unyielding/rooms/Plaza Entrance.txtpb +++ b/data/maps/the_unyielding/rooms/Plaza Entrance.txtpb
@@ -15,5 +15,8 @@ panels {
15} 15}
16ports { 16ports {
17 name: "PLAZA" 17 name: "PLAZA"
18 display_name: "Dark Hallway"
18 path: "Components/Warps/worldport5" 19 path: "Components/Warps/worldport5"
20 destination { x: 35 y: 0 z: 44 }
21 rotation: 270
19} 22}
diff --git a/data/maps/the_unyielding/rooms/Yellow Left.txtpb b/data/maps/the_unyielding/rooms/Yellow Left.txtpb index 9c7d023..192d901 100644 --- a/data/maps/the_unyielding/rooms/Yellow Left.txtpb +++ b/data/maps/the_unyielding/rooms/Yellow Left.txtpb
@@ -5,4 +5,5 @@ panels {
5 clue: "sickness" 5 clue: "sickness"
6 answer: "health" 6 answer: "health"
7 symbols: SUN 7 symbols: SUN
8 required_door { name: "Cyan Doors" }
8} 9}
diff --git a/data/maps/the_unyielding/rooms/Yellow Right.txtpb b/data/maps/the_unyielding/rooms/Yellow Right.txtpb index 0599f29..d554c73 100644 --- a/data/maps/the_unyielding/rooms/Yellow Right.txtpb +++ b/data/maps/the_unyielding/rooms/Yellow Right.txtpb
@@ -5,4 +5,5 @@ panels {
5 clue: "health" 5 clue: "health"
6 answer: "sickness" 6 answer: "sickness"
7 symbols: SUN 7 symbols: SUN
8 required_door { name: "Cyan Doors" }
8} 9}
diff --git a/data/maps/the_wise/connections.txtpb b/data/maps/the_wise/connections.txtpb new file mode 100644 index 0000000..e3aa07b --- /dev/null +++ b/data/maps/the_wise/connections.txtpb
@@ -0,0 +1,10 @@
1connections {
2 from_room: "Entry"
3 to_room: "Puzzles"
4 door { name: "Front Door" }
5}
6connections {
7 from_room: "Puzzles"
8 to_room: "Mastery"
9 door { name: "Mastery" }
10}
diff --git a/data/maps/the_wise/doors.txtpb b/data/maps/the_wise/doors.txtpb new file mode 100644 index 0000000..cef4af3 --- /dev/null +++ b/data/maps/the_wise/doors.txtpb
@@ -0,0 +1,36 @@
1doors {
2 name: "Front Door"
3 type: STANDARD
4 receivers: "Components/Doors/entry_2"
5 panels { room: "Entry" name: "INK" }
6 location_room: "Entry"
7}
8doors {
9 name: "Seasons"
10 type: EVENT
11 panels { room: "Puzzles" name: "ERAS" answer: "seasons" }
12}
13doors {
14 name: "Mastery"
15 type: EVENT
16 panels { room: "Puzzles" name: "STORY" }
17 panels { room: "Puzzles" name: "VENTURE" }
18 panels { room: "Puzzles" name: "PASSED" }
19 panels { room: "Puzzles" name: "SLUMBERING" }
20 panels { room: "Puzzles" name: "RHYME" }
21 panels { room: "Puzzles" name: "OBSCURE" }
22 panels { room: "Puzzles" name: "PROPHET" }
23 panels { room: "Puzzles" name: "ERAS" }
24 panels { room: "Puzzles" name: "DARKNESS" }
25 panels { room: "Puzzles" name: "PRINCE" }
26 panels { room: "Puzzles" name: "BATH" }
27 panels { room: "Puzzles" name: "CHAOTIC" }
28 panels { room: "Puzzles" name: "EYES" }
29 panels { room: "Puzzles" name: "QUEENDOOM" }
30 panels { room: "Puzzles" name: "SHOUTS" }
31 panels { room: "Puzzles" name: "INTELLIGENCE" }
32 panels { room: "Puzzles" name: "EARTHWAR" }
33 panels { room: "Puzzles" name: "SLEEPER" }
34 panels { room: "Puzzles" name: "BOTTLE" }
35 panels { room: "Puzzles" name: "WORDS" }
36}
diff --git a/data/maps/the_wise/metadata.txtpb b/data/maps/the_wise/metadata.txtpb new file mode 100644 index 0000000..91af34e --- /dev/null +++ b/data/maps/the_wise/metadata.txtpb
@@ -0,0 +1,3 @@
1display_name: "The Wise"
2# This port is out of bounds.
3excluded_nodes: "Components/Warps/worldport"
diff --git a/data/maps/the_wise/rooms/Entry.txtpb b/data/maps/the_wise/rooms/Entry.txtpb new file mode 100644 index 0000000..789d555 --- /dev/null +++ b/data/maps/the_wise/rooms/Entry.txtpb
@@ -0,0 +1,12 @@
1name: "Entry"
2panels {
3 name: "INK"
4 path: "Panels/Entry/entry_1"
5 clue: "ink"
6 answer: "link"
7 symbols: SPARKLES
8}
9paintings {
10 name: "TRIANGLE"
11 path: "Components/Paintings/triangle"
12}
diff --git a/data/maps/the_wise/rooms/Mastery.txtpb b/data/maps/the_wise/rooms/Mastery.txtpb new file mode 100644 index 0000000..749837e --- /dev/null +++ b/data/maps/the_wise/rooms/Mastery.txtpb
@@ -0,0 +1,5 @@
1name: "Mastery"
2masteries {
3 name: "MASTERY"
4 path: "Components/Collectables/smiley"
5}
diff --git a/data/maps/the_wise/rooms/Puzzles.txtpb b/data/maps/the_wise/rooms/Puzzles.txtpb new file mode 100644 index 0000000..ab34f13 --- /dev/null +++ b/data/maps/the_wise/rooms/Puzzles.txtpb
@@ -0,0 +1,151 @@
1name: "Puzzles"
2panels {
3 name: "STORY"
4 path: "Panels/Room_1/panel_1"
5 clue: "story"
6 answer: "legend"
7 symbols: SUN
8 required_door { name: "Seasons" }
9}
10panels {
11 name: "VENTURE"
12 path: "Panels/Room_1/panel_2"
13 clue: "venture"
14 answer: "adventure"
15 symbols: SPARKLES
16 required_door { name: "Seasons" }
17}
18panels {
19 name: "PASSED"
20 path: "Panels/Room_1/panel_3"
21 clue: "passed"
22 answer: "past"
23 symbols: ZERO
24}
25panels {
26 name: "SLUMBERING"
27 path: "Panels/Room_1/panel_4"
28 clue: "slumbering"
29 answer: "awakening"
30 symbols: SUN
31 required_door { name: "Seasons" }
32}
33panels {
34 name: "RHYME"
35 path: "Panels/Room_1/panel_5"
36 clue: "rhyme"
37 answer: "time"
38 symbols: ZERO
39}
40panels {
41 name: "OBSCURE"
42 path: "Panels/Room_1/panel_6"
43 clue: "obscure"
44 answer: "mask"
45 symbols: PYRAMID
46}
47panels {
48 name: "PROPHET"
49 path: "Panels/Room_1/panel_7"
50 clue: "prophet"
51 answer: "oracle"
52 symbols: SUN
53}
54panels {
55 name: "ERAS"
56 path: "Panels/Room_1/panel_8"
57 clue: "eras"
58 answer: "gsae"
59 symbols: SUN
60 proxies { answer: "ages" path: "Panels/Proxies/panel_8_proxy_1" }
61 proxies { answer: "seasons" path: "Panels/Proxies/panel_8_proxy_2" }
62}
63panels {
64 name: "DARKNESS"
65 path: "Panels/Room_1/panel_9"
66 clue: "darkness"
67 answer: "twilight"
68 symbols: PYRAMID
69 required_door { name: "Seasons" }
70}
71panels {
72 name: "PRINCE"
73 path: "Panels/Room_1/panel_10"
74 clue: "prince"
75 answer: "princess"
76 symbols: GENDER
77 required_door { name: "Seasons" }
78}
79panels {
80 name: "BATH"
81 path: "Panels/Room_1/panel_11"
82 clue: "bath"
83 answer: "breath"
84 symbols: SPARKLES
85}
86panels {
87 name: "CHAOTIC"
88 path: "Panels/Room_1/panel_12"
89 clue: "chaotic"
90 answer: "wild"
91 symbols: SUN
92}
93panels {
94 name: "EYES"
95 path: "Panels/Room_1/panel_13"
96 clue: "eyes"
97 answer: "tears"
98 symbols: STARS
99}
100panels {
101 name: "QUEENDOOM"
102 path: "Panels/Room_1/panel_14"
103 clue: "queendoom"
104 answer: "kingdom"
105 symbols: SUN
106 symbols: SPARKLES
107}
108panels {
109 name: "SHOUTS"
110 path: "Panels/Room_1/panel_15"
111 clue: "shouts"
112 answer: "echoes"
113 symbols: AGE
114 required_door { name: "Seasons" }
115}
116panels {
117 name: "INTELLIGENCE"
118 path: "Panels/Room_1/panel_16"
119 clue: "intelligence"
120 answer: "wisdom"
121 symbols: AGE
122}
123panels {
124 name: "EARTHWAR"
125 path: "Panels/Room_1/panel_17"
126 clue: "earthwar"
127 answer: "skyward"
128 symbols: SUN
129 symbols: SPARKLES
130}
131panels {
132 name: "SLEEPER"
133 path: "Panels/Room_1/panel_19"
134 clue: "sleeper"
135 answer: "waker"
136 symbols: SUN
137}
138panels {
139 name: "BOTTLE"
140 path: "Panels/Room_1/panel_20"
141 clue: "bottle"
142 answer: "cap"
143 symbols: BOXES
144}
145panels {
146 name: "WORDS"
147 path: "Panels/Room_1/panel_18"
148 clue: "words"
149 answer: "sword"
150 symbols: ANAGRAM
151}
diff --git a/data/maps/the_wondrous/connections.txtpb b/data/maps/the_wondrous/connections.txtpb new file mode 100644 index 0000000..0bd773a --- /dev/null +++ b/data/maps/the_wondrous/connections.txtpb
@@ -0,0 +1,10 @@
1connections {
2 from_room: "Entry"
3 to_room: "Regular"
4 door { name: "Front Door" }
5}
6connections {
7 from_room: "Regular"
8 to_room: "Huge"
9 door { name: "Shrink Door" }
10}
diff --git a/data/maps/the_wondrous/doors.txtpb b/data/maps/the_wondrous/doors.txtpb new file mode 100644 index 0000000..3951604 --- /dev/null +++ b/data/maps/the_wondrous/doors.txtpb
@@ -0,0 +1,24 @@
1doors {
2 name: "Front Door"
3 type: EVENT
4 panels { room: "Entry" name: "WONDER" }
5}
6doors {
7 name: "Shrink Door"
8 type: STANDARD
9 receivers: "Components/Doors/wonderlandDoor2/animationListener2"
10 panels { room: "Regular" name: "SHRINK" }
11 location_room: "Regular"
12}
13doors {
14 name: "Big Door"
15 type: EVENT
16 panels { room: "Huge" name: "SHRINK" }
17 panels { room: "Huge" name: "IRE" }
18 panels { room: "Huge" name: "BRIE" }
19 panels { room: "Huge" name: "WICK" }
20 panels { room: "Huge" name: "BARK" }
21 panels { room: "Huge" name: "HARE" }
22 panels { room: "Huge" name: "CHIME" }
23 panels { room: "Huge" name: "LIBRARY" }
24}
diff --git a/data/maps/the_wondrous/metadata.txtpb b/data/maps/the_wondrous/metadata.txtpb new file mode 100644 index 0000000..1c8e04c --- /dev/null +++ b/data/maps/the_wondrous/metadata.txtpb
@@ -0,0 +1,5 @@
1display_name: "The Wondrous"
2worldport_entrance {
3 room: "Entry"
4 name: "DAEDALUS"
5}
diff --git a/data/maps/the_wondrous/rooms/Entry.txtpb b/data/maps/the_wondrous/rooms/Entry.txtpb new file mode 100644 index 0000000..543d193 --- /dev/null +++ b/data/maps/the_wondrous/rooms/Entry.txtpb
@@ -0,0 +1,14 @@
1name: "Entry"
2panels {
3 name: "WONDER"
4 path: "Panels/panel_1"
5 clue: "wonder"
6 answer: "wonder"
7}
8ports {
9 name: "DAEDALUS"
10 display_name: "Entrance"
11 path: "Components/Warps/worldport"
12 destination { x: 18 y: 0 z: 41 }
13 rotation: 180
14}
diff --git a/data/maps/the_wondrous/rooms/Huge.txtpb b/data/maps/the_wondrous/rooms/Huge.txtpb new file mode 100644 index 0000000..6ca6ef8 --- /dev/null +++ b/data/maps/the_wondrous/rooms/Huge.txtpb
@@ -0,0 +1,57 @@
1name: "Huge"
2panels {
3 name: "SHRINK"
4 path: "Panels/panel_3"
5 clue: "shrink"
6 answer: "shrink"
7 display_name: "SHRINK (2)"
8}
9panels {
10 name: "IRE"
11 path: "Panels/panel_4"
12 clue: "ire"
13 answer: "fire"
14 symbols: SPARKLES
15}
16panels {
17 name: "BRIE"
18 path: "Panels/panel_5"
19 clue: "brie"
20 answer: "three"
21 symbols: ZERO
22}
23panels {
24 name: "WICK"
25 path: "Panels/panel_6"
26 clue: "wick"
27 answer: "candle"
28 symbols: BOXES
29}
30panels {
31 name: "BARK"
32 path: "Panels/panel_7"
33 clue: "bark"
34 answer: "tree"
35 symbols: BOXES
36}
37panels {
38 name: "HARE"
39 path: "Panels/panel_8"
40 clue: "hare"
41 answer: "chair"
42 symbols: ZERO
43}
44panels {
45 name: "CHIME"
46 path: "Panels/panel_9"
47 clue: "chime"
48 answer: "chimney"
49 symbols: SPARKLES
50}
51panels {
52 name: "LIBRARY"
53 path: "Panels/panel_10"
54 clue: "library"
55 answer: "book"
56 symbols: BOXES
57}
diff --git a/data/maps/the_wondrous/rooms/Regular.txtpb b/data/maps/the_wondrous/rooms/Regular.txtpb new file mode 100644 index 0000000..65df029 --- /dev/null +++ b/data/maps/the_wondrous/rooms/Regular.txtpb
@@ -0,0 +1,8 @@
1name: "Regular"
2panels {
3 name: "SHRINK"
4 path: "Panels/panel_2"
5 clue: "shrink"
6 answer: "shrink"
7 display_name: "SHRINK (1)"
8}
diff --git a/data/maps/the_words/connections.txtpb b/data/maps/the_words/connections.txtpb new file mode 100644 index 0000000..f25ac2b --- /dev/null +++ b/data/maps/the_words/connections.txtpb
@@ -0,0 +1,5 @@
1connections {
2 from_room: "Main Area"
3 to_room: "Ending"
4 door { name: "Ending" }
5}
diff --git a/data/maps/the_words/doors.txtpb b/data/maps/the_words/doors.txtpb new file mode 100644 index 0000000..20f439b --- /dev/null +++ b/data/maps/the_words/doors.txtpb
@@ -0,0 +1,12 @@
1doors {
2 name: "Ending"
3 type: EVENT
4 panels { room: "Main Area" name: "FRUIT" }
5 panels { room: "Main Area" name: "FLOWER" }
6 panels { room: "Main Area" name: "GEM" }
7 panels { room: "Main Area" name: "DAIRY" }
8 panels { room: "Main Area" name: "TREE" }
9 panels { room: "Main Area" name: "METAL" }
10 panels { room: "Main Area" name: "CLOTHES" }
11 panels { room: "Main Area" name: "SPICE" }
12}
diff --git a/data/maps/the_words/metadata.txtpb b/data/maps/the_words/metadata.txtpb new file mode 100644 index 0000000..2dadcae --- /dev/null +++ b/data/maps/the_words/metadata.txtpb
@@ -0,0 +1,11 @@
1display_name: "The Words"
2# These are old proxies of the main room's panels that are not linked up
3# anymore.
4excluded_nodes: "Panels/Proxies/panel_3"
5excluded_nodes: "Panels/Proxies/panel_4"
6excluded_nodes: "Panels/Proxies/panel_6"
7excluded_nodes: "Panels/Proxies/panel_9"
8# These are all tantalyzingly hidden out of bounds. What's up with that?
9excluded_nodes: "Panels/Proxies/panel_backside_1"
10excluded_nodes: "Panels/Proxies/panel_backside_2"
11excluded_nodes: "Panels/Proxies/panel_backside_3"
diff --git a/data/maps/the_words/rooms/Ending.txtpb b/data/maps/the_words/rooms/Ending.txtpb new file mode 100644 index 0000000..79bd569 --- /dev/null +++ b/data/maps/the_words/rooms/Ending.txtpb
@@ -0,0 +1,5 @@
1name: "Ending"
2endings {
3 name: "BLUE"
4 path: "Components/Endings/blue_ending"
5}
diff --git a/data/maps/the_words/rooms/Main Area.txtpb b/data/maps/the_words/rooms/Main Area.txtpb new file mode 100644 index 0000000..ae57252 --- /dev/null +++ b/data/maps/the_words/rooms/Main Area.txtpb
@@ -0,0 +1,64 @@
1name: "Main Area"
2panels {
3 name: "FRUIT"
4 path: "Panels/Room_1/panel_2"
5 clue: "fruit"
6 answer: "peach"
7 symbols: EXAMPLE
8}
9panels {
10 name: "FLOWER"
11 path: "Panels/Room_1/panel_3"
12 clue: "flower"
13 answer: "rose"
14 symbols: EXAMPLE
15}
16panels {
17 name: "GEM"
18 path: "Panels/Room_1/panel_4"
19 clue: "gem"
20 answer: "jade"
21 symbols: EXAMPLE
22}
23panels {
24 name: "DAIRY"
25 path: "Panels/Room_1/panel_5"
26 clue: "dairy"
27 answer: "cream"
28 symbols: EXAMPLE
29}
30panels {
31 name: "TREE"
32 path: "Panels/Room_1/panel_6"
33 clue: "tree"
34 answer: "walnut"
35 symbols: EXAMPLE
36}
37panels {
38 name: "METAL"
39 path: "Panels/Room_1/panel_7"
40 clue: "metal"
41 answer: "silver"
42 symbols: EXAMPLE
43}
44panels {
45 name: "CLOTHES"
46 path: "Panels/Room_1/panel_8"
47 clue: "clothes"
48 answer: "denim"
49 symbols: EXAMPLE
50}
51panels {
52 name: "SPICE"
53 path: "Panels/Room_1/panel_9"
54 clue: "spice"
55 answer: "sage"
56 symbols: EXAMPLE
57}
58ports {
59 name: "ENTRY"
60 display_name: "Worldport"
61 path: "Components/Warps/worldport"
62 destination { x: 0 y: 0 z: 9.5 }
63 rotation: 0
64}
diff --git a/data/metadata.txtpb b/data/metadata.txtpb new file mode 100644 index 0000000..998aa8c --- /dev/null +++ b/data/metadata.txtpb
@@ -0,0 +1,56 @@
1version {
2 major: 8
3 minor: 0
4 patch: 3
5}
6# Filler item.
7special_names: "A Job Well Done"
8# Symbol items.
9special_names: "Age Symbol"
10special_names: "Anagram Symbol"
11special_names: "Boxes Symbol"
12special_names: "Cross Symbol"
13special_names: "Eval Symbol"
14special_names: "Example Symbol"
15special_names: "Gender Symbol"
16special_names: "Job Symbol"
17special_names: "Lingo Symbol"
18special_names: "Null Symbol"
19special_names: "Planet Symbol"
20special_names: "Pyramid Symbol"
21special_names: "Question Symbol"
22special_names: "Sound Symbol"
23special_names: "Sparkles Symbol"
24special_names: "Stars Symbol"
25special_names: "Sun Symbol"
26special_names: "Sweet Symbol"
27special_names: "Zero Symbol"
28# Anti collectable traps
29special_names: "Anti A"
30special_names: "Anti B"
31special_names: "Anti C"
32special_names: "Anti D"
33special_names: "Anti E"
34special_names: "Anti F"
35special_names: "Anti G"
36special_names: "Anti H"
37special_names: "Anti I"
38special_names: "Anti J"
39special_names: "Anti K"
40special_names: "Anti L"
41special_names: "Anti M"
42special_names: "Anti N"
43special_names: "Anti O"
44special_names: "Anti P"
45special_names: "Anti Q"
46special_names: "Anti R"
47special_names: "Anti S"
48special_names: "Anti T"
49special_names: "Anti U"
50special_names: "Anti V"
51special_names: "Anti W"
52special_names: "Anti X"
53special_names: "Anti Y"
54special_names: "Anti Z"
55# Numbers for The Fuzzy
56special_names: "Numbers"
diff --git a/data/progressives.txtpb b/data/progressives.txtpb new file mode 100644 index 0000000..51a0742 --- /dev/null +++ b/data/progressives.txtpb
@@ -0,0 +1,24 @@
1progressives {
2 name: "Progressive Gold Ending"
3 doors { map: "daedalus" name: "Red Rainbow Room" }
4 doors { map: "daedalus" name: "Orange Rainbow Room" }
5 doors { map: "daedalus" name: "Yellow Rainbow Room" }
6 doors { map: "daedalus" name: "Green Rainbow Room" }
7 doors { map: "daedalus" name: "Blue Rainbow Room" }
8 doors { map: "daedalus" name: "Purple Rainbow Room" }
9 doors { map: "daedalus" name: "Cyan Rainbow Room" }
10 doors { map: "daedalus" name: "Brown Rainbow Room" }
11}
12progressives {
13 name: "Icarus Quick Travel"
14 doors { map: "icarus" name: "Quick Travel 2" }
15 doors { map: "icarus" name: "Quick Travel 3" }
16 doors { map: "icarus" name: "Quick Travel 4" }
17 doors { map: "icarus" name: "Quick Travel 5" }
18 doors { map: "icarus" name: "Quick Travel 6" }
19 doors { map: "icarus" name: "Quick Travel 7" }
20 doors { map: "icarus" name: "Quick Travel 8" }
21 doors { map: "icarus" name: "Quick Travel 9" }
22 doors { map: "icarus" name: "Quick Travel 10" }
23 doors { map: "icarus" name: "Quick Travel 1" }
24}
diff --git a/proto/data.proto b/proto/data.proto index d3933c4..e9cc7d7 100644 --- a/proto/data.proto +++ b/proto/data.proto
@@ -27,6 +27,36 @@ enum DoorType {
27 27
28 // This door is an item if gravestone shuffle is enabled, and is a location as long as panelsanity is not on. 28 // This door is an item if gravestone shuffle is enabled, and is a location as long as panelsanity is not on.
29 GRAVESTONE = 6; 29 GRAVESTONE = 6;
30
31 // This door is never a location, and is an item as long as gallery painting shuffle is on.
32 GALLERY_PAINTING = 7;
33}
34
35enum DoorGroupType {
36 DOOR_GROUP_TYPE_UNKNOWN = 0;
37
38 // These doors border a worldport. They should be grouped when connections are
39 // not shuffled.
40 CONNECTOR = 1;
41
42 // Similar to CONNECTOR, but these doors are also ordinarily opened by solving
43 // the COLOR panel in the Control Center. These should be grouped when
44 // connections are not shuffled, but are not items at all when control center
45 // colors are not shuffled.
46 COLOR_CONNECTOR = 2;
47
48 // Groups with this type become an item if cyan door behavior is set to item.
49 CYAN_DOORS = 3;
50
51 // Groups with this type always become an item if door shuffle is on.
52 SHUFFLE_GROUP = 4;
53}
54
55enum MapType {
56 NORMAL_MAP = 0;
57 ICARUS = 1;
58 GIFT_MAP = 2;
59 DEMO = 3;
30} 60}
31 61
32enum AxisDirection { 62enum AxisDirection {
@@ -64,6 +94,18 @@ enum PuzzleSymbol {
64 QUESTION = 19; 94 QUESTION = 19;
65} 95}
66 96
97message Vec3d {
98 optional double x = 1;
99 optional double y = 2;
100 optional double z = 3;
101}
102
103message VersionNumber {
104 optional uint64 major = 1;
105 optional uint64 minor = 2;
106 optional uint64 patch = 3;
107}
108
67message ProxyIdentifier { 109message ProxyIdentifier {
68 optional uint64 panel = 1; 110 optional uint64 panel = 1;
69 optional string answer = 2; 111 optional string answer = 2;
@@ -84,6 +126,11 @@ message Connection {
84 uint64 painting = 5; 126 uint64 painting = 5;
85 ProxyIdentifier panel = 6; 127 ProxyIdentifier panel = 6;
86 } 128 }
129
130 optional bool roof_access = 7;
131 optional bool purple_ending = 8;
132 optional bool cyan_ending = 9;
133 optional bool vanilla_only = 10;
87} 134}
88 135
89message Door { 136message Door {
@@ -100,12 +147,18 @@ message Door {
100 optional uint64 complete_at = 12; 147 optional uint64 complete_at = 12;
101 148
102 optional string control_center_color = 6; 149 optional string control_center_color = 6;
103 repeated string switches = 7;
104 repeated KeyholderAnswer keyholders = 13; 150 repeated KeyholderAnswer keyholders = 13;
105 repeated uint64 rooms = 14; 151 repeated uint64 rooms = 14;
106 repeated uint64 doors = 15; 152 repeated uint64 doors = 15;
153 optional bool white_ending = 16;
154 optional bool double_letters = 18;
155 repeated string senders = 19;
107 156
108 optional DoorType type = 8; 157 optional DoorType type = 8;
158 optional bool latch = 20;
159 optional bool legacy_location = 21;
160
161 optional string location_name = 17;
109} 162}
110 163
111message PanelData { 164message PanelData {
@@ -123,9 +176,11 @@ message PanelData {
123 176
124 optional uint64 required_door = 9; 177 optional uint64 required_door = 9;
125 optional uint64 required_room = 11; 178 optional uint64 required_room = 11;
179
180 optional string display_name = 12;
126} 181}
127 182
128message Painting { 183message PaintingData {
129 optional uint64 id = 1; 184 optional uint64 id = 1;
130 optional uint64 room_id = 2; 185 optional uint64 room_id = 2;
131 optional string name = 9; 186 optional string name = 9;
@@ -144,22 +199,28 @@ message Painting {
144 199
145message Port { 200message Port {
146 optional uint64 id = 1; 201 optional uint64 id = 1;
202 optional uint64 ap_id = 11;
147 optional uint64 room_id = 2; 203 optional uint64 room_id = 2;
148 optional string name = 3; 204 optional string name = 3;
149 205
206 optional string display_name = 10;
150 optional string path = 4; 207 optional string path = 4;
151 optional string orientation = 5; 208 optional Vec3d destination = 5;
209 optional double rotation = 8;
152 optional AxisDirection gravity = 7; 210 optional AxisDirection gravity = 7;
211 optional bool no_shuffle = 9;
153 212
154 optional uint64 required_door = 6; 213 optional uint64 required_door = 6;
155} 214}
156 215
157message Keyholder { 216message KeyholderData {
158 optional uint64 id = 1; 217 optional uint64 id = 1;
218 optional uint64 ap_id = 6;
159 optional uint64 room_id = 2; 219 optional uint64 room_id = 2;
160 220
161 optional string name = 3; 221 optional string name = 3;
162 optional string path = 4; 222 optional string path = 4;
223 optional string key = 5;
163} 224}
164 225
165message Letter { 226message Letter {
@@ -197,6 +258,7 @@ message Room {
197 optional uint64 map_id = 8; 258 optional uint64 map_id = 8;
198 optional string name = 2; 259 optional string name = 2;
199 optional string display_name = 3; 260 optional string display_name = 3;
261 optional string panel_display_name = 13;
200 262
201 repeated uint64 panels = 4; 263 repeated uint64 panels = 4;
202 repeated uint64 paintings = 5; 264 repeated uint64 paintings = 5;
@@ -212,19 +274,40 @@ message Map {
212 optional uint64 id = 1; 274 optional uint64 id = 1;
213 optional string name = 2; 275 optional string name = 2;
214 optional string display_name = 3; 276 optional string display_name = 3;
277 optional uint64 worldport_entrance = 4;
278 optional MapType type = 5;
279}
280
281message Progressive {
282 optional uint64 id = 1;
283 optional string name = 2;
284 optional uint64 ap_id = 3;
285 repeated uint64 doors = 4;
286}
287
288message DoorGroup {
289 optional uint64 id = 1;
290 optional string name = 2;
291 optional uint64 ap_id = 3;
292 optional DoorGroupType type = 4;
293 repeated uint64 doors = 5;
215} 294}
216 295
217message AllObjects { 296message AllObjects {
297 optional VersionNumber version = 15;
298
218 repeated Map maps = 7; 299 repeated Map maps = 7;
219 repeated Room rooms = 1; 300 repeated Room rooms = 1;
220 repeated Door doors = 2; 301 repeated Door doors = 2;
221 repeated PanelData panels = 3; 302 repeated PanelData panels = 3;
222 repeated Painting paintings = 4; 303 repeated PaintingData paintings = 4;
223 repeated Port ports = 5; 304 repeated Port ports = 5;
224 repeated Keyholder keyholders = 11; 305 repeated KeyholderData keyholders = 11;
225 repeated Letter letters = 9; 306 repeated Letter letters = 9;
226 repeated Mastery masteries = 10; 307 repeated Mastery masteries = 10;
227 repeated Ending endings = 12; 308 repeated Ending endings = 12;
228 repeated Connection connections = 6; 309 repeated Connection connections = 6;
310 repeated Progressive progressives = 13;
311 repeated DoorGroup door_groups = 14;
229 map<string, uint64> special_ids = 8; 312 map<string, uint64> special_ids = 8;
230} 313}
diff --git a/proto/human.proto b/proto/human.proto index e0021c2..c586599 100644 --- a/proto/human.proto +++ b/proto/human.proto
@@ -62,6 +62,25 @@ message HumanConnection {
62 62
63 optional bool oneway = 3; 63 optional bool oneway = 3;
64 optional DoorIdentifier door = 4; 64 optional DoorIdentifier door = 4;
65
66 // If true, this connection will only be logically allowed if the Daedalus
67 // Roof Access option is enabled.
68 optional bool roof_access = 7;
69
70 // This means that the connection intentionally skips the target object's
71 // required door.
72 optional bool bypass_target_door = 8;
73
74 // This means that the connection should additionally require all purple
75 // letters when the Strict Purple Ending option is on.
76 optional bool purple_ending = 9;
77
78 // This means that the connection should additionally require all cyan letters
79 // when the Strict Cyan Ending option is on.
80 optional bool cyan_ending = 10;
81
82 // This means that the connection only exists when doors are not shuffled.
83 optional bool vanilla_only = 11;
65} 84}
66 85
67message HumanConnections { 86message HumanConnections {
@@ -82,13 +101,29 @@ message HumanDoor {
82 optional uint64 complete_at = 9; 101 optional uint64 complete_at = 9;
83 102
84 optional string control_center_color = 6; 103 optional string control_center_color = 6;
85 repeated string switches = 7;
86 repeated KeyholderIdentifier keyholders = 10; 104 repeated KeyholderIdentifier keyholders = 10;
87 repeated RoomIdentifier rooms = 11; 105 repeated RoomIdentifier rooms = 11;
88 repeated DoorIdentifier doors = 12; 106 repeated DoorIdentifier doors = 12;
107 optional bool white_ending = 13;
108 optional bool double_letters = 15;
109
110 // Sender nodes to be added to the list of requirements for triggering the
111 // location. Only for senders that have no logic requirements.
112 repeated string senders = 16;
89 113
90 optional DoorType type = 4; 114 optional DoorType type = 4;
91 optional string location_room = 5; 115 optional string location_room = 5;
116 optional string location_name = 14;
117
118 // Non-item doors that are latched will stay open once opened, even if the
119 // opening trigger is deactivated. This applies to EVENT/LOCATION_ONLY doors,
120 // as well as item-locked doors when not shuffling doors.
121 optional bool latch = 17;
122
123 // If true, the client will treat this door like a location, even though no
124 // location is created for it in the generator. This helps provide backwards
125 // compatability with older worlds.
126 optional bool legacy_location = 18;
92} 127}
93 128
94message HumanDoors { 129message HumanDoors {
@@ -107,6 +142,8 @@ message HumanPanel {
107 142
108 optional DoorIdentifier required_door = 7; 143 optional DoorIdentifier required_door = 7;
109 optional RoomIdentifier required_room = 8; 144 optional RoomIdentifier required_room = 8;
145
146 optional string display_name = 9;
110} 147}
111 148
112message HumanPainting { 149message HumanPainting {
@@ -126,9 +163,16 @@ message HumanPainting {
126 163
127message HumanPort { 164message HumanPort {
128 optional string name = 1; 165 optional string name = 1;
166 optional string display_name = 8;
129 optional string path = 2; 167 optional string path = 2;
130 168
131 optional string orientation = 3; 169 optional bool no_shuffle = 7;
170
171 // These specify how the player should be placed when a randomized entrance
172 // sends them to this port. "rotation" is in degrees and is counter-clockwise
173 // from the positive X axis.
174 optional Vec3d destination = 3;
175 optional double rotation = 6;
132 optional AxisDirection gravity = 5 [default = Y_MINUS]; 176 optional AxisDirection gravity = 5 [default = Y_MINUS];
133 177
134 optional DoorIdentifier required_door = 4; 178 optional DoorIdentifier required_door = 4;
@@ -137,6 +181,13 @@ message HumanPort {
137message HumanKeyholder { 181message HumanKeyholder {
138 optional string name = 1; 182 optional string name = 1;
139 optional string path = 2; 183 optional string path = 2;
184
185 // If this is set, the keyholder will become a location when keyholder shuffle
186 // is enabled. This value specifies the key that is required to clear the
187 // location. It should be the same as the key needed for Green Ending. The
188 // only cases when this shouldn't be set is the two disappearing keyholders in
189 // The Congruent.
190 optional string key = 3;
140} 191}
141 192
142message HumanLetter { 193message HumanLetter {
@@ -160,6 +211,10 @@ message HumanRoom {
160 optional string name = 1; 211 optional string name = 1;
161 optional string display_name = 2; 212 optional string display_name = 2;
162 213
214 // This is used in panelsanity location names and location names for STANDARD
215 // doors generated from panels in the same area.
216 optional string panel_display_name = 10;
217
163 repeated HumanPanel panels = 3; 218 repeated HumanPanel panels = 3;
164 repeated HumanPainting paintings = 4; 219 repeated HumanPainting paintings = 4;
165 repeated HumanLetter letters = 5; 220 repeated HumanLetter letters = 5;
@@ -171,13 +226,50 @@ message HumanRoom {
171 226
172message HumanMap { 227message HumanMap {
173 optional string display_name = 1; 228 optional string display_name = 1;
229 optional MapType type = 4;
230
231 optional PortIdentifier worldport_entrance = 3;
232
233 // These two fields are used by the validator and nothing else. excluded_nodes
234 // are objects in the tscn that are intentionally not mentioned in the txtpb.
235 // custom_nodes are the reverse of that; objects that are mentioned in the
236 // txtpb but not present in the tscn. These are generally created dynamically
237 // by the game mod, but may also be used for places where the validator is
238 // just wrong about the contents of the map file.
174 repeated string excluded_nodes = 2; 239 repeated string excluded_nodes = 2;
240 repeated string custom_nodes = 5;
241}
242
243message HumanProgressive {
244 optional string name = 1;
245 repeated DoorIdentifier doors = 2;
246}
247
248message HumanProgressives {
249 repeated HumanProgressive progressives = 1;
250}
251
252message HumanDoorGroup {
253 optional string name = 1;
254 optional DoorGroupType type = 2;
255 repeated DoorIdentifier doors = 3;
256}
257
258message HumanDoorGroups {
259 repeated HumanDoorGroup door_groups = 1;
260}
261
262message HumanGlobalMetadata {
263 repeated string special_names = 1;
264 optional VersionNumber version = 2;
175} 265}
176 266
177message IdMappings { 267message IdMappings {
178 message RoomIds { 268 message RoomIds {
179 map<string, uint64> panels = 1; 269 map<string, uint64> panels = 1;
180 map<string, uint64> masteries = 2; 270 map<string, uint64> masteries = 2;
271 map<string, uint64> keyholders = 3;
272 map<string, uint64> ports = 4;
181 } 273 }
182 274
183 message MapIds { 275 message MapIds {
@@ -189,4 +281,6 @@ message IdMappings {
189 map<string, uint64> special = 2; 281 map<string, uint64> special = 2;
190 map<string, uint64> letters = 3; 282 map<string, uint64> letters = 3;
191 map<string, uint64> endings = 4; 283 map<string, uint64> endings = 4;
284 map<string, uint64> progressives = 5;
285 map<string, uint64> door_groups = 6;
192} 286}
diff --git a/tools/assign_ids/main.cpp b/tools/assign_ids/main.cpp index 77c0e5a..4cf7c3f 100644 --- a/tools/assign_ids/main.cpp +++ b/tools/assign_ids/main.cpp
@@ -2,6 +2,7 @@
2#include <google/protobuf/text_format.h> 2#include <google/protobuf/text_format.h>
3 3
4#include <cstdint> 4#include <cstdint>
5#include <filesystem>
5#include <fstream> 6#include <fstream>
6#include <iostream> 7#include <iostream>
7#include <map> 8#include <map>
@@ -40,6 +41,10 @@ class AssignIds {
40 ReadIds(ids_path); 41 ReadIds(ids_path);
41 42
42 ProcessMaps(datadir_path); 43 ProcessMaps(datadir_path);
44 ProcessSpecialIds();
45 ProcessProgressivesFile(datadir_path / "progressives.txtpb");
46 ProcessDoorGroupsFile(datadir_path / "door_groups.txtpb");
47 ProcessGlobalMetadataFile(datadir_path / "metadata.txtpb");
43 48
44 WriteIds(ids_path); 49 WriteIds(ids_path);
45 50
@@ -54,50 +59,27 @@ class AssignIds {
54 id_mappings_ = ReadIdsFromYaml(path.string()); 59 id_mappings_ = ReadIdsFromYaml(path.string());
55 60
56 for (const auto& [_, map] : id_mappings_.maps()) { 61 for (const auto& [_, map] : id_mappings_.maps()) {
57 for (const auto& [_, id] : map.doors()) { 62 UpdateNextId(map.doors());
58 if (id > next_id_) {
59 next_id_ = id;
60 }
61 }
62 63
63 for (const auto& [_, room] : map.rooms()) { 64 for (const auto& [_, room] : map.rooms()) {
64 for (const auto& [_, id] : room.panels()) { 65 UpdateNextId(room.panels());
65 if (id > next_id_) { 66 UpdateNextId(room.masteries());
66 next_id_ = id; 67 UpdateNextId(room.keyholders());
67 } 68 UpdateNextId(room.ports());
68 }
69
70 for (const auto& [_, id] : room.masteries()) {
71 if (id > next_id_) {
72 next_id_ = id;
73 }
74 }
75 }
76 }
77
78 for (const auto& [_, id] : id_mappings_.special()) {
79 if (id > next_id_) {
80 next_id_ = id;
81 }
82 }
83
84 for (const auto& [_, id] : id_mappings_.letters()) {
85 if (id > next_id_) {
86 next_id_ = id;
87 } 69 }
88 } 70 }
89 71
90 for (const auto& [_, id] : id_mappings_.endings()) { 72 UpdateNextId(id_mappings_.special());
91 if (id > next_id_) { 73 UpdateNextId(id_mappings_.letters());
92 next_id_ = id; 74 UpdateNextId(id_mappings_.endings());
93 } 75 UpdateNextId(id_mappings_.progressives());
94 } 76 UpdateNextId(id_mappings_.door_groups());
95 77
96 next_id_++; 78 next_id_++;
97 } 79 }
98 80
99 void WriteIds(std::filesystem::path path) { 81 void WriteIds(std::filesystem::path path) {
100 WriteIdsAsYaml(id_mappings_, path.string()); 82 WriteIdsAsYaml(output_, path.string());
101 } 83 }
102 84
103 void ProcessMaps(std::filesystem::path path) { 85 void ProcessMaps(std::filesystem::path path) {
@@ -130,18 +112,23 @@ class AssignIds {
130 112
131 void ProcessDoor(const HumanDoor& h_door, 113 void ProcessDoor(const HumanDoor& h_door,
132 const std::string& current_map_name) { 114 const std::string& current_map_name) {
133 if (h_door.type() == DoorType::EVENT) { 115 if (h_door.type() == DoorType::EVENT && !h_door.latch() &&
116 !h_door.legacy_location()) {
134 return; 117 return;
135 } 118 }
136 119
120 auto& maps = *output_.mutable_maps();
121 auto& doors = *maps[current_map_name].mutable_doors();
122
137 if (!id_mappings_.maps().contains(current_map_name) || 123 if (!id_mappings_.maps().contains(current_map_name) ||
138 !id_mappings_.maps() 124 !id_mappings_.maps()
139 .at(current_map_name) 125 .at(current_map_name)
140 .doors() 126 .doors()
141 .contains(h_door.name())) { 127 .contains(h_door.name())) {
142 auto& maps = *id_mappings_.mutable_maps();
143 auto& doors = *maps[current_map_name].mutable_doors();
144 doors[h_door.name()] = next_id_++; 128 doors[h_door.name()] = next_id_++;
129 } else {
130 doors[h_door.name()] =
131 id_mappings_.maps().at(current_map_name).doors().at(h_door.name());
145 } 132 }
146 } 133 }
147 134
@@ -156,6 +143,10 @@ class AssignIds {
156 void ProcessRoom(const HumanRoom& h_room, 143 void ProcessRoom(const HumanRoom& h_room,
157 const std::string& current_map_name) { 144 const std::string& current_map_name) {
158 for (const HumanPanel& h_panel : h_room.panels()) { 145 for (const HumanPanel& h_panel : h_room.panels()) {
146 auto& maps = *output_.mutable_maps();
147 auto& rooms = *maps[current_map_name].mutable_rooms();
148 auto& panels = *rooms[h_room.name()].mutable_panels();
149
159 if (!id_mappings_.maps().contains(current_map_name) || 150 if (!id_mappings_.maps().contains(current_map_name) ||
160 !id_mappings_.maps() 151 !id_mappings_.maps()
161 .at(current_map_name) 152 .at(current_map_name)
@@ -167,23 +158,33 @@ class AssignIds {
167 .at(h_room.name()) 158 .at(h_room.name())
168 .panels() 159 .panels()
169 .contains(h_panel.name())) { 160 .contains(h_panel.name())) {
170 auto& maps = *id_mappings_.mutable_maps();
171 auto& rooms = *maps[current_map_name].mutable_rooms();
172 auto& panels = *rooms[h_room.name()].mutable_panels();
173 panels[h_panel.name()] = next_id_++; 161 panels[h_panel.name()] = next_id_++;
162 } else {
163 panels[h_panel.name()] = id_mappings_.maps()
164 .at(current_map_name)
165 .rooms()
166 .at(h_room.name())
167 .panels()
168 .at(h_panel.name());
174 } 169 }
175 } 170 }
176 171
177 for (const HumanLetter& h_letter : h_room.letters()) { 172 for (const HumanLetter& h_letter : h_room.letters()) {
178 std::string lettername = GetLetterName(h_letter.key(), h_letter.level2()); 173 std::string lettername = GetLetterName(h_letter.key(), h_letter.level2());
179 174
175 auto& letters = *output_.mutable_letters();
180 if (!id_mappings_.letters().contains(lettername)) { 176 if (!id_mappings_.letters().contains(lettername)) {
181 auto& letters = *id_mappings_.mutable_letters();
182 letters[lettername] = next_id_++; 177 letters[lettername] = next_id_++;
178 } else {
179 letters[lettername] = id_mappings_.letters().at(lettername);
183 } 180 }
184 } 181 }
185 182
186 for (const HumanMastery& h_mastery : h_room.masteries()) { 183 for (const HumanMastery& h_mastery : h_room.masteries()) {
184 auto& maps = *output_.mutable_maps();
185 auto& rooms = *maps[current_map_name].mutable_rooms();
186 auto& masteries = *rooms[h_room.name()].mutable_masteries();
187
187 if (!id_mappings_.maps().contains(current_map_name) || 188 if (!id_mappings_.maps().contains(current_map_name) ||
188 !id_mappings_.maps() 189 !id_mappings_.maps()
189 .at(current_map_name) 190 .at(current_map_name)
@@ -195,27 +196,164 @@ class AssignIds {
195 .at(h_room.name()) 196 .at(h_room.name())
196 .masteries() 197 .masteries()
197 .contains(h_mastery.name())) { 198 .contains(h_mastery.name())) {
198 auto& maps = *id_mappings_.mutable_maps();
199 auto& rooms = *maps[current_map_name].mutable_rooms();
200 auto& masteries = *rooms[h_room.name()].mutable_masteries();
201 masteries[h_mastery.name()] = next_id_++; 199 masteries[h_mastery.name()] = next_id_++;
200 } else {
201 masteries[h_mastery.name()] = id_mappings_.maps()
202 .at(current_map_name)
203 .rooms()
204 .at(h_room.name())
205 .masteries()
206 .at(h_mastery.name());
202 } 207 }
203 } 208 }
204 209
205 for (const HumanEnding& h_ending : h_room.endings()) { 210 for (const HumanEnding& h_ending : h_room.endings()) {
211 auto& endings = *output_.mutable_endings();
212
206 if (!id_mappings_.endings().contains(h_ending.name())) { 213 if (!id_mappings_.endings().contains(h_ending.name())) {
207 auto& endings = *id_mappings_.mutable_endings();
208 endings[h_ending.name()] = next_id_++; 214 endings[h_ending.name()] = next_id_++;
215 } else {
216 endings[h_ending.name()] = id_mappings_.endings().at(h_ending.name());
217 }
218 }
219
220 for (const HumanKeyholder& h_keyholder : h_room.keyholders()) {
221 if (!h_keyholder.has_key()) {
222 continue;
223 }
224
225 auto& maps = *output_.mutable_maps();
226 auto& rooms = *maps[current_map_name].mutable_rooms();
227 auto& keyholders = *rooms[h_room.name()].mutable_keyholders();
228
229 if (!id_mappings_.maps().contains(current_map_name) ||
230 !id_mappings_.maps()
231 .at(current_map_name)
232 .rooms()
233 .contains(h_room.name()) ||
234 !id_mappings_.maps()
235 .at(current_map_name)
236 .rooms()
237 .at(h_room.name())
238 .keyholders()
239 .contains(h_keyholder.name())) {
240 keyholders[h_keyholder.name()] = next_id_++;
241 } else {
242 keyholders[h_keyholder.name()] = id_mappings_.maps()
243 .at(current_map_name)
244 .rooms()
245 .at(h_room.name())
246 .keyholders()
247 .at(h_keyholder.name());
248 }
249 }
250
251 for (const HumanPort& h_port : h_room.ports()) {
252 if (h_port.no_shuffle()) {
253 continue;
254 }
255
256 auto& maps = *output_.mutable_maps();
257 auto& rooms = *maps[current_map_name].mutable_rooms();
258 auto& ports = *rooms[h_room.name()].mutable_ports();
259
260 if (!id_mappings_.maps().contains(current_map_name) ||
261 !id_mappings_.maps()
262 .at(current_map_name)
263 .rooms()
264 .contains(h_room.name()) ||
265 !id_mappings_.maps()
266 .at(current_map_name)
267 .rooms()
268 .at(h_room.name())
269 .ports()
270 .contains(h_port.name())) {
271 ports[h_port.name()] = next_id_++;
272 } else {
273 ports[h_port.name()] = id_mappings_.maps()
274 .at(current_map_name)
275 .rooms()
276 .at(h_room.name())
277 .ports()
278 .at(h_port.name());
279 }
280 }
281 }
282
283 void ProcessSpecialIds() {
284 auto& specials = *output_.mutable_special();
285
286 for (const auto& [special_name, ap_id] : id_mappings_.special()) {
287 specials[special_name] = ap_id;
288 }
289 }
290
291 void ProcessProgressivesFile(std::filesystem::path path) {
292 if (!std::filesystem::exists(path)) {
293 return;
294 }
295
296 auto h_progs = ReadMessageFromFile<HumanProgressives>(path.string());
297 auto& progs = *output_.mutable_progressives();
298
299 for (const HumanProgressive& h_prog : h_progs.progressives()) {
300 if (!id_mappings_.progressives().contains(h_prog.name())) {
301 progs[h_prog.name()] = next_id_++;
302 } else {
303 progs[h_prog.name()] = id_mappings_.progressives().at(h_prog.name());
304 }
305 }
306 }
307
308 void ProcessDoorGroupsFile(std::filesystem::path path) {
309 if (!std::filesystem::exists(path)) {
310 return;
311 }
312
313 auto h_groups = ReadMessageFromFile<HumanDoorGroups>(path.string());
314 auto& groups = *output_.mutable_door_groups();
315
316 for (const HumanDoorGroup& h_group : h_groups.door_groups()) {
317 if (!id_mappings_.door_groups().contains(h_group.name())) {
318 groups[h_group.name()] = next_id_++;
319 } else {
320 groups[h_group.name()] = id_mappings_.door_groups().at(h_group.name());
321 }
322 }
323 }
324
325 void ProcessGlobalMetadataFile(std::filesystem::path path) {
326 if (!std::filesystem::exists(path)) {
327 return;
328 }
329
330 auto h_metadata = ReadMessageFromFile<HumanGlobalMetadata>(path.string());
331 auto& specials = *output_.mutable_special();
332
333 for (const std::string& h_special : h_metadata.special_names()) {
334 if (!id_mappings_.special().contains(h_special)) {
335 specials[h_special] = next_id_++;
336 } else {
337 specials[h_special] = id_mappings_.special().at(h_special);
209 } 338 }
210 } 339 }
211 } 340 }
212 341
213 private: 342 private:
343 void UpdateNextId(const google::protobuf::Map<std::string, uint64_t>& ids) {
344 for (const auto& [_, id] : ids) {
345 if (id > next_id_) {
346 next_id_ = id;
347 }
348 }
349 }
350
214 std::string mapdir_; 351 std::string mapdir_;
215 352
216 uint64_t next_id_ = 0; 353 uint64_t next_id_ = 1;
217 354
218 IdMappings id_mappings_; 355 IdMappings id_mappings_;
356 IdMappings output_;
219}; 357};
220 358
221} // namespace 359} // namespace
diff --git a/tools/datapacker/container.cpp b/tools/datapacker/container.cpp index 0d3417e..4a656b3 100644 --- a/tools/datapacker/container.cpp +++ b/tools/datapacker/container.cpp
@@ -79,7 +79,7 @@ uint64_t Container::FindOrAddPainting(
79 auto it = room_container.find(painting_name); 79 auto it = room_container.find(painting_name);
80 if (it == room_container.end()) { 80 if (it == room_container.end()) {
81 uint64_t new_id = all_objects_.paintings_size(); 81 uint64_t new_id = all_objects_.paintings_size();
82 Painting* painting = all_objects_.add_paintings(); 82 PaintingData* painting = all_objects_.add_paintings();
83 painting->set_id(new_id); 83 painting->set_id(new_id);
84 painting->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); 84 painting->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt));
85 painting->set_name(painting_name); 85 painting->set_name(painting_name);
@@ -289,7 +289,7 @@ uint64_t Container::FindOrAddKeyholder(
289 auto it = room_container.find(keyholder_name); 289 auto it = room_container.find(keyholder_name);
290 if (it == room_container.end()) { 290 if (it == room_container.end()) {
291 uint64_t new_id = all_objects_.keyholders_size(); 291 uint64_t new_id = all_objects_.keyholders_size();
292 Keyholder* keyholder = all_objects_.add_keyholders(); 292 KeyholderData* keyholder = all_objects_.add_keyholders();
293 keyholder->set_id(new_id); 293 keyholder->set_id(new_id);
294 keyholder->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); 294 keyholder->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt));
295 keyholder->set_name(keyholder_name); 295 keyholder->set_name(keyholder_name);
@@ -331,6 +331,40 @@ uint64_t Container::FindOrAddDoor(std::optional<std::string> map_name,
331 } 331 }
332} 332}
333 333
334uint64_t Container::FindOrAddProgressive(std::string prog_name) {
335 auto it = progressive_id_by_name_.find(prog_name);
336
337 if (it == progressive_id_by_name_.end()) {
338 uint64_t new_id = all_objects_.progressives_size();
339 Progressive* progressive = all_objects_.add_progressives();
340 progressive->set_id(new_id);
341 progressive->set_name(prog_name);
342
343 progressive_id_by_name_[prog_name] = new_id;
344
345 return new_id;
346 } else {
347 return it->second;
348 }
349}
350
351uint64_t Container::FindOrAddDoorGroup(std::string group_name) {
352 auto it = door_group_id_by_name_.find(group_name);
353
354 if (it == door_group_id_by_name_.end()) {
355 uint64_t new_id = all_objects_.door_groups_size();
356 DoorGroup* door_group = all_objects_.add_door_groups();
357 door_group->set_id(new_id);
358 door_group->set_name(group_name);
359
360 door_group_id_by_name_[group_name] = new_id;
361
362 return new_id;
363 } else {
364 return it->second;
365 }
366}
367
334void Container::AddConnection(const Connection& connection) { 368void Container::AddConnection(const Connection& connection) {
335 *all_objects_.add_connections() = connection; 369 *all_objects_.add_connections() = connection;
336} 370}
diff --git a/tools/datapacker/container.h b/tools/datapacker/container.h index 68f5875..bc02ba4 100644 --- a/tools/datapacker/container.h +++ b/tools/datapacker/container.h
@@ -60,6 +60,10 @@ class Container {
60 60
61 void AddConnection(const Connection& connection); 61 void AddConnection(const Connection& connection);
62 62
63 uint64_t FindOrAddProgressive(std::string prog_name);
64
65 uint64_t FindOrAddDoorGroup(std::string group_name);
66
63 AllObjects& all_objects() { return all_objects_; } 67 AllObjects& all_objects() { return all_objects_; }
64 68
65 private: 69 private:
@@ -82,6 +86,8 @@ class Container {
82 std::map<std::string, std::map<std::string, uint64_t>> 86 std::map<std::string, std::map<std::string, uint64_t>>
83 door_id_by_map_door_names_; 87 door_id_by_map_door_names_;
84 std::map<std::string, uint64_t> ending_id_by_name_; 88 std::map<std::string, uint64_t> ending_id_by_name_;
89 std::map<std::string, uint64_t> progressive_id_by_name_;
90 std::map<std::string, uint64_t> door_group_id_by_name_;
85}; 91};
86 92
87} // namespace com::fourisland::lingo2_archipelago 93} // namespace com::fourisland::lingo2_archipelago
diff --git a/tools/datapacker/main.cpp b/tools/datapacker/main.cpp index 3ddb11f..8109bf5 100644 --- a/tools/datapacker/main.cpp +++ b/tools/datapacker/main.cpp
@@ -43,6 +43,9 @@ class DataPacker {
43 43
44 ProcessConnectionsFile(datadir_path / "connections.txtpb", std::nullopt); 44 ProcessConnectionsFile(datadir_path / "connections.txtpb", std::nullopt);
45 ProcessMaps(datadir_path); 45 ProcessMaps(datadir_path);
46 ProcessProgressivesFile(datadir_path / "progressives.txtpb");
47 ProcessDoorGroupsFile(datadir_path / "door_groups.txtpb");
48 ProcessGlobalMetadataFile(datadir_path / "metadata.txtpb");
46 ProcessIdsFile(datadir_path / "ids.yaml"); 49 ProcessIdsFile(datadir_path / "ids.yaml");
47 50
48 { 51 {
@@ -85,9 +88,17 @@ class DataPacker {
85 uint64_t map_id = container_.FindOrAddMap(map_name); 88 uint64_t map_id = container_.FindOrAddMap(map_name);
86 Map& map = *container_.all_objects().mutable_maps(map_id); 89 Map& map = *container_.all_objects().mutable_maps(map_id);
87 90
91 map.set_type(metadata.type());
92
88 if (metadata.has_display_name()) { 93 if (metadata.has_display_name()) {
89 map.set_display_name(metadata.display_name()); 94 map.set_display_name(metadata.display_name());
90 } 95 }
96
97 if (metadata.has_worldport_entrance()) {
98 map.set_worldport_entrance(container_.FindOrAddPort(
99 map_name, metadata.worldport_entrance().room(),
100 metadata.worldport_entrance().name(), std::nullopt, std::nullopt));
101 }
91 } 102 }
92 103
93 void ProcessRooms(std::filesystem::path path, 104 void ProcessRooms(std::filesystem::path path,
@@ -104,7 +115,11 @@ class DataPacker {
104 container_.FindOrAddRoom(current_map_name, h_room.name(), std::nullopt); 115 container_.FindOrAddRoom(current_map_name, h_room.name(), std::nullopt);
105 Room& room = *container_.all_objects().mutable_rooms(room_id); 116 Room& room = *container_.all_objects().mutable_rooms(room_id);
106 117
107 room.set_display_name(h_room.display_name()); 118 // room.set_display_name(h_room.display_name());
119
120 if (h_room.has_panel_display_name()) {
121 room.set_panel_display_name(h_room.panel_display_name());
122 }
108 123
109 for (const HumanPanel& h_panel : h_room.panels()) { 124 for (const HumanPanel& h_panel : h_room.panels()) {
110 room.add_panels(ProcessPanel(h_panel, current_map_name, room.name())); 125 room.add_panels(ProcessPanel(h_panel, current_map_name, room.name()));
@@ -175,6 +190,10 @@ class DataPacker {
175 map_name, h_panel.required_room().name(), current_map_name)); 190 map_name, h_panel.required_room().name(), current_map_name));
176 } 191 }
177 192
193 if (h_panel.has_display_name()) {
194 panel.set_display_name(h_panel.display_name());
195 }
196
178 return panel_id; 197 return panel_id;
179 } 198 }
180 199
@@ -184,7 +203,7 @@ class DataPacker {
184 uint64_t painting_id = container_.FindOrAddPainting( 203 uint64_t painting_id = container_.FindOrAddPainting(
185 current_map_name, current_room_name, h_painting.name(), std::nullopt, 204 current_map_name, current_room_name, h_painting.name(), std::nullopt,
186 std::nullopt); 205 std::nullopt);
187 Painting& painting = 206 PaintingData& painting =
188 *container_.all_objects().mutable_paintings(painting_id); 207 *container_.all_objects().mutable_paintings(painting_id);
189 208
190 painting.set_path(h_painting.path()); 209 painting.set_path(h_painting.path());
@@ -228,7 +247,14 @@ class DataPacker {
228 Port& port = *container_.all_objects().mutable_ports(port_id); 247 Port& port = *container_.all_objects().mutable_ports(port_id);
229 248
230 port.set_path(h_port.path()); 249 port.set_path(h_port.path());
231 port.set_orientation(h_port.orientation()); 250 port.set_display_name(h_port.display_name());
251
252 if (h_port.no_shuffle()) {
253 port.set_no_shuffle(h_port.no_shuffle());
254 } else {
255 *port.mutable_destination() = h_port.destination();
256 port.set_rotation(h_port.rotation());
257 }
232 258
233 // Setting this explicitly because the Godot protobuf doesn't support 259 // Setting this explicitly because the Godot protobuf doesn't support
234 // custom defaults. 260 // custom defaults.
@@ -279,11 +305,15 @@ class DataPacker {
279 uint64_t keyholder_id = container_.FindOrAddKeyholder( 305 uint64_t keyholder_id = container_.FindOrAddKeyholder(
280 current_map_name, current_room_name, h_keyholder.name(), std::nullopt, 306 current_map_name, current_room_name, h_keyholder.name(), std::nullopt,
281 std::nullopt); 307 std::nullopt);
282 Keyholder& keyholder = 308 KeyholderData& keyholder =
283 *container_.all_objects().mutable_keyholders(keyholder_id); 309 *container_.all_objects().mutable_keyholders(keyholder_id);
284 310
285 keyholder.set_path(h_keyholder.path()); 311 keyholder.set_path(h_keyholder.path());
286 312
313 if (h_keyholder.has_key()) {
314 keyholder.set_key(h_keyholder.key());
315 }
316
287 return keyholder_id; 317 return keyholder_id;
288 } 318 }
289 319
@@ -331,8 +361,8 @@ class DataPacker {
331 h_door.receivers().begin(), h_door.receivers().end(), 361 h_door.receivers().begin(), h_door.receivers().end(),
332 google::protobuf::RepeatedFieldBackInserter(door.mutable_receivers())); 362 google::protobuf::RepeatedFieldBackInserter(door.mutable_receivers()));
333 std::copy( 363 std::copy(
334 h_door.switches().begin(), h_door.switches().end(), 364 h_door.senders().begin(), h_door.senders().end(),
335 google::protobuf::RepeatedFieldBackInserter(door.mutable_switches())); 365 google::protobuf::RepeatedFieldBackInserter(door.mutable_senders()));
336 366
337 for (const PaintingIdentifier& pi : h_door.move_paintings()) { 367 for (const PaintingIdentifier& pi : h_door.move_paintings()) {
338 std::optional<std::string> map_name = 368 std::optional<std::string> map_name =
@@ -381,6 +411,10 @@ class DataPacker {
381 container_.FindOrAddDoor(map_name, di.name(), current_map_name)); 411 container_.FindOrAddDoor(map_name, di.name(), current_map_name));
382 } 412 }
383 413
414 if (h_door.has_white_ending()) {
415 door.set_white_ending(h_door.white_ending());
416 }
417
384 if (h_door.has_control_center_color()) { 418 if (h_door.has_control_center_color()) {
385 door.set_control_center_color(h_door.control_center_color()); 419 door.set_control_center_color(h_door.control_center_color());
386 } 420 }
@@ -390,6 +424,22 @@ class DataPacker {
390 } 424 }
391 425
392 door.set_type(h_door.type()); 426 door.set_type(h_door.type());
427
428 if (h_door.has_location_name()) {
429 door.set_location_name(h_door.location_name());
430 }
431
432 if (h_door.has_double_letters()) {
433 door.set_double_letters(h_door.double_letters());
434 }
435
436 if (h_door.has_latch()) {
437 door.set_latch(h_door.latch());
438 }
439
440 if (h_door.has_legacy_location()) {
441 door.set_legacy_location(h_door.legacy_location());
442 }
393 } 443 }
394 444
395 void ProcessConnectionsFile(std::filesystem::path path, 445 void ProcessConnectionsFile(std::filesystem::path path,
@@ -441,6 +491,26 @@ class DataPacker {
441 r_connection.set_required_door(door_id); 491 r_connection.set_required_door(door_id);
442 } 492 }
443 493
494 if (human_connection.has_roof_access()) {
495 f_connection.set_roof_access(human_connection.roof_access());
496 r_connection.set_roof_access(human_connection.roof_access());
497 }
498
499 if (human_connection.has_purple_ending()) {
500 f_connection.set_purple_ending(human_connection.purple_ending());
501 r_connection.set_purple_ending(human_connection.purple_ending());
502 }
503
504 if (human_connection.has_cyan_ending()) {
505 f_connection.set_cyan_ending(human_connection.cyan_ending());
506 r_connection.set_cyan_ending(human_connection.cyan_ending());
507 }
508
509 if (human_connection.has_vanilla_only()) {
510 f_connection.set_vanilla_only(human_connection.vanilla_only());
511 r_connection.set_vanilla_only(human_connection.vanilla_only());
512 }
513
444 container_.AddConnection(f_connection); 514 container_.AddConnection(f_connection);
445 if (!human_connection.oneway()) { 515 if (!human_connection.oneway()) {
446 container_.AddConnection(r_connection); 516 container_.AddConnection(r_connection);
@@ -524,6 +594,63 @@ class DataPacker {
524 } 594 }
525 } 595 }
526 596
597 void ProcessProgressivesFile(std::filesystem::path path) {
598 if (!std::filesystem::exists(path)) {
599 return;
600 }
601
602 auto h_progs = ReadMessageFromFile<HumanProgressives>(path.string());
603
604 for (const HumanProgressive& h_prog : h_progs.progressives()) {
605 ProcessProgressive(h_prog);
606 }
607 }
608
609 void ProcessProgressive(const HumanProgressive& h_prog) {
610 uint64_t prog_id = container_.FindOrAddProgressive(h_prog.name());
611 Progressive& prog = *container_.all_objects().mutable_progressives(prog_id);
612
613 for (const DoorIdentifier& di : h_prog.doors()) {
614 uint64_t door_id =
615 container_.FindOrAddDoor(di.map(), di.name(), std::nullopt);
616 prog.add_doors(door_id);
617 }
618 }
619
620 void ProcessDoorGroupsFile(std::filesystem::path path) {
621 if (!std::filesystem::exists(path)) {
622 return;
623 }
624
625 auto h_groups = ReadMessageFromFile<HumanDoorGroups>(path.string());
626
627 for (const HumanDoorGroup& h_group : h_groups.door_groups()) {
628 ProcessDoorGroup(h_group);
629 }
630 }
631
632 void ProcessDoorGroup(const HumanDoorGroup& h_group) {
633 uint64_t group_id = container_.FindOrAddDoorGroup(h_group.name());
634 DoorGroup& group = *container_.all_objects().mutable_door_groups(group_id);
635
636 group.set_type(h_group.type());
637
638 for (const DoorIdentifier& di : h_group.doors()) {
639 uint64_t door_id =
640 container_.FindOrAddDoor(di.map(), di.name(), std::nullopt);
641 group.add_doors(door_id);
642 }
643 }
644
645 void ProcessGlobalMetadataFile(std::filesystem::path path) {
646 if (!std::filesystem::exists(path)) {
647 return;
648 }
649
650 auto h_metadata = ReadMessageFromFile<HumanGlobalMetadata>(path.string());
651 *container_.all_objects().mutable_version() = h_metadata.version();
652 }
653
527 void ProcessIdsFile(std::filesystem::path path) { 654 void ProcessIdsFile(std::filesystem::path path) {
528 auto ids = ReadIdsFromYaml(path.string()); 655 auto ids = ReadIdsFromYaml(path.string());
529 656
@@ -548,6 +675,20 @@ class DataPacker {
548 .mutable_masteries(mastery_id) 675 .mutable_masteries(mastery_id)
549 ->set_ap_id(ap_id); 676 ->set_ap_id(ap_id);
550 } 677 }
678
679 for (const auto& [keyholder_name, ap_id] : room.keyholders()) {
680 uint64_t keyholder_id = container_.FindOrAddKeyholder(
681 map_name, room_name, keyholder_name, std::nullopt, std::nullopt);
682 container_.all_objects()
683 .mutable_keyholders(keyholder_id)
684 ->set_ap_id(ap_id);
685 }
686
687 for (const auto& [port_name, ap_id] : room.ports()) {
688 uint64_t port_id = container_.FindOrAddPort(
689 map_name, room_name, port_name, std::nullopt, std::nullopt);
690 container_.all_objects().mutable_ports(port_id)->set_ap_id(ap_id);
691 }
551 } 692 }
552 } 693 }
553 694
@@ -565,6 +706,16 @@ class DataPacker {
565 uint64_t ending_id = container_.FindOrAddEnding(ending_name); 706 uint64_t ending_id = container_.FindOrAddEnding(ending_name);
566 container_.all_objects().mutable_endings(ending_id)->set_ap_id(ap_id); 707 container_.all_objects().mutable_endings(ending_id)->set_ap_id(ap_id);
567 } 708 }
709
710 for (const auto& [prog_name, ap_id] : ids.progressives()) {
711 uint64_t prog_id = container_.FindOrAddProgressive(prog_name);
712 container_.all_objects().mutable_progressives(prog_id)->set_ap_id(ap_id);
713 }
714
715 for (const auto& [group_name, ap_id] : ids.door_groups()) {
716 uint64_t group_id = container_.FindOrAddDoorGroup(group_name);
717 container_.all_objects().mutable_door_groups(group_id)->set_ap_id(ap_id);
718 }
568 } 719 }
569 720
570 std::string mapdir_; 721 std::string mapdir_;
diff --git a/tools/util/godot_scene.cpp b/tools/util/godot_scene.cpp index 1e77c9e..f788d21 100644 --- a/tools/util/godot_scene.cpp +++ b/tools/util/godot_scene.cpp
@@ -1,10 +1,8 @@
1#include "godot_scene.h" 1#include "godot_scene.h"
2 2
3#include <absl/strings/str_split.h>
4#include <absl/strings/string_view.h>
5
6#include <fstream> 3#include <fstream>
7#include <sstream> 4#include <sstream>
5#include <string_view>
8#include <variant> 6#include <variant>
9 7
10namespace com::fourisland::lingo2_archipelago { 8namespace com::fourisland::lingo2_archipelago {
@@ -23,7 +21,7 @@ struct Heading {
23 GodotInstanceType instance_type; 21 GodotInstanceType instance_type;
24}; 22};
25 23
26Heading ParseTscnHeading(absl::string_view line) { 24Heading ParseTscnHeading(std::string_view line) {
27 std::string original_line(line); 25 std::string original_line(line);
28 Heading heading; 26 Heading heading;
29 27
diff --git a/tools/util/ids_yaml_format.cpp b/tools/util/ids_yaml_format.cpp index f72f60e..5b9113b 100644 --- a/tools/util/ids_yaml_format.cpp +++ b/tools/util/ids_yaml_format.cpp
@@ -56,6 +56,21 @@ IdMappings ReadIdsFromYaml(const std::string& filename) {
56 mastery_it.second.as<uint64_t>(); 56 mastery_it.second.as<uint64_t>();
57 } 57 }
58 } 58 }
59
60 if (room_it.second["keyholders"]) {
61 for (const auto& keyholder_it : room_it.second["keyholders"]) {
62 (*room_ids.mutable_keyholders())[keyholder_it.first
63 .as<std::string>()] =
64 keyholder_it.second.as<uint64_t>();
65 }
66 }
67
68 if (room_it.second["ports"]) {
69 for (const auto& port_it : room_it.second["ports"]) {
70 (*room_ids.mutable_ports())[port_it.first.as<std::string>()] =
71 port_it.second.as<uint64_t>();
72 }
73 }
59 } 74 }
60 } 75 }
61 76
@@ -89,6 +104,20 @@ IdMappings ReadIdsFromYaml(const std::string& filename) {
89 } 104 }
90 } 105 }
91 106
107 if (document["progressives"]) {
108 for (const auto& prog_it : document["progressives"]) {
109 (*result.mutable_progressives())[prog_it.first.as<std::string>()] =
110 prog_it.second.as<uint64_t>();
111 }
112 }
113
114 if (document["door_groups"]) {
115 for (const auto& group_it : document["door_groups"]) {
116 (*result.mutable_door_groups())[group_it.first.as<std::string>()] =
117 group_it.second.as<uint64_t>();
118 }
119 }
120
92 return result; 121 return result;
93} 122}
94 123
@@ -117,6 +146,19 @@ void WriteIdsAsYaml(const IdMappings& ids, const std::string& filename) {
117 mastery_id; 146 mastery_id;
118 }); 147 });
119 148
149 OperateOnSortedMap(room_ids.keyholders(),
150 [&room_node](const std::string& keyholder_name,
151 uint64_t keyholder_id) {
152 room_node["keyholders"][keyholder_name] =
153 keyholder_id;
154 });
155
156 OperateOnSortedMap(
157 room_ids.ports(),
158 [&room_node](const std::string& port_name, uint64_t port_id) {
159 room_node["ports"][port_name] = port_id;
160 });
161
120 map_node["rooms"][room_name] = std::move(room_node); 162 map_node["rooms"][room_name] = std::move(room_node);
121 }); 163 });
122 164
@@ -144,6 +186,16 @@ void WriteIdsAsYaml(const IdMappings& ids, const std::string& filename) {
144 result["special"][special_name] = special_id; 186 result["special"][special_name] = special_id;
145 }); 187 });
146 188
189 OperateOnSortedMap(ids.progressives(),
190 [&result](const std::string& prog_name, uint64_t prog_id) {
191 result["progressives"][prog_name] = prog_id;
192 });
193
194 OperateOnSortedMap(ids.door_groups(), [&result](const std::string& group_name,
195 uint64_t group_id) {
196 result["door_groups"][group_name] = group_id;
197 });
198
147 std::ofstream output_stream(filename); 199 std::ofstream output_stream(filename);
148 output_stream << result << std::endl; 200 output_stream << result << std::endl;
149} 201}
diff --git a/tools/validator/CMakeLists.txt b/tools/validator/CMakeLists.txt index 967b890..1a8fd9c 100644 --- a/tools/validator/CMakeLists.txt +++ b/tools/validator/CMakeLists.txt
@@ -1,3 +1,4 @@
1find_package(fmt REQUIRED)
1find_package(Protobuf REQUIRED) 2find_package(Protobuf REQUIRED)
2 3
3add_executable(validator 4add_executable(validator
@@ -9,4 +10,4 @@ add_executable(validator
9set_property(TARGET validator PROPERTY CXX_STANDARD 20) 10set_property(TARGET validator PROPERTY CXX_STANDARD 20)
10set_property(TARGET validator PROPERTY CXX_STANDARD_REQUIRED ON) 11set_property(TARGET validator PROPERTY CXX_STANDARD_REQUIRED ON)
11target_include_directories(validator PUBLIC ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/tools) 12target_include_directories(validator PUBLIC ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/tools)
12target_link_libraries(validator PUBLIC protos util protobuf::libprotobuf) 13target_link_libraries(validator PUBLIC protos util fmt::fmt protobuf::libprotobuf)
diff --git a/tools/validator/human_processor.cpp b/tools/validator/human_processor.cpp index 5a7e78a..ffa9765 100644 --- a/tools/validator/human_processor.cpp +++ b/tools/validator/human_processor.cpp
@@ -1,5 +1,6 @@
1#include "human_processor.h" 1#include "human_processor.h"
2 2
3#include <fmt/core.h>
3#include <google/protobuf/message.h> 4#include <google/protobuf/message.h>
4#include <google/protobuf/text_format.h> 5#include <google/protobuf/text_format.h>
5 6
@@ -12,6 +13,7 @@
12#include <string> 13#include <string>
13 14
14#include "structs.h" 15#include "structs.h"
16#include "util/ids_yaml_format.h"
15 17
16namespace com::fourisland::lingo2_archipelago { 18namespace com::fourisland::lingo2_archipelago {
17namespace { 19namespace {
@@ -40,7 +42,9 @@ class HumanProcessor {
40 42
41 ProcessConnectionsFile(datadir_path / "connections.txtpb", std::nullopt); 43 ProcessConnectionsFile(datadir_path / "connections.txtpb", std::nullopt);
42 ProcessMaps(datadir_path); 44 ProcessMaps(datadir_path);
43 ProcessIdsFile(datadir_path / "ids.txtpb"); 45 ProcessProgressivesFile(datadir_path / "progressives.txtpb");
46 ProcessDoorGroupsFile(datadir_path / "door_groups.txtpb");
47 ProcessIdsFile(datadir_path / "ids.yaml");
44 } 48 }
45 49
46 private: 50 private:
@@ -73,6 +77,21 @@ class HumanProcessor {
73 for (const std::string& path : metadata.excluded_nodes()) { 77 for (const std::string& path : metadata.excluded_nodes()) {
74 map_info.game_nodes[path].uses++; 78 map_info.game_nodes[path].uses++;
75 } 79 }
80
81 for (const std::string& path : metadata.custom_nodes()) {
82 map_info.game_nodes[path].defined = true;
83 }
84
85 if (metadata.has_worldport_entrance()) {
86 auto port_identifier = GetCompletePortIdentifier(
87 metadata.worldport_entrance(), current_map_name, std::nullopt);
88 if (port_identifier) {
89 PortInfo& port_info = info_.ports[*port_identifier];
90 port_info.map_worldport_entrances.push_back(current_map_name);
91 } else {
92 map_info.malformed_worldport_entrance = metadata.worldport_entrance();
93 }
94 }
76 } 95 }
77 96
78 void ProcessRooms(std::filesystem::path path, 97 void ProcessRooms(std::filesystem::path path,
@@ -93,7 +112,7 @@ class HumanProcessor {
93 room_info.definitions.push_back(h_room); 112 room_info.definitions.push_back(h_room);
94 113
95 for (const HumanPanel& h_panel : h_room.panels()) { 114 for (const HumanPanel& h_panel : h_room.panels()) {
96 ProcessPanel(h_panel, current_map_name, h_room.name()); 115 ProcessPanel(h_panel, current_map_name, h_room);
97 } 116 }
98 117
99 for (const HumanPainting& h_painting : h_room.paintings()) { 118 for (const HumanPainting& h_painting : h_room.paintings()) {
@@ -123,15 +142,14 @@ class HumanProcessor {
123 142
124 void ProcessPanel(const HumanPanel& h_panel, 143 void ProcessPanel(const HumanPanel& h_panel,
125 const std::string& current_map_name, 144 const std::string& current_map_name,
126 const std::string& current_room_name) { 145 const HumanRoom& h_room) {
127 PanelIdentifier panel_identifier; 146 PanelIdentifier panel_identifier;
128 panel_identifier.set_map(current_map_name); 147 panel_identifier.set_map(current_map_name);
129 panel_identifier.set_room(current_room_name); 148 panel_identifier.set_room(h_room.name());
130 panel_identifier.set_name(h_panel.name()); 149 panel_identifier.set_name(h_panel.name());
131 150
132 PanelInfo& panel_info = info_.panels[panel_identifier]; 151 PanelInfo& panel_info = info_.panels[panel_identifier];
133 panel_info.definitions.push_back(h_panel); 152 panel_info.definitions.push_back(h_panel);
134 panel_info.proxies[h_panel.answer()].definitions.push_back(Proxy());
135 153
136 MapInfo& map_info = info_.maps[current_map_name]; 154 MapInfo& map_info = info_.maps[current_map_name];
137 map_info.game_nodes[h_panel.path()].uses++; 155 map_info.game_nodes[h_panel.path()].uses++;
@@ -156,6 +174,24 @@ class HumanProcessor {
156 RoomInfo& required_room_info = info_.rooms[required_room_identifier]; 174 RoomInfo& required_room_info = info_.rooms[required_room_identifier];
157 required_room_info.panels_referenced_by.push_back(panel_identifier); 175 required_room_info.panels_referenced_by.push_back(panel_identifier);
158 } 176 }
177
178 std::string map_area_name = current_map_name;
179 if (h_room.has_panel_display_name()) {
180 map_area_name =
181 fmt::format("{} ({})", current_map_name, h_room.panel_display_name());
182 }
183
184 panel_info.map_area_name = map_area_name;
185
186 std::string panelsanity_name;
187 if (h_panel.has_display_name()) {
188 panelsanity_name =
189 fmt::format("{} - {}", map_area_name, h_panel.display_name());
190 } else {
191 panelsanity_name = fmt::format("{} - {}", map_area_name, h_panel.name());
192 }
193 info_.panel_names[panelsanity_name].panels_used_by.push_back(
194 panel_identifier);
159 } 195 }
160 196
161 void ProcessPainting(const HumanPainting& h_painting, 197 void ProcessPainting(const HumanPainting& h_painting,
@@ -368,7 +404,9 @@ class HumanProcessor {
368 } 404 }
369 } else if (human_connection.has_from()) { 405 } else if (human_connection.has_from()) {
370 ProcessSingleConnection(human_connection, human_connection.from(), 406 ProcessSingleConnection(human_connection, human_connection.from(),
371 current_map_name); 407 current_map_name,
408 /*is_target=*/!human_connection.oneway() &&
409 !human_connection.bypass_target_door());
372 } 410 }
373 411
374 if (human_connection.has_to_room()) { 412 if (human_connection.has_to_room()) {
@@ -384,8 +422,9 @@ class HumanProcessor {
384 std::cout << "A global connection used to_room." << std::endl; 422 std::cout << "A global connection used to_room." << std::endl;
385 } 423 }
386 } else if (human_connection.has_to()) { 424 } else if (human_connection.has_to()) {
387 ProcessSingleConnection(human_connection, human_connection.to(), 425 ProcessSingleConnection(
388 current_map_name); 426 human_connection, human_connection.to(), current_map_name,
427 /*is_target=*/!human_connection.bypass_target_door());
389 } 428 }
390 429
391 if (human_connection.has_door()) { 430 if (human_connection.has_door()) {
@@ -406,7 +445,7 @@ class HumanProcessor {
406 void ProcessSingleConnection( 445 void ProcessSingleConnection(
407 const HumanConnection& human_connection, 446 const HumanConnection& human_connection,
408 const HumanConnection::Endpoint& endpoint, 447 const HumanConnection::Endpoint& endpoint,
409 const std::optional<std::string>& current_map_name) { 448 const std::optional<std::string>& current_map_name, bool is_target) {
410 if (endpoint.has_room()) { 449 if (endpoint.has_room()) {
411 auto room_identifier = 450 auto room_identifier =
412 GetCompleteRoomIdentifier(endpoint.room(), current_map_name); 451 GetCompleteRoomIdentifier(endpoint.room(), current_map_name);
@@ -425,6 +464,11 @@ class HumanProcessor {
425 if (painting_identifier) { 464 if (painting_identifier) {
426 PaintingInfo& painting_info = info_.paintings[*painting_identifier]; 465 PaintingInfo& painting_info = info_.paintings[*painting_identifier];
427 painting_info.connections_referenced_by.push_back(human_connection); 466 painting_info.connections_referenced_by.push_back(human_connection);
467
468 if (is_target) {
469 painting_info.target_connections_referenced_by.push_back(
470 human_connection);
471 }
428 } else { 472 } else {
429 // Not sure where else to store this right now. 473 // Not sure where else to store this right now.
430 std::cout 474 std::cout
@@ -437,6 +481,11 @@ class HumanProcessor {
437 if (port_identifier) { 481 if (port_identifier) {
438 PortInfo& port_info = info_.ports[*port_identifier]; 482 PortInfo& port_info = info_.ports[*port_identifier];
439 port_info.connections_referenced_by.push_back(human_connection); 483 port_info.connections_referenced_by.push_back(human_connection);
484
485 if (is_target) {
486 port_info.target_connections_referenced_by.push_back(
487 human_connection);
488 }
440 } else { 489 } else {
441 // Not sure where else to store this right now. 490 // Not sure where else to store this right now.
442 std::cout 491 std::cout
@@ -454,12 +503,147 @@ class HumanProcessor {
454 panel_info.proxies[endpoint.panel().answer()] 503 panel_info.proxies[endpoint.panel().answer()]
455 .connections_referenced_by.push_back(human_connection); 504 .connections_referenced_by.push_back(human_connection);
456 } 505 }
506
507 if (is_target) {
508 panel_info.target_connections_referenced_by.push_back(
509 human_connection);
510 }
457 } 511 }
458 } 512 }
459 } 513 }
460 514
515 void ProcessProgressivesFile(std::filesystem::path path) {
516 if (!std::filesystem::exists(path)) {
517 return;
518 }
519
520 auto h_progs = ReadMessageFromFile<HumanProgressives>(path.string());
521
522 for (const HumanProgressive& h_prog : h_progs.progressives()) {
523 ProcessProgressive(h_prog);
524 }
525 }
526
527 void ProcessProgressive(const HumanProgressive& h_prog) {
528 ProgressiveInfo& prog_info = info_.progressives[h_prog.name()];
529 prog_info.definitions.push_back(h_prog);
530
531 for (const DoorIdentifier& di : h_prog.doors()) {
532 if (!di.has_map()) {
533 prog_info.malformed_doors.push_back(di);
534 continue;
535 }
536
537 DoorInfo& door_info = info_.doors[di];
538 door_info.progressives_referenced_by.push_back(h_prog.name());
539 }
540 }
541
542 void ProcessDoorGroupsFile(std::filesystem::path path) {
543 if (!std::filesystem::exists(path)) {
544 return;
545 }
546
547 auto h_groups = ReadMessageFromFile<HumanDoorGroups>(path.string());
548
549 for (const HumanDoorGroup& h_group : h_groups.door_groups()) {
550 ProcessDoorGroup(h_group);
551 }
552 }
553
554 void ProcessDoorGroup(const HumanDoorGroup& h_group) {
555 DoorGroupInfo& group_info = info_.door_groups[h_group.name()];
556 group_info.definitions.push_back(h_group);
557
558 for (const DoorIdentifier& di : h_group.doors()) {
559 if (!di.has_map()) {
560 group_info.malformed_doors.push_back(di);
561 continue;
562 }
563
564 DoorInfo& door_info = info_.doors[di];
565 door_info.door_groups_referenced_by.push_back(h_group.name());
566 }
567 }
568
461 void ProcessIdsFile(std::filesystem::path path) { 569 void ProcessIdsFile(std::filesystem::path path) {
462 // Ignore this for now. 570 auto ids = ReadIdsFromYaml(path.string());
571
572 DoorIdentifier di;
573 PanelIdentifier pai;
574 PortIdentifier poi;
575 KeyholderIdentifier ki;
576
577 for (const auto& [map_name, map] : ids.maps()) {
578 di.set_map(map_name);
579 pai.set_map(map_name);
580 poi.set_map(map_name);
581 ki.set_map(map_name);
582
583 for (const auto& [door_name, ap_id] : map.doors()) {
584 di.set_name(door_name);
585
586 DoorInfo& door_info = info_.doors[di];
587 door_info.has_id = true;
588 }
589
590 for (const auto& [room_name, room] : map.rooms()) {
591 pai.set_room(room_name);
592 poi.set_room(room_name);
593 ki.set_room(room_name);
594
595 for (const auto& [panel_name, ap_id] : room.panels()) {
596 pai.set_name(panel_name);
597
598 PanelInfo& panel_info = info_.panels[pai];
599 panel_info.has_id = true;
600 }
601
602 for (const auto& [mastery_name, ap_id] : room.masteries()) {
603 // TODO: Mastery
604 }
605
606 for (const auto& [keyholder_name, ap_id] : room.keyholders()) {
607 ki.set_name(keyholder_name);
608
609 KeyholderInfo& keyholder_info = info_.keyholders[ki];
610 keyholder_info.has_id = true;
611 }
612
613 for (const auto& [port_name, ap_id] : room.ports()) {
614 poi.set_name(port_name);
615
616 PortInfo& port_info = info_.ports[poi];
617 port_info.has_id = true;
618 }
619 }
620 }
621
622 for (const auto& [tag, id] : ids.special()) {
623 // TODO: Specials
624 }
625
626 for (const auto& [letter_name, ap_id] : ids.letters()) {
627 LetterIdentifier li =
628 std::make_tuple(letter_name[0], letter_name[1] == '2');
629 LetterInfo& letter_info = info_.letters[li];
630 letter_info.has_id = true;
631 }
632
633 for (const auto& [ending_name, ap_id] : ids.endings()) {
634 EndingInfo& ending_info = info_.endings[ending_name];
635 ending_info.has_id = true;
636 }
637
638 for (const auto& [prog_name, ap_id] : ids.progressives()) {
639 ProgressiveInfo& prog_info = info_.progressives[prog_name];
640 prog_info.has_id = true;
641 }
642
643 for (const auto& [group_name, ap_id] : ids.door_groups()) {
644 DoorGroupInfo& group_info = info_.door_groups[group_name];
645 group_info.has_id = true;
646 }
463 } 647 }
464 648
465 std::string mapdir_; 649 std::string mapdir_;
diff --git a/tools/validator/structs.h b/tools/validator/structs.h index f7d9dc1..62974a8 100644 --- a/tools/validator/structs.h +++ b/tools/validator/structs.h
@@ -27,6 +27,8 @@ struct GameNodeInfo {
27 27
28struct MapInfo { 28struct MapInfo {
29 std::map<std::string, GameNodeInfo> game_nodes; 29 std::map<std::string, GameNodeInfo> game_nodes;
30
31 std::optional<PortIdentifier> malformed_worldport_entrance;
30}; 32};
31 33
32struct RoomInfo { 34struct RoomInfo {
@@ -39,26 +41,33 @@ struct RoomInfo {
39 41
40struct DoorInfo { 42struct DoorInfo {
41 std::vector<HumanDoor> definitions; 43 std::vector<HumanDoor> definitions;
44 bool has_id = false;
42 45
43 std::vector<HumanConnection> connections_referenced_by; 46 std::vector<HumanConnection> connections_referenced_by;
44 std::vector<DoorIdentifier> doors_referenced_by; 47 std::vector<DoorIdentifier> doors_referenced_by;
45 std::vector<PanelIdentifier> panels_referenced_by; 48 std::vector<PanelIdentifier> panels_referenced_by;
46 std::vector<PaintingIdentifier> paintings_referenced_by; 49 std::vector<PaintingIdentifier> paintings_referenced_by;
47 std::vector<PortIdentifier> ports_referenced_by; 50 std::vector<PortIdentifier> ports_referenced_by;
51 std::vector<std::string> progressives_referenced_by;
52 std::vector<std::string> door_groups_referenced_by;
48 53
49 MalformedIdentifiers malformed_identifiers; 54 MalformedIdentifiers malformed_identifiers;
50}; 55};
51 56
52struct PortInfo { 57struct PortInfo {
53 std::vector<HumanPort> definitions; 58 std::vector<HumanPort> definitions;
59 bool has_id = false;
54 60
55 std::vector<HumanConnection> connections_referenced_by; 61 std::vector<HumanConnection> connections_referenced_by;
62 std::vector<HumanConnection> target_connections_referenced_by;
63 std::vector<std::string> map_worldport_entrances;
56}; 64};
57 65
58struct PaintingInfo { 66struct PaintingInfo {
59 std::vector<HumanPainting> definitions; 67 std::vector<HumanPainting> definitions;
60 68
61 std::vector<HumanConnection> connections_referenced_by; 69 std::vector<HumanConnection> connections_referenced_by;
70 std::vector<HumanConnection> target_connections_referenced_by;
62 std::vector<DoorIdentifier> doors_referenced_by; 71 std::vector<DoorIdentifier> doors_referenced_by;
63}; 72};
64 73
@@ -71,8 +80,12 @@ struct ProxyInfo {
71 80
72struct PanelInfo { 81struct PanelInfo {
73 std::vector<HumanPanel> definitions; 82 std::vector<HumanPanel> definitions;
83 bool has_id = false;
84
85 std::string map_area_name;
74 86
75 std::vector<HumanConnection> connections_referenced_by; 87 std::vector<HumanConnection> connections_referenced_by;
88 std::vector<HumanConnection> target_connections_referenced_by;
76 std::vector<DoorIdentifier> doors_referenced_by; 89 std::vector<DoorIdentifier> doors_referenced_by;
77 90
78 std::map<std::string, ProxyInfo> proxies; 91 std::map<std::string, ProxyInfo> proxies;
@@ -80,6 +93,7 @@ struct PanelInfo {
80 93
81struct KeyholderInfo { 94struct KeyholderInfo {
82 std::vector<HumanKeyholder> definitions; 95 std::vector<HumanKeyholder> definitions;
96 bool has_id = false;
83 97
84 std::vector<DoorIdentifier> doors_referenced_by; 98 std::vector<DoorIdentifier> doors_referenced_by;
85}; 99};
@@ -88,10 +102,30 @@ using LetterIdentifier = std::tuple<char, bool>;
88 102
89struct LetterInfo { 103struct LetterInfo {
90 std::vector<RoomIdentifier> defined_in; 104 std::vector<RoomIdentifier> defined_in;
105 bool has_id = false;
91}; 106};
92 107
93struct EndingInfo { 108struct EndingInfo {
94 std::vector<RoomIdentifier> defined_in; 109 std::vector<RoomIdentifier> defined_in;
110 bool has_id = false;
111};
112
113struct PanelNameInfo {
114 std::vector<PanelIdentifier> panels_used_by;
115};
116
117struct ProgressiveInfo {
118 std::vector<HumanProgressive> definitions;
119 bool has_id = false;
120
121 std::vector<DoorIdentifier> malformed_doors;
122};
123
124struct DoorGroupInfo {
125 std::vector<HumanDoorGroup> definitions;
126 bool has_id = false;
127
128 std::vector<DoorIdentifier> malformed_doors;
95}; 129};
96 130
97struct CollectedInfo { 131struct CollectedInfo {
@@ -105,6 +139,9 @@ struct CollectedInfo {
105 keyholders; 139 keyholders;
106 std::map<LetterIdentifier, LetterInfo> letters; 140 std::map<LetterIdentifier, LetterInfo> letters;
107 std::map<std::string, EndingInfo> endings; 141 std::map<std::string, EndingInfo> endings;
142 std::map<std::string, PanelNameInfo> panel_names;
143 std::map<std::string, ProgressiveInfo> progressives;
144 std::map<std::string, DoorGroupInfo> door_groups;
108}; 145};
109 146
110} // namespace com::fourisland::lingo2_archipelago 147} // namespace com::fourisland::lingo2_archipelago
diff --git a/tools/validator/validator.cpp b/tools/validator/validator.cpp index bc6b854..fe36be7 100644 --- a/tools/validator/validator.cpp +++ b/tools/validator/validator.cpp
@@ -9,277 +9,579 @@
9namespace com::fourisland::lingo2_archipelago { 9namespace com::fourisland::lingo2_archipelago {
10namespace { 10namespace {
11 11
12void ValidateMap(const std::string& map_name, const MapInfo& map_info) { 12class Validator {
13 for (const auto& [node_path, node_info] : map_info.game_nodes) { 13 public:
14 if (node_info.uses > 1) { 14 explicit Validator(const CollectedInfo& info) : info_(info) {}
15 std::cout << "Map " << map_name << " node " << node_path
16 << " is used in multiple places." << std::endl;
17 } else if (node_info.uses == 0) {
18 std::cout << "Map " << map_name << " node " << node_path
19 << " is not used." << std::endl;
20 }
21 15
22 if (!node_info.defined) { 16 void Validate() const {
23 std::cout << "Map " << map_name << " node " << node_path 17 for (const auto& [map_name, map_info] : info_.maps) {
24 << " is not defined in the game file." << std::endl; 18 ValidateMap(map_name, map_info);
19 }
20 for (const auto& [room_identifier, room_info] : info_.rooms) {
21 ValidateRoom(room_identifier, room_info);
22 }
23 for (const auto& [door_identifier, door_info] : info_.doors) {
24 ValidateDoor(door_identifier, door_info);
25 }
26 for (const auto& [port_identifier, port_info] : info_.ports) {
27 ValidatePort(port_identifier, port_info);
28 }
29 for (const auto& [painting_identifier, painting_info] : info_.paintings) {
30 ValidatePainting(painting_identifier, painting_info);
31 }
32 for (const auto& [panel_identifier, panel_info] : info_.panels) {
33 ValidatePanel(panel_identifier, panel_info);
34 }
35 for (const auto& [keyholder_identifier, keyholder_info] :
36 info_.keyholders) {
37 ValidateKeyholder(keyholder_identifier, keyholder_info);
38 }
39 for (const auto& [letter_identifier, letter_info] : info_.letters) {
40 ValidateLetter(letter_identifier, letter_info);
41 }
42 for (const auto& [ending_name, ending_info] : info_.endings) {
43 ValidateEnding(ending_name, ending_info);
44 }
45 for (const auto& [panel_name, panel_info] : info_.panel_names) {
46 ValidatePanelName(panel_name, panel_info);
47 }
48 for (const auto& [prog_name, prog_info] : info_.progressives) {
49 ValidateProgressive(prog_name, prog_info);
50 }
51 for (const auto& [group_name, group_info] : info_.door_groups) {
52 ValidateDoorGroup(group_name, group_info);
25 } 53 }
26 } 54 }
27}
28 55
29void ValidateRoom(const RoomIdentifier& room_identifier, 56 private:
30 const RoomInfo& room_info) { 57 void ValidateMap(const std::string& map_name, const MapInfo& map_info) const {
31 if (room_info.definitions.empty()) { 58 for (const auto& [node_path, node_info] : map_info.game_nodes) {
32 std::cout << "Room " << room_identifier.ShortDebugString() 59 if (node_info.uses > 1) {
33 << " has no definition, but was referenced:" << std::endl; 60 std::cout << "Map " << map_name << " node " << node_path
61 << " is used in multiple places." << std::endl;
62 } else if (node_info.uses == 0) {
63 std::cout << "Map " << map_name << " node " << node_path
64 << " is not used." << std::endl;
65 }
34 66
35 for (const DoorIdentifier& door_identifier : 67 if (!node_info.defined) {
36 room_info.doors_referenced_by) { 68 std::cout << "Map " << map_name << " node " << node_path
37 std::cout << " DOOR " << door_identifier.ShortDebugString() 69 << " is not defined in the game file." << std::endl;
38 << std::endl; 70 }
39 } 71 }
40 72
41 for (const PanelIdentifier& panel_identifier : 73 if (map_info.malformed_worldport_entrance) {
42 room_info.panels_referenced_by) { 74 std::cout << "The worldport entrance for map " << map_name
43 std::cout << " PANEL " << panel_identifier.ShortDebugString() 75 << " is malformed." << std::endl;
44 << std::endl;
45 } 76 }
77 }
46 78
47 for (const HumanConnection& connection : 79 void ValidateRoom(const RoomIdentifier& room_identifier,
48 room_info.connections_referenced_by) { 80 const RoomInfo& room_info) const {
49 std::cout << " CONNECTION " << connection.ShortDebugString() 81 if (room_info.definitions.empty()) {
50 << std::endl; 82 std::cout << "Room " << room_identifier.ShortDebugString()
83 << " has no definition, but was referenced:" << std::endl;
84
85 for (const DoorIdentifier& door_identifier :
86 room_info.doors_referenced_by) {
87 std::cout << " DOOR " << door_identifier.ShortDebugString()
88 << std::endl;
89 }
90
91 for (const PanelIdentifier& panel_identifier :
92 room_info.panels_referenced_by) {
93 std::cout << " PANEL " << panel_identifier.ShortDebugString()
94 << std::endl;
95 }
96
97 for (const HumanConnection& connection :
98 room_info.connections_referenced_by) {
99 std::cout << " CONNECTION " << connection.ShortDebugString()
100 << std::endl;
101 }
102 } else if (room_info.definitions.size() > 1) {
103 std::cout << "Room " << room_identifier.ShortDebugString()
104 << " was defined multiple times." << std::endl;
51 } 105 }
52 } else if (room_info.definitions.size() > 1) {
53 std::cout << "Room " << room_identifier.ShortDebugString()
54 << " was defined multiple times." << std::endl;
55 } 106 }
56}
57
58void ValidateDoor(const DoorIdentifier& door_identifier,
59 const DoorInfo& door_info) {
60 if (door_info.definitions.empty()) {
61 std::cout << "Door " << door_identifier.ShortDebugString()
62 << " has no definition, but was referenced:" << std::endl;
63 107
64 for (const DoorIdentifier& other_door_identifier : 108 bool DoesDoorNeedLocationName(const HumanDoor& h_door,
65 door_info.doors_referenced_by) { 109 const std::string& map_name) const {
66 std::cout << " DOOR " << other_door_identifier.ShortDebugString() 110 if (h_door.type() != DoorType::STANDARD) {
67 << std::endl; 111 return false;
68 } 112 }
69 113
70 for (const PanelIdentifier& panel_identifier : 114 if (h_door.keyholders_size() > 0 || h_door.white_ending() ||
71 door_info.panels_referenced_by) { 115 h_door.complete_at() > 0) {
72 std::cout << " PANEL " << panel_identifier.ShortDebugString() 116 return true;
73 << std::endl;
74 } 117 }
75 118
76 for (const PaintingIdentifier& painting_identifier : 119 if (h_door.panels_size() > 4) {
77 door_info.paintings_referenced_by) { 120 return true;
78 std::cout << " PAINTING " << painting_identifier.ShortDebugString()
79 << std::endl;
80 } 121 }
81 122
82 for (const PortIdentifier& port_identifier : 123 std::set<std::string> map_areas;
83 door_info.ports_referenced_by) { 124 for (const PanelIdentifier& pi : h_door.panels()) {
84 std::cout << " PORT " << port_identifier.ShortDebugString() 125 auto full_pi =
85 << std::endl; 126 GetCompletePanelIdentifierWithoutAnswer(pi, map_name, std::nullopt);
127 if (full_pi) {
128 auto panel_info_it = info_.panels.find(*full_pi);
129 if (panel_info_it != info_.panels.end()) {
130 const PanelInfo& panel_info = panel_info_it->second;
131
132 map_areas.insert(panel_info.map_area_name);
133 }
134 }
86 } 135 }
87 136
88 for (const HumanConnection& connection : 137 if (map_areas.size() > 1) {
89 door_info.connections_referenced_by) { 138 return true;
90 std::cout << " CONNECTION " << connection.ShortDebugString()
91 << std::endl;
92 } 139 }
93 } else if (door_info.definitions.size() > 1) { 140
94 std::cout << "Door " << door_identifier.ShortDebugString() 141 return false;
95 << " was defined multiple times." << std::endl;
96 } 142 }
97 143
98 if (door_info.malformed_identifiers.HasAny()) { 144 void ValidateDoor(const DoorIdentifier& door_identifier,
99 std::cout << "Door " << door_identifier.ShortDebugString() 145 const DoorInfo& door_info) const {
100 << " has malformed identifiers:" << std::endl; 146 if (door_info.definitions.empty()) {
147 std::cout << "Door " << door_identifier.ShortDebugString()
148 << " has no definition, but was referenced:" << std::endl;
101 149
102 for (const PaintingIdentifier& painting_identifier : 150 for (const DoorIdentifier& other_door_identifier :
103 door_info.malformed_identifiers.paintings) { 151 door_info.doors_referenced_by) {
104 std::cout << " PAINTING " << painting_identifier.ShortDebugString() 152 std::cout << " DOOR " << other_door_identifier.ShortDebugString()
105 << std::endl; 153 << std::endl;
106 } 154 }
107 155
108 for (const PanelIdentifier& panel_identifier : 156 for (const PanelIdentifier& panel_identifier :
109 door_info.malformed_identifiers.panels) { 157 door_info.panels_referenced_by) {
110 std::cout << " PANEL " << panel_identifier.ShortDebugString() 158 std::cout << " PANEL " << panel_identifier.ShortDebugString()
111 << std::endl; 159 << std::endl;
160 }
161
162 for (const PaintingIdentifier& painting_identifier :
163 door_info.paintings_referenced_by) {
164 std::cout << " PAINTING " << painting_identifier.ShortDebugString()
165 << std::endl;
166 }
167
168 for (const PortIdentifier& port_identifier :
169 door_info.ports_referenced_by) {
170 std::cout << " PORT " << port_identifier.ShortDebugString()
171 << std::endl;
172 }
173
174 for (const HumanConnection& connection :
175 door_info.connections_referenced_by) {
176 std::cout << " CONNECTION " << connection.ShortDebugString()
177 << std::endl;
178 }
179
180 for (const std::string& prog_name :
181 door_info.progressives_referenced_by) {
182 std::cout << " PROGRESSIVE " << prog_name << std::endl;
183 }
184
185 for (const std::string& group_name :
186 door_info.door_groups_referenced_by) {
187 std::cout << " DOOR GROUP " << group_name << std::endl;
188 }
189
190 if (door_info.has_id) {
191 std::cout << " An AP ID is present." << std::endl;
192 }
193 } else if (door_info.definitions.size() > 1) {
194 std::cout << "Door " << door_identifier.ShortDebugString()
195 << " was defined multiple times." << std::endl;
112 } 196 }
113 197
114 for (const KeyholderIdentifier& keyholder_identifier : 198 if (door_info.malformed_identifiers.HasAny()) {
115 door_info.malformed_identifiers.keyholders) { 199 std::cout << "Door " << door_identifier.ShortDebugString()
116 std::cout << " KEYHOLDER " << keyholder_identifier.ShortDebugString() 200 << " has malformed identifiers:" << std::endl;
117 << std::endl; 201
202 for (const PaintingIdentifier& painting_identifier :
203 door_info.malformed_identifiers.paintings) {
204 std::cout << " PAINTING " << painting_identifier.ShortDebugString()
205 << std::endl;
206 }
207
208 for (const PanelIdentifier& panel_identifier :
209 door_info.malformed_identifiers.panels) {
210 std::cout << " PANEL " << panel_identifier.ShortDebugString()
211 << std::endl;
212 }
213
214 for (const KeyholderIdentifier& keyholder_identifier :
215 door_info.malformed_identifiers.keyholders) {
216 std::cout << " KEYHOLDER " << keyholder_identifier.ShortDebugString()
217 << std::endl;
218 }
118 } 219 }
119 }
120}
121 220
122void ValidatePort(const PortIdentifier& port_identifier, 221 for (const HumanDoor& h_door : door_info.definitions) {
123 const PortInfo& port_info) { 222 if (DoesDoorNeedLocationName(h_door, door_identifier.map()) &&
124 if (port_info.definitions.empty()) { 223 !h_door.has_location_name()) {
125 std::cout << "Port " << port_identifier.ShortDebugString() 224 std::cout << "Door " << door_identifier.ShortDebugString()
126 << " has no definition, but was referenced:" << std::endl; 225 << " needs an explicit location name." << std::endl;
226 }
227
228 if (h_door.type() == DoorType::STANDARD ||
229 h_door.type() == DoorType::LOCATION_ONLY ||
230 h_door.type() == DoorType::GRAVESTONE || h_door.legacy_location()) {
231 if (h_door.double_letters()) {
232 std::cout << "Door " << door_identifier.ShortDebugString()
233 << " is a location that depends on double_letters."
234 << std::endl;
235 }
236
237 if (!h_door.has_location_room()) {
238 std::cout << "Door " << door_identifier.ShortDebugString()
239 << " is missing a location_room." << std::endl;
240 }
241 }
127 242
128 for (const HumanConnection& connection : 243 bool needs_id = (h_door.type() != DoorType::EVENT || h_door.latch() ||
129 port_info.connections_referenced_by) { 244 h_door.legacy_location());
130 std::cout << " CONNECTION " << connection.ShortDebugString() 245 if (door_info.has_id != needs_id) {
131 << std::endl; 246 if (needs_id) {
247 std::cout << "Door " << door_identifier.ShortDebugString()
248 << " is missing an AP ID." << std::endl;
249 } else {
250 std::cout << "Door " << door_identifier.ShortDebugString()
251 << " should not have an AP ID." << std::endl;
252 }
253 }
132 } 254 }
133 } else if (port_info.definitions.size() > 1) {
134 std::cout << "Port " << port_identifier.ShortDebugString()
135 << " was defined multiple times." << std::endl;
136 } 255 }
137}
138 256
139void ValidatePainting(const PaintingIdentifier& painting_identifier, 257 void ValidatePort(const PortIdentifier& port_identifier,
140 const PaintingInfo& painting_info) { 258 const PortInfo& port_info) const {
141 if (painting_info.definitions.empty()) { 259 if (port_info.definitions.empty()) {
142 std::cout << "Painting " << painting_identifier.ShortDebugString() 260 std::cout << "Port " << port_identifier.ShortDebugString()
143 << " has no definition, but was referenced:" << std::endl; 261 << " has no definition, but was referenced:" << std::endl;
144 262
145 for (const DoorIdentifier& door_identifier : 263 for (const HumanConnection& connection :
146 painting_info.doors_referenced_by) { 264 port_info.connections_referenced_by) {
147 std::cout << " DOOR " << door_identifier.ShortDebugString() 265 std::cout << " CONNECTION " << connection.ShortDebugString()
148 << std::endl; 266 << std::endl;
267 }
268
269 for (const std::string& map_name : port_info.map_worldport_entrances) {
270 std::cout << " MAP (worldport_entrance) " << map_name << std::endl;
271 }
272
273 if (port_info.has_id) {
274 std::cout << " An AP ID is present." << std::endl;
275 }
276 } else if (port_info.definitions.size() > 1) {
277 std::cout << "Port " << port_identifier.ShortDebugString()
278 << " was defined multiple times." << std::endl;
149 } 279 }
150 280
151 for (const HumanConnection& connection : 281 if (!port_info.target_connections_referenced_by.empty()) {
152 painting_info.connections_referenced_by) { 282 for (const HumanPort& port : port_info.definitions) {
153 std::cout << " CONNECTION " << connection.ShortDebugString() 283 if (port.has_required_door()) {
154 << std::endl; 284 std::cout << "Port " << port_identifier.ShortDebugString()
285 << " has a required door but is the target of a connection:"
286 << std::endl;
287
288 for (const HumanConnection& connection :
289 port_info.target_connections_referenced_by) {
290 std::cout << " CONNECTION " << connection.ShortDebugString()
291 << std::endl;
292 }
293 }
294 }
295 }
296
297 for (const HumanPort& port : port_info.definitions) {
298 if (!port.no_shuffle()) {
299 if (!port.has_destination()) {
300 std::cout << "Port " << port_identifier.ShortDebugString()
301 << " is shuffleable and missing a destination."
302 << std::endl;
303 }
304 if (!port.has_rotation()) {
305 std::cout << "Port " << port_identifier.ShortDebugString()
306 << " is shuffleable and missing a rotation." << std::endl;
307 }
308 if (!port_info.has_id) {
309 std::cout << "Port " << port_identifier.ShortDebugString()
310 << " is missing an AP ID." << std::endl;
311 }
312 } else {
313 if (port_info.has_id) {
314 std::cout << "Port " << port_identifier.ShortDebugString()
315 << " should not have an AP ID." << std::endl;
316 }
317 }
155 } 318 }
156 } else if (painting_info.definitions.size() > 1) {
157 std::cout << "Painting " << painting_identifier.ShortDebugString()
158 << " was defined multiple times." << std::endl;
159 } 319 }
160}
161 320
162void ValidatePanel(const PanelIdentifier& panel_identifier, 321 void ValidatePainting(const PaintingIdentifier& painting_identifier,
163 const PanelInfo& panel_info) { 322 const PaintingInfo& painting_info) const {
164 if (panel_info.definitions.empty()) { 323 if (painting_info.definitions.empty()) {
165 std::cout << "Panel " << panel_identifier.ShortDebugString() 324 std::cout << "Painting " << painting_identifier.ShortDebugString()
166 << " has no definition, but was referenced:" << std::endl; 325 << " has no definition, but was referenced:" << std::endl;
167 326
168 for (const DoorIdentifier& door_identifier : 327 for (const DoorIdentifier& door_identifier :
169 panel_info.doors_referenced_by) { 328 painting_info.doors_referenced_by) {
170 std::cout << " DOOR " << door_identifier.ShortDebugString() 329 std::cout << " DOOR " << door_identifier.ShortDebugString()
171 << std::endl; 330 << std::endl;
331 }
332
333 for (const HumanConnection& connection :
334 painting_info.connections_referenced_by) {
335 std::cout << " CONNECTION " << connection.ShortDebugString()
336 << std::endl;
337 }
338 } else if (painting_info.definitions.size() > 1) {
339 std::cout << "Painting " << painting_identifier.ShortDebugString()
340 << " was defined multiple times." << std::endl;
172 } 341 }
173 342
174 for (const HumanConnection& connection : 343 if (!painting_info.target_connections_referenced_by.empty()) {
175 panel_info.connections_referenced_by) { 344 for (const HumanPainting& painting : painting_info.definitions) {
176 std::cout << " CONNECTION " << connection.ShortDebugString() 345 if (painting.has_required_door()) {
177 << std::endl; 346 std::cout << "Painting " << painting_identifier.ShortDebugString()
347 << " has a required door but is the target of a connection:"
348 << std::endl;
349
350 for (const HumanConnection& connection :
351 painting_info.target_connections_referenced_by) {
352 std::cout << " CONNECTION " << connection.ShortDebugString()
353 << std::endl;
354 }
355 }
356 }
178 } 357 }
179 } else if (panel_info.definitions.size() > 1) {
180 std::cout << "Panel " << panel_identifier.ShortDebugString()
181 << " was defined multiple times." << std::endl;
182 } 358 }
183 359
184 for (const auto& [answer, proxy_info] : panel_info.proxies) { 360 void ValidatePanel(const PanelIdentifier& panel_identifier,
185 if (proxy_info.definitions.empty()) { 361 const PanelInfo& panel_info) const {
362 if (panel_identifier.name().empty()) {
186 std::cout << "Panel " << panel_identifier.ShortDebugString() 363 std::cout << "Panel " << panel_identifier.ShortDebugString()
187 << " with answer \"" << answer 364 << " has no name." << std::endl;
188 << "\" has no definition, but was referenced:" << std::endl; 365 }
366
367 if (panel_info.definitions.empty()) {
368 std::cout << "Panel " << panel_identifier.ShortDebugString()
369 << " has no definition, but was referenced:" << std::endl;
189 370
190 for (const DoorIdentifier& door_identifier : 371 for (const DoorIdentifier& door_identifier :
191 proxy_info.doors_referenced_by) { 372 panel_info.doors_referenced_by) {
192 std::cout << " DOOR " << door_identifier.ShortDebugString() 373 std::cout << " DOOR " << door_identifier.ShortDebugString()
193 << std::endl; 374 << std::endl;
194 } 375 }
195 376
196 for (const HumanConnection& connection : 377 for (const HumanConnection& connection :
197 proxy_info.connections_referenced_by) { 378 panel_info.connections_referenced_by) {
198 std::cout << " CONNECTION " << connection.ShortDebugString() 379 std::cout << " CONNECTION " << connection.ShortDebugString()
199 << std::endl; 380 << std::endl;
200 } 381 }
201 } else if (proxy_info.definitions.size() > 1) { 382
383 if (panel_info.has_id) {
384 std::cout << " An AP ID is present." << std::endl;
385 }
386 } else if (panel_info.definitions.size() > 1) {
202 std::cout << "Panel " << panel_identifier.ShortDebugString() 387 std::cout << "Panel " << panel_identifier.ShortDebugString()
203 << " with answer \"" << answer 388 << " was defined multiple times." << std::endl;
204 << "\" was defined multiple times." << std::endl;
205 } 389 }
206 }
207}
208 390
209void ValidateKeyholder(const KeyholderIdentifier& keyholder_identifier, 391 for (const auto& [answer, proxy_info] : panel_info.proxies) {
210 const KeyholderInfo& keyholder_info) { 392 if (proxy_info.definitions.empty()) {
211 if (keyholder_info.definitions.empty()) { 393 std::cout << "Panel " << panel_identifier.ShortDebugString()
212 std::cout << "Keyholder " << keyholder_identifier.ShortDebugString() 394 << " with answer \"" << answer
213 << " has no definition, but was referenced:" << std::endl; 395 << "\" has no definition, but was referenced:" << std::endl;
396
397 for (const DoorIdentifier& door_identifier :
398 proxy_info.doors_referenced_by) {
399 std::cout << " DOOR " << door_identifier.ShortDebugString()
400 << std::endl;
401 }
402
403 for (const HumanConnection& connection :
404 proxy_info.connections_referenced_by) {
405 std::cout << " CONNECTION " << connection.ShortDebugString()
406 << std::endl;
407 }
408 } else if (proxy_info.definitions.size() > 1) {
409 std::cout << "Panel " << panel_identifier.ShortDebugString()
410 << " with answer \"" << answer
411 << "\" was defined multiple times." << std::endl;
412 }
413 }
214 414
215 for (const DoorIdentifier& door_identifier : 415 if (!panel_info.has_id) {
216 keyholder_info.doors_referenced_by) { 416 std::cout << "Panel " << panel_identifier.ShortDebugString()
217 std::cout << " DOOR " << door_identifier.ShortDebugString() 417 << " is missing an AP ID." << std::endl;
218 << std::endl; 418 }
419
420 if (!panel_info.target_connections_referenced_by.empty()) {
421 for (const HumanPanel& panel : panel_info.definitions) {
422 if (panel.has_required_door()) {
423 std::cout << "Panel " << panel_identifier.ShortDebugString()
424 << " has a required door but is the target of a connection:"
425 << std::endl;
426
427 for (const HumanConnection& connection :
428 panel_info.target_connections_referenced_by) {
429 std::cout << " CONNECTION " << connection.ShortDebugString()
430 << std::endl;
431 }
432 }
433 }
219 } 434 }
220 } else if (keyholder_info.definitions.size() > 1) {
221 std::cout << "Keyholder " << keyholder_identifier.ShortDebugString()
222 << " was defined multiple times." << std::endl;
223 } 435 }
224}
225 436
226void ValidateLetter(const LetterIdentifier& letter_identifier, 437 void ValidateKeyholder(const KeyholderIdentifier& keyholder_identifier,
227 const LetterInfo& letter_info) { 438 const KeyholderInfo& keyholder_info) const {
228 std::string letter_name = std::string(1, std::get<0>(letter_identifier)) + 439 if (keyholder_info.definitions.empty()) {
229 (std::get<1>(letter_identifier) ? "2" : "1"); 440 std::cout << "Keyholder " << keyholder_identifier.ShortDebugString()
441 << " has no definition, but was referenced:" << std::endl;
230 442
231 if (letter_info.defined_in.size() > 1) { 443 for (const DoorIdentifier& door_identifier :
232 std::cout << "Letter " << letter_name 444 keyholder_info.doors_referenced_by) {
233 << " was defined in multiple places:" << std::endl; 445 std::cout << " DOOR " << door_identifier.ShortDebugString()
446 << std::endl;
447 }
234 448
235 for (const RoomIdentifier& room_identifier : letter_info.defined_in) { 449 if (keyholder_info.has_id) {
236 std::cout << " " << room_identifier.ShortDebugString() << std::endl; 450 std::cout << " An AP ID is present." << std::endl;
451 }
452 } else if (keyholder_info.definitions.size() > 1) {
453 std::cout << "Keyholder " << keyholder_identifier.ShortDebugString()
454 << " was defined multiple times." << std::endl;
455 }
456
457 for (const HumanKeyholder& h_keyholder : keyholder_info.definitions) {
458 bool needs_id = (h_keyholder.has_key());
459
460 if (needs_id != keyholder_info.has_id) {
461 if (needs_id) {
462 std::cout << "Keyholder " << keyholder_identifier.ShortDebugString()
463 << " is missing an AP ID." << std::endl;
464 } else {
465 std::cout << "Keyholder " << keyholder_identifier.ShortDebugString()
466 << " should not have an AP ID." << std::endl;
467 }
468 }
237 } 469 }
238 } 470 }
239}
240 471
241void ValidateEnding(const std::string& ending_name, 472 void ValidateLetter(const LetterIdentifier& letter_identifier,
242 const EndingInfo& ending_info) { 473 const LetterInfo& letter_info) const {
243 if (ending_info.defined_in.size() > 1) { 474 std::string letter_name = std::string(1, std::get<0>(letter_identifier)) +
244 std::cout << "Ending " << ending_name 475 (std::get<1>(letter_identifier) ? "2" : "1");
245 << " was defined in multiple places:" << std::endl; 476
477 if (letter_info.defined_in.empty()) {
478 std::cout << "Letter " << letter_name
479 << " has no definition, but was referenced:" << std::endl;
480
481 if (letter_info.has_id) {
482 std::cout << " An AP ID is present." << std::endl;
483 }
484 } else if (letter_info.defined_in.size() > 1) {
485 std::cout << "Letter " << letter_name
486 << " was defined in multiple places:" << std::endl;
246 487
247 for (const RoomIdentifier& room_identifier : ending_info.defined_in) { 488 for (const RoomIdentifier& room_identifier : letter_info.defined_in) {
248 std::cout << " " << room_identifier.ShortDebugString() << std::endl; 489 std::cout << " " << room_identifier.ShortDebugString() << std::endl;
490 }
491 }
492
493 if (!letter_info.has_id) {
494 std::cout << "Letter " << letter_name << " is missing an AP ID."
495 << std::endl;
249 } 496 }
250 } 497 }
251}
252 498
253} // namespace 499 void ValidateEnding(const std::string& ending_name,
500 const EndingInfo& ending_info) const {
501 if (ending_info.defined_in.empty()) {
502 std::cout << "Ending " << ending_name
503 << " has no definition, but was referenced:" << std::endl;
254 504
255void ValidateCollectedInfo(const CollectedInfo& info) { 505 if (ending_info.has_id) {
256 for (const auto& [map_name, map_info] : info.maps) { 506 std::cout << " An AP ID is present." << std::endl;
257 ValidateMap(map_name, map_info); 507 }
258 } 508 } else if (ending_info.defined_in.size() > 1) {
259 for (const auto& [room_identifier, room_info] : info.rooms) { 509 std::cout << "Ending " << ending_name
260 ValidateRoom(room_identifier, room_info); 510 << " was defined in multiple places:" << std::endl;
261 } 511
262 for (const auto& [door_identifier, door_info] : info.doors) { 512 for (const RoomIdentifier& room_identifier : ending_info.defined_in) {
263 ValidateDoor(door_identifier, door_info); 513 std::cout << " " << room_identifier.ShortDebugString() << std::endl;
264 } 514 }
265 for (const auto& [port_identifier, port_info] : info.ports) { 515 }
266 ValidatePort(port_identifier, port_info); 516
267 } 517 if (!ending_info.has_id) {
268 for (const auto& [painting_identifier, painting_info] : info.paintings) { 518 std::cout << "Ending " << ending_name << " is missing an AP ID."
269 ValidatePainting(painting_identifier, painting_info); 519 << std::endl;
270 } 520 }
271 for (const auto& [panel_identifier, panel_info] : info.panels) {
272 ValidatePanel(panel_identifier, panel_info);
273 } 521 }
274 for (const auto& [keyholder_identifier, keyholder_info] : info.keyholders) { 522
275 ValidateKeyholder(keyholder_identifier, keyholder_info); 523 void ValidatePanelName(const std::string& panel_name,
524 const PanelNameInfo& panel_info) const {
525 if (panel_info.panels_used_by.size() > 1) {
526 std::cout << "The location name \"" << panel_name
527 << "\" is used by multiple panels:" << std::endl;
528
529 for (const PanelIdentifier& panel_identifier :
530 panel_info.panels_used_by) {
531 std::cout << " PANEL " << panel_identifier.ShortDebugString()
532 << std::endl;
533 }
534 }
276 } 535 }
277 for (const auto& [letter_identifier, letter_info] : info.letters) { 536
278 ValidateLetter(letter_identifier, letter_info); 537 void ValidateProgressive(const std::string& prog_name,
538 const ProgressiveInfo& prog_info) const {
539 if (prog_info.definitions.empty()) {
540 std::cout << "Progressive \"" << prog_name
541 << "\" has no definition, but was referenced:" << std::endl;
542
543 if (prog_info.has_id) {
544 std::cout << " An AP ID is present." << std::endl;
545 }
546 } else if (prog_info.definitions.size() > 1) {
547 std::cout << "Progressive \"" << prog_name
548 << "\" has multiple definitions." << std::endl;
549 }
550
551 if (!prog_info.has_id) {
552 std::cout << "Progressive \"" << prog_name << "\" is missing an AP ID."
553 << std::endl;
554 }
279 } 555 }
280 for (const auto& [ending_name, ending_info] : info.endings) { 556
281 ValidateEnding(ending_name, ending_info); 557 void ValidateDoorGroup(const std::string& group_name,
558 const DoorGroupInfo& group_info) const {
559 if (group_info.definitions.empty()) {
560 std::cout << "Door group \"" << group_name
561 << "\" has no definition, but was referenced:" << std::endl;
562
563 if (group_info.has_id) {
564 std::cout << " An AP ID is present." << std::endl;
565 }
566 } else if (group_info.definitions.size() > 1) {
567 std::cout << "Door group \"" << group_name
568 << "\" has multiple definitions." << std::endl;
569 }
570
571 if (!group_info.has_id) {
572 std::cout << "Door group \"" << group_name << "\" is missing an AP ID."
573 << std::endl;
574 }
282 } 575 }
576
577 const CollectedInfo& info_;
578};
579
580} // namespace
581
582void ValidateCollectedInfo(const CollectedInfo& info) {
583 Validator validator(info);
584 validator.Validate();
283} 585}
284 586
285} // namespace com::fourisland::lingo2_archipelago 587} // namespace com::fourisland::lingo2_archipelago
diff --git a/tools/validator/validator.h b/tools/validator/validator.h index b710429..33bc7c9 100644 --- a/tools/validator/validator.h +++ b/tools/validator/validator.h
@@ -1,4 +1,4 @@
1#ifndef TOOLS_VALIDATOR_VALIDATOR_H_ 1#ifndef TOOLS_VALIDATOR_VALIDATOR_H
2#define TOOLS_VALIDATOR_VALIDATOR_H 2#define TOOLS_VALIDATOR_VALIDATOR_H
3 3
4namespace com::fourisland::lingo2_archipelago { 4namespace com::fourisland::lingo2_archipelago {
diff --git a/vcpkg.json b/vcpkg.json index 6517f7e..ba6833f 100644 --- a/vcpkg.json +++ b/vcpkg.json
@@ -1,12 +1,13 @@
1{ 1{
2 "dependencies": [ 2 "dependencies": [
3 "fmt",
3 "protobuf", 4 "protobuf",
4 "yaml-cpp" 5 "yaml-cpp"
5 ], 6 ],
6 "overrides": [ 7 "overrides": [
7 { 8 {
8 "name": "protobuf", 9 "name": "protobuf",
9 "version": "5.29.3" 10 "version": "3.21.12"
10 } 11 }
11 ] 12 ]
12} \ No newline at end of file 13} \ No newline at end of file
diff --git a/vendor/godobuf/LICENSE b/vendor/godobuf/LICENSE new file mode 100644 index 0000000..5d473d8 --- /dev/null +++ b/vendor/godobuf/LICENSE
@@ -0,0 +1,29 @@
1BSD 3-Clause License
2
3Copyright (c) 2018, oniksan
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8
9* Redistributions of source code must retain the above copyright notice, this
10 list of conditions and the following disclaimer.
11
12* Redistributions in binary form must reproduce the above copyright notice,
13 this list of conditions and the following disclaimer in the documentation
14 and/or other materials provided with the distribution.
15
16* Neither the name of the copyright holder nor the names of its
17 contributors may be used to endorse or promote products derived from
18 this software without specific prior written permission.
19
20THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/godobuf/README b/vendor/godobuf/README new file mode 100644 index 0000000..ce716bb --- /dev/null +++ b/vendor/godobuf/README
@@ -0,0 +1,4 @@
1This is a fork of https://github.com/oniksan/godobuf with some minor changes so
2that it is able to compile the Lingo 2 randomizer proto files. The plugin parts
3of the project have also been removed since we only need the command line
4script.
diff --git a/vendor/godobuf/addons/protobuf/parser.gd b/vendor/godobuf/addons/protobuf/parser.gd new file mode 100644 index 0000000..dfc0bdd --- /dev/null +++ b/vendor/godobuf/addons/protobuf/parser.gd
@@ -0,0 +1,2254 @@
1#
2# BSD 3-Clause License
3#
4# Copyright (c) 2018 - 2023, Oleg Malyavkin
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions are met:
9#
10# * Redistributions of source code must retain the above copyright notice, this
11# list of conditions and the following disclaimer.
12#
13# * Redistributions in binary form must reproduce the above copyright notice,
14# this list of conditions and the following disclaimer in the documentation
15# and/or other materials provided with the distribution.
16#
17# * Neither the name of the copyright holder nor the names of its
18# contributors may be used to endorse or promote products derived from
19# this software without specific prior written permission.
20#
21# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32extends Node
33
34const PROTO_VERSION_CONST : String = "const PROTO_VERSION = "
35const PROTO_VERSION_DEFAULT : String = PROTO_VERSION_CONST + "0"
36
37class Document:
38
39 func _init(doc_name : String, doc_text : String):
40 name = doc_name
41 text = doc_text
42
43 var name : String
44 var text : String
45
46class TokenPosition:
47 func _init(b : int, e : int):
48 begin = b
49 end = e
50 var begin : int = 0
51 var end : int = 0
52
53class Helper:
54
55 class StringPosition:
56 func _init(s : int, c : int, l : int):
57 str_num = s
58 column = c
59 length = l
60 var str_num : int
61 var column : int
62 var length : int
63
64 static func str_pos(text : String, position : TokenPosition) -> StringPosition:
65 var cur_str : int = 1
66 var cur_col : int = 1
67 var res_str : int = 0
68 var res_col : int = 0
69 var res_length : int = 0
70 for i in range(text.length()):
71 if text[i] == "\n":
72 cur_str += 1
73 cur_col = 0
74 if position.begin == i:
75 res_str = cur_str
76 res_col = cur_col
77 res_length = position.end - position.begin + 1
78 break
79 cur_col += 1
80 return StringPosition.new(res_str, res_col, res_length)
81
82 static func text_pos(tokens : Array, index : int) -> TokenPosition:
83 var res_begin : int = 0
84 var res_end : int = 0
85 if index < tokens.size() && index >= 0:
86 res_begin = tokens[index].position.begin
87 res_end = tokens[index].position.end
88 return TokenPosition.new(res_begin, res_end)
89
90 static func error_string(file_name, col, row, error_text):
91 return file_name + ":" + str(col) + ":" + str(row) + ": error: " + error_text
92
93class AnalyzeResult:
94 var classes : Array = []
95 var fields : Array = []
96 var groups : Array = []
97 var version : int = 0
98 var state : bool = false
99 var tokens : Array = []
100 var syntax : Analysis.TranslationResult
101 var imports : Array = []
102 var doc : Document
103
104 func soft_copy() -> AnalyzeResult:
105 var res : AnalyzeResult = AnalyzeResult.new()
106 res.classes = classes
107 res.fields = fields
108 res.groups = groups
109 res.version = version
110 res.state = state
111 res.tokens = tokens
112 res.syntax = syntax
113 res.imports = imports
114 res.doc = doc
115 return res
116
117class Analysis:
118
119 func _init(path : String, doc : Document):
120 path_dir = path
121 document = doc
122
123 var document : Document
124 var path_dir : String
125
126 const LEX = {
127 LETTER = "[A-Za-z]",
128 DIGIT_DEC = "[0-9]",
129 DIGIT_OCT = "[0-7]",
130 DIGIT_HEX = "[0-9]|[A-F]|[a-f]",
131 BRACKET_ROUND_LEFT = "\\(",
132 BRACKET_ROUND_RIGHT = "\\)",
133 BRACKET_CURLY_LEFT = "\\{",
134 BRACKET_CURLY_RIGHT = "\\}",
135 BRACKET_SQUARE_LEFT = "\\[",
136 BRACKET_SQUARE_RIGHT = "\\]",
137 BRACKET_ANGLE_LEFT = "\\<",
138 BRACKET_ANGLE_RIGHT = "\\>",
139 SEMICOLON = ";",
140 COMMA = ",",
141 EQUAL = "=",
142 SIGN = "\\+|\\-",
143 SPACE = "\\s",
144 QUOTE_SINGLE = "'",
145 QUOTE_DOUBLE = "\"",
146 }
147
148 const TOKEN_IDENT : String = "(" + LEX.LETTER + "+" + "(" + LEX.LETTER + "|" + LEX.DIGIT_DEC + "|" + "_)*)"
149 const TOKEN_FULL_IDENT : String = TOKEN_IDENT + "{0,1}(\\." + TOKEN_IDENT + ")+"
150 const TOKEN_BRACKET_ROUND_LEFT : String = "(" + LEX.BRACKET_ROUND_LEFT + ")"
151 const TOKEN_BRACKET_ROUND_RIGHT : String = "(" + LEX.BRACKET_ROUND_RIGHT + ")"
152 const TOKEN_BRACKET_CURLY_LEFT : String = "(" + LEX.BRACKET_CURLY_LEFT + ")"
153 const TOKEN_BRACKET_CURLY_RIGHT : String = "(" + LEX.BRACKET_CURLY_RIGHT + ")"
154 const TOKEN_BRACKET_SQUARE_LEFT : String = "(" + LEX.BRACKET_SQUARE_LEFT + ")"
155 const TOKEN_BRACKET_SQUARE_RIGHT : String = "(" + LEX.BRACKET_SQUARE_RIGHT + ")"
156 const TOKEN_BRACKET_ANGLE_LEFT : String = "(" + LEX.BRACKET_ANGLE_LEFT + ")"
157 const TOKEN_BRACKET_ANGLE_RIGHT : String = "(" + LEX.BRACKET_ANGLE_RIGHT + ")"
158 const TOKEN_SEMICOLON : String = "(" + LEX.SEMICOLON + ")"
159 const TOKEN_EUQAL : String = "(" + LEX.EQUAL + ")"
160 const TOKEN_SIGN : String = "(" + LEX.SIGN + ")"
161 const TOKEN_LITERAL_DEC : String = "(([1-9])" + LEX.DIGIT_DEC +"*)"
162 const TOKEN_LITERAL_OCT : String = "(0" + LEX.DIGIT_OCT +"*)"
163 const TOKEN_LITERAL_HEX : String = "(0(x|X)(" + LEX.DIGIT_HEX +")+)"
164 const TOKEN_LITERAL_INT : String = "((\\+|\\-){0,1}" + TOKEN_LITERAL_DEC + "|" + TOKEN_LITERAL_OCT + "|" + TOKEN_LITERAL_HEX + ")"
165 const TOKEN_LITERAL_FLOAT_DEC : String = "(" + LEX.DIGIT_DEC + "+)"
166 const TOKEN_LITERAL_FLOAT_EXP : String = "((e|E)(\\+|\\-)?" + TOKEN_LITERAL_FLOAT_DEC + "+)"
167 const TOKEN_LITERAL_FLOAT : String = "((\\+|\\-){0,1}(" + TOKEN_LITERAL_FLOAT_DEC + "\\." + TOKEN_LITERAL_FLOAT_DEC + "?" + TOKEN_LITERAL_FLOAT_EXP + "?)|(" + TOKEN_LITERAL_FLOAT_DEC + TOKEN_LITERAL_FLOAT_EXP + ")|(\\." + TOKEN_LITERAL_FLOAT_DEC + TOKEN_LITERAL_FLOAT_EXP + "?))"
168 const TOKEN_SPACE : String = "(" + LEX.SPACE + ")+"
169 const TOKEN_COMMA : String = "(" + LEX.COMMA + ")"
170 const TOKEN_CHAR_ESC : String = "[\\\\(a|b|f|n|r|t|v|\\\\|'|\")]"
171 const TOKEN_OCT_ESC : String = "[\\\\" + LEX.DIGIT_OCT + "{3}]"
172 const TOKEN_HEX_ESC : String = "[\\\\(x|X)" + LEX.DIGIT_HEX + "{2}]"
173 const TOKEN_CHAR_EXCLUDE : String = "[^\\0\\n\\\\]"
174 const TOKEN_CHAR_VALUE : String = "(" + TOKEN_HEX_ESC + "|" + TOKEN_OCT_ESC + "|" + TOKEN_CHAR_ESC + "|" + TOKEN_CHAR_EXCLUDE + ")"
175 const TOKEN_STRING_SINGLE : String = "('" + TOKEN_CHAR_VALUE + "*?')"
176 const TOKEN_STRING_DOUBLE : String = "(\"" + TOKEN_CHAR_VALUE + "*?\")"
177 const TOKEN_COMMENT_SINGLE : String = "((//[^\\n\\r]*[^\\s])|//)"
178 const TOKEN_COMMENT_MULTI : String = "/\\*(.|[\\n\\r])*?\\*/"
179
180 const TOKEN_SECOND_MESSAGE : String = "^message$"
181 const TOKEN_SECOND_SIMPLE_DATA_TYPE : String = "^(double|float|int32|int64|uint32|uint64|sint32|sint64|fixed32|fixed64|sfixed32|sfixed64|bool|string|bytes)$"
182 const TOKEN_SECOND_ENUM : String = "^enum$"
183 const TOKEN_SECOND_MAP : String = "^map$"
184 const TOKEN_SECOND_ONEOF : String = "^oneof$"
185 const TOKEN_SECOND_LITERAL_BOOL : String = "^(true|false)$"
186 const TOKEN_SECOND_SYNTAX : String = "^syntax$"
187 const TOKEN_SECOND_IMPORT : String = "^import$"
188 const TOKEN_SECOND_PACKAGE : String = "^package$"
189 const TOKEN_SECOND_OPTION : String = "^option$"
190 const TOKEN_SECOND_SERVICE : String = "^service$"
191 const TOKEN_SECOND_RESERVED : String = "^reserved$"
192 const TOKEN_SECOND_IMPORT_QUALIFICATION : String = "^(weak|public)$"
193 const TOKEN_SECOND_FIELD_QUALIFICATION : String = "^(repeated|required|optional)$"
194 const TOKEN_SECOND_ENUM_OPTION : String = "^allow_alias$"
195 const TOKEN_SECOND_QUALIFICATION : String = "^(custom_option|extensions)$"
196 const TOKEN_SECOND_FIELD_OPTION : String = "^packed$"
197
198 class TokenEntrance:
199 func _init(i : int, b : int, e : int, t : String):
200 position = TokenPosition.new(b, e)
201 text = t
202 id = i
203 var position : TokenPosition
204 var text : String
205 var id : int
206
207 enum RANGE_STATE {
208 INCLUDE = 0,
209 EXCLUDE_LEFT = 1,
210 EXCLUDE_RIGHT = 2,
211 OVERLAY = 3,
212 EQUAL = 4,
213 ENTERS = 5
214 }
215
216 class TokenRange:
217 func _init(b : int, e : int, s):
218 position = TokenPosition.new(b, e)
219 state = s
220 var position : TokenPosition
221 var state
222
223 class Token:
224 var _regex : RegEx
225 var _entrance : TokenEntrance = null
226 var _entrances : Array = []
227 var _entrance_index : int = 0
228 var _id : int
229 var _ignore : bool
230 var _clarification : String
231
232 func _init(id : int, clarification : String, regex_str : String, ignore = false):
233 _id = id
234 _regex = RegEx.new()
235 _regex.compile(regex_str)
236 _clarification = clarification
237 _ignore = ignore
238
239 func find(text : String, start : int) -> TokenEntrance:
240 _entrance = null
241 if !_regex.is_valid():
242 return null
243 var match_result : RegExMatch = _regex.search(text, start)
244 if match_result != null:
245 var capture
246 capture = match_result.get_string(0)
247 if capture.is_empty():
248 return null
249 _entrance = TokenEntrance.new(_id, match_result.get_start(0), capture.length() - 1 + match_result.get_start(0), capture)
250 return _entrance
251
252 func find_all(text : String) -> Array:
253 var pos : int = 0
254 clear()
255 while find(text, pos) != null:
256 _entrances.append(_entrance)
257 pos = _entrance.position.end + 1
258 return _entrances
259
260 func add_entrance(entrance) -> void:
261 _entrances.append(entrance)
262
263 func clear() -> void:
264 _entrance = null
265 _entrances = []
266 _entrance_index = 0
267
268 func get_entrances() -> Array:
269 return _entrances
270
271 func remove_entrance(index) -> void:
272 if index < _entrances.size():
273 _entrances.remove_at(index)
274
275 func get_index() -> int:
276 return _entrance_index
277
278 func set_index(index : int) -> void:
279 if index < _entrances.size():
280 _entrance_index = index
281 else:
282 _entrance_index = 0
283
284 func is_ignore() -> bool:
285 return _ignore
286
287 func get_clarification() -> String:
288 return _clarification
289
290 class TokenResult:
291 var tokens : Array = []
292 var errors : Array = []
293
294 enum TOKEN_ID {
295 UNDEFINED = -1,
296 IDENT = 0,
297 FULL_IDENT = 1,
298 BRACKET_ROUND_LEFT = 2,
299 BRACKET_ROUND_RIGHT = 3,
300 BRACKET_CURLY_LEFT = 4,
301 BRACKET_CURLY_RIGHT = 5,
302 BRACKET_SQUARE_LEFT = 6,
303 BRACKET_SQUARE_RIGHT = 7,
304 BRACKET_ANGLE_LEFT = 8,
305 BRACKET_ANGLE_RIGHT = 9,
306 SEMICOLON = 10,
307 EUQAL = 11,
308 SIGN = 12,
309 INT = 13,
310 FLOAT = 14,
311 SPACE = 15,
312 COMMA = 16,
313 STRING_SINGLE = 17,
314 STRING_DOUBLE = 18,
315 COMMENT_SINGLE = 19,
316 COMMENT_MULTI = 20,
317
318 MESSAGE = 21,
319 SIMPLE_DATA_TYPE = 22,
320 ENUM = 23,
321 MAP = 24,
322 ONEOF = 25,
323 LITERAL_BOOL = 26,
324 SYNTAX = 27,
325 IMPORT = 28,
326 PACKAGE = 29,
327 OPTION = 30,
328 SERVICE = 31,
329 RESERVED = 32,
330 IMPORT_QUALIFICATION = 33,
331 FIELD_QUALIFICATION = 34,
332 ENUM_OPTION = 35,
333 QUALIFICATION = 36,
334 FIELD_OPTION = 37,
335
336 STRING = 38
337 }
338
339 var TOKEN = {
340 TOKEN_ID.IDENT: Token.new(TOKEN_ID.IDENT, "Identifier", TOKEN_IDENT),
341 TOKEN_ID.FULL_IDENT: Token.new(TOKEN_ID.FULL_IDENT, "Full identifier", TOKEN_FULL_IDENT),
342 TOKEN_ID.BRACKET_ROUND_LEFT: Token.new(TOKEN_ID.BRACKET_ROUND_LEFT, "(", TOKEN_BRACKET_ROUND_LEFT),
343 TOKEN_ID.BRACKET_ROUND_RIGHT: Token.new(TOKEN_ID.BRACKET_ROUND_RIGHT, ")", TOKEN_BRACKET_ROUND_RIGHT),
344 TOKEN_ID.BRACKET_CURLY_LEFT: Token.new(TOKEN_ID.BRACKET_CURLY_LEFT, "{", TOKEN_BRACKET_CURLY_LEFT),
345 TOKEN_ID.BRACKET_CURLY_RIGHT: Token.new(TOKEN_ID.BRACKET_CURLY_RIGHT, "}", TOKEN_BRACKET_CURLY_RIGHT),
346 TOKEN_ID.BRACKET_SQUARE_LEFT: Token.new(TOKEN_ID.BRACKET_SQUARE_LEFT, "[", TOKEN_BRACKET_SQUARE_LEFT),
347 TOKEN_ID.BRACKET_SQUARE_RIGHT: Token.new(TOKEN_ID.BRACKET_SQUARE_RIGHT, "]", TOKEN_BRACKET_SQUARE_RIGHT),
348 TOKEN_ID.BRACKET_ANGLE_LEFT: Token.new(TOKEN_ID.BRACKET_ANGLE_LEFT, "<", TOKEN_BRACKET_ANGLE_LEFT),
349 TOKEN_ID.BRACKET_ANGLE_RIGHT: Token.new(TOKEN_ID.BRACKET_ANGLE_RIGHT, ">", TOKEN_BRACKET_ANGLE_RIGHT),
350 TOKEN_ID.SEMICOLON: Token.new(TOKEN_ID.SEMICOLON, ";", TOKEN_SEMICOLON),
351 TOKEN_ID.EUQAL: Token.new(TOKEN_ID.EUQAL, "=", TOKEN_EUQAL),
352 TOKEN_ID.INT: Token.new(TOKEN_ID.INT, "Integer", TOKEN_LITERAL_INT),
353 TOKEN_ID.FLOAT: Token.new(TOKEN_ID.FLOAT, "Float", TOKEN_LITERAL_FLOAT),
354 TOKEN_ID.SPACE: Token.new(TOKEN_ID.SPACE, "Space", TOKEN_SPACE),
355 TOKEN_ID.COMMA: Token.new(TOKEN_ID.COMMA, ",", TOKEN_COMMA),
356 TOKEN_ID.STRING_SINGLE: Token.new(TOKEN_ID.STRING_SINGLE, "'String'", TOKEN_STRING_SINGLE),
357 TOKEN_ID.STRING_DOUBLE: Token.new(TOKEN_ID.STRING_DOUBLE, "\"String\"", TOKEN_STRING_DOUBLE),
358 TOKEN_ID.COMMENT_SINGLE: Token.new(TOKEN_ID.COMMENT_SINGLE, "//Comment", TOKEN_COMMENT_SINGLE),
359 TOKEN_ID.COMMENT_MULTI: Token.new(TOKEN_ID.COMMENT_MULTI, "/*Comment*/", TOKEN_COMMENT_MULTI),
360
361 TOKEN_ID.MESSAGE: Token.new(TOKEN_ID.MESSAGE, "Message", TOKEN_SECOND_MESSAGE, true),
362 TOKEN_ID.SIMPLE_DATA_TYPE: Token.new(TOKEN_ID.SIMPLE_DATA_TYPE, "Data type", TOKEN_SECOND_SIMPLE_DATA_TYPE, true),
363 TOKEN_ID.ENUM: Token.new(TOKEN_ID.ENUM, "Enum", TOKEN_SECOND_ENUM, true),
364 TOKEN_ID.MAP: Token.new(TOKEN_ID.MAP, "Map", TOKEN_SECOND_MAP, true),
365 TOKEN_ID.ONEOF: Token.new(TOKEN_ID.ONEOF, "OneOf", TOKEN_SECOND_ONEOF, true),
366 TOKEN_ID.LITERAL_BOOL: Token.new(TOKEN_ID.LITERAL_BOOL, "Bool literal", TOKEN_SECOND_LITERAL_BOOL, true),
367 TOKEN_ID.SYNTAX: Token.new(TOKEN_ID.SYNTAX, "Syntax", TOKEN_SECOND_SYNTAX, true),
368 TOKEN_ID.IMPORT: Token.new(TOKEN_ID.IMPORT, "Import", TOKEN_SECOND_IMPORT, true),
369 TOKEN_ID.PACKAGE: Token.new(TOKEN_ID.PACKAGE, "Package", TOKEN_SECOND_PACKAGE, true),
370 TOKEN_ID.OPTION: Token.new(TOKEN_ID.OPTION, "Option", TOKEN_SECOND_OPTION, true),
371 TOKEN_ID.SERVICE: Token.new(TOKEN_ID.SERVICE, "Service", TOKEN_SECOND_SERVICE, true),
372 TOKEN_ID.RESERVED: Token.new(TOKEN_ID.RESERVED, "Reserved", TOKEN_SECOND_RESERVED, true),
373 TOKEN_ID.IMPORT_QUALIFICATION: Token.new(TOKEN_ID.IMPORT_QUALIFICATION, "Import qualification", TOKEN_SECOND_IMPORT_QUALIFICATION, true),
374 TOKEN_ID.FIELD_QUALIFICATION: Token.new(TOKEN_ID.FIELD_QUALIFICATION, "Field qualification", TOKEN_SECOND_FIELD_QUALIFICATION, true),
375 TOKEN_ID.ENUM_OPTION: Token.new(TOKEN_ID.ENUM_OPTION, "Enum option", TOKEN_SECOND_ENUM_OPTION, true),
376 TOKEN_ID.QUALIFICATION: Token.new(TOKEN_ID.QUALIFICATION, "Qualification", TOKEN_SECOND_QUALIFICATION, true),
377 TOKEN_ID.FIELD_OPTION: Token.new(TOKEN_ID.FIELD_OPTION, "Field option", TOKEN_SECOND_FIELD_OPTION, true),
378
379 TOKEN_ID.STRING: Token.new(TOKEN_ID.STRING, "String", "", true)
380 }
381
382 static func check_range(main : TokenEntrance, current : TokenEntrance) -> TokenRange:
383 if main.position.begin > current.position.begin:
384 if main.position.end > current.position.end:
385 if main.position.begin >= current.position.end:
386 return TokenRange.new(current.position.begin, current.position.end, RANGE_STATE.EXCLUDE_LEFT)
387 else:
388 return TokenRange.new(main.position.begin, current.position.end, RANGE_STATE.OVERLAY)
389 else:
390 return TokenRange.new(current.position.begin, current.position.end, RANGE_STATE.ENTERS)
391 elif main.position.begin < current.position.begin:
392 if main.position.end >= current.position.end:
393 return TokenRange.new(main.position.begin, main.position.end, RANGE_STATE.INCLUDE)
394 else:
395 if main.position.end < current.position.begin:
396 return TokenRange.new(main.position.begin, main.position.end, RANGE_STATE.EXCLUDE_RIGHT)
397 else:
398 return TokenRange.new(main.position.begin, current.position.end, RANGE_STATE.OVERLAY)
399 else:
400 if main.position.end == current.position.end:
401 return TokenRange.new(main.position.begin, main.position.end, RANGE_STATE.EQUAL)
402 elif main.position.end > current.position.end:
403 return TokenRange.new(main.position.begin, main.position.end, RANGE_STATE.INCLUDE)
404 else:
405 return TokenRange.new(current.position.begin, current.position.end, RANGE_STATE.ENTERS)
406
407 func tokenizer() -> TokenResult:
408 for k in TOKEN:
409 if !TOKEN[k].is_ignore():
410 TOKEN[k].find_all(document.text)
411 var second_tokens : Array = []
412 second_tokens.append(TOKEN[TOKEN_ID.MESSAGE])
413 second_tokens.append(TOKEN[TOKEN_ID.SIMPLE_DATA_TYPE])
414 second_tokens.append(TOKEN[TOKEN_ID.ENUM])
415 second_tokens.append(TOKEN[TOKEN_ID.MAP])
416 second_tokens.append(TOKEN[TOKEN_ID.ONEOF])
417 second_tokens.append(TOKEN[TOKEN_ID.LITERAL_BOOL])
418 second_tokens.append(TOKEN[TOKEN_ID.SYNTAX])
419 second_tokens.append(TOKEN[TOKEN_ID.IMPORT])
420 second_tokens.append(TOKEN[TOKEN_ID.PACKAGE])
421 second_tokens.append(TOKEN[TOKEN_ID.OPTION])
422 second_tokens.append(TOKEN[TOKEN_ID.SERVICE])
423 second_tokens.append(TOKEN[TOKEN_ID.RESERVED])
424 second_tokens.append(TOKEN[TOKEN_ID.IMPORT_QUALIFICATION])
425 second_tokens.append(TOKEN[TOKEN_ID.FIELD_QUALIFICATION])
426 second_tokens.append(TOKEN[TOKEN_ID.ENUM_OPTION])
427 second_tokens.append(TOKEN[TOKEN_ID.QUALIFICATION])
428 second_tokens.append(TOKEN[TOKEN_ID.FIELD_OPTION])
429
430 var ident_token : Token = TOKEN[TOKEN_ID.IDENT]
431 for sec_token in second_tokens:
432 var remove_indexes : Array = []
433 for i in range(ident_token.get_entrances().size()):
434 var entrance : TokenEntrance = sec_token.find(ident_token.get_entrances()[i].text, 0)
435 if entrance != null:
436 entrance.position.begin = ident_token.get_entrances()[i].position.begin
437 entrance.position.end = ident_token.get_entrances()[i].position.end
438 sec_token.add_entrance(entrance)
439 remove_indexes.append(i)
440 for i in range(remove_indexes.size()):
441 ident_token.remove_entrance(remove_indexes[i] - i)
442 for v in TOKEN[TOKEN_ID.STRING_DOUBLE].get_entrances():
443 v.id = TOKEN_ID.STRING
444 TOKEN[TOKEN_ID.STRING].add_entrance(v)
445 TOKEN[TOKEN_ID.STRING_DOUBLE].clear()
446 for v in TOKEN[TOKEN_ID.STRING_SINGLE].get_entrances():
447 v.id = TOKEN_ID.STRING
448 TOKEN[TOKEN_ID.STRING].add_entrance(v)
449 TOKEN[TOKEN_ID.STRING_SINGLE].clear()
450 var main_token : TokenEntrance
451 var cur_token : TokenEntrance
452 var main_index : int = -1
453 var token_index_flag : bool = false
454 var result : TokenResult = TokenResult.new()
455 var check : TokenRange
456 var end : bool = false
457 var all : bool = false
458 var repeat : bool = false
459 while true:
460 all = true
461 for k in TOKEN:
462 if main_index == k:
463 continue
464 repeat = false
465 while TOKEN[k].get_entrances().size() > 0:
466 all = false
467 if !token_index_flag:
468 main_index = k
469 main_token = TOKEN[main_index].get_entrances()[0]
470 token_index_flag = true
471 break
472 else:
473 cur_token = TOKEN[k].get_entrances()[0]
474 check = check_range(main_token, cur_token)
475 if check.state == RANGE_STATE.INCLUDE:
476 TOKEN[k].remove_entrance(0)
477 end = true
478 elif check.state == RANGE_STATE.EXCLUDE_LEFT:
479 main_token = cur_token
480 main_index = k
481 end = false
482 repeat = true
483 break
484 elif check.state == RANGE_STATE.EXCLUDE_RIGHT:
485 end = true
486 break
487 elif check.state == RANGE_STATE.OVERLAY || check.state == RANGE_STATE.EQUAL:
488 result.errors.append(check)
489 TOKEN[main_index].remove_entrance(0)
490 TOKEN[k].remove_entrance(0)
491 token_index_flag = false
492 end = false
493 repeat = true
494 break
495 elif check.state == RANGE_STATE.ENTERS:
496 TOKEN[main_index].remove_entrance(0)
497 main_token = cur_token
498 main_index = k
499 end = false
500 repeat = true
501 break
502 if repeat:
503 break
504 if end:
505 if TOKEN[main_index].get_entrances().size() > 0:
506 result.tokens.append(main_token)
507 TOKEN[main_index].remove_entrance(0)
508 token_index_flag = false
509 if all:
510 break
511 return result
512
513 static func check_tokens_integrity(tokens : Array, end : int) -> Array:
514 var cur_index : int = 0
515 var result : Array = []
516 for v in tokens:
517 if v.position.begin > cur_index:
518 result.append(TokenPosition.new(cur_index, v.position.begin))
519 cur_index = v.position.end + 1
520 if cur_index < end:
521 result.append(TokenPosition.new(cur_index, end))
522 return result
523
524 static func comment_space_processing(tokens : Array) -> void:
525 var remove_indexes : Array = []
526 for i in range(tokens.size()):
527 if tokens[i].id == TOKEN_ID.COMMENT_SINGLE || tokens[i].id == TOKEN_ID.COMMENT_MULTI:
528 tokens[i].id = TOKEN_ID.SPACE
529 var space_index : int = -1
530 for i in range(tokens.size()):
531 if tokens[i].id == TOKEN_ID.SPACE:
532 if space_index >= 0:
533 tokens[space_index].position.end = tokens[i].position.end
534 tokens[space_index].text = tokens[space_index].text + tokens[i].text
535 remove_indexes.append(i)
536 else:
537 space_index = i
538 else:
539 space_index = -1
540 for i in range(remove_indexes.size()):
541 tokens.remove_at(remove_indexes[i] - i)
542
543 #Analysis rule
544 enum AR {
545 MAYBE = 1,
546 MUST_ONE = 2,
547 ANY = 3,
548 OR = 4,
549 MAYBE_BEGIN = 5,
550 MAYBE_END = 6,
551 ANY_BEGIN = 7,
552 ANY_END = 8
553 }
554
555 #Space rule (space after token)
556 enum SP {
557 MAYBE = 1,
558 MUST = 2,
559 NO = 3
560 }
561
562 #Analysis Syntax Description
563 class ASD:
564 func _init(t, s : int = SP.MAYBE, r : int = AR.MUST_ONE, i : bool = false):
565 token = t
566 space = s
567 rule = r
568 importance = i
569 var token
570 var space : int
571 var rule : int
572 var importance : bool
573
574 var TEMPLATE_SYNTAX : Array = [
575 Callable(self, "desc_syntax"),
576 ASD.new(TOKEN_ID.SYNTAX),
577 ASD.new(TOKEN_ID.EUQAL),
578 ASD.new(TOKEN_ID.STRING, SP.MAYBE, AR.MUST_ONE, true),
579 ASD.new(TOKEN_ID.SEMICOLON)
580 ]
581
582 var TEMPLATE_IMPORT : Array = [
583 Callable(self, "desc_import"),
584 ASD.new(TOKEN_ID.IMPORT, SP.MUST),
585 ASD.new(TOKEN_ID.IMPORT_QUALIFICATION, SP.MUST, AR.MAYBE, true),
586 ASD.new(TOKEN_ID.STRING, SP.MAYBE, AR.MUST_ONE, true),
587 ASD.new(TOKEN_ID.SEMICOLON)
588 ]
589
590 var TEMPLATE_PACKAGE : Array = [
591 Callable(self, "desc_package"),
592 ASD.new(TOKEN_ID.PACKAGE, SP.MUST),
593 ASD.new([TOKEN_ID.IDENT, TOKEN_ID.FULL_IDENT], SP.MAYBE, AR.OR, true),
594 ASD.new(TOKEN_ID.SEMICOLON)
595 ]
596
597 var TEMPLATE_OPTION : Array = [
598 Callable(self, "desc_option"),
599 ASD.new(TOKEN_ID.OPTION, SP.MUST),
600 ASD.new([TOKEN_ID.IDENT, TOKEN_ID.FULL_IDENT], SP.MAYBE, AR.OR, true),
601 ASD.new(TOKEN_ID.EUQAL),
602 ASD.new([TOKEN_ID.STRING, TOKEN_ID.INT, TOKEN_ID.FLOAT, TOKEN_ID.LITERAL_BOOL], SP.MAYBE, AR.OR, true),
603 ASD.new(TOKEN_ID.SEMICOLON)
604 ]
605
606 var TEMPLATE_FIELD : Array = [
607 Callable(self, "desc_field"),
608 ASD.new(TOKEN_ID.FIELD_QUALIFICATION, SP.MUST, AR.MAYBE, true),
609 ASD.new([TOKEN_ID.SIMPLE_DATA_TYPE, TOKEN_ID.IDENT, TOKEN_ID.FULL_IDENT], SP.MAYBE, AR.OR, true),
610 ASD.new(TOKEN_ID.IDENT, SP.MAYBE, AR.MUST_ONE, true),
611 ASD.new(TOKEN_ID.EUQAL),
612 ASD.new(TOKEN_ID.INT, SP.MAYBE, AR.MUST_ONE, true),
613 ASD.new(TOKEN_ID.BRACKET_SQUARE_LEFT, SP.MAYBE, AR.MAYBE_BEGIN),
614 ASD.new(TOKEN_ID.FIELD_OPTION, SP.MAYBE, AR.MUST_ONE, true),
615 ASD.new(TOKEN_ID.EUQAL),
616 ASD.new(TOKEN_ID.LITERAL_BOOL, SP.MAYBE, AR.MUST_ONE, true),
617 ASD.new(TOKEN_ID.BRACKET_SQUARE_RIGHT, SP.MAYBE, AR.MAYBE_END),
618 ASD.new(TOKEN_ID.SEMICOLON)
619 ]
620
621 var TEMPLATE_FIELD_ONEOF : Array = TEMPLATE_FIELD
622
623 var TEMPLATE_MAP_FIELD : Array = [
624 Callable(self, "desc_map_field"),
625 ASD.new(TOKEN_ID.MAP),
626 ASD.new(TOKEN_ID.BRACKET_ANGLE_LEFT),
627 ASD.new(TOKEN_ID.SIMPLE_DATA_TYPE, SP.MAYBE, AR.MUST_ONE, true),
628 ASD.new(TOKEN_ID.COMMA),
629 ASD.new([TOKEN_ID.SIMPLE_DATA_TYPE, TOKEN_ID.IDENT, TOKEN_ID.FULL_IDENT], SP.MAYBE, AR.OR, true),
630 ASD.new(TOKEN_ID.BRACKET_ANGLE_RIGHT, SP.MUST),
631 ASD.new(TOKEN_ID.IDENT, SP.MAYBE, AR.MUST_ONE, true),
632 ASD.new(TOKEN_ID.EUQAL),
633 ASD.new(TOKEN_ID.INT, SP.MAYBE, AR.MUST_ONE, true),
634 ASD.new(TOKEN_ID.BRACKET_SQUARE_LEFT, SP.MAYBE, AR.MAYBE_BEGIN),
635 ASD.new(TOKEN_ID.FIELD_OPTION, SP.MAYBE, AR.MUST_ONE, true),
636 ASD.new(TOKEN_ID.EUQAL),
637 ASD.new(TOKEN_ID.LITERAL_BOOL, SP.MAYBE, AR.MUST_ONE, true),
638 ASD.new(TOKEN_ID.BRACKET_SQUARE_RIGHT, SP.MAYBE, AR.MAYBE_END),
639 ASD.new(TOKEN_ID.SEMICOLON)
640 ]
641
642 var TEMPLATE_MAP_FIELD_ONEOF : Array = TEMPLATE_MAP_FIELD
643
644 var TEMPLATE_ENUM : Array = [
645 Callable(self, "desc_enum"),
646 ASD.new(TOKEN_ID.ENUM, SP.MUST),
647 ASD.new(TOKEN_ID.IDENT, SP.MAYBE, AR.MUST_ONE, true),
648 ASD.new(TOKEN_ID.BRACKET_CURLY_LEFT),
649 ASD.new(TOKEN_ID.OPTION, SP.MUST, AR.MAYBE_BEGIN),
650 ASD.new(TOKEN_ID.ENUM_OPTION, SP.MAYBE, AR.MUST_ONE, true),
651 ASD.new(TOKEN_ID.EUQAL),
652 ASD.new(TOKEN_ID.LITERAL_BOOL, SP.MAYBE, AR.MUST_ONE, true),
653 ASD.new(TOKEN_ID.SEMICOLON, SP.MAYBE, AR.MAYBE_END),
654 ASD.new(TOKEN_ID.IDENT, SP.MAYBE, AR.ANY_BEGIN, true),
655 ASD.new(TOKEN_ID.EUQAL),
656 ASD.new(TOKEN_ID.INT, SP.MAYBE, AR.MUST_ONE, true),
657 ASD.new(TOKEN_ID.SEMICOLON, SP.MAYBE, AR.ANY_END),
658 ASD.new(TOKEN_ID.BRACKET_CURLY_RIGHT)
659 ]
660
661 var TEMPLATE_MESSAGE_HEAD : Array = [
662 Callable(self, "desc_message_head"),
663 ASD.new(TOKEN_ID.MESSAGE, SP.MUST),
664 ASD.new(TOKEN_ID.IDENT, SP.MAYBE, AR.MUST_ONE, true),
665 ASD.new(TOKEN_ID.BRACKET_CURLY_LEFT)
666 ]
667
668 var TEMPLATE_MESSAGE_TAIL : Array = [
669 Callable(self, "desc_message_tail"),
670 ASD.new(TOKEN_ID.BRACKET_CURLY_RIGHT)
671 ]
672
673 var TEMPLATE_ONEOF_HEAD : Array = [
674 Callable(self, "desc_oneof_head"),
675 ASD.new(TOKEN_ID.ONEOF, SP.MUST),
676 ASD.new(TOKEN_ID.IDENT, SP.MAYBE, AR.MUST_ONE, true),
677 ASD.new(TOKEN_ID.BRACKET_CURLY_LEFT),
678 ]
679
680 var TEMPLATE_ONEOF_TAIL : Array = [
681 Callable(self, "desc_oneof_tail"),
682 ASD.new(TOKEN_ID.BRACKET_CURLY_RIGHT)
683 ]
684
685 var TEMPLATE_BEGIN : Array = [
686 null,
687 ASD.new(TOKEN_ID.SPACE, SP.NO, AR.MAYBE)
688 ]
689
690 var TEMPLATE_END : Array = [
691 null
692 ]
693
694 func get_token_id(tokens : Array, index : int) -> int:
695 if index < tokens.size():
696 return tokens[index].id
697 return TOKEN_ID.UNDEFINED
698
699 enum COMPARE_STATE {
700 DONE = 0,
701 MISMATCH = 1,
702 INCOMPLETE = 2,
703 ERROR_VALUE = 3
704 }
705
706 class TokenCompare:
707 func _init(s : int, i : int, d : String = ""):
708 state = s
709 index = i
710 description = d
711 var state : int
712 var index : int
713 var description : String
714
715 func check_space(tokens : Array, index : int, space) -> int:
716 if get_token_id(tokens, index) == TOKEN_ID.SPACE:
717 if space == SP.MAYBE:
718 return 1
719 elif space == SP.MUST:
720 return 1
721 elif space == SP.NO:
722 return -1
723 else:
724 if space == SP.MUST:
725 return -2
726 return 0
727
728 class IndexedToken:
729 func _init(t : TokenEntrance, i : int):
730 token = t
731 index = i
732 var token : TokenEntrance
733 var index : int
734
735 func token_importance_checkadd(template : ASD, token : TokenEntrance, index : int, importance : Array) -> void:
736 if template.importance:
737 importance.append(IndexedToken.new(token, index))
738
739 class CompareSettings:
740 func _init(ci : int, n : int, pi : int, pn : String = ""):
741 construction_index = ci
742 nesting = n
743 parent_index = pi
744 parent_name = pn
745
746 var construction_index : int
747 var nesting : int
748 var parent_index : int
749 var parent_name : String
750
751 func description_compare(template : Array, tokens : Array, index : int, settings : CompareSettings) -> TokenCompare:
752 var j : int = index
753 var space : int
754 var rule : int
755 var rule_flag : bool
756 var cont : bool
757 var check : int
758 var maybe_group_skip : bool = false
759 var any_group_index : int = -1
760 var any_end_group_index : int = -1
761 var i : int = 0
762 var importance : Array = []
763 while true:
764 i += 1
765 if i >= template.size():
766 break
767 rule_flag = false
768 cont = false
769 rule = template[i].rule
770 space = template[i].space
771 if rule == AR.MAYBE_END && maybe_group_skip:
772 maybe_group_skip = false
773 continue
774 if maybe_group_skip:
775 continue
776 if rule == AR.MAYBE:
777 if template[i].token == get_token_id(tokens, j):
778 token_importance_checkadd(template[i], tokens[j], j, importance)
779 rule_flag = true
780 else:
781 continue
782 elif rule == AR.MUST_ONE || rule == AR.MAYBE_END || rule == AR.ANY_END:
783 if template[i].token == get_token_id(tokens, j):
784 token_importance_checkadd(template[i], tokens[j], j, importance)
785 rule_flag = true
786 elif rule == AR.ANY:
787 var find_any : bool = false
788 while true:
789 if template[i].token == get_token_id(tokens, j):
790 token_importance_checkadd(template[i], tokens[j], j, importance)
791 find_any = true
792 j += 1
793 check = check_space(tokens, j, space)
794 if check < 0:
795 return TokenCompare.new(COMPARE_STATE.INCOMPLETE, j)
796 else:
797 j += check
798 else:
799 if find_any:
800 cont = true
801 break
802 elif rule == AR.OR:
803 var or_tokens = template[i].token
804 for v in or_tokens:
805 if v == get_token_id(tokens, j):
806 token_importance_checkadd(template[i], tokens[j], j, importance)
807 j += 1
808 check = check_space(tokens, j, space)
809 if check < 0:
810 return TokenCompare.new(COMPARE_STATE.INCOMPLETE, j)
811 else:
812 j += check
813 cont = true
814 break
815 elif rule == AR.MAYBE_BEGIN:
816 if template[i].token == get_token_id(tokens, j):
817 token_importance_checkadd(template[i], tokens[j], j, importance)
818 rule_flag = true
819 else:
820 maybe_group_skip = true
821 continue
822 elif rule == AR.ANY_BEGIN:
823 if template[i].token == get_token_id(tokens, j):
824 token_importance_checkadd(template[i], tokens[j], j, importance)
825 rule_flag = true
826 any_group_index = i
827 else:
828 if any_end_group_index > 0:
829 any_group_index = -1
830 i = any_end_group_index
831 any_end_group_index = -1
832 continue
833 if cont:
834 continue
835 if rule_flag:
836 j += 1
837 check = check_space(tokens, j, space)
838 if check < 0:
839 return TokenCompare.new(COMPARE_STATE.INCOMPLETE, j)
840 else:
841 j += check
842 else:
843 if j > index:
844 return TokenCompare.new(COMPARE_STATE.INCOMPLETE, j)
845 else:
846 return TokenCompare.new(COMPARE_STATE.MISMATCH, j)
847 if any_group_index >= 0 && rule == AR.ANY_END:
848 any_end_group_index = i
849 i = any_group_index - 1
850 if template[0] != null:
851 var result : DescriptionResult = template[0].call(importance, settings)
852 if !result.success:
853 return TokenCompare.new(COMPARE_STATE.ERROR_VALUE, result.error, result.description)
854 return TokenCompare.new(COMPARE_STATE.DONE, j)
855
856 var DESCRIPTION : Array = [
857 TEMPLATE_BEGIN, #0
858 TEMPLATE_SYNTAX, #1
859 TEMPLATE_IMPORT, #2
860 TEMPLATE_PACKAGE, #3
861 TEMPLATE_OPTION, #4
862 TEMPLATE_FIELD, #5
863 TEMPLATE_FIELD_ONEOF, #6
864 TEMPLATE_MAP_FIELD, #7
865 TEMPLATE_MAP_FIELD_ONEOF, #8
866 TEMPLATE_ENUM, #9
867 TEMPLATE_MESSAGE_HEAD, #10
868 TEMPLATE_MESSAGE_TAIL, #11
869 TEMPLATE_ONEOF_HEAD, #12
870 TEMPLATE_ONEOF_TAIL, #13
871 TEMPLATE_END #14
872 ]
873
874 enum JUMP {
875 NOTHING = 0, #nothing
876 SIMPLE = 1, #simple jump
877 NESTED_INCREMENT = 2, #nested increment
878 NESTED_DECREMENT = 3, #nested decrement
879 MUST_NESTED_SIMPLE = 4, #check: must be nested > 0
880 MUST_NESTED_INCREMENT = 5, #check: must be nested > 0, then nested increment
881 MUST_NESTED_DECREMENT = 6, #nested decrement, then check: must be nested > 0
882 }
883
884 var TRANSLATION_TABLE : Array = [
885 # BEGIN SYNTAX IMPORT PACKAGE OPTION FIELD FIELD_O MAP_F MAP_F_O ENUM MES_H MES_T ONEOF_H ONEOF_T END
886 [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #BEGIN
887 [ 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1], #SYNTAX
888 [ 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1], #IMPORT
889 [ 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1], #PACKAGE
890 [ 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1], #OPTION
891 [ 0, 0, 0, 0, 0, 4, 0, 4, 0, 1, 2, 3, 5, 0, 0], #FIELD
892 [ 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 6, 0], #FIELD_ONEOF
893 [ 0, 0, 0, 0, 0, 4, 0, 4, 0, 1, 2, 3, 5, 0, 0], #MAP_F
894 [ 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 6, 0], #MAP_F_ONEOF
895 [ 0, 0, 0, 0, 0, 4, 0, 4, 0, 1, 2, 3, 5, 0, 1], #ENUM
896 [ 0, 0, 0, 0, 0, 4, 0, 4, 0, 1, 2, 3, 5, 0, 0], #MES_H
897 [ 0, 0, 0, 0, 0, 4, 0, 4, 0, 1, 2, 3, 5, 0, 1], #MES_T
898 [ 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0], #ONEOF_H
899 [ 0, 0, 0, 0, 0, 4, 0, 4, 0, 1, 2, 3, 5, 0, 1], #ONEOF_T
900 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] #END
901 ]
902
903 class Construction:
904 func _init(b : int, e : int, d : int):
905 begin_token_index = b
906 end_token_index = e
907 description = d
908 var begin_token_index : int
909 var end_token_index : int
910 var description : int
911
912 class TranslationResult:
913 var constructions : Array = []
914 var done : bool = false
915 var error_description_id : int = -1
916 var error_description_text : String = ""
917 var parse_token_index : int = 0
918 var error_token_index : int = 0
919
920 func analyze_tokens(tokens : Array) -> TranslationResult:
921 var i : int = 0
922 var result : TranslationResult = TranslationResult.new()
923 var comp : TokenCompare
924 var cur_template_id : int = 0
925 var error : bool = false
926 var template_index : int
927 var comp_set : CompareSettings = CompareSettings.new(result.constructions.size(), 0, -1)
928 comp = description_compare(DESCRIPTION[cur_template_id], tokens, i, comp_set)
929 if comp.state == COMPARE_STATE.DONE:
930 i = comp.index
931 while true:
932 var end : bool = true
933 var find : bool = false
934 for j in range(TRANSLATION_TABLE[cur_template_id].size()):
935 template_index = j
936 if j == DESCRIPTION.size() - 1 && i < tokens.size():
937 end = false
938 if result.error_description_id < 0:
939 error = true
940 break
941 if TRANSLATION_TABLE[cur_template_id][j] > 0:
942 end = false
943 comp_set.construction_index = result.constructions.size()
944 comp = description_compare(DESCRIPTION[j], tokens, i, comp_set)
945 if comp.state == COMPARE_STATE.DONE:
946 if TRANSLATION_TABLE[cur_template_id][j] == JUMP.NESTED_INCREMENT:
947 comp_set.nesting += 1
948 elif TRANSLATION_TABLE[cur_template_id][j] == JUMP.NESTED_DECREMENT:
949 comp_set.nesting -= 1
950 if comp_set.nesting < 0:
951 error = true
952 break
953 elif TRANSLATION_TABLE[cur_template_id][j] == JUMP.MUST_NESTED_SIMPLE:
954 if comp_set.nesting <= 0:
955 error = true
956 break
957 elif TRANSLATION_TABLE[cur_template_id][j] == JUMP.MUST_NESTED_INCREMENT:
958 if comp_set.nesting <= 0:
959 error = true
960 break
961 comp_set.nesting += 1
962 elif TRANSLATION_TABLE[cur_template_id][j] == JUMP.MUST_NESTED_DECREMENT:
963 comp_set.nesting -= 1
964 if comp_set.nesting <= 0:
965 error = true
966 break
967 result.constructions.append(Construction.new(i, comp.index, j))
968 find = true
969 i = comp.index
970 cur_template_id = j
971 if i == tokens.size():
972 if TRANSLATION_TABLE[cur_template_id][DESCRIPTION.size() - 1] == JUMP.SIMPLE:
973 if comp_set.nesting == 0:
974 end = true
975 else:
976 error = true
977 else:
978 error = true
979 elif i > tokens.size():
980 error = true
981 break
982 elif comp.state == COMPARE_STATE.INCOMPLETE:
983 error = true
984 break
985 elif comp.state == COMPARE_STATE.ERROR_VALUE:
986 error = true
987 break
988 if error:
989 result.error_description_text = comp.description
990 result.error_description_id = template_index
991 result.parse_token_index = i
992 if comp.index >= tokens.size():
993 result.error_token_index = tokens.size() - 1
994 else:
995 result.error_token_index = comp.index
996 if end:
997 result.done = true
998 result.error_description_id = -1
999 break
1000 if !find:
1001 break
1002 return result
1003
1004 enum CLASS_TYPE {
1005 ENUM = 0,
1006 MESSAGE = 1,
1007 MAP = 2
1008 }
1009
1010 enum FIELD_TYPE {
1011 UNDEFINED = -1,
1012 INT32 = 0,
1013 SINT32 = 1,
1014 UINT32 = 2,
1015 INT64 = 3,
1016 SINT64 = 4,
1017 UINT64 = 5,
1018 BOOL = 6,
1019 ENUM = 7,
1020 FIXED32 = 8,
1021 SFIXED32 = 9,
1022 FLOAT = 10,
1023 FIXED64 = 11,
1024 SFIXED64 = 12,
1025 DOUBLE = 13,
1026 STRING = 14,
1027 BYTES = 15,
1028 MESSAGE = 16,
1029 MAP = 17
1030 }
1031
1032 enum FIELD_QUALIFICATOR {
1033 OPTIONAL = 0,
1034 REQUIRED = 1,
1035 REPEATED = 2,
1036 RESERVED = 3
1037 }
1038
1039 enum FIELD_OPTION {
1040 PACKED = 0,
1041 NOT_PACKED = 1
1042 }
1043
1044 class ASTClass:
1045 func _init(n : String, t : int, p : int, pn : String, o : String, ci : int):
1046 name = n
1047 type = t
1048 parent_index = p
1049 parent_name = pn
1050 option = o
1051 construction_index = ci
1052 values = []
1053
1054 var name : String
1055 var type : int
1056 var parent_index : int
1057 var parent_name : String
1058 var option : String
1059 var construction_index
1060 var values : Array
1061
1062 func copy() -> ASTClass:
1063 var res : ASTClass = ASTClass.new(name, type, parent_index, parent_name, option, construction_index)
1064 for v in values:
1065 res.values.append(v.copy())
1066 return res
1067
1068 class ASTEnumValue:
1069 func _init(n : String, v : String):
1070 name = n
1071 value = v
1072
1073 var name : String
1074 var value : String
1075
1076 func copy() -> ASTEnumValue:
1077 return ASTEnumValue.new(name, value)
1078
1079 class ASTField:
1080 func _init(t, n : String, tn : String, p : int, q : int, o : int, ci : int, mf : bool):
1081 tag = t
1082 name = n
1083 type_name = tn
1084 parent_class_id = p
1085 qualificator = q
1086 option = o
1087 construction_index = ci
1088 is_map_field = mf
1089
1090 var tag
1091 var name : String
1092 var type_name : String
1093 var parent_class_id : int
1094 var qualificator : int
1095 var option : int
1096 var construction_index : int
1097 var is_map_field : bool
1098 var field_type : int = FIELD_TYPE.UNDEFINED
1099 var type_class_id : int = -1
1100
1101 func copy() -> ASTField:
1102 var res : ASTField = ASTField.new(tag, name, type_name, parent_class_id, qualificator, option, construction_index, is_map_field)
1103 res.field_type = field_type
1104 res.type_class_id = type_class_id
1105 return res
1106
1107 enum AST_GROUP_RULE {
1108 ONEOF = 0,
1109 ALL = 1
1110 }
1111
1112 class ASTFieldGroup:
1113 func _init(n : String, pi : int, r : int):
1114 name = n
1115 parent_class_id = pi
1116 rule = r
1117 opened = true
1118
1119 var name : String
1120 var parent_class_id : int
1121 var rule : int
1122 var field_indexes : Array = []
1123 var opened : bool
1124
1125 func copy() -> ASTFieldGroup:
1126 var res : ASTFieldGroup = ASTFieldGroup.new(name, parent_class_id, rule)
1127 res.opened = opened
1128 for fi in field_indexes:
1129 res.field_indexes.append(fi)
1130 return res
1131
1132 class ASTImport:
1133 func _init(a_path : String, a_public : bool, sha : String):
1134 path = a_path
1135 public = a_public
1136 sha256 = sha
1137
1138 var path : String
1139 var public : bool
1140 var sha256 : String
1141
1142 var class_table : Array = []
1143 var field_table : Array = []
1144 var group_table : Array = []
1145 var import_table : Array = []
1146 var proto_version : int = 0
1147
1148 class DescriptionResult:
1149 func _init(s : bool = true, e = null, d : String = ""):
1150 success = s
1151 error = e
1152 description = d
1153 var success : bool
1154 var error
1155 var description : String
1156
1157 static func get_text_from_token(string_token : TokenEntrance) -> String:
1158 return string_token.text.substr(1, string_token.text.length() - 2)
1159
1160 func desc_syntax(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1161 var result : DescriptionResult = DescriptionResult.new()
1162 var s : String = get_text_from_token(indexed_tokens[0].token)
1163 if s == "proto2":
1164 proto_version = 2
1165 elif s == "proto3":
1166 proto_version = 3
1167 else:
1168 result.success = false
1169 result.error = indexed_tokens[0].index
1170 result.description = "Unspecified version of the protocol. Use \"proto2\" or \"proto3\" syntax string."
1171 return result
1172
1173 func desc_import(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1174 var result : DescriptionResult = DescriptionResult.new()
1175 var offset : int = 0
1176 var public : bool = false
1177 if indexed_tokens[offset].token.id == TOKEN_ID.IMPORT_QUALIFICATION:
1178 if indexed_tokens[offset].token.text == "public":
1179 public = true
1180 offset += 1
1181 var f_name : String = path_dir + get_text_from_token(indexed_tokens[offset].token)
1182 var sha : String = FileAccess.get_sha256(f_name)
1183 if FileAccess.file_exists(f_name):
1184 for i in import_table:
1185 if i.path == f_name:
1186 result.success = false
1187 result.error = indexed_tokens[offset].index
1188 result.description = "File '" + f_name + "' already imported."
1189 return result
1190 if i.sha256 == sha:
1191 result.success = false
1192 result.error = indexed_tokens[offset].index
1193 result.description = "File '" + f_name + "' with matching SHA256 already imported."
1194 return result
1195 import_table.append(ASTImport.new(f_name, public, sha))
1196 else:
1197 result.success = false
1198 result.error = indexed_tokens[offset].index
1199 result.description = "Import file '" + f_name + "' not found."
1200 return result
1201
1202 func desc_package(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1203 printerr("UNRELEASED desc_package: ", indexed_tokens.size(), ", nesting: ", settings.nesting)
1204 var result : DescriptionResult = DescriptionResult.new()
1205 return result
1206
1207 func desc_option(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1208 printerr("UNRELEASED desc_option: ", indexed_tokens.size(), ", nesting: ", settings.nesting)
1209 var result : DescriptionResult = DescriptionResult.new()
1210 return result
1211
1212 func desc_field(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1213 var result : DescriptionResult = DescriptionResult.new()
1214 var qualifcator : int = FIELD_QUALIFICATOR.OPTIONAL
1215 var option : int
1216 var offset : int = 0
1217
1218 if proto_version == 3:
1219 option = FIELD_OPTION.PACKED
1220 if indexed_tokens[offset].token.id == TOKEN_ID.FIELD_QUALIFICATION:
1221 if indexed_tokens[offset].token.text == "repeated":
1222 qualifcator = FIELD_QUALIFICATOR.REPEATED
1223 elif indexed_tokens[offset].token.text == "required" || indexed_tokens[offset].token.text == "optional":
1224 result.success = false
1225 result.error = indexed_tokens[offset].index
1226 result.description = "Using the 'required' or 'optional' qualificator is unacceptable in Protobuf v3."
1227 return result
1228 offset += 1
1229 if proto_version == 2:
1230 option = FIELD_OPTION.NOT_PACKED
1231 if !(group_table.size() > 0 && group_table[group_table.size() - 1].opened):
1232 if indexed_tokens[offset].token.id == TOKEN_ID.FIELD_QUALIFICATION:
1233 if indexed_tokens[offset].token.text == "repeated":
1234 qualifcator = FIELD_QUALIFICATOR.REPEATED
1235 elif indexed_tokens[offset].token.text == "required":
1236 qualifcator = FIELD_QUALIFICATOR.REQUIRED
1237 elif indexed_tokens[offset].token.text == "optional":
1238 qualifcator = FIELD_QUALIFICATOR.OPTIONAL
1239 offset += 1
1240 else:
1241 if class_table[settings.parent_index].type == CLASS_TYPE.MESSAGE:
1242 result.success = false
1243 result.error = indexed_tokens[offset].index
1244 result.description = "Using the 'required', 'optional' or 'repeated' qualificator necessarily in Protobuf v2."
1245 return result
1246 var type_name : String = indexed_tokens[offset].token.text; offset += 1
1247 var field_name : String = indexed_tokens[offset].token.text; offset += 1
1248 var tag : String = indexed_tokens[offset].token.text; offset += 1
1249
1250 if indexed_tokens.size() == offset + 2:
1251 if indexed_tokens[offset].token.text == "packed":
1252 offset += 1
1253 if indexed_tokens[offset].token.text == "true":
1254 option = FIELD_OPTION.PACKED
1255 else:
1256 option = FIELD_OPTION.NOT_PACKED
1257 else:
1258 result.success = false
1259 result.error = indexed_tokens[offset].index
1260 result.description = "Undefined field option."
1261 return result
1262
1263 if group_table.size() > 0:
1264 if group_table[group_table.size() - 1].opened:
1265 if indexed_tokens[0].token.id == TOKEN_ID.FIELD_QUALIFICATION:
1266 result.success = false
1267 result.error = indexed_tokens[0].index
1268 result.description = "Using the 'required', 'optional' or 'repeated' qualificator is unacceptable in 'OneOf' field."
1269 return result
1270 group_table[group_table.size() - 1].field_indexes.append(field_table.size())
1271 field_table.append(ASTField.new(tag, field_name, type_name, settings.parent_index, qualifcator, option, settings.construction_index, false))
1272 return result
1273
1274 func desc_map_field(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1275 var result : DescriptionResult = DescriptionResult.new()
1276 var qualifcator : int = FIELD_QUALIFICATOR.REPEATED
1277 var option : int
1278 var offset : int = 0
1279
1280 if proto_version == 3:
1281 option = FIELD_OPTION.PACKED
1282 if proto_version == 2:
1283 option = FIELD_OPTION.NOT_PACKED
1284
1285 var key_type_name : String = indexed_tokens[offset].token.text; offset += 1
1286 if key_type_name == "float" || key_type_name == "double" || key_type_name == "bytes":
1287 result.success = false
1288 result.error = indexed_tokens[offset - 1].index
1289 result.description = "Map 'key_type' can't be floating point types and bytes."
1290 var type_name : String = indexed_tokens[offset].token.text; offset += 1
1291 var field_name : String = indexed_tokens[offset].token.text; offset += 1
1292 var tag : String = indexed_tokens[offset].token.text; offset += 1
1293
1294 if indexed_tokens.size() == offset + 2:
1295 if indexed_tokens[offset].token.text == "packed":
1296 offset += 1
1297 if indexed_tokens[offset] == "true":
1298 option = FIELD_OPTION.PACKED
1299 else:
1300 option = FIELD_OPTION.NOT_PACKED
1301 else:
1302 result.success = false
1303 result.error = indexed_tokens[offset].index
1304 result.description = "Undefined field option."
1305
1306 if group_table.size() > 0:
1307 if group_table[group_table.size() - 1].opened:
1308 group_table[group_table.size() - 1].field_indexes.append(field_table.size())
1309
1310 class_table.append(ASTClass.new("map_type_" + field_name, CLASS_TYPE.MAP, settings.parent_index, settings.parent_name, "", settings.construction_index))
1311 field_table.append(ASTField.new(tag, field_name, "map_type_" + field_name, settings.parent_index, qualifcator, option, settings.construction_index, false))
1312
1313 field_table.append(ASTField.new(1, "key", key_type_name, class_table.size() - 1, FIELD_QUALIFICATOR.OPTIONAL, option, settings.construction_index, true))
1314 field_table.append(ASTField.new(2, "value", type_name, class_table.size() - 1, FIELD_QUALIFICATOR.OPTIONAL, option, settings.construction_index, true))
1315
1316 return result
1317
1318 func desc_enum(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1319 var result : DescriptionResult = DescriptionResult.new()
1320 var option : String = ""
1321 var offset : int = 0
1322 var type_name : String = indexed_tokens[offset].token.text; offset += 1
1323 if indexed_tokens[offset].token.id == TOKEN_ID.ENUM_OPTION:
1324 if indexed_tokens[offset].token.text == "allow_alias" && indexed_tokens[offset + 1].token.text == "true":
1325 option = "allow_alias"
1326 offset += 2
1327 var value : ASTEnumValue
1328 var enum_class : ASTClass = ASTClass.new(type_name, CLASS_TYPE.ENUM, settings.parent_index, settings.parent_name, option, settings.construction_index)
1329 var first_value : bool = true
1330 while offset < indexed_tokens.size():
1331 if first_value:
1332 if indexed_tokens[offset + 1].token.text != "0":
1333 result.success = false
1334 result.error = indexed_tokens[offset + 1].index
1335 result.description = "For Enums, the default value is the first defined enum value, which must be 0."
1336 break
1337 first_value = false
1338 #if indexed_tokens[offset + 1].token.text[0] == "+" || indexed_tokens[offset + 1].token.text[0] == "-":
1339 # result.success = false
1340 # result.error = indexed_tokens[offset + 1].index
1341 # result.description = "For Enums, signed values are not allowed."
1342 # break
1343 value = ASTEnumValue.new(indexed_tokens[offset].token.text, indexed_tokens[offset + 1].token.text)
1344 enum_class.values.append(value)
1345 offset += 2
1346
1347 class_table.append(enum_class)
1348 return result
1349
1350 func desc_message_head(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1351 var result : DescriptionResult = DescriptionResult.new()
1352 class_table.append(ASTClass.new(indexed_tokens[0].token.text, CLASS_TYPE.MESSAGE, settings.parent_index, settings.parent_name, "", settings.construction_index))
1353 settings.parent_index = class_table.size() - 1
1354 settings.parent_name = settings.parent_name + "." + indexed_tokens[0].token.text
1355 return result
1356
1357 func desc_message_tail(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1358 settings.parent_index = class_table[settings.parent_index].parent_index
1359 settings.parent_name = class_table[settings.parent_index + 1].parent_name
1360 var result : DescriptionResult = DescriptionResult.new()
1361 return result
1362
1363 func desc_oneof_head(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1364 var result : DescriptionResult = DescriptionResult.new()
1365 for g in group_table:
1366 if g.parent_class_id == settings.parent_index && g.name == indexed_tokens[0].token.text:
1367 result.success = false
1368 result.error = indexed_tokens[0].index
1369 result.description = "OneOf name must be unique."
1370 return result
1371 group_table.append(ASTFieldGroup.new(indexed_tokens[0].token.text, settings.parent_index, AST_GROUP_RULE.ONEOF))
1372 return result
1373
1374 func desc_oneof_tail(indexed_tokens : Array, settings : CompareSettings) -> DescriptionResult:
1375 group_table[group_table.size() - 1].opened = false
1376 var result : DescriptionResult = DescriptionResult.new()
1377 return result
1378
1379 func analyze() -> AnalyzeResult:
1380 var analyze_result : AnalyzeResult = AnalyzeResult.new()
1381 analyze_result.doc = document
1382 analyze_result.classes = class_table
1383 analyze_result.fields = field_table
1384 analyze_result.groups = group_table
1385 analyze_result.state = false
1386 var result : TokenResult = tokenizer()
1387 if result.errors.size() > 0:
1388 for v in result.errors:
1389 var spos : Helper.StringPosition = Helper.str_pos(document.text, v.position)
1390 var err_text : String = "Unexpected token intersection " + "'" + document.text.substr(v.position.begin, spos.length) + "'"
1391 printerr(Helper.error_string(document.name, spos.str_num, spos.column, err_text))
1392 else:
1393 var integrity = check_tokens_integrity(result.tokens, document.text.length() - 1)
1394 if integrity.size() > 0:
1395 for v in integrity:
1396 var spos: Helper.StringPosition = Helper.str_pos(document.text, TokenPosition.new(v.begin, v.end))
1397 var err_text : String = "Unexpected token " + "'" + document.text.substr(v.begin, spos.length) + "'"
1398 printerr(Helper.error_string(document.name, spos.str_num, spos.column, err_text))
1399 else:
1400 analyze_result.tokens = result.tokens
1401 comment_space_processing(result.tokens)
1402 var syntax : TranslationResult = analyze_tokens(result.tokens)
1403 if !syntax.done:
1404 var pos_main : TokenPosition = Helper.text_pos(result.tokens, syntax.parse_token_index)
1405 var pos_inner : TokenPosition = Helper.text_pos(result.tokens, syntax.error_token_index)
1406 var spos_main : Helper.StringPosition = Helper.str_pos(document.text, pos_main)
1407 var spos_inner : Helper.StringPosition = Helper.str_pos(document.text, pos_inner)
1408 var err_text : String = "Syntax error in construction '" + result.tokens[syntax.parse_token_index].text + "'. "
1409 err_text += "Unacceptable use '" + result.tokens[syntax.error_token_index].text + "' at:" + str(spos_inner.str_num) + ":" + str(spos_inner.column)
1410 err_text += "\n" + syntax.error_description_text
1411 printerr(Helper.error_string(document.name, spos_main.str_num, spos_main.column, err_text))
1412 else:
1413 analyze_result.version = proto_version
1414 analyze_result.imports = import_table
1415 analyze_result.syntax = syntax
1416 analyze_result.state = true
1417 return analyze_result
1418
1419class Semantic:
1420
1421 var class_table : Array
1422 var field_table : Array
1423 var group_table : Array
1424 var syntax : Analysis.TranslationResult
1425 var tokens : Array
1426 var document : Document
1427
1428 func _init(analyze_result : AnalyzeResult):
1429 class_table = analyze_result.classes
1430 field_table = analyze_result.fields
1431 group_table = analyze_result.groups
1432 syntax = analyze_result.syntax
1433 tokens = analyze_result.tokens
1434 document = analyze_result.doc
1435
1436
1437 enum CHECK_SUBJECT {
1438 CLASS_NAME = 0,
1439 FIELD_NAME = 1,
1440 FIELD_TAG_NUMBER = 2,
1441 FIELD_TYPE = 3
1442 }
1443
1444 var STRING_FIELD_TYPE = {
1445 "int32": Analysis.FIELD_TYPE.INT32,
1446 "sint32": Analysis.FIELD_TYPE.SINT32,
1447 "uint32": Analysis.FIELD_TYPE.UINT32,
1448 "int64": Analysis.FIELD_TYPE.INT64,
1449 "sint64": Analysis.FIELD_TYPE.SINT64,
1450 "uint64": Analysis.FIELD_TYPE.UINT64,
1451 "bool": Analysis.FIELD_TYPE.BOOL,
1452 "fixed32": Analysis.FIELD_TYPE.FIXED32,
1453 "sfixed32": Analysis.FIELD_TYPE.SFIXED32,
1454 "float": Analysis.FIELD_TYPE.FLOAT,
1455 "fixed64": Analysis.FIELD_TYPE.FIXED64,
1456 "sfixed64": Analysis.FIELD_TYPE.SFIXED64,
1457 "double": Analysis.FIELD_TYPE.DOUBLE,
1458 "string": Analysis.FIELD_TYPE.STRING,
1459 "bytes": Analysis.FIELD_TYPE.BYTES,
1460 "map": Analysis.FIELD_TYPE.MAP
1461 }
1462
1463 class CheckResult:
1464 func _init(mci : int, aci : int, ti : int, s : int):
1465 main_construction_index = mci
1466 associated_construction_index = aci
1467 table_index = ti
1468 subject = s
1469
1470 var main_construction_index: int = -1
1471 var associated_construction_index: int = -1
1472 var table_index: int = -1
1473 var subject : int
1474
1475 func check_class_names() -> Array:
1476 var result : Array = []
1477 for i in range(class_table.size()):
1478 var the_class_name : String = class_table[i].parent_name + "." + class_table[i].name
1479 for j in range(i + 1, class_table.size(), 1):
1480 var inner_name : String = class_table[j].parent_name + "." + class_table[j].name
1481 if inner_name == the_class_name:
1482 var check : CheckResult = CheckResult.new(class_table[j].construction_index, class_table[i].construction_index, j, CHECK_SUBJECT.CLASS_NAME)
1483 result.append(check)
1484 break
1485 return result
1486
1487 func check_field_names() -> Array:
1488 var result : Array = []
1489 for i in range(field_table.size()):
1490 var the_class_name : String = class_table[field_table[i].parent_class_id].parent_name + "." + class_table[field_table[i].parent_class_id].name
1491 for j in range(i + 1, field_table.size(), 1):
1492 var inner_name : String = class_table[field_table[j].parent_class_id].parent_name + "." + class_table[field_table[j].parent_class_id].name
1493 if inner_name == the_class_name:
1494 if field_table[i].name == field_table[j].name:
1495 var check : CheckResult = CheckResult.new(field_table[j].construction_index, field_table[i].construction_index, j, CHECK_SUBJECT.FIELD_NAME)
1496 result.append(check)
1497 break
1498 if field_table[i].tag == field_table[j].tag:
1499 var check : CheckResult = CheckResult.new(field_table[j].construction_index, field_table[i].construction_index, j, CHECK_SUBJECT.FIELD_TAG_NUMBER)
1500 result.append(check)
1501 break
1502 return result
1503
1504 func find_full_class_name(the_class_name : String) -> int:
1505 for i in range(class_table.size()):
1506 if the_class_name == class_table[i].parent_name + "." + class_table[i].name:
1507 return i
1508 return -1
1509
1510 func find_class_name(the_class_name : String) -> int:
1511 for i in range(class_table.size()):
1512 if the_class_name == class_table[i].name:
1513 return i
1514 return -1
1515
1516 func get_class_childs(class_index : int) -> Array:
1517 var result : Array = []
1518 for i in range(class_table.size()):
1519 if class_table[i].parent_index == class_index:
1520 result.append(i)
1521 return result
1522
1523 func find_in_childs(the_class_name : String, child_indexes : Array) -> int:
1524 for c in child_indexes:
1525 if the_class_name == class_table[c].name:
1526 return c
1527 return -1
1528
1529 func determine_field_types() -> Array:
1530 var result : Array = []
1531 for f in field_table:
1532 if STRING_FIELD_TYPE.has(f.type_name):
1533 f.field_type = STRING_FIELD_TYPE[f.type_name]
1534 else:
1535 if f.type_name[0] == ".":
1536 f.type_class_id = find_full_class_name(f.type_name)
1537 else:
1538 # Reset result from previous assignment, that can be incorrect because of merging of imports
1539 f.type_class_id = -1
1540 var splited_name : Array = f.type_name.split(".", false)
1541 var cur_class_index : int = f.parent_class_id
1542 var exit : bool = false
1543 while(true):
1544 var find : bool = false
1545 if cur_class_index == -1:
1546 break
1547 for n in splited_name:
1548 var childs_and_parent : Array = get_class_childs(cur_class_index)
1549 var res_index : int = find_in_childs(n, childs_and_parent)
1550 if res_index >= 0:
1551 find = true
1552 cur_class_index = res_index
1553 else:
1554 if find:
1555 exit = true
1556 else:
1557 cur_class_index = class_table[cur_class_index].parent_index
1558 break
1559 if exit:
1560 break
1561 if find:
1562 f.type_class_id = cur_class_index
1563 break
1564 if f.type_class_id == -1:
1565 f.type_class_id = find_full_class_name("." + f.type_name)
1566 for i in range(field_table.size()):
1567 if field_table[i].field_type == Analysis.FIELD_TYPE.UNDEFINED:
1568 if field_table[i].type_class_id == -1:
1569 result.append(CheckResult.new(field_table[i].construction_index, field_table[i].construction_index, i, CHECK_SUBJECT.FIELD_TYPE))
1570 else:
1571 if class_table[field_table[i].type_class_id].type == Analysis.CLASS_TYPE.ENUM:
1572 field_table[i].field_type = Analysis.FIELD_TYPE.ENUM
1573 elif class_table[field_table[i].type_class_id].type == Analysis.CLASS_TYPE.MESSAGE:
1574 field_table[i].field_type = Analysis.FIELD_TYPE.MESSAGE
1575 elif class_table[field_table[i].type_class_id].type == Analysis.CLASS_TYPE.MAP:
1576 field_table[i].field_type = Analysis.FIELD_TYPE.MAP
1577 else:
1578 result.append(CheckResult.new(field_table[i].construction_index, field_table[i].construction_index, i, CHECK_SUBJECT.FIELD_TYPE))
1579 return result
1580
1581 func check_constructions() -> Array:
1582 var cl : Array = check_class_names()
1583 var fl : Array = check_field_names()
1584 var ft : Array = determine_field_types()
1585 return cl + fl + ft
1586
1587 func check() -> bool:
1588 var check_result : Array = check_constructions()
1589 if check_result.size() == 0:
1590 return true
1591 else:
1592 for v in check_result:
1593 var main_tok : int = syntax.constructions[v.main_construction_index].begin_token_index
1594 var assoc_tok : int = syntax.constructions[v.associated_construction_index].begin_token_index
1595 var main_err_pos : Helper.StringPosition = Helper.str_pos(document.text, Helper.text_pos(tokens, main_tok))
1596 var assoc_err_pos : Helper.StringPosition = Helper.str_pos(document.text, Helper.text_pos(tokens, assoc_tok))
1597 var err_text : String
1598 if v.subject == CHECK_SUBJECT.CLASS_NAME:
1599 var class_type = "Undefined"
1600 if class_table[v.table_index].type == Analysis.CLASS_TYPE.ENUM:
1601 class_type = "Enum"
1602 elif class_table[v.table_index].type == Analysis.CLASS_TYPE.MESSAGE:
1603 class_type = "Message"
1604 elif class_table[v.table_index].type == Analysis.CLASS_TYPE.MAP:
1605 class_type = "Map"
1606 err_text = class_type + " name '" + class_table[v.table_index].name + "' is already defined at:" + str(assoc_err_pos.str_num) + ":" + str(assoc_err_pos.column)
1607 elif v.subject == CHECK_SUBJECT.FIELD_NAME:
1608 err_text = "Field name '" + field_table[v.table_index].name + "' is already defined at:" + str(assoc_err_pos.str_num) + ":" + str(assoc_err_pos.column)
1609 elif v.subject == CHECK_SUBJECT.FIELD_TAG_NUMBER:
1610 err_text = "Tag number '" + field_table[v.table_index].tag + "' is already defined at:" + str(assoc_err_pos.str_num) + ":" + str(assoc_err_pos.column)
1611 elif v.subject == CHECK_SUBJECT.FIELD_TYPE:
1612 err_text = "Type '" + field_table[v.table_index].type_name + "' of the '" + field_table[v.table_index].name + "' field undefined"
1613 else:
1614 err_text = "Undefined error"
1615 printerr(Helper.error_string(document.name, main_err_pos.str_num, main_err_pos.column, err_text))
1616 return false
1617
1618class Translator:
1619
1620 var class_table : Array
1621 var field_table : Array
1622 var group_table : Array
1623 var proto_version : int
1624
1625 func _init(analyzer_result : AnalyzeResult):
1626 class_table = analyzer_result.classes
1627 field_table = analyzer_result.fields
1628 group_table = analyzer_result.groups
1629 proto_version = analyzer_result.version
1630
1631 func tabulate(text : String, nesting : int) -> String:
1632 var tab : String = ""
1633 for i in range(nesting):
1634 tab += "\t"
1635 return tab + text
1636
1637 func default_dict_text() -> String:
1638 if proto_version == 2:
1639 return "DEFAULT_VALUES_2"
1640 elif proto_version == 3:
1641 return "DEFAULT_VALUES_3"
1642 return "TRANSLATION_ERROR"
1643
1644 func generate_field_type(field : Analysis.ASTField) -> String:
1645 var text : String = "PB_DATA_TYPE."
1646 if field.field_type == Analysis.FIELD_TYPE.INT32:
1647 return text + "INT32"
1648 elif field.field_type == Analysis.FIELD_TYPE.SINT32:
1649 return text + "SINT32"
1650 elif field.field_type == Analysis.FIELD_TYPE.UINT32:
1651 return text + "UINT32"
1652 elif field.field_type == Analysis.FIELD_TYPE.INT64:
1653 return text + "INT64"
1654 elif field.field_type == Analysis.FIELD_TYPE.SINT64:
1655 return text + "SINT64"
1656 elif field.field_type == Analysis.FIELD_TYPE.UINT64:
1657 return text + "UINT64"
1658 elif field.field_type == Analysis.FIELD_TYPE.BOOL:
1659 return text + "BOOL"
1660 elif field.field_type == Analysis.FIELD_TYPE.ENUM:
1661 return text + "ENUM"
1662 elif field.field_type == Analysis.FIELD_TYPE.FIXED32:
1663 return text + "FIXED32"
1664 elif field.field_type == Analysis.FIELD_TYPE.SFIXED32:
1665 return text + "SFIXED32"
1666 elif field.field_type == Analysis.FIELD_TYPE.FLOAT:
1667 return text + "FLOAT"
1668 elif field.field_type == Analysis.FIELD_TYPE.FIXED64:
1669 return text + "FIXED64"
1670 elif field.field_type == Analysis.FIELD_TYPE.SFIXED64:
1671 return text + "SFIXED64"
1672 elif field.field_type == Analysis.FIELD_TYPE.DOUBLE:
1673 return text + "DOUBLE"
1674 elif field.field_type == Analysis.FIELD_TYPE.STRING:
1675 return text + "STRING"
1676 elif field.field_type == Analysis.FIELD_TYPE.BYTES:
1677 return text + "BYTES"
1678 elif field.field_type == Analysis.FIELD_TYPE.MESSAGE:
1679 return text + "MESSAGE"
1680 elif field.field_type == Analysis.FIELD_TYPE.MAP:
1681 return text + "MAP"
1682 return text
1683
1684 func generate_field_rule(field : Analysis.ASTField) -> String:
1685 var text : String = "PB_RULE."
1686 if field.qualificator == Analysis.FIELD_QUALIFICATOR.OPTIONAL:
1687 return text + "OPTIONAL"
1688 elif field.qualificator == Analysis.FIELD_QUALIFICATOR.REQUIRED:
1689 return text + "REQUIRED"
1690 elif field.qualificator == Analysis.FIELD_QUALIFICATOR.REPEATED:
1691 return text + "REPEATED"
1692 elif field.qualificator == Analysis.FIELD_QUALIFICATOR.RESERVED:
1693 return text + "RESERVED"
1694 return text
1695
1696 func generate_gdscript_type(field : Analysis.ASTField) -> String:
1697 if field.field_type == Analysis.FIELD_TYPE.MESSAGE:
1698 var type_name : String = class_table[field.type_class_id].parent_name + "." + class_table[field.type_class_id].name
1699 return type_name.substr(1, type_name.length() - 1)
1700 return generate_gdscript_simple_type(field)
1701
1702 func generate_gdscript_simple_type(field : Analysis.ASTField) -> String:
1703 if field.field_type == Analysis.FIELD_TYPE.INT32:
1704 return "int"
1705 elif field.field_type == Analysis.FIELD_TYPE.SINT32:
1706 return "int"
1707 elif field.field_type == Analysis.FIELD_TYPE.UINT32:
1708 return "int"
1709 elif field.field_type == Analysis.FIELD_TYPE.INT64:
1710 return "int"
1711 elif field.field_type == Analysis.FIELD_TYPE.SINT64:
1712 return "int"
1713 elif field.field_type == Analysis.FIELD_TYPE.UINT64:
1714 return "int"
1715 elif field.field_type == Analysis.FIELD_TYPE.BOOL:
1716 return "bool"
1717 elif field.field_type == Analysis.FIELD_TYPE.ENUM:
1718 return ""
1719 elif field.field_type == Analysis.FIELD_TYPE.FIXED32:
1720 return "int"
1721 elif field.field_type == Analysis.FIELD_TYPE.SFIXED32:
1722 return "int"
1723 elif field.field_type == Analysis.FIELD_TYPE.FLOAT:
1724 return "float"
1725 elif field.field_type == Analysis.FIELD_TYPE.FIXED64:
1726 return "int"
1727 elif field.field_type == Analysis.FIELD_TYPE.SFIXED64:
1728 return "int"
1729 elif field.field_type == Analysis.FIELD_TYPE.DOUBLE:
1730 return "float"
1731 elif field.field_type == Analysis.FIELD_TYPE.STRING:
1732 return "String"
1733 elif field.field_type == Analysis.FIELD_TYPE.BYTES:
1734 return "PackedByteArray"
1735 return ""
1736
1737 func generate_field_constructor(field_index : int, nesting : int) -> String:
1738 var text : String = ""
1739 var f : Analysis.ASTField = field_table[field_index]
1740 var field_name : String = "__" + f.name
1741 var pbfield_text : String
1742 var default_var_name := field_name + "_default"
1743 if f.qualificator == Analysis.FIELD_QUALIFICATOR.REPEATED:
1744 var type_name := generate_gdscript_type(f)
1745 if type_name:
1746 text = tabulate("var %s: Array[%s] = []\n" % [default_var_name, type_name], nesting)
1747 else:
1748 text = tabulate("var %s: Array = []\n" % [default_var_name], nesting)
1749 pbfield_text += field_name + " = PBField.new("
1750 pbfield_text += "\"" + f.name + "\", "
1751 pbfield_text += generate_field_type(f) + ", "
1752 pbfield_text += generate_field_rule(f) + ", "
1753 pbfield_text += str(f.tag) + ", "
1754 if f.option == Analysis.FIELD_OPTION.PACKED:
1755 pbfield_text += "true"
1756 elif f.option == Analysis.FIELD_OPTION.NOT_PACKED:
1757 pbfield_text += "false"
1758 if f.qualificator == Analysis.FIELD_QUALIFICATOR.REPEATED:
1759 pbfield_text += ", " + default_var_name
1760 else:
1761 pbfield_text += ", " + default_dict_text() + "[" + generate_field_type(f) + "]"
1762 pbfield_text += ")\n"
1763 text += tabulate(pbfield_text, nesting)
1764 if f.is_map_field:
1765 text += tabulate(field_name + ".is_map_field = true\n", nesting)
1766 text += tabulate("service = PBServiceField.new()\n", nesting)
1767 text += tabulate("service.field = " + field_name + "\n", nesting)
1768 if f.field_type == Analysis.FIELD_TYPE.MESSAGE:
1769 if f.qualificator == Analysis.FIELD_QUALIFICATOR.REPEATED:
1770 text += tabulate("service.func_ref = Callable(self, \"add_" + f.name + "\")\n", nesting)
1771 else:
1772 text += tabulate("service.func_ref = Callable(self, \"new_" + f.name + "\")\n", nesting)
1773 elif f.field_type == Analysis.FIELD_TYPE.MAP:
1774 text += tabulate("service.func_ref = Callable(self, \"add_empty_" + f.name + "\")\n", nesting)
1775 text += tabulate("data[" + field_name + ".tag] = service\n", nesting)
1776
1777 return text
1778
1779 func generate_group_clear(field_index : int, nesting : int) -> String:
1780 for g in group_table:
1781 var text : String = ""
1782 var find : bool = false
1783 if g.parent_class_id == field_table[field_index].parent_class_id:
1784 for i in g.field_indexes:
1785 if field_index == i:
1786 find = true
1787 text += tabulate("data[" + field_table[i].tag + "].state = PB_SERVICE_STATE.FILLED\n", nesting)
1788 else:
1789 text += tabulate("__" + field_table[i].name + ".value = " + default_dict_text() + "[" + generate_field_type(field_table[i]) + "]\n", nesting)
1790 text += tabulate("data[" + field_table[i].tag + "].state = PB_SERVICE_STATE.UNFILLED\n", nesting)
1791 if find:
1792 return text
1793 return ""
1794
1795 func generate_has_oneof(field_index : int, nesting : int) -> String:
1796 for g in group_table:
1797 var text : String = ""
1798 if g.parent_class_id == field_table[field_index].parent_class_id:
1799 for i in g.field_indexes:
1800 if field_index == i:
1801 text += tabulate("func has_" + field_table[i].name + "() -> bool:\n", nesting)
1802 nesting += 1
1803 text += tabulate("return data[" + field_table[i].tag + "].state == PB_SERVICE_STATE.FILLED\n", nesting)
1804 return text
1805 return ""
1806
1807 func generate_field(field_index : int, nesting : int) -> String:
1808 var text : String = ""
1809 var f : Analysis.ASTField = field_table[field_index]
1810 var varname : String = "__" + f.name
1811 text += tabulate("var " + varname + ": PBField\n", nesting)
1812 if f.field_type == Analysis.FIELD_TYPE.MESSAGE:
1813 var the_class_name : String = class_table[f.type_class_id].parent_name + "." + class_table[f.type_class_id].name
1814 the_class_name = the_class_name.substr(1, the_class_name.length() - 1)
1815 if f.qualificator != Analysis.FIELD_QUALIFICATOR.OPTIONAL:
1816 text += generate_has_oneof(field_index, nesting)
1817 if f.qualificator == Analysis.FIELD_QUALIFICATOR.REPEATED:
1818 text += tabulate("func get_" + f.name + "() -> Array[" + the_class_name + "]:\n", nesting)
1819 else:
1820 if f.qualificator == Analysis.FIELD_QUALIFICATOR.OPTIONAL:
1821 text += tabulate("func has_" + f.name + "() -> bool:\n", nesting)
1822 nesting += 1
1823 text += tabulate("if " + varname + ".value != null:\n", nesting)
1824 nesting += 1
1825 text += tabulate("return true\n", nesting)
1826 nesting -= 1
1827 text += tabulate("return false\n", nesting)
1828 nesting -= 1
1829 text += tabulate("func get_" + f.name + "() -> " + the_class_name + ":\n", nesting)
1830 nesting += 1
1831 text += tabulate("return " + varname + ".value\n", nesting)
1832 nesting -= 1
1833 text += tabulate("func clear_" + f.name + "() -> void:\n", nesting)
1834 nesting += 1
1835 text += tabulate("data[" + str(f.tag) + "].state = PB_SERVICE_STATE.UNFILLED\n", nesting)
1836 if f.qualificator == Analysis.FIELD_QUALIFICATOR.REPEATED:
1837 text += tabulate(varname + ".value.clear()\n", nesting)
1838 nesting -= 1
1839 text += tabulate("func add_" + f.name + "() -> " + the_class_name + ":\n", nesting)
1840 nesting += 1
1841 text += tabulate("var element = " + the_class_name + ".new()\n", nesting)
1842 text += tabulate(varname + ".value.append(element)\n", nesting)
1843 text += tabulate("return element\n", nesting)
1844 else:
1845 text += tabulate(varname + ".value = " + default_dict_text() + "[" + generate_field_type(f) + "]\n", nesting)
1846 nesting -= 1
1847 text += tabulate("func new_" + f.name + "() -> " + the_class_name + ":\n", nesting)
1848 nesting += 1
1849 text += generate_group_clear(field_index, nesting)
1850 text += tabulate(varname + ".value = " + the_class_name + ".new()\n", nesting)
1851 text += tabulate("return " + varname + ".value\n", nesting)
1852 elif f.field_type == Analysis.FIELD_TYPE.MAP:
1853 var the_parent_class_name : String = class_table[f.type_class_id].parent_name
1854 the_parent_class_name = the_parent_class_name.substr(1, the_parent_class_name.length() - 1)
1855 var the_class_name : String = the_parent_class_name + "." + class_table[f.type_class_id].name
1856
1857 text += generate_has_oneof(field_index, nesting)
1858 text += tabulate("func get_raw_" + f.name + "():\n", nesting)
1859 nesting += 1
1860 text += tabulate("return " + varname + ".value\n", nesting)
1861 nesting -= 1
1862 text += tabulate("func get_" + f.name + "():\n", nesting)
1863 nesting += 1
1864 text += tabulate("return PBPacker.construct_map(" + varname + ".value)\n", nesting)
1865 nesting -= 1
1866 text += tabulate("func clear_" + f.name + "():\n", nesting)
1867 nesting += 1
1868 text += tabulate("data[" + str(f.tag) + "].state = PB_SERVICE_STATE.UNFILLED\n", nesting)
1869 text += tabulate(varname + ".value = " + default_dict_text() + "[" + generate_field_type(f) + "]\n", nesting)
1870 nesting -= 1
1871 for i in range(field_table.size()):
1872 if field_table[i].parent_class_id == f.type_class_id && field_table[i].name == "value":
1873 var gd_type : String = generate_gdscript_simple_type(field_table[i])
1874 var return_type : String = " -> " + the_class_name
1875 var value_return_type : String = ""
1876 if gd_type != "":
1877 value_return_type = return_type
1878 elif field_table[i].field_type == Analysis.FIELD_TYPE.MESSAGE:
1879 value_return_type = " -> " + the_parent_class_name + "." + field_table[i].type_name
1880 text += tabulate("func add_empty_" + f.name + "()" + return_type + ":\n", nesting)
1881 nesting += 1
1882 text += generate_group_clear(field_index, nesting)
1883 text += tabulate("var element = " + the_class_name + ".new()\n", nesting)
1884 text += tabulate(varname + ".value.append(element)\n", nesting)
1885 text += tabulate("return element\n", nesting)
1886 nesting -= 1
1887 if field_table[i].field_type == Analysis.FIELD_TYPE.MESSAGE:
1888 text += tabulate("func add_" + f.name + "(a_key)" + value_return_type + ":\n", nesting)
1889 nesting += 1
1890 text += generate_group_clear(field_index, nesting)
1891 text += tabulate("var idx = -1\n", nesting)
1892 text += tabulate("for i in range(" + varname + ".value.size()):\n", nesting)
1893 nesting += 1
1894 text += tabulate("if " + varname + ".value[i].get_key() == a_key:\n", nesting)
1895 nesting += 1
1896 text += tabulate("idx = i\n", nesting)
1897 text += tabulate("break\n", nesting)
1898 nesting -= 2
1899 text += tabulate("var element = " + the_class_name + ".new()\n", nesting)
1900 text += tabulate("element.set_key(a_key)\n", nesting)
1901 text += tabulate("if idx != -1:\n", nesting)
1902 nesting += 1
1903 text += tabulate(varname + ".value[idx] = element\n", nesting)
1904 nesting -= 1
1905 text += tabulate("else:\n", nesting)
1906 nesting += 1
1907 text += tabulate(varname + ".value.append(element)\n", nesting)
1908 nesting -= 1
1909 text += tabulate("return element.new_value()\n", nesting)
1910 else:
1911 text += tabulate("func add_" + f.name + "(a_key, a_value) -> void:\n", nesting)
1912 nesting += 1
1913 text += generate_group_clear(field_index, nesting)
1914 text += tabulate("var idx = -1\n", nesting)
1915 text += tabulate("for i in range(" + varname + ".value.size()):\n", nesting)
1916 nesting += 1
1917 text += tabulate("if " + varname + ".value[i].get_key() == a_key:\n", nesting)
1918 nesting += 1
1919 text += tabulate("idx = i\n", nesting)
1920 text += tabulate("break\n", nesting)
1921 nesting -= 2
1922 text += tabulate("var element = " + the_class_name + ".new()\n", nesting)
1923 text += tabulate("element.set_key(a_key)\n", nesting)
1924 text += tabulate("element.set_value(a_value)\n", nesting)
1925 text += tabulate("if idx != -1:\n", nesting)
1926 nesting += 1
1927 text += tabulate(varname + ".value[idx] = element\n", nesting)
1928 nesting -= 1
1929 text += tabulate("else:\n", nesting)
1930 nesting += 1
1931 text += tabulate(varname + ".value.append(element)\n", nesting)
1932 nesting -= 1
1933 break
1934 else:
1935 var gd_type : String = generate_gdscript_simple_type(f)
1936 var return_type : String = ""
1937 var argument_type : String = ""
1938 if gd_type != "":
1939 return_type = " -> " + gd_type
1940 argument_type = " : " + gd_type
1941 if f.qualificator != Analysis.FIELD_QUALIFICATOR.OPTIONAL:
1942 text += generate_has_oneof(field_index, nesting)
1943 if f.qualificator == Analysis.FIELD_QUALIFICATOR.REPEATED:
1944 var array_type := "[" + gd_type + "]" if gd_type else ""
1945 text += tabulate("func get_" + f.name + "() -> Array" + array_type + ":\n", nesting)
1946 else:
1947 if f.qualificator == Analysis.FIELD_QUALIFICATOR.OPTIONAL:
1948 text += tabulate("func has_" + f.name + "() -> bool:\n", nesting)
1949 nesting += 1
1950 text += tabulate("if " + varname + ".value != null:\n", nesting)
1951 nesting += 1
1952 text += tabulate("return true\n", nesting)
1953 nesting -= 1
1954 text += tabulate("return false\n", nesting)
1955 nesting -= 1
1956 text += tabulate("func get_" + f.name + "()" + return_type + ":\n", nesting)
1957 nesting += 1
1958 text += tabulate("return " + varname + ".value\n", nesting)
1959 nesting -= 1
1960 text += tabulate("func clear_" + f.name + "() -> void:\n", nesting)
1961 nesting += 1
1962 text += tabulate("data[" + str(f.tag) + "].state = PB_SERVICE_STATE.UNFILLED\n", nesting)
1963 if f.qualificator == Analysis.FIELD_QUALIFICATOR.REPEATED:
1964 text += tabulate(varname + ".value.clear()\n", nesting)
1965 nesting -= 1
1966 text += tabulate("func add_" + f.name + "(value" + argument_type + ") -> void:\n", nesting)
1967 nesting += 1
1968 text += tabulate(varname + ".value.append(value)\n", nesting)
1969 else:
1970 text += tabulate(varname + ".value = " + default_dict_text() + "[" + generate_field_type(f) + "]\n", nesting)
1971 nesting -= 1
1972 text += tabulate("func set_" + f.name + "(value" + argument_type + ") -> void:\n", nesting)
1973 nesting += 1
1974 text += generate_group_clear(field_index, nesting)
1975 text += tabulate(varname + ".value = value\n", nesting)
1976 return text
1977
1978 func generate_class(class_index : int, nesting : int) -> String:
1979 var text : String = ""
1980 if class_table[class_index].type == Analysis.CLASS_TYPE.MESSAGE || class_table[class_index].type == Analysis.CLASS_TYPE.MAP:
1981 var cls_pref : String = ""
1982 cls_pref += tabulate("class " + class_table[class_index].name + ":\n", nesting)
1983 nesting += 1
1984 cls_pref += tabulate("func _init():\n", nesting)
1985 text += cls_pref
1986 nesting += 1
1987 text += tabulate("var service\n", nesting)
1988 text += tabulate("\n", nesting)
1989 var field_text : String = ""
1990 for i in range(field_table.size()):
1991 if field_table[i].parent_class_id == class_index:
1992 text += generate_field_constructor(i, nesting)
1993 text += tabulate("\n", nesting)
1994 field_text += generate_field(i, nesting - 1)
1995 field_text += tabulate("\n", nesting - 1)
1996 nesting -= 1
1997 text += tabulate("var data = {}\n", nesting)
1998 text += tabulate("\n", nesting)
1999 text += field_text
2000 for j in range(class_table.size()):
2001 if class_table[j].parent_index == class_index:
2002 var cl_text = generate_class(j, nesting)
2003 text += cl_text
2004 if class_table[j].type == Analysis.CLASS_TYPE.MESSAGE || class_table[j].type == Analysis.CLASS_TYPE.MAP:
2005 text += generate_class_services(nesting + 1)
2006 text += tabulate("\n", nesting + 1)
2007 elif class_table[class_index].type == Analysis.CLASS_TYPE.ENUM:
2008 text += tabulate("enum " + class_table[class_index].name + " {\n", nesting)
2009 nesting += 1
2010
2011 var expected_prefix = class_table[class_index].name.to_snake_case().to_upper() + "_"
2012 var all_have_prefix = true
2013 for en in range(class_table[class_index].values.size()):
2014 var value_name = class_table[class_index].values[en].name
2015 all_have_prefix = all_have_prefix and value_name.begins_with(expected_prefix) and value_name != expected_prefix
2016
2017 for en in range(class_table[class_index].values.size()):
2018 var value_name = class_table[class_index].values[en].name
2019 if all_have_prefix:
2020 value_name = value_name.substr(expected_prefix.length())
2021 var enum_val = value_name + " = " + class_table[class_index].values[en].value
2022 if en == class_table[class_index].values.size() - 1:
2023 text += tabulate(enum_val + "\n", nesting)
2024 else:
2025 text += tabulate(enum_val + ",\n", nesting)
2026 nesting -= 1
2027 text += tabulate("}\n", nesting)
2028 text += tabulate("\n", nesting)
2029
2030 return text
2031
2032 func generate_class_services(nesting : int) -> String:
2033 var text : String = ""
2034 text += tabulate("func _to_string() -> String:\n", nesting)
2035 nesting += 1
2036 text += tabulate("return PBPacker.message_to_string(data)\n", nesting)
2037 text += tabulate("\n", nesting)
2038 nesting -= 1
2039 text += tabulate("func to_bytes() -> PackedByteArray:\n", nesting)
2040 nesting += 1
2041 text += tabulate("return PBPacker.pack_message(data)\n", nesting)
2042 text += tabulate("\n", nesting)
2043 nesting -= 1
2044 text += tabulate("func from_bytes(bytes : PackedByteArray, offset : int = 0, limit : int = -1) -> int:\n", nesting)
2045 nesting += 1
2046 text += tabulate("var cur_limit = bytes.size()\n", nesting)
2047 text += tabulate("if limit != -1:\n", nesting)
2048 nesting += 1
2049 text += tabulate("cur_limit = limit\n", nesting)
2050 nesting -= 1
2051 text += tabulate("var result = PBPacker.unpack_message(data, bytes, offset, cur_limit)\n", nesting)
2052 text += tabulate("if result == cur_limit:\n", nesting)
2053 nesting += 1
2054 text += tabulate("if PBPacker.check_required(data):\n", nesting)
2055 nesting += 1
2056 text += tabulate("if limit == -1:\n", nesting)
2057 nesting += 1
2058 text += tabulate("return PB_ERR.NO_ERRORS\n", nesting)
2059 nesting -= 2
2060 text += tabulate("else:\n", nesting)
2061 nesting += 1
2062 text += tabulate("return PB_ERR.REQUIRED_FIELDS\n", nesting)
2063 nesting -= 2
2064 text += tabulate("elif limit == -1 && result > 0:\n", nesting)
2065 nesting += 1
2066 text += tabulate("return PB_ERR.PARSE_INCOMPLETE\n", nesting)
2067 nesting -= 1
2068 text += tabulate("return result\n", nesting)
2069 return text
2070
2071 func translate(file_name : String, core_file_name : String) -> bool:
2072
2073 var file : FileAccess = FileAccess.open(file_name, FileAccess.WRITE)
2074 if file == null:
2075 printerr("File: '", file_name, "' save error.")
2076 return false
2077
2078 if !FileAccess.file_exists(core_file_name):
2079 printerr("File: '", core_file_name, "' not found.")
2080 return false
2081
2082 var core_file : FileAccess = FileAccess.open(core_file_name, FileAccess.READ)
2083 if core_file == null:
2084 printerr("File: '", core_file_name, "' read error.")
2085 return false
2086 var core_text : String = core_file.get_as_text()
2087 core_file.close()
2088
2089 var text : String = ""
2090 var nesting : int = 0
2091 core_text = core_text.replace(PROTO_VERSION_DEFAULT, PROTO_VERSION_CONST + str(proto_version))
2092 text += core_text + "\n\n\n"
2093 text += "############### USER DATA BEGIN ################\n"
2094 var cls_user : String = ""
2095 for i in range(class_table.size()):
2096 if class_table[i].parent_index == -1:
2097 var cls_text = generate_class(i, nesting)
2098 cls_user += cls_text
2099 if class_table[i].type == Analysis.CLASS_TYPE.MESSAGE:
2100 nesting += 1
2101 cls_user += generate_class_services(nesting)
2102 cls_user += tabulate("\n", nesting)
2103 nesting -= 1
2104 text += "\n\n"
2105 text += cls_user
2106 text += "################ USER DATA END #################\n"
2107 file.store_string(text)
2108 file.close()
2109 if !FileAccess.file_exists(file_name):
2110 printerr("File: '", file_name, "' save error.")
2111 return false
2112 return true
2113
2114
2115class ImportFile:
2116 func _init(sha : String, a_path : String, a_parent : int):
2117 sha256 = sha
2118 path = a_path
2119 parent_index = a_parent
2120
2121 var sha256 : String
2122 var path : String
2123 var parent_index : int
2124
2125func parse_all(analyzes : Dictionary, imports : Array, path : String, full_name : String, parent_index : int) -> bool:
2126
2127 if !FileAccess.file_exists(full_name):
2128 printerr(full_name, ": not found.")
2129 return false
2130
2131 var file : FileAccess = FileAccess.open(full_name, FileAccess.READ)
2132 if file == null:
2133 printerr(full_name, ": read error.")
2134 return false
2135 var doc : Document = Document.new(full_name, file.get_as_text())
2136 var sha : String = file.get_sha256(full_name)
2137 file.close()
2138
2139 if !analyzes.has(sha):
2140 print(full_name, ": parsing.")
2141 var analysis : Analysis = Analysis.new(path, doc)
2142 var an_result : AnalyzeResult = analysis.analyze()
2143 if an_result.state:
2144 analyzes[sha] = an_result
2145 var parent : int = imports.size()
2146 imports.append(ImportFile.new(sha, doc.name, parent_index))
2147 for im in an_result.imports:
2148 if !parse_all(analyzes, imports, path, im.path, parent):
2149 return false
2150 else:
2151 printerr(doc.name + ": parsing error.")
2152 return false
2153 else:
2154 print(full_name, ": retrieving data from cache.")
2155 imports.append(ImportFile.new(sha, doc.name, parent_index))
2156 return true
2157
2158func union_analyses(a1 : AnalyzeResult, a2 : AnalyzeResult, only_classes : bool = true) -> void:
2159 var class_offset : int = a1.classes.size()
2160 var field_offset = a1.fields.size()
2161 for cl in a2.classes:
2162 var cur_class : Analysis.ASTClass = cl.copy()
2163 if cur_class.parent_index != -1:
2164 cur_class.parent_index += class_offset
2165 a1.classes.append(cur_class)
2166 if only_classes:
2167 return
2168 for fl in a2.fields:
2169 var cur_field : Analysis.ASTField = fl.copy()
2170 cur_field.parent_class_id += class_offset
2171 cur_field.type_class_id = -1
2172 a1.fields.append(cur_field)
2173 for gr in a2.groups:
2174 var cur_group : Analysis.ASTFieldGroup = gr.copy()
2175 cur_group.parent_class_id += class_offset
2176 var indexes : Array = []
2177 for i in cur_group.field_indexes:
2178 indexes.append(i + field_offset)
2179 cur_group.field_indexes = indexes
2180 a1.groups.append(cur_group)
2181
2182func union_imports(analyzes : Dictionary, key : String, result : AnalyzeResult, keys : Array, nesting : int, use_public : bool = true, only_classes : bool = true) -> void:
2183 nesting += 1
2184 for im in analyzes[key].imports:
2185 var find : bool = false
2186 for k in keys:
2187 if im.sha256 == k:
2188 find = true
2189 break
2190 if find:
2191 continue
2192 if (!use_public) || (use_public && ((im.public && nesting > 1) || nesting < 2)):
2193 keys.append(im.sha256)
2194 union_analyses(result, analyzes[im.sha256], only_classes)
2195 union_imports(analyzes, im.sha256, result, keys, nesting, use_public, only_classes)
2196
2197func semantic_all(analyzes : Dictionary, imports : Array)-> bool:
2198 for k in analyzes.keys():
2199 print(analyzes[k].doc.name, ": analysis.")
2200 var keys : Array = []
2201 var analyze : AnalyzeResult = analyzes[k].soft_copy()
2202 keys.append(k)
2203 analyze.classes = []
2204 for cl in analyzes[k].classes:
2205 analyze.classes.append(cl.copy())
2206 union_imports(analyzes, k, analyze, keys, 0)
2207 var semantic : Semantic = Semantic.new(analyze)
2208 if !semantic.check():
2209 printerr(analyzes[k].doc.name, ": analysis error.")
2210 return false
2211 return true
2212
2213func translate_all(analyzes : Dictionary, file_name : String, core_file_name : String) -> bool:
2214 var first_key : String = analyzes.keys()[0]
2215 var analyze : AnalyzeResult = analyzes[first_key]
2216 var keys : Array = []
2217 keys.append(first_key)
2218 union_imports(analyzes, first_key, analyze, keys, 0, false, false)
2219 print("Performing full semantic analysis.")
2220 var semantic : Semantic = Semantic.new(analyze)
2221 if !semantic.check():
2222 return false
2223 print("Performing translation.")
2224 var translator : Translator = Translator.new(analyze)
2225 if !translator.translate(file_name, core_file_name):
2226 return false
2227 var first : bool = true
2228 return true
2229
2230func work(path : String, in_file : String, out_file : String, core_file : String) -> bool:
2231 var in_full_name : String = path + in_file
2232 var imports : Array = []
2233 var analyzes : Dictionary = {}
2234
2235 print("Compiling source: '", in_full_name, "', output: '", out_file, "'.")
2236 print("\n1. Parsing:")
2237 if parse_all(analyzes, imports, path, in_full_name, -1):
2238 print("* Parsing completed successfully. *")
2239 else:
2240 return false
2241 print("\n2. Perfoming semantic analysis:")
2242 if semantic_all(analyzes, imports):
2243 print("* Semantic analysis completed successfully. *")
2244 else:
2245 return false
2246 print("\n3. Output file creating:")
2247 if translate_all(analyzes, out_file, core_file):
2248 print("* Output file was created successfully. *")
2249 else:
2250 return false
2251 return true
2252
2253func _ready():
2254 pass
diff --git a/vendor/godobuf/addons/protobuf/plugin.cfg b/vendor/godobuf/addons/protobuf/plugin.cfg new file mode 100644 index 0000000..6456a11 --- /dev/null +++ b/vendor/godobuf/addons/protobuf/plugin.cfg
@@ -0,0 +1,7 @@
1[plugin]
2
3name="Godobuf"
4description="Google Protobuf implementation for Godot/GDScript"
5author="oniksan"
6version="0.6.1 for Godot 4.x.y"
7script="protobuf_ui.gd"
diff --git a/vendor/godobuf/addons/protobuf/protobuf_cmdln.gd b/vendor/godobuf/addons/protobuf/protobuf_cmdln.gd new file mode 100644 index 0000000..97d7ba4 --- /dev/null +++ b/vendor/godobuf/addons/protobuf/protobuf_cmdln.gd
@@ -0,0 +1,66 @@
1#
2# BSD 3-Clause License
3#
4# Copyright (c) 2018, Oleg Malyavkin
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions are met:
9#
10# * Redistributions of source code must retain the above copyright notice, this
11# list of conditions and the following disclaimer.
12#
13# * Redistributions in binary form must reproduce the above copyright notice,
14# this list of conditions and the following disclaimer in the documentation
15# and/or other materials provided with the distribution.
16#
17# * Neither the name of the copyright holder nor the names of its
18# contributors may be used to endorse or promote products derived from
19# this software without specific prior written permission.
20#
21# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32extends SceneTree
33
34var Parser = preload("res://addons/protobuf/parser.gd")
35var Util = preload("res://addons/protobuf/protobuf_util.gd")
36
37func error(msg : String):
38 push_error(msg)
39 quit()
40
41func _init():
42 var arguments = {}
43 for argument in OS.get_cmdline_args():
44 if argument.find("=") > -1:
45 var key_value = argument.split("=")
46 arguments[key_value[0].lstrip("--")] = key_value[1]
47
48 if !arguments.has("input") || !arguments.has("output"):
49 error("Expected 2 Parameters: input and output")
50
51 var input_file_name = arguments["input"]
52 var output_file_name = arguments["output"]
53
54 var file = FileAccess.open(input_file_name, FileAccess.READ)
55 if file == null:
56 error("File: '" + input_file_name + "' not found.")
57
58 var parser = Parser.new()
59
60 if parser.work(Util.extract_dir(input_file_name), Util.extract_filename(input_file_name), \
61 output_file_name, "res://addons/protobuf/protobuf_core.gd"):
62 print("Compiled '", input_file_name, "' to '", output_file_name, "'.")
63 else:
64 error("Compilation failed.")
65
66 quit()
diff --git a/vendor/godobuf/addons/protobuf/protobuf_core.gd b/vendor/godobuf/addons/protobuf/protobuf_core.gd new file mode 100644 index 0000000..7098413 --- /dev/null +++ b/vendor/godobuf/addons/protobuf/protobuf_core.gd
@@ -0,0 +1,668 @@
1#
2# BSD 3-Clause License
3#
4# Copyright (c) 2018 - 2023, Oleg Malyavkin
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions are met:
9#
10# * Redistributions of source code must retain the above copyright notice, this
11# list of conditions and the following disclaimer.
12#
13# * Redistributions in binary form must reproduce the above copyright notice,
14# this list of conditions and the following disclaimer in the documentation
15# and/or other materials provided with the distribution.
16#
17# * Neither the name of the copyright holder nor the names of its
18# contributors may be used to endorse or promote products derived from
19# this software without specific prior written permission.
20#
21# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32# DEBUG_TAB redefine this " " if you need, example: const DEBUG_TAB = "\t"
33
34const PROTO_VERSION = 0
35
36const DEBUG_TAB : String = " "
37
38enum PB_ERR {
39 NO_ERRORS = 0,
40 VARINT_NOT_FOUND = -1,
41 REPEATED_COUNT_NOT_FOUND = -2,
42 REPEATED_COUNT_MISMATCH = -3,
43 LENGTHDEL_SIZE_NOT_FOUND = -4,
44 LENGTHDEL_SIZE_MISMATCH = -5,
45 PACKAGE_SIZE_MISMATCH = -6,
46 UNDEFINED_STATE = -7,
47 PARSE_INCOMPLETE = -8,
48 REQUIRED_FIELDS = -9
49}
50
51enum PB_DATA_TYPE {
52 INT32 = 0,
53 SINT32 = 1,
54 UINT32 = 2,
55 INT64 = 3,
56 SINT64 = 4,
57 UINT64 = 5,
58 BOOL = 6,
59 ENUM = 7,
60 FIXED32 = 8,
61 SFIXED32 = 9,
62 FLOAT = 10,
63 FIXED64 = 11,
64 SFIXED64 = 12,
65 DOUBLE = 13,
66 STRING = 14,
67 BYTES = 15,
68 MESSAGE = 16,
69 MAP = 17
70}
71
72const DEFAULT_VALUES_2 = {
73 PB_DATA_TYPE.INT32: null,
74 PB_DATA_TYPE.SINT32: null,
75 PB_DATA_TYPE.UINT32: null,
76 PB_DATA_TYPE.INT64: null,
77 PB_DATA_TYPE.SINT64: null,
78 PB_DATA_TYPE.UINT64: null,
79 PB_DATA_TYPE.BOOL: null,
80 PB_DATA_TYPE.ENUM: null,
81 PB_DATA_TYPE.FIXED32: null,
82 PB_DATA_TYPE.SFIXED32: null,
83 PB_DATA_TYPE.FLOAT: null,
84 PB_DATA_TYPE.FIXED64: null,
85 PB_DATA_TYPE.SFIXED64: null,
86 PB_DATA_TYPE.DOUBLE: null,
87 PB_DATA_TYPE.STRING: null,
88 PB_DATA_TYPE.BYTES: null,
89 PB_DATA_TYPE.MESSAGE: null,
90 PB_DATA_TYPE.MAP: null
91}
92
93const DEFAULT_VALUES_3 = {
94 PB_DATA_TYPE.INT32: 0,
95 PB_DATA_TYPE.SINT32: 0,
96 PB_DATA_TYPE.UINT32: 0,
97 PB_DATA_TYPE.INT64: 0,
98 PB_DATA_TYPE.SINT64: 0,
99 PB_DATA_TYPE.UINT64: 0,
100 PB_DATA_TYPE.BOOL: false,
101 PB_DATA_TYPE.ENUM: 0,
102 PB_DATA_TYPE.FIXED32: 0,
103 PB_DATA_TYPE.SFIXED32: 0,
104 PB_DATA_TYPE.FLOAT: 0.0,
105 PB_DATA_TYPE.FIXED64: 0,
106 PB_DATA_TYPE.SFIXED64: 0,
107 PB_DATA_TYPE.DOUBLE: 0.0,
108 PB_DATA_TYPE.STRING: "",
109 PB_DATA_TYPE.BYTES: [],
110 PB_DATA_TYPE.MESSAGE: null,
111 PB_DATA_TYPE.MAP: []
112}
113
114enum PB_TYPE {
115 VARINT = 0,
116 FIX64 = 1,
117 LENGTHDEL = 2,
118 STARTGROUP = 3,
119 ENDGROUP = 4,
120 FIX32 = 5,
121 UNDEFINED = 8
122}
123
124enum PB_RULE {
125 OPTIONAL = 0,
126 REQUIRED = 1,
127 REPEATED = 2,
128 RESERVED = 3
129}
130
131enum PB_SERVICE_STATE {
132 FILLED = 0,
133 UNFILLED = 1
134}
135
136class PBField:
137 func _init(a_name : String, a_type : int, a_rule : int, a_tag : int, packed : bool, a_value = null):
138 name = a_name
139 type = a_type
140 rule = a_rule
141 tag = a_tag
142 option_packed = packed
143 value = a_value
144
145 var name : String
146 var type : int
147 var rule : int
148 var tag : int
149 var option_packed : bool
150 var value
151 var is_map_field : bool = false
152 var option_default : bool = false
153
154class PBTypeTag:
155 var ok : bool = false
156 var type : int
157 var tag : int
158 var offset : int
159
160class PBServiceField:
161 var field : PBField
162 var func_ref = null
163 var state : int = PB_SERVICE_STATE.UNFILLED
164
165class PBPacker:
166 static func convert_signed(n : int) -> int:
167 if n < -2147483648:
168 return (n << 1) ^ (n >> 63)
169 else:
170 return (n << 1) ^ (n >> 31)
171
172 static func deconvert_signed(n : int) -> int:
173 if n & 0x01:
174 return ~(n >> 1)
175 else:
176 return (n >> 1)
177
178 static func pack_varint(value) -> PackedByteArray:
179 var varint : PackedByteArray = PackedByteArray()
180 if typeof(value) == TYPE_BOOL:
181 if value:
182 value = 1
183 else:
184 value = 0
185 for _i in range(9):
186 var b = value & 0x7F
187 value >>= 7
188 if value:
189 varint.append(b | 0x80)
190 else:
191 varint.append(b)
192 break
193 if varint.size() == 9 && (varint[8] & 0x80 != 0):
194 varint.append(0x01)
195 return varint
196
197 static func pack_bytes(value, count : int, data_type : int) -> PackedByteArray:
198 var bytes : PackedByteArray = PackedByteArray()
199 if data_type == PB_DATA_TYPE.FLOAT:
200 var spb : StreamPeerBuffer = StreamPeerBuffer.new()
201 spb.put_float(value)
202 bytes = spb.get_data_array()
203 elif data_type == PB_DATA_TYPE.DOUBLE:
204 var spb : StreamPeerBuffer = StreamPeerBuffer.new()
205 spb.put_double(value)
206 bytes = spb.get_data_array()
207 else:
208 for _i in range(count):
209 bytes.append(value & 0xFF)
210 value >>= 8
211 return bytes
212
213 static func unpack_bytes(bytes : PackedByteArray, index : int, count : int, data_type : int):
214 if data_type == PB_DATA_TYPE.FLOAT:
215 return bytes.decode_float(index)
216 elif data_type == PB_DATA_TYPE.DOUBLE:
217 return bytes.decode_double(index)
218 else:
219 # Convert to big endian
220 var slice: PackedByteArray = bytes.slice(index, index + count)
221 slice.reverse()
222 return slice
223
224 static func unpack_varint(varint_bytes) -> int:
225 var value : int = 0
226 var i: int = varint_bytes.size() - 1
227 while i > -1:
228 value = (value << 7) | (varint_bytes[i] & 0x7F)
229 i -= 1
230 return value
231
232 static func pack_type_tag(type : int, tag : int) -> PackedByteArray:
233 return pack_varint((tag << 3) | type)
234
235 static func isolate_varint(bytes : PackedByteArray, index : int) -> PackedByteArray:
236 var i: int = index
237 while i <= index + 10: # Protobuf varint max size is 10 bytes
238 if !(bytes[i] & 0x80):
239 return bytes.slice(index, i + 1)
240 i += 1
241 return [] # Unreachable
242
243 static func unpack_type_tag(bytes : PackedByteArray, index : int) -> PBTypeTag:
244 var varint_bytes : PackedByteArray = isolate_varint(bytes, index)
245 var result : PBTypeTag = PBTypeTag.new()
246 if varint_bytes.size() != 0:
247 result.ok = true
248 result.offset = varint_bytes.size()
249 var unpacked : int = unpack_varint(varint_bytes)
250 result.type = unpacked & 0x07
251 result.tag = unpacked >> 3
252 return result
253
254 static func pack_length_delimeted(type : int, tag : int, bytes : PackedByteArray) -> PackedByteArray:
255 var result : PackedByteArray = pack_type_tag(type, tag)
256 result.append_array(pack_varint(bytes.size()))
257 result.append_array(bytes)
258 return result
259
260 static func pb_type_from_data_type(data_type : int) -> int:
261 if data_type == PB_DATA_TYPE.INT32 || data_type == PB_DATA_TYPE.SINT32 || data_type == PB_DATA_TYPE.UINT32 || data_type == PB_DATA_TYPE.INT64 || data_type == PB_DATA_TYPE.SINT64 || data_type == PB_DATA_TYPE.UINT64 || data_type == PB_DATA_TYPE.BOOL || data_type == PB_DATA_TYPE.ENUM:
262 return PB_TYPE.VARINT
263 elif data_type == PB_DATA_TYPE.FIXED32 || data_type == PB_DATA_TYPE.SFIXED32 || data_type == PB_DATA_TYPE.FLOAT:
264 return PB_TYPE.FIX32
265 elif data_type == PB_DATA_TYPE.FIXED64 || data_type == PB_DATA_TYPE.SFIXED64 || data_type == PB_DATA_TYPE.DOUBLE:
266 return PB_TYPE.FIX64
267 elif data_type == PB_DATA_TYPE.STRING || data_type == PB_DATA_TYPE.BYTES || data_type == PB_DATA_TYPE.MESSAGE || data_type == PB_DATA_TYPE.MAP:
268 return PB_TYPE.LENGTHDEL
269 else:
270 return PB_TYPE.UNDEFINED
271
272 static func pack_field(field : PBField) -> PackedByteArray:
273 var type : int = pb_type_from_data_type(field.type)
274 var type_copy : int = type
275 if field.rule == PB_RULE.REPEATED && field.option_packed:
276 type = PB_TYPE.LENGTHDEL
277 var head : PackedByteArray = pack_type_tag(type, field.tag)
278 var data : PackedByteArray = PackedByteArray()
279 if type == PB_TYPE.VARINT:
280 var value
281 if field.rule == PB_RULE.REPEATED:
282 for v in field.value:
283 data.append_array(head)
284 if field.type == PB_DATA_TYPE.SINT32 || field.type == PB_DATA_TYPE.SINT64:
285 value = convert_signed(v)
286 else:
287 value = v
288 data.append_array(pack_varint(value))
289 return data
290 else:
291 if field.type == PB_DATA_TYPE.SINT32 || field.type == PB_DATA_TYPE.SINT64:
292 value = convert_signed(field.value)
293 else:
294 value = field.value
295 data = pack_varint(value)
296 elif type == PB_TYPE.FIX32:
297 if field.rule == PB_RULE.REPEATED:
298 for v in field.value:
299 data.append_array(head)
300 data.append_array(pack_bytes(v, 4, field.type))
301 return data
302 else:
303 data.append_array(pack_bytes(field.value, 4, field.type))
304 elif type == PB_TYPE.FIX64:
305 if field.rule == PB_RULE.REPEATED:
306 for v in field.value:
307 data.append_array(head)
308 data.append_array(pack_bytes(v, 8, field.type))
309 return data
310 else:
311 data.append_array(pack_bytes(field.value, 8, field.type))
312 elif type == PB_TYPE.LENGTHDEL:
313 if field.rule == PB_RULE.REPEATED:
314 if type_copy == PB_TYPE.VARINT:
315 if field.type == PB_DATA_TYPE.SINT32 || field.type == PB_DATA_TYPE.SINT64:
316 var signed_value : int
317 for v in field.value:
318 signed_value = convert_signed(v)
319 data.append_array(pack_varint(signed_value))
320 else:
321 for v in field.value:
322 data.append_array(pack_varint(v))
323 return pack_length_delimeted(type, field.tag, data)
324 elif type_copy == PB_TYPE.FIX32:
325 for v in field.value:
326 data.append_array(pack_bytes(v, 4, field.type))
327 return pack_length_delimeted(type, field.tag, data)
328 elif type_copy == PB_TYPE.FIX64:
329 for v in field.value:
330 data.append_array(pack_bytes(v, 8, field.type))
331 return pack_length_delimeted(type, field.tag, data)
332 elif field.type == PB_DATA_TYPE.STRING:
333 for v in field.value:
334 var obj = v.to_utf8_buffer()
335 data.append_array(pack_length_delimeted(type, field.tag, obj))
336 return data
337 elif field.type == PB_DATA_TYPE.BYTES:
338 for v in field.value:
339 data.append_array(pack_length_delimeted(type, field.tag, v))
340 return data
341 elif typeof(field.value[0]) == TYPE_OBJECT:
342 for v in field.value:
343 var obj : PackedByteArray = v.to_bytes()
344 data.append_array(pack_length_delimeted(type, field.tag, obj))
345 return data
346 else:
347 if field.type == PB_DATA_TYPE.STRING:
348 var str_bytes : PackedByteArray = field.value.to_utf8_buffer()
349 if PROTO_VERSION == 2 || (PROTO_VERSION == 3 && str_bytes.size() > 0):
350 data.append_array(str_bytes)
351 return pack_length_delimeted(type, field.tag, data)
352 if field.type == PB_DATA_TYPE.BYTES:
353 if PROTO_VERSION == 2 || (PROTO_VERSION == 3 && field.value.size() > 0):
354 data.append_array(field.value)
355 return pack_length_delimeted(type, field.tag, data)
356 elif typeof(field.value) == TYPE_OBJECT:
357 var obj : PackedByteArray = field.value.to_bytes()
358 if obj.size() > 0:
359 data.append_array(obj)
360 return pack_length_delimeted(type, field.tag, data)
361 else:
362 pass
363 if data.size() > 0:
364 head.append_array(data)
365 return head
366 else:
367 return data
368
369 static func skip_unknown_field(bytes : PackedByteArray, offset : int, type : int) -> int:
370 if type == PB_TYPE.VARINT:
371 return offset + isolate_varint(bytes, offset).size()
372 if type == PB_TYPE.FIX64:
373 return offset + 8
374 if type == PB_TYPE.LENGTHDEL:
375 var length_bytes : PackedByteArray = isolate_varint(bytes, offset)
376 var length : int = unpack_varint(length_bytes)
377 return offset + length_bytes.size() + length
378 if type == PB_TYPE.FIX32:
379 return offset + 4
380 return PB_ERR.UNDEFINED_STATE
381
382 static func unpack_field(bytes : PackedByteArray, offset : int, field : PBField, type : int, message_func_ref) -> int:
383 if field.rule == PB_RULE.REPEATED && type != PB_TYPE.LENGTHDEL && field.option_packed:
384 var count = isolate_varint(bytes, offset)
385 if count.size() > 0:
386 offset += count.size()
387 count = unpack_varint(count)
388 if type == PB_TYPE.VARINT:
389 var val
390 var counter = offset + count
391 while offset < counter:
392 val = isolate_varint(bytes, offset)
393 if val.size() > 0:
394 offset += val.size()
395 val = unpack_varint(val)
396 if field.type == PB_DATA_TYPE.SINT32 || field.type == PB_DATA_TYPE.SINT64:
397 val = deconvert_signed(val)
398 elif field.type == PB_DATA_TYPE.BOOL:
399 if val:
400 val = true
401 else:
402 val = false
403 field.value.append(val)
404 else:
405 return PB_ERR.REPEATED_COUNT_MISMATCH
406 return offset
407 elif type == PB_TYPE.FIX32 || type == PB_TYPE.FIX64:
408 var type_size
409 if type == PB_TYPE.FIX32:
410 type_size = 4
411 else:
412 type_size = 8
413 var val
414 var counter = offset + count
415 while offset < counter:
416 if (offset + type_size) > bytes.size():
417 return PB_ERR.REPEATED_COUNT_MISMATCH
418 val = unpack_bytes(bytes, offset, type_size, field.type)
419 offset += type_size
420 field.value.append(val)
421 return offset
422 else:
423 return PB_ERR.REPEATED_COUNT_NOT_FOUND
424 else:
425 if type == PB_TYPE.VARINT:
426 var val = isolate_varint(bytes, offset)
427 if val.size() > 0:
428 offset += val.size()
429 val = unpack_varint(val)
430 if field.type == PB_DATA_TYPE.SINT32 || field.type == PB_DATA_TYPE.SINT64:
431 val = deconvert_signed(val)
432 elif field.type == PB_DATA_TYPE.BOOL:
433 if val:
434 val = true
435 else:
436 val = false
437 if field.rule == PB_RULE.REPEATED:
438 field.value.append(val)
439 else:
440 field.value = val
441 else:
442 return PB_ERR.VARINT_NOT_FOUND
443 return offset
444 elif type == PB_TYPE.FIX32 || type == PB_TYPE.FIX64:
445 var type_size
446 if type == PB_TYPE.FIX32:
447 type_size = 4
448 else:
449 type_size = 8
450 var val
451 if (offset + type_size) > bytes.size():
452 return PB_ERR.REPEATED_COUNT_MISMATCH
453 val = unpack_bytes(bytes, offset, type_size, field.type)
454 offset += type_size
455 if field.rule == PB_RULE.REPEATED:
456 field.value.append(val)
457 else:
458 field.value = val
459 return offset
460 elif type == PB_TYPE.LENGTHDEL:
461 var inner_size = isolate_varint(bytes, offset)
462 if inner_size.size() > 0:
463 offset += inner_size.size()
464 inner_size = unpack_varint(inner_size)
465 if inner_size >= 0:
466 if inner_size + offset > bytes.size():
467 return PB_ERR.LENGTHDEL_SIZE_MISMATCH
468 if message_func_ref != null:
469 var message = message_func_ref.call()
470 if inner_size > 0:
471 var sub_offset = message.from_bytes(bytes, offset, inner_size + offset)
472 if sub_offset > 0:
473 if sub_offset - offset >= inner_size:
474 offset = sub_offset
475 return offset
476 else:
477 return PB_ERR.LENGTHDEL_SIZE_MISMATCH
478 return sub_offset
479 else:
480 return offset
481 elif field.type == PB_DATA_TYPE.STRING:
482 var str_bytes : PackedByteArray = bytes.slice(offset, inner_size + offset)
483 if field.rule == PB_RULE.REPEATED:
484 field.value.append(str_bytes.get_string_from_utf8())
485 else:
486 field.value = str_bytes.get_string_from_utf8()
487 return offset + inner_size
488 elif field.type == PB_DATA_TYPE.BYTES:
489 var val_bytes : PackedByteArray = bytes.slice(offset, inner_size + offset)
490 if field.rule == PB_RULE.REPEATED:
491 field.value.append(val_bytes)
492 else:
493 field.value = val_bytes
494 return offset + inner_size
495 else:
496 return PB_ERR.LENGTHDEL_SIZE_NOT_FOUND
497 else:
498 return PB_ERR.LENGTHDEL_SIZE_NOT_FOUND
499 return PB_ERR.UNDEFINED_STATE
500
501 static func unpack_message(data, bytes : PackedByteArray, offset : int, limit : int) -> int:
502 while true:
503 var tt : PBTypeTag = unpack_type_tag(bytes, offset)
504 if tt.ok:
505 offset += tt.offset
506 if data.has(tt.tag):
507 var service : PBServiceField = data[tt.tag]
508 var type : int = pb_type_from_data_type(service.field.type)
509 if type == tt.type || (tt.type == PB_TYPE.LENGTHDEL && service.field.rule == PB_RULE.REPEATED && service.field.option_packed):
510 var res : int = unpack_field(bytes, offset, service.field, type, service.func_ref)
511 if res > 0:
512 service.state = PB_SERVICE_STATE.FILLED
513 offset = res
514 if offset == limit:
515 return offset
516 elif offset > limit:
517 return PB_ERR.PACKAGE_SIZE_MISMATCH
518 elif res < 0:
519 return res
520 else:
521 break
522 else:
523 var res : int = skip_unknown_field(bytes, offset, tt.type)
524 if res > 0:
525 offset = res
526 if offset == limit:
527 return offset
528 elif offset > limit:
529 return PB_ERR.PACKAGE_SIZE_MISMATCH
530 elif res < 0:
531 return res
532 else:
533 break
534 else:
535 return offset
536 return PB_ERR.UNDEFINED_STATE
537
538 static func pack_message(data) -> PackedByteArray:
539 var DEFAULT_VALUES
540 if PROTO_VERSION == 2:
541 DEFAULT_VALUES = DEFAULT_VALUES_2
542 elif PROTO_VERSION == 3:
543 DEFAULT_VALUES = DEFAULT_VALUES_3
544 var result : PackedByteArray = PackedByteArray()
545 var keys : Array = data.keys()
546 keys.sort()
547 for i in keys:
548 if data[i].field.value != null:
549 if data[i].state == PB_SERVICE_STATE.UNFILLED \
550 && !data[i].field.is_map_field \
551 && typeof(data[i].field.value) == typeof(DEFAULT_VALUES[data[i].field.type]) \
552 && data[i].field.value == DEFAULT_VALUES[data[i].field.type]:
553 continue
554 elif data[i].field.rule == PB_RULE.REPEATED && data[i].field.value.size() == 0:
555 continue
556 result.append_array(pack_field(data[i].field))
557 elif data[i].field.rule == PB_RULE.REQUIRED:
558 print("Error: required field is not filled: Tag:", data[i].field.tag)
559 return PackedByteArray()
560 return result
561
562 static func check_required(data) -> bool:
563 var keys : Array = data.keys()
564 for i in keys:
565 if data[i].field.rule == PB_RULE.REQUIRED && data[i].state == PB_SERVICE_STATE.UNFILLED:
566 return false
567 return true
568
569 static func construct_map(key_values):
570 var result = {}
571 for kv in key_values:
572 result[kv.get_key()] = kv.get_value()
573 return result
574
575 static func tabulate(text : String, nesting : int) -> String:
576 var tab : String = ""
577 for _i in range(nesting):
578 tab += DEBUG_TAB
579 return tab + text
580
581 static func value_to_string(value, field : PBField, nesting : int) -> String:
582 var result : String = ""
583 var text : String
584 if field.type == PB_DATA_TYPE.MESSAGE:
585 result += "{"
586 nesting += 1
587 text = message_to_string(value.data, nesting)
588 if text != "":
589 result += "\n" + text
590 nesting -= 1
591 result += tabulate("}", nesting)
592 else:
593 nesting -= 1
594 result += "}"
595 elif field.type == PB_DATA_TYPE.BYTES:
596 result += "<"
597 for i in range(value.size()):
598 result += str(value[i])
599 if i != (value.size() - 1):
600 result += ", "
601 result += ">"
602 elif field.type == PB_DATA_TYPE.STRING:
603 result += "\"" + value + "\""
604 elif field.type == PB_DATA_TYPE.ENUM:
605 result += "ENUM::" + str(value)
606 else:
607 result += str(value)
608 return result
609
610 static func field_to_string(field : PBField, nesting : int) -> String:
611 var result : String = tabulate(field.name + ": ", nesting)
612 if field.type == PB_DATA_TYPE.MAP:
613 if field.value.size() > 0:
614 result += "(\n"
615 nesting += 1
616 for i in range(field.value.size()):
617 var local_key_value = field.value[i].data[1].field
618 result += tabulate(value_to_string(local_key_value.value, local_key_value, nesting), nesting) + ": "
619 local_key_value = field.value[i].data[2].field
620 result += value_to_string(local_key_value.value, local_key_value, nesting)
621 if i != (field.value.size() - 1):
622 result += ","
623 result += "\n"
624 nesting -= 1
625 result += tabulate(")", nesting)
626 else:
627 result += "()"
628 elif field.rule == PB_RULE.REPEATED:
629 if field.value.size() > 0:
630 result += "[\n"
631 nesting += 1
632 for i in range(field.value.size()):
633 result += tabulate(str(i) + ": ", nesting)
634 result += value_to_string(field.value[i], field, nesting)
635 if i != (field.value.size() - 1):
636 result += ","
637 result += "\n"
638 nesting -= 1
639 result += tabulate("]", nesting)
640 else:
641 result += "[]"
642 else:
643 result += value_to_string(field.value, field, nesting)
644 result += ";\n"
645 return result
646
647 static func message_to_string(data, nesting : int = 0) -> String:
648 var DEFAULT_VALUES
649 if PROTO_VERSION == 2:
650 DEFAULT_VALUES = DEFAULT_VALUES_2
651 elif PROTO_VERSION == 3:
652 DEFAULT_VALUES = DEFAULT_VALUES_3
653 var result : String = ""
654 var keys : Array = data.keys()
655 keys.sort()
656 for i in keys:
657 if data[i].field.value != null:
658 if data[i].state == PB_SERVICE_STATE.UNFILLED \
659 && !data[i].field.is_map_field \
660 && typeof(data[i].field.value) == typeof(DEFAULT_VALUES[data[i].field.type]) \
661 && data[i].field.value == DEFAULT_VALUES[data[i].field.type]:
662 continue
663 elif data[i].field.rule == PB_RULE.REPEATED && data[i].field.value.size() == 0:
664 continue
665 result += field_to_string(data[i].field, nesting)
666 elif data[i].field.rule == PB_RULE.REQUIRED:
667 result += data[i].field.name + ": " + "error"
668 return result
diff --git a/vendor/godobuf/addons/protobuf/protobuf_util.gd b/vendor/godobuf/addons/protobuf/protobuf_util.gd new file mode 100644 index 0000000..5941cb8 --- /dev/null +++ b/vendor/godobuf/addons/protobuf/protobuf_util.gd
@@ -0,0 +1,46 @@
1#
2# BSD 3-Clause License
3#
4# Copyright (c) 2018, Oleg Malyavkin
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions are met:
9#
10# * Redistributions of source code must retain the above copyright notice, this
11# list of conditions and the following disclaimer.
12#
13# * Redistributions in binary form must reproduce the above copyright notice,
14# this list of conditions and the following disclaimer in the documentation
15# and/or other materials provided with the distribution.
16#
17# * Neither the name of the copyright holder nor the names of its
18# contributors may be used to endorse or promote products derived from
19# this software without specific prior written permission.
20#
21# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32static func extract_dir(file_path):
33 var parts = file_path.split("/", false)
34 parts.remove_at(parts.size() - 1)
35 var path
36 if file_path.begins_with("/"):
37 path = "/"
38 else:
39 path = ""
40 for part in parts:
41 path += part + "/"
42 return path
43
44static func extract_filename(file_path):
45 var parts = file_path.split("/", false)
46 return parts[parts.size() - 1]
diff --git a/vendor/godobuf/default_env.tres b/vendor/godobuf/default_env.tres new file mode 100644 index 0000000..20207a4 --- /dev/null +++ b/vendor/godobuf/default_env.tres
@@ -0,0 +1,7 @@
1[gd_resource type="Environment" load_steps=2 format=2]
2
3[sub_resource type="ProceduralSky" id=1]
4
5[resource]
6background_mode = 2
7background_sky = SubResource( 1 )
diff --git a/vendor/godobuf/logo.png b/vendor/godobuf/logo.png new file mode 100644 index 0000000..4ff9029 --- /dev/null +++ b/vendor/godobuf/logo.png
Binary files differ
diff --git a/vendor/godobuf/logo.png.import b/vendor/godobuf/logo.png.import new file mode 100644 index 0000000..43df7a6 --- /dev/null +++ b/vendor/godobuf/logo.png.import
@@ -0,0 +1,35 @@
1[remap]
2
3importer="texture"
4type="StreamTexture"
5path="res://.import/logo.png-cca8726399059c8d4f806e28e356b14d.stex"
6metadata={
7"vram_texture": false
8}
9
10[deps]
11
12source_file="res://logo.png"
13dest_files=[ "res://.import/logo.png-cca8726399059c8d4f806e28e356b14d.stex" ]
14
15[params]
16
17compress/mode=0
18compress/lossy_quality=0.7
19compress/hdr_mode=0
20compress/bptc_ldr=0
21compress/normal_map=0
22flags/repeat=0
23flags/filter=true
24flags/mipmaps=false
25flags/anisotropic=false
26flags/srgb=2
27process/fix_alpha_border=true
28process/premult_alpha=false
29process/HDR_as_SRGB=false
30process/invert_color=false
31process/normal_map_invert_y=false
32stream=false
33size_limit=0
34detect_3d=true
35svg/scale=1.0
diff --git a/vendor/godobuf/project.godot b/vendor/godobuf/project.godot new file mode 100644 index 0000000..8cef0a4 --- /dev/null +++ b/vendor/godobuf/project.godot
@@ -0,0 +1,26 @@
1; Engine configuration file.
2; It's best edited using the editor UI and not directly,
3; since the parameters that go here are not all obvious.
4;
5; Format:
6; [section] ; section goes between []
7; param=value ; assign values to parameters
8
9config_version=4
10
11_global_script_classes=[ ]
12_global_script_class_icons={
13}
14
15[application]
16
17config/name="Protobuf Plugin"
18config/icon="res://logo.png"
19
20[editor_plugins]
21
22enabled=PoolStringArray( "res://addons/protobuf/plugin.cfg" )
23
24[rendering]
25
26environment/default_environment="res://default_env.tres"