The Witness: Big™ new™ content update™ (#2114)

Co-authored-by: blastron <blastron@mac.com>
Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
This commit is contained in:
NewSoupVi 2023-11-24 06:27:03 +01:00 committed by GitHub
parent 205c6acb49
commit e93842a52c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
45 changed files with 2230 additions and 1689 deletions

View File

@ -1,23 +1,25 @@
from typing import Dict, Union from dataclasses import dataclass
from BaseClasses import MultiWorld from Options import Toggle, DefaultOnToggle, Range, Choice, PerGameCommonOptions
from Options import Toggle, DefaultOnToggle, Range, Choice
# class HardMode(Toggle):
# "Play the randomizer in hardmode"
# display_name = "Hard Mode"
class DisableNonRandomizedPuzzles(Toggle): class DisableNonRandomizedPuzzles(Toggle):
"""Disables puzzles that cannot be randomized. """Disables puzzles that cannot be randomized.
This includes many puzzles that heavily involve the environment, such as Shadows, Monastery or Orchard. This includes many puzzles that heavily involve the environment, such as Shadows, Monastery or Orchard.
The lasers for those areas will be activated as you solve optional puzzles throughout the island.""" The lasers for those areas will activate as you solve optional puzzles, such as Discarded Panels.
Additionally, the panels activating Monastery Laser and Jungle Popup Wall will be on from the start."""
display_name = "Disable non randomized puzzles" display_name = "Disable non randomized puzzles"
class EarlySecretArea(Toggle): class EarlyCaves(Choice):
"""Opens the Mountainside shortcut to the Caves from the start. """Adds an item that opens the Caves Shortcuts to Swamp and Mountain,
(Otherwise known as "UTM", "Caves" or the "Challenge Area")""" allowing early access to the Caves even if you are not playing a remote Door Shuffle mode.
You can either add this item to the pool to be found on one of your randomized checks,
or you can outright start with it and have immediate access to the Caves.
If you choose "add_to_pool" and you are already playing a remote Door Shuffle mode, this setting will do nothing."""
display_name = "Early Caves" display_name = "Early Caves"
option_off = 0
option_add_to_pool = 1
option_starting_inventory = 2
class ShuffleSymbols(DefaultOnToggle): class ShuffleSymbols(DefaultOnToggle):
@ -34,27 +36,41 @@ class ShuffleLasers(Toggle):
class ShuffleDoors(Choice): class ShuffleDoors(Choice):
"""If on, opening doors will require their respective "keys". """If on, opening doors, moving bridges etc. will require a "key".
If set to "panels", those keys will unlock the panels on doors. If set to "panels", the panel on the door will be locked until receiving its corresponding key.
In "doors_simple" and "doors_complex", the doors will magically open by themselves upon receiving the key. If set to "doors", the door will open immediately upon receiving its key. Door panels are added as location checks.
The last option, "max", is a combination of "doors_complex" and "panels".""" "Mixed" includes all doors from "doors", and all control panels (bridges, elevators etc.) from "panels"."""
display_name = "Shuffle Doors" display_name = "Shuffle Doors"
option_none = 0 option_off = 0
option_panels = 1 option_panels = 1
option_doors_simple = 2 option_doors = 2
option_doors_complex = 3 option_mixed = 3
option_max = 4
class DoorGroupings(Choice):
"""If set to "none", there will be one key for every door, resulting in up to 120 keys being added to the item pool.
If set to "regional", all doors in the same general region will open at once with a single key,
reducing the amount of door items and complexity."""
display_name = "Door Groupings"
option_off = 0
option_regional = 1
class ShuffleBoat(DefaultOnToggle):
"""If set, adds a "Boat" item to the item pool. Before receiving this item, you will not be able to use the boat."""
display_name = "Shuffle Boat"
class ShuffleDiscardedPanels(Toggle): class ShuffleDiscardedPanels(Toggle):
"""Add Discarded Panels into the location pool. """Add Discarded Panels into the location pool.
Solving certain Discarded Panels may still be necessary to beat the game, even if this is off.""" Solving certain Discarded Panels may still be necessary to beat the game, even if this is off - The main example
of this being the alternate activation triggers in disable_non_randomized."""
display_name = "Shuffle Discarded Panels" display_name = "Shuffle Discarded Panels"
class ShuffleVaultBoxes(Toggle): class ShuffleVaultBoxes(Toggle):
"""Vault Boxes will have items on them.""" """Add Vault Boxes to the location pool."""
display_name = "Shuffle Vault Boxes" display_name = "Shuffle Vault Boxes"
@ -132,6 +148,12 @@ class ChallengeLasers(Range):
default = 11 default = 11
class ElevatorsComeToYou(Toggle):
"""If true, the Quarry Elevator, Bunker Elevator and Swamp Long Bridge will "come to you" if you approach them.
This does actually affect logic as it allows unintended backwards / early access into these areas."""
display_name = "All Bridges & Elevators come to you"
class TrapPercentage(Range): class TrapPercentage(Range):
"""Replaces junk items with traps, at the specified rate.""" """Replaces junk items with traps, at the specified rate."""
display_name = "Trap Percentage" display_name = "Trap Percentage"
@ -150,8 +172,8 @@ class PuzzleSkipAmount(Range):
class HintAmount(Range): class HintAmount(Range):
"""Adds hints to Audio Logs. Hints will have the same number of duplicates, as many as will fit. Remaining Audio """Adds hints to Audio Logs. If set to a low amount, up to 2 additional duplicates of each hint will be added.
Logs will have junk hints.""" Remaining Audio Logs will have junk hints."""
display_name = "Hints on Audio Logs" display_name = "Hints on Audio Logs"
range_start = 0 range_start = 0
range_end = 49 range_end = 49
@ -164,38 +186,26 @@ class DeathLink(Toggle):
display_name = "Death Link" display_name = "Death Link"
the_witness_options: Dict[str, type] = { @dataclass
"puzzle_randomization": PuzzleRandomization, class TheWitnessOptions(PerGameCommonOptions):
"shuffle_symbols": ShuffleSymbols, puzzle_randomization: PuzzleRandomization
"shuffle_doors": ShuffleDoors, shuffle_symbols: ShuffleSymbols
"shuffle_lasers": ShuffleLasers, shuffle_doors: ShuffleDoors
"disable_non_randomized_puzzles": DisableNonRandomizedPuzzles, door_groupings: DoorGroupings
"shuffle_discarded_panels": ShuffleDiscardedPanels, shuffle_boat: ShuffleBoat
"shuffle_vault_boxes": ShuffleVaultBoxes, shuffle_lasers: ShuffleLasers
"shuffle_EPs": ShuffleEnvironmentalPuzzles, disable_non_randomized_puzzles: DisableNonRandomizedPuzzles
"EP_difficulty": EnvironmentalPuzzlesDifficulty, shuffle_discarded_panels: ShuffleDiscardedPanels
"shuffle_postgame": ShufflePostgame, shuffle_vault_boxes: ShuffleVaultBoxes
"victory_condition": VictoryCondition, shuffle_EPs: ShuffleEnvironmentalPuzzles
"mountain_lasers": MountainLasers, EP_difficulty: EnvironmentalPuzzlesDifficulty
"challenge_lasers": ChallengeLasers, shuffle_postgame: ShufflePostgame
"early_secret_area": EarlySecretArea, victory_condition: VictoryCondition
"trap_percentage": TrapPercentage, mountain_lasers: MountainLasers
"puzzle_skip_amount": PuzzleSkipAmount, challenge_lasers: ChallengeLasers
"hint_amount": HintAmount, early_caves: EarlyCaves
"death_link": DeathLink, elevators_come_to_you: ElevatorsComeToYou
} trap_percentage: TrapPercentage
puzzle_skip_amount: PuzzleSkipAmount
hint_amount: HintAmount
def is_option_enabled(world: MultiWorld, player: int, name: str) -> bool: death_link: DeathLink
return get_option_value(world, player, name) > 0
def get_option_value(world: MultiWorld, player: int, name: str) -> Union[bool, int]:
option = getattr(world, name, None)
if option is None:
return 0
if issubclass(the_witness_options[name], Toggle) or issubclass(the_witness_options[name], DefaultOnToggle):
return bool(option[player].value)
return option[player].value

View File

@ -37,22 +37,42 @@ Jokes:
Doors: Doors:
1100 - Glass Factory Entry (Panel) - 0x01A54 1100 - Glass Factory Entry (Panel) - 0x01A54
1101 - Tutorial Outpost Entry (Panel) - 0x0A171
1102 - Tutorial Outpost Exit (Panel) - 0x04CA4
1105 - Symmetry Island Lower (Panel) - 0x000B0 1105 - Symmetry Island Lower (Panel) - 0x000B0
1107 - Symmetry Island Upper (Panel) - 0x1C349 1107 - Symmetry Island Upper (Panel) - 0x1C349
1110 - Desert Light Room Entry (Panel) - 0x0C339 1110 - Desert Light Room Entry (Panel) - 0x0C339
1111 - Desert Flood Controls (Panel) - 0x1C2DF,0x1831E,0x1C260,0x1831C,0x1C2F3,0x1831D,0x1C2B1,0x1831B 1111 - Desert Flood Controls (Panel) - 0x1C2DF,0x1831E,0x1C260,0x1831C,0x1C2F3,0x1831D,0x1C2B1,0x1831B
1112 - Desert Light Control (Panel) - 0x09FAA
1113 - Desert Flood Room Entry (Panel) - 0x0A249
1115 - Quarry Elevator Control (Panel) - 0x17CC4
1117 - Quarry Entry 1 (Panel) - 0x09E57
1118 - Quarry Entry 2 (Panel) - 0x17C09
1119 - Quarry Stoneworks Entry (Panel) - 0x01E5A,0x01E59 1119 - Quarry Stoneworks Entry (Panel) - 0x01E5A,0x01E59
1120 - Quarry Stoneworks Ramp Controls (Panel) - 0x03678,0x03676 1120 - Quarry Stoneworks Ramp Controls (Panel) - 0x03678,0x03676
1122 - Quarry Stoneworks Lift Controls (Panel) - 0x03679,0x03675 1122 - Quarry Stoneworks Lift Controls (Panel) - 0x03679,0x03675
1125 - Quarry Boathouse Ramp Height Control (Panel) - 0x03852 1125 - Quarry Boathouse Ramp Height Control (Panel) - 0x03852
1127 - Quarry Boathouse Ramp Horizontal Control (Panel) - 0x03858 1127 - Quarry Boathouse Ramp Horizontal Control (Panel) - 0x03858
1129 - Quarry Boathouse Hook Control (Panel) - 0x275FA
1131 - Shadows Door Timer (Panel) - 0x334DB,0x334DC 1131 - Shadows Door Timer (Panel) - 0x334DB,0x334DC
1140 - Keep Hedge Maze 1 (Panel) - 0x00139
1142 - Keep Hedge Maze 2 (Panel) - 0x019DC
1144 - Keep Hedge Maze 3 (Panel) - 0x019E7
1146 - Keep Hedge Maze 4 (Panel) - 0x01A0F
1150 - Monastery Entry Left (Panel) - 0x00B10 1150 - Monastery Entry Left (Panel) - 0x00B10
1151 - Monastery Entry Right (Panel) - 0x00C92 1151 - Monastery Entry Right (Panel) - 0x00C92
1162 - Town Tinted Glass Door (Panel) - 0x28998 1156 - Monastery Shutters Control (Panel) - 0x09D9B
1162 - Town RGB House Entry (Panel) - 0x28998
1163 - Town Church Entry (Panel) - 0x28A0D 1163 - Town Church Entry (Panel) - 0x28A0D
1166 - Town Maze Panel (Drop-Down Staircase) (Panel) - 0x28A79 1164 - Town RGB Control (Panel) - 0x334D8
1169 - Windmill Entry (Panel) - 0x17F5F 1166 - Town Maze Stairs (Panel) - 0x28A79
1167 - Town Maze Rooftop Bridge (Panel) - 0x2896A
1169 - Town Windmill Entry (Panel) - 0x17F5F
1172 - Town Cargo Box Entry (Panel) - 0x0A0C8
1182 - Windmill Turn Control (Panel) - 0x17D02
1184 - Theater Entry (Panel) - 0x17F89
1185 - Theater Video Input (Panel) - 0x00815
1189 - Theater Exit (Panel) - 0x0A168,0x33AB2
1200 - Treehouse First & Second Doors (Panel) - 0x0288C,0x02886 1200 - Treehouse First & Second Doors (Panel) - 0x0288C,0x02886
1202 - Treehouse Third Door (Panel) - 0x0A182 1202 - Treehouse Third Door (Panel) - 0x0A182
1205 - Treehouse Laser House Door Timer (Panel) - 0x2700B,0x17CBC 1205 - Treehouse Laser House Door Timer (Panel) - 0x2700B,0x17CBC
@ -61,10 +81,24 @@ Doors:
1180 - Bunker Entry (Panel) - 0x17C2E 1180 - Bunker Entry (Panel) - 0x17C2E
1183 - Bunker Tinted Glass Door (Panel) - 0x0A099 1183 - Bunker Tinted Glass Door (Panel) - 0x0A099
1186 - Bunker Elevator Control (Panel) - 0x0A079 1186 - Bunker Elevator Control (Panel) - 0x0A079
1188 - Bunker Drop-Down Door Controls (Panel) - 0x34BC5,0x34BC6
1190 - Swamp Entry (Panel) - 0x0056E 1190 - Swamp Entry (Panel) - 0x0056E
1192 - Swamp Sliding Bridge (Panel) - 0x00609,0x18488 1192 - Swamp Sliding Bridge (Panel) - 0x00609,0x18488
1194 - Swamp Platform Shortcut (Panel) - 0x17C0D
1195 - Swamp Rotating Bridge (Panel) - 0x181F5 1195 - Swamp Rotating Bridge (Panel) - 0x181F5
1197 - Swamp Maze Control (Panel) - 0x17C0A,0x17E07 1196 - Swamp Long Bridge (Panel) - 0x17E2B
1197 - Swamp Maze Controls (Panel) - 0x17C0A,0x17E07
1220 - Mountain Floor 1 Light Bridge (Panel) - 0x09E39
1225 - Mountain Floor 2 Light Bridge Near (Panel) - 0x09E86
1230 - Mountain Floor 2 Light Bridge Far (Panel) - 0x09ED8
1235 - Mountain Floor 2 Elevator Control (Panel) - 0x09EEB
1240 - Caves Entry (Panel) - 0x00FF8
1242 - Caves Elevator Controls (Panel) - 0x335AB,0x335AC,0x3369D
1245 - Challenge Entry (Panel) - 0x0A16E
1250 - Tunnels Entry (Panel) - 0x039B4
1255 - Tunnels Town Shortcut (Panel) - 0x09E85
1310 - Boat - 0x17CDF,0x17CC8,0x17CA6,0x09DB8,0x17C95,0x0A054 1310 - Boat - 0x17CDF,0x17CC8,0x17CA6,0x09DB8,0x17C95,0x0A054
1400 - Caves Mountain Shortcut (Door) - 0x2D73F 1400 - Caves Mountain Shortcut (Door) - 0x2D73F
@ -82,6 +116,7 @@ Doors:
1624 - Desert Pond Room Entry (Door) - 0x0C2C3 1624 - Desert Pond Room Entry (Door) - 0x0C2C3
1627 - Desert Flood Room Entry (Door) - 0x0A24B 1627 - Desert Flood Room Entry (Door) - 0x0A24B
1630 - Desert Elevator Room Entry (Door) - 0x0C316 1630 - Desert Elevator Room Entry (Door) - 0x0C316
1631 - Desert Elevator (Door) - 0x01317
1633 - Quarry Entry 1 (Door) - 0x09D6F 1633 - Quarry Entry 1 (Door) - 0x09D6F
1636 - Quarry Entry 2 (Door) - 0x17C07 1636 - Quarry Entry 2 (Door) - 0x17C07
1639 - Quarry Stoneworks Entry (Door) - 0x02010 1639 - Quarry Stoneworks Entry (Door) - 0x02010
@ -109,13 +144,13 @@ Doors:
1699 - Keep Pressure Plates 4 Exit (Door) - 0x01D40 1699 - Keep Pressure Plates 4 Exit (Door) - 0x01D40
1702 - Keep Shadows Shortcut (Door) - 0x09E3D 1702 - Keep Shadows Shortcut (Door) - 0x09E3D
1705 - Keep Tower Shortcut (Door) - 0x04F8F 1705 - Keep Tower Shortcut (Door) - 0x04F8F
1708 - Monastery Shortcut (Door) - 0x0364E 1708 - Monastery Laser Shortcut (Door) - 0x0364E
1711 - Monastery Entry Inner (Door) - 0x0C128 1711 - Monastery Entry Inner (Door) - 0x0C128
1714 - Monastery Entry Outer (Door) - 0x0C153 1714 - Monastery Entry Outer (Door) - 0x0C153
1717 - Monastery Garden Entry (Door) - 0x03750 1717 - Monastery Garden Entry (Door) - 0x03750
1718 - Town Cargo Box Entry (Door) - 0x0A0C9 1718 - Town Cargo Box Entry (Door) - 0x0A0C9
1720 - Town Wooden Roof Stairs (Door) - 0x034F5 1720 - Town Wooden Roof Stairs (Door) - 0x034F5
1723 - Town Tinted Glass Door - 0x28A61 1723 - Town RGB House Entry (Door) - 0x28A61
1726 - Town Church Entry (Door) - 0x03BB0 1726 - Town Church Entry (Door) - 0x03BB0
1729 - Town Maze Stairs (Door) - 0x28AA2 1729 - Town Maze Stairs (Door) - 0x28AA2
1732 - Town Windmill Entry (Door) - 0x1845B 1732 - Town Windmill Entry (Door) - 0x1845B
@ -129,7 +164,7 @@ Doors:
1756 - Theater Exit Right (Door) - 0x3CCDF 1756 - Theater Exit Right (Door) - 0x3CCDF
1759 - Jungle Bamboo Laser Shortcut (Door) - 0x3873B 1759 - Jungle Bamboo Laser Shortcut (Door) - 0x3873B
1760 - Jungle Popup Wall (Door) - 0x1475B 1760 - Jungle Popup Wall (Door) - 0x1475B
1762 - River Monastery Shortcut (Door) - 0x0CF2A 1762 - River Monastery Garden Shortcut (Door) - 0x0CF2A
1765 - Bunker Entry (Door) - 0x0C2A4 1765 - Bunker Entry (Door) - 0x0C2A4
1768 - Bunker Tinted Glass Door - 0x17C79 1768 - Bunker Tinted Glass Door - 0x17C79
1771 - Bunker UV Room Entry (Door) - 0x0C2A3 1771 - Bunker UV Room Entry (Door) - 0x0C2A3
@ -166,36 +201,66 @@ Doors:
1870 - Tunnels Town Shortcut (Door) - 0x09E87 1870 - Tunnels Town Shortcut (Door) - 0x09E87
1903 - Outside Tutorial Outpost Doors - 0x03BA2,0x0A170,0x04CA3 1903 - Outside Tutorial Outpost Doors - 0x03BA2,0x0A170,0x04CA3
1904 - Glass Factory Doors - 0x0D7ED,0x01A29
1906 - Symmetry Island Doors - 0x17F3E,0x18269 1906 - Symmetry Island Doors - 0x17F3E,0x18269
1909 - Orchard Gates - 0x03313,0x03307 1909 - Orchard Gates - 0x03313,0x03307
1912 - Desert Doors - 0x09FEE,0x0C2C3,0x0A24B,0x0C316 1912 - Desert Doors & Elevator - 0x09FEE,0x0C2C3,0x0A24B,0x0C316,0x01317
1915 - Quarry Main Entry - 0x09D6F,0x17C07 1915 - Quarry Entry Doors - 0x09D6F,0x17C07
1918 - Quarry Stoneworks Shortcuts - 0x17CE8,0x0368A,0x275FF 1918 - Quarry Stoneworks Doors - 0x02010,0x275FF,0x17CE8,0x0368A
1921 - Quarry Boathouse Barriers - 0x17C50,0x3865F 1921 - Quarry Boathouse Doors - 0x17C50,0x3865F,0x2769B,0x27163
1924 - Shadows Laser Room Door - 0x194B2,0x19665 1924 - Shadows Laser Room Doors - 0x194B2,0x19665
1927 - Shadows Barriers - 0x19865,0x0A2DF,0x1855B,0x19ADE 1927 - Shadows Lower Doors - 0x19865,0x0A2DF,0x1855B,0x19ADE,0x19B24
1930 - Keep Hedge Maze Doors - 0x01954,0x018CE,0x019D8,0x019B5,0x019E6,0x0199A,0x01A0E 1930 - Keep Hedge Maze Doors - 0x01954,0x018CE,0x019D8,0x019B5,0x019E6,0x0199A,0x01A0E
1933 - Keep Pressure Plates Doors - 0x01BEC,0x01BEA,0x01CD5,0x01D40 1933 - Keep Pressure Plates Doors - 0x01BEC,0x01BEA,0x01CD5,0x01D40
1936 - Keep Shortcuts - 0x09E3D,0x04F8F 1936 - Keep Shortcuts - 0x09E3D,0x04F8F
1939 - Monastery Entry - 0x0C128,0x0C153 1939 - Monastery Entry Doors - 0x0C128,0x0C153
1942 - Monastery Shortcuts - 0x0364E,0x03750 1942 - Monastery Shortcuts - 0x0364E,0x03750,0x0CF2A
1945 - Town Doors - 0x0A0C9,0x034F5,0x28A61,0x03BB0,0x28AA2,0x1845B,0x2897B 1945 - Town Doors - 0x0A0C9,0x034F5,0x28A61,0x03BB0,0x28AA2,0x2897B
1948 - Town Tower Doors - 0x27798,0x27799,0x2779A,0x2779C 1948 - Town Tower Doors - 0x27798,0x27799,0x2779A,0x2779C
1951 - Theater Exit - 0x0A16D,0x3CCDF 1951 - Windmill & Theater Doors - 0x0A16D,0x3CCDF,0x1845B,0x17F88
1954 - Jungle & River Shortcuts - 0x3873B,0x0CF2A 1954 - Jungle Doors - 0x3873B,0x1475B
1957 - Bunker Doors - 0x0C2A4,0x17C79,0x0C2A3,0x0A08D 1957 - Bunker Doors - 0x0C2A4,0x17C79,0x0C2A3,0x0A08D
1960 - Swamp Doors - 0x00C1C,0x184B7,0x38AE6,0x18507 1960 - Swamp Doors - 0x00C1C,0x184B7,0x18507
1961 - Swamp Shortcuts - 0x38AE6,0x2D880
1963 - Swamp Water Pumps - 0x04B7F,0x183F2,0x305D5,0x18482,0x0A1D6 1963 - Swamp Water Pumps - 0x04B7F,0x183F2,0x305D5,0x18482,0x0A1D6
1966 - Treehouse Entry Doors - 0x0C309,0x0C310,0x0A181 1966 - Treehouse Entry Doors - 0x0C309,0x0C310,0x0A181
1975 - Mountain Floor 2 Stairs & Doors - 0x09FFB,0x09EDD,0x09E07 1969 - Treehouse Upper Doors - 0x0C323,0x0C32D
1978 - Mountain Bottom Floor Doors to Caves - 0x17F33,0x2D77D 1975 - Mountain Floor 1 & 2 Doors - 0x09E54,0x09FFB,0x09EDD,0x09E07
1981 - Caves Doors to Challenge - 0x019A5,0x0A19A 1978 - Mountain Bottom Floor Doors - 0x0C141,0x17F33,0x09F89
1984 - Caves Exits to Main Island - 0x2D859,0x2D73F 1981 - Caves Doors - 0x019A5,0x0A19A,0x2D77D
1987 - Tunnels Doors - 0x27739,0x27263,0x09E87 1984 - Caves Shortcuts - 0x2D859,0x2D73F
1987 - Tunnels Doors - 0x27739,0x27263,0x09E87,0x0348A
2000 - Desert Control Panels - 0x09FAA,0x1C2DF,0x1831E,0x1C260,0x1831C,0x1C2F3,0x1831D,0x1C2B1,0x1831B
2005 - Quarry Stoneworks Control Panels - 0x03678,0x03676,0x03679,0x03675
2010 - Quarry Boathouse Control Panels - 0x03852,0x03858,0x275FA
2015 - Town Control Panels - 0x2896A,0x334D8
2020 - Windmill & Theater Control Panels - 0x17D02,0x00815
2025 - Bunker Control Panels - 0x34BC5,0x34BC6,0x0A079
2030 - Swamp Control Panels - 0x00609,0x18488,0x181F5,0x17E2B,0x17C0A,0x17E07
2035 - Mountain & Caves Control Panels - 0x09ED8,0x09E86,0x09E39,0x09EEB,0x335AB,0x335AC,0x3369D
2100 - Symmetry Island Panels - 0x1C349,0x000B0
2101 - Tutorial Outpost Panels - 0x0A171,0x04CA4
2105 - Desert Panels - 0x09FAA,0x1C2DF,0x1831E,0x1C260,0x1831C,0x1C2F3,0x1831D,0x1C2B1,0x1831B,0x0C339,0x0A249
2110 - Quarry Outside Panels - 0x17C09,0x09E57,0x17CC4
2115 - Quarry Stoneworks Panels - 0x01E5A,0x01E59,0x03678,0x03676,0x03679,0x03675
2120 - Quarry Boathouse Panels - 0x03852,0x03858,0x275FA
2122 - Keep Hedge Maze Panels - 0x00139,0x019DC,0x019E7,0x01A0F
2125 - Monastery Panels - 0x09D9B,0x00C92,0x00B10
2130 - Town Church & RGB House Panels - 0x28998,0x28A0D,0x334D8
2135 - Town Maze Panels - 0x2896A,0x28A79
2140 - Windmill & Theater Panels - 0x17D02,0x00815,0x17F5F,0x17F89,0x0A168,0x33AB2
2145 - Treehouse Panels - 0x0A182,0x0288C,0x02886,0x2700B,0x17CBC,0x037FF
2150 - Bunker Panels - 0x34BC5,0x34BC6,0x0A079,0x0A099,0x17C2E
2155 - Swamp Panels - 0x00609,0x18488,0x181F5,0x17E2B,0x17C0A,0x17E07,0x17C0D,0x0056E
2160 - Mountain Panels - 0x09ED8,0x09E86,0x09E39,0x09EEB
2165 - Caves Panels - 0x3369D,0x00FF8,0x0A16E,0x335AB,0x335AC
2170 - Tunnels Panels - 0x09E85,0x039B4
Lasers: Lasers:
1500 - Symmetry Laser - 0x00509 1500 - Symmetry Laser - 0x00509
1501 - Desert Laser - 0x012FB,0x01317 1501 - Desert Laser - 0x012FB
1502 - Quarry Laser - 0x01539 1502 - Quarry Laser - 0x01539
1503 - Shadows Laser - 0x181B3 1503 - Shadows Laser - 0x181B3
1504 - Keep Laser - 0x014BB 1504 - Keep Laser - 0x014BB

View File

@ -1,3 +1,5 @@
Menu (Menu) - Entry - True:
Entry (Entry): Entry (Entry):
First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064:
@ -21,9 +23,9 @@ Tutorial (Tutorial) - Outside Tutorial - 0x03629:
159513 - 0x33600 (Patio Flowers EP) - 0x0C373 - True 159513 - 0x33600 (Patio Flowers EP) - 0x0C373 - True
159517 - 0x3352F (Gate EP) - 0x03505 - True 159517 - 0x3352F (Gate EP) - 0x03505 - True
Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2: Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0:
158650 - 0x033D4 (Vault) - True - Dots & Black/White Squares 158650 - 0x033D4 (Vault Panel) - True - Dots & Black/White Squares
158651 - 0x03481 (Vault Box) - 0x033D4 - True Door - 0x033D0 (Vault Door) - 0x033D4
158013 - 0x0005D (Shed Row 1) - True - Dots 158013 - 0x0005D (Shed Row 1) - True - Dots
158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots 158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots
158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots 158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots
@ -44,6 +46,9 @@ Door - 0x03BA2 (Outpost Path) - 0x0A3B5
159516 - 0x334A3 (Path EP) - True - True 159516 - 0x334A3 (Path EP) - True - True
159500 - 0x035C7 (Tractor EP) - True - True 159500 - 0x035C7 (Tractor EP) - True - True
Outside Tutorial Vault (Outside Tutorial):
158651 - 0x03481 (Vault Box) - True - True
Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170: Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170:
158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots 158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots
Door - 0x0A170 (Outpost Entry) - 0x0A171 Door - 0x0A170 (Outpost Entry) - 0x0A171
@ -54,6 +59,7 @@ Door - 0x04CA3 (Outpost Exit) - 0x04CA4
158600 - 0x17CFB (Discard) - True - Triangles 158600 - 0x17CFB (Discard) - True - Triangles
Main Island (Main Island) - Outside Tutorial - True: Main Island (Main Island) - Outside Tutorial - True:
159801 - 0xFFD00 (Reached Independently) - True - True
159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True 159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True
Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29: Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29:
@ -76,7 +82,7 @@ Inside Glass Factory (Glass Factory) - Inside Glass Factory Behind Back Wall - 0
158038 - 0x0343A (Melting 3) - 0x00082 - Symmetry 158038 - 0x0343A (Melting 3) - 0x00082 - Symmetry
Door - 0x0D7ED (Back Wall) - 0x0005C Door - 0x0D7ED (Back Wall) - 0x0005C
Inside Glass Factory Behind Back Wall (Glass Factory) - Boat - 0x17CC8: Inside Glass Factory Behind Back Wall (Glass Factory) - The Ocean - 0x17CC8:
158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat
Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E: Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E:
@ -112,12 +118,12 @@ Door - 0x18269 (Upper) - 0x1C349
159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True 159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True
Symmetry Island Upper (Symmetry Island): Symmetry Island Upper (Symmetry Island):
158065 - 0x00A52 (Yellow 1) - True - Symmetry & Colored Dots 158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots
158066 - 0x00A57 (Yellow 2) - 0x00A52 - Symmetry & Colored Dots 158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots
158067 - 0x00A5B (Yellow 3) - 0x00A57 - Symmetry & Colored Dots 158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots
158068 - 0x00A61 (Blue 1) - 0x00A52 - Symmetry & Colored Dots 158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots
158069 - 0x00A64 (Blue 2) - 0x00A61 & 0x00A52 - Symmetry & Colored Dots 158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots
158070 - 0x00A68 (Blue 3) - 0x00A64 & 0x00A57 - Symmetry & Colored Dots 158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots
158700 - 0x0360D (Laser Panel) - 0x00A68 - True 158700 - 0x0360D (Laser Panel) - 0x00A68 - True
Laser - 0x00509 (Laser) - 0x0360D Laser - 0x00509 (Laser) - 0x0360D
159001 - 0x03367 (Glass Factory Black Line EP) - True - True 159001 - 0x03367 (Glass Factory Black Line EP) - True - True
@ -135,9 +141,9 @@ Door - 0x03313 (Second Gate) - 0x032FF
Orchard End (Orchard): Orchard End (Orchard):
Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE: Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE - Desert Vault - 0x03444:
158652 - 0x0CC7B (Vault) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots 158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots
158653 - 0x0339E (Vault Box) - 0x0CC7B - True Door - 0x03444 (Vault Door) - 0x0CC7B
158602 - 0x17CE7 (Discard) - True - Triangles 158602 - 0x17CE7 (Discard) - True - Triangles
158076 - 0x00698 (Surface 1) - True - True 158076 - 0x00698 (Surface 1) - True - True
158077 - 0x0048F (Surface 2) - 0x00698 - True 158077 - 0x0048F (Surface 2) - 0x00698 - True
@ -163,6 +169,9 @@ Laser - 0x012FB (Laser) - 0x03608
159040 - 0x334B9 (Shore EP) - True - True 159040 - 0x334B9 (Shore EP) - True - True
159041 - 0x334BC (Island EP) - True - True 159041 - 0x334BC (Island EP) - True - True
Desert Vault (Desert):
158653 - 0x0339E (Vault Box) - True - True
Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3: Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3:
158087 - 0x09FAA (Light Control) - True - True 158087 - 0x09FAA (Light Control) - True - True
158088 - 0x00422 (Light Room 1) - 0x09FAA - True 158088 - 0x00422 (Light Room 1) - 0x09FAA - True
@ -199,18 +208,19 @@ Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316:
Door - 0x0C316 (Elevator Room Entry) - 0x18076 Door - 0x0C316 (Elevator Room Entry) - 0x18076
159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True
Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x012FB: Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x01317:
158111 - 0x17C31 (Final Transparent) - True - True 158111 - 0x17C31 (Final Transparent) - True - True
158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - True 158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - True
158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True 158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True
158115 - 0x0A15C (Final Bent 1) - True - True 158115 - 0x0A15C (Final Bent 1) - True - True
158116 - 0x09FFF (Final Bent 2) - 0x0A15C - True 158116 - 0x09FFF (Final Bent 2) - 0x0A15C - True
158117 - 0x0A15F (Final Bent 3) - 0x09FFF - True 158117 - 0x0A15F (Final Bent 3) - 0x09FFF - True
159035 - 0x037BB (Elevator EP) - 0x012FB - True 159035 - 0x037BB (Elevator EP) - 0x01317 - True
Door - 0x01317 (Elevator) - 0x03608
Desert Lowest Level Inbetween Shortcuts (Desert): Desert Lowest Level Inbetween Shortcuts (Desert):
Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - TrueOneWay: Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01:
158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares 158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares
158603 - 0x17CF0 (Discard) - True - Triangles 158603 - 0x17CF0 (Discard) - True - Triangles
158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Shapers 158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Shapers
@ -222,7 +232,7 @@ Door - 0x09D6F (Entry 1) - 0x09E57
159420 - 0x289CF (Rock Line EP) - True - True 159420 - 0x289CF (Rock Line EP) - True - True
159421 - 0x289D1 (Rock Line Reflection EP) - True - True 159421 - 0x289D1 (Rock Line Reflection EP) - True - True
Quarry Elevator (Quarry): Quarry Elevator (Quarry) - Outside Quarry - 0x17CC4 - Quarry - 0x17CC4:
158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser 158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser
159403 - 0x17CB9 (Railroad EP) - 0x17CC4 - True 159403 - 0x17CB9 (Railroad EP) - 0x17CC4 - True
@ -230,28 +240,31 @@ Quarry Between Entrys (Quarry) - Quarry - 0x17C07:
158119 - 0x17C09 (Entry 2 Panel) - True - Shapers 158119 - 0x17C09 (Entry 2 Panel) - True - Shapers
Door - 0x17C07 (Entry 2) - 0x17C09 Door - 0x17C07 (Entry 2) - 0x17C09
Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010 - Quarry Elevator - 0x17CC4: Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010:
159802 - 0xFFD01 (Inside Reached Independently) - True - True
158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Black/White Squares 158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Black/White Squares
158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Dots 158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Dots
Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A
Quarry Stoneworks Ground Floor (Quarry Stoneworks) - Quarry - 0x275FF - Quarry Stoneworks Middle Floor - 0x03678 - Outside Quarry - 0x17CE8: Quarry Stoneworks Ground Floor (Quarry Stoneworks) - Quarry - 0x275FF - Quarry Stoneworks Middle Floor - 0x03678 - Outside Quarry - 0x17CE8 - Quarry Stoneworks Lift - TrueOneWay:
158123 - 0x275ED (Side Exit Panel) - True - True 158123 - 0x275ED (Side Exit Panel) - True - True
Door - 0x275FF (Side Exit) - 0x275ED Door - 0x275FF (Side Exit) - 0x275ED
158124 - 0x03678 (Lower Ramp Control) - True - Dots & Eraser 158124 - 0x03678 (Lower Ramp Control) - True - Dots & Eraser
158145 - 0x17CAC (Roof Exit Panel) - True - True 158145 - 0x17CAC (Roof Exit Panel) - True - True
Door - 0x17CE8 (Roof Exit) - 0x17CAC Door - 0x17CE8 (Roof Exit) - 0x17CAC
Quarry Stoneworks Middle Floor (Quarry Stoneworks) - Quarry Stoneworks Ground Floor - 0x03675 - Quarry Stoneworks Upper Floor - 0x03679: Quarry Stoneworks Middle Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - TrueOneWay:
158125 - 0x00E0C (Lower Row 1) - True - Dots & Eraser 158125 - 0x00E0C (Lower Row 1) - True - Dots & Eraser
158126 - 0x01489 (Lower Row 2) - 0x00E0C - Dots & Eraser 158126 - 0x01489 (Lower Row 2) - 0x00E0C - Dots & Eraser
158127 - 0x0148A (Lower Row 3) - 0x01489 - Dots & Eraser 158127 - 0x0148A (Lower Row 3) - 0x01489 - Dots & Eraser
158128 - 0x014D9 (Lower Row 4) - 0x0148A - Dots & Eraser 158128 - 0x014D9 (Lower Row 4) - 0x0148A - Dots & Eraser
158129 - 0x014E7 (Lower Row 5) - 0x014D9 - Dots & Eraser 158129 - 0x014E7 (Lower Row 5) - 0x014D9 - Dots & Eraser
158130 - 0x014E8 (Lower Row 6) - 0x014E7 - Dots & Eraser 158130 - 0x014E8 (Lower Row 6) - 0x014E7 - Dots & Eraser
Quarry Stoneworks Lift (Quarry Stoneworks) - Quarry Stoneworks Middle Floor - 0x03679 - Quarry Stoneworks Ground Floor - 0x03679 - Quarry Stoneworks Upper Floor - 0x03679:
158131 - 0x03679 (Lower Lift Control) - 0x014E8 - Dots & Eraser 158131 - 0x03679 (Lower Lift Control) - 0x014E8 - Dots & Eraser
Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Middle Floor - 0x03676 & 0x03679 - Quarry Stoneworks Ground Floor - 0x0368A: Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - 0x03675 - Quarry Stoneworks Ground Floor - 0x0368A:
158132 - 0x03676 (Upper Ramp Control) - True - Dots & Eraser 158132 - 0x03676 (Upper Ramp Control) - True - Dots & Eraser
158133 - 0x03675 (Upper Lift Control) - True - Dots & Eraser 158133 - 0x03675 (Upper Lift Control) - True - Dots & Eraser
158134 - 0x00557 (Upper Row 1) - True - Colored Squares & Eraser 158134 - 0x00557 (Upper Row 1) - True - Colored Squares & Eraser
@ -262,7 +275,7 @@ Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Middle Flo
158139 - 0x3C12D (Upper Row 6) - 0x0146C - Colored Squares & Eraser 158139 - 0x3C12D (Upper Row 6) - 0x0146C - Colored Squares & Eraser
158140 - 0x03686 (Upper Row 7) - 0x3C12D - Colored Squares & Eraser 158140 - 0x03686 (Upper Row 7) - 0x3C12D - Colored Squares & Eraser
158141 - 0x014E9 (Upper Row 8) - 0x03686 - Colored Squares & Eraser 158141 - 0x014E9 (Upper Row 8) - 0x03686 - Colored Squares & Eraser
158142 - 0x03677 (Stair Control) - True - Colored Squares & Eraser 158142 - 0x03677 (Stairs Panel) - True - Colored Squares & Eraser
Door - 0x0368A (Stairs) - 0x03677 Door - 0x0368A (Stairs) - 0x03677
158143 - 0x3C125 (Control Room Left) - 0x014E9 - Black/White Squares & Dots & Eraser 158143 - 0x3C125 (Control Room Left) - 0x014E9 - Black/White Squares & Dots & Eraser
158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Dots & Eraser 158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Dots & Eraser
@ -277,7 +290,7 @@ Quarry Boathouse (Quarry Boathouse) - Quarry - True - Quarry Boathouse Upper Fro
Door - 0x2769B (Dock) - 0x17CA6 Door - 0x2769B (Dock) - 0x17CA6
Door - 0x27163 (Dock Invis Barrier) - 0x17CA6 Door - 0x27163 (Dock Invis Barrier) - 0x17CA6
Quarry Boathouse Behind Staircase (Quarry Boathouse) - Boat - 0x17CA6: Quarry Boathouse Behind Staircase (Quarry Boathouse) - The Ocean - 0x17CA6:
Quarry Boathouse Upper Front (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x17C50: Quarry Boathouse Upper Front (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x17C50:
158149 - 0x021B3 (Front Row 1) - True - Shapers & Eraser 158149 - 0x021B3 (Front Row 1) - True - Shapers & Eraser
@ -309,9 +322,9 @@ Door - 0x3865F (Second Barrier) - 0x38663
158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers 158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers
159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True 159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True
Shadows (Shadows) - Main Island - True - Shadows Ledge - 0x19B24 - Shadows Laser Room - 0x194B2 & 0x19665: Shadows (Shadows) - Main Island - True - Shadows Ledge - 0x19B24 - Shadows Laser Room - 0x194B2 | 0x19665:
158170 - 0x334DB (Door Timer Outside) - True - True 158170 - 0x334DB (Door Timer Outside) - True - True
Door - 0x19B24 (Timed Door) - 0x334DB Door - 0x19B24 (Timed Door) - 0x334DB | 0x334DC
158171 - 0x0AC74 (Intro 6) - 0x0A8DC - True 158171 - 0x0AC74 (Intro 6) - 0x0A8DC - True
158172 - 0x0AC7A (Intro 7) - 0x0AC74 - True 158172 - 0x0AC7A (Intro 7) - 0x0AC74 - True
158173 - 0x0A8E0 (Intro 8) - 0x0AC7A - True 158173 - 0x0A8E0 (Intro 8) - 0x0AC7A - True
@ -336,7 +349,7 @@ Shadows Ledge (Shadows) - Shadows - 0x1855B - Quarry - 0x19865 & 0x0A2DF:
158187 - 0x334DC (Door Timer Inside) - True - True 158187 - 0x334DC (Door Timer Inside) - True - True
158188 - 0x198B5 (Intro 1) - True - True 158188 - 0x198B5 (Intro 1) - True - True
158189 - 0x198BD (Intro 2) - 0x198B5 - True 158189 - 0x198BD (Intro 2) - 0x198B5 - True
158190 - 0x198BF (Intro 3) - 0x198BD & 0x334DC & 0x19B24 - True 158190 - 0x198BF (Intro 3) - 0x198BD & 0x19B24 - True
Door - 0x19865 (Quarry Barrier) - 0x198BF Door - 0x19865 (Quarry Barrier) - 0x198BF
Door - 0x0A2DF (Quarry Barrier 2) - 0x198BF Door - 0x0A2DF (Quarry Barrier 2) - 0x198BF
158191 - 0x19771 (Intro 4) - 0x198BF - True 158191 - 0x19771 (Intro 4) - 0x198BF - True
@ -345,7 +358,7 @@ Door - 0x1855B (Ledge Barrier) - 0x0A8DC
Door - 0x19ADE (Ledge Barrier 2) - 0x0A8DC Door - 0x19ADE (Ledge Barrier 2) - 0x0A8DC
Shadows Laser Room (Shadows): Shadows Laser Room (Shadows):
158703 - 0x19650 (Laser Panel) - True - True 158703 - 0x19650 (Laser Panel) - 0x194B2 & 0x19665 - True
Laser - 0x181B3 (Laser) - 0x19650 Laser - 0x181B3 (Laser) - 0x19650
Treehouse Beach (Treehouse Beach) - Main Island - True: Treehouse Beach (Treehouse Beach) - Main Island - True:
@ -395,9 +408,9 @@ Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F
158205 - 0x09E49 (Shadows Shortcut Panel) - True - True 158205 - 0x09E49 (Shadows Shortcut Panel) - True - True
Door - 0x09E3D (Shadows Shortcut) - 0x09E49 Door - 0x09E3D (Shadows Shortcut) - 0x09E49
Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True: Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True - Shipwreck Vault - 0x17BB4:
158654 - 0x00AFB (Vault) - True - Symmetry & Sound Dots & Colored Dots 158654 - 0x00AFB (Vault Panel) - True - Symmetry & Sound Dots & Colored Dots
158655 - 0x03535 (Vault Box) - 0x00AFB - True Door - 0x17BB4 (Vault Door) - 0x00AFB
158605 - 0x17D28 (Discard) - True - Triangles 158605 - 0x17D28 (Discard) - True - Triangles
159220 - 0x03B22 (Circle Far EP) - True - True 159220 - 0x03B22 (Circle Far EP) - True - True
159221 - 0x03B23 (Circle Left EP) - True - True 159221 - 0x03B23 (Circle Left EP) - True - True
@ -407,6 +420,9 @@ Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True:
159226 - 0x28ABE (Rope Outer EP) - True - True 159226 - 0x28ABE (Rope Outer EP) - True - True
159230 - 0x3388F (Couch EP) - 0x17CDF | 0x0A054 - True 159230 - 0x3388F (Couch EP) - 0x17CDF | 0x0A054 - True
Shipwreck Vault (Shipwreck):
158655 - 0x03535 (Vault Box) - True - True
Keep Tower (Keep) - Keep - 0x04F8F: Keep Tower (Keep) - Keep - 0x04F8F:
158206 - 0x0361B (Tower Shortcut Panel) - True - True 158206 - 0x0361B (Tower Shortcut Panel) - True - True
Door - 0x04F8F (Tower Shortcut) - 0x0361B Door - 0x04F8F (Tower Shortcut) - 0x0361B
@ -422,8 +438,8 @@ Laser - 0x014BB (Laser) - 0x0360E | 0x03317
159251 - 0x3348F (Hedges EP) - True - True 159251 - 0x3348F (Hedges EP) - True - True
Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750: Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750:
158207 - 0x03713 (Shortcut Panel) - True - True 158207 - 0x03713 (Laser Shortcut Panel) - True - True
Door - 0x0364E (Shortcut) - 0x03713 Door - 0x0364E (Laser Shortcut) - 0x03713
158208 - 0x00B10 (Entry Left) - True - True 158208 - 0x00B10 (Entry Left) - True - True
158209 - 0x00C92 (Entry Right) - True - True 158209 - 0x00C92 (Entry Right) - True - True
Door - 0x0C128 (Entry Inner) - 0x00B10 Door - 0x0C128 (Entry Inner) - 0x00B10
@ -454,7 +470,7 @@ Inside Monastery (Monastery):
Monastery Garden (Monastery): Monastery Garden (Monastery):
Town (Town) - Main Island - True - Boat - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9: Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9:
158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat
158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers
Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
@ -469,11 +485,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots 158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots
158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots 158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots
Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1 Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1
158225 - 0x28998 (Tinted Glass Door Panel) - True - Stars & Rotated Shapers 158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers
Door - 0x28A61 (Tinted Glass Door) - 0x28998 Door - 0x28A61 (RGB House Entry) - 0x28998
158226 - 0x28A0D (Church Entry Panel) - 0x28A61 - Stars 158226 - 0x28A0D (Church Entry Panel) - 0x28A61 - Stars
Door - 0x03BB0 (Church Entry) - 0x28A0D Door - 0x03BB0 (Church Entry) - 0x28A0D
158228 - 0x28A79 (Maze Stair Control) - True - True 158228 - 0x28A79 (Maze Panel) - True - True
Door - 0x28AA2 (Maze Stairs) - 0x28A79 Door - 0x28AA2 (Maze Stairs) - 0x28A79
158241 - 0x17F5F (Windmill Entry Panel) - True - Dots 158241 - 0x17F5F (Windmill Entry Panel) - True - Dots
Door - 0x1845B (Windmill Entry) - 0x17F5F Door - 0x1845B (Windmill Entry) - 0x17F5F
@ -557,7 +573,7 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2
159556 - 0x33A2A (Door EP) - 0x03553 - True 159556 - 0x33A2A (Door EP) - 0x03553 - True
159558 - 0x33B06 (Church EP) - 0x0354E - True 159558 - 0x33B06 (Church EP) - 0x0354E - True
Jungle (Jungle) - Main Island - True - Outside Jungle River - 0x3873B - Boat - 0x17CDF: Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF:
158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat
158609 - 0x17F9B (Discard) - True - Triangles 158609 - 0x17F9B (Discard) - True - Triangles
158252 - 0x002C4 (First Row 1) - True - True 158252 - 0x002C4 (First Row 1) - True - True
@ -588,18 +604,21 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA
159350 - 0x035CB (Bamboo CCW EP) - True - True 159350 - 0x035CB (Bamboo CCW EP) - True - True
159351 - 0x035CF (Bamboo CW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True
Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A: Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287:
158267 - 0x17CAA (Monastery Shortcut Panel) - True - True 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True
Door - 0x0CF2A (Monastery Shortcut) - 0x17CAA Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA
158663 - 0x15ADD (Vault) - True - Black/White Squares & Dots 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots
158664 - 0x03702 (Vault Box) - 0x15ADD - True Door - 0x15287 (Vault Door) - 0x15ADD
159110 - 0x03AC5 (Green Leaf Moss EP) - True - True 159110 - 0x03AC5 (Green Leaf Moss EP) - True - True
159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True 159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True
159121 - 0x03BE3 (Monastery Garden Right EP) - True - True 159121 - 0x03BE3 (Monastery Garden Right EP) - True - True
159122 - 0x0A409 (Monastery Wall EP) - True - True 159122 - 0x0A409 (Monastery Wall EP) - True - True
River Vault (River):
158664 - 0x03702 (Vault Box) - True - True
Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4: Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4:
158268 - 0x17C2E (Entry Panel) - True - Black/White Squares & Colored Squares 158268 - 0x17C2E (Entry Panel) - True - Black/White Squares
Door - 0x0C2A4 (Entry) - 0x17C2E Door - 0x0C2A4 (Entry) - 0x17C2E
Bunker (Bunker) - Bunker Glass Room - 0x17C79: Bunker (Bunker) - Bunker Glass Room - 0x17C79:
@ -616,9 +635,9 @@ Bunker (Bunker) - Bunker Glass Room - 0x17C79:
Door - 0x17C79 (Tinted Glass Door) - 0x0A099 Door - 0x17C79 (Tinted Glass Door) - 0x0A099
Bunker Glass Room (Bunker) - Bunker Ultraviolet Room - 0x0C2A3: Bunker Glass Room (Bunker) - Bunker Ultraviolet Room - 0x0C2A3:
158279 - 0x0A010 (Glass Room 1) - True - Colored Squares 158279 - 0x0A010 (Glass Room 1) - 0x17C79 - Colored Squares
158280 - 0x0A01B (Glass Room 2) - 0x0A010 - Colored Squares & Black/White Squares 158280 - 0x0A01B (Glass Room 2) - 0x17C79 & 0x0A010 - Colored Squares & Black/White Squares
158281 - 0x0A01F (Glass Room 3) - 0x0A01B - Colored Squares & Black/White Squares 158281 - 0x0A01F (Glass Room 3) - 0x17C79 & 0x0A01B - Colored Squares & Black/White Squares
Door - 0x0C2A3 (UV Room Entry) - 0x0A01F Door - 0x0C2A3 (UV Room Entry) - 0x0A01F
Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D: Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D:
@ -631,7 +650,7 @@ Door - 0x0A08D (Elevator Room Entry) - 0x17E67
Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay:
159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True
Bunker Elevator (Bunker) - Bunker Laser Platform - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079:
158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares
Bunker Green Room (Bunker) - Bunker Elevator - TrueOneWay: Bunker Green Room (Bunker) - Bunker Elevator - TrueOneWay:
@ -676,7 +695,7 @@ Swamp Near Platform (Swamp) - Swamp Cyan Underwater - 0x04B7F - Swamp Near Boat
158316 - 0x00990 (Platform Row 4) - 0x0098F - Shapers 158316 - 0x00990 (Platform Row 4) - 0x0098F - Shapers
Door - 0x184B7 (Between Bridges First Door) - 0x00990 Door - 0x184B7 (Between Bridges First Door) - 0x00990
158317 - 0x17C0D (Platform Shortcut Left Panel) - True - Shapers 158317 - 0x17C0D (Platform Shortcut Left Panel) - True - Shapers
158318 - 0x17C0E (Platform Shortcut Right Panel) - True - Shapers 158318 - 0x17C0E (Platform Shortcut Right Panel) - 0x17C0D - Shapers
Door - 0x38AE6 (Platform Shortcut Door) - 0x17C0E Door - 0x38AE6 (Platform Shortcut Door) - 0x17C0E
Door - 0x04B7F (Cyan Water Pump) - 0x00006 Door - 0x04B7F (Cyan Water Pump) - 0x00006
@ -715,18 +734,21 @@ Swamp Rotating Bridge (Swamp) - Swamp Between Bridges Far - 0x181F5 - Swamp Near
159331 - 0x016B2 (Rotating Bridge CCW EP) - 0x181F5 - True 159331 - 0x016B2 (Rotating Bridge CCW EP) - 0x181F5 - True
159334 - 0x036CE (Rotating Bridge CW EP) - 0x181F5 - True 159334 - 0x036CE (Rotating Bridge CW EP) - 0x181F5 - True
Swamp Near Boat (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Blue Underwater - 0x18482: Swamp Near Boat (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Blue Underwater - 0x18482 - Swamp Long Bridge - 0xFFD00 & 0xFFD02 - The Ocean - 0x09DB8:
158903 - 0xFFD02 (Beyond Rotating Bridge Reached Independently) - True - True
158328 - 0x09DB8 (Boat Spawn) - True - Boat 158328 - 0x09DB8 (Boat Spawn) - True - Boat
158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Rotated Shapers 158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Rotated Shapers
158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers 158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers
158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Rotated Shapers 158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Rotated Shapers
158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Rotated Shapers 158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Rotated Shapers
158339 - 0x17E2B (Long Bridge Control) - True - Rotated Shapers & Shapers
Door - 0x18482 (Blue Water Pump) - 0x00E3A Door - 0x18482 (Blue Water Pump) - 0x00E3A
159332 - 0x3365F (Boat EP) - 0x09DB8 - True 159332 - 0x3365F (Boat EP) - 0x09DB8 - True
159333 - 0x03731 (Long Bridge Side EP) - 0x17E2B - True 159333 - 0x03731 (Long Bridge Side EP) - 0x17E2B - True
Swamp Purple Area (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Purple Underwater - 0x0A1D6: Swamp Long Bridge (Swamp) - Swamp Near Boat - 0x17E2B - Outside Swamp - 0x17E2B:
158339 - 0x17E2B (Long Bridge Control) - True - Rotated Shapers & Shapers
Swamp Purple Area (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Purple Underwater - 0x0A1D6 - Swamp Near Boat - TrueOneWay:
Door - 0x0A1D6 (Purple Water Pump) - 0x00E3A Door - 0x0A1D6 (Purple Water Pump) - 0x00E3A
Swamp Purple Underwater (Swamp): Swamp Purple Underwater (Swamp):
@ -752,7 +774,7 @@ Laser - 0x00BF6 (Laser) - 0x03615
158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Rotated Shapers 158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Rotated Shapers
Door - 0x2D880 (Laser Shortcut) - 0x17C02 Door - 0x2D880 (Laser Shortcut) - 0x17C02
Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309: Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309 - The Ocean - 0x17C95:
158343 - 0x17C95 (Boat Spawn) - True - Boat 158343 - 0x17C95 (Boat Spawn) - True - Boat
158344 - 0x0288C (First Door Panel) - True - Stars 158344 - 0x0288C (First Door Panel) - True - Stars
Door - 0x0C309 (First Door) - 0x0288C Door - 0x0C309 (First Door) - 0x0288C
@ -778,7 +800,7 @@ Treehouse After Yellow Bridge (Treehouse) - Treehouse Junction - 0x0A181:
Door - 0x0A181 (Third Door) - 0x0A182 Door - 0x0A181 (Third Door) - 0x0A182
Treehouse Junction (Treehouse) - Treehouse Right Orange Bridge - True - Treehouse First Purple Bridge - True - Treehouse Green Bridge - True: Treehouse Junction (Treehouse) - Treehouse Right Orange Bridge - True - Treehouse First Purple Bridge - True - Treehouse Green Bridge - True:
158356 - 0x2700B (Laser House Door Timer Outside Control) - True - True 158356 - 0x2700B (Laser House Door Timer Outside) - True - True
Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x17D6C: Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x17D6C:
158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Dots 158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Dots
@ -802,7 +824,7 @@ Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2:
158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars 158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars
Treehouse Bridge Platform (Treehouse) - Main Island - 0x0C32D: Treehouse Bridge Platform (Treehouse) - Main Island - 0x0C32D:
158404 - 0x037FF (Bridge Control) - True - Stars 158404 - 0x037FF (Drawbridge Panel) - True - Stars
Door - 0x0C32D (Drawbridge) - 0x037FF Door - 0x0C32D (Drawbridge) - 0x037FF
Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6: Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6:
@ -847,7 +869,7 @@ Treehouse Green Bridge Left House (Treehouse):
159211 - 0x220A7 (Right Orange Bridge EP) - 0x17DA2 - True 159211 - 0x220A7 (Right Orange Bridge EP) - 0x17DA2 - True
Treehouse Laser Room Front Platform (Treehouse) - Treehouse Laser Room - 0x0C323: Treehouse Laser Room Front Platform (Treehouse) - Treehouse Laser Room - 0x0C323:
Door - 0x0C323 (Laser House Entry) - 0x17DA2 & 0x2700B & 0x17DDB Door - 0x0C323 (Laser House Entry) - 0x17DA2 & 0x2700B & 0x17DDB | 0x17CBC
Treehouse Laser Room Back Platform (Treehouse): Treehouse Laser Room Back Platform (Treehouse):
158611 - 0x17FA0 (Laser Discard) - True - Triangles 158611 - 0x17FA0 (Laser Discard) - True - Triangles
@ -860,19 +882,22 @@ Treehouse Laser Room (Treehouse):
158403 - 0x17CBC (Laser House Door Timer Inside) - True - True 158403 - 0x17CBC (Laser House Door Timer Inside) - True - True
Laser - 0x028A4 (Laser) - 0x03613 Laser - 0x028A4 (Laser) - 0x03613
Mountainside (Mountainside) - Main Island - True - Mountaintop - True: Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085:
158612 - 0x17C42 (Discard) - True - Triangles 158612 - 0x17C42 (Discard) - True - Triangles
158665 - 0x002A6 (Vault) - True - Symmetry & Colored Dots & Black/White Squares & Dots 158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Dots & Black/White Squares & Dots
158666 - 0x03542 (Vault Box) - 0x002A6 - True Door - 0x00085 (Vault Door) - 0x002A6
159301 - 0x335AE (Cloud Cycle EP) - True - True 159301 - 0x335AE (Cloud Cycle EP) - True - True
159325 - 0x33505 (Bush EP) - True - True 159325 - 0x33505 (Bush EP) - True - True
159335 - 0x03C07 (Apparent River EP) - True - True 159335 - 0x03C07 (Apparent River EP) - True - True
Mountainside Vault (Mountainside):
158666 - 0x03542 (Vault Box) - True - True
Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34:
158405 - 0x0042D (River Shape) - True - True 158405 - 0x0042D (River Shape) - True - True
158406 - 0x09F7F (Box Short) - 7 Lasers - True 158406 - 0x09F7F (Box Short) - 7 Lasers - True
158407 - 0x17C34 (Trap Door Triple Exit) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol 158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol
158800 - 0xFFF00 (Box Long) - 7 Lasers & 11 Lasers & 0x17C34 - True 158800 - 0xFFF00 (Box Long) - 11 Lasers & 0x17C34 - True
159300 - 0x001A3 (River Shape EP) - True - True 159300 - 0x001A3 (River Shape EP) - True - True
159320 - 0x3370E (Arch Black EP) - True - True 159320 - 0x3370E (Arch Black EP) - True - True
159324 - 0x336C8 (Arch White Right EP) - True - True 159324 - 0x336C8 (Arch White Right EP) - True - True
@ -881,7 +906,7 @@ Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34:
Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39: Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39:
158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Colored Squares & Eraser 158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Colored Squares & Eraser
Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Top Layer At Door - TrueOneWay:
158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots
158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots
158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Dots 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Dots
@ -899,6 +924,8 @@ Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Dots 158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Dots
158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers 158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers
158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shapers 158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shapers
Mountain Top Layer At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B
Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay:
@ -917,7 +944,7 @@ Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86
Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2): Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2):
158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser 158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser
Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay: Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay - Mountain Floor 2 - 0x09ED8:
158432 - 0x09FCC (Far Row 1) - True - Dots 158432 - 0x09FCC (Far Row 1) - True - Dots
158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares 158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares
158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars 158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars
@ -935,29 +962,27 @@ Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator -
Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Third Layer - 0x09EEB: Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Third Layer - 0x09EEB:
158439 - 0x09EEB (Elevator Control Panel) - True - Dots 158439 - 0x09EEB (Elevator Control Panel) - True - Dots
Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89: Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89 - Mountain Pink Bridge EP - TrueOneWay:
158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser 158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser
158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Shapers & Eraser 158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Shapers & Eraser
158442 - 0x09F01 (Giant Puzzle Top Right) - True - Rotated Shapers 158442 - 0x09F01 (Giant Puzzle Top Right) - True - Rotated Shapers
158443 - 0x09EFF (Giant Puzzle Top Left) - True - Shapers & Eraser 158443 - 0x09EFF (Giant Puzzle Top Left) - True - Shapers & Eraser
158444 - 0x09FDA (Giant Puzzle) - 0x09FC1 & 0x09F8E & 0x09F01 & 0x09EFF - Shapers & Symmetry 158444 - 0x09FDA (Giant Puzzle) - 0x09FC1 & 0x09F8E & 0x09F01 & 0x09EFF - Shapers & Symmetry
159313 - 0x09D5D (Yellow Bridge EP) - 0x09E86 & 0x09ED8 - True
159314 - 0x09D5E (Blue Bridge EP) - 0x09E86 & 0x09ED8 - True
Door - 0x09F89 (Exit) - 0x09FDA Door - 0x09F89 (Exit) - 0x09FDA
Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Bottom Floor Rock - 0x17FA2 - Final Room - 0x0C141 - Mountain Pink Bridge EP - TrueOneWay: Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Final Room - 0x0C141:
158614 - 0x17FA2 (Discard) - 0xFFF00 - Triangles 158614 - 0x17FA2 (Discard) - 0xFFF00 - Triangles
158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars 158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars
158446 - 0x01987 (Final Room Entry Right) - True - Colored Squares & Dots 158446 - 0x01987 (Final Room Entry Right) - True - Colored Squares & Dots
Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987
159313 - 0x09D5D (Yellow Bridge EP) - 0x09E86 & 0x09ED8 - True Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1
159314 - 0x09D5E (Blue Bridge EP) - 0x09E86 & 0x09ED8 - True
Mountain Pink Bridge EP (Mountain Floor 2): Mountain Pink Bridge EP (Mountain Floor 2):
159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True
Mountain Bottom Floor Rock (Mountain Bottom Floor) - Mountain Bottom Floor - 0x17F33 - Mountain Path to Caves - 0x17F33: Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D:
Door - 0x17F33 (Rock Open) - True - True
Mountain Path to Caves (Mountain Bottom Floor) - Mountain Bottom Floor Rock - 0x334E1 - Caves - 0x2D77D:
158447 - 0x00FF8 (Caves Entry Panel) - True - Triangles & Black/White Squares 158447 - 0x00FF8 (Caves Entry Panel) - True - Triangles & Black/White Squares
Door - 0x2D77D (Caves Entry) - 0x00FF8 Door - 0x2D77D (Caves Entry) - 0x00FF8
158448 - 0x334E1 (Rock Control) - True - True 158448 - 0x334E1 (Rock Control) - True - True
@ -1021,7 +1046,7 @@ Path to Challenge (Caves) - Challenge - 0x0A19A:
158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol 158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol
Door - 0x0A19A (Challenge Entry) - 0x0A16E Door - 0x0A19A (Challenge Entry) - 0x0A16E
Challenge (Challenge) - Tunnels - 0x0348A: Challenge (Challenge) - Tunnels - 0x0348A - Challenge Vault - 0x04D75:
158499 - 0x0A332 (Start Timer) - 11 Lasers - True 158499 - 0x0A332 (Start Timer) - 11 Lasers - True
158500 - 0x0088E (Small Basic) - 0x0A332 - True 158500 - 0x0088E (Small Basic) - 0x0A332 - True
158501 - 0x00BAF (Big Basic) - 0x0088E - True 158501 - 0x00BAF (Big Basic) - 0x0088E - True
@ -1041,11 +1066,14 @@ Challenge (Challenge) - Tunnels - 0x0348A:
158515 - 0x034EC (Maze Hidden 2) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles 158515 - 0x034EC (Maze Hidden 2) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles
158516 - 0x1C31A (Dots Pillar) - 0x034F4 & 0x034EC - Dots & Symmetry 158516 - 0x1C31A (Dots Pillar) - 0x034F4 & 0x034EC - Dots & Symmetry
158517 - 0x1C319 (Squares Pillar) - 0x034F4 & 0x034EC - Black/White Squares & Symmetry 158517 - 0x1C319 (Squares Pillar) - 0x034F4 & 0x034EC - Black/White Squares & Symmetry
158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True Door - 0x04D75 (Vault Door) - 0x1C31A & 0x1C319
158518 - 0x039B4 (Tunnels Entry Panel) - True - Triangles 158518 - 0x039B4 (Tunnels Entry Panel) - True - Triangles
Door - 0x0348A (Tunnels Entry) - 0x039B4 Door - 0x0348A (Tunnels Entry) - 0x039B4
159530 - 0x28B30 (Water EP) - True - True 159530 - 0x28B30 (Water EP) - True - True
Challenge Vault (Challenge):
158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True
Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87: Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87:
158668 - 0x2FAF6 (Vault Box) - True - True 158668 - 0x2FAF6 (Vault Box) - True - True
158519 - 0x27732 (Theater Shortcut Panel) - True - True 158519 - 0x27732 (Theater Shortcut Panel) - True - True
@ -1075,7 +1103,7 @@ Elevator (Mountain Final Room):
158535 - 0x3D9A8 (Back Wall Right) - 0x3D9A6 | 0x3D9A7 - True 158535 - 0x3D9A8 (Back Wall Right) - 0x3D9A6 | 0x3D9A7 - True
158536 - 0x3D9A9 (Elevator Start) - 0x3D9AA & 7 Lasers | 0x3D9A8 & 7 Lasers - True 158536 - 0x3D9A9 (Elevator Start) - 0x3D9AA & 7 Lasers | 0x3D9A8 & 7 Lasers - True
Boat (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay: The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay:
159042 - 0x22106 (Desert EP) - True - True 159042 - 0x22106 (Desert EP) - True - True
159223 - 0x03B25 (Shipwreck CCW Underside EP) - True - True 159223 - 0x03B25 (Shipwreck CCW Underside EP) - True - True
159231 - 0x28B29 (Shipwreck Green EP) - True - True 159231 - 0x28B29 (Shipwreck Green EP) - True - True
@ -1093,34 +1121,38 @@ Obelisks (EPs) - Entry - True:
159702 - 0xFFE02 (Desert Obelisk Side 3) - 0x3351D - True 159702 - 0xFFE02 (Desert Obelisk Side 3) - 0x3351D - True
159703 - 0xFFE03 (Desert Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True 159703 - 0xFFE03 (Desert Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True
159704 - 0xFFE04 (Desert Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True 159704 - 0xFFE04 (Desert Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True
159709 - 0x00359 (Desert Obelisk) - True - True
159710 - 0xFFE10 (Monastery Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True 159710 - 0xFFE10 (Monastery Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True
159711 - 0xFFE11 (Monastery Obelisk Side 2) - 0x03AC5 - True 159711 - 0xFFE11 (Monastery Obelisk Side 2) - 0x03AC5 - True
159712 - 0xFFE12 (Monastery Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True 159712 - 0xFFE12 (Monastery Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True
159713 - 0xFFE13 (Monastery Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True 159713 - 0xFFE13 (Monastery Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True
159714 - 0xFFE14 (Monastery Obelisk Side 5) - 0x03E01 - True 159714 - 0xFFE14 (Monastery Obelisk Side 5) - 0x03E01 - True
159715 - 0xFFE15 (Monastery Obelisk Side 6) - 0x289F4 & 0x289F5 - True 159715 - 0xFFE15 (Monastery Obelisk Side 6) - 0x289F4 & 0x289F5 - True
159719 - 0x00263 (Monastery Obelisk) - True - True
159720 - 0xFFE20 (Treehouse Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True 159720 - 0xFFE20 (Treehouse Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True
159721 - 0xFFE21 (Treehouse Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True 159721 - 0xFFE21 (Treehouse Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True
159722 - 0xFFE22 (Treehouse Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True 159722 - 0xFFE22 (Treehouse Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True
159723 - 0xFFE23 (Treehouse Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True 159723 - 0xFFE23 (Treehouse Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True
159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True 159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True
159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True 159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True
159729 - 0x00097 (Treehouse Obelisk) - True - True
159730 - 0xFFE30 (River Obelisk Side 1) - 0x001A3 & 0x335AE - True 159730 - 0xFFE30 (River Obelisk Side 1) - 0x001A3 & 0x335AE - True
159731 - 0xFFE31 (River Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True 159731 - 0xFFE31 (River Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True
159732 - 0xFFE32 (River Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True 159732 - 0xFFE32 (River Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True
159733 - 0xFFE33 (River Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True 159733 - 0xFFE33 (River Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True
159734 - 0xFFE34 (River Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True 159734 - 0xFFE34 (River Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True
159735 - 0xFFE35 (River Obelisk Side 6) - 0x035CB & 0x035CF - True 159735 - 0xFFE35 (River Obelisk Side 6) - 0x035CB & 0x035CF - True
159739 - 0x00367 (River Obelisk) - True - True
159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True 159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True
159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True 159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True
159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True 159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True
159743 - 0xFFE43 (Quarry Obelisk Side 4) - 0x33692 - True 159743 - 0xFFE43 (Quarry Obelisk Side 4) - 0x33692 - True
159744 - 0xFFE44 (Quarry Obelisk Side 5) - 0x03E77 & 0x03E7C - True 159744 - 0xFFE44 (Quarry Obelisk Side 5) - 0x03E77 & 0x03E7C - True
159749 - 0x22073 (Quarry Obelisk) - True - True
159750 - 0xFFE50 (Town Obelisk Side 1) - 0x035C7 - True 159750 - 0xFFE50 (Town Obelisk Side 1) - 0x035C7 - True
159751 - 0xFFE51 (Town Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True 159751 - 0xFFE51 (Town Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True
159752 - 0xFFE52 (Town Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True 159752 - 0xFFE52 (Town Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True
159753 - 0xFFE53 (Town Obelisk Side 4) - 0x28B30 & 0x035C9 - True 159753 - 0xFFE53 (Town Obelisk Side 4) - 0x28B30 & 0x035C9 - True
159754 - 0xFFE54 (Town Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True 159754 - 0xFFE54 (Town Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True
159755 - 0xFFE55 (Town Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True 159755 - 0xFFE55 (Town Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True
159759 - 0x0A16C (Town Obelisk) - True - True
Lasers (Lasers) - Entry - True:

View File

@ -1,3 +1,5 @@
Menu (Menu) - Entry - True:
Entry (Entry): Entry (Entry):
First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064:
@ -21,9 +23,9 @@ Tutorial (Tutorial) - Outside Tutorial - True:
159513 - 0x33600 (Patio Flowers EP) - 0x0C373 - True 159513 - 0x33600 (Patio Flowers EP) - 0x0C373 - True
159517 - 0x3352F (Gate EP) - 0x03505 - True 159517 - 0x3352F (Gate EP) - 0x03505 - True
Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2: Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0:
158650 - 0x033D4 (Vault) - True - Dots & Full Dots & Squares & Black/White Squares 158650 - 0x033D4 (Vault Panel) - True - Dots & Full Dots & Squares & Black/White Squares
158651 - 0x03481 (Vault Box) - 0x033D4 - True Door - 0x033D0 (Vault Door) - 0x033D4
158013 - 0x0005D (Shed Row 1) - True - Dots & Full Dots 158013 - 0x0005D (Shed Row 1) - True - Dots & Full Dots
158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots & Full Dots 158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots & Full Dots
158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots & Full Dots 158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots & Full Dots
@ -44,6 +46,9 @@ Door - 0x03BA2 (Outpost Path) - 0x0A3B5
159516 - 0x334A3 (Path EP) - True - True 159516 - 0x334A3 (Path EP) - True - True
159500 - 0x035C7 (Tractor EP) - True - True 159500 - 0x035C7 (Tractor EP) - True - True
Outside Tutorial Vault (Outside Tutorial):
158651 - 0x03481 (Vault Box) - True - True
Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170: Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170:
158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots & Triangles 158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots & Triangles
Door - 0x0A170 (Outpost Entry) - 0x0A171 Door - 0x0A170 (Outpost Entry) - 0x0A171
@ -54,6 +59,7 @@ Door - 0x04CA3 (Outpost Exit) - 0x04CA4
158600 - 0x17CFB (Discard) - True - Arrows 158600 - 0x17CFB (Discard) - True - Arrows
Main Island (Main Island) - Outside Tutorial - True: Main Island (Main Island) - Outside Tutorial - True:
159801 - 0xFFD00 (Reached Independently) - True - True
159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True 159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True
Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29: Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29:
@ -76,7 +82,7 @@ Inside Glass Factory (Glass Factory) - Inside Glass Factory Behind Back Wall - 0
158038 - 0x0343A (Melting 3) - 0x00082 - Symmetry & Dots 158038 - 0x0343A (Melting 3) - 0x00082 - Symmetry & Dots
Door - 0x0D7ED (Back Wall) - 0x0005C Door - 0x0D7ED (Back Wall) - 0x0005C
Inside Glass Factory Behind Back Wall (Glass Factory) - Boat - 0x17CC8: Inside Glass Factory Behind Back Wall (Glass Factory) - The Ocean - 0x17CC8:
158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat
Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E: Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E:
@ -112,12 +118,12 @@ Door - 0x18269 (Upper) - 0x1C349
159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True 159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True
Symmetry Island Upper (Symmetry Island): Symmetry Island Upper (Symmetry Island):
158065 - 0x00A52 (Yellow 1) - True - Symmetry & Colored Dots 158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots
158066 - 0x00A57 (Yellow 2) - 0x00A52 - Symmetry & Colored Dots 158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots
158067 - 0x00A5B (Yellow 3) - 0x00A57 - Symmetry & Colored Dots 158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots
158068 - 0x00A61 (Blue 1) - 0x00A52 - Symmetry & Colored Dots 158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots
158069 - 0x00A64 (Blue 2) - 0x00A61 & 0x00A52 - Symmetry & Colored Dots 158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots
158070 - 0x00A68 (Blue 3) - 0x00A64 & 0x00A57 - Symmetry & Colored Dots 158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots
158700 - 0x0360D (Laser Panel) - 0x00A68 - True 158700 - 0x0360D (Laser Panel) - 0x00A68 - True
Laser - 0x00509 (Laser) - 0x0360D Laser - 0x00509 (Laser) - 0x0360D
159001 - 0x03367 (Glass Factory Black Line EP) - True - True 159001 - 0x03367 (Glass Factory Black Line EP) - True - True
@ -135,9 +141,9 @@ Door - 0x03313 (Second Gate) - 0x032FF
Orchard End (Orchard): Orchard End (Orchard):
Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE: Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE - Desert Vault - 0x03444:
158652 - 0x0CC7B (Vault) - True - Dots & Full Dots & Stars & Stars + Same Colored Symbol & Eraser & Triangles & Shapers & Negative Shapers & Colored Squares 158652 - 0x0CC7B (Vault Panel) - True - Dots & Full Dots & Stars & Stars + Same Colored Symbol & Eraser & Triangles & Shapers & Negative Shapers & Colored Squares
158653 - 0x0339E (Vault Box) - 0x0CC7B - True Door - 0x03444 (Vault Door) - 0x0CC7B
158602 - 0x17CE7 (Discard) - True - Arrows 158602 - 0x17CE7 (Discard) - True - Arrows
158076 - 0x00698 (Surface 1) - True - True 158076 - 0x00698 (Surface 1) - True - True
158077 - 0x0048F (Surface 2) - 0x00698 - True 158077 - 0x0048F (Surface 2) - 0x00698 - True
@ -163,6 +169,9 @@ Laser - 0x012FB (Laser) - 0x03608
159040 - 0x334B9 (Shore EP) - True - True 159040 - 0x334B9 (Shore EP) - True - True
159041 - 0x334BC (Island EP) - True - True 159041 - 0x334BC (Island EP) - True - True
Desert Vault (Desert):
158653 - 0x0339E (Vault Box) - True - True
Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3: Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3:
158087 - 0x09FAA (Light Control) - True - True 158087 - 0x09FAA (Light Control) - True - True
158088 - 0x00422 (Light Room 1) - 0x09FAA - True 158088 - 0x00422 (Light Room 1) - 0x09FAA - True
@ -199,18 +208,19 @@ Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316:
Door - 0x0C316 (Elevator Room Entry) - 0x18076 Door - 0x0C316 (Elevator Room Entry) - 0x18076
159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True
Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x012FB: Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x01317:
158111 - 0x17C31 (Final Transparent) - True - True 158111 - 0x17C31 (Final Transparent) - True - True
158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - True 158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - True
158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True 158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True
158115 - 0x0A15C (Final Bent 1) - True - True 158115 - 0x0A15C (Final Bent 1) - True - True
158116 - 0x09FFF (Final Bent 2) - 0x0A15C - True 158116 - 0x09FFF (Final Bent 2) - 0x0A15C - True
158117 - 0x0A15F (Final Bent 3) - 0x09FFF - True 158117 - 0x0A15F (Final Bent 3) - 0x09FFF - True
159035 - 0x037BB (Elevator EP) - 0x012FB - True 159035 - 0x037BB (Elevator EP) - 0x01317 - True
Door - 0x01317 (Elevator) - 0x03608
Desert Lowest Level Inbetween Shortcuts (Desert): Desert Lowest Level Inbetween Shortcuts (Desert):
Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - TrueOneWay: Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01:
158118 - 0x09E57 (Entry 1 Panel) - True - Squares & Black/White Squares & Triangles 158118 - 0x09E57 (Entry 1 Panel) - True - Squares & Black/White Squares & Triangles
158603 - 0x17CF0 (Discard) - True - Arrows 158603 - 0x17CF0 (Discard) - True - Arrows
158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Triangles & Stars & Stars + Same Colored Symbol 158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Triangles & Stars & Stars + Same Colored Symbol
@ -222,7 +232,7 @@ Door - 0x09D6F (Entry 1) - 0x09E57
159420 - 0x289CF (Rock Line EP) - True - True 159420 - 0x289CF (Rock Line EP) - True - True
159421 - 0x289D1 (Rock Line Reflection EP) - True - True 159421 - 0x289D1 (Rock Line Reflection EP) - True - True
Quarry Elevator (Quarry): Quarry Elevator (Quarry) - Outside Quarry - 0x17CC4 - Quarry - 0x17CC4:
158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser 158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser
159403 - 0x17CB9 (Railroad EP) - 0x17CC4 - True 159403 - 0x17CB9 (Railroad EP) - 0x17CC4 - True
@ -230,28 +240,31 @@ Quarry Between Entrys (Quarry) - Quarry - 0x17C07:
158119 - 0x17C09 (Entry 2 Panel) - True - Shapers & Triangles 158119 - 0x17C09 (Entry 2 Panel) - True - Shapers & Triangles
Door - 0x17C07 (Entry 2) - 0x17C09 Door - 0x17C07 (Entry 2) - 0x17C09
Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010 - Quarry Elevator - 0x17CC4: Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010:
159802 - 0xFFD01 (Inside Reached Independently) - True - True
158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Squares & Black/White Squares & Stars & Stars + Same Colored Symbol 158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Squares & Black/White Squares & Stars & Stars + Same Colored Symbol
158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Triangles 158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Triangles
Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A
Quarry Stoneworks Ground Floor (Quarry Stoneworks) - Quarry - 0x275FF - Quarry Stoneworks Middle Floor - 0x03678 - Outside Quarry - 0x17CE8: Quarry Stoneworks Ground Floor (Quarry Stoneworks) - Quarry - 0x275FF - Quarry Stoneworks Middle Floor - 0x03678 - Outside Quarry - 0x17CE8 - Quarry Stoneworks Lift - TrueOneWay:
158123 - 0x275ED (Side Exit Panel) - True - True 158123 - 0x275ED (Side Exit Panel) - True - True
Door - 0x275FF (Side Exit) - 0x275ED Door - 0x275FF (Side Exit) - 0x275ED
158124 - 0x03678 (Lower Ramp Control) - True - Dots & Eraser 158124 - 0x03678 (Lower Ramp Control) - True - Dots & Eraser
158145 - 0x17CAC (Roof Exit Panel) - True - True 158145 - 0x17CAC (Roof Exit Panel) - True - True
Door - 0x17CE8 (Roof Exit) - 0x17CAC Door - 0x17CE8 (Roof Exit) - 0x17CAC
Quarry Stoneworks Middle Floor (Quarry Stoneworks) - Quarry Stoneworks Ground Floor - 0x03675 - Quarry Stoneworks Upper Floor - 0x03679: Quarry Stoneworks Middle Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - TrueOneWay:
158125 - 0x00E0C (Lower Row 1) - True - Triangles & Eraser 158125 - 0x00E0C (Lower Row 1) - True - Triangles & Eraser
158126 - 0x01489 (Lower Row 2) - 0x00E0C - Triangles & Eraser 158126 - 0x01489 (Lower Row 2) - 0x00E0C - Triangles & Eraser
158127 - 0x0148A (Lower Row 3) - 0x01489 - Triangles & Eraser 158127 - 0x0148A (Lower Row 3) - 0x01489 - Triangles & Eraser
158128 - 0x014D9 (Lower Row 4) - 0x0148A - Triangles & Eraser 158128 - 0x014D9 (Lower Row 4) - 0x0148A - Triangles & Eraser
158129 - 0x014E7 (Lower Row 5) - 0x014D9 - Triangles & Eraser 158129 - 0x014E7 (Lower Row 5) - 0x014D9 - Triangles & Eraser
158130 - 0x014E8 (Lower Row 6) - 0x014E7 - Triangles & Eraser 158130 - 0x014E8 (Lower Row 6) - 0x014E7 - Triangles & Eraser
Quarry Stoneworks Lift (Quarry Stoneworks) - Quarry Stoneworks Middle Floor - 0x03679 - Quarry Stoneworks Ground Floor - 0x03679 - Quarry Stoneworks Upper Floor - 0x03679:
158131 - 0x03679 (Lower Lift Control) - 0x014E8 - Dots & Eraser 158131 - 0x03679 (Lower Lift Control) - 0x014E8 - Dots & Eraser
Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Middle Floor - 0x03676 & 0x03679 - Quarry Stoneworks Ground Floor - 0x0368A: Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - 0x03675 - Quarry Stoneworks Ground Floor - 0x0368A:
158132 - 0x03676 (Upper Ramp Control) - True - Dots & Eraser 158132 - 0x03676 (Upper Ramp Control) - True - Dots & Eraser
158133 - 0x03675 (Upper Lift Control) - True - Dots & Eraser 158133 - 0x03675 (Upper Lift Control) - True - Dots & Eraser
158134 - 0x00557 (Upper Row 1) - True - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol 158134 - 0x00557 (Upper Row 1) - True - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
@ -262,7 +275,7 @@ Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Middle Flo
158139 - 0x3C12D (Upper Row 6) - 0x0146C - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol 158139 - 0x3C12D (Upper Row 6) - 0x0146C - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
158140 - 0x03686 (Upper Row 7) - 0x3C12D - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol 158140 - 0x03686 (Upper Row 7) - 0x3C12D - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
158141 - 0x014E9 (Upper Row 8) - 0x03686 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol 158141 - 0x014E9 (Upper Row 8) - 0x03686 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
158142 - 0x03677 (Stair Control) - True - Squares & Colored Squares & Eraser 158142 - 0x03677 (Stairs Panel) - True - Squares & Colored Squares & Eraser
Door - 0x0368A (Stairs) - 0x03677 Door - 0x0368A (Stairs) - 0x03677
158143 - 0x3C125 (Control Room Left) - 0x014E9 - Squares & Black/White Squares & Dots & Full Dots & Eraser 158143 - 0x3C125 (Control Room Left) - 0x014E9 - Squares & Black/White Squares & Dots & Full Dots & Eraser
158144 - 0x0367C (Control Room Right) - 0x014E9 - Squares & Colored Squares & Triangles & Eraser & Stars & Stars + Same Colored Symbol 158144 - 0x0367C (Control Room Right) - 0x014E9 - Squares & Colored Squares & Triangles & Eraser & Stars & Stars + Same Colored Symbol
@ -277,7 +290,7 @@ Quarry Boathouse (Quarry Boathouse) - Quarry - True - Quarry Boathouse Upper Fro
Door - 0x2769B (Dock) - 0x17CA6 Door - 0x2769B (Dock) - 0x17CA6
Door - 0x27163 (Dock Invis Barrier) - 0x17CA6 Door - 0x27163 (Dock Invis Barrier) - 0x17CA6
Quarry Boathouse Behind Staircase (Quarry Boathouse) - Boat - 0x17CA6: Quarry Boathouse Behind Staircase (Quarry Boathouse) - The Ocean - 0x17CA6:
Quarry Boathouse Upper Front (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x17C50: Quarry Boathouse Upper Front (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x17C50:
158149 - 0x021B3 (Front Row 1) - True - Shapers & Eraser & Negative Shapers 158149 - 0x021B3 (Front Row 1) - True - Shapers & Eraser & Negative Shapers
@ -309,9 +322,9 @@ Door - 0x3865F (Second Barrier) - 0x38663
158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol 158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol
159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True 159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True
Shadows (Shadows) - Main Island - True - Shadows Ledge - 0x19B24 - Shadows Laser Room - 0x194B2 & 0x19665: Shadows (Shadows) - Main Island - True - Shadows Ledge - 0x19B24 - Shadows Laser Room - 0x194B2 | 0x19665:
158170 - 0x334DB (Door Timer Outside) - True - True 158170 - 0x334DB (Door Timer Outside) - True - True
Door - 0x19B24 (Timed Door) - 0x334DB Door - 0x19B24 (Timed Door) - 0x334DB | 0x334DC
158171 - 0x0AC74 (Intro 6) - 0x0A8DC - True 158171 - 0x0AC74 (Intro 6) - 0x0A8DC - True
158172 - 0x0AC7A (Intro 7) - 0x0AC74 - True 158172 - 0x0AC7A (Intro 7) - 0x0AC74 - True
158173 - 0x0A8E0 (Intro 8) - 0x0AC7A - True 158173 - 0x0A8E0 (Intro 8) - 0x0AC7A - True
@ -336,7 +349,7 @@ Shadows Ledge (Shadows) - Shadows - 0x1855B - Quarry - 0x19865 & 0x0A2DF:
158187 - 0x334DC (Door Timer Inside) - True - True 158187 - 0x334DC (Door Timer Inside) - True - True
158188 - 0x198B5 (Intro 1) - True - True 158188 - 0x198B5 (Intro 1) - True - True
158189 - 0x198BD (Intro 2) - 0x198B5 - True 158189 - 0x198BD (Intro 2) - 0x198B5 - True
158190 - 0x198BF (Intro 3) - 0x198BD & 0x334DC & 0x19B24 - True 158190 - 0x198BF (Intro 3) - 0x198BD & 0x19B24 - True
Door - 0x19865 (Quarry Barrier) - 0x198BF Door - 0x19865 (Quarry Barrier) - 0x198BF
Door - 0x0A2DF (Quarry Barrier 2) - 0x198BF Door - 0x0A2DF (Quarry Barrier 2) - 0x198BF
158191 - 0x19771 (Intro 4) - 0x198BF - True 158191 - 0x19771 (Intro 4) - 0x198BF - True
@ -345,7 +358,7 @@ Door - 0x1855B (Ledge Barrier) - 0x0A8DC
Door - 0x19ADE (Ledge Barrier 2) - 0x0A8DC Door - 0x19ADE (Ledge Barrier 2) - 0x0A8DC
Shadows Laser Room (Shadows): Shadows Laser Room (Shadows):
158703 - 0x19650 (Laser Panel) - True - True 158703 - 0x19650 (Laser Panel) - 0x194B2 & 0x19665 - True
Laser - 0x181B3 (Laser) - 0x19650 Laser - 0x181B3 (Laser) - 0x19650
Treehouse Beach (Treehouse Beach) - Main Island - True: Treehouse Beach (Treehouse Beach) - Main Island - True:
@ -395,9 +408,9 @@ Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F
158205 - 0x09E49 (Shadows Shortcut Panel) - True - True 158205 - 0x09E49 (Shadows Shortcut Panel) - True - True
Door - 0x09E3D (Shadows Shortcut) - 0x09E49 Door - 0x09E3D (Shadows Shortcut) - 0x09E49
Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True: Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True - Shipwreck Vault - 0x17BB4:
158654 - 0x00AFB (Vault) - True - Symmetry & Sound Dots & Colored Dots 158654 - 0x00AFB (Vault Panel) - True - Symmetry & Sound Dots & Colored Dots
158655 - 0x03535 (Vault Box) - 0x00AFB - True Door - 0x17BB4 (Vault Door) - 0x00AFB
158605 - 0x17D28 (Discard) - True - Arrows 158605 - 0x17D28 (Discard) - True - Arrows
159220 - 0x03B22 (Circle Far EP) - True - True 159220 - 0x03B22 (Circle Far EP) - True - True
159221 - 0x03B23 (Circle Left EP) - True - True 159221 - 0x03B23 (Circle Left EP) - True - True
@ -407,6 +420,9 @@ Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True:
159226 - 0x28ABE (Rope Outer EP) - True - True 159226 - 0x28ABE (Rope Outer EP) - True - True
159230 - 0x3388F (Couch EP) - 0x17CDF | 0x0A054 - True 159230 - 0x3388F (Couch EP) - 0x17CDF | 0x0A054 - True
Shipwreck Vault (Shipwreck):
158655 - 0x03535 (Vault Box) - True - True
Keep Tower (Keep) - Keep - 0x04F8F: Keep Tower (Keep) - Keep - 0x04F8F:
158206 - 0x0361B (Tower Shortcut Panel) - True - True 158206 - 0x0361B (Tower Shortcut Panel) - True - True
Door - 0x04F8F (Tower Shortcut) - 0x0361B Door - 0x04F8F (Tower Shortcut) - 0x0361B
@ -422,8 +438,8 @@ Laser - 0x014BB (Laser) - 0x0360E | 0x03317
159251 - 0x3348F (Hedges EP) - True - True 159251 - 0x3348F (Hedges EP) - True - True
Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750: Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750:
158207 - 0x03713 (Shortcut Panel) - True - True 158207 - 0x03713 (Laser Shortcut Panel) - True - True
Door - 0x0364E (Shortcut) - 0x03713 Door - 0x0364E (Laser Shortcut) - 0x03713
158208 - 0x00B10 (Entry Left) - True - True 158208 - 0x00B10 (Entry Left) - True - True
158209 - 0x00C92 (Entry Right) - True - True 158209 - 0x00C92 (Entry Right) - True - True
Door - 0x0C128 (Entry Inner) - 0x00B10 Door - 0x0C128 (Entry Inner) - 0x00B10
@ -454,7 +470,7 @@ Inside Monastery (Monastery):
Monastery Garden (Monastery): Monastery Garden (Monastery):
Town (Town) - Main Island - True - Boat - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9: Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9:
158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat
158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Squares & Black/White Squares & Shapers & Triangles 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Squares & Black/White Squares & Shapers & Triangles
Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
@ -469,11 +485,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Triangles & Dots & Full Dots 158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Triangles & Dots & Full Dots
158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Triangles & Dots & Full Dots 158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Triangles & Dots & Full Dots
Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1 Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1
158225 - 0x28998 (Tinted Glass Door Panel) - True - Stars & Rotated Shapers & Stars + Same Colored Symbol 158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers & Stars + Same Colored Symbol
Door - 0x28A61 (Tinted Glass Door) - 0x28A0D Door - 0x28A61 (RGB House Entry) - 0x28A0D
158226 - 0x28A0D (Church Entry Panel) - 0x28998 - Stars 158226 - 0x28A0D (Church Entry Panel) - 0x28998 - Stars
Door - 0x03BB0 (Church Entry) - 0x03C08 Door - 0x03BB0 (Church Entry) - 0x03C08
158228 - 0x28A79 (Maze Stair Control) - True - True 158228 - 0x28A79 (Maze Panel) - True - True
Door - 0x28AA2 (Maze Stairs) - 0x28A79 Door - 0x28AA2 (Maze Stairs) - 0x28A79
158241 - 0x17F5F (Windmill Entry Panel) - True - Dots 158241 - 0x17F5F (Windmill Entry Panel) - True - Dots
Door - 0x1845B (Windmill Entry) - 0x17F5F Door - 0x1845B (Windmill Entry) - 0x17F5F
@ -484,7 +500,7 @@ Door - 0x1845B (Windmill Entry) - 0x17F5F
159541 - 0x03412 (Tower Underside Fourth EP) - True - True 159541 - 0x03412 (Tower Underside Fourth EP) - True - True
159542 - 0x038A6 (Tower Underside First EP) - True - True 159542 - 0x038A6 (Tower Underside First EP) - True - True
159543 - 0x038AA (Tower Underside Second EP) - True - True 159543 - 0x038AA (Tower Underside Second EP) - True - True
159545 - 0x03E40 (RGB House Green EP) - 0x334D8 & 0x03C0C & 0x03C08 - True 159545 - 0x03E40 (RGB House Green EP) - 0x334D8 - True
159546 - 0x28B8E (Maze Bridge Underside EP) - 0x2896A - True 159546 - 0x28B8E (Maze Bridge Underside EP) - 0x2896A - True
159552 - 0x03BCF (Black Line Redirect EP) - True - True 159552 - 0x03BCF (Black Line Redirect EP) - True - True
159800 - 0xFFF80 (Pet the Dog) - True - True 159800 - 0xFFF80 (Pet the Dog) - True - True
@ -557,7 +573,7 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2
159556 - 0x33A2A (Door EP) - 0x03553 - True 159556 - 0x33A2A (Door EP) - 0x03553 - True
159558 - 0x33B06 (Church EP) - 0x0354E - True 159558 - 0x33B06 (Church EP) - 0x0354E - True
Jungle (Jungle) - Main Island - True - Outside Jungle River - 0x3873B - Boat - 0x17CDF: Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF:
158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat
158609 - 0x17F9B (Discard) - True - Arrows 158609 - 0x17F9B (Discard) - True - Arrows
158252 - 0x002C4 (First Row 1) - True - True 158252 - 0x002C4 (First Row 1) - True - True
@ -588,18 +604,21 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA
159350 - 0x035CB (Bamboo CCW EP) - True - True 159350 - 0x035CB (Bamboo CCW EP) - True - True
159351 - 0x035CF (Bamboo CW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True
Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A: Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287:
158267 - 0x17CAA (Monastery Shortcut Panel) - True - True 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True
Door - 0x0CF2A (Monastery Shortcut) - 0x17CAA Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA
158663 - 0x15ADD (Vault) - True - Black/White Squares & Dots 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots
158664 - 0x03702 (Vault Box) - 0x15ADD - True Door - 0x15287 (Vault Door) - 0x15ADD
159110 - 0x03AC5 (Green Leaf Moss EP) - True - True 159110 - 0x03AC5 (Green Leaf Moss EP) - True - True
159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True 159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True
159121 - 0x03BE3 (Monastery Garden Right EP) - True - True 159121 - 0x03BE3 (Monastery Garden Right EP) - True - True
159122 - 0x0A409 (Monastery Wall EP) - True - True 159122 - 0x0A409 (Monastery Wall EP) - True - True
River Vault (River):
158664 - 0x03702 (Vault Box) - True - True
Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4: Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4:
158268 - 0x17C2E (Entry Panel) - True - Squares & Black/White Squares & Colored Squares 158268 - 0x17C2E (Entry Panel) - True - Squares & Black/White Squares
Door - 0x0C2A4 (Entry) - 0x17C2E Door - 0x0C2A4 (Entry) - 0x17C2E
Bunker (Bunker) - Bunker Glass Room - 0x17C79: Bunker (Bunker) - Bunker Glass Room - 0x17C79:
@ -616,9 +635,9 @@ Bunker (Bunker) - Bunker Glass Room - 0x17C79:
Door - 0x17C79 (Tinted Glass Door) - 0x0A099 Door - 0x17C79 (Tinted Glass Door) - 0x0A099
Bunker Glass Room (Bunker) - Bunker Ultraviolet Room - 0x0C2A3: Bunker Glass Room (Bunker) - Bunker Ultraviolet Room - 0x0C2A3:
158279 - 0x0A010 (Glass Room 1) - True - Squares & Colored Squares 158279 - 0x0A010 (Glass Room 1) - 0x17C79 - Squares & Colored Squares
158280 - 0x0A01B (Glass Room 2) - 0x0A010 - Squares & Colored Squares & Black/White Squares 158280 - 0x0A01B (Glass Room 2) - 0x17C79 & 0x0A010 - Squares & Colored Squares & Black/White Squares
158281 - 0x0A01F (Glass Room 3) - 0x0A01B - Squares & Colored Squares & Black/White Squares 158281 - 0x0A01F (Glass Room 3) - 0x17C79 & 0x0A01B - Squares & Colored Squares & Black/White Squares
Door - 0x0C2A3 (UV Room Entry) - 0x0A01F Door - 0x0C2A3 (UV Room Entry) - 0x0A01F
Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D: Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D:
@ -631,7 +650,7 @@ Door - 0x0A08D (Elevator Room Entry) - 0x17E67
Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay:
159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True
Bunker Elevator (Bunker) - Bunker Laser Platform - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079:
158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares
Bunker Green Room (Bunker) - Bunker Elevator - TrueOneWay: Bunker Green Room (Bunker) - Bunker Elevator - TrueOneWay:
@ -676,7 +695,7 @@ Swamp Near Platform (Swamp) - Swamp Cyan Underwater - 0x04B7F - Swamp Near Boat
158316 - 0x00990 (Platform Row 4) - 0x0098F - Rotated Shapers 158316 - 0x00990 (Platform Row 4) - 0x0098F - Rotated Shapers
Door - 0x184B7 (Between Bridges First Door) - 0x00990 Door - 0x184B7 (Between Bridges First Door) - 0x00990
158317 - 0x17C0D (Platform Shortcut Left Panel) - True - Rotated Shapers 158317 - 0x17C0D (Platform Shortcut Left Panel) - True - Rotated Shapers
158318 - 0x17C0E (Platform Shortcut Right Panel) - True - Rotated Shapers 158318 - 0x17C0E (Platform Shortcut Right Panel) - 0x17C0D - Rotated Shapers
Door - 0x38AE6 (Platform Shortcut Door) - 0x17C0E Door - 0x38AE6 (Platform Shortcut Door) - 0x17C0E
Door - 0x04B7F (Cyan Water Pump) - 0x00006 Door - 0x04B7F (Cyan Water Pump) - 0x00006
@ -715,18 +734,21 @@ Swamp Rotating Bridge (Swamp) - Swamp Between Bridges Far - 0x181F5 - Swamp Near
159331 - 0x016B2 (Rotating Bridge CCW EP) - 0x181F5 - True 159331 - 0x016B2 (Rotating Bridge CCW EP) - 0x181F5 - True
159334 - 0x036CE (Rotating Bridge CW EP) - 0x181F5 - True 159334 - 0x036CE (Rotating Bridge CW EP) - 0x181F5 - True
Swamp Near Boat (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Blue Underwater - 0x18482: Swamp Near Boat (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Blue Underwater - 0x18482 - Swamp Long Bridge - 0xFFD00 & 0xFFD02 - The Ocean - 0x09DB8:
158903 - 0xFFD02 (Beyond Rotating Bridge Reached Independently) - True - True
158328 - 0x09DB8 (Boat Spawn) - True - Boat 158328 - 0x09DB8 (Boat Spawn) - True - Boat
158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Shapers & Dots & Full Dots 158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Shapers & Dots & Full Dots
158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers & Shapers & Dots & Full Dots 158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers & Shapers & Dots & Full Dots
158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Shapers & Dots & Full Dots 158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Shapers & Dots & Full Dots
158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Shapers & Dots & Full Dots 158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Shapers & Dots & Full Dots
158339 - 0x17E2B (Long Bridge Control) - True - Rotated Shapers & Shapers
Door - 0x18482 (Blue Water Pump) - 0x00E3A Door - 0x18482 (Blue Water Pump) - 0x00E3A
159332 - 0x3365F (Boat EP) - 0x09DB8 - True 159332 - 0x3365F (Boat EP) - 0x09DB8 - True
159333 - 0x03731 (Long Bridge Side EP) - 0x17E2B - True 159333 - 0x03731 (Long Bridge Side EP) - 0x17E2B - True
Swamp Purple Area (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Purple Underwater - 0x0A1D6: Swamp Long Bridge (Swamp) - Swamp Near Boat - 0x17E2B - Outside Swamp - 0x17E2B:
158339 - 0x17E2B (Long Bridge Control) - True - Rotated Shapers & Shapers
Swamp Purple Area (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Purple Underwater - 0x0A1D6 - Swamp Near Boat - TrueOneWay:
Door - 0x0A1D6 (Purple Water Pump) - 0x00E3A Door - 0x0A1D6 (Purple Water Pump) - 0x00E3A
Swamp Purple Underwater (Swamp): Swamp Purple Underwater (Swamp):
@ -752,7 +774,7 @@ Laser - 0x00BF6 (Laser) - 0x03615
158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Stars & Stars + Same Colored Symbol 158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Stars & Stars + Same Colored Symbol
Door - 0x2D880 (Laser Shortcut) - 0x17C02 Door - 0x2D880 (Laser Shortcut) - 0x17C02
Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309: Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309 - The Ocean - 0x17C95:
158343 - 0x17C95 (Boat Spawn) - True - Boat 158343 - 0x17C95 (Boat Spawn) - True - Boat
158344 - 0x0288C (First Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles 158344 - 0x0288C (First Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles
Door - 0x0C309 (First Door) - 0x0288C Door - 0x0C309 (First Door) - 0x0288C
@ -778,7 +800,7 @@ Treehouse After Yellow Bridge (Treehouse) - Treehouse Junction - 0x0A181:
Door - 0x0A181 (Third Door) - 0x0A182 Door - 0x0A181 (Third Door) - 0x0A182
Treehouse Junction (Treehouse) - Treehouse Right Orange Bridge - True - Treehouse First Purple Bridge - True - Treehouse Green Bridge - True: Treehouse Junction (Treehouse) - Treehouse Right Orange Bridge - True - Treehouse First Purple Bridge - True - Treehouse Green Bridge - True:
158356 - 0x2700B (Laser House Door Timer Outside Control) - True - True 158356 - 0x2700B (Laser House Door Timer Outside) - True - True
Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x17D6C: Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x17D6C:
158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Dots & Full Dots 158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Dots & Full Dots
@ -802,7 +824,7 @@ Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2:
158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars & Stars + Same Colored Symbol & Triangles 158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars & Stars + Same Colored Symbol & Triangles
Treehouse Bridge Platform (Treehouse) - Main Island - 0x0C32D: Treehouse Bridge Platform (Treehouse) - Main Island - 0x0C32D:
158404 - 0x037FF (Bridge Control) - True - Stars 158404 - 0x037FF (Drawbridge Panel) - True - Stars
Door - 0x0C32D (Drawbridge) - 0x037FF Door - 0x0C32D (Drawbridge) - 0x037FF
Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6: Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6:
@ -847,7 +869,7 @@ Treehouse Green Bridge Left House (Treehouse):
159211 - 0x220A7 (Right Orange Bridge EP) - 0x17DA2 - True 159211 - 0x220A7 (Right Orange Bridge EP) - 0x17DA2 - True
Treehouse Laser Room Front Platform (Treehouse) - Treehouse Laser Room - 0x0C323: Treehouse Laser Room Front Platform (Treehouse) - Treehouse Laser Room - 0x0C323:
Door - 0x0C323 (Laser House Entry) - 0x17DA2 & 0x2700B & 0x17DEC Door - 0x0C323 (Laser House Entry) - 0x17DA2 & 0x2700B & 0x17DEC | 0x17CBC
Treehouse Laser Room Back Platform (Treehouse): Treehouse Laser Room Back Platform (Treehouse):
158611 - 0x17FA0 (Laser Discard) - True - Arrows 158611 - 0x17FA0 (Laser Discard) - True - Arrows
@ -860,19 +882,22 @@ Treehouse Laser Room (Treehouse):
158403 - 0x17CBC (Laser House Door Timer Inside) - True - True 158403 - 0x17CBC (Laser House Door Timer Inside) - True - True
Laser - 0x028A4 (Laser) - 0x03613 Laser - 0x028A4 (Laser) - 0x03613
Mountainside (Mountainside) - Main Island - True - Mountaintop - True: Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085:
158612 - 0x17C42 (Discard) - True - Arrows 158612 - 0x17C42 (Discard) - True - Arrows
158665 - 0x002A6 (Vault) - True - Symmetry & Colored Squares & Triangles & Stars & Stars + Same Colored Symbol 158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Squares & Triangles & Stars & Stars + Same Colored Symbol
158666 - 0x03542 (Vault Box) - 0x002A6 - True Door - 0x00085 (Vault Door) - 0x002A6
159301 - 0x335AE (Cloud Cycle EP) - True - True 159301 - 0x335AE (Cloud Cycle EP) - True - True
159325 - 0x33505 (Bush EP) - True - True 159325 - 0x33505 (Bush EP) - True - True
159335 - 0x03C07 (Apparent River EP) - True - True 159335 - 0x03C07 (Apparent River EP) - True - True
Mountainside Vault (Mountainside):
158666 - 0x03542 (Vault Box) - True - True
Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34:
158405 - 0x0042D (River Shape) - True - True 158405 - 0x0042D (River Shape) - True - True
158406 - 0x09F7F (Box Short) - 7 Lasers - True 158406 - 0x09F7F (Box Short) - 7 Lasers - True
158407 - 0x17C34 (Trap Door Triple Exit) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol & Triangles 158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol & Triangles
158800 - 0xFFF00 (Box Long) - 7 Lasers & 11 Lasers & 0x17C34 - True 158800 - 0xFFF00 (Box Long) - 11 Lasers & 0x17C34 - True
159300 - 0x001A3 (River Shape EP) - True - True 159300 - 0x001A3 (River Shape EP) - True - True
159320 - 0x3370E (Arch Black EP) - True - True 159320 - 0x3370E (Arch Black EP) - True - True
159324 - 0x336C8 (Arch White Right EP) - True - True 159324 - 0x336C8 (Arch White Right EP) - True - True
@ -881,7 +906,7 @@ Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34:
Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39: Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39:
158408 - 0x09E39 (Light Bridge Controller) - True - Eraser & Triangles 158408 - 0x09E39 (Light Bridge Controller) - True - Eraser & Triangles
Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Top Layer At Door - TrueOneWay:
158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots & Stars & Stars + Same Colored Symbol 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots & Stars & Stars + Same Colored Symbol
158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Triangles 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Triangles
158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars & Stars + Same Colored Symbol 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars & Stars + Same Colored Symbol
@ -899,6 +924,8 @@ Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Stars & Shapers & Stars + Same Colored Symbol 158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Stars & Shapers & Stars + Same Colored Symbol
158424 - 0x09EAD (Trash Pillar 1) - True - Rotated Shapers & Stars 158424 - 0x09EAD (Trash Pillar 1) - True - Rotated Shapers & Stars
158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Rotated Shapers & Triangles 158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Rotated Shapers & Triangles
Mountain Top Layer At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B
Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay:
@ -917,7 +944,7 @@ Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86
Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2): Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2):
158431 - 0x09E86 (Light Bridge Controller Near) - True - Shapers & Dots 158431 - 0x09E86 (Light Bridge Controller Near) - True - Shapers & Dots
Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay: Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay - Mountain Floor 2 - 0x09ED8:
158432 - 0x09FCC (Far Row 1) - True - Triangles 158432 - 0x09FCC (Far Row 1) - True - Triangles
158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares & Stars & Stars + Same Colored Symbol 158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares & Stars & Stars + Same Colored Symbol
158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars & Triangles & Stars + Same Colored Symbol 158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars & Triangles & Stars + Same Colored Symbol
@ -935,29 +962,27 @@ Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator -
Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Third Layer - 0x09EEB: Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Third Layer - 0x09EEB:
158439 - 0x09EEB (Elevator Control Panel) - True - Dots 158439 - 0x09EEB (Elevator Control Panel) - True - Dots
Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89: Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89 - Mountain Pink Bridge EP - TrueOneWay:
158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser & Negative Shapers 158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser & Negative Shapers
158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Shapers & Eraser & Negative Shapers 158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Shapers & Eraser & Negative Shapers
158442 - 0x09F01 (Giant Puzzle Top Right) - True - Shapers & Eraser & Negative Shapers 158442 - 0x09F01 (Giant Puzzle Top Right) - True - Shapers & Eraser & Negative Shapers
158443 - 0x09EFF (Giant Puzzle Top Left) - True - Shapers & Eraser & Negative Shapers 158443 - 0x09EFF (Giant Puzzle Top Left) - True - Shapers & Eraser & Negative Shapers
158444 - 0x09FDA (Giant Puzzle) - 0x09FC1 & 0x09F8E & 0x09F01 & 0x09EFF - Shapers & Symmetry 158444 - 0x09FDA (Giant Puzzle) - 0x09FC1 & 0x09F8E & 0x09F01 & 0x09EFF - Shapers & Symmetry
159313 - 0x09D5D (Yellow Bridge EP) - 0x09E86 & 0x09ED8 - True
159314 - 0x09D5E (Blue Bridge EP) - 0x09E86 & 0x09ED8 - True
Door - 0x09F89 (Exit) - 0x09FDA Door - 0x09F89 (Exit) - 0x09FDA
Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Bottom Floor Rock - 0x17FA2 - Final Room - 0x0C141 - Mountain Pink Bridge EP - TrueOneWay: Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Final Room - 0x0C141:
158614 - 0x17FA2 (Discard) - 0xFFF00 - Arrows 158614 - 0x17FA2 (Discard) - 0xFFF00 - Arrows
158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars 158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars
158446 - 0x01987 (Final Room Entry Right) - True - Squares & Colored Squares & Dots 158446 - 0x01987 (Final Room Entry Right) - True - Squares & Colored Squares & Dots
Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987
159313 - 0x09D5D (Yellow Bridge EP) - 0x09E86 & 0x09ED8 - True Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1
159314 - 0x09D5E (Blue Bridge EP) - 0x09E86 & 0x09ED8 - True
Mountain Pink Bridge EP (Mountain Floor 2): Mountain Pink Bridge EP (Mountain Floor 2):
159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True
Mountain Bottom Floor Rock (Mountain Bottom Floor) - Mountain Bottom Floor - 0x17F33 - Mountain Path to Caves - 0x17F33: Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D:
Door - 0x17F33 (Rock Open) - True
Mountain Path to Caves (Mountain Bottom Floor) - Mountain Bottom Floor Rock - 0x334E1 - Caves - 0x2D77D:
158447 - 0x00FF8 (Caves Entry Panel) - True - Arrows & Black/White Squares 158447 - 0x00FF8 (Caves Entry Panel) - True - Arrows & Black/White Squares
Door - 0x2D77D (Caves Entry) - 0x00FF8 Door - 0x2D77D (Caves Entry) - 0x00FF8
158448 - 0x334E1 (Rock Control) - True - True 158448 - 0x334E1 (Rock Control) - True - True
@ -1021,31 +1046,34 @@ Path to Challenge (Caves) - Challenge - 0x0A19A:
158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Arrows & Stars + Same Colored Symbol 158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Arrows & Stars + Same Colored Symbol
Door - 0x0A19A (Challenge Entry) - 0x0A16E Door - 0x0A19A (Challenge Entry) - 0x0A16E
Challenge (Challenge) - Tunnels - 0x0348A: Challenge (Challenge) - Tunnels - 0x0348A - Challenge Vault - 0x04D75:
158499 - 0x0A332 (Start Timer) - 11 Lasers - True 158499 - 0x0A332 (Start Timer) - 11 Lasers - True
158500 - 0x0088E (Small Basic) - 0x0A332 - True 158500 - 0x0088E (Small Basic) - 0x0A332 - True
158501 - 0x00BAF (Big Basic) - 0x0088E - True 158501 - 0x00BAF (Big Basic) - 0x0088E - True
158502 - 0x00BF3 (Square) - 0x00BAF - Squares & Black/White Squares 158502 - 0x00BF3 (Square) - 0x00BAF - Black/White Squares
158503 - 0x00C09 (Maze Map) - 0x00BF3 - Dots 158503 - 0x00C09 (Maze Map) - 0x00BF3 - Dots
158504 - 0x00CDB (Stars and Dots) - 0x00C09 - Stars & Dots 158504 - 0x00CDB (Stars and Dots) - 0x00C09 - Stars & Dots
158505 - 0x0051F (Symmetry) - 0x00CDB - Symmetry & Colored Dots & Dots 158505 - 0x0051F (Symmetry) - 0x00CDB - Symmetry & Colored Dots & Dots
158506 - 0x00524 (Stars and Shapers) - 0x0051F - Stars & Shapers 158506 - 0x00524 (Stars and Shapers) - 0x0051F - Stars & Shapers
158507 - 0x00CD4 (Big Basic 2) - 0x00524 - True 158507 - 0x00CD4 (Big Basic 2) - 0x00524 - True
158508 - 0x00CB9 (Choice Squares Right) - 0x00CD4 - Squares & Black/White Squares 158508 - 0x00CB9 (Choice Squares Right) - 0x00CD4 - Black/White Squares
158509 - 0x00CA1 (Choice Squares Middle) - 0x00CD4 - Squares & Black/White Squares 158509 - 0x00CA1 (Choice Squares Middle) - 0x00CD4 - Black/White Squares
158510 - 0x00C80 (Choice Squares Left) - 0x00CD4 - Squares & Black/White Squares 158510 - 0x00C80 (Choice Squares Left) - 0x00CD4 - Black/White Squares
158511 - 0x00C68 (Choice Squares 2 Right) - 0x00CB9 | 0x00CA1 | 0x00C80 - Squares & Black/White Squares & Colored Squares 158511 - 0x00C68 (Choice Squares 2 Right) - 0x00CB9 | 0x00CA1 | 0x00C80 - Black/White Squares & Colored Squares
158512 - 0x00C59 (Choice Squares 2 Middle) - 0x00CB9 | 0x00CA1 | 0x00C80 - Squares & Black/White Squares & Colored Squares 158512 - 0x00C59 (Choice Squares 2 Middle) - 0x00CB9 | 0x00CA1 | 0x00C80 - Black/White Squares & Colored Squares
158513 - 0x00C22 (Choice Squares 2 Left) - 0x00CB9 | 0x00CA1 | 0x00C80 - Squares & Black/White Squares & Colored Squares 158513 - 0x00C22 (Choice Squares 2 Left) - 0x00CB9 | 0x00CA1 | 0x00C80 - Black/White Squares & Colored Squares
158514 - 0x034F4 (Maze Hidden 1) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles 158514 - 0x034F4 (Maze Hidden 1) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles
158515 - 0x034EC (Maze Hidden 2) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles 158515 - 0x034EC (Maze Hidden 2) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles
158516 - 0x1C31A (Dots Pillar) - 0x034F4 & 0x034EC - Dots & Symmetry 158516 - 0x1C31A (Dots Pillar) - 0x034F4 & 0x034EC - Dots & Symmetry
158517 - 0x1C319 (Squares Pillar) - 0x034F4 & 0x034EC - Squares & Black/White Squares & Symmetry 158517 - 0x1C319 (Squares Pillar) - 0x034F4 & 0x034EC - Black/White Squares & Symmetry
158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True Door - 0x04D75 (Vault Door) - 0x1C31A & 0x1C319
158518 - 0x039B4 (Tunnels Entry Panel) - True - Arrows 158518 - 0x039B4 (Tunnels Entry Panel) - True - Arrows
Door - 0x0348A (Tunnels Entry) - 0x039B4 Door - 0x0348A (Tunnels Entry) - 0x039B4
159530 - 0x28B30 (Water EP) - True - True 159530 - 0x28B30 (Water EP) - True - True
Challenge Vault (Challenge):
158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True
Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87: Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87:
158668 - 0x2FAF6 (Vault Box) - True - True 158668 - 0x2FAF6 (Vault Box) - True - True
158519 - 0x27732 (Theater Shortcut Panel) - True - True 158519 - 0x27732 (Theater Shortcut Panel) - True - True
@ -1075,7 +1103,7 @@ Elevator (Mountain Final Room):
158535 - 0x3D9A8 (Back Wall Right) - 0x3D9A6 | 0x3D9A7 - True 158535 - 0x3D9A8 (Back Wall Right) - 0x3D9A6 | 0x3D9A7 - True
158536 - 0x3D9A9 (Elevator Start) - 0x3D9AA & 7 Lasers | 0x3D9A8 & 7 Lasers - True 158536 - 0x3D9A9 (Elevator Start) - 0x3D9AA & 7 Lasers | 0x3D9A8 & 7 Lasers - True
Boat (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay: The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay:
159042 - 0x22106 (Desert EP) - True - True 159042 - 0x22106 (Desert EP) - True - True
159223 - 0x03B25 (Shipwreck CCW Underside EP) - True - True 159223 - 0x03B25 (Shipwreck CCW Underside EP) - True - True
159231 - 0x28B29 (Shipwreck Green EP) - True - True 159231 - 0x28B29 (Shipwreck Green EP) - True - True
@ -1093,32 +1121,38 @@ Obelisks (EPs) - Entry - True:
159702 - 0xFFE02 (Desert Obelisk Side 3) - 0x3351D - True 159702 - 0xFFE02 (Desert Obelisk Side 3) - 0x3351D - True
159703 - 0xFFE03 (Desert Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True 159703 - 0xFFE03 (Desert Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True
159704 - 0xFFE04 (Desert Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True 159704 - 0xFFE04 (Desert Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True
159709 - 0x00359 (Desert Obelisk) - True - True
159710 - 0xFFE10 (Monastery Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True 159710 - 0xFFE10 (Monastery Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True
159711 - 0xFFE11 (Monastery Obelisk Side 2) - 0x03AC5 - True 159711 - 0xFFE11 (Monastery Obelisk Side 2) - 0x03AC5 - True
159712 - 0xFFE12 (Monastery Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True 159712 - 0xFFE12 (Monastery Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True
159713 - 0xFFE13 (Monastery Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True 159713 - 0xFFE13 (Monastery Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True
159714 - 0xFFE14 (Monastery Obelisk Side 5) - 0x03E01 - True 159714 - 0xFFE14 (Monastery Obelisk Side 5) - 0x03E01 - True
159715 - 0xFFE15 (Monastery Obelisk Side 6) - 0x289F4 & 0x289F5 - True 159715 - 0xFFE15 (Monastery Obelisk Side 6) - 0x289F4 & 0x289F5 - True
159719 - 0x00263 (Monastery Obelisk) - True - True
159720 - 0xFFE20 (Treehouse Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True 159720 - 0xFFE20 (Treehouse Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True
159721 - 0xFFE21 (Treehouse Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True 159721 - 0xFFE21 (Treehouse Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True
159722 - 0xFFE22 (Treehouse Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True 159722 - 0xFFE22 (Treehouse Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True
159723 - 0xFFE23 (Treehouse Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True 159723 - 0xFFE23 (Treehouse Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True
159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True 159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True
159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True 159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True
159729 - 0x00097 (Treehouse Obelisk) - True - True
159730 - 0xFFE30 (River Obelisk Side 1) - 0x001A3 & 0x335AE - True 159730 - 0xFFE30 (River Obelisk Side 1) - 0x001A3 & 0x335AE - True
159731 - 0xFFE31 (River Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True 159731 - 0xFFE31 (River Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True
159732 - 0xFFE32 (River Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True 159732 - 0xFFE32 (River Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True
159733 - 0xFFE33 (River Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True 159733 - 0xFFE33 (River Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True
159734 - 0xFFE34 (River Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True 159734 - 0xFFE34 (River Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True
159735 - 0xFFE35 (River Obelisk Side 6) - 0x035CB & 0x035CF - True 159735 - 0xFFE35 (River Obelisk Side 6) - 0x035CB & 0x035CF - True
159739 - 0x00367 (River Obelisk) - True - True
159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True 159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True
159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True 159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True
159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True 159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True
159743 - 0xFFE43 (Quarry Obelisk Side 4) - 0x33692 - True 159743 - 0xFFE43 (Quarry Obelisk Side 4) - 0x33692 - True
159744 - 0xFFE44 (Quarry Obelisk Side 5) - 0x03E77 & 0x03E7C - True 159744 - 0xFFE44 (Quarry Obelisk Side 5) - 0x03E77 & 0x03E7C - True
159749 - 0x22073 (Quarry Obelisk) - True - True
159750 - 0xFFE50 (Town Obelisk Side 1) - 0x035C7 - True 159750 - 0xFFE50 (Town Obelisk Side 1) - 0x035C7 - True
159751 - 0xFFE51 (Town Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True 159751 - 0xFFE51 (Town Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True
159752 - 0xFFE52 (Town Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True 159752 - 0xFFE52 (Town Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True
159753 - 0xFFE53 (Town Obelisk Side 4) - 0x28B30 & 0x035C9 - True 159753 - 0xFFE53 (Town Obelisk Side 4) - 0x28B30 & 0x035C9 - True
159754 - 0xFFE54 (Town Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True 159754 - 0xFFE54 (Town Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True
159755 - 0xFFE55 (Town Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True 159755 - 0xFFE55 (Town Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True
159759 - 0x0A16C (Town Obelisk) - True - True

View File

@ -1,3 +1,5 @@
Menu (Menu) - Entry - True:
Entry (Entry): Entry (Entry):
First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064:
@ -21,9 +23,9 @@ Tutorial (Tutorial) - Outside Tutorial - 0x03629:
159513 - 0x33600 (Patio Flowers EP) - 0x0C373 - True 159513 - 0x33600 (Patio Flowers EP) - 0x0C373 - True
159517 - 0x3352F (Gate EP) - 0x03505 - True 159517 - 0x3352F (Gate EP) - 0x03505 - True
Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2: Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0:
158650 - 0x033D4 (Vault) - True - Dots & Black/White Squares 158650 - 0x033D4 (Vault Panel) - True - Dots & Black/White Squares
158651 - 0x03481 (Vault Box) - 0x033D4 - True Door - 0x033D0 (Vault Door) - 0x033D4
158013 - 0x0005D (Shed Row 1) - True - Dots 158013 - 0x0005D (Shed Row 1) - True - Dots
158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots 158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots
158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots 158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots
@ -44,6 +46,9 @@ Door - 0x03BA2 (Outpost Path) - 0x0A3B5
159516 - 0x334A3 (Path EP) - True - True 159516 - 0x334A3 (Path EP) - True - True
159500 - 0x035C7 (Tractor EP) - True - True 159500 - 0x035C7 (Tractor EP) - True - True
Outside Tutorial Vault (Outside Tutorial):
158651 - 0x03481 (Vault Box) - True - True
Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170: Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170:
158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots 158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots
Door - 0x0A170 (Outpost Entry) - 0x0A171 Door - 0x0A170 (Outpost Entry) - 0x0A171
@ -54,6 +59,7 @@ Door - 0x04CA3 (Outpost Exit) - 0x04CA4
158600 - 0x17CFB (Discard) - True - Triangles 158600 - 0x17CFB (Discard) - True - Triangles
Main Island (Main Island) - Outside Tutorial - True: Main Island (Main Island) - Outside Tutorial - True:
159801 - 0xFFD00 (Reached Independently) - True - True
159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True 159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True
Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29: Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29:
@ -76,7 +82,7 @@ Inside Glass Factory (Glass Factory) - Inside Glass Factory Behind Back Wall - 0
158038 - 0x0343A (Melting 3) - 0x00082 - Symmetry 158038 - 0x0343A (Melting 3) - 0x00082 - Symmetry
Door - 0x0D7ED (Back Wall) - 0x0005C Door - 0x0D7ED (Back Wall) - 0x0005C
Inside Glass Factory Behind Back Wall (Glass Factory) - Boat - 0x17CC8: Inside Glass Factory Behind Back Wall (Glass Factory) - The Ocean - 0x17CC8:
158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat
Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E: Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E:
@ -112,12 +118,12 @@ Door - 0x18269 (Upper) - 0x1C349
159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True 159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True
Symmetry Island Upper (Symmetry Island): Symmetry Island Upper (Symmetry Island):
158065 - 0x00A52 (Yellow 1) - True - Symmetry & Colored Dots 158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots
158066 - 0x00A57 (Yellow 2) - 0x00A52 - Symmetry & Colored Dots 158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots
158067 - 0x00A5B (Yellow 3) - 0x00A57 - Symmetry & Colored Dots 158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots
158068 - 0x00A61 (Blue 1) - 0x00A52 - Symmetry & Colored Dots 158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots
158069 - 0x00A64 (Blue 2) - 0x00A61 & 0x00A52 - Symmetry & Colored Dots 158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots
158070 - 0x00A68 (Blue 3) - 0x00A64 & 0x00A57 - Symmetry & Colored Dots 158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots
158700 - 0x0360D (Laser Panel) - 0x00A68 - True 158700 - 0x0360D (Laser Panel) - 0x00A68 - True
Laser - 0x00509 (Laser) - 0x0360D Laser - 0x00509 (Laser) - 0x0360D
159001 - 0x03367 (Glass Factory Black Line EP) - True - True 159001 - 0x03367 (Glass Factory Black Line EP) - True - True
@ -135,9 +141,9 @@ Door - 0x03313 (Second Gate) - 0x032FF
Orchard End (Orchard): Orchard End (Orchard):
Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE: Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE - Desert Vault - 0x03444:
158652 - 0x0CC7B (Vault) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots 158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots
158653 - 0x0339E (Vault Box) - 0x0CC7B - True Door - 0x03444 (Vault Door) - 0x0CC7B
158602 - 0x17CE7 (Discard) - True - Triangles 158602 - 0x17CE7 (Discard) - True - Triangles
158076 - 0x00698 (Surface 1) - True - True 158076 - 0x00698 (Surface 1) - True - True
158077 - 0x0048F (Surface 2) - 0x00698 - True 158077 - 0x0048F (Surface 2) - 0x00698 - True
@ -163,6 +169,9 @@ Laser - 0x012FB (Laser) - 0x03608
159040 - 0x334B9 (Shore EP) - True - True 159040 - 0x334B9 (Shore EP) - True - True
159041 - 0x334BC (Island EP) - True - True 159041 - 0x334BC (Island EP) - True - True
Desert Vault (Desert):
158653 - 0x0339E (Vault Box) - True - True
Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3: Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3:
158087 - 0x09FAA (Light Control) - True - True 158087 - 0x09FAA (Light Control) - True - True
158088 - 0x00422 (Light Room 1) - 0x09FAA - True 158088 - 0x00422 (Light Room 1) - 0x09FAA - True
@ -199,18 +208,19 @@ Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316:
Door - 0x0C316 (Elevator Room Entry) - 0x18076 Door - 0x0C316 (Elevator Room Entry) - 0x18076
159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True
Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x012FB: Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x01317:
158111 - 0x17C31 (Final Transparent) - True - True 158111 - 0x17C31 (Final Transparent) - True - True
158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - True 158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - True
158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True 158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True
158115 - 0x0A15C (Final Bent 1) - True - True 158115 - 0x0A15C (Final Bent 1) - True - True
158116 - 0x09FFF (Final Bent 2) - 0x0A15C - True 158116 - 0x09FFF (Final Bent 2) - 0x0A15C - True
158117 - 0x0A15F (Final Bent 3) - 0x09FFF - True 158117 - 0x0A15F (Final Bent 3) - 0x09FFF - True
159035 - 0x037BB (Elevator EP) - 0x012FB - True 159035 - 0x037BB (Elevator EP) - 0x01317 - True
Door - 0x01317 (Elevator) - 0x03608
Desert Lowest Level Inbetween Shortcuts (Desert): Desert Lowest Level Inbetween Shortcuts (Desert):
Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - TrueOneWay: Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01:
158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares 158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares
158603 - 0x17CF0 (Discard) - True - Triangles 158603 - 0x17CF0 (Discard) - True - Triangles
158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Shapers 158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Shapers
@ -222,7 +232,7 @@ Door - 0x09D6F (Entry 1) - 0x09E57
159420 - 0x289CF (Rock Line EP) - True - True 159420 - 0x289CF (Rock Line EP) - True - True
159421 - 0x289D1 (Rock Line Reflection EP) - True - True 159421 - 0x289D1 (Rock Line Reflection EP) - True - True
Quarry Elevator (Quarry): Quarry Elevator (Quarry) - Outside Quarry - 0x17CC4 - Quarry - 0x17CC4:
158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser 158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser
159403 - 0x17CB9 (Railroad EP) - 0x17CC4 - True 159403 - 0x17CB9 (Railroad EP) - 0x17CC4 - True
@ -230,28 +240,31 @@ Quarry Between Entrys (Quarry) - Quarry - 0x17C07:
158119 - 0x17C09 (Entry 2 Panel) - True - Shapers 158119 - 0x17C09 (Entry 2 Panel) - True - Shapers
Door - 0x17C07 (Entry 2) - 0x17C09 Door - 0x17C07 (Entry 2) - 0x17C09
Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010 - Quarry Elevator - 0x17CC4: Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010:
159802 - 0xFFD01 (Inside Reached Independently) - True - True
158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Black/White Squares 158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Black/White Squares
158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Dots 158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Dots
Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A
Quarry Stoneworks Ground Floor (Quarry Stoneworks) - Quarry - 0x275FF - Quarry Stoneworks Middle Floor - 0x03678 - Outside Quarry - 0x17CE8: Quarry Stoneworks Ground Floor (Quarry Stoneworks) - Quarry - 0x275FF - Quarry Stoneworks Middle Floor - 0x03678 - Outside Quarry - 0x17CE8 - Quarry Stoneworks Lift - TrueOneWay:
158123 - 0x275ED (Side Exit Panel) - True - True 158123 - 0x275ED (Side Exit Panel) - True - True
Door - 0x275FF (Side Exit) - 0x275ED Door - 0x275FF (Side Exit) - 0x275ED
158124 - 0x03678 (Lower Ramp Control) - True - Dots & Eraser 158124 - 0x03678 (Lower Ramp Control) - True - Dots & Eraser
158145 - 0x17CAC (Roof Exit Panel) - True - True 158145 - 0x17CAC (Roof Exit Panel) - True - True
Door - 0x17CE8 (Roof Exit) - 0x17CAC Door - 0x17CE8 (Roof Exit) - 0x17CAC
Quarry Stoneworks Middle Floor (Quarry Stoneworks) - Quarry Stoneworks Ground Floor - 0x03675 - Quarry Stoneworks Upper Floor - 0x03679: Quarry Stoneworks Middle Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - TrueOneWay:
158125 - 0x00E0C (Lower Row 1) - True - Dots & Eraser 158125 - 0x00E0C (Lower Row 1) - True - Dots & Eraser
158126 - 0x01489 (Lower Row 2) - 0x00E0C - Dots & Eraser 158126 - 0x01489 (Lower Row 2) - 0x00E0C - Dots & Eraser
158127 - 0x0148A (Lower Row 3) - 0x01489 - Dots & Eraser 158127 - 0x0148A (Lower Row 3) - 0x01489 - Dots & Eraser
158128 - 0x014D9 (Lower Row 4) - 0x0148A - Dots & Eraser 158128 - 0x014D9 (Lower Row 4) - 0x0148A - Dots & Eraser
158129 - 0x014E7 (Lower Row 5) - 0x014D9 - Dots 158129 - 0x014E7 (Lower Row 5) - 0x014D9 - Dots
158130 - 0x014E8 (Lower Row 6) - 0x014E7 - Dots & Eraser 158130 - 0x014E8 (Lower Row 6) - 0x014E7 - Dots & Eraser
Quarry Stoneworks Lift (Quarry Stoneworks) - Quarry Stoneworks Middle Floor - 0x03679 - Quarry Stoneworks Ground Floor - 0x03679 - Quarry Stoneworks Upper Floor - 0x03679:
158131 - 0x03679 (Lower Lift Control) - 0x014E8 - Dots & Eraser 158131 - 0x03679 (Lower Lift Control) - 0x014E8 - Dots & Eraser
Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Middle Floor - 0x03676 & 0x03679 - Quarry Stoneworks Ground Floor - 0x0368A: Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - 0x03675 - Quarry Stoneworks Ground Floor - 0x0368A:
158132 - 0x03676 (Upper Ramp Control) - True - Dots & Eraser 158132 - 0x03676 (Upper Ramp Control) - True - Dots & Eraser
158133 - 0x03675 (Upper Lift Control) - True - Dots & Eraser 158133 - 0x03675 (Upper Lift Control) - True - Dots & Eraser
158134 - 0x00557 (Upper Row 1) - True - Colored Squares & Eraser 158134 - 0x00557 (Upper Row 1) - True - Colored Squares & Eraser
@ -262,7 +275,7 @@ Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Middle Flo
158139 - 0x3C12D (Upper Row 6) - 0x0146C - Colored Squares & Eraser 158139 - 0x3C12D (Upper Row 6) - 0x0146C - Colored Squares & Eraser
158140 - 0x03686 (Upper Row 7) - 0x3C12D - Colored Squares & Eraser 158140 - 0x03686 (Upper Row 7) - 0x3C12D - Colored Squares & Eraser
158141 - 0x014E9 (Upper Row 8) - 0x03686 - Colored Squares & Eraser 158141 - 0x014E9 (Upper Row 8) - 0x03686 - Colored Squares & Eraser
158142 - 0x03677 (Stair Control) - True - Colored Squares & Eraser 158142 - 0x03677 (Stairs Panel) - True - Colored Squares & Eraser
Door - 0x0368A (Stairs) - 0x03677 Door - 0x0368A (Stairs) - 0x03677
158143 - 0x3C125 (Control Room Left) - 0x014E9 - Black/White Squares & Dots & Eraser 158143 - 0x3C125 (Control Room Left) - 0x014E9 - Black/White Squares & Dots & Eraser
158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Dots & Eraser 158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Dots & Eraser
@ -277,7 +290,7 @@ Quarry Boathouse (Quarry Boathouse) - Quarry - True - Quarry Boathouse Upper Fro
Door - 0x2769B (Dock) - 0x17CA6 Door - 0x2769B (Dock) - 0x17CA6
Door - 0x27163 (Dock Invis Barrier) - 0x17CA6 Door - 0x27163 (Dock Invis Barrier) - 0x17CA6
Quarry Boathouse Behind Staircase (Quarry Boathouse) - Boat - 0x17CA6: Quarry Boathouse Behind Staircase (Quarry Boathouse) - The Ocean - 0x17CA6:
Quarry Boathouse Upper Front (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x17C50: Quarry Boathouse Upper Front (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x17C50:
158149 - 0x021B3 (Front Row 1) - True - Shapers & Eraser 158149 - 0x021B3 (Front Row 1) - True - Shapers & Eraser
@ -309,9 +322,9 @@ Door - 0x3865F (Second Barrier) - 0x38663
158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers 158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers
159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True 159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True
Shadows (Shadows) - Main Island - True - Shadows Ledge - 0x19B24 - Shadows Laser Room - 0x194B2 & 0x19665: Shadows (Shadows) - Main Island - True - Shadows Ledge - 0x19B24 - Shadows Laser Room - 0x194B2 | 0x19665:
158170 - 0x334DB (Door Timer Outside) - True - True 158170 - 0x334DB (Door Timer Outside) - True - True
Door - 0x19B24 (Timed Door) - 0x334DB Door - 0x19B24 (Timed Door) - 0x334DB | 0x334DC
158171 - 0x0AC74 (Intro 6) - 0x0A8DC - True 158171 - 0x0AC74 (Intro 6) - 0x0A8DC - True
158172 - 0x0AC7A (Intro 7) - 0x0AC74 - True 158172 - 0x0AC7A (Intro 7) - 0x0AC74 - True
158173 - 0x0A8E0 (Intro 8) - 0x0AC7A - True 158173 - 0x0A8E0 (Intro 8) - 0x0AC7A - True
@ -336,7 +349,7 @@ Shadows Ledge (Shadows) - Shadows - 0x1855B - Quarry - 0x19865 & 0x0A2DF:
158187 - 0x334DC (Door Timer Inside) - True - True 158187 - 0x334DC (Door Timer Inside) - True - True
158188 - 0x198B5 (Intro 1) - True - True 158188 - 0x198B5 (Intro 1) - True - True
158189 - 0x198BD (Intro 2) - 0x198B5 - True 158189 - 0x198BD (Intro 2) - 0x198B5 - True
158190 - 0x198BF (Intro 3) - 0x198BD & 0x334DC & 0x19B24 - True 158190 - 0x198BF (Intro 3) - 0x198BD & 0x19B24 - True
Door - 0x19865 (Quarry Barrier) - 0x198BF Door - 0x19865 (Quarry Barrier) - 0x198BF
Door - 0x0A2DF (Quarry Barrier 2) - 0x198BF Door - 0x0A2DF (Quarry Barrier 2) - 0x198BF
158191 - 0x19771 (Intro 4) - 0x198BF - True 158191 - 0x19771 (Intro 4) - 0x198BF - True
@ -345,7 +358,7 @@ Door - 0x1855B (Ledge Barrier) - 0x0A8DC
Door - 0x19ADE (Ledge Barrier 2) - 0x0A8DC Door - 0x19ADE (Ledge Barrier 2) - 0x0A8DC
Shadows Laser Room (Shadows): Shadows Laser Room (Shadows):
158703 - 0x19650 (Laser Panel) - True - True 158703 - 0x19650 (Laser Panel) - 0x194B2 & 0x19665 - True
Laser - 0x181B3 (Laser) - 0x19650 Laser - 0x181B3 (Laser) - 0x19650
Treehouse Beach (Treehouse Beach) - Main Island - True: Treehouse Beach (Treehouse Beach) - Main Island - True:
@ -395,9 +408,9 @@ Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F
158205 - 0x09E49 (Shadows Shortcut Panel) - True - True 158205 - 0x09E49 (Shadows Shortcut Panel) - True - True
Door - 0x09E3D (Shadows Shortcut) - 0x09E49 Door - 0x09E3D (Shadows Shortcut) - 0x09E49
Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True: Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True - Shipwreck Vault - 0x17BB4:
158654 - 0x00AFB (Vault) - True - Symmetry & Sound Dots & Colored Dots 158654 - 0x00AFB (Vault Panel) - True - Symmetry & Sound Dots & Colored Dots
158655 - 0x03535 (Vault Box) - 0x00AFB - True Door - 0x17BB4 (Vault Door) - 0x00AFB
158605 - 0x17D28 (Discard) - True - Triangles 158605 - 0x17D28 (Discard) - True - Triangles
159220 - 0x03B22 (Circle Far EP) - True - True 159220 - 0x03B22 (Circle Far EP) - True - True
159221 - 0x03B23 (Circle Left EP) - True - True 159221 - 0x03B23 (Circle Left EP) - True - True
@ -407,6 +420,9 @@ Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True:
159226 - 0x28ABE (Rope Outer EP) - True - True 159226 - 0x28ABE (Rope Outer EP) - True - True
159230 - 0x3388F (Couch EP) - 0x17CDF | 0x0A054 - True 159230 - 0x3388F (Couch EP) - 0x17CDF | 0x0A054 - True
Shipwreck Vault (Shipwreck):
158655 - 0x03535 (Vault Box) - True - True
Keep Tower (Keep) - Keep - 0x04F8F: Keep Tower (Keep) - Keep - 0x04F8F:
158206 - 0x0361B (Tower Shortcut Panel) - True - True 158206 - 0x0361B (Tower Shortcut Panel) - True - True
Door - 0x04F8F (Tower Shortcut) - 0x0361B Door - 0x04F8F (Tower Shortcut) - 0x0361B
@ -422,8 +438,8 @@ Laser - 0x014BB (Laser) - 0x0360E | 0x03317
159251 - 0x3348F (Hedges EP) - True - True 159251 - 0x3348F (Hedges EP) - True - True
Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750: Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750:
158207 - 0x03713 (Shortcut Panel) - True - True 158207 - 0x03713 (Laser Shortcut Panel) - True - True
Door - 0x0364E (Shortcut) - 0x03713 Door - 0x0364E (Laser Shortcut) - 0x03713
158208 - 0x00B10 (Entry Left) - True - True 158208 - 0x00B10 (Entry Left) - True - True
158209 - 0x00C92 (Entry Right) - True - True 158209 - 0x00C92 (Entry Right) - True - True
Door - 0x0C128 (Entry Inner) - 0x00B10 Door - 0x0C128 (Entry Inner) - 0x00B10
@ -454,7 +470,7 @@ Inside Monastery (Monastery):
Monastery Garden (Monastery): Monastery Garden (Monastery):
Town (Town) - Main Island - True - Boat - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9: Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9:
158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat
158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers
Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
@ -469,11 +485,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots 158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots
158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots 158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots
Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1 Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1
158225 - 0x28998 (Tinted Glass Door Panel) - True - Stars & Rotated Shapers 158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers
Door - 0x28A61 (Tinted Glass Door) - 0x28998 Door - 0x28A61 (RGB House Entry) - 0x28998
158226 - 0x28A0D (Church Entry Panel) - 0x28A61 - Stars 158226 - 0x28A0D (Church Entry Panel) - 0x28A61 - Stars
Door - 0x03BB0 (Church Entry) - 0x28A0D Door - 0x03BB0 (Church Entry) - 0x28A0D
158228 - 0x28A79 (Maze Stair Control) - True - True 158228 - 0x28A79 (Maze Panel) - True - True
Door - 0x28AA2 (Maze Stairs) - 0x28A79 Door - 0x28AA2 (Maze Stairs) - 0x28A79
158241 - 0x17F5F (Windmill Entry Panel) - True - Dots 158241 - 0x17F5F (Windmill Entry Panel) - True - Dots
Door - 0x1845B (Windmill Entry) - 0x17F5F Door - 0x1845B (Windmill Entry) - 0x17F5F
@ -557,7 +573,7 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2
159556 - 0x33A2A (Door EP) - 0x03553 - True 159556 - 0x33A2A (Door EP) - 0x03553 - True
159558 - 0x33B06 (Church EP) - 0x0354E - True 159558 - 0x33B06 (Church EP) - 0x0354E - True
Jungle (Jungle) - Main Island - True - Outside Jungle River - 0x3873B - Boat - 0x17CDF: Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF:
158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat
158609 - 0x17F9B (Discard) - True - Triangles 158609 - 0x17F9B (Discard) - True - Triangles
158252 - 0x002C4 (First Row 1) - True - True 158252 - 0x002C4 (First Row 1) - True - True
@ -588,18 +604,21 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA
159350 - 0x035CB (Bamboo CCW EP) - True - True 159350 - 0x035CB (Bamboo CCW EP) - True - True
159351 - 0x035CF (Bamboo CW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True
Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A: Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287:
158267 - 0x17CAA (Monastery Shortcut Panel) - True - True 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True
Door - 0x0CF2A (Monastery Shortcut) - 0x17CAA Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA
158663 - 0x15ADD (Vault) - True - Black/White Squares & Dots 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots
158664 - 0x03702 (Vault Box) - 0x15ADD - True Door - 0x15287 (Vault Door) - 0x15ADD
159110 - 0x03AC5 (Green Leaf Moss EP) - True - True 159110 - 0x03AC5 (Green Leaf Moss EP) - True - True
159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True 159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True
159121 - 0x03BE3 (Monastery Garden Right EP) - True - True 159121 - 0x03BE3 (Monastery Garden Right EP) - True - True
159122 - 0x0A409 (Monastery Wall EP) - True - True 159122 - 0x0A409 (Monastery Wall EP) - True - True
River Vault (River):
158664 - 0x03702 (Vault Box) - True - True
Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4: Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4:
158268 - 0x17C2E (Entry Panel) - True - Black/White Squares & Colored Squares 158268 - 0x17C2E (Entry Panel) - True - Black/White Squares
Door - 0x0C2A4 (Entry) - 0x17C2E Door - 0x0C2A4 (Entry) - 0x17C2E
Bunker (Bunker) - Bunker Glass Room - 0x17C79: Bunker (Bunker) - Bunker Glass Room - 0x17C79:
@ -616,9 +635,9 @@ Bunker (Bunker) - Bunker Glass Room - 0x17C79:
Door - 0x17C79 (Tinted Glass Door) - 0x0A099 Door - 0x17C79 (Tinted Glass Door) - 0x0A099
Bunker Glass Room (Bunker) - Bunker Ultraviolet Room - 0x0C2A3: Bunker Glass Room (Bunker) - Bunker Ultraviolet Room - 0x0C2A3:
158279 - 0x0A010 (Glass Room 1) - True - Colored Squares 158279 - 0x0A010 (Glass Room 1) - 0x17C79 - Colored Squares
158280 - 0x0A01B (Glass Room 2) - 0x0A010 - Colored Squares & Black/White Squares 158280 - 0x0A01B (Glass Room 2) - 0x17C79 & 0x0A010 - Colored Squares & Black/White Squares
158281 - 0x0A01F (Glass Room 3) - 0x0A01B - Colored Squares & Black/White Squares 158281 - 0x0A01F (Glass Room 3) - 0x17C79 & 0x0A01B - Colored Squares & Black/White Squares
Door - 0x0C2A3 (UV Room Entry) - 0x0A01F Door - 0x0C2A3 (UV Room Entry) - 0x0A01F
Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D: Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D:
@ -631,7 +650,7 @@ Door - 0x0A08D (Elevator Room Entry) - 0x17E67
Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay:
159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True
Bunker Elevator (Bunker) - Bunker Laser Platform - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079:
158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares
Bunker Green Room (Bunker) - Bunker Elevator - TrueOneWay: Bunker Green Room (Bunker) - Bunker Elevator - TrueOneWay:
@ -676,7 +695,7 @@ Swamp Near Platform (Swamp) - Swamp Cyan Underwater - 0x04B7F - Swamp Near Boat
158316 - 0x00990 (Platform Row 4) - 0x0098F - Shapers 158316 - 0x00990 (Platform Row 4) - 0x0098F - Shapers
Door - 0x184B7 (Between Bridges First Door) - 0x00990 Door - 0x184B7 (Between Bridges First Door) - 0x00990
158317 - 0x17C0D (Platform Shortcut Left Panel) - True - Shapers 158317 - 0x17C0D (Platform Shortcut Left Panel) - True - Shapers
158318 - 0x17C0E (Platform Shortcut Right Panel) - True - Shapers 158318 - 0x17C0E (Platform Shortcut Right Panel) - 0x17C0D - Shapers
Door - 0x38AE6 (Platform Shortcut Door) - 0x17C0E Door - 0x38AE6 (Platform Shortcut Door) - 0x17C0E
Door - 0x04B7F (Cyan Water Pump) - 0x00006 Door - 0x04B7F (Cyan Water Pump) - 0x00006
@ -715,18 +734,21 @@ Swamp Rotating Bridge (Swamp) - Swamp Between Bridges Far - 0x181F5 - Swamp Near
159331 - 0x016B2 (Rotating Bridge CCW EP) - 0x181F5 - True 159331 - 0x016B2 (Rotating Bridge CCW EP) - 0x181F5 - True
159334 - 0x036CE (Rotating Bridge CW EP) - 0x181F5 - True 159334 - 0x036CE (Rotating Bridge CW EP) - 0x181F5 - True
Swamp Near Boat (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Blue Underwater - 0x18482: Swamp Near Boat (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Blue Underwater - 0x18482 - Swamp Long Bridge - 0xFFD00 & 0xFFD02 - The Ocean - 0x09DB8:
158903 - 0xFFD02 (Beyond Rotating Bridge Reached Independently) - True - True
158328 - 0x09DB8 (Boat Spawn) - True - Boat 158328 - 0x09DB8 (Boat Spawn) - True - Boat
158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Rotated Shapers 158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Rotated Shapers
158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers 158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers
158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Rotated Shapers & Shapers 158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Rotated Shapers & Shapers
158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Rotated Shapers 158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Rotated Shapers
158339 - 0x17E2B (Long Bridge Control) - True - Rotated Shapers & Shapers
Door - 0x18482 (Blue Water Pump) - 0x00E3A Door - 0x18482 (Blue Water Pump) - 0x00E3A
159332 - 0x3365F (Boat EP) - 0x09DB8 - True 159332 - 0x3365F (Boat EP) - 0x09DB8 - True
159333 - 0x03731 (Long Bridge Side EP) - 0x17E2B - True 159333 - 0x03731 (Long Bridge Side EP) - 0x17E2B - True
Swamp Purple Area (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Purple Underwater - 0x0A1D6: Swamp Long Bridge (Swamp) - Swamp Near Boat - 0x17E2B - Outside Swamp - 0x17E2B:
158339 - 0x17E2B (Long Bridge Control) - True - Rotated Shapers & Shapers
Swamp Purple Area (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Purple Underwater - 0x0A1D6 - Swamp Near Boat - TrueOneWay:
Door - 0x0A1D6 (Purple Water Pump) - 0x00E3A Door - 0x0A1D6 (Purple Water Pump) - 0x00E3A
Swamp Purple Underwater (Swamp): Swamp Purple Underwater (Swamp):
@ -752,7 +774,7 @@ Laser - 0x00BF6 (Laser) - 0x03615
158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Rotated Shapers 158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Rotated Shapers
Door - 0x2D880 (Laser Shortcut) - 0x17C02 Door - 0x2D880 (Laser Shortcut) - 0x17C02
Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309: Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309 - The Ocean - 0x17C95:
158343 - 0x17C95 (Boat Spawn) - True - Boat 158343 - 0x17C95 (Boat Spawn) - True - Boat
158344 - 0x0288C (First Door Panel) - True - Stars 158344 - 0x0288C (First Door Panel) - True - Stars
Door - 0x0C309 (First Door) - 0x0288C Door - 0x0C309 (First Door) - 0x0288C
@ -778,7 +800,7 @@ Treehouse After Yellow Bridge (Treehouse) - Treehouse Junction - 0x0A181:
Door - 0x0A181 (Third Door) - 0x0A182 Door - 0x0A181 (Third Door) - 0x0A182
Treehouse Junction (Treehouse) - Treehouse Right Orange Bridge - True - Treehouse First Purple Bridge - True - Treehouse Green Bridge - True: Treehouse Junction (Treehouse) - Treehouse Right Orange Bridge - True - Treehouse First Purple Bridge - True - Treehouse Green Bridge - True:
158356 - 0x2700B (Laser House Door Timer Outside Control) - True - True 158356 - 0x2700B (Laser House Door Timer Outside) - True - True
Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x17D6C: Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x17D6C:
158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Dots 158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Dots
@ -802,7 +824,7 @@ Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2:
158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars 158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars
Treehouse Bridge Platform (Treehouse) - Main Island - 0x0C32D: Treehouse Bridge Platform (Treehouse) - Main Island - 0x0C32D:
158404 - 0x037FF (Bridge Control) - True - Stars 158404 - 0x037FF (Drawbridge Panel) - True - Stars
Door - 0x0C32D (Drawbridge) - 0x037FF Door - 0x0C32D (Drawbridge) - 0x037FF
Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6: Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6:
@ -847,7 +869,7 @@ Treehouse Green Bridge Left House (Treehouse):
159211 - 0x220A7 (Right Orange Bridge EP) - 0x17DA2 - True 159211 - 0x220A7 (Right Orange Bridge EP) - 0x17DA2 - True
Treehouse Laser Room Front Platform (Treehouse) - Treehouse Laser Room - 0x0C323: Treehouse Laser Room Front Platform (Treehouse) - Treehouse Laser Room - 0x0C323:
Door - 0x0C323 (Laser House Entry) - 0x17DA2 & 0x2700B & 0x17DDB Door - 0x0C323 (Laser House Entry) - 0x17DA2 & 0x2700B & 0x17DDB | 0x17CBC
Treehouse Laser Room Back Platform (Treehouse): Treehouse Laser Room Back Platform (Treehouse):
158611 - 0x17FA0 (Laser Discard) - True - Triangles 158611 - 0x17FA0 (Laser Discard) - True - Triangles
@ -860,19 +882,22 @@ Treehouse Laser Room (Treehouse):
158403 - 0x17CBC (Laser House Door Timer Inside) - True - True 158403 - 0x17CBC (Laser House Door Timer Inside) - True - True
Laser - 0x028A4 (Laser) - 0x03613 Laser - 0x028A4 (Laser) - 0x03613
Mountainside (Mountainside) - Main Island - True - Mountaintop - True: Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085:
158612 - 0x17C42 (Discard) - True - Triangles 158612 - 0x17C42 (Discard) - True - Triangles
158665 - 0x002A6 (Vault) - True - Symmetry & Colored Dots & Black/White Squares 158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Dots & Black/White Squares
158666 - 0x03542 (Vault Box) - 0x002A6 - True Door - 0x00085 (Vault Door) - 0x002A6
159301 - 0x335AE (Cloud Cycle EP) - True - True 159301 - 0x335AE (Cloud Cycle EP) - True - True
159325 - 0x33505 (Bush EP) - True - True 159325 - 0x33505 (Bush EP) - True - True
159335 - 0x03C07 (Apparent River EP) - True - True 159335 - 0x03C07 (Apparent River EP) - True - True
Mountainside Vault (Mountainside):
158666 - 0x03542 (Vault Box) - True - True
Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34:
158405 - 0x0042D (River Shape) - True - True 158405 - 0x0042D (River Shape) - True - True
158406 - 0x09F7F (Box Short) - 7 Lasers - True 158406 - 0x09F7F (Box Short) - 7 Lasers - True
158407 - 0x17C34 (Trap Door Triple Exit) - 0x09F7F - Black/White Squares 158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Black/White Squares
158800 - 0xFFF00 (Box Long) - 7 Lasers & 11 Lasers & 0x17C34 - True 158800 - 0xFFF00 (Box Long) - 11 Lasers & 0x17C34 - True
159300 - 0x001A3 (River Shape EP) - True - True 159300 - 0x001A3 (River Shape EP) - True - True
159320 - 0x3370E (Arch Black EP) - True - True 159320 - 0x3370E (Arch Black EP) - True - True
159324 - 0x336C8 (Arch White Right EP) - True - True 159324 - 0x336C8 (Arch White Right EP) - True - True
@ -881,7 +906,7 @@ Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34:
Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39: Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39:
158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Rotated Shapers 158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Rotated Shapers
Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Top Layer At Door - TrueOneWay:
158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots
158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots
158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers
@ -899,6 +924,8 @@ Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Dots 158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Dots
158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers 158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers
158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shapers 158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shapers
Mountain Top Layer At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B
Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay:
@ -917,7 +944,7 @@ Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86
Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2): Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2):
158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars & Black/White Squares 158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars & Black/White Squares
Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay: Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay - Mountain Floor 2 - 0x09ED8:
158432 - 0x09FCC (Far Row 1) - True - Dots 158432 - 0x09FCC (Far Row 1) - True - Dots
158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares 158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares
158434 - 0x09FCF (Far Row 3) - 0x09FCE - Shapers 158434 - 0x09FCF (Far Row 3) - 0x09FCE - Shapers
@ -935,29 +962,27 @@ Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator -
Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Third Layer - 0x09EEB: Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Third Layer - 0x09EEB:
158439 - 0x09EEB (Elevator Control Panel) - True - Dots 158439 - 0x09EEB (Elevator Control Panel) - True - Dots
Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89: Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89 - Mountain Pink Bridge EP - TrueOneWay:
158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser 158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser
158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Rotated Shapers & Eraser 158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Rotated Shapers & Eraser
158442 - 0x09F01 (Giant Puzzle Top Right) - True - Shapers & Eraser 158442 - 0x09F01 (Giant Puzzle Top Right) - True - Shapers & Eraser
158443 - 0x09EFF (Giant Puzzle Top Left) - True - Shapers & Eraser 158443 - 0x09EFF (Giant Puzzle Top Left) - True - Shapers & Eraser
158444 - 0x09FDA (Giant Puzzle) - 0x09FC1 & 0x09F8E & 0x09F01 & 0x09EFF - Shapers & Symmetry 158444 - 0x09FDA (Giant Puzzle) - 0x09FC1 & 0x09F8E & 0x09F01 & 0x09EFF - Shapers & Symmetry
159313 - 0x09D5D (Yellow Bridge EP) - 0x09E86 & 0x09ED8 - True
159314 - 0x09D5E (Blue Bridge EP) - 0x09E86 & 0x09ED8 - True
Door - 0x09F89 (Exit) - 0x09FDA Door - 0x09F89 (Exit) - 0x09FDA
Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Bottom Floor Rock - 0x17FA2 - Final Room - 0x0C141 - Mountain Pink Bridge EP - TrueOneWay: Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Final Room - 0x0C141:
158614 - 0x17FA2 (Discard) - 0xFFF00 - Triangles 158614 - 0x17FA2 (Discard) - 0xFFF00 - Triangles
158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars 158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars
158446 - 0x01987 (Final Room Entry Right) - True - Colored Squares & Dots 158446 - 0x01987 (Final Room Entry Right) - True - Colored Squares & Dots
Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987
159313 - 0x09D5D (Yellow Bridge EP) - 0x09E86 & 0x09ED8 - True Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1
159314 - 0x09D5E (Blue Bridge EP) - 0x09E86 & 0x09ED8 - True
Mountain Pink Bridge EP (Mountain Floor 2): Mountain Pink Bridge EP (Mountain Floor 2):
159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True
Mountain Bottom Floor Rock (Mountain Bottom Floor) - Mountain Bottom Floor - 0x17F33 - Mountain Path to Caves - 0x17F33: Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D:
Door - 0x17F33 (Rock Open) - True - True
Mountain Path to Caves (Mountain Bottom Floor) - Mountain Bottom Floor Rock - 0x334E1 - Caves - 0x2D77D:
158447 - 0x00FF8 (Caves Entry Panel) - True - Black/White Squares 158447 - 0x00FF8 (Caves Entry Panel) - True - Black/White Squares
Door - 0x2D77D (Caves Entry) - 0x00FF8 Door - 0x2D77D (Caves Entry) - 0x00FF8
158448 - 0x334E1 (Rock Control) - True - True 158448 - 0x334E1 (Rock Control) - True - True
@ -1021,7 +1046,7 @@ Path to Challenge (Caves) - Challenge - 0x0A19A:
158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol 158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol
Door - 0x0A19A (Challenge Entry) - 0x0A16E Door - 0x0A19A (Challenge Entry) - 0x0A16E
Challenge (Challenge) - Tunnels - 0x0348A: Challenge (Challenge) - Tunnels - 0x0348A - Challenge Vault - 0x04D75:
158499 - 0x0A332 (Start Timer) - 11 Lasers - True 158499 - 0x0A332 (Start Timer) - 11 Lasers - True
158500 - 0x0088E (Small Basic) - 0x0A332 - True 158500 - 0x0088E (Small Basic) - 0x0A332 - True
158501 - 0x00BAF (Big Basic) - 0x0088E - True 158501 - 0x00BAF (Big Basic) - 0x0088E - True
@ -1041,11 +1066,14 @@ Challenge (Challenge) - Tunnels - 0x0348A:
158515 - 0x034EC (Maze Hidden 2) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles 158515 - 0x034EC (Maze Hidden 2) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles
158516 - 0x1C31A (Dots Pillar) - 0x034F4 & 0x034EC - Dots & Symmetry 158516 - 0x1C31A (Dots Pillar) - 0x034F4 & 0x034EC - Dots & Symmetry
158517 - 0x1C319 (Squares Pillar) - 0x034F4 & 0x034EC - Black/White Squares & Symmetry 158517 - 0x1C319 (Squares Pillar) - 0x034F4 & 0x034EC - Black/White Squares & Symmetry
158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True Door - 0x04D75 (Vault Door) - 0x1C31A & 0x1C319
158518 - 0x039B4 (Tunnels Entry Panel) - True - Triangles 158518 - 0x039B4 (Tunnels Entry Panel) - True - Triangles
Door - 0x0348A (Tunnels Entry) - 0x039B4 Door - 0x0348A (Tunnels Entry) - 0x039B4
159530 - 0x28B30 (Water EP) - True - True 159530 - 0x28B30 (Water EP) - True - True
Challenge Vault (Challenge):
158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True
Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87: Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87:
158668 - 0x2FAF6 (Vault Box) - True - True 158668 - 0x2FAF6 (Vault Box) - True - True
158519 - 0x27732 (Theater Shortcut Panel) - True - True 158519 - 0x27732 (Theater Shortcut Panel) - True - True
@ -1075,7 +1103,7 @@ Elevator (Mountain Final Room):
158535 - 0x3D9A8 (Back Wall Right) - 0x3D9A6 | 0x3D9A7 - True 158535 - 0x3D9A8 (Back Wall Right) - 0x3D9A6 | 0x3D9A7 - True
158536 - 0x3D9A9 (Elevator Start) - 0x3D9AA & 7 Lasers | 0x3D9A8 & 7 Lasers - True 158536 - 0x3D9A9 (Elevator Start) - 0x3D9AA & 7 Lasers | 0x3D9A8 & 7 Lasers - True
Boat (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay: The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay:
159042 - 0x22106 (Desert EP) - True - True 159042 - 0x22106 (Desert EP) - True - True
159223 - 0x03B25 (Shipwreck CCW Underside EP) - True - True 159223 - 0x03B25 (Shipwreck CCW Underside EP) - True - True
159231 - 0x28B29 (Shipwreck Green EP) - True - True 159231 - 0x28B29 (Shipwreck Green EP) - True - True
@ -1093,32 +1121,38 @@ Obelisks (EPs) - Entry - True:
159702 - 0xFFE02 (Desert Obelisk Side 3) - 0x3351D - True 159702 - 0xFFE02 (Desert Obelisk Side 3) - 0x3351D - True
159703 - 0xFFE03 (Desert Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True 159703 - 0xFFE03 (Desert Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True
159704 - 0xFFE04 (Desert Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True 159704 - 0xFFE04 (Desert Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True
159709 - 0x00359 (Desert Obelisk) - True - True
159710 - 0xFFE10 (Monastery Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True 159710 - 0xFFE10 (Monastery Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True
159711 - 0xFFE11 (Monastery Obelisk Side 2) - 0x03AC5 - True 159711 - 0xFFE11 (Monastery Obelisk Side 2) - 0x03AC5 - True
159712 - 0xFFE12 (Monastery Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True 159712 - 0xFFE12 (Monastery Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True
159713 - 0xFFE13 (Monastery Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True 159713 - 0xFFE13 (Monastery Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True
159714 - 0xFFE14 (Monastery Obelisk Side 5) - 0x03E01 - True 159714 - 0xFFE14 (Monastery Obelisk Side 5) - 0x03E01 - True
159715 - 0xFFE15 (Monastery Obelisk Side 6) - 0x289F4 & 0x289F5 - True 159715 - 0xFFE15 (Monastery Obelisk Side 6) - 0x289F4 & 0x289F5 - True
159719 - 0x00263 (Monastery Obelisk) - True - True
159720 - 0xFFE20 (Treehouse Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True 159720 - 0xFFE20 (Treehouse Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True
159721 - 0xFFE21 (Treehouse Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True 159721 - 0xFFE21 (Treehouse Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True
159722 - 0xFFE22 (Treehouse Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True 159722 - 0xFFE22 (Treehouse Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True
159723 - 0xFFE23 (Treehouse Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True 159723 - 0xFFE23 (Treehouse Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True
159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True 159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True
159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True 159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True
159729 - 0x00097 (Treehouse Obelisk) - True - True
159730 - 0xFFE30 (River Obelisk Side 1) - 0x001A3 & 0x335AE - True 159730 - 0xFFE30 (River Obelisk Side 1) - 0x001A3 & 0x335AE - True
159731 - 0xFFE31 (River Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True 159731 - 0xFFE31 (River Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True
159732 - 0xFFE32 (River Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True 159732 - 0xFFE32 (River Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True
159733 - 0xFFE33 (River Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True 159733 - 0xFFE33 (River Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True
159734 - 0xFFE34 (River Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True 159734 - 0xFFE34 (River Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True
159735 - 0xFFE35 (River Obelisk Side 6) - 0x035CB & 0x035CF - True 159735 - 0xFFE35 (River Obelisk Side 6) - 0x035CB & 0x035CF - True
159739 - 0x00367 (River Obelisk) - True - True
159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True 159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True
159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True 159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True
159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True 159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True
159743 - 0xFFE43 (Quarry Obelisk Side 4) - 0x33692 - True 159743 - 0xFFE43 (Quarry Obelisk Side 4) - 0x33692 - True
159744 - 0xFFE44 (Quarry Obelisk Side 5) - 0x03E77 & 0x03E7C - True 159744 - 0xFFE44 (Quarry Obelisk Side 5) - 0x03E77 & 0x03E7C - True
159749 - 0x22073 (Quarry Obelisk) - True - True
159750 - 0xFFE50 (Town Obelisk Side 1) - 0x035C7 - True 159750 - 0xFFE50 (Town Obelisk Side 1) - 0x035C7 - True
159751 - 0xFFE51 (Town Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True 159751 - 0xFFE51 (Town Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True
159752 - 0xFFE52 (Town Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True 159752 - 0xFFE52 (Town Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True
159753 - 0xFFE53 (Town Obelisk Side 4) - 0x28B30 & 0x035C9 - True 159753 - 0xFFE53 (Town Obelisk Side 4) - 0x28B30 & 0x035C9 - True
159754 - 0xFFE54 (Town Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True 159754 - 0xFFE54 (Town Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True
159755 - 0xFFE55 (Town Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True 159755 - 0xFFE55 (Town Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True
159759 - 0x0A16C (Town Obelisk) - True - True

View File

@ -1,9 +1,11 @@
""" """
Archipelago init file for The Witness Archipelago init file for The Witness
""" """
import dataclasses
from typing import Dict, Optional from typing import Dict, Optional
from BaseClasses import Region, Location, MultiWorld, Item, Entrance, Tutorial from BaseClasses import Region, Location, MultiWorld, Item, Entrance, Tutorial, CollectionState
from Options import PerGameCommonOptions, Toggle
from .hints import get_always_hint_locations, get_always_hint_items, get_priority_hint_locations, \ from .hints import get_always_hint_locations, get_always_hint_items, get_priority_hint_locations, \
get_priority_hint_items, make_hints, generate_joke_hints get_priority_hint_items, make_hints, generate_joke_hints
from worlds.AutoWorld import World, WebWorld from worlds.AutoWorld import World, WebWorld
@ -11,9 +13,9 @@ from .player_logic import WitnessPlayerLogic
from .static_logic import StaticWitnessLogic from .static_logic import StaticWitnessLogic
from .locations import WitnessPlayerLocations, StaticWitnessLocations from .locations import WitnessPlayerLocations, StaticWitnessLocations
from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems, ItemData from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems, ItemData
from .rules import set_rules
from .regions import WitnessRegions from .regions import WitnessRegions
from .Options import is_option_enabled, the_witness_options, get_option_value from .rules import set_rules
from .Options import TheWitnessOptions
from .utils import get_audio_logs from .utils import get_audio_logs
from logging import warning, error from logging import warning, error
@ -38,13 +40,15 @@ class WitnessWorld(World):
""" """
game = "The Witness" game = "The Witness"
topology_present = False topology_present = False
data_version = 13 data_version = 14
StaticWitnessLogic() StaticWitnessLogic()
StaticWitnessLocations() StaticWitnessLocations()
StaticWitnessItems() StaticWitnessItems()
web = WitnessWebWorld() web = WitnessWebWorld()
option_definitions = the_witness_options
options_dataclass = TheWitnessOptions
options: TheWitnessOptions
item_name_to_id = { item_name_to_id = {
name: data.ap_code for name, data in StaticWitnessItems.item_data.items() name: data.ap_code for name, data in StaticWitnessItems.item_data.items()
@ -52,7 +56,7 @@ class WitnessWorld(World):
location_name_to_id = StaticWitnessLocations.ALL_LOCATIONS_TO_ID location_name_to_id = StaticWitnessLocations.ALL_LOCATIONS_TO_ID
item_name_groups = StaticWitnessItems.item_groups item_name_groups = StaticWitnessItems.item_groups
required_client_version = (0, 3, 9) required_client_version = (0, 4, 4)
def __init__(self, multiworld: "MultiWorld", player: int): def __init__(self, multiworld: "MultiWorld", player: int):
super().__init__(multiworld, player) super().__init__(multiworld, player)
@ -64,6 +68,9 @@ class WitnessWorld(World):
self.log_ids_to_hints = None self.log_ids_to_hints = None
self.items_placed_early = []
self.own_itempool = []
def _get_slot_data(self): def _get_slot_data(self):
return { return {
'seed': self.random.randrange(0, 1000000), 'seed': self.random.randrange(0, 1000000),
@ -72,12 +79,11 @@ class WitnessWorld(World):
'item_id_to_door_hexes': StaticWitnessItems.get_item_to_door_mappings(), 'item_id_to_door_hexes': StaticWitnessItems.get_item_to_door_mappings(),
'door_hexes_in_the_pool': self.items.get_door_ids_in_pool(), 'door_hexes_in_the_pool': self.items.get_door_ids_in_pool(),
'symbols_not_in_the_game': self.items.get_symbol_ids_not_in_pool(), 'symbols_not_in_the_game': self.items.get_symbol_ids_not_in_pool(),
'disabled_panels': list(self.player_logic.COMPLETELY_DISABLED_CHECKS), 'disabled_entities': [int(h, 16) for h in self.player_logic.COMPLETELY_DISABLED_ENTITIES],
'log_ids_to_hints': self.log_ids_to_hints, 'log_ids_to_hints': self.log_ids_to_hints,
'progressive_item_lists': self.items.get_progressive_item_ids_in_pool(), 'progressive_item_lists': self.items.get_progressive_item_ids_in_pool(),
'obelisk_side_id_to_EPs': StaticWitnessLogic.OBELISK_SIDE_ID_TO_EP_HEXES, 'obelisk_side_id_to_EPs': StaticWitnessLogic.OBELISK_SIDE_ID_TO_EP_HEXES,
'precompleted_puzzles': [int(h, 16) for h in 'precompleted_puzzles': [int(h, 16) for h in self.player_logic.EXCLUDED_LOCATIONS],
self.player_logic.EXCLUDED_LOCATIONS | self.player_logic.PRECOMPLETED_LOCATIONS],
'entity_to_name': StaticWitnessLogic.ENTITY_ID_TO_NAME, 'entity_to_name': StaticWitnessLogic.ENTITY_ID_TO_NAME,
} }
@ -85,36 +91,125 @@ class WitnessWorld(World):
disabled_locations = self.multiworld.exclude_locations[self.player].value disabled_locations = self.multiworld.exclude_locations[self.player].value
self.player_logic = WitnessPlayerLogic( self.player_logic = WitnessPlayerLogic(
self.multiworld, self.player, disabled_locations, self.multiworld.start_inventory[self.player].value self, disabled_locations, self.multiworld.start_inventory[self.player].value
) )
self.locat: WitnessPlayerLocations = WitnessPlayerLocations(self.multiworld, self.player, self.player_logic) self.locat: WitnessPlayerLocations = WitnessPlayerLocations(self, self.player_logic)
self.items: WitnessPlayerItems = WitnessPlayerItems(self.multiworld, self.player, self.player_logic, self.locat) self.items: WitnessPlayerItems = WitnessPlayerItems(
self.regio: WitnessRegions = WitnessRegions(self.locat) self, self.player_logic, self.locat
)
self.regio: WitnessRegions = WitnessRegions(self.locat, self)
self.log_ids_to_hints = dict() self.log_ids_to_hints = dict()
if not (is_option_enabled(self.multiworld, self.player, "shuffle_symbols") if not (self.options.shuffle_symbols or self.options.shuffle_doors or self.options.shuffle_lasers):
or get_option_value(self.multiworld, self.player, "shuffle_doors")
or is_option_enabled(self.multiworld, self.player, "shuffle_lasers")):
if self.multiworld.players == 1: if self.multiworld.players == 1:
warning("This Witness world doesn't have any progression items. Please turn on Symbol Shuffle, Door" warning(f"{self.multiworld.get_player_name(self.player)}'s Witness world doesn't have any progression"
" Shuffle or Laser Shuffle if that doesn't seem right.") f" items. Please turn on Symbol Shuffle, Door Shuffle or Laser Shuffle if that doesn't"
f" seem right.")
else: else:
raise Exception("This Witness world doesn't have any progression items. Please turn on Symbol Shuffle," raise Exception(f"{self.multiworld.get_player_name(self.player)}'s Witness world doesn't have any"
" Door Shuffle or Laser Shuffle.") f" progression items. Please turn on Symbol Shuffle, Door Shuffle or Laser Shuffle.")
def create_regions(self): def create_regions(self):
self.regio.create_regions(self.multiworld, self.player, self.player_logic) self.regio.create_regions(self, self.player_logic)
# Set rules early so extra locations can be created based on the results of exploring collection states
set_rules(self)
# Add event items and tie them to event locations (e.g. laser activations).
event_locations = []
for event_location in self.locat.EVENT_LOCATION_TABLE:
item_obj = self.create_item(
self.player_logic.EVENT_ITEM_PAIRS[event_location]
)
location_obj = self.multiworld.get_location(event_location, self.player)
location_obj.place_locked_item(item_obj)
self.own_itempool.append(item_obj)
event_locations.append(location_obj)
# Place other locked items
dog_puzzle_skip = self.create_item("Puzzle Skip")
self.multiworld.get_location("Town Pet the Dog", self.player).place_locked_item(dog_puzzle_skip)
self.own_itempool.append(dog_puzzle_skip)
self.items_placed_early.append("Puzzle Skip")
# Pick an early item to place on the tutorial gate.
early_items = [item for item in self.items.get_early_items() if item in self.items.get_mandatory_items()]
if early_items:
random_early_item = self.multiworld.random.choice(early_items)
if self.options.puzzle_randomization == 1:
# In Expert, only tag the item as early, rather than forcing it onto the gate.
self.multiworld.local_early_items[self.player][random_early_item] = 1
else:
# Force the item onto the tutorial gate check and remove it from our random pool.
gate_item = self.create_item(random_early_item)
self.multiworld.get_location("Tutorial Gate Open", self.player).place_locked_item(gate_item)
self.own_itempool.append(gate_item)
self.items_placed_early.append(random_early_item)
# There are some really restrictive settings in The Witness.
# They are rarely played, but when they are, we add some extra sphere 1 locations.
# This is done both to prevent generation failures, but also to make the early game less linear.
# Only sweeps for events because having this behavior be random based on Tutorial Gate would be strange.
state = CollectionState(self.multiworld)
state.sweep_for_events(locations=event_locations)
num_early_locs = sum(1 for loc in self.multiworld.get_reachable_locations(state, self.player) if loc.address)
# Adjust the needed size for sphere 1 based on how restrictive the settings are in terms of items
needed_size = 3
needed_size += self.options.puzzle_randomization == 1
needed_size += self.options.shuffle_symbols
needed_size += self.options.shuffle_doors > 0
# Then, add checks in order until the required amount of sphere 1 checks is met.
extra_checks = [
("First Hallway Room", "First Hallway Bend"),
("First Hallway", "First Hallway Straight"),
("Desert Outside", "Desert Surface 3"),
]
for i in range(num_early_locs, needed_size):
if not extra_checks:
break
region, loc = extra_checks.pop(0)
self.locat.add_location_late(loc)
self.multiworld.get_region(region, self.player).add_locations({loc: self.location_name_to_id[loc]})
player = self.multiworld.get_player_name(self.player)
warning(f"""Location "{loc}" had to be added to {player}'s world due to insufficient sphere 1 size.""")
def create_items(self): def create_items(self):
# Determine pool size.
# Determine pool size. Note that the dog location is included in the location list, so this needs to be -1. pool_size: int = len(self.locat.CHECK_LOCATION_TABLE) - len(self.locat.EVENT_LOCATION_TABLE)
pool_size: int = len(self.locat.CHECK_LOCATION_TABLE) - len(self.locat.EVENT_LOCATION_TABLE) - 1
# Fill mandatory items and remove precollected and/or starting items from the pool. # Fill mandatory items and remove precollected and/or starting items from the pool.
item_pool: Dict[str, int] = self.items.get_mandatory_items() item_pool: Dict[str, int] = self.items.get_mandatory_items()
# Remove one copy of each item that was placed early
for already_placed in self.items_placed_early:
pool_size -= 1
if already_placed not in item_pool:
continue
if item_pool[already_placed] == 1:
item_pool.pop(already_placed)
else:
item_pool[already_placed] -= 1
for precollected_item_name in [item.name for item in self.multiworld.precollected_items[self.player]]: for precollected_item_name in [item.name for item in self.multiworld.precollected_items[self.player]]:
if precollected_item_name in item_pool: if precollected_item_name in item_pool:
if item_pool[precollected_item_name] == 1: if item_pool[precollected_item_name] == 1:
@ -131,17 +226,18 @@ class WitnessWorld(World):
self.multiworld.push_precollected(self.create_item(inventory_item_name)) self.multiworld.push_precollected(self.create_item(inventory_item_name))
if len(item_pool) > pool_size: if len(item_pool) > pool_size:
error_string = "The Witness world has too few locations ({num_loc}) to place its necessary items " \ error(f"{self.multiworld.get_player_name(self.player)}'s Witness world has too few locations ({pool_size})"
"({num_item})." f" to place its necessary items ({len(item_pool)}).")
error(error_string.format(num_loc=pool_size, num_item=len(item_pool)))
return return
remaining_item_slots = pool_size - sum(item_pool.values()) remaining_item_slots = pool_size - sum(item_pool.values())
# Add puzzle skips. # Add puzzle skips.
num_puzzle_skips = get_option_value(self.multiworld, self.player, "puzzle_skip_amount") num_puzzle_skips = self.options.puzzle_skip_amount
if num_puzzle_skips > remaining_item_slots: if num_puzzle_skips > remaining_item_slots:
warning(f"The Witness world has insufficient locations to place all requested puzzle skips.") warning(f"{self.multiworld.get_player_name(self.player)}'s Witness world has insufficient locations"
f" to place all requested puzzle skips.")
num_puzzle_skips = remaining_item_slots num_puzzle_skips = remaining_item_slots
item_pool["Puzzle Skip"] = num_puzzle_skips item_pool["Puzzle Skip"] = num_puzzle_skips
remaining_item_slots -= num_puzzle_skips remaining_item_slots -= num_puzzle_skips
@ -150,45 +246,17 @@ class WitnessWorld(World):
if remaining_item_slots > 0: if remaining_item_slots > 0:
item_pool.update(self.items.get_filler_items(remaining_item_slots)) item_pool.update(self.items.get_filler_items(remaining_item_slots))
# Add event items and tie them to event locations (e.g. laser activations).
for event_location in self.locat.EVENT_LOCATION_TABLE:
item_obj = self.create_item(
self.player_logic.EVENT_ITEM_PAIRS[event_location]
)
location_obj = self.multiworld.get_location(event_location, self.player)
location_obj.place_locked_item(item_obj)
# BAD DOG GET BACK HERE WITH THAT PUZZLE SKIP YOU'RE POLLUTING THE ITEM POOL
self.multiworld.get_location("Town Pet the Dog", self.player)\
.place_locked_item(self.create_item("Puzzle Skip"))
# Pick an early item to place on the tutorial gate.
early_items = [item for item in self.items.get_early_items() if item in item_pool]
if early_items:
random_early_item = self.multiworld.random.choice(early_items)
if get_option_value(self.multiworld, self.player, "puzzle_randomization") == 1:
# In Expert, only tag the item as early, rather than forcing it onto the gate.
self.multiworld.local_early_items[self.player][random_early_item] = 1
else:
# Force the item onto the tutorial gate check and remove it from our random pool.
self.multiworld.get_location("Tutorial Gate Open", self.player)\
.place_locked_item(self.create_item(random_early_item))
if item_pool[random_early_item] == 1:
item_pool.pop(random_early_item)
else:
item_pool[random_early_item] -= 1
# Generate the actual items. # Generate the actual items.
for item_name, quantity in sorted(item_pool.items()): for item_name, quantity in sorted(item_pool.items()):
self.multiworld.itempool += [self.create_item(item_name) for _ in range(0, quantity)] new_items = [self.create_item(item_name) for _ in range(0, quantity)]
self.own_itempool += new_items
self.multiworld.itempool += new_items
if self.items.item_data[item_name].local_only: if self.items.item_data[item_name].local_only:
self.multiworld.local_items[self.player].value.add(item_name) self.multiworld.local_items[self.player].value.add(item_name)
def set_rules(self):
set_rules(self.multiworld, self.player, self.player_logic, self.locat)
def fill_slot_data(self) -> dict: def fill_slot_data(self) -> dict:
hint_amount = get_option_value(self.multiworld, self.player, "hint_amount") hint_amount = self.options.hint_amount.value
credits_hint = ( credits_hint = (
"This Randomizer is brought to you by", "This Randomizer is brought to you by",
@ -199,9 +267,9 @@ class WitnessWorld(World):
audio_logs = get_audio_logs().copy() audio_logs = get_audio_logs().copy()
if hint_amount != 0: if hint_amount != 0:
generated_hints = make_hints(self.multiworld, self.player, hint_amount) generated_hints = make_hints(self, hint_amount, self.own_itempool)
self.multiworld.per_slot_randoms[self.player].shuffle(audio_logs) self.random.shuffle(audio_logs)
duplicates = min(3, len(audio_logs) // hint_amount) duplicates = min(3, len(audio_logs) // hint_amount)
@ -216,7 +284,7 @@ class WitnessWorld(World):
audio_log = audio_logs.pop() audio_log = audio_logs.pop()
self.log_ids_to_hints[int(audio_log, 16)] = credits_hint self.log_ids_to_hints[int(audio_log, 16)] = credits_hint
joke_hints = generate_joke_hints(self.multiworld, self.player, len(audio_logs)) joke_hints = generate_joke_hints(self, len(audio_logs))
while audio_logs: while audio_logs:
audio_log = audio_logs.pop() audio_log = audio_logs.pop()
@ -226,10 +294,10 @@ class WitnessWorld(World):
slot_data = self._get_slot_data() slot_data = self._get_slot_data()
for option_name in the_witness_options: for option_name in (attr.name for attr in dataclasses.fields(TheWitnessOptions)
slot_data[option_name] = get_option_value( if attr not in dataclasses.fields(PerGameCommonOptions)):
self.multiworld, self.player, option_name option = getattr(self.options, option_name)
) slot_data[option_name] = bool(option.value) if isinstance(option, Toggle) else option.value
return slot_data return slot_data
@ -257,36 +325,35 @@ class WitnessLocation(Location):
Archipelago Location for The Witness Archipelago Location for The Witness
""" """
game: str = "The Witness" game: str = "The Witness"
check_hex: int = -1 entity_hex: int = -1
def __init__(self, player: int, name: str, address: Optional[int], parent, ch_hex: int = -1): def __init__(self, player: int, name: str, address: Optional[int], parent, ch_hex: int = -1):
super().__init__(player, name, address, parent) super().__init__(player, name, address, parent)
self.check_hex = ch_hex self.entity_hex = ch_hex
def create_region(world: MultiWorld, player: int, name: str, def create_region(world: WitnessWorld, name: str, locat: WitnessPlayerLocations, region_locations=None, exits=None):
locat: WitnessPlayerLocations, region_locations=None, exits=None):
""" """
Create an Archipelago Region for The Witness Create an Archipelago Region for The Witness
""" """
ret = Region(name, player, world) ret = Region(name, world.player, world.multiworld)
if region_locations: if region_locations:
for location in region_locations: for location in region_locations:
loc_id = locat.CHECK_LOCATION_TABLE[location] loc_id = locat.CHECK_LOCATION_TABLE[location]
check_hex = -1 entity_hex = -1
if location in StaticWitnessLogic.CHECKS_BY_NAME: if location in StaticWitnessLogic.ENTITIES_BY_NAME:
check_hex = int( entity_hex = int(
StaticWitnessLogic.CHECKS_BY_NAME[location]["checkHex"], 0 StaticWitnessLogic.ENTITIES_BY_NAME[location]["entity_hex"], 0
) )
location = WitnessLocation( location = WitnessLocation(
player, location, loc_id, ret, check_hex world.player, location, loc_id, ret, entity_hex
) )
ret.locations.append(location) ret.locations.append(location)
if exits: if exits:
for single_exit in exits: for single_exit in exits:
ret.exits.append(Entrance(player, single_exit, ret)) ret.exits.append(Entrance(world.player, single_exit, ret))
return ret return ret

View File

@ -1,5 +1,9 @@
from BaseClasses import MultiWorld from typing import Tuple, List, TYPE_CHECKING
from .Options import is_option_enabled, get_option_value
from BaseClasses import Item
if TYPE_CHECKING:
from . import WitnessWorld
joke_hints = [ joke_hints = [
"Quaternions break my brain", "Quaternions break my brain",
@ -113,16 +117,16 @@ joke_hints = [
] ]
def get_always_hint_items(multiworld: MultiWorld, player: int): def get_always_hint_items(world: "WitnessWorld"):
always = [ always = [
"Boat", "Boat",
"Caves Exits to Main Island", "Caves Shortcuts",
"Progressive Dots", "Progressive Dots",
] ]
difficulty = get_option_value(multiworld, player, "puzzle_randomization") difficulty = world.options.puzzle_randomization
discards = is_option_enabled(multiworld, player, "shuffle_discarded_panels") discards = world.options.shuffle_discarded_panels
wincon = get_option_value(multiworld, player, "victory_condition") wincon = world.options.victory_condition
if discards: if discards:
if difficulty == 1: if difficulty == 1:
@ -131,12 +135,15 @@ def get_always_hint_items(multiworld: MultiWorld, player: int):
always.append("Triangles") always.append("Triangles")
if wincon == 0: if wincon == 0:
always.append("Mountain Bottom Floor Final Room Entry (Door)") always += ["Mountain Bottom Floor Final Room Entry (Door)", "Mountain Bottom Floor Doors"]
if wincon == 1:
always += ["Challenge Entry (Panel)", "Caves Panels"]
return always return always
def get_always_hint_locations(multiworld: MultiWorld, player: int): def get_always_hint_locations(_: "WitnessWorld"):
return { return {
"Challenge Vault Box", "Challenge Vault Box",
"Mountain Bottom Floor Discard", "Mountain Bottom Floor Discard",
@ -146,19 +153,34 @@ def get_always_hint_locations(multiworld: MultiWorld, player: int):
} }
def get_priority_hint_items(multiworld: MultiWorld, player: int): def get_priority_hint_items(world: "WitnessWorld"):
priority = { priority = {
"Caves Mountain Shortcut (Door)", "Caves Mountain Shortcut (Door)",
"Caves Swamp Shortcut (Door)", "Caves Swamp Shortcut (Door)",
"Negative Shapers",
"Sound Dots",
"Colored Dots",
"Stars + Same Colored Symbol",
"Swamp Entry (Panel)", "Swamp Entry (Panel)",
"Swamp Laser Shortcut (Door)", "Swamp Laser Shortcut (Door)",
} }
if is_option_enabled(multiworld, player, "shuffle_lasers"): if world.options.shuffle_symbols:
symbols = [
"Progressive Dots",
"Progressive Stars",
"Shapers",
"Rotated Shapers",
"Negative Shapers",
"Arrows",
"Triangles",
"Eraser",
"Black/White Squares",
"Colored Squares",
"Colored Dots",
"Sound Dots",
"Symmetry"
]
priority.update(world.random.sample(symbols, 5))
if world.options.shuffle_lasers:
lasers = [ lasers = [
"Symmetry Laser", "Symmetry Laser",
"Town Laser", "Town Laser",
@ -172,18 +194,18 @@ def get_priority_hint_items(multiworld: MultiWorld, player: int):
"Shadows Laser", "Shadows Laser",
] ]
if get_option_value(multiworld, player, "shuffle_doors") >= 2: if world.options.shuffle_doors >= 2:
priority.add("Desert Laser") priority.add("Desert Laser")
priority.update(multiworld.per_slot_randoms[player].sample(lasers, 5)) priority.update(world.random.sample(lasers, 5))
else: else:
lasers.append("Desert Laser") lasers.append("Desert Laser")
priority.update(multiworld.per_slot_randoms[player].sample(lasers, 6)) priority.update(world.random.sample(lasers, 6))
return priority return priority
def get_priority_hint_locations(multiworld: MultiWorld, player: int): def get_priority_hint_locations(_: "WitnessWorld"):
return { return {
"Swamp Purple Underwater", "Swamp Purple Underwater",
"Shipwreck Vault Box", "Shipwreck Vault Box",
@ -201,89 +223,100 @@ def get_priority_hint_locations(multiworld: MultiWorld, player: int):
} }
def make_hint_from_item(multiworld: MultiWorld, player: int, item: str): def make_hint_from_item(world: "WitnessWorld", item_name: str, own_itempool: List[Item]):
location_obj = multiworld.find_item(item, player).item.location locations = [item.location for item in own_itempool if item.name == item_name and item.location]
if not locations:
return None
location_obj = world.random.choice(locations)
location_name = location_obj.name location_name = location_obj.name
if location_obj.player != player:
location_name += " (" + multiworld.get_player_name(location_obj.player) + ")"
return location_name, item, location_obj.address if (location_obj.player == player) else -1 if location_obj.player != world.player:
location_name += " (" + world.multiworld.get_player_name(location_obj.player) + ")"
return location_name, item_name, location_obj.address if (location_obj.player == world.player) else -1
def make_hint_from_location(multiworld: MultiWorld, player: int, location: str): def make_hint_from_location(world: "WitnessWorld", location: str):
location_obj = multiworld.get_location(location, player) location_obj = world.multiworld.get_location(location, world.player)
item_obj = multiworld.get_location(location, player).item item_obj = world.multiworld.get_location(location, world.player).item
item_name = item_obj.name item_name = item_obj.name
if item_obj.player != player: if item_obj.player != world.player:
item_name += " (" + multiworld.get_player_name(item_obj.player) + ")" item_name += " (" + world.multiworld.get_player_name(item_obj.player) + ")"
return location, item_name, location_obj.address if (location_obj.player == player) else -1 return location, item_name, location_obj.address if (location_obj.player == world.player) else -1
def make_hints(multiworld: MultiWorld, player: int, hint_amount: int): def make_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item]):
hints = list() hints = list()
prog_items_in_this_world = { prog_items_in_this_world = {
item.name for item in multiworld.get_items() item.name for item in own_itempool if item.advancement and item.code and item.location
if item.player == player and item.code and item.advancement
} }
loc_in_this_world = { loc_in_this_world = {
location.name for location in multiworld.get_locations(player) location.name for location in world.multiworld.get_locations(world.player) if location.address
if location.address
} }
always_locations = [ always_locations = [
location for location in get_always_hint_locations(multiworld, player) location for location in get_always_hint_locations(world)
if location in loc_in_this_world if location in loc_in_this_world
] ]
always_items = [ always_items = [
item for item in get_always_hint_items(multiworld, player) item for item in get_always_hint_items(world)
if item in prog_items_in_this_world if item in prog_items_in_this_world
] ]
priority_locations = [ priority_locations = [
location for location in get_priority_hint_locations(multiworld, player) location for location in get_priority_hint_locations(world)
if location in loc_in_this_world if location in loc_in_this_world
] ]
priority_items = [ priority_items = [
item for item in get_priority_hint_items(multiworld, player) item for item in get_priority_hint_items(world)
if item in prog_items_in_this_world if item in prog_items_in_this_world
] ]
always_hint_pairs = dict() always_hint_pairs = dict()
for item in always_items: for item in always_items:
hint_pair = make_hint_from_item(multiworld, player, item) hint_pair = make_hint_from_item(world, item, own_itempool)
if hint_pair[2] == 158007: # Tutorial Gate Open if not hint_pair or hint_pair[2] == 158007: # Tutorial Gate Open
continue continue
always_hint_pairs[hint_pair[0]] = (hint_pair[1], True, hint_pair[2]) always_hint_pairs[hint_pair[0]] = (hint_pair[1], True, hint_pair[2])
for location in always_locations: for location in always_locations:
hint_pair = make_hint_from_location(multiworld, player, location) hint_pair = make_hint_from_location(world, location)
always_hint_pairs[hint_pair[0]] = (hint_pair[1], False, hint_pair[2]) always_hint_pairs[hint_pair[0]] = (hint_pair[1], False, hint_pair[2])
priority_hint_pairs = dict() priority_hint_pairs = dict()
for item in priority_items: for item in priority_items:
hint_pair = make_hint_from_item(multiworld, player, item) hint_pair = make_hint_from_item(world, item, own_itempool)
if hint_pair[2] == 158007: # Tutorial Gate Open if not hint_pair or hint_pair[2] == 158007: # Tutorial Gate Open
continue continue
priority_hint_pairs[hint_pair[0]] = (hint_pair[1], True, hint_pair[2]) priority_hint_pairs[hint_pair[0]] = (hint_pair[1], True, hint_pair[2])
for location in priority_locations: for location in priority_locations:
hint_pair = make_hint_from_location(multiworld, player, location) hint_pair = make_hint_from_location(world, location)
priority_hint_pairs[hint_pair[0]] = (hint_pair[1], False, hint_pair[2]) priority_hint_pairs[hint_pair[0]] = (hint_pair[1], False, hint_pair[2])
already_hinted_locations = set()
for loc, item in always_hint_pairs.items(): for loc, item in always_hint_pairs.items():
if loc in already_hinted_locations:
continue
if item[1]: if item[1]:
hints.append((f"{item[0]} can be found at {loc}.", item[2])) hints.append((f"{item[0]} can be found at {loc}.", item[2]))
else: else:
hints.append((f"{loc} contains {item[0]}.", item[2])) hints.append((f"{loc} contains {item[0]}.", item[2]))
multiworld.per_slot_randoms[player].shuffle(hints) # shuffle always hint order in case of low hint amount already_hinted_locations.add(loc)
world.random.shuffle(hints) # shuffle always hint order in case of low hint amount
remaining_hints = hint_amount - len(hints) remaining_hints = hint_amount - len(hints)
priority_hint_amount = int(max(0.0, min(len(priority_hint_pairs) / 2, remaining_hints / 2))) priority_hint_amount = int(max(0.0, min(len(priority_hint_pairs) / 2, remaining_hints / 2)))
@ -291,22 +324,27 @@ def make_hints(multiworld: MultiWorld, player: int, hint_amount: int):
prog_items_in_this_world = sorted(list(prog_items_in_this_world)) prog_items_in_this_world = sorted(list(prog_items_in_this_world))
locations_in_this_world = sorted(list(loc_in_this_world)) locations_in_this_world = sorted(list(loc_in_this_world))
multiworld.per_slot_randoms[player].shuffle(prog_items_in_this_world) world.random.shuffle(prog_items_in_this_world)
multiworld.per_slot_randoms[player].shuffle(locations_in_this_world) world.random.shuffle(locations_in_this_world)
priority_hint_list = list(priority_hint_pairs.items()) priority_hint_list = list(priority_hint_pairs.items())
multiworld.per_slot_randoms[player].shuffle(priority_hint_list) world.random.shuffle(priority_hint_list)
for _ in range(0, priority_hint_amount): for _ in range(0, priority_hint_amount):
next_priority_hint = priority_hint_list.pop() next_priority_hint = priority_hint_list.pop()
loc = next_priority_hint[0] loc = next_priority_hint[0]
item = next_priority_hint[1] item = next_priority_hint[1]
if loc in already_hinted_locations:
continue
if item[1]: if item[1]:
hints.append((f"{item[0]} can be found at {loc}.", item[2])) hints.append((f"{item[0]} can be found at {loc}.", item[2]))
else: else:
hints.append((f"{loc} contains {item[0]}.", item[2])) hints.append((f"{loc} contains {item[0]}.", item[2]))
next_random_hint_is_item = multiworld.per_slot_randoms[player].randrange(0, 2) # Moving this to the new system is in the bigger refactoring PR already_hinted_locations.add(loc)
next_random_hint_is_item = world.random.randrange(0, 2)
while len(hints) < hint_amount: while len(hints) < hint_amount:
if next_random_hint_is_item: if next_random_hint_is_item:
@ -314,16 +352,28 @@ def make_hints(multiworld: MultiWorld, player: int, hint_amount: int):
next_random_hint_is_item = not next_random_hint_is_item next_random_hint_is_item = not next_random_hint_is_item
continue continue
hint = make_hint_from_item(multiworld, player, prog_items_in_this_world.pop()) hint = make_hint_from_item(world, prog_items_in_this_world.pop(), own_itempool)
if not hint or hint[0] in already_hinted_locations:
continue
hints.append((f"{hint[1]} can be found at {hint[0]}.", hint[2])) hints.append((f"{hint[1]} can be found at {hint[0]}.", hint[2]))
already_hinted_locations.add(hint[0])
else: else:
hint = make_hint_from_location(multiworld, player, locations_in_this_world.pop()) hint = make_hint_from_location(world, locations_in_this_world.pop())
if hint[0] in already_hinted_locations:
continue
hints.append((f"{hint[0]} contains {hint[1]}.", hint[2])) hints.append((f"{hint[0]} contains {hint[1]}.", hint[2]))
already_hinted_locations.add(hint[0])
next_random_hint_is_item = not next_random_hint_is_item next_random_hint_is_item = not next_random_hint_is_item
return hints return hints
def generate_joke_hints(multiworld: MultiWorld, player: int, amount: int): def generate_joke_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]]:
return [(x, -1) for x in multiworld.per_slot_randoms[player].sample(joke_hints, amount)] return [(x, -1) for x in world.random.sample(joke_hints, amount)]

View File

@ -2,18 +2,20 @@
Defines progression, junk and event items for The Witness Defines progression, junk and event items for The Witness
""" """
import copy import copy
from dataclasses import dataclass from dataclasses import dataclass
from typing import Optional, Dict, List, Set from typing import Optional, Dict, List, Set, TYPE_CHECKING
from BaseClasses import Item, MultiWorld, ItemClassification from BaseClasses import Item, MultiWorld, ItemClassification
from .Options import get_option_value, is_option_enabled, the_witness_options
from .locations import ID_START, WitnessPlayerLocations from .locations import ID_START, WitnessPlayerLocations
from .player_logic import WitnessPlayerLogic from .player_logic import WitnessPlayerLogic
from .static_logic import ItemDefinition, DoorItemDefinition, ProgressiveItemDefinition, ItemCategory, \ from .static_logic import ItemDefinition, DoorItemDefinition, ProgressiveItemDefinition, ItemCategory, \
StaticWitnessLogic, WeightedItemDefinition StaticWitnessLogic, WeightedItemDefinition
from .utils import build_weighted_int_list from .utils import build_weighted_int_list
if TYPE_CHECKING:
from . import WitnessWorld
NUM_ENERGY_UPGRADES = 4 NUM_ENERGY_UPGRADES = 4
@ -59,7 +61,7 @@ class StaticWitnessItems:
classification = ItemClassification.progression classification = ItemClassification.progression
StaticWitnessItems.item_groups.setdefault("Doors", []).append(item_name) StaticWitnessItems.item_groups.setdefault("Doors", []).append(item_name)
elif definition.category is ItemCategory.LASER: elif definition.category is ItemCategory.LASER:
classification = ItemClassification.progression classification = ItemClassification.progression_skip_balancing
StaticWitnessItems.item_groups.setdefault("Lasers", []).append(item_name) StaticWitnessItems.item_groups.setdefault("Lasers", []).append(item_name)
elif definition.category is ItemCategory.USEFUL: elif definition.category is ItemCategory.USEFUL:
classification = ItemClassification.useful classification = ItemClassification.useful
@ -90,11 +92,12 @@ class WitnessPlayerItems:
Class that defines Items for a single world Class that defines Items for a single world
""" """
def __init__(self, multiworld: MultiWorld, player: int, logic: WitnessPlayerLogic, locat: WitnessPlayerLocations): def __init__(self, world: "WitnessWorld", logic: WitnessPlayerLogic, locat: WitnessPlayerLocations):
"""Adds event items after logic changes due to options""" """Adds event items after logic changes due to options"""
self._world: MultiWorld = multiworld self._world: "WitnessWorld" = world
self._player_id: int = player self._multiworld: MultiWorld = world.multiworld
self._player_id: int = world.player
self._logic: WitnessPlayerLogic = logic self._logic: WitnessPlayerLogic = logic
self._locations: WitnessPlayerLocations = locat self._locations: WitnessPlayerLocations = locat
@ -102,19 +105,33 @@ class WitnessPlayerItems:
self.item_data: Dict[str, ItemData] = copy.deepcopy(StaticWitnessItems.item_data) self.item_data: Dict[str, ItemData] = copy.deepcopy(StaticWitnessItems.item_data)
# Remove all progression items that aren't actually in the game. # Remove all progression items that aren't actually in the game.
self.item_data = {name: data for (name, data) in self.item_data.items() self.item_data = {
if data.classification is not ItemClassification.progression or name: data for (name, data) in self.item_data.items()
name in logic.PROG_ITEMS_ACTUALLY_IN_THE_GAME} if data.classification not in
{ItemClassification.progression, ItemClassification.progression_skip_balancing}
or name in logic.PROG_ITEMS_ACTUALLY_IN_THE_GAME
}
# Adjust item classifications based on game settings. # Adjust item classifications based on game settings.
eps_shuffled = get_option_value(self._world, self._player_id, "shuffle_EPs") != 0 eps_shuffled = self._world.options.shuffle_EPs
come_to_you = self._world.options.elevators_come_to_you
for item_name, item_data in self.item_data.items(): for item_name, item_data in self.item_data.items():
if not eps_shuffled and item_name in ["Monastery Garden Entry (Door)", "Monastery Shortcuts"]: if not eps_shuffled and item_name in {"Monastery Garden Entry (Door)",
"Monastery Shortcuts",
"Quarry Boathouse Hook Control (Panel)",
"Windmill Turn Control (Panel)"}:
# Downgrade doors that only gate progress in EP shuffle. # Downgrade doors that only gate progress in EP shuffle.
item_data.classification = ItemClassification.useful item_data.classification = ItemClassification.useful
elif item_name in ["River Monastery Shortcut (Door)", "Jungle & River Shortcuts", elif not come_to_you and not eps_shuffled and item_name in {"Quarry Elevator Control (Panel)",
"Monastery Shortcut (Door)", "Swamp Long Bridge (Panel)"}:
"Orchard Second Gate (Door)"]: # These Bridges/Elevators are not logical access because they may leave you stuck.
item_data.classification = ItemClassification.useful
elif item_name in {"River Monastery Garden Shortcut (Door)",
"Monastery Laser Shortcut (Door)",
"Orchard Second Gate (Door)",
"Jungle Bamboo Laser Shortcut (Door)",
"Keep Pressure Plates 2 Exit (Door)",
"Caves Elevator Controls (Panel)"}:
# Downgrade doors that don't gate progress. # Downgrade doors that don't gate progress.
item_data.classification = ItemClassification.useful item_data.classification = ItemClassification.useful
@ -122,8 +139,11 @@ class WitnessPlayerItems:
self._mandatory_items: Dict[str, int] = {} self._mandatory_items: Dict[str, int] = {}
# Add progression items to the mandatory item list. # Add progression items to the mandatory item list.
for item_name, item_data in {name: data for (name, data) in self.item_data.items() progression_dict = {
if data.classification == ItemClassification.progression}.items(): name: data for (name, data) in self.item_data.items()
if data.classification in {ItemClassification.progression, ItemClassification.progression_skip_balancing}
}
for item_name, item_data in progression_dict.items():
if isinstance(item_data.definition, ProgressiveItemDefinition): if isinstance(item_data.definition, ProgressiveItemDefinition):
num_progression = len(self._logic.MULTI_LISTS[item_name]) num_progression = len(self._logic.MULTI_LISTS[item_name])
self._mandatory_items[item_name] = num_progression self._mandatory_items[item_name] = num_progression
@ -170,7 +190,7 @@ class WitnessPlayerItems:
remaining_quantity -= len(output) remaining_quantity -= len(output)
# Read trap configuration data. # Read trap configuration data.
trap_weight = get_option_value(self._world, self._player_id, "trap_percentage") / 100 trap_weight = self._world.options.trap_percentage / 100
filler_weight = 1 - trap_weight filler_weight = 1 - trap_weight
# Add filler items to the list. # Add filler items to the list.
@ -198,15 +218,14 @@ class WitnessPlayerItems:
Returns items that are ideal for placing on extremely early checks, like the tutorial gate. Returns items that are ideal for placing on extremely early checks, like the tutorial gate.
""" """
output: Set[str] = set() output: Set[str] = set()
if "shuffle_symbols" not in the_witness_options.keys() \ if self._world.options.shuffle_symbols:
or is_option_enabled(self._world, self._player_id, "shuffle_symbols"): if self._world.options.shuffle_doors:
if get_option_value(self._world, self._player_id, "shuffle_doors") > 0:
output = {"Dots", "Black/White Squares", "Symmetry"} output = {"Dots", "Black/White Squares", "Symmetry"}
else: else:
output = {"Dots", "Black/White Squares", "Symmetry", "Shapers", "Stars"} output = {"Dots", "Black/White Squares", "Symmetry", "Shapers", "Stars"}
if is_option_enabled(self._world, self._player_id, "shuffle_discarded_panels"): if self._world.options.shuffle_discarded_panels:
if get_option_value(self._world, self._player_id, "puzzle_randomization") == 1: if self._world.options.puzzle_randomization == 1:
output.add("Arrows") output.add("Arrows")
else: else:
output.add("Triangles") output.add("Triangles")
@ -217,7 +236,7 @@ class WitnessPlayerItems:
# Remove items that are mentioned in any plando options. (Hopefully, in the future, plando will get resolved # Remove items that are mentioned in any plando options. (Hopefully, in the future, plando will get resolved
# before create_items so that we'll be able to check placed items instead of just removing all items mentioned # before create_items so that we'll be able to check placed items instead of just removing all items mentioned
# regardless of whether or not they actually wind up being manually placed. # regardless of whether or not they actually wind up being manually placed.
for plando_setting in self._world.plando_items[self._player_id]: for plando_setting in self._multiworld.plando_items[self._player_id]:
if plando_setting.get("from_pool", True): if plando_setting.get("from_pool", True):
for item_setting_key in [key for key in ["item", "items"] if key in plando_setting]: for item_setting_key in [key for key in ["item", "items"] if key in plando_setting]:
if type(plando_setting[item_setting_key]) is str: if type(plando_setting[item_setting_key]) is str:
@ -243,6 +262,7 @@ class WitnessPlayerItems:
for item_name, item_data in {name: data for name, data in self.item_data.items() for item_name, item_data in {name: data for name, data in self.item_data.items()
if isinstance(data.definition, DoorItemDefinition)}.items(): if isinstance(data.definition, DoorItemDefinition)}.items():
output += [int(hex_string, 16) for hex_string in item_data.definition.panel_id_hexes] output += [int(hex_string, 16) for hex_string in item_data.definition.panel_id_hexes]
return output return output
def get_symbol_ids_not_in_pool(self) -> List[int]: def get_symbol_ids_not_in_pool(self) -> List[int]:

View File

@ -1,11 +1,14 @@
""" """
Defines constants for different types of locations in the game Defines constants for different types of locations in the game
""" """
from typing import TYPE_CHECKING
from .Options import is_option_enabled, get_option_value
from .player_logic import WitnessPlayerLogic from .player_logic import WitnessPlayerLogic
from .static_logic import StaticWitnessLogic from .static_logic import StaticWitnessLogic
if TYPE_CHECKING:
from . import WitnessWorld
ID_START = 158000 ID_START = 158000
@ -19,22 +22,29 @@ class StaticWitnessLocations:
"Tutorial Front Left", "Tutorial Front Left",
"Tutorial Back Left", "Tutorial Back Left",
"Tutorial Back Right", "Tutorial Back Right",
"Tutorial Patio Floor",
"Tutorial Gate Open", "Tutorial Gate Open",
"Outside Tutorial Vault Box", "Outside Tutorial Vault Box",
"Outside Tutorial Discard", "Outside Tutorial Discard",
"Outside Tutorial Shed Row 5", "Outside Tutorial Shed Row 5",
"Outside Tutorial Tree Row 9", "Outside Tutorial Tree Row 9",
"Outside Tutorial Outpost Entry Panel",
"Outside Tutorial Outpost Exit Panel",
"Glass Factory Discard", "Glass Factory Discard",
"Glass Factory Back Wall 5", "Glass Factory Back Wall 5",
"Glass Factory Front 3", "Glass Factory Front 3",
"Glass Factory Melting 3", "Glass Factory Melting 3",
"Symmetry Island Lower Panel",
"Symmetry Island Right 5", "Symmetry Island Right 5",
"Symmetry Island Back 6", "Symmetry Island Back 6",
"Symmetry Island Left 7", "Symmetry Island Left 7",
"Symmetry Island Upper Panel",
"Symmetry Island Scenery Outlines 5", "Symmetry Island Scenery Outlines 5",
"Symmetry Island Laser Yellow 3",
"Symmetry Island Laser Blue 3",
"Symmetry Island Laser Panel", "Symmetry Island Laser Panel",
"Orchard Apple Tree 5", "Orchard Apple Tree 5",
@ -49,9 +59,15 @@ class StaticWitnessLocations:
"Desert Final Bent 3", "Desert Final Bent 3",
"Desert Laser Panel", "Desert Laser Panel",
"Quarry Entry 1 Panel",
"Quarry Entry 2 Panel",
"Quarry Stoneworks Entry Left Panel",
"Quarry Stoneworks Entry Right Panel",
"Quarry Stoneworks Lower Row 6", "Quarry Stoneworks Lower Row 6",
"Quarry Stoneworks Upper Row 8", "Quarry Stoneworks Upper Row 8",
"Quarry Stoneworks Control Room Left",
"Quarry Stoneworks Control Room Right", "Quarry Stoneworks Control Room Right",
"Quarry Stoneworks Stairs Panel",
"Quarry Boathouse Intro Right", "Quarry Boathouse Intro Right",
"Quarry Boathouse Intro Left", "Quarry Boathouse Intro Left",
"Quarry Boathouse Front Row 5", "Quarry Boathouse Front Row 5",
@ -84,15 +100,32 @@ class StaticWitnessLocations:
"Monastery Inside 4", "Monastery Inside 4",
"Monastery Laser Panel", "Monastery Laser Panel",
"Town Cargo Box Entry Panel",
"Town Cargo Box Discard", "Town Cargo Box Discard",
"Town Tall Hexagonal", "Town Tall Hexagonal",
"Town Church Entry Panel",
"Town Church Lattice", "Town Church Lattice",
"Town Maze Panel",
"Town Rooftop Discard", "Town Rooftop Discard",
"Town Red Rooftop 5", "Town Red Rooftop 5",
"Town Wooden Roof Lower Row 5", "Town Wooden Roof Lower Row 5",
"Town Wooden Rooftop", "Town Wooden Rooftop",
"Town Windmill Entry Panel",
"Town RGB House Entry Panel",
"Town Laser Panel", "Town Laser Panel",
"Town RGB Room Left",
"Town RGB Room Right",
"Town Sound Room Right",
"Windmill Theater Entry Panel",
"Theater Exit Left Panel",
"Theater Exit Right Panel",
"Theater Tutorial Video",
"Theater Desert Video",
"Theater Jungle Video",
"Theater Shipwreck Video",
"Theater Mountain Video",
"Theater Discard", "Theater Discard",
"Jungle Discard", "Jungle Discard",
@ -102,24 +135,33 @@ class StaticWitnessLocations:
"Jungle Laser Panel", "Jungle Laser Panel",
"River Vault Box", "River Vault Box",
"River Monastery Garden Shortcut Panel",
"Bunker Entry Panel",
"Bunker Intro Left 5", "Bunker Intro Left 5",
"Bunker Intro Back 4", "Bunker Intro Back 4",
"Bunker Glass Room 3", "Bunker Glass Room 3",
"Bunker UV Room 2", "Bunker UV Room 2",
"Bunker Laser Panel", "Bunker Laser Panel",
"Swamp Entry Panel",
"Swamp Intro Front 6", "Swamp Intro Front 6",
"Swamp Intro Back 8", "Swamp Intro Back 8",
"Swamp Between Bridges Near Row 4", "Swamp Between Bridges Near Row 4",
"Swamp Cyan Underwater 5", "Swamp Cyan Underwater 5",
"Swamp Platform Row 4", "Swamp Platform Row 4",
"Swamp Platform Shortcut Right Panel",
"Swamp Between Bridges Far Row 4", "Swamp Between Bridges Far Row 4",
"Swamp Red Underwater 4", "Swamp Red Underwater 4",
"Swamp Purple Underwater",
"Swamp Beyond Rotating Bridge 4", "Swamp Beyond Rotating Bridge 4",
"Swamp Blue Underwater 5", "Swamp Blue Underwater 5",
"Swamp Laser Panel", "Swamp Laser Panel",
"Swamp Laser Shortcut Right Panel",
"Treehouse First Door Panel",
"Treehouse Second Door Panel",
"Treehouse Third Door Panel",
"Treehouse Yellow Bridge 9", "Treehouse Yellow Bridge 9",
"Treehouse First Purple Bridge 5", "Treehouse First Purple Bridge 5",
"Treehouse Second Purple Bridge 7", "Treehouse Second Purple Bridge 7",
@ -129,22 +171,11 @@ class StaticWitnessLocations:
"Treehouse Laser Discard", "Treehouse Laser Discard",
"Treehouse Right Orange Bridge 12", "Treehouse Right Orange Bridge 12",
"Treehouse Laser Panel", "Treehouse Laser Panel",
"Treehouse Drawbridge Panel",
"Mountainside Discard", "Mountainside Discard",
"Mountainside Vault Box", "Mountainside Vault Box",
"Mountaintop River Shape", "Mountaintop River Shape",
"Tutorial Patio Floor",
"Quarry Stoneworks Control Room Left",
"Theater Tutorial Video",
"Theater Desert Video",
"Theater Jungle Video",
"Theater Shipwreck Video",
"Theater Mountain Video",
"Town RGB Room Left",
"Town RGB Room Right",
"Town Sound Room Right",
"Swamp Purple Underwater",
"First Hallway EP", "First Hallway EP",
"Tutorial Cloud EP", "Tutorial Cloud EP",
@ -316,6 +347,77 @@ class StaticWitnessLocations:
"Town Obelisk Side 4", "Town Obelisk Side 4",
"Town Obelisk Side 5", "Town Obelisk Side 5",
"Town Obelisk Side 6", "Town Obelisk Side 6",
"Caves Mountain Shortcut Panel",
"Caves Swamp Shortcut Panel",
"Caves Blue Tunnel Right First 4",
"Caves Blue Tunnel Left First 1",
"Caves Blue Tunnel Left Second 5",
"Caves Blue Tunnel Right Second 5",
"Caves Blue Tunnel Right Third 1",
"Caves Blue Tunnel Left Fourth 1",
"Caves Blue Tunnel Left Third 1",
"Caves First Floor Middle",
"Caves First Floor Right",
"Caves First Floor Left",
"Caves First Floor Grounded",
"Caves Lone Pillar",
"Caves First Wooden Beam",
"Caves Second Wooden Beam",
"Caves Third Wooden Beam",
"Caves Fourth Wooden Beam",
"Caves Right Upstairs Left Row 8",
"Caves Right Upstairs Right Row 3",
"Caves Left Upstairs Single",
"Caves Left Upstairs Left Row 5",
"Caves Challenge Entry Panel",
"Challenge Tunnels Entry Panel",
"Tunnels Vault Box",
"Theater Challenge Video",
"Tunnels Town Shortcut Panel",
"Caves Skylight EP",
"Challenge Water EP",
"Tunnels Theater Flowers EP",
"Tutorial Gate EP",
"Mountaintop Mountain Entry Panel",
"Mountain Floor 1 Light Bridge Controller",
"Mountain Floor 1 Right Row 5",
"Mountain Floor 1 Left Row 7",
"Mountain Floor 1 Back Row 3",
"Mountain Floor 1 Trash Pillar 2",
"Mountain Floor 2 Near Row 5",
"Mountain Floor 2 Far Row 6",
"Mountain Floor 2 Light Bridge Controller Near",
"Mountain Floor 2 Light Bridge Controller Far",
"Mountain Bottom Floor Yellow Bridge EP",
"Mountain Bottom Floor Blue Bridge EP",
"Mountain Floor 2 Pink Bridge EP",
"Mountain Floor 2 Elevator Discard",
"Mountain Bottom Floor Giant Puzzle",
"Mountain Bottom Floor Final Room Entry Left",
"Mountain Bottom Floor Final Room Entry Right",
"Mountain Bottom Floor Caves Entry Panel",
"Mountain Final Room Left Pillar 4",
"Mountain Final Room Right Pillar 4",
"Challenge Vault Box",
"Theater Challenge Video",
"Mountain Bottom Floor Discard",
} }
OBELISK_SIDES = { OBELISK_SIDES = {
@ -355,94 +457,30 @@ class StaticWitnessLocations:
"Town Obelisk Side 6", "Town Obelisk Side 6",
} }
CAVES_LOCATIONS = {
"Caves Blue Tunnel Right First 4",
"Caves Blue Tunnel Left First 1",
"Caves Blue Tunnel Left Second 5",
"Caves Blue Tunnel Right Second 5",
"Caves Blue Tunnel Right Third 1",
"Caves Blue Tunnel Left Fourth 1",
"Caves Blue Tunnel Left Third 1",
"Caves First Floor Middle",
"Caves First Floor Right",
"Caves First Floor Left",
"Caves First Floor Grounded",
"Caves Lone Pillar",
"Caves First Wooden Beam",
"Caves Second Wooden Beam",
"Caves Third Wooden Beam",
"Caves Fourth Wooden Beam",
"Caves Right Upstairs Left Row 8",
"Caves Right Upstairs Right Row 3",
"Caves Left Upstairs Single",
"Caves Left Upstairs Left Row 5",
"Tunnels Vault Box",
"Theater Challenge Video",
"Caves Skylight EP",
"Challenge Water EP",
"Tunnels Theater Flowers EP",
"Tutorial Gate EP",
}
MOUNTAIN_UNREACHABLE_FROM_BEHIND = {
"Mountaintop Trap Door Triple Exit",
"Mountain Floor 1 Right Row 5",
"Mountain Floor 1 Left Row 7",
"Mountain Floor 1 Back Row 3",
"Mountain Floor 1 Trash Pillar 2",
"Mountain Floor 2 Near Row 5",
"Mountain Floor 2 Far Row 6",
"Mountain Floor 2 Light Bridge Controller Near",
"Mountain Floor 2 Light Bridge Controller Far",
"Mountain Bottom Floor Yellow Bridge EP",
"Mountain Bottom Floor Blue Bridge EP",
"Mountain Floor 2 Pink Bridge EP",
}
MOUNTAIN_REACHABLE_FROM_BEHIND = {
"Mountain Floor 2 Elevator Discard",
"Mountain Bottom Floor Giant Puzzle",
"Mountain Final Room Left Pillar 4",
"Mountain Final Room Right Pillar 4",
}
MOUNTAIN_EXTRAS = {
"Challenge Vault Box",
"Theater Challenge Video",
"Mountain Bottom Floor Discard"
}
ALL_LOCATIONS_TO_ID = dict() ALL_LOCATIONS_TO_ID = dict()
@staticmethod @staticmethod
def get_id(chex): def get_id(chex: str):
""" """
Calculates the location ID for any given location Calculates the location ID for any given location
""" """
return StaticWitnessLogic.CHECKS_BY_HEX[chex]["id"] return StaticWitnessLogic.ENTITIES_BY_HEX[chex]["id"]
@staticmethod @staticmethod
def get_event_name(panel_hex): def get_event_name(panel_hex: str):
""" """
Returns the event name of any given panel. Returns the event name of any given panel.
""" """
action = " Opened" if StaticWitnessLogic.CHECKS_BY_HEX[panel_hex]["panelType"] == "Door" else " Solved" action = " Opened" if StaticWitnessLogic.ENTITIES_BY_HEX[panel_hex]["entityType"] == "Door" else " Solved"
return StaticWitnessLogic.CHECKS_BY_HEX[panel_hex]["checkName"] + action return StaticWitnessLogic.ENTITIES_BY_HEX[panel_hex]["checkName"] + action
def __init__(self): def __init__(self):
all_loc_to_id = { all_loc_to_id = {
panel_obj["checkName"]: self.get_id(chex) panel_obj["checkName"]: self.get_id(chex)
for chex, panel_obj in StaticWitnessLogic.CHECKS_BY_HEX.items() for chex, panel_obj in StaticWitnessLogic.ENTITIES_BY_HEX.items()
if panel_obj["id"] if panel_obj["id"]
} }
@ -459,84 +497,44 @@ class WitnessPlayerLocations:
Class that defines locations for a single player Class that defines locations for a single player
""" """
def __init__(self, world, player, player_logic: WitnessPlayerLogic): def __init__(self, world: "WitnessWorld", player_logic: WitnessPlayerLogic):
"""Defines locations AFTER logic changes due to options""" """Defines locations AFTER logic changes due to options"""
self.PANEL_TYPES_TO_SHUFFLE = {"General", "Laser"} self.PANEL_TYPES_TO_SHUFFLE = {"General", "Laser"}
self.CHECK_LOCATIONS = StaticWitnessLocations.GENERAL_LOCATIONS.copy() self.CHECK_LOCATIONS = StaticWitnessLocations.GENERAL_LOCATIONS.copy()
doors = get_option_value(world, player, "shuffle_doors") >= 2 if world.options.shuffle_discarded_panels:
earlyutm = is_option_enabled(world, player, "early_secret_area")
victory = get_option_value(world, player, "victory_condition")
mount_lasers = get_option_value(world, player, "mountain_lasers")
chal_lasers = get_option_value(world, player, "challenge_lasers")
# laser_shuffle = get_option_value(world, player, "shuffle_lasers")
postgame = set()
postgame = postgame | StaticWitnessLocations.CAVES_LOCATIONS
postgame = postgame | StaticWitnessLocations.MOUNTAIN_REACHABLE_FROM_BEHIND
postgame = postgame | StaticWitnessLocations.MOUNTAIN_UNREACHABLE_FROM_BEHIND
postgame = postgame | StaticWitnessLocations.MOUNTAIN_EXTRAS
self.CHECK_LOCATIONS = self.CHECK_LOCATIONS | postgame
mountain_enterable_from_top = victory == 0 or victory == 1 or (victory == 3 and chal_lasers > mount_lasers)
if earlyutm or doors: # in non-doors, there is no way to get symbol-locked by the final pillars (currently)
postgame -= StaticWitnessLocations.CAVES_LOCATIONS
if (doors or earlyutm) and (victory == 0 or (victory == 2 and mount_lasers > chal_lasers)):
postgame -= {"Challenge Vault Box", "Theater Challenge Video"}
if doors or mountain_enterable_from_top:
postgame -= StaticWitnessLocations.MOUNTAIN_REACHABLE_FROM_BEHIND
if mountain_enterable_from_top:
postgame -= StaticWitnessLocations.MOUNTAIN_UNREACHABLE_FROM_BEHIND
if (victory == 0 and doors) or victory == 1 or (victory == 2 and mount_lasers > chal_lasers and doors):
postgame -= {"Mountain Bottom Floor Discard"}
if is_option_enabled(world, player, "shuffle_discarded_panels"):
self.PANEL_TYPES_TO_SHUFFLE.add("Discard") self.PANEL_TYPES_TO_SHUFFLE.add("Discard")
if is_option_enabled(world, player, "shuffle_vault_boxes"): if world.options.shuffle_vault_boxes:
self.PANEL_TYPES_TO_SHUFFLE.add("Vault") self.PANEL_TYPES_TO_SHUFFLE.add("Vault")
if get_option_value(world, player, "shuffle_EPs") == 1: if world.options.shuffle_EPs == 1:
self.PANEL_TYPES_TO_SHUFFLE.add("EP") self.PANEL_TYPES_TO_SHUFFLE.add("EP")
elif get_option_value(world, player, "shuffle_EPs") == 2: elif world.options.shuffle_EPs == 2:
self.PANEL_TYPES_TO_SHUFFLE.add("Obelisk Side") self.PANEL_TYPES_TO_SHUFFLE.add("Obelisk Side")
for obelisk_loc in StaticWitnessLocations.OBELISK_SIDES: for obelisk_loc in StaticWitnessLocations.OBELISK_SIDES:
obelisk_loc_hex = StaticWitnessLogic.CHECKS_BY_NAME[obelisk_loc]["checkHex"] obelisk_loc_hex = StaticWitnessLogic.ENTITIES_BY_NAME[obelisk_loc]["entity_hex"]
if player_logic.REQUIREMENTS_BY_HEX[obelisk_loc_hex] == frozenset({frozenset()}): if player_logic.REQUIREMENTS_BY_HEX[obelisk_loc_hex] == frozenset({frozenset()}):
self.CHECK_LOCATIONS.discard(obelisk_loc) self.CHECK_LOCATIONS.discard(obelisk_loc)
self.CHECK_LOCATIONS = self.CHECK_LOCATIONS | player_logic.ADDED_CHECKS self.CHECK_LOCATIONS = self.CHECK_LOCATIONS | player_logic.ADDED_CHECKS
if not is_option_enabled(world, player, "shuffle_postgame"): self.CHECK_LOCATIONS.discard(StaticWitnessLogic.ENTITIES_BY_HEX[player_logic.VICTORY_LOCATION]["checkName"])
self.CHECK_LOCATIONS -= postgame
self.CHECK_LOCATIONS -= {
StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"]
for panel in player_logic.PRECOMPLETED_LOCATIONS
}
self.CHECK_LOCATIONS.discard(StaticWitnessLogic.CHECKS_BY_HEX[player_logic.VICTORY_LOCATION]["checkName"])
self.CHECK_LOCATIONS = self.CHECK_LOCATIONS - { self.CHECK_LOCATIONS = self.CHECK_LOCATIONS - {
StaticWitnessLogic.CHECKS_BY_HEX[check_hex]["checkName"] StaticWitnessLogic.ENTITIES_BY_HEX[entity_hex]["checkName"]
for check_hex in player_logic.COMPLETELY_DISABLED_CHECKS for entity_hex in player_logic.COMPLETELY_DISABLED_ENTITIES | player_logic.PRECOMPLETED_LOCATIONS
} }
self.CHECK_PANELHEX_TO_ID = { self.CHECK_PANELHEX_TO_ID = {
StaticWitnessLogic.CHECKS_BY_NAME[ch]["checkHex"]: StaticWitnessLocations.ALL_LOCATIONS_TO_ID[ch] StaticWitnessLogic.ENTITIES_BY_NAME[ch]["entity_hex"]: StaticWitnessLocations.ALL_LOCATIONS_TO_ID[ch]
for ch in self.CHECK_LOCATIONS for ch in self.CHECK_LOCATIONS
if StaticWitnessLogic.CHECKS_BY_NAME[ch]["panelType"] in self.PANEL_TYPES_TO_SHUFFLE if StaticWitnessLogic.ENTITIES_BY_NAME[ch]["entityType"] in self.PANEL_TYPES_TO_SHUFFLE
} }
dog_hex = StaticWitnessLogic.CHECKS_BY_NAME["Town Pet the Dog"]["checkHex"] dog_hex = StaticWitnessLogic.ENTITIES_BY_NAME["Town Pet the Dog"]["entity_hex"]
dog_id = StaticWitnessLocations.ALL_LOCATIONS_TO_ID["Town Pet the Dog"] dog_id = StaticWitnessLocations.ALL_LOCATIONS_TO_ID["Town Pet the Dog"]
self.CHECK_PANELHEX_TO_ID[dog_hex] = dog_id self.CHECK_PANELHEX_TO_ID[dog_hex] = dog_id
@ -554,9 +552,14 @@ class WitnessPlayerLocations:
} }
check_dict = { check_dict = {
StaticWitnessLogic.CHECKS_BY_HEX[location]["checkName"]: StaticWitnessLogic.ENTITIES_BY_HEX[location]["checkName"]:
StaticWitnessLocations.get_id(StaticWitnessLogic.CHECKS_BY_HEX[location]["checkHex"]) StaticWitnessLocations.get_id(StaticWitnessLogic.ENTITIES_BY_HEX[location]["entity_hex"])
for location in self.CHECK_PANELHEX_TO_ID for location in self.CHECK_PANELHEX_TO_ID
} }
self.CHECK_LOCATION_TABLE = {**self.EVENT_LOCATION_TABLE, **check_dict} self.CHECK_LOCATION_TABLE = {**self.EVENT_LOCATION_TABLE, **check_dict}
def add_location_late(self, entity_name: str):
entity_hex = StaticWitnessLogic.ENTITIES_BY_NAME[entity_name]["entity_hex"]
self.CHECK_LOCATION_TABLE[entity_hex] = entity_name
self.CHECK_PANELHEX_TO_ID[entity_hex] = StaticWitnessLocations.get_id(entity_hex)

View File

@ -16,22 +16,22 @@ When the world has parsed its options, a second function is called to finalize t
""" """
import copy import copy
from typing import Set, Dict, cast, List from collections import defaultdict
from typing import cast, TYPE_CHECKING
from logging import warning from logging import warning
from BaseClasses import MultiWorld
from .static_logic import StaticWitnessLogic, DoorItemDefinition, ItemCategory, ProgressiveItemDefinition from .static_logic import StaticWitnessLogic, DoorItemDefinition, ItemCategory, ProgressiveItemDefinition
from .utils import define_new_region, get_disable_unrandomized_list, parse_lambda, get_early_utm_list, \ from .utils import *
get_symbol_shuffle_list, get_door_panel_shuffle_list, get_doors_complex_list, get_doors_max_list, \
get_doors_simple_list, get_laser_shuffle, get_ep_all_individual, get_ep_obelisks, get_ep_easy, get_ep_no_eclipse, \ if TYPE_CHECKING:
get_ep_no_caves, get_ep_no_mountain, get_ep_no_videos from . import WitnessWorld
from .Options import is_option_enabled, get_option_value, the_witness_options
class WitnessPlayerLogic: class WitnessPlayerLogic:
"""WITNESS LOGIC CLASS""" """WITNESS LOGIC CLASS"""
def reduce_req_within_region(self, panel_hex): @lru_cache(maxsize=None)
def reduce_req_within_region(self, panel_hex: str) -> FrozenSet[FrozenSet[str]]:
""" """
Panels in this game often only turn on when other panels are solved. Panels in this game often only turn on when other panels are solved.
Those other panels may have different item requirements. Those other panels may have different item requirements.
@ -40,14 +40,14 @@ class WitnessPlayerLogic:
Panels outside of the same region will still be checked manually. Panels outside of the same region will still be checked manually.
""" """
if panel_hex in self.COMPLETELY_DISABLED_CHECKS or panel_hex in self.PRECOMPLETED_LOCATIONS: if panel_hex in self.COMPLETELY_DISABLED_ENTITIES or panel_hex in self.IRRELEVANT_BUT_NOT_DISABLED_ENTITIES:
return frozenset() return frozenset()
check_obj = self.REFERENCE_LOGIC.CHECKS_BY_HEX[panel_hex] entity_obj = self.REFERENCE_LOGIC.ENTITIES_BY_HEX[panel_hex]
these_items = frozenset({frozenset()}) these_items = frozenset({frozenset()})
if check_obj["id"]: if entity_obj["id"]:
these_items = self.DEPENDENT_REQUIREMENTS_BY_HEX[panel_hex]["items"] these_items = self.DEPENDENT_REQUIREMENTS_BY_HEX[panel_hex]["items"]
these_items = frozenset({ these_items = frozenset({
@ -58,6 +58,8 @@ class WitnessPlayerLogic:
for subset in these_items: for subset in these_items:
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI.update(subset) self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI.update(subset)
these_panels = self.DEPENDENT_REQUIREMENTS_BY_HEX[panel_hex]["panels"]
if panel_hex in self.DOOR_ITEMS_BY_ID: if panel_hex in self.DOOR_ITEMS_BY_ID:
door_items = frozenset({frozenset([item]) for item in self.DOOR_ITEMS_BY_ID[panel_hex]}) door_items = frozenset({frozenset([item]) for item in self.DOOR_ITEMS_BY_ID[panel_hex]})
@ -68,14 +70,21 @@ class WitnessPlayerLogic:
for items_option in these_items: for items_option in these_items:
all_options.add(items_option.union(dependentItem)) all_options.add(items_option.union(dependentItem))
# 0x28A0D depends on another entity for *non-power* reasons -> This dependency needs to be preserved...
if panel_hex != "0x28A0D": if panel_hex != "0x28A0D":
return frozenset(all_options) return frozenset(all_options)
else: # 0x28A0D depends on another entity for *non-power* reasons -> This dependency needs to be preserved # ...except in Expert, where that dependency doesn't exist, but now there *is* a power dependency.
these_items = all_options # In the future, it would be wise to make a distinction between "power dependencies" and other dependencies.
if any("0x28998" in option for option in these_panels):
return frozenset(all_options)
these_panels = self.DEPENDENT_REQUIREMENTS_BY_HEX[panel_hex]["panels"] these_items = all_options
these_panels = frozenset({panels - self.PRECOMPLETED_LOCATIONS for panels in these_panels}) disabled_eps = {eHex for eHex in self.COMPLETELY_DISABLED_ENTITIES
if self.REFERENCE_LOGIC.ENTITIES_BY_HEX[eHex]["entityType"] == "EP"}
these_panels = frozenset({panels - disabled_eps
for panels in these_panels})
if these_panels == frozenset({frozenset()}): if these_panels == frozenset({frozenset()}):
return these_items return these_items
@ -85,40 +94,30 @@ class WitnessPlayerLogic:
for option in these_panels: for option in these_panels:
dependent_items_for_option = frozenset({frozenset()}) dependent_items_for_option = frozenset({frozenset()})
for option_panel in option: for option_entity in option:
dep_obj = self.REFERENCE_LOGIC.CHECKS_BY_HEX.get(option_panel) dep_obj = self.REFERENCE_LOGIC.ENTITIES_BY_HEX.get(option_entity)
if option_panel in self.COMPLETELY_DISABLED_CHECKS: if option_entity in self.EVENT_NAMES_BY_HEX:
new_items = frozenset() new_items = frozenset({frozenset([option_entity])})
elif option_panel in {"7 Lasers", "11 Lasers", "PP2 Weirdness", "Theater to Tunnels"}: elif option_entity in {"7 Lasers", "11 Lasers", "PP2 Weirdness", "Theater to Tunnels"}:
new_items = frozenset({frozenset([option_panel])}) new_items = frozenset({frozenset([option_entity])})
# If a panel turns on when a panel in a different region turns on,
# the latter panel will be an "event panel", unless it ends up being
# a location itself. This prevents generation failures.
elif dep_obj["region"]["name"] != check_obj["region"]["name"]:
new_items = frozenset({frozenset([option_panel])})
self.EVENT_PANELS_FROM_PANELS.add(option_panel)
elif option_panel in self.ALWAYS_EVENT_NAMES_BY_HEX.keys():
new_items = frozenset({frozenset([option_panel])})
self.EVENT_PANELS_FROM_PANELS.add(option_panel)
else: else:
new_items = self.reduce_req_within_region(option_panel) new_items = self.reduce_req_within_region(option_entity)
if dep_obj["region"] and entity_obj["region"] != dep_obj["region"]:
new_items = frozenset(
frozenset(possibility | {dep_obj["region"]["name"]})
for possibility in new_items
)
updated_items = set() dependent_items_for_option = dnf_and([dependent_items_for_option, new_items])
for items_option in dependent_items_for_option:
for items_option2 in new_items:
updated_items.add(items_option.union(items_option2))
dependent_items_for_option = updated_items
for items_option in these_items: for items_option in these_items:
for dependentItem in dependent_items_for_option: for dependentItem in dependent_items_for_option:
all_options.add(items_option.union(dependentItem)) all_options.add(items_option.union(dependentItem))
return frozenset(all_options) return dnf_remove_redundancies(frozenset(all_options))
def make_single_adjustment(self, adj_type, line): def make_single_adjustment(self, adj_type: str, line: str):
from . import StaticWitnessItems from . import StaticWitnessItems
"""Makes a single logic adjustment based on additional logic file""" """Makes a single logic adjustment based on additional logic file"""
@ -148,9 +147,9 @@ class WitnessPlayerLogic:
self.THEORETICAL_ITEMS.discard(item_name) self.THEORETICAL_ITEMS.discard(item_name)
if isinstance(StaticWitnessLogic.all_items[item_name], ProgressiveItemDefinition): if isinstance(StaticWitnessLogic.all_items[item_name], ProgressiveItemDefinition):
self.THEORETICAL_ITEMS_NO_MULTI\ self.THEORETICAL_ITEMS_NO_MULTI.difference_update(
.difference_update(cast(ProgressiveItemDefinition, cast(ProgressiveItemDefinition, StaticWitnessLogic.all_items[item_name]).child_item_names
StaticWitnessLogic.all_items[item_name]).child_item_names) )
else: else:
self.THEORETICAL_ITEMS_NO_MULTI.discard(item_name) self.THEORETICAL_ITEMS_NO_MULTI.discard(item_name)
@ -165,25 +164,15 @@ class WitnessPlayerLogic:
if adj_type == "Event Items": if adj_type == "Event Items":
line_split = line.split(" - ") line_split = line.split(" - ")
new_event_name = line_split[0]
hex_set = line_split[1].split(",") hex_set = line_split[1].split(",")
for entity, event_name in self.EVENT_NAMES_BY_HEX.items():
if event_name == new_event_name:
self.DONT_MAKE_EVENTS.add(entity)
for hex_code in hex_set: for hex_code in hex_set:
self.ALWAYS_EVENT_NAMES_BY_HEX[hex_code] = line_split[0] self.EVENT_NAMES_BY_HEX[hex_code] = new_event_name
"""
Should probably do this differently...
Events right now depend on a panel.
That seems bad.
"""
to_remove = set()
for hex_code, event_name in self.ALWAYS_EVENT_NAMES_BY_HEX.items():
if hex_code not in hex_set and event_name == line_split[0]:
to_remove.add(hex_code)
for remove in to_remove:
del self.ALWAYS_EVENT_NAMES_BY_HEX[remove]
return return
@ -196,9 +185,10 @@ class WitnessPlayerLogic:
if len(line_split) > 2: if len(line_split) > 2:
required_items = parse_lambda(line_split[2]) required_items = parse_lambda(line_split[2])
items_actually_in_the_game = [item_name for item_name, item_definition items_actually_in_the_game = [
in StaticWitnessLogic.all_items.items() item_name for item_name, item_definition in StaticWitnessLogic.all_items.items()
if item_definition.category is ItemCategory.SYMBOL] if item_definition.category is ItemCategory.SYMBOL
]
required_items = frozenset( required_items = frozenset(
subset.intersection(items_actually_in_the_game) subset.intersection(items_actually_in_the_game)
for subset in required_items for subset in required_items
@ -213,116 +203,204 @@ class WitnessPlayerLogic:
if adj_type == "Disabled Locations": if adj_type == "Disabled Locations":
panel_hex = line[:7] panel_hex = line[:7]
self.COMPLETELY_DISABLED_CHECKS.add(panel_hex) self.COMPLETELY_DISABLED_ENTITIES.add(panel_hex)
return
if adj_type == "Irrelevant Locations":
panel_hex = line[:7]
self.IRRELEVANT_BUT_NOT_DISABLED_ENTITIES.add(panel_hex)
return return
if adj_type == "Region Changes": if adj_type == "Region Changes":
new_region_and_options = define_new_region(line + ":") new_region_and_options = define_new_region(line + ":")
self.CONNECTIONS_BY_REGION_NAME[new_region_and_options[0]["name"]] = new_region_and_options[1] self.CONNECTIONS_BY_REGION_NAME[new_region_and_options[0]["name"]] = new_region_and_options[1]
return return
if adj_type == "New Connections":
line_split = line.split(" - ")
source_region = line_split[0]
target_region = line_split[1]
panel_set_string = line_split[2]
for connection in self.CONNECTIONS_BY_REGION_NAME[source_region]:
if connection[0] == target_region:
self.CONNECTIONS_BY_REGION_NAME[source_region].remove(connection)
if panel_set_string == "TrueOneWay":
self.CONNECTIONS_BY_REGION_NAME[source_region].add(
(target_region, frozenset({frozenset(["TrueOneWay"])}))
)
else:
new_lambda = connection[1] | parse_lambda(panel_set_string)
self.CONNECTIONS_BY_REGION_NAME[source_region].add((target_region, new_lambda))
break
else: # Execute if loop did not break. TIL this is a thing you can do!
new_conn = (target_region, parse_lambda(panel_set_string))
self.CONNECTIONS_BY_REGION_NAME[source_region].add(new_conn)
if adj_type == "Added Locations": if adj_type == "Added Locations":
if "0x" in line: if "0x" in line:
line = StaticWitnessLogic.CHECKS_BY_HEX[line]["checkName"] line = self.REFERENCE_LOGIC.ENTITIES_BY_HEX[line]["checkName"]
self.ADDED_CHECKS.add(line) self.ADDED_CHECKS.add(line)
if adj_type == "Precompleted Locations": def make_options_adjustments(self, world: "WitnessWorld"):
self.PRECOMPLETED_LOCATIONS.add(line)
def make_options_adjustments(self, world, player):
"""Makes logic adjustments based on options""" """Makes logic adjustments based on options"""
adjustment_linesets_in_order = [] adjustment_linesets_in_order = []
if get_option_value(world, player, "victory_condition") == 0: # Postgame
doors = world.options.shuffle_doors >= 2
lasers = world.options.shuffle_lasers
early_caves = world.options.early_caves > 0
victory = world.options.victory_condition
mnt_lasers = world.options.mountain_lasers
chal_lasers = world.options.challenge_lasers
mountain_enterable_from_top = victory == 0 or victory == 1 or (victory == 3 and chal_lasers > mnt_lasers)
if not world.options.shuffle_postgame:
if not (early_caves or doors):
adjustment_linesets_in_order.append(get_caves_exclusion_list())
if not victory == 1:
adjustment_linesets_in_order.append(get_path_to_challenge_exclusion_list())
adjustment_linesets_in_order.append(get_challenge_vault_box_exclusion_list())
adjustment_linesets_in_order.append(get_beyond_challenge_exclusion_list())
if not ((doors or early_caves) and (victory == 0 or (victory == 2 and mnt_lasers > chal_lasers))):
adjustment_linesets_in_order.append(get_beyond_challenge_exclusion_list())
if not victory == 1:
adjustment_linesets_in_order.append(get_challenge_vault_box_exclusion_list())
if not (doors or mountain_enterable_from_top):
adjustment_linesets_in_order.append(get_mountain_lower_exclusion_list())
if not mountain_enterable_from_top:
adjustment_linesets_in_order.append(get_mountain_upper_exclusion_list())
if not ((victory == 0 and doors) or victory == 1 or (victory == 2 and mnt_lasers > chal_lasers and doors)):
if doors:
adjustment_linesets_in_order.append(get_bottom_floor_discard_exclusion_list())
else:
adjustment_linesets_in_order.append(get_bottom_floor_discard_nondoors_exclusion_list())
if victory == 2 and chal_lasers >= mnt_lasers:
adjustment_linesets_in_order.append(["Disabled Locations:", "0xFFF00 (Mountain Box Long)"])
# Exclude Discards / Vaults
if not world.options.shuffle_discarded_panels:
# In disable_non_randomized, the discards are needed for alternate activation triggers, UNLESS both
# (remote) doors and lasers are shuffled.
if not world.options.disable_non_randomized_puzzles or (doors and lasers):
adjustment_linesets_in_order.append(get_discard_exclusion_list())
if doors:
adjustment_linesets_in_order.append(get_bottom_floor_discard_exclusion_list())
if not world.options.shuffle_vault_boxes:
adjustment_linesets_in_order.append(get_vault_exclusion_list())
if not victory == 1:
adjustment_linesets_in_order.append(get_challenge_vault_box_exclusion_list())
# Victory Condition
if victory == 0:
self.VICTORY_LOCATION = "0x3D9A9" self.VICTORY_LOCATION = "0x3D9A9"
elif get_option_value(world, player, "victory_condition") == 1: elif victory == 1:
self.VICTORY_LOCATION = "0x0356B" self.VICTORY_LOCATION = "0x0356B"
elif get_option_value(world, player, "victory_condition") == 2: elif victory == 2:
self.VICTORY_LOCATION = "0x09F7F" self.VICTORY_LOCATION = "0x09F7F"
elif get_option_value(world, player, "victory_condition") == 3: elif victory == 3:
self.VICTORY_LOCATION = "0xFFF00" self.VICTORY_LOCATION = "0xFFF00"
if get_option_value(world, player, "challenge_lasers") <= 7: if chal_lasers <= 7:
adjustment_linesets_in_order.append([ adjustment_linesets_in_order.append([
"Requirement Changes:", "Requirement Changes:",
"0xFFF00 - 11 Lasers - True", "0xFFF00 - 11 Lasers - True",
]) ])
if is_option_enabled(world, player, "disable_non_randomized_puzzles"): if world.options.disable_non_randomized_puzzles:
adjustment_linesets_in_order.append(get_disable_unrandomized_list()) adjustment_linesets_in_order.append(get_disable_unrandomized_list())
if is_option_enabled(world, player, "shuffle_symbols") or "shuffle_symbols" not in the_witness_options.keys(): if world.options.shuffle_symbols:
adjustment_linesets_in_order.append(get_symbol_shuffle_list()) adjustment_linesets_in_order.append(get_symbol_shuffle_list())
if get_option_value(world, player, "EP_difficulty") == 0: if world.options.EP_difficulty == 0:
adjustment_linesets_in_order.append(get_ep_easy()) adjustment_linesets_in_order.append(get_ep_easy())
elif get_option_value(world, player, "EP_difficulty") == 1: elif world.options.EP_difficulty == 1:
adjustment_linesets_in_order.append(get_ep_no_eclipse()) adjustment_linesets_in_order.append(get_ep_no_eclipse())
if not is_option_enabled(world, player, "shuffle_vault_boxes"): if world.options.door_groupings == 1:
adjustment_linesets_in_order.append(get_ep_no_videos()) if world.options.shuffle_doors == 1:
adjustment_linesets_in_order.append(get_simple_panels())
elif world.options.shuffle_doors == 2:
adjustment_linesets_in_order.append(get_simple_doors())
elif world.options.shuffle_doors == 3:
adjustment_linesets_in_order.append(get_simple_doors())
adjustment_linesets_in_order.append(get_simple_additional_panels())
else:
if world.options.shuffle_doors == 1:
adjustment_linesets_in_order.append(get_complex_door_panels())
adjustment_linesets_in_order.append(get_complex_additional_panels())
elif world.options.shuffle_doors == 2:
adjustment_linesets_in_order.append(get_complex_doors())
elif world.options.shuffle_doors == 3:
adjustment_linesets_in_order.append(get_complex_doors())
adjustment_linesets_in_order.append(get_complex_additional_panels())
doors = get_option_value(world, player, "shuffle_doors") >= 2 if world.options.shuffle_boat:
earlyutm = is_option_enabled(world, player, "early_secret_area") adjustment_linesets_in_order.append(get_boat())
victory = get_option_value(world, player, "victory_condition")
mount_lasers = get_option_value(world, player, "mountain_lasers")
chal_lasers = get_option_value(world, player, "challenge_lasers")
excluse_postgame = not is_option_enabled(world, player, "shuffle_postgame") if world.options.early_caves == 2:
adjustment_linesets_in_order.append(get_early_caves_start_list())
if excluse_postgame and not (earlyutm or doors): if world.options.early_caves == 1 and not doors:
adjustment_linesets_in_order.append(get_ep_no_caves()) adjustment_linesets_in_order.append(get_early_caves_list())
mountain_enterable_from_top = victory == 0 or victory == 1 or (victory == 3 and chal_lasers > mount_lasers) if world.options.elevators_come_to_you:
if excluse_postgame and not mountain_enterable_from_top: adjustment_linesets_in_order.append(get_elevators_come_to_you())
adjustment_linesets_in_order.append(get_ep_no_mountain())
if get_option_value(world, player, "shuffle_doors") == 1:
adjustment_linesets_in_order.append(get_door_panel_shuffle_list())
if get_option_value(world, player, "shuffle_doors") == 2:
adjustment_linesets_in_order.append(get_doors_simple_list())
if get_option_value(world, player, "shuffle_doors") == 3:
adjustment_linesets_in_order.append(get_doors_complex_list())
if get_option_value(world, player, "shuffle_doors") == 4:
adjustment_linesets_in_order.append(get_doors_max_list())
if is_option_enabled(world, player, "early_secret_area"):
adjustment_linesets_in_order.append(get_early_utm_list())
for item in self.YAML_ADDED_ITEMS: for item in self.YAML_ADDED_ITEMS:
adjustment_linesets_in_order.append(["Items:", item]) adjustment_linesets_in_order.append(["Items:", item])
if is_option_enabled(world, player, "shuffle_lasers"): if lasers:
adjustment_linesets_in_order.append(get_laser_shuffle()) adjustment_linesets_in_order.append(get_laser_shuffle())
if get_option_value(world, player, "shuffle_EPs") == 0: # No EP Shuffle if world.options.shuffle_EPs:
adjustment_linesets_in_order.append(["Disabled Locations:"] + get_ep_all_individual()[1:]) ep_gen = ((ep_hex, ep_obj) for (ep_hex, ep_obj) in self.REFERENCE_LOGIC.ENTITIES_BY_HEX.items()
if ep_obj["entityType"] == "EP")
for ep_hex, ep_obj in ep_gen:
obelisk = self.REFERENCE_LOGIC.ENTITIES_BY_HEX[self.REFERENCE_LOGIC.EP_TO_OBELISK_SIDE[ep_hex]]
obelisk_name = obelisk["checkName"]
ep_name = self.REFERENCE_LOGIC.ENTITIES_BY_HEX[ep_hex]["checkName"]
self.EVENT_NAMES_BY_HEX[ep_hex] = f"{obelisk_name} - {ep_name}"
else:
adjustment_linesets_in_order.append(["Disabled Locations:"] + get_ep_obelisks()[1:]) adjustment_linesets_in_order.append(["Disabled Locations:"] + get_ep_obelisks()[1:])
elif get_option_value(world, player, "shuffle_EPs") == 1: # Individual EPs if world.options.shuffle_EPs == 0:
adjustment_linesets_in_order.append(["Disabled Locations:"] + get_ep_obelisks()[1:]) adjustment_linesets_in_order.append(["Irrelevant Locations:"] + get_ep_all_individual()[1:])
yaml_disabled_eps = [] yaml_disabled_eps = []
for yaml_disabled_location in self.YAML_DISABLED_LOCATIONS: for yaml_disabled_location in self.YAML_DISABLED_LOCATIONS:
if yaml_disabled_location not in StaticWitnessLogic.CHECKS_BY_NAME: if yaml_disabled_location not in self.REFERENCE_LOGIC.ENTITIES_BY_NAME:
continue continue
loc_obj = StaticWitnessLogic.CHECKS_BY_NAME[yaml_disabled_location] loc_obj = self.REFERENCE_LOGIC.ENTITIES_BY_NAME[yaml_disabled_location]
if loc_obj["panelType"] == "EP" and get_option_value(world, player, "shuffle_EPs") == 2: if loc_obj["entityType"] == "EP" and world.options.shuffle_EPs != 0:
yaml_disabled_eps.append(loc_obj["checkHex"]) yaml_disabled_eps.append(loc_obj["entity_hex"])
if loc_obj["panelType"] in {"EP", "General"}: if loc_obj["entityType"] in {"EP", "General", "Vault", "Discard"}:
self.EXCLUDED_LOCATIONS.add(loc_obj["checkHex"]) self.EXCLUDED_LOCATIONS.add(loc_obj["entity_hex"])
adjustment_linesets_in_order.append(["Precompleted Locations:"] + yaml_disabled_eps) adjustment_linesets_in_order.append(["Disabled Locations:"] + yaml_disabled_eps)
for adjustment_lineset in adjustment_linesets_in_order: for adjustment_lineset in adjustment_linesets_in_order:
current_adjustment_type = None current_adjustment_type = None
@ -337,15 +415,19 @@ class WitnessPlayerLogic:
self.make_single_adjustment(current_adjustment_type, line) self.make_single_adjustment(current_adjustment_type, line)
for entity_id in self.COMPLETELY_DISABLED_ENTITIES:
if entity_id in self.DOOR_ITEMS_BY_ID:
del self.DOOR_ITEMS_BY_ID[entity_id]
def make_dependency_reduced_checklist(self): def make_dependency_reduced_checklist(self):
""" """
Turns dependent check set into semi-independent check set Turns dependent check set into semi-independent check set
""" """
for check_hex in self.DEPENDENT_REQUIREMENTS_BY_HEX.keys(): for entity_hex in self.DEPENDENT_REQUIREMENTS_BY_HEX.keys():
indep_requirement = self.reduce_req_within_region(check_hex) indep_requirement = self.reduce_req_within_region(entity_hex)
self.REQUIREMENTS_BY_HEX[check_hex] = indep_requirement self.REQUIREMENTS_BY_HEX[entity_hex] = indep_requirement
for item in self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI: for item in self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI:
if item not in self.THEORETICAL_ITEMS: if item not in self.THEORETICAL_ITEMS:
@ -360,71 +442,76 @@ class WitnessPlayerLogic:
else: else:
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME.add(item) self.PROG_ITEMS_ACTUALLY_IN_THE_GAME.add(item)
def make_event_item_pair(self, panel): for region, connections in self.CONNECTIONS_BY_REGION_NAME.items():
new_connections = []
for connection in connections:
overall_requirement = frozenset()
for option in connection[1]:
individual_entity_requirements = []
for entity in option:
if entity in self.EVENT_NAMES_BY_HEX or entity not in self.REFERENCE_LOGIC.ENTITIES_BY_HEX:
individual_entity_requirements.append(frozenset({frozenset({entity})}))
else:
entity_req = self.reduce_req_within_region(entity)
if self.REFERENCE_LOGIC.ENTITIES_BY_HEX[entity]["region"]:
region_name = self.REFERENCE_LOGIC.ENTITIES_BY_HEX[entity]["region"]["name"]
entity_req = dnf_and([entity_req, frozenset({frozenset({region_name})})])
individual_entity_requirements.append(entity_req)
overall_requirement |= dnf_and(individual_entity_requirements)
new_connections.append((connection[0], overall_requirement))
self.CONNECTIONS_BY_REGION_NAME[region] = new_connections
def make_event_item_pair(self, panel: str):
""" """
Makes a pair of an event panel and its event item Makes a pair of an event panel and its event item
""" """
action = " Opened" if StaticWitnessLogic.CHECKS_BY_HEX[panel]["panelType"] == "Door" else " Solved" action = " Opened" if self.REFERENCE_LOGIC.ENTITIES_BY_HEX[panel]["entityType"] == "Door" else " Solved"
name = StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] + action name = self.REFERENCE_LOGIC.ENTITIES_BY_HEX[panel]["checkName"] + action
if panel not in self.EVENT_ITEM_NAMES: if panel not in self.EVENT_NAMES_BY_HEX:
if StaticWitnessLogic.CHECKS_BY_HEX[panel]["panelType"] == "EP": warning("Panel \"" + name + "\" does not have an associated event name.")
obelisk = StaticWitnessLogic.CHECKS_BY_HEX[StaticWitnessLogic.EP_TO_OBELISK_SIDE[panel]]["checkName"] self.EVENT_NAMES_BY_HEX[panel] = name + " Event"
pair = (name, self.EVENT_NAMES_BY_HEX[panel])
self.EVENT_ITEM_NAMES[panel] = obelisk + " - " + StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"]
else:
warning("Panel \"" + name + "\" does not have an associated event name.")
self.EVENT_ITEM_NAMES[panel] = name + " Event"
pair = (name, self.EVENT_ITEM_NAMES[panel])
return pair return pair
def make_event_panel_lists(self): def make_event_panel_lists(self):
""" self.EVENT_NAMES_BY_HEX[self.VICTORY_LOCATION] = "Victory"
Special event panel data structures
"""
self.ALWAYS_EVENT_NAMES_BY_HEX[self.VICTORY_LOCATION] = "Victory" for event_hex, event_name in self.EVENT_NAMES_BY_HEX.items():
if event_hex in self.COMPLETELY_DISABLED_ENTITIES:
for region_name, connections in self.CONNECTIONS_BY_REGION_NAME.items(): continue
for connection in connections: self.EVENT_PANELS.add(event_hex)
for panel_req in connection[1]:
for panel in panel_req:
if panel == "TrueOneWay":
continue
if self.REFERENCE_LOGIC.CHECKS_BY_HEX[panel]["region"]["name"] != region_name:
self.EVENT_PANELS_FROM_REGIONS.add(panel)
self.EVENT_PANELS.update(self.EVENT_PANELS_FROM_PANELS)
self.EVENT_PANELS.update(self.EVENT_PANELS_FROM_REGIONS)
for always_hex, always_item in self.ALWAYS_EVENT_NAMES_BY_HEX.items():
self.ALWAYS_EVENT_HEX_CODES.add(always_hex)
self.EVENT_PANELS.add(always_hex)
self.EVENT_ITEM_NAMES[always_hex] = always_item
for panel in self.EVENT_PANELS: for panel in self.EVENT_PANELS:
pair = self.make_event_item_pair(panel) pair = self.make_event_item_pair(panel)
self.EVENT_ITEM_PAIRS[pair[0]] = pair[1] self.EVENT_ITEM_PAIRS[pair[0]] = pair[1]
def __init__(self, world: MultiWorld, player: int, disabled_locations: Set[str], start_inv: Dict[str, int]): def __init__(self, world: "WitnessWorld", disabled_locations: Set[str], start_inv: Dict[str, int]):
self.YAML_DISABLED_LOCATIONS = disabled_locations self.YAML_DISABLED_LOCATIONS = disabled_locations
self.YAML_ADDED_ITEMS = start_inv self.YAML_ADDED_ITEMS = start_inv
self.EVENT_PANELS_FROM_PANELS = set() self.EVENT_PANELS_FROM_PANELS = set()
self.EVENT_PANELS_FROM_REGIONS = set() self.EVENT_PANELS_FROM_REGIONS = set()
self.IRRELEVANT_BUT_NOT_DISABLED_ENTITIES = set()
self.THEORETICAL_ITEMS = set() self.THEORETICAL_ITEMS = set()
self.THEORETICAL_ITEMS_NO_MULTI = set() self.THEORETICAL_ITEMS_NO_MULTI = set()
self.MULTI_AMOUNTS = dict() self.MULTI_AMOUNTS = defaultdict(lambda: 1)
self.MULTI_LISTS = dict() self.MULTI_LISTS = dict()
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI = set() self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI = set()
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME = set() self.PROG_ITEMS_ACTUALLY_IN_THE_GAME = set()
self.DOOR_ITEMS_BY_ID: Dict[str, List[int]] = {} self.DOOR_ITEMS_BY_ID: Dict[str, List[str]] = {}
self.STARTING_INVENTORY = set() self.STARTING_INVENTORY = set()
self.DIFFICULTY = get_option_value(world, player, "puzzle_randomization") self.DIFFICULTY = world.options.puzzle_randomization.value
if self.DIFFICULTY == 0: if self.DIFFICULTY == 0:
self.REFERENCE_LOGIC = StaticWitnessLogic.sigma_normal self.REFERENCE_LOGIC = StaticWitnessLogic.sigma_normal
@ -441,106 +528,30 @@ class WitnessPlayerLogic:
# At the end, we will have EVENT_ITEM_PAIRS for all the necessary ones. # At the end, we will have EVENT_ITEM_PAIRS for all the necessary ones.
self.EVENT_PANELS = set() self.EVENT_PANELS = set()
self.EVENT_ITEM_PAIRS = dict() self.EVENT_ITEM_PAIRS = dict()
self.ALWAYS_EVENT_HEX_CODES = set() self.DONT_MAKE_EVENTS = set()
self.COMPLETELY_DISABLED_CHECKS = set() self.COMPLETELY_DISABLED_ENTITIES = set()
self.PRECOMPLETED_LOCATIONS = set() self.PRECOMPLETED_LOCATIONS = set()
self.EXCLUDED_LOCATIONS = set() self.EXCLUDED_LOCATIONS = set()
self.ADDED_CHECKS = set() self.ADDED_CHECKS = set()
self.VICTORY_LOCATION = "0x0356B" self.VICTORY_LOCATION = "0x0356B"
self.EVENT_ITEM_NAMES = {
"0x09D9B": "Monastery Shutters Open",
"0x193A6": "Monastery Laser Panel Activates",
"0x00037": "Monastery Branch Panels Activate",
"0x0A079": "Access to Bunker Laser",
"0x0A3B5": "Door to Tutorial Discard Opens",
"0x00139": "Keep Hedges 1 Knowledge",
"0x019DC": "Keep Hedges 2 Knowledge",
"0x019E7": "Keep Hedges 3 Knowledge",
"0x01A0F": "Keep Hedges 4 Knowledge",
"0x033EA": "Pressure Plates 1 Knowledge",
"0x01BE9": "Pressure Plates 2 Knowledge",
"0x01CD3": "Pressure Plates 3 Knowledge",
"0x01D3F": "Pressure Plates 4 Knowledge",
"0x09F7F": "Mountain Access",
"0x0367C": "Quarry Laser Stoneworks Requirement Met",
"0x009A1": "Swamp Between Bridges Far 1 Activates",
"0x00006": "Swamp Cyan Water Drains",
"0x00990": "Swamp Between Bridges Near Row 1 Activates",
"0x0A8DC": "Intro 6 Activates",
"0x0000A": "Swamp Beyond Rotating Bridge 1 Access",
"0x09E86": "Mountain Floor 2 Blue Bridge Access",
"0x09ED8": "Mountain Floor 2 Yellow Bridge Access",
"0x0A3D0": "Quarry Laser Boathouse Requirement Met",
"0x00596": "Swamp Red Water Drains",
"0x00E3A": "Swamp Purple Water Drains",
"0x0343A": "Door to Symmetry Island Powers On",
"0xFFF00": "Mountain Bottom Floor Discard Turns On",
"0x17CA6": "All Boat Panels Turn On",
"0x17CDF": "All Boat Panels Turn On",
"0x09DB8": "All Boat Panels Turn On",
"0x17C95": "All Boat Panels Turn On",
"0x0A054": "Couch EP solvable",
"0x03BB0": "Town Church Lattice Vision From Outside",
"0x28AC1": "Town Wooden Rooftop Turns On",
"0x28A69": "Town Tower 1st Door Opens",
"0x28ACC": "Town Tower 2nd Door Opens",
"0x28AD9": "Town Tower 3rd Door Opens",
"0x28B39": "Town Tower 4th Door Opens",
"0x03675": "Quarry Stoneworks Ramp Activation From Above",
"0x03679": "Quarry Stoneworks Lift Lowering While Standing On It",
"0x2FAF6": "Tutorial Gate Secret Solution Knowledge",
"0x079DF": "Town Tall Hexagonal Turns On",
"0x17DA2": "Right Orange Bridge Fully Extended",
"0x19B24": "Shadows Intro Patterns Visible",
"0x2700B": "Open Door to Treehouse Laser House",
"0x00055": "Orchard Apple Trees 4 Turns On",
"0x17DDB": "Left Orange Bridge Fully Extended",
"0x03535": "Shipwreck Video Pattern Knowledge",
"0x03542": "Mountain Video Pattern Knowledge",
"0x0339E": "Desert Video Pattern Knowledge",
"0x03481": "Tutorial Video Pattern Knowledge",
"0x03702": "Jungle Video Pattern Knowledge",
"0x0356B": "Challenge Video Pattern Knowledge",
"0x0A15F": "Desert Laser Panel Shutters Open (1)",
"0x012D7": "Desert Laser Panel Shutters Open (2)",
"0x03613": "Treehouse Orange Bridge 13 Turns On",
"0x17DEC": "Treehouse Laser House Access Requirement",
"0x03C08": "Town Church Entry Opens",
"0x17D02": "Windmill Blades Spinning",
"0x0A0C9": "Cargo Box EP completable",
"0x09E39": "Pink Light Bridge Extended",
"0x17CC4": "Rails EP available",
"0x2896A": "Bridge Underside EP available",
"0x00064": "First Tunnel EP visible",
"0x03553": "Tutorial Video EPs availble",
"0x17C79": "Bunker Door EP available",
"0x275FF": "Stoneworks Light EPs available",
"0x17E2B": "Remaining Purple Sand EPs available",
"0x03852": "Ramp EPs requirement",
"0x334D8": "RGB panels & EPs solvable",
"0x03750": "Left Garden EP available",
"0x03C0C": "RGB Flowers EP requirement",
"0x01CD5": "Pressure Plates 3 EP requirement",
"0x3865F": "Ramp EPs access requirement",
}
self.ALWAYS_EVENT_NAMES_BY_HEX = { self.EVENT_NAMES_BY_HEX = {
"0x00509": "Symmetry Laser Activation", "0x00509": "+1 Laser (Symmetry Laser)",
"0x012FB": "Desert Laser Activation", "0x012FB": "+1 Laser (Desert Laser)",
"0x09F98": "Desert Laser Redirection", "0x09F98": "Desert Laser Redirection",
"0x01539": "Quarry Laser Activation", "0x01539": "+1 Laser (Quarry Laser)",
"0x181B3": "Shadows Laser Activation", "0x181B3": "+1 Laser (Shadows Laser)",
"0x014BB": "Keep Laser Activation", "0x014BB": "+1 Laser (Keep Laser)",
"0x17C65": "Monastery Laser Activation", "0x17C65": "+1 Laser (Monastery Laser)",
"0x032F9": "Town Laser Activation", "0x032F9": "+1 Laser (Town Laser)",
"0x00274": "Jungle Laser Activation", "0x00274": "+1 Laser (Jungle Laser)",
"0x0C2B2": "Bunker Laser Activation", "0x0C2B2": "+1 Laser (Bunker Laser)",
"0x00BF6": "Swamp Laser Activation", "0x00BF6": "+1 Laser (Swamp Laser)",
"0x028A4": "Treehouse Laser Activation", "0x028A4": "+1 Laser (Treehouse Laser)",
"0x09F7F": "Mountaintop Trap Door Turns On", "0x09F7F": "Mountain Entry",
"0x17C34": "Mountain Access", "0xFFF00": "Bottom Floor Discard Turns On",
} }
self.make_options_adjustments(world, player) self.make_options_adjustments(world)
self.make_dependency_reduced_checklist() self.make_dependency_reduced_checklist()
self.make_event_panel_lists() self.make_event_panel_lists()

View File

@ -2,13 +2,17 @@
Defines Region for The Witness, assigns locations to them, Defines Region for The Witness, assigns locations to them,
and connects them with the proper requirements and connects them with the proper requirements
""" """
from typing import FrozenSet, TYPE_CHECKING, Dict, Tuple, List
from BaseClasses import MultiWorld, Entrance from BaseClasses import Entrance, Region
from Utils import KeyedDefaultDict
from .static_logic import StaticWitnessLogic from .static_logic import StaticWitnessLogic
from .Options import get_option_value
from .locations import WitnessPlayerLocations, StaticWitnessLocations from .locations import WitnessPlayerLocations, StaticWitnessLocations
from .player_logic import WitnessPlayerLogic from .player_logic import WitnessPlayerLogic
if TYPE_CHECKING:
from . import WitnessWorld
class WitnessRegions: class WitnessRegions:
"""Class that defines Witness Regions""" """Class that defines Witness Regions"""
@ -16,62 +20,81 @@ class WitnessRegions:
locat = None locat = None
logic = None logic = None
def make_lambda(self, panel_hex_to_solve_set, world, player, player_logic): @staticmethod
def make_lambda(item_requirement: FrozenSet[FrozenSet[str]], world: "WitnessWorld"):
from .rules import _meets_item_requirements
""" """
Lambdas are made in a for loop, so the values have to be captured Lambdas are made in a for loop, so the values have to be captured
This function is for that purpose This function is for that purpose
""" """
return lambda state: state._witness_can_solve_panels( return _meets_item_requirements(item_requirement, world)
panel_hex_to_solve_set, world, player, player_logic, self.locat
)
def connect(self, world: MultiWorld, player: int, source: str, target: str, player_logic: WitnessPlayerLogic, def connect_if_possible(self, world: "WitnessWorld", source: str, target: str, req: FrozenSet[FrozenSet[str]],
panel_hex_to_solve_set=frozenset({frozenset()}), backwards: bool = False): regions_by_name: Dict[str, Region], backwards: bool = False):
""" """
connect two regions and set the corresponding requirement connect two regions and set the corresponding requirement
""" """
source_region = world.get_region(source, player)
target_region = world.get_region(target, player) # Remove any possibilities where being in the target region would be required anyway.
real_requirement = frozenset({option for option in req if target not in option})
# There are some connections that should only be done one way. If this is a backwards connection, check for that
if backwards:
real_requirement = frozenset({option for option in real_requirement if "TrueOneWay" not in option})
# Dissolve any "True" or "TrueOneWay"
real_requirement = frozenset({option - {"True", "TrueOneWay"} for option in real_requirement})
# If there is no way to actually use this connection, don't even bother making it.
if not real_requirement:
return
# We don't need to check for the accessibility of the source region.
final_requirement = frozenset({option - frozenset({source}) for option in real_requirement})
source_region = regions_by_name[source]
target_region = regions_by_name[target]
backwards = " Backwards" if backwards else "" backwards = " Backwards" if backwards else ""
connection_name = source + " to " + target + backwards
connection = Entrance( connection = Entrance(
player, world.player,
source + " to " + target + backwards, connection_name,
source_region source_region
) )
connection.access_rule = self.make_lambda(panel_hex_to_solve_set, world, player, player_logic) connection.access_rule = self.make_lambda(final_requirement, world)
source_region.exits.append(connection) source_region.exits.append(connection)
connection.connect(target_region) connection.connect(target_region)
def create_regions(self, world, player: int, player_logic: WitnessPlayerLogic): self.created_entrances[(source, target)].append(connection)
# Register any necessary indirect connections
mentioned_regions = {
single_unlock for option in final_requirement for single_unlock in option
if single_unlock in self.reference_logic.ALL_REGIONS_BY_NAME
}
for dependent_region in mentioned_regions:
world.multiworld.register_indirect_condition(regions_by_name[dependent_region], connection)
def create_regions(self, world: "WitnessWorld", player_logic: WitnessPlayerLogic):
""" """
Creates all the regions for The Witness Creates all the regions for The Witness
""" """
from . import create_region from . import create_region
world.regions += [
create_region(world, player, 'Menu', self.locat, None, ["The Splashscreen?"]),
]
difficulty = get_option_value(world, player, "puzzle_randomization")
if difficulty == 1:
reference_logic = StaticWitnessLogic.sigma_expert
elif difficulty == 0:
reference_logic = StaticWitnessLogic.sigma_normal
else:
reference_logic = StaticWitnessLogic.vanilla
all_locations = set() all_locations = set()
regions_by_name = dict()
for region_name, region in reference_logic.ALL_REGIONS_BY_NAME.items(): for region_name, region in self.reference_logic.ALL_REGIONS_BY_NAME.items():
locations_for_this_region = [ locations_for_this_region = [
reference_logic.CHECKS_BY_HEX[panel]["checkName"] for panel in region["panels"] self.reference_logic.ENTITIES_BY_HEX[panel]["checkName"] for panel in region["panels"]
if reference_logic.CHECKS_BY_HEX[panel]["checkName"] in self.locat.CHECK_LOCATION_TABLE if self.reference_logic.ENTITIES_BY_HEX[panel]["checkName"] in self.locat.CHECK_LOCATION_TABLE
] ]
locations_for_this_region += [ locations_for_this_region += [
StaticWitnessLocations.get_event_name(panel) for panel in region["panels"] StaticWitnessLocations.get_event_name(panel) for panel in region["panels"]
@ -80,34 +103,45 @@ class WitnessRegions:
all_locations = all_locations | set(locations_for_this_region) all_locations = all_locations | set(locations_for_this_region)
world.regions += [ new_region = create_region(world, region_name, self.locat, locations_for_this_region)
create_region(world, player, region_name, self.locat, locations_for_this_region)
]
for region_name, region in reference_logic.ALL_REGIONS_BY_NAME.items(): regions_by_name[region_name] = new_region
for region_name, region in self.reference_logic.ALL_REGIONS_BY_NAME.items():
for connection in player_logic.CONNECTIONS_BY_REGION_NAME[region_name]: for connection in player_logic.CONNECTIONS_BY_REGION_NAME[region_name]:
if connection[1] == frozenset({frozenset(["TrueOneWay"])}): self.connect_if_possible(world, region_name, connection[0], connection[1], regions_by_name)
self.connect(world, player, region_name, connection[0], player_logic, frozenset({frozenset()})) self.connect_if_possible(world, connection[0], region_name, connection[1], regions_by_name, True)
# find regions that are completely disconnected from the start node and remove them
regions_to_check = {"Menu"}
reachable_regions = {"Menu"}
while regions_to_check:
next_region = regions_to_check.pop()
region_obj = regions_by_name[next_region]
for exit in region_obj.exits:
target = exit.connected_region
if target.name in reachable_regions:
continue continue
backwards_connections = set() regions_to_check.add(target.name)
reachable_regions.add(target.name)
for subset in connection[1]: final_regions_list = [v for k, v in regions_by_name.items() if k in reachable_regions]
if all({panel in player_logic.DOOR_ITEMS_BY_ID for panel in subset}):
if all({reference_logic.CHECKS_BY_HEX[panel]["id"] is None for panel in subset}):
backwards_connections.add(subset)
if backwards_connections: world.multiworld.regions += final_regions_list
self.connect(
world, player, connection[0], region_name, player_logic,
frozenset(backwards_connections), True
)
self.connect(world, player, region_name, connection[0], player_logic, connection[1]) def __init__(self, locat: WitnessPlayerLocations, world: "WitnessWorld"):
difficulty = world.options.puzzle_randomization.value
world.get_entrance("The Splashscreen?", player).connect( if difficulty == 0:
world.get_region('First Hallway', player) self.reference_logic = StaticWitnessLogic.sigma_normal
) elif difficulty == 1:
self.reference_logic = StaticWitnessLogic.sigma_expert
elif difficulty == 2:
self.reference_logic = StaticWitnessLogic.vanilla
def __init__(self, locat: WitnessPlayerLocations):
self.locat = locat self.locat = locat
self.created_entrances: Dict[Tuple[str, str], List[Entrance]] = KeyedDefaultDict(lambda _: [])

View File

@ -3,223 +3,218 @@ Defines the rules by which locations can be accessed,
depending on the items received depending on the items received
""" """
# pylint: disable=E1101 from typing import TYPE_CHECKING, Callable, FrozenSet
from BaseClasses import MultiWorld from BaseClasses import CollectionState
from .player_logic import WitnessPlayerLogic from .player_logic import WitnessPlayerLogic
from .Options import is_option_enabled, get_option_value
from .locations import WitnessPlayerLocations from .locations import WitnessPlayerLocations
from . import StaticWitnessLogic from . import StaticWitnessLogic, WitnessRegions
from worlds.AutoWorld import LogicMixin
from worlds.generic.Rules import set_rule from worlds.generic.Rules import set_rule
if TYPE_CHECKING:
from . import WitnessWorld
class WitnessLogic(LogicMixin): laser_hexes = [
"0x028A4",
"0x00274",
"0x032F9",
"0x01539",
"0x181B3",
"0x0C2B2",
"0x00509",
"0x00BF6",
"0x014BB",
"0x012FB",
"0x17C65",
]
def _has_laser(laser_hex: str, world: "WitnessWorld", player: int) -> Callable[[CollectionState], bool]:
if laser_hex == "0x012FB":
return lambda state: (
_can_solve_panel(laser_hex, world, world.player, world.player_logic, world.locat)(state)
and state.has("Desert Laser Redirection", player)
)
else:
return _can_solve_panel(laser_hex, world, world.player, world.player_logic, world.locat)
def _has_lasers(amount: int, world: "WitnessWorld") -> Callable[[CollectionState], bool]:
laser_lambdas = []
for laser_hex in laser_hexes:
has_laser_lambda = _has_laser(laser_hex, world, world.player)
laser_lambdas.append(has_laser_lambda)
return lambda state: sum(laser_lambda(state) for laser_lambda in laser_lambdas) >= amount
def _can_solve_panel(panel: str, world: "WitnessWorld", player: int, player_logic: WitnessPlayerLogic,
locat: WitnessPlayerLocations) -> Callable[[CollectionState], bool]:
""" """
Logic macros that get reused Determines whether a panel can be solved
""" """
def _witness_has_lasers(self, world, player: int, amount: int) -> bool: panel_obj = player_logic.REFERENCE_LOGIC.ENTITIES_BY_HEX[panel]
regular_lasers = not is_option_enabled(world, player, "shuffle_lasers") entity_name = panel_obj["checkName"]
lasers = 0 if entity_name + " Solved" in locat.EVENT_LOCATION_TABLE:
return lambda state: state.has(player_logic.EVENT_ITEM_PAIRS[entity_name + " Solved"], player)
place_names = [ else:
"Symmetry", "Desert", "Town", "Monastery", "Keep", return make_lambda(panel, world)
"Quarry", "Treehouse", "Jungle", "Bunker", "Swamp", "Shadows"
]
for place in place_names:
has_laser = self.has(place + " Laser", player)
has_laser = has_laser or (regular_lasers and self.has(place + " Laser Activation", player))
if place == "Desert":
has_laser = has_laser and self.has("Desert Laser Redirection", player)
lasers += int(has_laser)
return lasers >= amount
def _witness_can_solve_panel(self, panel, world, player, player_logic: WitnessPlayerLogic, locat):
"""
Determines whether a panel can be solved
"""
panel_obj = StaticWitnessLogic.CHECKS_BY_HEX[panel]
check_name = panel_obj["checkName"]
if (check_name + " Solved" in locat.EVENT_LOCATION_TABLE
and not self.has(player_logic.EVENT_ITEM_PAIRS[check_name + " Solved"], player)):
return False
if (check_name + " Solved" not in locat.EVENT_LOCATION_TABLE
and not self._witness_meets_item_requirements(panel, world, player, player_logic, locat)):
return False
return True
def _witness_meets_item_requirements(self, panel, world, player, player_logic: WitnessPlayerLogic, locat):
"""
Checks whether item and panel requirements are met for
a panel
"""
panel_req = player_logic.REQUIREMENTS_BY_HEX[panel]
for option in panel_req:
if len(option) == 0:
return True
valid_option = True
for item in option:
if item == "7 Lasers":
laser_req = get_option_value(world, player, "mountain_lasers")
if not self._witness_has_lasers(world, player, laser_req):
valid_option = False
break
elif item == "11 Lasers":
laser_req = get_option_value(world, player, "challenge_lasers")
if not self._witness_has_lasers(world, player, laser_req):
valid_option = False
break
elif item == "PP2 Weirdness":
hedge_2_access = (
self.can_reach("Keep 2nd Maze to Keep", "Entrance", player)
or self.can_reach("Keep to Keep 2nd Maze", "Entrance", player)
)
hedge_3_access = (
self.can_reach("Keep 3rd Maze to Keep", "Entrance", player)
or self.can_reach("Keep 2nd Maze to Keep 3rd Maze", "Entrance", player)
and hedge_2_access
)
hedge_4_access = (
self.can_reach("Keep 4th Maze to Keep", "Entrance", player)
or self.can_reach("Keep 3rd Maze to Keep 4th Maze", "Entrance", player)
and hedge_3_access
)
hedge_access = (
self.can_reach("Keep 4th Maze to Keep Tower", "Entrance", player)
and self.can_reach("Keep", "Region", player)
and hedge_4_access
)
backwards_to_fourth = (
self.can_reach("Keep", "Region", player)
and self.can_reach("Keep 4th Pressure Plate to Keep Tower", "Entrance", player)
and (
self.can_reach("Keep Tower to Keep", "Entrance", player)
or hedge_access
)
)
shadows_shortcut = (
self.can_reach("Main Island", "Region", player)
and self.can_reach("Keep 4th Pressure Plate to Shadows", "Entrance", player)
)
backwards_access = (
self.can_reach("Keep 3rd Pressure Plate to Keep 4th Pressure Plate", "Entrance", player)
and (backwards_to_fourth or shadows_shortcut)
)
front_access = (
self.can_reach("Keep to Keep 2nd Pressure Plate", 'Entrance', player)
and self.can_reach("Keep", "Region", player)
)
if not (front_access and backwards_access):
valid_option = False
break
elif item == "Theater to Tunnels":
direct_access = (
self.can_reach("Tunnels to Windmill Interior", "Entrance", player)
and self.can_reach("Windmill Interior to Theater", "Entrance", player)
)
theater_from_town = (
self.can_reach("Town to Windmill Interior", "Entrance", player)
and self.can_reach("Windmill Interior to Theater", "Entrance", player)
or self.can_reach("Theater to Town", "Entrance", player)
)
tunnels_from_town = (
self.can_reach("Tunnels to Windmill Interior", "Entrance", player)
and self.can_reach("Town to Windmill Interior", "Entrance", player)
or self.can_reach("Tunnels to Town", "Entrance", player)
)
if not (direct_access or theater_from_town and tunnels_from_town):
valid_option = False
break
elif item in player_logic.EVENT_PANELS:
if not self._witness_can_solve_panel(item, world, player, player_logic, locat):
valid_option = False
break
elif not self.has(item, player):
# The player doesn't have the item. Check to see if it's part of a progressive item and, if so, the
# player has enough of that.
prog_item = StaticWitnessLogic.get_parent_progressive_item(item)
if prog_item is item or not self.has(prog_item, player, player_logic.MULTI_AMOUNTS[item]):
valid_option = False
break
if valid_option:
return True
return False
def _witness_can_solve_panels(self, panel_hex_to_solve_set, world, player, player_logic: WitnessPlayerLogic, locat):
"""
Checks whether a set of panels can be solved.
"""
for option in panel_hex_to_solve_set:
if len(option) == 0:
return True
valid_option = True
for panel in option:
if not self._witness_can_solve_panel(panel, world, player, player_logic, locat):
valid_option = False
break
if valid_option:
return True
return False
def make_lambda(check_hex, world, player, player_logic, locat): def _can_move_either_direction(state: CollectionState, source: str, target: str, regio: WitnessRegions) -> bool:
""" entrance_forward = regio.created_entrances[(source, target)]
Lambdas are created in a for loop so values need to be captured entrance_backward = regio.created_entrances[(source, target)]
"""
return lambda state: state._witness_meets_item_requirements( return (
check_hex, world, player, player_logic, locat any(entrance.can_reach(state) for entrance in entrance_forward)
or
any(entrance.can_reach(state) for entrance in entrance_backward)
) )
def set_rules(world: MultiWorld, player: int, player_logic: WitnessPlayerLogic, locat: WitnessPlayerLocations): def _can_do_expert_pp2(state: CollectionState, world: "WitnessWorld") -> bool:
player = world.player
hedge_2_access = (
_can_move_either_direction(state, "Keep 2nd Maze", "Keep", world.regio)
)
hedge_3_access = (
_can_move_either_direction(state, "Keep 3rd Maze", "Keep", world.regio)
or _can_move_either_direction(state, "Keep 3rd Maze", "Keep 2nd Maze", world.regio)
and hedge_2_access
)
hedge_4_access = (
_can_move_either_direction(state, "Keep 4th Maze", "Keep", world.regio)
or _can_move_either_direction(state, "Keep 4th Maze", "Keep 3rd Maze", world.regio)
and hedge_3_access
)
hedge_access = (
_can_move_either_direction(state, "Keep 4th Maze", "Keep Tower", world.regio)
and state.can_reach("Keep", "Region", player)
and hedge_4_access
)
backwards_to_fourth = (
state.can_reach("Keep", "Region", player)
and _can_move_either_direction(state, "Keep 4th Pressure Plate", "Keep Tower", world.regio)
and (
_can_move_either_direction(state, "Keep", "Keep Tower", world.regio)
or hedge_access
)
)
shadows_shortcut = (
state.can_reach("Main Island", "Region", player)
and _can_move_either_direction(state, "Keep 4th Pressure Plate", "Shadows", world.regio)
)
backwards_access = (
_can_move_either_direction(state, "Keep 3rd Pressure Plate", "Keep 4th Pressure Plate", world.regio)
and (backwards_to_fourth or shadows_shortcut)
)
front_access = (
_can_move_either_direction(state, "Keep 2nd Pressure Plate", "Keep", world.regio)
and state.can_reach("Keep", "Region", player)
)
return front_access and backwards_access
def _can_do_theater_to_tunnels(state: CollectionState, world: "WitnessWorld") -> bool:
direct_access = (
_can_move_either_direction(state, "Tunnels", "Windmill Interior", world.regio)
and _can_move_either_direction(state, "Theater", "Windmill Interior", world.regio)
)
theater_from_town = (
_can_move_either_direction(state, "Town", "Windmill Interior", world.regio)
and _can_move_either_direction(state, "Theater", "Windmill Interior", world.regio)
or _can_move_either_direction(state, "Town", "Theater", world.regio)
)
tunnels_from_town = (
_can_move_either_direction(state, "Tunnels", "Windmill Interior", world.regio)
and _can_move_either_direction(state, "Town", "Windmill Interior", world.regio)
or _can_move_either_direction(state, "Tunnels", "Town", world.regio)
)
return direct_access or theater_from_town and tunnels_from_town
def _has_item(item: str, world: "WitnessWorld", player: int,
player_logic: WitnessPlayerLogic, locat: WitnessPlayerLocations) -> Callable[[CollectionState], bool]:
if item in player_logic.REFERENCE_LOGIC.ALL_REGIONS_BY_NAME:
return lambda state: state.can_reach(item, "Region", player)
if item == "7 Lasers":
laser_req = world.options.mountain_lasers.value
return _has_lasers(laser_req, world)
if item == "11 Lasers":
laser_req = world.options.challenge_lasers.value
return _has_lasers(laser_req, world)
elif item == "PP2 Weirdness":
return lambda state: _can_do_expert_pp2(state, world)
elif item == "Theater to Tunnels":
return lambda state: _can_do_theater_to_tunnels(state, world)
if item in player_logic.EVENT_PANELS:
return _can_solve_panel(item, world, player, player_logic, locat)
prog_item = StaticWitnessLogic.get_parent_progressive_item(item)
return lambda state: state.has(prog_item, player, player_logic.MULTI_AMOUNTS[item])
def _meets_item_requirements(requirements: FrozenSet[FrozenSet[str]],
world: "WitnessWorld") -> Callable[[CollectionState], bool]:
"""
Checks whether item and panel requirements are met for
a panel
"""
lambda_conversion = [
[_has_item(item, world, world.player, world.player_logic, world.locat) for item in subset]
for subset in requirements
]
return lambda state: any(
all(condition(state) for condition in sub_requirement)
for sub_requirement in lambda_conversion
)
def make_lambda(entity_hex: str, world: "WitnessWorld") -> Callable[[CollectionState], bool]:
"""
Lambdas are created in a for loop so values need to be captured
"""
entity_req = world.player_logic.REQUIREMENTS_BY_HEX[entity_hex]
return _meets_item_requirements(entity_req, world)
def set_rules(world: "WitnessWorld"):
""" """
Sets all rules for all locations Sets all rules for all locations
""" """
for location in locat.CHECK_LOCATION_TABLE: for location in world.locat.CHECK_LOCATION_TABLE:
real_location = location real_location = location
if location in locat.EVENT_LOCATION_TABLE: if location in world.locat.EVENT_LOCATION_TABLE:
real_location = location[:-7] real_location = location[:-7]
panel = StaticWitnessLogic.CHECKS_BY_NAME[real_location] associated_entity = world.player_logic.REFERENCE_LOGIC.ENTITIES_BY_NAME[real_location]
check_hex = panel["checkHex"] entity_hex = associated_entity["entity_hex"]
rule = make_lambda(check_hex, world, player, player_logic, locat) rule = make_lambda(entity_hex, world)
set_rule(world.get_location(location, player), rule) location = world.multiworld.get_location(location, world.player)
world.completion_condition[player] = \ set_rule(location, rule)
lambda state: state.has('Victory', player)
world.multiworld.completion_condition[world.player] = lambda state: state.has('Victory', world.player)

View File

@ -1,31 +0,0 @@
Items:
Glass Factory Entry (Panel)
Symmetry Island Lower (Panel)
Symmetry Island Upper (Panel)
Desert Light Room Entry (Panel)
Desert Flood Controls (Panel)
Quarry Stoneworks Entry (Panel)
Quarry Stoneworks Ramp Controls (Panel)
Quarry Stoneworks Lift Controls (Panel)
Quarry Boathouse Ramp Height Control (Panel)
Quarry Boathouse Ramp Horizontal Control (Panel)
Shadows Door Timer (Panel)
Monastery Entry Left (Panel)
Monastery Entry Right (Panel)
Town Tinted Glass Door (Panel)
Town Church Entry (Panel)
Town Maze Panel (Drop-Down Staircase) (Panel)
Windmill Entry (Panel)
Treehouse First & Second Doors (Panel)
Treehouse Third Door (Panel)
Treehouse Laser House Door Timer (Panel)
Treehouse Drawbridge (Panel)
Jungle Popup Wall (Panel)
Bunker Entry (Panel)
Bunker Tinted Glass Door (Panel)
Bunker Elevator Control (Panel)
Swamp Entry (Panel)
Swamp Sliding Bridge (Panel)
Swamp Rotating Bridge (Panel)
Swamp Maze Control (Panel)
Boat

View File

@ -0,0 +1,2 @@
Items:
Boat

View File

@ -0,0 +1,25 @@
Items:
Desert Flood Controls (Panel)
Desert Light Control (Panel)
Quarry Elevator Control (Panel)
Quarry Stoneworks Ramp Controls (Panel)
Quarry Stoneworks Lift Controls (Panel)
Quarry Boathouse Ramp Height Control (Panel)
Quarry Boathouse Ramp Horizontal Control (Panel)
Quarry Boathouse Hook Control (Panel)
Monastery Shutters Control (Panel)
Town Maze Rooftop Bridge (Panel)
Town RGB Control (Panel)
Windmill Turn Control (Panel)
Theater Video Input (Panel)
Bunker Drop-Down Door Controls (Panel)
Bunker Elevator Control (Panel)
Swamp Sliding Bridge (Panel)
Swamp Rotating Bridge (Panel)
Swamp Long Bridge (Panel)
Swamp Maze Controls (Panel)
Mountain Floor 1 Light Bridge (Panel)
Mountain Floor 2 Light Bridge Near (Panel)
Mountain Floor 2 Light Bridge Far (Panel)
Mountain Floor 2 Elevator Control (Panel)
Caves Elevator Controls (Panel)

View File

@ -0,0 +1,38 @@
Items:
Glass Factory Entry (Panel)
Tutorial Outpost Entry (Panel)
Tutorial Outpost Exit (Panel)
Symmetry Island Lower (Panel)
Symmetry Island Upper (Panel)
Desert Light Room Entry (Panel)
Desert Flood Room Entry (Panel)
Quarry Entry 1 (Panel)
Quarry Entry 2 (Panel)
Quarry Stoneworks Entry (Panel)
Shadows Door Timer (Panel)
Keep Hedge Maze 1 (Panel)
Keep Hedge Maze 2 (Panel)
Keep Hedge Maze 3 (Panel)
Keep Hedge Maze 4 (Panel)
Monastery Entry Left (Panel)
Monastery Entry Right (Panel)
Town RGB House Entry (Panel)
Town Church Entry (Panel)
Town Maze Stairs (Panel)
Town Windmill Entry (Panel)
Town Cargo Box Entry (Panel)
Theater Entry (Panel)
Theater Exit (Panel)
Treehouse First & Second Doors (Panel)
Treehouse Third Door (Panel)
Treehouse Laser House Door Timer (Panel)
Treehouse Drawbridge (Panel)
Jungle Popup Wall (Panel)
Bunker Entry (Panel)
Bunker Tinted Glass Door (Panel)
Swamp Entry (Panel)
Swamp Platform Shortcut (Panel)
Caves Entry (Panel)
Challenge Entry (Panel)
Tunnels Entry (Panel)
Tunnels Town Shortcut (Panel)

View File

@ -12,6 +12,7 @@ Desert Light Room Entry (Door)
Desert Pond Room Entry (Door) Desert Pond Room Entry (Door)
Desert Flood Room Entry (Door) Desert Flood Room Entry (Door)
Desert Elevator Room Entry (Door) Desert Elevator Room Entry (Door)
Desert Elevator (Door)
Quarry Entry 1 (Door) Quarry Entry 1 (Door)
Quarry Entry 2 (Door) Quarry Entry 2 (Door)
Quarry Stoneworks Entry (Door) Quarry Stoneworks Entry (Door)
@ -39,13 +40,13 @@ Keep Pressure Plates 3 Exit (Door)
Keep Pressure Plates 4 Exit (Door) Keep Pressure Plates 4 Exit (Door)
Keep Shadows Shortcut (Door) Keep Shadows Shortcut (Door)
Keep Tower Shortcut (Door) Keep Tower Shortcut (Door)
Monastery Shortcut (Door) Monastery Laser Shortcut (Door)
Monastery Entry Inner (Door) Monastery Entry Inner (Door)
Monastery Entry Outer (Door) Monastery Entry Outer (Door)
Monastery Garden Entry (Door) Monastery Garden Entry (Door)
Town Cargo Box Entry (Door) Town Cargo Box Entry (Door)
Town Wooden Roof Stairs (Door) Town Wooden Roof Stairs (Door)
Town Tinted Glass Door Town RGB House Entry (Door)
Town Church Entry (Door) Town Church Entry (Door)
Town Maze Stairs (Door) Town Maze Stairs (Door)
Town Windmill Entry (Door) Town Windmill Entry (Door)
@ -59,7 +60,7 @@ Theater Exit Left (Door)
Theater Exit Right (Door) Theater Exit Right (Door)
Jungle Bamboo Laser Shortcut (Door) Jungle Bamboo Laser Shortcut (Door)
Jungle Popup Wall (Door) Jungle Popup Wall (Door)
River Monastery Shortcut (Door) River Monastery Garden Shortcut (Door)
Bunker Entry (Door) Bunker Entry (Door)
Bunker Tinted Glass Door Bunker Tinted Glass Door
Bunker UV Room Entry (Door) Bunker UV Room Entry (Door)
@ -115,7 +116,7 @@ Quarry Stoneworks Entry Right Panel
Quarry Stoneworks Entry Left Panel Quarry Stoneworks Entry Left Panel
Quarry Stoneworks Side Exit Panel Quarry Stoneworks Side Exit Panel
Quarry Stoneworks Roof Exit Panel Quarry Stoneworks Roof Exit Panel
Quarry Stoneworks Stair Control Quarry Stoneworks Stairs Panel
Quarry Boathouse Second Barrier Panel Quarry Boathouse Second Barrier Panel
Shadows Door Timer Inside Shadows Door Timer Inside
Shadows Door Timer Outside Shadows Door Timer Outside
@ -133,15 +134,15 @@ Keep Pressure Plates 3
Keep Pressure Plates 4 Keep Pressure Plates 4
Keep Shadows Shortcut Panel Keep Shadows Shortcut Panel
Keep Tower Shortcut Panel Keep Tower Shortcut Panel
Monastery Shortcut Panel Monastery Laser Shortcut Panel
Monastery Entry Left Monastery Entry Left
Monastery Entry Right Monastery Entry Right
Monastery Outside 3 Monastery Outside 3
Town Cargo Box Entry Panel Town Cargo Box Entry Panel
Town Wooden Roof Lower Row 5 Town Wooden Roof Lower Row 5
Town Tinted Glass Door Panel Town RGB House Entry Panel
Town Church Entry Panel Town Church Entry Panel
Town Maze Stair Control Town Maze Panel
Town Windmill Entry Panel Town Windmill Entry Panel
Town Sound Room Right Town Sound Room Right
Town Red Rooftop 5 Town Red Rooftop 5
@ -153,7 +154,7 @@ Theater Exit Left Panel
Theater Exit Right Panel Theater Exit Right Panel
Jungle Laser Shortcut Panel Jungle Laser Shortcut Panel
Jungle Popup Wall Control Jungle Popup Wall Control
River Monastery Shortcut Panel River Monastery Garden Shortcut Panel
Bunker Entry Panel Bunker Entry Panel
Bunker Tinted Glass Door Panel Bunker Tinted Glass Door Panel
Bunker Glass Room 3 Bunker Glass Room 3
@ -171,10 +172,10 @@ Swamp Laser Shortcut Right Panel
Treehouse First Door Panel Treehouse First Door Panel
Treehouse Second Door Panel Treehouse Second Door Panel
Treehouse Third Door Panel Treehouse Third Door Panel
Treehouse Bridge Control Treehouse Drawbridge Panel
Treehouse Left Orange Bridge 15 Treehouse Left Orange Bridge 15
Treehouse Right Orange Bridge 12 Treehouse Right Orange Bridge 12
Treehouse Laser House Door Timer Outside Control Treehouse Laser House Door Timer Outside
Treehouse Laser House Door Timer Inside Treehouse Laser House Door Timer Inside
Mountain Floor 1 Left Row 7 Mountain Floor 1 Left Row 7
Mountain Floor 1 Right Row 5 Mountain Floor 1 Right Row 5

View File

@ -0,0 +1,11 @@
New Connections:
Quarry - Quarry Elevator - TrueOneWay
Outside Quarry - Quarry Elevator - TrueOneWay
Outside Bunker - Bunker Elevator - TrueOneWay
Outside Swamp - Swamp Long Bridge - TrueOneWay
Swamp Near Boat - Swamp Long Bridge - TrueOneWay
Town Red Rooftop - Town Maze Rooftop - TrueOneWay
Requirement Changes:
0x035DE - 0x17E2B - True

View File

@ -0,0 +1,11 @@
Items:
Desert Control Panels
Quarry Elevator Control (Panel)
Quarry Stoneworks Control Panels
Quarry Boathouse Control Panels
Monastery Shutters Control (Panel)
Town Control Panels
Windmill & Theater Control Panels
Bunker Control Panels
Swamp Control Panels
Mountain & Caves Control Panels

View File

@ -1,44 +1,33 @@
Items: Items:
Glass Factory Back Wall (Door)
Quarry Boathouse Dock (Door)
Outside Tutorial Outpost Doors Outside Tutorial Outpost Doors
Glass Factory Entry (Door) Glass Factory Doors
Symmetry Island Doors Symmetry Island Doors
Orchard Gates Orchard Gates
Desert Doors Desert Doors & Elevator
Quarry Main Entry Quarry Entry Doors
Quarry Stoneworks Entry (Door) Quarry Stoneworks Doors
Quarry Stoneworks Shortcuts Quarry Boathouse Doors
Quarry Boathouse Barriers Shadows Laser Room Doors
Shadows Timed Door Shadows Lower Doors
Shadows Laser Room Door
Shadows Barriers
Keep Hedge Maze Doors Keep Hedge Maze Doors
Keep Pressure Plates Doors Keep Pressure Plates Doors
Keep Shortcuts Keep Shortcuts
Monastery Entry Monastery Entry Doors
Monastery Shortcuts Monastery Shortcuts
Town Doors Town Doors
Town Tower Doors Town Tower Doors
Theater Entry (Door) Windmill & Theater Doors
Theater Exit Jungle Doors
Jungle & River Shortcuts
Jungle Popup Wall (Door)
Bunker Doors Bunker Doors
Swamp Doors Swamp Doors
Swamp Laser Shortcut (Door) Swamp Shortcuts
Swamp Water Pumps Swamp Water Pumps
Treehouse Entry Doors Treehouse Entry Doors
Treehouse Drawbridge (Door) Treehouse Upper Doors
Treehouse Laser House Entry (Door) Mountain Floor 1 & 2 Doors
Mountain Floor 1 Exit (Door) Mountain Bottom Floor Doors
Mountain Floor 2 Stairs & Doors Caves Doors
Mountain Bottom Floor Giant Puzzle Exit (Door) Caves Shortcuts
Mountain Bottom Floor Final Room Entry (Door)
Mountain Bottom Floor Doors to Caves
Caves Doors to Challenge
Caves Exits to Main Island
Challenge Tunnels Entry (Door)
Tunnels Doors Tunnels Doors
Added Locations: Added Locations:
@ -60,7 +49,7 @@ Quarry Stoneworks Entry Right Panel
Quarry Stoneworks Entry Left Panel Quarry Stoneworks Entry Left Panel
Quarry Stoneworks Side Exit Panel Quarry Stoneworks Side Exit Panel
Quarry Stoneworks Roof Exit Panel Quarry Stoneworks Roof Exit Panel
Quarry Stoneworks Stair Control Quarry Stoneworks Stairs Panel
Quarry Boathouse Second Barrier Panel Quarry Boathouse Second Barrier Panel
Shadows Door Timer Inside Shadows Door Timer Inside
Shadows Door Timer Outside Shadows Door Timer Outside
@ -78,15 +67,15 @@ Keep Pressure Plates 3
Keep Pressure Plates 4 Keep Pressure Plates 4
Keep Shadows Shortcut Panel Keep Shadows Shortcut Panel
Keep Tower Shortcut Panel Keep Tower Shortcut Panel
Monastery Shortcut Panel Monastery Laser Shortcut Panel
Monastery Entry Left Monastery Entry Left
Monastery Entry Right Monastery Entry Right
Monastery Outside 3 Monastery Outside 3
Town Cargo Box Entry Panel Town Cargo Box Entry Panel
Town Wooden Roof Lower Row 5 Town Wooden Roof Lower Row 5
Town Tinted Glass Door Panel Town RGB House Entry Panel
Town Church Entry Panel Town Church Entry Panel
Town Maze Stair Control Town Maze Panel
Town Windmill Entry Panel Town Windmill Entry Panel
Town Sound Room Right Town Sound Room Right
Town Red Rooftop 5 Town Red Rooftop 5
@ -98,7 +87,7 @@ Theater Exit Left Panel
Theater Exit Right Panel Theater Exit Right Panel
Jungle Laser Shortcut Panel Jungle Laser Shortcut Panel
Jungle Popup Wall Control Jungle Popup Wall Control
River Monastery Shortcut Panel River Monastery Garden Shortcut Panel
Bunker Entry Panel Bunker Entry Panel
Bunker Tinted Glass Door Panel Bunker Tinted Glass Door Panel
Bunker Glass Room 3 Bunker Glass Room 3
@ -116,10 +105,10 @@ Swamp Laser Shortcut Right Panel
Treehouse First Door Panel Treehouse First Door Panel
Treehouse Second Door Panel Treehouse Second Door Panel
Treehouse Third Door Panel Treehouse Third Door Panel
Treehouse Bridge Control Treehouse Drawbridge Panel
Treehouse Left Orange Bridge 15 Treehouse Left Orange Bridge 15
Treehouse Right Orange Bridge 12 Treehouse Right Orange Bridge 12
Treehouse Laser House Door Timer Outside Control Treehouse Laser House Door Timer Outside
Treehouse Laser House Door Timer Inside Treehouse Laser House Door Timer Inside
Mountain Floor 1 Left Row 7 Mountain Floor 1 Left Row 7
Mountain Floor 1 Right Row 5 Mountain Floor 1 Right Row 5

View File

@ -0,0 +1,22 @@
Items:
Symmetry Island Panels
Tutorial Outpost Panels
Desert Panels
Quarry Outside Panels
Quarry Stoneworks Panels
Quarry Boathouse Panels
Keep Hedge Maze Panels
Monastery Panels
Town Church & RGB House Panels
Town Maze Panels
Windmill & Theater Panels
Town Cargo Box Entry (Panel)
Treehouse Panels
Bunker Panels
Swamp Panels
Mountain Panels
Caves Panels
Tunnels Panels
Glass Factory Entry (Panel)
Shadows Door Timer (Panel)
Jungle Popup Wall (Panel)

View File

@ -1,211 +0,0 @@
Items:
Outside Tutorial Outpost Path (Door)
Outside Tutorial Outpost Entry (Door)
Outside Tutorial Outpost Exit (Door)
Glass Factory Entry (Door)
Glass Factory Back Wall (Door)
Symmetry Island Lower (Door)
Symmetry Island Upper (Door)
Orchard First Gate (Door)
Orchard Second Gate (Door)
Desert Light Room Entry (Door)
Desert Pond Room Entry (Door)
Desert Flood Room Entry (Door)
Desert Elevator Room Entry (Door)
Quarry Entry 1 (Door)
Quarry Entry 2 (Door)
Quarry Stoneworks Entry (Door)
Quarry Stoneworks Side Exit (Door)
Quarry Stoneworks Roof Exit (Door)
Quarry Stoneworks Stairs (Door)
Quarry Boathouse Dock (Door)
Quarry Boathouse First Barrier (Door)
Quarry Boathouse Second Barrier (Door)
Shadows Timed Door
Shadows Laser Entry Right (Door)
Shadows Laser Entry Left (Door)
Shadows Quarry Barrier (Door)
Shadows Ledge Barrier (Door)
Keep Hedge Maze 1 Exit (Door)
Keep Pressure Plates 1 Exit (Door)
Keep Hedge Maze 2 Shortcut (Door)
Keep Hedge Maze 2 Exit (Door)
Keep Hedge Maze 3 Shortcut (Door)
Keep Hedge Maze 3 Exit (Door)
Keep Hedge Maze 4 Shortcut (Door)
Keep Hedge Maze 4 Exit (Door)
Keep Pressure Plates 2 Exit (Door)
Keep Pressure Plates 3 Exit (Door)
Keep Pressure Plates 4 Exit (Door)
Keep Shadows Shortcut (Door)
Keep Tower Shortcut (Door)
Monastery Shortcut (Door)
Monastery Entry Inner (Door)
Monastery Entry Outer (Door)
Monastery Garden Entry (Door)
Town Cargo Box Entry (Door)
Town Wooden Roof Stairs (Door)
Town Tinted Glass Door
Town Church Entry (Door)
Town Maze Stairs (Door)
Town Windmill Entry (Door)
Town RGB House Stairs (Door)
Town Tower Second (Door)
Town Tower First (Door)
Town Tower Fourth (Door)
Town Tower Third (Door)
Theater Entry (Door)
Theater Exit Left (Door)
Theater Exit Right (Door)
Jungle Bamboo Laser Shortcut (Door)
Jungle Popup Wall (Door)
River Monastery Shortcut (Door)
Bunker Entry (Door)
Bunker Tinted Glass Door
Bunker UV Room Entry (Door)
Bunker Elevator Room Entry (Door)
Swamp Entry (Door)
Swamp Between Bridges First Door
Swamp Platform Shortcut Door
Swamp Cyan Water Pump (Door)
Swamp Between Bridges Second Door
Swamp Red Water Pump (Door)
Swamp Red Underwater Exit (Door)
Swamp Blue Water Pump (Door)
Swamp Purple Water Pump (Door)
Swamp Laser Shortcut (Door)
Treehouse First (Door)
Treehouse Second (Door)
Treehouse Third (Door)
Treehouse Drawbridge (Door)
Treehouse Laser House Entry (Door)
Mountain Floor 1 Exit (Door)
Mountain Floor 2 Staircase Near (Door)
Mountain Floor 2 Exit (Door)
Mountain Floor 2 Staircase Far (Door)
Mountain Bottom Floor Giant Puzzle Exit (Door)
Mountain Bottom Floor Final Room Entry (Door)
Mountain Bottom Floor Rock (Door)
Caves Entry (Door)
Caves Pillar Door
Caves Mountain Shortcut (Door)
Caves Swamp Shortcut (Door)
Challenge Entry (Door)
Challenge Tunnels Entry (Door)
Tunnels Theater Shortcut (Door)
Tunnels Desert Shortcut (Door)
Tunnels Town Shortcut (Door)
Desert Flood Controls (Panel)
Quarry Stoneworks Ramp Controls (Panel)
Quarry Stoneworks Lift Controls (Panel)
Quarry Boathouse Ramp Height Control (Panel)
Quarry Boathouse Ramp Horizontal Control (Panel)
Bunker Elevator Control (Panel)
Swamp Sliding Bridge (Panel)
Swamp Rotating Bridge (Panel)
Swamp Maze Control (Panel)
Boat
Added Locations:
Outside Tutorial Outpost Entry Panel
Outside Tutorial Outpost Exit Panel
Glass Factory Entry Panel
Glass Factory Back Wall 5
Symmetry Island Lower Panel
Symmetry Island Upper Panel
Orchard Apple Tree 3
Orchard Apple Tree 5
Desert Light Room Entry Panel
Desert Light Room 3
Desert Flood Room Entry Panel
Desert Flood Room 6
Quarry Entry 1 Panel
Quarry Entry 2 Panel
Quarry Stoneworks Entry Right Panel
Quarry Stoneworks Entry Left Panel
Quarry Stoneworks Side Exit Panel
Quarry Stoneworks Roof Exit Panel
Quarry Stoneworks Stair Control
Quarry Boathouse Second Barrier Panel
Shadows Door Timer Inside
Shadows Door Timer Outside
Shadows Far 8
Shadows Near 5
Shadows Intro 3
Shadows Intro 5
Keep Hedge Maze 1
Keep Pressure Plates 1
Keep Hedge Maze 2
Keep Hedge Maze 3
Keep Hedge Maze 4
Keep Pressure Plates 2
Keep Pressure Plates 3
Keep Pressure Plates 4
Keep Shadows Shortcut Panel
Keep Tower Shortcut Panel
Monastery Shortcut Panel
Monastery Entry Left
Monastery Entry Right
Monastery Outside 3
Town Cargo Box Entry Panel
Town Wooden Roof Lower Row 5
Town Tinted Glass Door Panel
Town Church Entry Panel
Town Maze Stair Control
Town Windmill Entry Panel
Town Sound Room Right
Town Red Rooftop 5
Town Church Lattice
Town Tall Hexagonal
Town Wooden Rooftop
Windmill Theater Entry Panel
Theater Exit Left Panel
Theater Exit Right Panel
Jungle Laser Shortcut Panel
Jungle Popup Wall Control
River Monastery Shortcut Panel
Bunker Entry Panel
Bunker Tinted Glass Door Panel
Bunker Glass Room 3
Bunker UV Room 2
Swamp Entry Panel
Swamp Platform Row 4
Swamp Platform Shortcut Right Panel
Swamp Blue Underwater 5
Swamp Between Bridges Near Row 4
Swamp Cyan Underwater 5
Swamp Red Underwater 4
Swamp Beyond Rotating Bridge 4
Swamp Beyond Rotating Bridge 4
Swamp Laser Shortcut Right Panel
Treehouse First Door Panel
Treehouse Second Door Panel
Treehouse Third Door Panel
Treehouse Bridge Control
Treehouse Left Orange Bridge 15
Treehouse Right Orange Bridge 12
Treehouse Laser House Door Timer Outside Control
Treehouse Laser House Door Timer Inside
Mountain Floor 1 Left Row 7
Mountain Floor 1 Right Row 5
Mountain Floor 1 Back Row 3
Mountain Floor 1 Trash Pillar 2
Mountain Floor 2 Near Row 5
Mountain Floor 2 Light Bridge Controller Near
Mountain Floor 2 Light Bridge Controller Far
Mountain Floor 2 Far Row 6
Mountain Bottom Floor Giant Puzzle
Mountain Bottom Floor Final Room Entry Left
Mountain Bottom Floor Final Room Entry Right
Mountain Bottom Floor Discard
Mountain Bottom Floor Rock Control
Mountain Bottom Floor Caves Entry Panel
Caves Lone Pillar
Caves Mountain Shortcut Panel
Caves Swamp Shortcut Panel
Caves Challenge Entry Panel
Challenge Tunnels Entry Panel
Tunnels Theater Shortcut Panel
Tunnels Desert Shortcut Panel
Tunnels Town Shortcut Panel

View File

@ -1,136 +1,136 @@
Added Locations: Added Locations:
0x0332B 0x0332B (Glass Factory Black Line Reflection EP)
0x03367 0x03367 (Glass Factory Black Line EP)
0x28B8A 0x28B8A (Vase EP)
0x037B6 0x037B6 (Windmill First Blade EP)
0x037B2 0x037B2 (Windmill Second Blade EP)
0x000F7 0x000F7 (Windmill Third Blade EP)
0x3351D 0x3351D (Sand Snake EP)
0x0053C 0x0053C (Facade Right EP)
0x00771 0x00771 (Facade Left EP)
0x335C8 0x335C8 (Stairs Left EP)
0x335C9 0x335C9 (Stairs Right EP)
0x337F8 0x337F8 (Flood Room EP)
0x037BB 0x037BB (Elevator EP)
0x220E4 0x220E4 (Broken Wall Straight EP)
0x220E5 0x220E5 (Broken Wall Bend EP)
0x334B9 0x334B9 (Shore EP)
0x334BC 0x334BC (Island EP)
0x22106 0x22106 (Desert EP)
0x0A14C 0x0A14C (Pond Room Near Reflection EP)
0x0A14D 0x0A14D (Pond Room Far Reflection EP)
0x03ABC 0x03ABC (Long Arch Moss EP)
0x03ABE 0x03ABE (Straight Left Moss EP)
0x03AC0 0x03AC0 (Pop-up Wall Moss EP)
0x03AC4 0x03AC4 (Short Arch Moss EP)
0x03AC5 0x03AC5 (Green Leaf Moss EP)
0x03BE2 0x03BE2 (Monastery Garden Left EP)
0x03BE3 0x03BE3 (Monastery Garden Right EP)
0x0A409 0x0A409 (Monastery Wall EP)
0x006E5 0x006E5 (Facade Left Near EP)
0x006E6 0x006E6 (Facade Left Far Short EP)
0x006E7 0x006E7 (Facade Left Far Long EP)
0x034A7 0x034A7 (Left Shutter EP)
0x034AD 0x034AD (Middle Shutter EP)
0x034AF 0x034AF (Right Shutter EP)
0x03DAB 0x03DAB (Facade Right Near EP)
0x03DAC 0x03DAC (Facade Left Stairs EP)
0x03DAD 0x03DAD (Facade Right Stairs EP)
0x03E01 0x03E01 (Grass Stairs EP)
0x289F4 0x289F4 (Entrance EP)
0x289F5 0x289F5 (Tree Halo EP)
0x0053D 0x0053D (Rock Shadow EP)
0x0053E 0x0053E (Sand Shadow EP)
0x00769 0x00769 (Burned House Beach EP)
0x33721 0x33721 (Buoy EP)
0x220A7 0x220A7 (Right Orange Bridge EP)
0x220BD 0x220BD (Both Orange Bridges EP)
0x03B22 0x03B22 (Circle Far EP)
0x03B23 0x03B23 (Circle Left EP)
0x03B24 0x03B24 (Circle Near EP)
0x03B25 0x03B25 (Shipwreck CCW Underside EP)
0x03A79 0x03A79 (Stern EP)
0x28ABD 0x28ABD (Rope Inner EP)
0x28ABE 0x28ABE (Rope Outer EP)
0x3388F 0x3388F (Couch EP)
0x28B29 0x28B29 (Shipwreck Green EP)
0x28B2A 0x28B2A (Shipwreck CW Underside EP)
0x018B6 0x018B6 (Pressure Plates 4 Right Exit EP)
0x033BE 0x033BE (Pressure Plates 1 EP)
0x033BF 0x033BF (Pressure Plates 2 EP)
0x033DD 0x033DD (Pressure Plates 3 EP)
0x033E5 0x033E5 (Pressure Plates 4 Left Exit EP)
0x28AE9 0x28AE9 (Path EP)
0x3348F 0x3348F (Hedges EP)
0x001A3 0x001A3 (River Shape EP)
0x335AE 0x335AE (Cloud Cycle EP)
0x000D3 0x000D3 (Green Room Flowers EP)
0x035F5 0x035F5 (Tinted Door EP)
0x09D5D 0x09D5D (Yellow Bridge EP)
0x09D5E 0x09D5E (Blue Bridge EP)
0x09D63 0x09D63 (Pink Bridge EP)
0x3370E 0x3370E (Arch Black EP)
0x035DE 0x035DE (Purple Sand Bottom EP)
0x03601 0x03601 (Purple Sand Top EP)
0x03603 0x03603 (Purple Sand Middle EP)
0x03D0D 0x03D0D (Bunker Yellow Line EP)
0x3369A 0x3369A (Arch White Left EP)
0x336C8 0x336C8 (Arch White Right EP)
0x33505 0x33505 (Bush EP)
0x03A9E 0x03A9E (Purple Underwater Right EP)
0x016B2 0x016B2 (Rotating Bridge CCW EP)
0x3365F 0x3365F (Boat EP)
0x03731 0x03731 (Long Bridge Side EP)
0x036CE 0x036CE (Rotating Bridge CW EP)
0x03C07 0x03C07 (Apparent River EP)
0x03A93 0x03A93 (Purple Underwater Left EP)
0x03AA6 0x03AA6 (Cyan Underwater Sliding Bridge EP)
0x3397C 0x3397C (Skylight EP)
0x0105D 0x0105D (Sliding Bridge Left EP)
0x0A304 0x0A304 (Sliding Bridge Right EP)
0x035CB 0x035CB (Bamboo CCW EP)
0x035CF 0x035CF (Bamboo CW EP)
0x28A7B 0x28A7B (Quarry Stoneworks Rooftop Vent EP)
0x005F6 0x005F6 (Hook EP)
0x00859 0x00859 (Moving Ramp EP)
0x17CB9 0x17CB9 (Railroad EP)
0x28A4A 0x28A4A (Shore EP)
0x334B6 0x334B6 (Entrance Pipe EP)
0x0069D 0x0069D (Ramp EP)
0x00614 0x00614 (Lift EP)
0x28A4C 0x28A4C (Sand Pile EP)
0x289CF 0x289CF (Rock Line EP)
0x289D1 0x289D1 (Rock Line Reflection EP)
0x33692 0x33692 (Brown Bridge EP)
0x03E77 0x03E77 (Red Flowers EP)
0x03E7C 0x03E7C (Purple Flowers EP)
0x035C7 0x035C7 (Tractor EP)
0x01848 0x01848 (EP)
0x03D06 0x03D06 (Garden EP)
0x33530 0x33530 (Cloud EP)
0x33600 0x33600 (Patio Flowers EP)
0x28A2F 0x28A2F (Town Sewer EP)
0x28A37 0x28A37 (Town Long Sewer EP)
0x334A3 0x334A3 (Path EP)
0x3352F 0x3352F (Gate EP)
0x33857 0x33857 (Tutorial EP)
0x33879 0x33879 (Tutorial Reflection EP)
0x03C19 0x03C19 (Tutorial Moss EP)
0x28B30 0x28B30 (Water EP)
0x035C9 0x035C9 (Cargo Box EP)
0x03335 0x03335 (Tower Underside Third EP)
0x03412 0x03412 (Tower Underside Fourth EP)
0x038A6 0x038A6 (Tower Underside First EP)
0x038AA 0x038AA (Tower Underside Second EP)
0x03E3F 0x03E3F (RGB House Red EP)
0x03E40 0x03E40 (RGB House Green EP)
0x28B8E 0x28B8E (Maze Bridge Underside EP)
0x28B91 0x28B91 (Thundercloud EP)
0x03BCE 0x03BCE (Black Line Tower EP)
0x03BCF 0x03BCF (Black Line Redirect EP)
0x03BD1 0x03BD1 (Black Line Church EP)
0x339B6 0x339B6 (Eclipse EP)
0x33A20 0x33A20 (Theater Flowers EP)
0x33A29 0x33A29 (Window EP)
0x33A2A 0x33A2A (Door EP)
0x33B06 0x33B06 (Church EP)

View File

@ -1,14 +1,17 @@
Precompleted Locations: Disabled Locations:
0x339B6 0x339B6 (Eclipse EP)
0x335AE 0x335AE (Cloud Cycle EP)
0x3388F 0x3388F (Couch EP)
0x33A20 0x33A20 (Theater Flowers EP)
0x037B2 0x037B2 (Windmill Second Blade EP)
0x000F7 0x000F7 (Windmill Third Blade EP)
0x28B29 0x28B29 (Shipwreck Green EP)
0x33857 0x33857 (Tutorial EP)
0x33879 0x33879 (Tutorial Reflection EP)
0x016B2 0x016B2 (Rotating Bridge CCW EP)
0x036CE 0x036CE (Rotating Bridge CW EP)
0x03B25 0x03B25 (Shipwreck CCW Underside EP)
0x28B2A 0x28B2A (Shipwreck CW Underside EP)
0x09D63 (Mountain Pink Bridge EP)
0x09D5E (Mountain Blue Bridge EP)
0x09D5D (Mountain Yellow Bridge EP)

View File

@ -1,5 +0,0 @@
Precompleted Locations:
0x3397C
0x33A20
0x3352F
0x28B30

View File

@ -1,2 +1,2 @@
Precompleted Locations: Disabled Locations:
0x339B6 0x339B6 (Eclipse EP)

View File

@ -1,4 +0,0 @@
Precompleted Locations:
0x09D63
0x09D5D
0x09D5E

View File

@ -1,34 +1,35 @@
Added Locations: Added Locations:
0xFFE00 0xFFE00 (Desert Obelisk Side 1)
0xFFE01 0xFFE01 (Desert Obelisk Side 2)
0xFFE02 0xFFE02 (Desert Obelisk Side 3)
0xFFE03 0xFFE03 (Desert Obelisk Side 4)
0xFFE04 0xFFE04 (Desert Obelisk Side 5)
0xFFE10 0xFFE10 (Monastery Obelisk Side 1)
0xFFE11 0xFFE11 (Monastery Obelisk Side 2)
0xFFE12 0xFFE12 (Monastery Obelisk Side 3)
0xFFE13 0xFFE13 (Monastery Obelisk Side 4)
0xFFE14 0xFFE14 (Monastery Obelisk Side 5)
0xFFE15 0xFFE15 (Monastery Obelisk Side 6)
0xFFE20 0xFFE20 (Treehouse Obelisk Side 1)
0xFFE21 0xFFE21 (Treehouse Obelisk Side 2)
0xFFE22 0xFFE22 (Treehouse Obelisk Side 3)
0xFFE23 0xFFE23 (Treehouse Obelisk Side 4)
0xFFE24 0xFFE24 (Treehouse Obelisk Side 5)
0xFFE25 0xFFE25 (Treehouse Obelisk Side 6)
0xFFE30 0xFFE30 (River Obelisk Side 1)
0xFFE31 0xFFE31 (River Obelisk Side 2)
0xFFE32 0xFFE32 (River Obelisk Side 3)
0xFFE33 0xFFE33 (River Obelisk Side 4)
0xFFE34 0xFFE34 (River Obelisk Side 5)
0xFFE35 0xFFE35 (River Obelisk Side 6)
0xFFE40 0xFFE40 (Quarry Obelisk Side 1)
0xFFE41 0xFFE41 (Quarry Obelisk Side 2)
0xFFE42 0xFFE42 (Quarry Obelisk Side 3)
0xFFE43 0xFFE43 (Quarry Obelisk Side 4)
0xFFE50 0xFFE44 (Quarry Obelisk Side 5)
0xFFE51 0xFFE50 (Town Obelisk Side 1)
0xFFE52 0xFFE51 (Town Obelisk Side 2)
0xFFE53 0xFFE52 (Town Obelisk Side 3)
0xFFE54 0xFFE53 (Town Obelisk Side 4)
0xFFE55 0xFFE54 (Town Obelisk Side 5)
0xFFE55 (Town Obelisk Side 6)

View File

@ -1,6 +0,0 @@
Precompleted Locations:
0x339B6
0x33A29
0x33A2A
0x33B06
0x33A20

View File

@ -0,0 +1,6 @@
Items:
Caves Shortcuts
Remove Items:
Caves Mountain Shortcut (Door)
Caves Swamp Shortcut (Door)

View File

@ -0,0 +1,9 @@
Items:
Caves Shortcuts
Starting Inventory:
Caves Shortcuts
Remove Items:
Caves Mountain Shortcut (Door)
Caves Swamp Shortcut (Door)

View File

@ -1,9 +0,0 @@
Items:
Caves Exits to Main Island
Starting Inventory:
Caves Exits to Main Island
Remove Items:
Caves Mountain Shortcut (Door)
Caves Swamp Shortcut (Door)

View File

@ -2,16 +2,20 @@ Event Items:
Monastery Laser Activation - 0x00A5B,0x17CE7,0x17FA9 Monastery Laser Activation - 0x00A5B,0x17CE7,0x17FA9
Bunker Laser Activation - 0x00061,0x17D01,0x17C42 Bunker Laser Activation - 0x00061,0x17D01,0x17C42
Shadows Laser Activation - 0x00021,0x17D28,0x17C71 Shadows Laser Activation - 0x00021,0x17D28,0x17C71
Town Tower 4th Door Opens - 0x17CFB,0x3C12B,0x17CF7
Jungle Popup Wall Lifts - 0x17FA0,0x17D27,0x17F9B,0x17CAB
Requirement Changes: Requirement Changes:
0x17C65 - 0x00A5B | 0x17CE7 | 0x17FA9 0x17C65 - 0x00A5B | 0x17CE7 | 0x17FA9
0x0C2B2 - 0x00061 | 0x17D01 | 0x17C42 0x0C2B2 - 0x00061 | 0x17D01 | 0x17C42
0x181B3 - 0x00021 | 0x17D28 | 0x17C71 0x181B3 - 0x00021 | 0x17D28 | 0x17C71
0x28B39 - True - Reflection
0x17CAB - True - True 0x17CAB - True - True
0x17CA4 - True - True
0x1475B - 0x17FA0 | 0x17D27 | 0x17F9B | 0x17CAB
0x2779A - 0x17CFB | 0x3C12B | 0x17CF7 0x2779A - 0x17CFB | 0x3C12B | 0x17CF7
Disabled Locations: Disabled Locations:
0x28B39 (Town Tall Hexagonal)
0x03505 (Tutorial Gate Close) 0x03505 (Tutorial Gate Close)
0x0C335 (Tutorial Pillar) 0x0C335 (Tutorial Pillar)
0x0C373 (Tutorial Patio Floor) 0x0C373 (Tutorial Patio Floor)
@ -25,6 +29,11 @@ Disabled Locations:
0x00055 (Orchard Apple Tree 3) 0x00055 (Orchard Apple Tree 3)
0x032F7 (Orchard Apple Tree 4) 0x032F7 (Orchard Apple Tree 4)
0x032FF (Orchard Apple Tree 5) 0x032FF (Orchard Apple Tree 5)
0x334DB (Door Timer Outside)
0x334DC (Door Timer Inside)
0x19B24 (Timed Door) - 0x334DB
0x194B2 (Laser Entry Right)
0x19665 (Laser Entry Left)
0x198B5 (Shadows Intro 1) 0x198B5 (Shadows Intro 1)
0x198BD (Shadows Intro 2) 0x198BD (Shadows Intro 2)
0x198BF (Shadows Intro 3) 0x198BF (Shadows Intro 3)
@ -47,11 +56,22 @@ Disabled Locations:
0x197E8 (Shadows Near 4) 0x197E8 (Shadows Near 4)
0x197E5 (Shadows Near 5) 0x197E5 (Shadows Near 5)
0x19650 (Shadows Laser) 0x19650 (Shadows Laser)
0x19865 (Quarry Barrier)
0x0A2DF (Quarry Barrier 2)
0x1855B (Ledge Barrier)
0x19ADE (Ledge Barrier 2)
0x00139 (Keep Hedge Maze 1) 0x00139 (Keep Hedge Maze 1)
0x019DC (Keep Hedge Maze 2) 0x019DC (Keep Hedge Maze 2)
0x019E7 (Keep Hedge Maze 3) 0x019E7 (Keep Hedge Maze 3)
0x01A0F (Keep Hedge Maze 4) 0x01A0F (Keep Hedge Maze 4)
0x0360E (Laser Hedges) 0x0360E (Laser Hedges)
0x01954 (Hedge 1 Exit)
0x018CE (Hedge 2 Shortcut)
0x019D8 (Hedge 2 Exit)
0x019B5 (Hedge 3 Shortcut)
0x019E6 (Hedge 3 Exit)
0x0199A (Hedge 4 Shortcut)
0x01A0E (Hedge 4 Exit)
0x03307 (First Gate) 0x03307 (First Gate)
0x03313 (Second Gate) 0x03313 (Second Gate)
0x0C128 (Entry Inner) 0x0C128 (Entry Inner)
@ -61,16 +81,20 @@ Disabled Locations:
0x00290 (Monastery Outside 1) 0x00290 (Monastery Outside 1)
0x00038 (Monastery Outside 2) 0x00038 (Monastery Outside 2)
0x00037 (Monastery Outside 3) 0x00037 (Monastery Outside 3)
0x03750 (Garden Entry)
0x09D9B (Monastery Shutters Control)
0x193A7 (Monastery Inside 1) 0x193A7 (Monastery Inside 1)
0x193AA (Monastery Inside 2) 0x193AA (Monastery Inside 2)
0x193AB (Monastery Inside 3) 0x193AB (Monastery Inside 3)
0x193A6 (Monastery Inside 4) 0x193A6 (Monastery Inside 4)
0x17CA4 (Monastery Laser) 0x17CA4 (Monastery Laser Panel)
0x0364E (Monastery Laser Shortcut Door)
0x03713 (Monastery Laser Shortcut Panel)
0x18590 (Transparent) - True - Symmetry & Environment 0x18590 (Transparent) - True - Symmetry & Environment
0x28AE3 (Vines) - 0x18590 - Shadows Follow & Environment 0x28AE3 (Vines) - 0x18590 - Shadows Follow & Environment
0x28938 (Apple Tree) - 0x28AE3 - Environment 0x28938 (Apple Tree) - 0x28AE3 - Environment
0x079DF (Triple Exit) - 0x28938 - Shadows Avoid & Environment & Reflection 0x079DF (Triple Exit) - 0x28938 - Shadows Avoid & Environment & Reflection
0x28B39 (Tall Hexagonal) - 0x079DF & 0x2896A - Reflection 0x00815 (Theater Video Input)
0x03553 (Theater Tutorial Video) 0x03553 (Theater Tutorial Video)
0x03552 (Theater Desert Video) 0x03552 (Theater Desert Video)
0x0354E (Theater Jungle Video) 0x0354E (Theater Jungle Video)
@ -84,7 +108,8 @@ Disabled Locations:
0x0070F (Second Row 2) 0x0070F (Second Row 2)
0x0087D (Second Row 3) 0x0087D (Second Row 3)
0x002C7 (Second Row 4) 0x002C7 (Second Row 4)
0x17CAA (Monastery Shortcut Panel) 0x17CAA (Monastery Garden Shortcut Panel)
0x0CF2A (Monastery Garden Shortcut)
0x0C2A4 (Bunker Entry) 0x0C2A4 (Bunker Entry)
0x17C79 (Tinted Glass Door) 0x17C79 (Tinted Glass Door)
0x0C2A3 (UV Room Entry) 0x0C2A3 (UV Room Entry)
@ -110,19 +135,16 @@ Disabled Locations:
0x09DE0 (Bunker Laser) 0x09DE0 (Bunker Laser)
0x0A079 (Bunker Elevator Control) 0x0A079 (Bunker Elevator Control)
0x17CAA (River Garden Entry Panel) 0x034A7 (Monastery Left Shutter EP)
0x034AD (Monastery Middle Shutter EP)
Precompleted Locations: 0x034AF (Monastery Right Shutter EP)
0x034A7 0x339B6 (Theater Eclipse EP)
0x034AD 0x33A29 (Theater Window EP)
0x034AF 0x33A2A (Theater Door EP)
0x339B6 0x33B06 (Theater Church EP)
0x33A29 0x3352F (Tutorial Gate EP)
0x33A2A 0x33600 (Tutorial Patio Flowers EP)
0x33B06 0x035F5 (Bunker Tinted Door EP)
0x3352F 0x000D3 (Bunker Green Room Flowers EP)
0x33600 0x33A20 (Theater Flowers EP)
0x035F5 0x03BE2 (Monastery Garden Left EP)
0x000D3
0x33A20
0x03BE2

View File

@ -0,0 +1,15 @@
Disabled Locations:
0x17CFB (Outside Tutorial Discard)
0x3C12B (Glass Factory Discard)
0x17CE7 (Desert Discard)
0x17CF0 (Quarry Discard)
0x17D27 (Keep Discard)
0x17D28 (Shipwreck Discard)
0x17D01 (Town Cargo Box Discard)
0x17C71 (Town Rooftop Discard)
0x17CF7 (Theater Discard)
0x17F9B (Jungle Discard)
0x17FA9 (Treehouse Green Bridge Discard)
0x17C42 (Mountainside Discard)
0x17F93 (Mountain Floor 2 Elevator Discard)
0x17FA0 (Treehouse Laser Discard)

View File

@ -0,0 +1,31 @@
Disabled Locations:
0x033D4 (Outside Tutorial Vault)
0x03481 (Outside Tutorial Vault Box)
0x033D0 (Outside Tutorial Vault Door)
0x0CC7B (Desert Vault)
0x0339E (Desert Vault Box)
0x03444 (Desert Vault Door)
0x00AFB (Shipwreck Vault)
0x03535 (Shipwreck Vault Box)
0x17BB4 (Shipwreck Vault Door)
0x15ADD (River Vault)
0x03702 (River Vault Box)
0x15287 (River Vault Door)
0x002A6 (Mountainside Vault)
0x03542 (Mountainside Vault Box)
0x00085 (Mountainside Vault Door)
0x2FAF6 (Tunnels Vault Box)
0x00815 (Theater Video Input)
0x03553 (Theater Tutorial Video)
0x03552 (Theater Desert Video)
0x0354E (Theater Jungle Video)
0x03549 (Theater Challenge Video)
0x0354F (Theater Shipwreck Video)
0x03545 (Theater Mountain Video)
0x03505 (Tutorial Gate Close)
0x339B6 (Theater clipse EP)
0x33A29 (Theater Window EP)
0x33A2A (Theater Door EP)
0x33B06 (Theater Church EP)
0x33A20 (Theater Flowers EP)
0x3352F (Tutorial Gate EP)

View File

@ -0,0 +1,4 @@
Disabled Locations:
0x03549 (Challenge Video)
0x339B6 (Eclipse EP)

View File

@ -0,0 +1,2 @@
Disabled Locations:
0x17FA2 (Mountain Bottom Floor Discard)

View File

@ -0,0 +1,6 @@
Disabled Locations:
0x17FA2 (Mountain Bottom Floor Discard)
0x17F33 (Rock Open Door)
0x00FF8 (Caves Entry Panel)
0x334E1 (Rock Control)
0x2D77D (Caves Entry Door)

View File

@ -0,0 +1,65 @@
Disabled Locations:
0x335AB (Elevator Inside Control)
0x335AC (Elevator Upper Outside Control)
0x3369D (Elevator Lower Outside Control)
0x00190 (Blue Tunnel Right First 1)
0x00558 (Blue Tunnel Right First 2)
0x00567 (Blue Tunnel Right First 3)
0x006FE (Blue Tunnel Right First 4)
0x01A0D (Blue Tunnel Left First 1)
0x008B8 (Blue Tunnel Left Second 1)
0x00973 (Blue Tunnel Left Second 2)
0x0097B (Blue Tunnel Left Second 3)
0x0097D (Blue Tunnel Left Second 4)
0x0097E (Blue Tunnel Left Second 5)
0x00994 (Blue Tunnel Right Second 1)
0x334D5 (Blue Tunnel Right Second 2)
0x00995 (Blue Tunnel Right Second 3)
0x00996 (Blue Tunnel Right Second 4)
0x00998 (Blue Tunnel Right Second 5)
0x009A4 (Blue Tunnel Left Third 1)
0x018A0 (Blue Tunnel Right Third 1)
0x00A72 (Blue Tunnel Left Fourth 1)
0x32962 (First Floor Left)
0x32966 (First Floor Grounded)
0x01A31 (First Floor Middle)
0x00B71 (First Floor Right)
0x288EA (First Wooden Beam)
0x288FC (Second Wooden Beam)
0x289E7 (Third Wooden Beam)
0x288AA (Fourth Wooden Beam)
0x17FB9 (Left Upstairs Single)
0x0A16B (Left Upstairs Left Row 1)
0x0A2CE (Left Upstairs Left Row 2)
0x0A2D7 (Left Upstairs Left Row 3)
0x0A2DD (Left Upstairs Left Row 4)
0x0A2EA (Left Upstairs Left Row 5)
0x0008F (Right Upstairs Left Row 1)
0x0006B (Right Upstairs Left Row 2)
0x0008B (Right Upstairs Left Row 3)
0x0008C (Right Upstairs Left Row 4)
0x0008A (Right Upstairs Left Row 5)
0x00089 (Right Upstairs Left Row 6)
0x0006A (Right Upstairs Left Row 7)
0x0006C (Right Upstairs Left Row 8)
0x00027 (Right Upstairs Right Row 1)
0x00028 (Right Upstairs Right Row 2)
0x00029 (Right Upstairs Right Row 3)
0x021D7 (Mountain Shortcut Panel)
0x2D73F (Mountain Shortcut Door)
0x17CF2 (Swamp Shortcut Panel)
0x2D859 (Swamp Shortcut Door)
0x039B4 (Tunnels Entry Panel)
0x0348A (Tunnels Entry Door)
0x2FAF6 (Vault Box)
0x27732 (Tunnels Theater Shortcut Panel)
0x27739 (Tunnels Theater Shortcut Door)
0x2773D (Tunnels Desert Shortcut Panel)
0x27263 (Tunnels Desert Shortcut Door)
0x09E85 (Tunnels Town Shortcut Panel)
0x09E87 (Tunnels Town Shortcut Door)
0x3397C (Skylight EP)
0x28B30 (Water EP)
0x33A20 (Theater Flowers EP)
0x3352F (Gate EP)

View File

@ -0,0 +1,3 @@
Disabled Locations:
0x0356B (Challenge Vault Box)
0x04D75 (Vault Door)

View File

@ -0,0 +1,27 @@
Disabled Locations:
0x17F93 (Elevator Discard)
0x09EEB (Elevator Control Panel)
0x09FC1 (Giant Puzzle Bottom Left)
0x09F8E (Giant Puzzle Bottom Right)
0x09F01 (Giant Puzzle Top Right)
0x09EFF (Giant Puzzle Top Left)
0x09FDA (Giant Puzzle)
0x09F89 (Exit Door)
0x01983 (Final Room Entry Left)
0x01987 (Final Room Entry Right)
0x0C141 (Final Room Entry Door)
0x0383A (Right Pillar 1)
0x09E56 (Right Pillar 2)
0x09E5A (Right Pillar 3)
0x33961 (Right Pillar 4)
0x0383D (Left Pillar 1)
0x0383F (Left Pillar 2)
0x03859 (Left Pillar 3)
0x339BB (Left Pillar 4)
0x3D9A6 (Elevator Door Closer Left)
0x3D9A7 (Elevator Door Close Right)
0x3C113 (Elevator Entry Left)
0x3C114 (Elevator Entry Right)
0x3D9AA (Back Wall Left)
0x3D9A8 (Back Wall Right)
0x3D9A9 (Elevator Start)

View File

@ -0,0 +1,41 @@
Disabled Locations:
0x17C34 (Mountain Entry Panel)
0x09E39 (Light Bridge Controller)
0x09E7A (Right Row 1)
0x09E71 (Right Row 2)
0x09E72 (Right Row 3)
0x09E69 (Right Row 4)
0x09E7B (Right Row 5)
0x09E73 (Left Row 1)
0x09E75 (Left Row 2)
0x09E78 (Left Row 3)
0x09E79 (Left Row 4)
0x09E6C (Left Row 5)
0x09E6F (Left Row 6)
0x09E6B (Left Row 7)
0x33AF5 (Back Row 1)
0x33AF7 (Back Row 2)
0x09F6E (Back Row 3)
0x09EAD (Trash Pillar 1)
0x09EAF (Trash Pillar 2)
0x09E54 (Mountain Floor 1 Exit Door)
0x09FD3 (Near Row 1)
0x09FD4 (Near Row 2)
0x09FD6 (Near Row 3)
0x09FD7 (Near Row 4)
0x09FD8 (Near Row 5)
0x09FFB (Staircase Near Door)
0x09EDD (Elevator Room Entry Door)
0x09E86 (Light Bridge Controller Near)
0x09FCC (Far Row 1)
0x09FCE (Far Row 2)
0x09FCF (Far Row 3)
0x09FD0 (Far Row 4)
0x09FD1 (Far Row 5)
0x09FD2 (Far Row 6)
0x09E07 (Staircase Far Door)
0x09ED8 (Light Bridge Controller Far)
0x09D63 (Pink Bridge EP)
0x09D5D (Yellow Bridge EP)
0x09D5E (Blue Bridge EP)

View File

@ -0,0 +1,30 @@
Disabled Locations:
0x0356B (Vault Box)
0x04D75 (Vault Door)
0x17F33 (Rock Open Door)
0x00FF8 (Caves Entry Panel)
0x334E1 (Rock Control)
0x2D77D (Caves Entry Door)
0x09DD5 (Lone Pillar)
0x019A5 (Caves Pillar Door)
0x0A16E (Challenge Entry Panel)
0x0A19A (Challenge Entry Door)
0x0A332 (Start Timer)
0x0088E (Small Basic)
0x00BAF (Big Basic)
0x00BF3 (Square)
0x00C09 (Maze Map)
0x00CDB (Stars and Dots)
0x0051F (Symmetry)
0x00524 (Stars and Shapers)
0x00CD4 (Big Basic 2)
0x00CB9 (Choice Squares Right)
0x00CA1 (Choice Squares Middle)
0x00C80 (Choice Squares Left)
0x00C68 (Choice Squares 2 Right)
0x00C59 (Choice Squares 2 Middle)
0x00C22 (Choice Squares 2 Left)
0x034F4 (Maze Hidden 1)
0x034EC (Maze Hidden 2)
0x1C31A (Dots Pillar)
0x1C319 (Squares Pillar)

View File

@ -73,31 +73,34 @@ class StaticWitnessLogicObj:
location_id = line_split.pop(0) location_id = line_split.pop(0)
check_name_full = line_split.pop(0) entity_name_full = line_split.pop(0)
check_hex = check_name_full[0:7] entity_hex = entity_name_full[0:7]
check_name = check_name_full[9:-1] entity_name = entity_name_full[9:-1]
required_panel_lambda = line_split.pop(0) required_panel_lambda = line_split.pop(0)
full_check_name = current_region["shortName"] + " " + check_name full_entity_name = current_region["shortName"] + " " + entity_name
if location_id == "Door" or location_id == "Laser": if location_id == "Door" or location_id == "Laser":
self.CHECKS_BY_HEX[check_hex] = { self.ENTITIES_BY_HEX[entity_hex] = {
"checkName": full_check_name, "checkName": full_entity_name,
"checkHex": check_hex, "entity_hex": entity_hex,
"region": current_region, "region": None,
"id": None, "id": None,
"panelType": location_id "entityType": location_id
} }
self.CHECKS_BY_NAME[self.CHECKS_BY_HEX[check_hex]["checkName"]] = self.CHECKS_BY_HEX[check_hex] self.ENTITIES_BY_NAME[self.ENTITIES_BY_HEX[entity_hex]["checkName"]] = self.ENTITIES_BY_HEX[entity_hex]
self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[check_hex] = { self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[entity_hex] = {
"panels": parse_lambda(required_panel_lambda) "panels": parse_lambda(required_panel_lambda)
} }
current_region["panels"].append(check_hex) # Lasers and Doors exist in a region, but don't have a regional *requirement*
# If a laser is activated, you don't need to physically walk up to it for it to count
# As such, logically, they behave more as if they were part of the "Entry" region
self.ALL_REGIONS_BY_NAME["Entry"]["panels"].append(entity_hex)
continue continue
required_item_lambda = line_split.pop(0) required_item_lambda = line_split.pop(0)
@ -108,18 +111,18 @@ class StaticWitnessLogicObj:
"Laser Pressure Plates", "Laser Pressure Plates",
"Desert Laser Redirect" "Desert Laser Redirect"
} }
is_vault_or_video = "Vault" in check_name or "Video" in check_name is_vault_or_video = "Vault" in entity_name or "Video" in entity_name
if "Discard" in check_name: if "Discard" in entity_name:
location_type = "Discard" location_type = "Discard"
elif is_vault_or_video or check_name == "Tutorial Gate Close": elif is_vault_or_video or entity_name == "Tutorial Gate Close":
location_type = "Vault" location_type = "Vault"
elif check_name in laser_names: elif entity_name in laser_names:
location_type = "Laser" location_type = "Laser"
elif "Obelisk Side" in check_name: elif "Obelisk Side" in entity_name:
location_type = "Obelisk Side" location_type = "Obelisk Side"
full_check_name = check_name full_entity_name = entity_name
elif "EP" in check_name: elif "EP" in entity_name:
location_type = "EP" location_type = "EP"
else: else:
location_type = "General" location_type = "General"
@ -140,32 +143,35 @@ class StaticWitnessLogicObj:
eps_ints = {int(h, 16) for h in eps} eps_ints = {int(h, 16) for h in eps}
self.OBELISK_SIDE_ID_TO_EP_HEXES[int(check_hex, 16)] = eps_ints self.OBELISK_SIDE_ID_TO_EP_HEXES[int(entity_hex, 16)] = eps_ints
for ep_hex in eps: for ep_hex in eps:
self.EP_TO_OBELISK_SIDE[ep_hex] = check_hex self.EP_TO_OBELISK_SIDE[ep_hex] = entity_hex
self.CHECKS_BY_HEX[check_hex] = { self.ENTITIES_BY_HEX[entity_hex] = {
"checkName": full_check_name, "checkName": full_entity_name,
"checkHex": check_hex, "entity_hex": entity_hex,
"region": current_region, "region": current_region,
"id": int(location_id), "id": int(location_id),
"panelType": location_type "entityType": location_type
} }
self.ENTITY_ID_TO_NAME[check_hex] = full_check_name self.ENTITY_ID_TO_NAME[entity_hex] = full_entity_name
self.CHECKS_BY_NAME[self.CHECKS_BY_HEX[check_hex]["checkName"]] = self.CHECKS_BY_HEX[check_hex] self.ENTITIES_BY_NAME[self.ENTITIES_BY_HEX[entity_hex]["checkName"]] = self.ENTITIES_BY_HEX[entity_hex]
self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[check_hex] = requirement self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[entity_hex] = requirement
current_region["panels"].append(check_hex) current_region["panels"].append(entity_hex)
def __init__(self, lines=None):
if lines is None:
lines = get_sigma_normal_logic()
def __init__(self, lines=get_sigma_normal_logic()):
# All regions with a list of panels in them and the connections to other regions, before logic adjustments # All regions with a list of panels in them and the connections to other regions, before logic adjustments
self.ALL_REGIONS_BY_NAME = dict() self.ALL_REGIONS_BY_NAME = dict()
self.STATIC_CONNECTIONS_BY_REGION_NAME = dict() self.STATIC_CONNECTIONS_BY_REGION_NAME = dict()
self.CHECKS_BY_HEX = dict() self.ENTITIES_BY_HEX = dict()
self.CHECKS_BY_NAME = dict() self.ENTITIES_BY_NAME = dict()
self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX = dict() self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX = dict()
self.OBELISK_SIDE_ID_TO_EP_HEXES = dict() self.OBELISK_SIDE_ID_TO_EP_HEXES = dict()
@ -187,8 +193,8 @@ class StaticWitnessLogic:
OBELISK_SIDE_ID_TO_EP_HEXES = dict() OBELISK_SIDE_ID_TO_EP_HEXES = dict()
CHECKS_BY_HEX = dict() ENTITIES_BY_HEX = dict()
CHECKS_BY_NAME = dict() ENTITIES_BY_NAME = dict()
STATIC_DEPENDENT_REQUIREMENTS_BY_HEX = dict() STATIC_DEPENDENT_REQUIREMENTS_BY_HEX = dict()
EP_TO_OBELISK_SIDE = dict() EP_TO_OBELISK_SIDE = dict()
@ -262,8 +268,8 @@ class StaticWitnessLogic:
self.ALL_REGIONS_BY_NAME.update(self.sigma_normal.ALL_REGIONS_BY_NAME) self.ALL_REGIONS_BY_NAME.update(self.sigma_normal.ALL_REGIONS_BY_NAME)
self.STATIC_CONNECTIONS_BY_REGION_NAME.update(self.sigma_normal.STATIC_CONNECTIONS_BY_REGION_NAME) self.STATIC_CONNECTIONS_BY_REGION_NAME.update(self.sigma_normal.STATIC_CONNECTIONS_BY_REGION_NAME)
self.CHECKS_BY_HEX.update(self.sigma_normal.CHECKS_BY_HEX) self.ENTITIES_BY_HEX.update(self.sigma_normal.ENTITIES_BY_HEX)
self.CHECKS_BY_NAME.update(self.sigma_normal.CHECKS_BY_NAME) self.ENTITIES_BY_NAME.update(self.sigma_normal.ENTITIES_BY_NAME)
self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX.update(self.sigma_normal.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX) self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX.update(self.sigma_normal.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX)
self.OBELISK_SIDE_ID_TO_EP_HEXES.update(self.sigma_normal.OBELISK_SIDE_ID_TO_EP_HEXES) self.OBELISK_SIDE_ID_TO_EP_HEXES.update(self.sigma_normal.OBELISK_SIDE_ID_TO_EP_HEXES)

View File

@ -1,6 +1,6 @@
from functools import lru_cache from functools import lru_cache
from math import floor from math import floor
from typing import List, Collection from typing import List, Collection, FrozenSet, Tuple, Dict, Any, Set
from pkgutil import get_data from pkgutil import get_data
@ -33,7 +33,7 @@ def build_weighted_int_list(inputs: Collection[float], total: int) -> List[int]:
return rounded_output return rounded_output
def define_new_region(region_string): def define_new_region(region_string: str) -> Tuple[Dict[str, Any], Set[Tuple[str, FrozenSet[FrozenSet[str]]]]]:
""" """
Returns a region object by parsing a line in the logic file Returns a region object by parsing a line in the logic file
""" """
@ -66,7 +66,7 @@ def define_new_region(region_string):
return region_obj, options return region_obj, options
def parse_lambda(lambda_string): def parse_lambda(lambda_string) -> FrozenSet[FrozenSet[str]]:
""" """
Turns a lambda String literal like this: a | b & c Turns a lambda String literal like this: a | b & c
into a set of sets like this: {{a}, {b, c}} into a set of sets like this: {{a}, {b, c}}
@ -97,86 +97,168 @@ class lazy(object):
@lru_cache(maxsize=None) @lru_cache(maxsize=None)
def get_adjustment_file(adjustment_file): def get_adjustment_file(adjustment_file: str) -> List[str]:
data = get_data(__name__, adjustment_file).decode('utf-8') data = get_data(__name__, adjustment_file).decode('utf-8')
return [line.strip() for line in data.split("\n")] return [line.strip() for line in data.split("\n")]
def get_disable_unrandomized_list(): def get_disable_unrandomized_list() -> List[str]:
return get_adjustment_file("settings/Disable_Unrandomized.txt") return get_adjustment_file("settings/Exclusions/Disable_Unrandomized.txt")
def get_early_utm_list(): def get_early_caves_list() -> List[str]:
return get_adjustment_file("settings/Early_UTM.txt") return get_adjustment_file("settings/Early_Caves.txt")
def get_symbol_shuffle_list(): def get_early_caves_start_list() -> List[str]:
return get_adjustment_file("settings/Early_Caves_Start.txt")
def get_symbol_shuffle_list() -> List[str]:
return get_adjustment_file("settings/Symbol_Shuffle.txt") return get_adjustment_file("settings/Symbol_Shuffle.txt")
def get_door_panel_shuffle_list(): def get_complex_doors() -> List[str]:
return get_adjustment_file("settings/Door_Panel_Shuffle.txt") return get_adjustment_file("settings/Door_Shuffle/Complex_Doors.txt")
def get_doors_simple_list(): def get_simple_doors() -> List[str]:
return get_adjustment_file("settings/Doors_Simple.txt") return get_adjustment_file("settings/Door_Shuffle/Simple_Doors.txt")
def get_doors_complex_list(): def get_complex_door_panels() -> List[str]:
return get_adjustment_file("settings/Doors_Complex.txt") return get_adjustment_file("settings/Door_Shuffle/Complex_Door_Panels.txt")
def get_doors_max_list(): def get_complex_additional_panels() -> List[str]:
return get_adjustment_file("settings/Doors_Max.txt") return get_adjustment_file("settings/Door_Shuffle/Complex_Additional_Panels.txt")
def get_laser_shuffle(): def get_simple_panels() -> List[str]:
return get_adjustment_file("settings/Door_Shuffle/Simple_Panels.txt")
def get_simple_additional_panels() -> List[str]:
return get_adjustment_file("settings/Door_Shuffle/Simple_Additional_Panels.txt")
def get_boat() -> List[str]:
return get_adjustment_file("settings/Door_Shuffle/Boat.txt")
def get_laser_shuffle() -> List[str]:
return get_adjustment_file("settings/Laser_Shuffle.txt") return get_adjustment_file("settings/Laser_Shuffle.txt")
def get_audio_logs(): def get_audio_logs() -> List[str]:
return get_adjustment_file("settings/Audio_Logs.txt") return get_adjustment_file("settings/Audio_Logs.txt")
def get_ep_all_individual(): def get_ep_all_individual() -> List[str]:
return get_adjustment_file("settings/EP_Shuffle/EP_All.txt") return get_adjustment_file("settings/EP_Shuffle/EP_All.txt")
def get_ep_obelisks(): def get_ep_obelisks() -> List[str]:
return get_adjustment_file("settings/EP_Shuffle/EP_Sides.txt") return get_adjustment_file("settings/EP_Shuffle/EP_Sides.txt")
def get_ep_easy(): def get_ep_easy() -> List[str]:
return get_adjustment_file("settings/EP_Shuffle/EP_Easy.txt") return get_adjustment_file("settings/EP_Shuffle/EP_Easy.txt")
def get_ep_no_eclipse(): def get_ep_no_eclipse() -> List[str]:
return get_adjustment_file("settings/EP_Shuffle/EP_NoEclipse.txt") return get_adjustment_file("settings/EP_Shuffle/EP_NoEclipse.txt")
def get_ep_no_caves(): def get_vault_exclusion_list() -> List[str]:
return get_adjustment_file("settings/EP_Shuffle/EP_NoCavesEPs.txt") return get_adjustment_file("settings/Exclusions/Vaults.txt")
def get_ep_no_mountain(): def get_discard_exclusion_list() -> List[str]:
return get_adjustment_file("settings/EP_Shuffle/EP_NoMountainEPs.txt") return get_adjustment_file("settings/Exclusions/Discards.txt")
def get_ep_no_videos(): def get_caves_exclusion_list() -> List[str]:
return get_adjustment_file("settings/EP_Shuffle/EP_Videos.txt") return get_adjustment_file("settings/Postgame/Caves.txt")
def get_sigma_normal_logic(): def get_beyond_challenge_exclusion_list() -> List[str]:
return get_adjustment_file("settings/Postgame/Beyond_Challenge.txt")
def get_bottom_floor_discard_exclusion_list() -> List[str]:
return get_adjustment_file("settings/Postgame/Bottom_Floor_Discard.txt")
def get_bottom_floor_discard_nondoors_exclusion_list() -> List[str]:
return get_adjustment_file("settings/Postgame/Bottom_Floor_Discard_NonDoors.txt")
def get_mountain_upper_exclusion_list() -> List[str]:
return get_adjustment_file("settings/Postgame/Mountain_Upper.txt")
def get_challenge_vault_box_exclusion_list() -> List[str]:
return get_adjustment_file("settings/Postgame/Challenge_Vault_Box.txt")
def get_path_to_challenge_exclusion_list() -> List[str]:
return get_adjustment_file("settings/Postgame/Path_To_Challenge.txt")
def get_mountain_lower_exclusion_list() -> List[str]:
return get_adjustment_file("settings/Postgame/Mountain_Lower.txt")
def get_elevators_come_to_you() -> List[str]:
return get_adjustment_file("settings/Door_Shuffle/Elevators_Come_To_You.txt")
def get_sigma_normal_logic() -> List[str]:
return get_adjustment_file("WitnessLogic.txt") return get_adjustment_file("WitnessLogic.txt")
def get_sigma_expert_logic(): def get_sigma_expert_logic() -> List[str]:
return get_adjustment_file("WitnessLogicExpert.txt") return get_adjustment_file("WitnessLogicExpert.txt")
def get_vanilla_logic(): def get_vanilla_logic() -> List[str]:
return get_adjustment_file("WitnessLogicVanilla.txt") return get_adjustment_file("WitnessLogicVanilla.txt")
def get_items(): def get_items() -> List[str]:
return get_adjustment_file("WitnessItems.txt") return get_adjustment_file("WitnessItems.txt")
def dnf_remove_redundancies(dnf_requirement: FrozenSet[FrozenSet[str]]) -> FrozenSet[FrozenSet[str]]:
"""Removes any redundant terms from a logical formula in disjunctive normal form.
This means removing any terms that are a superset of any other term get removed.
This is possible because of the boolean absorption law: a | (a & b) = a"""
to_remove = set()
for option1 in dnf_requirement:
for option2 in dnf_requirement:
if option2 < option1:
to_remove.add(option1)
return dnf_requirement - to_remove
def dnf_and(dnf_requirements: List[FrozenSet[FrozenSet[str]]]) -> FrozenSet[FrozenSet[str]]:
"""
performs the "and" operator on a list of logical formula in disjunctive normal form, represented as a set of sets.
A logical formula might look like this: {{a, b}, {c, d}}, which would mean "a & b | c & d".
These can be easily and-ed by just using the boolean distributive law: (a | b) & c = a & c | a & b.
"""
current_overall_requirement = frozenset({frozenset()})
for next_dnf_requirement in dnf_requirements:
new_requirement: Set[FrozenSet[str]] = set()
for option1 in current_overall_requirement:
for option2 in next_dnf_requirement:
new_requirement.add(option1 | option2)
current_overall_requirement = frozenset(new_requirement)
return dnf_remove_redundancies(current_overall_requirement)