The Witness: Expert & Hints (#1072)

This commit is contained in:
NewSoupVi 2022-10-09 04:13:52 +02:00 committed by GitHub
parent 7b3ef012b9
commit 3297be7902
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 1638 additions and 136 deletions

View File

@ -7,7 +7,7 @@ from Options import Toggle, DefaultOnToggle, Option, Range, Choice
# "Play the randomizer in hardmode" # "Play the randomizer in hardmode"
# display_name = "Hard Mode" # display_name = "Hard Mode"
class DisableNonRandomizedPuzzles(DefaultOnToggle): 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 be activated as you solve optional puzzles throughout the island."""
@ -59,8 +59,9 @@ class ShuffleVaultBoxes(Toggle):
class ShufflePostgame(Toggle): class ShufflePostgame(Toggle):
"""Adds locations into the pool that are guaranteed to become accessible before or at the same time as your goal. """Adds locations into the pool that are guaranteed to become accessible after or at the same time as your goal.
Use this if you don't play with forfeit on victory.""" Use this if you don't play with forfeit on victory. IMPORTANT NOTE: The possibility of your second
"Progressive Dots" showing up in the Caves is ignored, they will still be considered "postgame" in base settings."""
display_name = "Shuffle Postgame" display_name = "Shuffle Postgame"
@ -75,6 +76,13 @@ class VictoryCondition(Choice):
option_mountain_box_long = 3 option_mountain_box_long = 3
class PuzzleRandomization(Choice):
"""Puzzles in this randomizer are randomly generated. This setting changes the difficulty/types of puzzles."""
display_name = "Puzzle Randomization"
option_sigma_normal = 0
option_sigma_expert = 1
class MountainLasers(Range): class MountainLasers(Range):
"""Sets the amount of beams required to enter the final area.""" """Sets the amount of beams required to enter the final area."""
display_name = "Required Lasers for Mountain Entry" display_name = "Required Lasers for Mountain Entry"
@ -108,8 +116,17 @@ class PuzzleSkipAmount(Range):
default = 5 default = 5
class HintAmount(Range):
"""Adds hints to Audio Logs. Hints will have the same number of duplicates, as many as will fit. Remaining Audio
Logs will have junk hints."""
display_name = "Hints on Audio Logs"
range_start = 0
range_end = 49
default = 10
the_witness_options: Dict[str, type] = { the_witness_options: Dict[str, type] = {
# "hard_mode": HardMode, "puzzle_randomization": PuzzleRandomization,
"shuffle_symbols": ShuffleSymbols, "shuffle_symbols": ShuffleSymbols,
"shuffle_doors": ShuffleDoors, "shuffle_doors": ShuffleDoors,
"shuffle_lasers": ShuffleLasers, "shuffle_lasers": ShuffleLasers,
@ -123,6 +140,7 @@ the_witness_options: Dict[str, type] = {
"early_secret_area": EarlySecretArea, "early_secret_area": EarlySecretArea,
"trap_percentage": TrapPercentage, "trap_percentage": TrapPercentage,
"puzzle_skip_amount": PuzzleSkipAmount, "puzzle_skip_amount": PuzzleSkipAmount,
"hint_amount": HintAmount,
} }

View File

@ -15,6 +15,8 @@ Progression:
71 - Black/White Squares 71 - Black/White Squares
72 - Colored Squares 72 - Colored Squares
80 - Arrows 80 - Arrows
200 - Progressive Dots - Dots,Full Dots
260 - Progressive Stars - Stars,Stars + Same Colored Symbol
Usefuls: Usefuls:
101 - Functioning Brain - False 101 - Functioning Brain - False

View File

@ -120,7 +120,7 @@ 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:
158652 - 0x0CC7B (Vault) - True - Dots & Shapers & Rotated Shapers & Negative Shapers 158652 - 0x0CC7B (Vault) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots
158653 - 0x0339E (Vault Box) - 0x0CC7B - True 158653 - 0x0339E (Vault Box) - 0x0CC7B - True
158602 - 0x17CE7 (Discard) - True - Triangles 158602 - 0x17CE7 (Discard) - True - Triangles
158076 - 0x00698 (Surface 1) - True - True 158076 - 0x00698 (Surface 1) - True - True
@ -338,7 +338,7 @@ Keep 3rd Pressure Plate (Keep) - Keep 4th Pressure Plate - 0x01CD5:
158202 - 0x01CD3 (Pressure Plates 3) - 0x0A3BB - Shapers & Black/White Squares & Colored Squares 158202 - 0x01CD3 (Pressure Plates 3) - 0x0A3BB - Shapers & Black/White Squares & Colored Squares
Door - 0x01CD5 (Pressure Plates 3 Exit) - 0x01CD3 Door - 0x01CD5 (Pressure Plates 3 Exit) - 0x01CD3
Keep 4th Pressure Plate (Keep) - Keep - 0x09E3D - Keep Tower - 0x01D40: Keep 4th Pressure Plate (Keep) - Shadows - 0x09E3D - Keep Tower - 0x01D40:
158203 - 0x0A3AD (Reset Pressure Plates 4) - True - True 158203 - 0x0A3AD (Reset Pressure Plates 4) - True - True
158204 - 0x01D3F (Pressure Plates 4) - 0x0A3AD - Shapers & Dots & Symmetry 158204 - 0x01D3F (Pressure Plates 4) - 0x0A3AD - Shapers & Dots & Symmetry
Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F
@ -358,7 +358,7 @@ Door - 0x04F8F (Tower Shortcut) - 0x0361B
158705 - 0x03317 (Laser Panel Pressure Plates) - 0x01D3F - Shapers & Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Dots 158705 - 0x03317 (Laser Panel Pressure Plates) - 0x01D3F - Shapers & Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Dots
Laser - 0x014BB (Laser) - 0x0360E | 0x03317 Laser - 0x014BB (Laser) - 0x0360E | 0x03317
Outside Monastery (Monastery) - Main Island - True - Main Island - 0x0364E - 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 (Shortcut Panel) - True - True
Door - 0x0364E (Shortcut) - 0x03713 Door - 0x0364E (Shortcut) - 0x03713
158208 - 0x00B10 (Entry Left) - True - True 158208 - 0x00B10 (Entry Left) - True - True
@ -390,11 +390,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
158221 - 0x28AE3 (Vines) - 0x18590 - True 158221 - 0x28AE3 (Vines) - 0x18590 - True
158222 - 0x28938 (Apple Tree) - 0x28AE3 - True 158222 - 0x28938 (Apple Tree) - 0x28AE3 - True
158223 - 0x079DF (Triple Exit) - 0x28938 - True 158223 - 0x079DF (Triple Exit) - 0x28938 - True
158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Dots 158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Dots & Full Dots
158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Dots 158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Dots & Full Dots
158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Dots 158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Dots & Full Dots
158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & 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 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 (Tinted Glass Door Panel) - True - Stars & Rotated Shapers
Door - 0x28A61 (Tinted Glass Door) - 0x28998 Door - 0x28A61 (Tinted Glass Door) - 0x28998
@ -421,7 +421,7 @@ Town Red Rooftop (Town):
158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True 158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True
Town Wooden Rooftop (Town): Town Wooden Rooftop (Town):
158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Dots & Eraser 158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Dots & Eraser & Full Dots
Town Church (Town): Town Church (Town):
158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True 158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True
@ -819,14 +819,14 @@ Mountain Path to Caves (Mountain Bottom Floor) - Mountain Bottom Floor Rock - 0x
Door - 0x2D77D (Caves Entry) - 0x00FF8 Door - 0x2D77D (Caves Entry) - 0x00FF8
158448 - 0x334E1 (Rock Control) - True - True 158448 - 0x334E1 (Rock Control) - True - True
Caves (Caves) - Main Island - 0x2D73F - Main Island - 0x2D859 - Path to Challenge - 0x019A5: Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Path to Challenge - 0x019A5:
158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares 158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares
158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares 158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares
158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots 158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots
158454 - 0x00190 (Blue Tunnel Right First 1) - True - Dots & Triangles 158454 - 0x00190 (Blue Tunnel Right First 1) - True - Dots & Triangles & Full Dots
158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Dots & Triangles 158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Dots & Triangles & Full Dots
158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Dots & Triangles 158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Dots & Triangles & Full Dots
158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Dots & Triangles 158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Dots & Triangles & Full Dots
158458 - 0x01A0D (Blue Tunnel Left First 1) - True - Symmetry & Triangles 158458 - 0x01A0D (Blue Tunnel Left First 1) - True - Symmetry & Triangles
158459 - 0x008B8 (Blue Tunnel Left Second 1) - True - Black/White Squares & Triangles 158459 - 0x008B8 (Blue Tunnel Left Second 1) - True - Black/White Squares & Triangles
158460 - 0x00973 (Blue Tunnel Left Second 2) - 0x008B8 - Stars & Triangles 158460 - 0x00973 (Blue Tunnel Left Second 2) - 0x008B8 - Stars & Triangles
@ -849,12 +849,12 @@ Caves (Caves) - Main Island - 0x2D73F - Main Island - 0x2D859 - Path to Challeng
158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Shapers & Rotated Shapers 158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Shapers & Rotated Shapers
158480 - 0x289E7 (Third Wooden Beam) - True - Stars & Black/White Squares 158480 - 0x289E7 (Third Wooden Beam) - True - Stars & Black/White Squares
158481 - 0x288AA (Fourth Wooden Beam) - True - Stars & Shapers 158481 - 0x288AA (Fourth Wooden Beam) - True - Stars & Shapers
158482 - 0x17FB9 (Left Upstairs Single) - True - Shapers & Dots & Negative Shapers 158482 - 0x17FB9 (Left Upstairs Single) - True - Shapers & Dots & Negative Shapers & Full Dots
158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots 158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full Dots
158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Stars & Dots 158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Stars & Dots & Full Dots
158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Black/White Squares & Stars + Same Colored Symbol & Stars 158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Black/White Squares & Stars + Same Colored Symbol & Stars & Full Dots
158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Shapers & Dots 158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Shapers & Dots & Full Dots
158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Rotated Shapers & Dots 158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Rotated Shapers & Dots & Full Dots
158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots & Invisible Dots 158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots & Invisible Dots
158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots & Invisible Dots 158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots & Invisible Dots
158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots & Invisible Dots 158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots & Invisible Dots
@ -913,7 +913,7 @@ Door - 0x09E87 (Town Shortcut) - 0x09E85
Final Room (Mountain Final Room) - Elevator - 0x339BB & 0x33961: Final Room (Mountain Final Room) - Elevator - 0x339BB & 0x33961:
158522 - 0x0383A (Right Pillar 1) - True - Stars 158522 - 0x0383A (Right Pillar 1) - True - Stars
158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Stars & Dots 158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Stars & Dots
158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots 158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Full Dots
158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry 158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry
158526 - 0x0383D (Left Pillar 1) - True - Dots 158526 - 0x0383D (Left Pillar 1) - True - Dots
158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares 158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares

View File

@ -0,0 +1,932 @@
First Hallway (First Hallway) - Entry - True - Tutorial - 0x00182:
158000 - 0x00064 (Straight) - True - True
158001 - 0x00182 (Bend) - 0x00064 - True
Tutorial (Tutorial) - Outside Tutorial - True:
158002 - 0x00293 (Front Center) - True - Dots
158003 - 0x00295 (Center Left) - 0x00293 - Dots
158004 - 0x002C2 (Front Left) - 0x00295 - Dots
158005 - 0x0A3B5 (Back Left) - True - Full Dots
158006 - 0x0A3B2 (Back Right) - True - Full Dots
158007 - 0x03629 (Gate Open) - 0x002C2 & 0x0A3B5 - Symmetry & Dots
158008 - 0x03505 (Gate Close) - 0x2FAF6 - False
158009 - 0x0C335 (Pillar) - True - Triangles - True
158010 - 0x0C373 (Patio Floor) - 0x0C335 - Dots
Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2:
158650 - 0x033D4 (Vault) - True - Full Dots & Squares & Black/White Squares
158651 - 0x03481 (Vault Box) - 0x033D4 - True
158013 - 0x0005D (Shed Row 1) - True - Full Dots
158014 - 0x0005E (Shed Row 2) - 0x0005D - Full Dots
158015 - 0x0005F (Shed Row 3) - 0x0005E - Full Dots
158016 - 0x00060 (Shed Row 4) - 0x0005F - Full Dots
158017 - 0x00061 (Shed Row 5) - 0x00060 - Full Dots
158018 - 0x018AF (Tree Row 1) - True - Squares & Black/White Squares
158019 - 0x0001B (Tree Row 2) - 0x018AF - Squares & Black/White Squares
158020 - 0x012C9 (Tree Row 3) - 0x0001B - Squares & Black/White Squares
158021 - 0x0001C (Tree Row 4) - 0x012C9 - Squares & Black/White Squares & Dots
158022 - 0x0001D (Tree Row 5) - 0x0001C - Squares & Black/White Squares & Dots
158023 - 0x0001E (Tree Row 6) - 0x0001D - Squares & Black/White Squares & Dots
158024 - 0x0001F (Tree Row 7) - 0x0001E - Squares & Black/White Squares & Full Dots
158025 - 0x00020 (Tree Row 8) - 0x0001F - Squares & Black/White Squares & Full Dots
158026 - 0x00021 (Tree Row 9) - 0x00020 - Squares & Black/White Squares & Full Dots
Door - 0x03BA2 (Outpost Path) - 0x0A3B5
Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170:
158011 - 0x0A171 (Outpost Entry Panel) - True - Full Dots & Triangles
Door - 0x0A170 (Outpost Entry) - 0x0A171
Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3:
158012 - 0x04CA4 (Outpost Exit Panel) - True - Full Dots & Shapers & Rotated Shapers
Door - 0x04CA3 (Outpost Exit) - 0x04CA4
158600 - 0x17CFB (Discard) - True - Arrows
Main Island () - Outside Tutorial - True:
Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29:
158027 - 0x01A54 (Entry Panel) - True - Symmetry
Door - 0x01A29 (Entry) - 0x01A54
158601 - 0x3C12B (Discard) - True - Arrows
Inside Glass Factory (Glass Factory) - Inside Glass Factory Behind Back Wall - 0x0D7ED:
158028 - 0x00086 (Back Wall 1) - True - Symmetry & Dots
158029 - 0x00087 (Back Wall 2) - 0x00086 - Symmetry & Dots
158030 - 0x00059 (Back Wall 3) - 0x00087 - Symmetry & Dots
158031 - 0x00062 (Back Wall 4) - 0x00059 - Symmetry & Dots
158032 - 0x0005C (Back Wall 5) - 0x00062 - Symmetry & Dots
158033 - 0x0008D (Front 1) - 0x0005C - Symmetry
158034 - 0x00081 (Front 2) - 0x0008D - Symmetry
158035 - 0x00083 (Front 3) - 0x00081 - Symmetry
158036 - 0x00084 (Melting 1) - 0x00083 - Symmetry & Dots
158037 - 0x00082 (Melting 2) - 0x00084 - Symmetry & Dots
158038 - 0x0343A (Melting 3) - 0x00082 - Symmetry & Dots
Door - 0x0D7ED (Back Wall) - 0x0005C
Inside Glass Factory Behind Back Wall (Glass Factory) - Boat - 0x17CC8:
158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat
Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E:
158040 - 0x000B0 (Lower Panel) - 0x0343A - Triangles
Door - 0x17F3E (Lower) - 0x000B0
Symmetry Island Lower (Symmetry Island) - Symmetry Island Upper - 0x18269:
158041 - 0x00022 (Right 1) - True - Symmetry & Triangles
158042 - 0x00023 (Right 2) - 0x00022 - Symmetry & Triangles
158043 - 0x00024 (Right 3) - 0x00023 - Symmetry & Triangles
158044 - 0x00025 (Right 4) - 0x00024 - Symmetry & Triangles
158045 - 0x00026 (Right 5) - 0x00025 - Symmetry & Triangles
158046 - 0x0007C (Back 1) - 0x00026 - Symmetry & Colored Dots & Dots
158047 - 0x0007E (Back 2) - 0x0007C - Symmetry & Colored Squares
158048 - 0x00075 (Back 3) - 0x0007E - Symmetry & Stars
158049 - 0x00073 (Back 4) - 0x00075 - Symmetry & Shapers
158050 - 0x00077 (Back 5) - 0x00073 - Symmetry & Triangles
158051 - 0x00079 (Back 6) - 0x00077 - Symmetry & Dots & Colored Dots & Eraser
158052 - 0x00065 (Left 1) - 0x00079 - Symmetry & Colored Dots & Triangles
158053 - 0x0006D (Left 2) - 0x00065 - Symmetry & Colored Dots & Triangles
158054 - 0x00072 (Left 3) - 0x0006D - Symmetry & Colored Dots & Triangles
158055 - 0x0006F (Left 4) - 0x00072 - Symmetry & Colored Dots & Triangles
158056 - 0x00070 (Left 5) - 0x0006F - Symmetry & Colored Dots & Triangles
158057 - 0x00071 (Left 6) - 0x00070 - Symmetry & Triangles
158058 - 0x00076 (Left 7) - 0x00071 - Symmetry & Triangles
158059 - 0x009B8 (Scenery Outlines 1) - True - Symmetry & Environment
158060 - 0x003E8 (Scenery Outlines 2) - 0x009B8 - Symmetry & Environment
158061 - 0x00A15 (Scenery Outlines 3) - 0x003E8 - Symmetry & Environment
158062 - 0x00B53 (Scenery Outlines 4) - 0x00A15 - Symmetry & Environment
158063 - 0x00B8D (Scenery Outlines 5) - 0x00B53 - Symmetry & Environment
158064 - 0x1C349 (Upper Panel) - 0x00076 - Symmetry & Triangles
Door - 0x18269 (Upper) - 0x1C349
Symmetry Island Upper (Symmetry Island):
158065 - 0x00A52 (Yellow 1) - True - Symmetry & Colored Dots
158066 - 0x00A57 (Yellow 2) - 0x00A52 - Symmetry & Colored Dots
158067 - 0x00A5B (Yellow 3) - 0x00A57 - Symmetry & Colored Dots
158068 - 0x00A61 (Blue 1) - 0x00A52 - Symmetry & Colored Dots
158069 - 0x00A64 (Blue 2) - 0x00A61 & 0x00A52 - Symmetry & Colored Dots
158070 - 0x00A68 (Blue 3) - 0x00A64 & 0x00A57 - Symmetry & Colored Dots
158700 - 0x0360D (Laser Panel) - 0x00A68 - True
Laser - 0x00509 (Laser) - 0x0360D - True
Orchard (Orchard) - Main Island - True - Orchard Beyond First Gate - 0x03307:
158071 - 0x00143 (Apple Tree 1) - True - Environment
158072 - 0x0003B (Apple Tree 2) - 0x00143 - Environment
158073 - 0x00055 (Apple Tree 3) - 0x0003B - Environment
Door - 0x03307 (First Gate) - 0x00055
Orchard Beyond First Gate (Orchard) - Orchard End - 0x03313:
158074 - 0x032F7 (Apple Tree 4) - 0x00055 - Environment
158075 - 0x032FF (Apple Tree 5) - 0x032F7 - Environment
Door - 0x03313 (Second Gate) - 0x032FF
Orchard End (Orchard):
Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE:
158652 - 0x0CC7B (Vault) - True - Full Dots & Stars & Stars + Same Colored Symbol & Eraser & Triangles & Shapers & Negative Shapers & Colored Squares
158653 - 0x0339E (Vault Box) - 0x0CC7B - True
158602 - 0x17CE7 (Discard) - True - Arrows
158076 - 0x00698 (Surface 1) - True - Reflection
158077 - 0x0048F (Surface 2) - 0x00698 - Reflection
158078 - 0x09F92 (Surface 3) - 0x0048F & 0x09FA0 - Reflection
158079 - 0x09FA0 (Surface 3 Control) - 0x0048F - True
158080 - 0x0A036 (Surface 4) - 0x09F92 - Reflection
158081 - 0x09DA6 (Surface 5) - 0x09F92 - Reflection
158082 - 0x0A049 (Surface 6) - 0x09F92 - Reflection
158083 - 0x0A053 (Surface 7) - 0x0A036 & 0x09DA6 & 0x0A049 - Reflection
158084 - 0x09F94 (Surface 8) - 0x0A053 & 0x09F86 - Reflection
158085 - 0x09F86 (Surface 8 Control) - 0x0A053 - True
158086 - 0x0C339 (Light Room Entry Panel) - 0x09F94 - True
Door - 0x09FEE (Light Room Entry) - 0x0C339 - True
158701 - 0x03608 (Laser Panel) - 0x012D7 & 0x0A15F - True
Laser - 0x012FB (Laser) - 0x03608
Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3:
158087 - 0x09FAA (Light Control) - True - True
158088 - 0x00422 (Light Room 1) - 0x09FAA - Reflection
158089 - 0x006E3 (Light Room 2) - 0x09FAA - Reflection
158090 - 0x0A02D (Light Room 3) - 0x09FAA & 0x00422 & 0x006E3 - Reflection
Door - 0x0C2C3 (Pond Room Entry) - 0x0A02D
Desert Pond Room (Desert) - Desert Water Levels Room - 0x0A24B:
158091 - 0x00C72 (Pond Room 1) - True - Reflection
158092 - 0x0129D (Pond Room 2) - 0x00C72 - Reflection
158093 - 0x008BB (Pond Room 3) - 0x0129D - Reflection
158094 - 0x0078D (Pond Room 4) - 0x008BB - Reflection
158095 - 0x18313 (Pond Room 5) - 0x0078D - Reflection
158096 - 0x0A249 (Flood Room Entry Panel) - 0x18313 - Reflection
Door - 0x0A24B (Flood Room Entry) - 0x0A249
Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316:
158097 - 0x1C2DF (Reduce Water Level Far Left) - True - True
158098 - 0x1831E (Reduce Water Level Far Right) - True - True
158099 - 0x1C260 (Reduce Water Level Near Left) - True - True
158100 - 0x1831C (Reduce Water Level Near Right) - True - True
158101 - 0x1C2F3 (Raise Water Level Far Left) - True - True
158102 - 0x1831D (Raise Water Level Far Right) - True - True
158103 - 0x1C2B1 (Raise Water Level Near Left) - True - True
158104 - 0x1831B (Raise Water Level Near Right) - True - True
158105 - 0x04D18 (Flood Room 1) - 0x1C260 & 0x1831C - Reflection
158106 - 0x01205 (Flood Room 2) - 0x04D18 & 0x1C260 & 0x1831C - Reflection
158107 - 0x181AB (Flood Room 3) - 0x01205 & 0x1C260 & 0x1831C - Reflection
158108 - 0x0117A (Flood Room 4) - 0x181AB & 0x1C260 & 0x1831C - Reflection
158109 - 0x17ECA (Flood Room 5) - 0x0117A & 0x1C260 & 0x1831C - Reflection
158110 - 0x18076 (Flood Room 6) - 0x17ECA & 0x1C260 & 0x1831C - Reflection
Door - 0x0C316 (Elevator Room Entry) - 0x18076
Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x012FB:
158111 - 0x17C31 (Final Transparent) - True - Reflection
158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - Reflection
158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True
158115 - 0x0A15C (Final Bent 1) - True - Reflection
158116 - 0x09FFF (Final Bent 2) - 0x0A15C - Reflection
158117 - 0x0A15F (Final Bent 3) - 0x09FFF - Reflection
Desert Lowest Level Inbetween Shortcuts (Desert):
Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F:
158118 - 0x09E57 (Entry 1 Panel) - True - Squares & Black/White Squares & Triangles
158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser
158603 - 0x17CF0 (Discard) - True - Arrows
158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Triangles & Stars & Stars + Same Colored Symbol
Laser - 0x01539 (Laser) - 0x03612
Door - 0x09D6F (Entry 1) - 0x09E57
Quarry Between Entrys (Quarry) - Quarry - 0x17C07:
158119 - 0x17C09 (Entry 2 Panel) - True - Shapers & Triangles
Door - 0x17C07 (Entry 2) - 0x17C09
Quarry (Quarry) - Quarry Mill Ground Floor - 0x02010:
158121 - 0x01E5A (Mill Entry Left Panel) - True - Squares & Black/White Squares & Stars & Stars + Same Colored Symbol
158122 - 0x01E59 (Mill Entry Right Panel) - True - Triangles
Door - 0x02010 (Mill Entry) - 0x01E59 & 0x01E5A
Quarry Mill Ground Floor (Quarry Mill) - Quarry - 0x275FF - Quarry Mill Middle Floor - 0x03678 - Outside Quarry - 0x17CE8:
158123 - 0x275ED (Side Exit Panel) - True - True
Door - 0x275FF (Side Exit) - 0x275ED
158124 - 0x03678 (Lower Ramp Control) - True - Dots & Eraser
158145 - 0x17CAC (Roof Exit Panel) - True - True
Door - 0x17CE8 (Roof Exit) - 0x17CAC
Quarry Mill Middle Floor (Quarry Mill) - Quarry Mill Ground Floor - 0x03675 - Quarry Mill Upper Floor - 0x03679:
158125 - 0x00E0C (Lower Row 1) - True - Dots & Eraser
158126 - 0x01489 (Lower Row 2) - 0x00E0C - Triangles & Eraser
158127 - 0x0148A (Lower Row 3) - 0x01489 - Triangles & Eraser
158128 - 0x014D9 (Lower Row 4) - 0x0148A - Triangles & Eraser
158129 - 0x014E7 (Lower Row 5) - 0x014D9 - Triangles & Eraser
158130 - 0x014E8 (Lower Row 6) - 0x014E7 - Triangles & Eraser
158131 - 0x03679 (Lower Lift Control) - 0x014E8 - Dots & Eraser
Quarry Mill Upper Floor (Quarry Mill) - Quarry Mill Middle Floor - 0x03676 & 0x03679 - Quarry Mill Ground Floor - 0x0368A:
158132 - 0x03676 (Upper Ramp 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
158135 - 0x005F1 (Upper Row 2) - 0x00557 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
158136 - 0x00620 (Upper Row 3) - 0x005F1 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
158137 - 0x009F5 (Upper Row 4) - 0x00620 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
158138 - 0x0146C (Upper Row 5) - 0x009F5 - 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
158141 - 0x014E9 (Upper Row 8) - 0x03686 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
158142 - 0x03677 (Stair Control) - True - Squares & Colored Squares & Eraser
Door - 0x0368A (Stairs) - 0x03677
158143 - 0x3C125 (Control Room Left) - 0x0367C - Squares & Black/White Squares & Full Dots & Eraser
158144 - 0x0367C (Control Room Right) - 0x014E9 - Squares & Colored Squares & Triangles & Eraser & Stars & Stars + Same Colored Symbol
Quarry Boathouse (Quarry Boathouse) - Quarry - True - Quarry Boathouse Upper Front - 0x03852 - Quarry Boathouse Behind Staircase - 0x2769B:
158146 - 0x034D4 (Intro Left) - True - Stars & Eraser
158147 - 0x021D5 (Intro Right) - True - Shapers & Eraser
158148 - 0x03852 (Ramp Height Control) - 0x034D4 & 0x021D5 - Rotated Shapers
158166 - 0x17CA6 (Boat Spawn) - True - Boat
Door - 0x2769B (Dock) - 0x17CA6
Door - 0x27163 (Dock Invis Barrier) - 0x17CA6
Quarry Boathouse Behind Staircase (Quarry Boathouse) - Boat - 0x17CA6:
Quarry Boathouse Upper Front (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x17C50:
158149 - 0x021B3 (Front Row 1) - True - Shapers & Eraser & Negative Shapers
158150 - 0x021B4 (Front Row 2) - 0x021B3 - Shapers & Eraser & Negative Shapers
158151 - 0x021B0 (Front Row 3) - 0x021B4 - Shapers & Eraser & Negative Shapers
158152 - 0x021AF (Front Row 4) - 0x021B0 - Shapers & Eraser & Negative Shapers
158153 - 0x021AE (Front Row 5) - 0x021AF - Shapers & Eraser & Negative Shapers
Door - 0x17C50 (First Barrier) - 0x021AE
Quarry Boathouse Upper Middle (Quarry Boathouse) - Quarry Boathouse Upper Back - 0x03858:
158154 - 0x03858 (Ramp Horizontal Control) - True - Shapers & Eraser
Quarry Boathouse Upper Back (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x3865F:
158155 - 0x38663 (Second Barrier Panel) - True - True
Door - 0x3865F (Second Barrier) - 0x38663
158156 - 0x021B5 (Back First Row 1) - True - Stars & Stars + Same Colored Symbol & Eraser
158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars & Stars + Same Colored Symbol & Eraser
158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars & Stars + Same Colored Symbol & Eraser
158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars & Stars + Same Colored Symbol & Eraser
158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars & Stars + Same Colored Symbol & Eraser
158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Eraser & Shapers
158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Eraser & Shapers
158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Eraser & Shapers & Stars & Stars + Same Colored Symbol
158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Eraser & Shapers & Stars & Stars + Same Colored Symbol
158165 - 0x275FA (Hook Control) - True - Shapers & Eraser
158167 - 0x0A3CB (Back Second Row 1) - 0x09DB4 - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol
158168 - 0x0A3CC (Back Second Row 2) - 0x0A3CB - 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
Shadows (Shadows) - Main Island - True - Shadows Ledge - 0x19B24 - Shadows Laser Room - 0x194B2 & 0x19665:
158170 - 0x334DB (Door Timer Outside) - True - True
Door - 0x19B24 (Timed Door) - 0x334DB
158171 - 0x0AC74 (Intro 6) - 0x0A8DC - Shadows Avoid
158172 - 0x0AC7A (Intro 7) - 0x0AC74 - Shadows Avoid
158173 - 0x0A8E0 (Intro 8) - 0x0AC7A - Shadows Avoid
158174 - 0x386FA (Far 1) - 0x0A8E0 - Shadows Avoid & Environment
158175 - 0x1C33F (Far 2) - 0x386FA - Shadows Avoid & Environment
158176 - 0x196E2 (Far 3) - 0x1C33F - Shadows Avoid & Environment
158177 - 0x1972A (Far 4) - 0x196E2 - Shadows Avoid & Environment
158178 - 0x19809 (Far 5) - 0x1972A - Shadows Avoid & Environment
158179 - 0x19806 (Far 6) - 0x19809 - Shadows Avoid & Environment
158180 - 0x196F8 (Far 7) - 0x19806 - Shadows Avoid & Environment
158181 - 0x1972F (Far 8) - 0x196F8 - Shadows Avoid & Environment
Door - 0x194B2 (Laser Entry Right) - 0x1972F
158182 - 0x19797 (Near 1) - 0x0A8E0 - Shadows Follow
158183 - 0x1979A (Near 2) - 0x19797 - Shadows Follow
158184 - 0x197E0 (Near 3) - 0x1979A - Shadows Follow
158185 - 0x197E8 (Near 4) - 0x197E0 - Shadows Follow
158186 - 0x197E5 (Near 5) - 0x197E8 - Shadows Follow
Door - 0x19665 (Laser Entry Left) - 0x197E5
Shadows Ledge (Shadows) - Shadows - 0x1855B - Quarry - 0x19865 & 0x0A2DF:
158187 - 0x334DC (Door Timer Inside) - True - True
158188 - 0x198B5 (Intro 1) - True - Shadows Avoid
158189 - 0x198BD (Intro 2) - 0x198B5 - Shadows Avoid
158190 - 0x198BF (Intro 3) - 0x198BD & 0x334DC & 0x19B24 - Shadows Avoid
Door - 0x19865 (Quarry Barrier) - 0x198BF
Door - 0x0A2DF (Quarry Barrier 2) - 0x198BF
158191 - 0x19771 (Intro 4) - 0x198BF - Shadows Avoid
158192 - 0x0A8DC (Intro 5) - 0x19771 - Shadows Avoid
Door - 0x1855B (Ledge Barrier) - 0x0A8DC
Door - 0x19ADE (Ledge Barrier 2) - 0x0A8DC
Shadows Laser Room (Shadows):
158703 - 0x19650 (Laser Panel) - True - Shadows Avoid & Shadows Follow
Laser - 0x181B3 (Laser) - 0x19650
Keep (Keep) - Main Island - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC:
158193 - 0x00139 (Hedge Maze 1) - True - Environment
158197 - 0x0A3A8 (Reset Pressure Plates 1) - True - True
158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Pressure Plates & Colored Squares & Triangles & Stars & Stars + Same Colored Symbol
Door - 0x01954 (Hedge Maze 1 Exit) - 0x00139
Door - 0x01BEC (Pressure Plates 1 Exit) - 0x033EA
Keep 2nd Maze (Keep) - Keep - 0x018CE - Keep 3rd Maze - True:
Door - 0x018CE (Hedge Maze 2 Shortcut) - 0x00139
158194 - 0x019DC (Hedge Maze 2) - True - Environment
Door - 0x019D8 (Hedge Maze 2 Exit) - 0x019DC
Keep 3rd Maze (Keep) - Keep - 0x019B5 - Keep 4th Maze - 0x019E6:
Door - 0x019B5 (Hedge Maze 3 Shortcut) - 0x019DC
158195 - 0x019E7 (Hedge Maze 3) - True - Environment & Sound
Door - 0x019E6 (Hedge Maze 3 Exit) - 0x019E7
Keep 4th Maze (Keep) - Keep - 0x0199A - Keep Tower - 0x01A0E:
Door - 0x0199A (Hedge Maze 4 Shortcut) - 0x019E7
158196 - 0x01A0F (Hedge Maze 4) - True - Environment
Door - 0x01A0E (Hedge Maze 4 Exit) - 0x01A0F
Keep 2nd Pressure Plate (Keep) - Keep 3rd Pressure Plate - True:
158199 - 0x0A3B9 (Reset Pressure Plates 2) - True - True
158200 - 0x01BE9 (Pressure Plates 2) - PP2 Weirdness - Pressure Plates & Stars & Stars + Same Colored Symbol & Squares & Black/White Squares & Shapers & Rotated Shapers
Door - 0x01BEA (Pressure Plates 2 Exit) - 0x01BE9
Keep 3rd Pressure Plate (Keep) - Keep 4th Pressure Plate - 0x01CD5:
158201 - 0x0A3BB (Reset Pressure Plates 3) - True - True
158202 - 0x01CD3 (Pressure Plates 3) - 0x0A3BB - Pressure Plates & Black/White Squares & Triangles & Shapers & Rotated Shapers
Door - 0x01CD5 (Pressure Plates 3 Exit) - 0x01CD3
Keep 4th Pressure Plate (Keep) - Shadows - 0x09E3D - Keep Tower - 0x01D40:
158203 - 0x0A3AD (Reset Pressure Plates 4) - True - True
158204 - 0x01D3F (Pressure Plates 4) - 0x0A3AD - Pressure Plates & Shapers & Triangles & Stars & Stars + Same Colored Symbol
Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F
158604 - 0x17D27 (Discard) - True - Arrows
158205 - 0x09E49 (Shadows Shortcut Panel) - True - True
Door - 0x09E3D (Shadows Shortcut) - 0x09E49
Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True:
158654 - 0x00AFB (Vault) - True - Symmetry & Sound & Sound Dots & Colored Dots
158655 - 0x03535 (Vault Box) - 0x00AFB - True
158605 - 0x17D28 (Discard) - True - Arrows
Keep Tower (Keep) - Keep - 0x04F8F:
158206 - 0x0361B (Tower Shortcut Panel) - True - True
Door - 0x04F8F (Tower Shortcut) - 0x0361B
158704 - 0x0360E (Laser Panel Hedges) - 0x01A0F & 0x019E7 & 0x019DC & 0x00139 - Environment & Sound
158705 - 0x03317 (Laser Panel Pressure Plates) - 0x01BE9 - Shapers & Rotated Shapers & Triangles & Stars & Stars + Same Colored Symbol & Colored Squares & Black/White Squares
Laser - 0x014BB (Laser) - 0x0360E | 0x03317
Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750:
158207 - 0x03713 (Shortcut Panel) - True - True
Door - 0x0364E (Shortcut) - 0x03713
158208 - 0x00B10 (Entry Left) - True - True
158209 - 0x00C92 (Entry Right) - True - True
Door - 0x0C128 (Entry Inner) - 0x00B10
Door - 0x0C153 (Entry Outer) - 0x00C92
158210 - 0x00290 (Outside 1) - 0x09D9B - Environment
158211 - 0x00038 (Outside 2) - 0x09D9B & 0x00290 - Environment
158212 - 0x00037 (Outside 3) - 0x09D9B & 0x00038 - Environment
Door - 0x03750 (Garden Entry) - 0x00037
158706 - 0x17CA4 (Laser Panel) - 0x193A6 - True
Laser - 0x17C65 (Laser) - 0x17CA4
Inside Monastery (Monastery):
158213 - 0x09D9B (Shutters Control) - True - Dots
158214 - 0x193A7 (Inside 1) - 0x00037 - Environment
158215 - 0x193AA (Inside 2) - 0x193A7 - Environment
158216 - 0x193AB (Inside 3) - 0x193AA - Environment
158217 - 0x193A6 (Inside 4) - 0x193AB - Environment
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:
158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat
158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Squares & Black/White Squares & Shapers & Triangles
Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
158707 - 0x09F98 (Desert Laser Redirect) - True - True
158220 - 0x18590 (Transparent) - True - Symmetry & Environment
158221 - 0x28AE3 (Vines) - 0x18590 - Shadows Follow & Environment
158222 - 0x28938 (Apple Tree) - 0x28AE3 - Environment
158223 - 0x079DF (Triple Exit) - 0x28938 - Shadows Avoid & Environment & Reflection
158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Triangles & Full Dots
158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Triangles & Full Dots
158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Triangles & Full Dots
158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Triangles & Full Dots
158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Triangles & Full Dots
Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1
158225 - 0x28998 (Tinted Glass Door Panel) - True - Stars & Rotated Shapers & Stars + Same Colored Symbol
Door - 0x28A61 (Tinted Glass Door) - 0x28A0D
158226 - 0x28A0D (Church Entry Panel) - 0x28998 - Stars & RGB & Environment
Door - 0x03BB0 (Church Entry) - 0x03C08
158228 - 0x28A79 (Maze Stair Control) - True - Environment
Door - 0x28AA2 (Maze Stairs) - 0x28A79
158241 - 0x17F5F (Windmill Entry Panel) - True - Dots
Door - 0x1845B (Windmill Entry) - 0x17F5F
Town Inside Cargo Box (Town):
158606 - 0x17D01 (Cargo Box Discard) - True - Arrows
Town Maze Rooftop (Town) - Town Red Rooftop - 0x2896A:
158229 - 0x2896A (Maze Rooftop Bridge Control) - True - Shapers
Town Red Rooftop (Town):
158607 - 0x17C71 (Rooftop Discard) - True - Arrows
158230 - 0x28AC7 (Red Rooftop 1) - True - Symmetry & Shapers
158231 - 0x28AC8 (Red Rooftop 2) - 0x28AC7 - Symmetry & Shapers
158232 - 0x28ACA (Red Rooftop 3) - 0x28AC8 - Symmetry & Shapers
158233 - 0x28ACB (Red Rooftop 4) - 0x28ACA - Symmetry & Shapers
158234 - 0x28ACC (Red Rooftop 5) - 0x28ACB - Symmetry & Shapers
158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - Reflection
Town Wooden Rooftop (Town):
158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Triangles & Full Dots & Eraser
Town Church (Town):
158227 - 0x28A69 (Church Lattice) - 0x03BB0 - Environment
RGB House (Town) - RGB Room - 0x2897B:
158242 - 0x034E4 (Sound Room Left) - True - Sound
158243 - 0x034E3 (Sound Room Right) - True - Sound & Sound Dots
Door - 0x2897B (RGB House Stairs) - 0x034E4 & 0x034E3
RGB Room (Town):
158244 - 0x334D8 (RGB Control) - True - Rotated Shapers & RGB & Squares & Colored Squares & Triangles
158245 - 0x03C0C (RGB Room Left) - 0x334D8 - RGB & Squares & Colored Squares & Black/White Squares & Eraser
158246 - 0x03C08 (RGB Room Right) - 0x334D8 & 0x03C0C - RGB & Symmetry & Dots & Colored Dots & Triangles
Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27798 & 0x27799 & 0x2779A & 0x2779C:
Door - 0x27798 (First Door) - 0x28ACC
Door - 0x2779C (Second Door) - 0x28AD9
Door - 0x27799 (Third Door) - 0x28A69
Door - 0x2779A (Fourth Door) - 0x28B39
Town Tower Top (Town):
158708 - 0x032F5 (Laser Panel) - True - True
Laser - 0x032F9 (Laser) - 0x032F5
Windmill Interior (Windmill) - Theater - 0x17F88:
158247 - 0x17D02 (Turn Control) - True - Dots
158248 - 0x17F89 (Theater Entry Panel) - True - Squares & Black/White Squares & Eraser & Triangles
Door - 0x17F88 (Theater Entry) - 0x17F89
Theater (Theater) - Town - 0x0A16D | 0x3CCDF:
158656 - 0x00815 (Video Input) - True - True
158657 - 0x03553 (Tutorial Video) - 0x00815 & 0x03481 - True
158658 - 0x03552 (Desert Video) - 0x00815 & 0x0339E - True
158659 - 0x0354E (Jungle Video) - 0x00815 & 0x03702 - True
158660 - 0x03549 (Challenge Video) - 0x00815 & 0x0356B - True
158661 - 0x0354F (Shipwreck Video) - 0x00815 & 0x03535 - True
158662 - 0x03545 (Mountain Video) - 0x00815 & 0x03542 - True
158249 - 0x0A168 (Exit Left Panel) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Eraser
158250 - 0x33AB2 (Exit Right Panel) - True - Eraser & Triangles & Shapers
Door - 0x0A16D (Exit Left) - 0x0A168
Door - 0x3CCDF (Exit Right) - 0x33AB2
158608 - 0x17CF7 (Discard) - True - Arrows
Jungle (Jungle) - Main Island - True - Outside Jungle River - 0x3873B - Boat - 0x17CDF:
158251 - 0x17CDF (Shore Boat Spawn) - True - Boat
158609 - 0x17F9B (Discard) - True - Triangles
158252 - 0x002C4 (First Row 1) - True - Sound
158253 - 0x00767 (First Row 2) - 0x002C4 - Sound
158254 - 0x002C6 (First Row 3) - 0x00767 - Sound
158255 - 0x0070E (Second Row 1) - 0x002C6 - Sound
158256 - 0x0070F (Second Row 2) - 0x0070E - Sound
158257 - 0x0087D (Second Row 3) - 0x0070F - Sound
158258 - 0x002C7 (Second Row 4) - 0x0087D - Sound
158259 - 0x17CAB (Popup Wall Control) - 0x002C7 - True
Door - 0x1475B (Popup Wall) - 0x17CAB
158260 - 0x0026D (Popup Wall 1) - 0x1475B - Sound & Sound Dots & Symmetry
158261 - 0x0026E (Popup Wall 2) - 0x0026D - Sound & Sound Dots & Symmetry
158262 - 0x0026F (Popup Wall 3) - 0x0026E - Sound & Sound Dots & Symmetry
158263 - 0x00C3F (Popup Wall 4) - 0x0026F - Sound & Sound Dots & Symmetry
158264 - 0x00C41 (Popup Wall 5) - 0x00C3F - Sound & Sound Dots & Symmetry
158265 - 0x014B2 (Popup Wall 6) - 0x00C41 - Sound & Sound Dots & Symmetry
158709 - 0x03616 (Laser Panel) - 0x014B2 - True
Laser - 0x00274 (Laser) - 0x03616
158266 - 0x337FA (Laser Shortcut Panel) - True - True
Door - 0x3873B (Laser Shortcut) - 0x337FA
Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A:
158267 - 0x17CAA (Monastery Shortcut Panel) - True - Environment
Door - 0x0CF2A (Monastery Shortcut) - 0x17CAA
158663 - 0x15ADD (Vault) - True - Environment & Black/White Squares & Dots
158664 - 0x03702 (Vault Box) - 0x15ADD - True
Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4:
158268 - 0x17C2E (Entry Panel) - True - Squares & Black/White Squares & Colored Squares
Door - 0x0C2A4 (Entry) - 0x17C2E
Bunker (Bunker) - Bunker Glass Room - 0x17C79:
158269 - 0x09F7D (Intro Left 1) - True - Squares & Colored Squares
158270 - 0x09FDC (Intro Left 2) - 0x09F7D - Squares & Colored Squares & Black/White Squares
158271 - 0x09FF7 (Intro Left 3) - 0x09FDC - Squares & Colored Squares & Black/White Squares
158272 - 0x09F82 (Intro Left 4) - 0x09FF7 - Squares & Colored Squares & Black/White Squares
158273 - 0x09FF8 (Intro Left 5) - 0x09F82 - Squares & Colored Squares & Black/White Squares
158274 - 0x09D9F (Intro Back 1) - 0x09FF8 - Squares & Colored Squares & Black/White Squares
158275 - 0x09DA1 (Intro Back 2) - 0x09D9F - Squares & Colored Squares
158276 - 0x09DA2 (Intro Back 3) - 0x09DA1 - Squares & Colored Squares
158277 - 0x09DAF (Intro Back 4) - 0x09DA2 - Squares & Colored Squares
158278 - 0x0A099 (Tinted Glass Door Panel) - 0x09DAF - True
Door - 0x17C79 (Tinted Glass Door) - 0x0A099
Bunker Glass Room (Bunker) - Bunker Ultraviolet Room - 0x0C2A3:
158279 - 0x0A010 (Glass Room 1) - True - Squares & Colored Squares & RGB & Environment
158280 - 0x0A01B (Glass Room 2) - 0x0A010 - Squares & Colored Squares & Black/White Squares & RGB & Environment
158281 - 0x0A01F (Glass Room 3) - 0x0A01B - Squares & Colored Squares & Black/White Squares & RGB & Environment
Door - 0x0C2A3 (UV Room Entry) - 0x0A01F
Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D:
158282 - 0x34BC5 (Drop-Down Door Open) - True - True
158283 - 0x34BC6 (Drop-Down Door Close) - 0x34BC5 - True
158284 - 0x17E63 (UV Room 1) - 0x34BC5 - Squares & Colored Squares & RGB & Environment
158285 - 0x17E67 (UV Room 2) - 0x17E63 & 0x34BC6 - Squares & Colored Squares & Black/White Squares & RGB
Door - 0x0A08D (Elevator Room Entry) - 0x17E67
Bunker Elevator Section (Bunker) - Bunker Laser Platform - 0x0A079:
158286 - 0x0A079 (Elevator Control) - True - Squares & Colored Squares & Black/White Squares & RGB
Bunker Laser Platform (Bunker):
158710 - 0x09DE0 (Laser Panel) - True - True
Laser - 0x0C2B2 (Laser) - 0x09DE0
Outside Swamp (Swamp) - Swamp Entry Area - 0x00C1C - Main Island - True:
158287 - 0x0056E (Entry Panel) - True - Rotated Shapers & Black/White Squares & Triangles
Door - 0x00C1C (Entry) - 0x0056E
Swamp Entry Area (Swamp) - Swamp Sliding Bridge - TrueOneWay:
158288 - 0x00469 (Intro Front 1) - True - Black/White Squares & Shapers
158289 - 0x00472 (Intro Front 2) - 0x00469 - Black/White Squares & Shapers & Rotated Shapers
158290 - 0x00262 (Intro Front 3) - 0x00472 - Black/White Squares & Rotated Shapers
158291 - 0x00474 (Intro Front 4) - 0x00262 - Black/White Squares & Shapers & Rotated Shapers
158292 - 0x00553 (Intro Front 5) - 0x00474 - Black/White Squares & Shapers & Rotated Shapers
158293 - 0x0056F (Intro Front 6) - 0x00553 - Black/White Squares & Shapers & Rotated Shapers
158294 - 0x00390 (Intro Back 1) - 0x0056F - Shapers & Triangles
158295 - 0x010CA (Intro Back 2) - 0x00390 - Shapers & Rotated Shapers & Triangles
158296 - 0x00983 (Intro Back 3) - 0x010CA - Rotated Shapers & Triangles
158297 - 0x00984 (Intro Back 4) - 0x00983 - Shapers & Rotated Shapers & Triangles
158298 - 0x00986 (Intro Back 5) - 0x00984 - Shapers & Rotated Shapers & Triangles
158299 - 0x00985 (Intro Back 6) - 0x00986 - Rotated Shapers & Triangles & Black/White Squares
158300 - 0x00987 (Intro Back 7) - 0x00985 - Shapers & Rotated Shapers & Triangles & Black/White Squares
158301 - 0x181A9 (Intro Back 8) - 0x00987 - Rotated Shapers & Triangles & Black/White Squares
Swamp Sliding Bridge (Swamp) - Swamp Entry Area - 0x00609 - Swamp Near Platform - 0x00609:
158302 - 0x00609 (Sliding Bridge) - True - Shapers & Black/White Squares
Swamp Near Platform (Swamp) - Swamp Cyan Underwater - 0x04B7F - Swamp Near Boat - 0x38AE6 - Swamp Between Bridges Near - 0x184B7 - Swamp Sliding Bridge - TrueOneWay:
158313 - 0x00982 (Platform Row 1) - True - Rotated Shapers
158314 - 0x0097F (Platform Row 2) - 0x00982 - Rotated Shapers
158315 - 0x0098F (Platform Row 3) - 0x0097F - Rotated Shapers
158316 - 0x00990 (Platform Row 4) - 0x0098F - Rotated Shapers
Door - 0x184B7 (Between Bridges First Door) - 0x00990
158317 - 0x17C0D (Platform Shortcut Left Panel) - True - Rotated Shapers
158318 - 0x17C0E (Platform Shortcut Right Panel) - True - Rotated Shapers
Door - 0x38AE6 (Platform Shortcut Door) - 0x17C0E
Door - 0x04B7F (Cyan Water Pump) - 0x00006
Swamp Cyan Underwater (Swamp):
158307 - 0x00002 (Cyan Underwater 1) - True - Shapers & Negative Shapers & Black/White Squares
158308 - 0x00004 (Cyan Underwater 2) - 0x00002 - Shapers & Negative Shapers & Triangles
158309 - 0x00005 (Cyan Underwater 3) - 0x00004 - Shapers & Negative Shapers & Triangles & Black/White Squares
158310 - 0x013E6 (Cyan Underwater 4) - 0x00005 - Shapers & Negative Shapers & Triangles & Black/White Squares
158311 - 0x00596 (Cyan Underwater 5) - 0x013E6 - Shapers & Negative Shapers & Triangles & Black/White Squares
158312 - 0x18488 (Cyan Underwater Sliding Bridge Control) - True - Shapers
Swamp Between Bridges Near (Swamp) - Swamp Between Bridges Far - 0x18507:
158303 - 0x00999 (Between Bridges Near Row 1) - 0x00990 - Rotated Shapers
158304 - 0x0099D (Between Bridges Near Row 2) - 0x00999 - Rotated Shapers
158305 - 0x009A0 (Between Bridges Near Row 3) - 0x0099D - Rotated Shapers
158306 - 0x009A1 (Between Bridges Near Row 4) - 0x009A0 - Rotated Shapers
Door - 0x18507 (Between Bridges Second Door) - 0x009A1
Swamp Between Bridges Far (Swamp) - Swamp Red Underwater - 0x183F2 - Swamp Rotating Bridge - TrueOneWay:
158319 - 0x00007 (Between Bridges Far Row 1) - 0x009A1 - Rotated Shapers & Full Dots
158320 - 0x00008 (Between Bridges Far Row 2) - 0x00007 - Rotated Shapers & Full Dots
158321 - 0x00009 (Between Bridges Far Row 3) - 0x00008 - Rotated Shapers & Shapers & Full Dots
158322 - 0x0000A (Between Bridges Far Row 4) - 0x00009 - Rotated Shapers & Shapers & Full Dots
Door - 0x183F2 (Red Water Pump) - 0x00596
Swamp Red Underwater (Swamp) - Swamp Maze - 0x014D1:
158323 - 0x00001 (Red Underwater 1) - True - Shapers & Negative Shapers & Full Dots
158324 - 0x014D2 (Red Underwater 2) - True - Shapers & Negative Shapers & Full Dots
158325 - 0x014D4 (Red Underwater 3) - True - Shapers & Negative Shapers & Full Dots
158326 - 0x014D1 (Red Underwater 4) - True - Shapers & Negative Shapers & Full Dots
Door - 0x305D5 (Red Underwater Exit) - 0x014D1
Swamp Rotating Bridge (Swamp) - Swamp Between Bridges Far - 0x181F5 - Swamp Near Boat - 0x181F5 - Swamp Purple Area - 0x181F5:
158327 - 0x181F5 (Rotating Bridge) - True - Rotated Shapers & Shapers & Stars & Colored Squares & Triangles & Stars + Same Colored Symbol
Swamp Near Boat (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Blue Underwater - 0x18482:
158328 - 0x09DB8 (Boat Spawn) - True - Boat
158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Shapers & Full Dots
158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers & Shapers & Full Dots
158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Shapers & Full Dots
158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Shapers & Full Dots
158339 - 0x17E2B (Long Bridge Control) - True - Rotated Shapers & Shapers
Door - 0x18482 (Blue Water Pump) - 0x00E3A
Swamp Purple Area (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Purple Underwater - 0x0A1D6:
Door - 0x0A1D6 (Purple Water Pump) - 0x00E3A
Swamp Purple Underwater (Swamp):
158333 - 0x009A6 (Purple Underwater) - True - Shapers & Triangles & Black/White Squares & Rotated Shapers
Swamp Blue Underwater (Swamp):
158334 - 0x009AB (Blue Underwater 1) - True - Shapers & Negative Shapers
158335 - 0x009AD (Blue Underwater 2) - 0x009AB - Shapers & Negative Shapers
158336 - 0x009AE (Blue Underwater 3) - 0x009AD - Shapers & Negative Shapers
158337 - 0x009AF (Blue Underwater 4) - 0x009AE - Shapers & Negative Shapers
158338 - 0x00006 (Blue Underwater 5) - 0x009AF - Shapers & Negative Shapers
Swamp Maze (Swamp) - Swamp Laser Area - 0x17C0A & 0x17E07:
158340 - 0x17C0A (Maze Control) - True - Shapers & Negative Shapers & Rotated Shapers & Environment
158112 - 0x17E07 (Maze Control Other Side) - True - Shapers & Negative Shapers & Rotated Shapers & Environment
Swamp Laser Area (Swamp) - Outside Swamp - 0x2D880:
158711 - 0x03615 (Laser Panel) - True - True
Laser - 0x00BF6 (Laser) - 0x03615
158341 - 0x17C05 (Laser Shortcut Left Panel) - True - Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol
158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Rotated Shapers
Door - 0x2D880 (Laser Shortcut) - 0x17C02
Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309:
158343 - 0x17C95 (Boat Spawn) - True - Boat
158344 - 0x0288C (First Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles
Door - 0x0C309 (First Door) - 0x0288C
Treehouse Between Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310:
158345 - 0x02886 (Second Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles
Door - 0x0C310 (Second Door) - 0x02886
Treehouse Yellow Bridge (Treehouse) - Treehouse After Yellow Bridge - 0x17DC4:
158346 - 0x17D72 (Yellow Bridge 1) - True - Stars & Stars + Same Colored Symbol & Triangles
158347 - 0x17D8F (Yellow Bridge 2) - 0x17D72 - Stars & Stars + Same Colored Symbol & Triangles
158348 - 0x17D74 (Yellow Bridge 3) - 0x17D8F - Stars & Stars + Same Colored Symbol & Triangles
158349 - 0x17DAC (Yellow Bridge 4) - 0x17D74 - Stars & Stars + Same Colored Symbol & Triangles
158350 - 0x17D9E (Yellow Bridge 5) - 0x17DAC - Stars & Stars + Same Colored Symbol & Triangles
158351 - 0x17DB9 (Yellow Bridge 6) - 0x17D9E - Stars & Stars + Same Colored Symbol & Triangles
158352 - 0x17D9C (Yellow Bridge 7) - 0x17DB9 - Stars & Stars + Same Colored Symbol & Triangles
158353 - 0x17DC2 (Yellow Bridge 8) - 0x17D9C - Stars & Stars + Same Colored Symbol & Triangles
158354 - 0x17DC4 (Yellow Bridge 9) - 0x17DC2 - Stars & Stars + Same Colored Symbol & Triangles
Treehouse After Yellow Bridge (Treehouse) - Treehouse Junction - 0x0A181:
158355 - 0x0A182 (Third Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles & Colored Squares
Door - 0x0A181 (Third Door) - 0x0A182
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
Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x17D6C:
158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Full Dots
158358 - 0x17DC7 (First Purple Bridge 2) - 0x17DC8 - Stars & Full Dots
158359 - 0x17CE4 (First Purple Bridge 3) - 0x17DC7 - Stars & Full Dots
158360 - 0x17D2D (First Purple Bridge 4) - 0x17CE4 - Stars & Full Dots
158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Full Dots
Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2:
158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars & Stars + Same Colored Symbol & Triangles
158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars & Stars + Same Colored Symbol & Triangles
158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars & Stars + Same Colored Symbol & Triangles
158394 - 0x17CE3 (Right Orange Bridge 4 & Directional) - 0x17D8C - Triangles
158395 - 0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars & Stars + Same Colored Symbol & Triangles
158396 - 0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars & Stars + Same Colored Symbol & Triangles
158397 - 0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars & Stars + Same Colored Symbol & Triangles
158398 - 0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars & Stars + Same Colored Symbol & Triangles
158399 - 0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars & Stars + Same Colored Symbol & Triangles
158400 - 0x17DB7 (Right Orange Bridge 10 & Directional) - 0x17D8E - Triangles
158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - 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:
158404 - 0x037FF (Bridge Control) - True - Stars
Door - 0x0C32D (Drawbridge) - 0x037FF
Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6:
158362 - 0x17D9B (Second Purple Bridge 1) - True - Stars & Black/White Squares & Triangles & Stars + Same Colored Symbol
158363 - 0x17D99 (Second Purple Bridge 2) - 0x17D9B - Stars & Black/White Squares & Triangles & Stars + Same Colored Symbol
158364 - 0x17DAA (Second Purple Bridge 3) - 0x17D99 - Stars & Black/White Squares & Triangles & Stars + Same Colored Symbol
158365 - 0x17D97 (Second Purple Bridge 4) - 0x17DAA - Stars & Black/White Squares & Colored Squares & Triangles & Stars + Same Colored Symbol
158366 - 0x17BDF (Second Purple Bridge 5) - 0x17D97 - Stars & Colored Squares & Triangles & Stars + Same Colored Symbol
158367 - 0x17D91 (Second Purple Bridge 6) - 0x17BDF - Stars & Colored Squares & Triangles & Stars + Same Colored Symbol
158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Colored Squares & Triangles & Stars + Same Colored Symbol
Treehouse Left Orange Bridge (Treehouse) - Treehouse Laser Room Front Platform - 0x17DDE - Treehouse Laser Room Back Platform - 0x17DDB:
158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC & 0x03613 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Triangles
158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Black/White Squares & Stars + Same Colored Symbol
158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Black/White Squares & Stars + Same Colored Symbol
Treehouse Green Bridge (Treehouse):
158369 - 0x17E3C (Green Bridge 1) - True - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles
158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles
158610 - 0x17FA9 (Green Bridge Discard) - 0x17E61 - Arrows
Treehouse Laser Room Front Platform (Treehouse) - Treehouse Laser Room - 0x0C323:
Door - 0x0C323 (Laser House Entry) - 0x17DA2 & 0x2700B & 0x17DEC
Treehouse Laser Room Back Platform (Treehouse):
158611 - 0x17FA0 (Laser Discard) - True - Arrows
Treehouse Laser Room (Treehouse):
158712 - 0x03613 (Laser Panel) - True - True
158403 - 0x17CBC (Laser House Door Timer Inside) - True - True
Laser - 0x028A4 (Laser) - 0x03613
Mountainside (Mountainside) - Main Island - True - Mountaintop - True:
158612 - 0x17C42 (Discard) - True - Arrows
158665 - 0x002A6 (Vault) - True - Symmetry & Colored Squares & Triangles & Stars & Stars + Same Colored Symbol
158666 - 0x03542 (Vault Box) - 0x002A6 - True
Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34:
158405 - 0x0042D (River Shape) - True - True
158406 - 0x09F7F (Box Short) - 7 Lasers - True
158407 - 0x17C34 (Trap Door Triple Exit) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol & Triangles
158800 - 0xFFF00 (Box Long) - 7 Lasers & 11 Lasers & 0x17C34 - True
Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39:
158408 - 0x09E39 (Light Bridge Controller) - True - Eraser & Triangles
Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots
158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Triangles
158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Triangles & Shapers
158412 - 0x09E69 (Right Row 4) - 0x09E72 - Stars & Black/White Squares & Stars + Same Colored Symbol & Rotated Shapers
158413 - 0x09E7B (Right Row 5) - 0x09E69 - Stars & Black/White Squares & Stars + Same Colored Symbol & Eraser & Dots & Triangles & Shapers
158414 - 0x09E73 (Left Row 1) - True - Black/White Squares & Triangles
158415 - 0x09E75 (Left Row 2) - 0x09E73 - Black/White Squares & Shapers & Rotated Shapers
158416 - 0x09E78 (Left Row 3) - 0x09E75 - Stars & Triangles & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158417 - 0x09E79 (Left Row 4) - 0x09E78 - Stars & Colored Squares & Stars + Same Colored Symbol & Triangles
158418 - 0x09E6C (Left Row 5) - 0x09E79 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
158419 - 0x09E6F (Left Row 6) - 0x09E6C - Symmetry & Stars & Colored Squares & Black/White Squares & Stars + Same Colored Symbol & Symmetry
158420 - 0x09E6B (Left Row 7) - 0x09E6F - Symmetry & Full Dots & Triangles
158421 - 0x33AF5 (Back Row 1) - True - Symmetry & Black/White Squares & Triangles
158422 - 0x33AF7 (Back Row 2) - 0x33AF5 - Symmetry & Stars & Triangles & 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
158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Rotated Shapers & Triangles
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:
158426 - 0x09FD3 (Near Row 1) - True - Stars & Colored Squares & Stars + Same Colored Symbol
158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars & Triangles & Stars + Same Colored Symbol
158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars
158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser
Door - 0x09FFB (Staircase Near) - 0x09FD8
Mountain Floor 2 Blue Bridge (Mountain Floor 2) - Mountain Floor 2 Beyond Bridge - TrueOneWay - Mountain Floor 2 At Door - TrueOneWay:
Mountain Floor 2 At Door (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EDD:
Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86
Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2):
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:
158432 - 0x09FCC (Far Row 1) - True - Triangles
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
158435 - 0x09FD0 (Far Row 4) - 0x09FCF - Rotated Shapers & Negative Shapers
158436 - 0x09FD1 (Far Row 5) - 0x09FD0 - Dots
158437 - 0x09FD2 (Far Row 6) - 0x09FD1 - Rotated Shapers
Door - 0x09E07 (Staircase Far) - 0x09FD2
Mountain Floor 2 Light Bridge Room Far (Mountain Floor 2):
158438 - 0x09ED8 (Light Bridge Controller Far) - True - Shapers & Dots
Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator - TrueOneWay:
158613 - 0x17F93 (Elevator Discard) - True - Arrows
Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Third Layer - 0x09EEB:
158439 - 0x09EEB (Elevator Control Panel) - True - Dots
Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89:
158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Negative Shapers
158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Shapers & Eraser
158442 - 0x09F01 (Giant Puzzle Top Right) - True - Shapers & Eraser
158443 - 0x09EFF (Giant Puzzle Top Left) - True - Shapers & Eraser
158444 - 0x09FDA (Giant Puzzle) - 0x09FC1 & 0x09F8E & 0x09F01 & 0x09EFF - Shapers & Symmetry
Door - 0x09F89 (Exit) - 0x09FDA
Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Bottom Floor Rock - 0x17FA2 - Final Room - 0x0C141:
158614 - 0x17FA2 (Discard) - 0xFFF00 - Arrows
158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars
158446 - 0x01987 (Final Room Entry Right) - True - Squares & Colored Squares & Dots
Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987
Mountain Bottom Floor Rock (Mountain Bottom Floor) - Mountain Bottom Floor - 0x17F33 - Mountain Path to Caves - 0x17F33:
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
Door - 0x2D77D (Caves Entry) - 0x00FF8
158448 - 0x334E1 (Rock Control) - True - True
Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Path to Challenge - 0x019A5:
158451 - 0x335AB (Elevator Inside Control) - True - Dots & Squares & Black/White Squares
158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Squares & Black/White Squares
158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Squares & Black/White Squares & Dots
158454 - 0x00190 (Blue Tunnel Right First 1) - True - Arrows
158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Arrows
158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Arrows
158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Arrows
158458 - 0x01A0D (Blue Tunnel Left First 1) - True - Arrows & Symmetry
158459 - 0x008B8 (Blue Tunnel Left Second 1) - True - Arrows & Triangles
158460 - 0x00973 (Blue Tunnel Left Second 2) - 0x008B8 - Arrows & Triangles
158461 - 0x0097B (Blue Tunnel Left Second 3) - 0x00973 - Arrows & Triangles
158462 - 0x0097D (Blue Tunnel Left Second 4) - 0x0097B - Arrows & Triangles
158463 - 0x0097E (Blue Tunnel Left Second 5) - 0x0097D - Arrows & Triangles
158464 - 0x00994 (Blue Tunnel Right Second 1) - True - Arrows & Shapers & Rotated Shapers
158465 - 0x334D5 (Blue Tunnel Right Second 2) - 0x00994 - Arrows & Rotated Shapers
158466 - 0x00995 (Blue Tunnel Right Second 3) - 0x334D5 - Arrows & Shapers & Rotated Shapers
158467 - 0x00996 (Blue Tunnel Right Second 4) - 0x00995 - Arrows & Shapers & Rotated Shapers
158468 - 0x00998 (Blue Tunnel Right Second 5) - 0x00996 - Arrows & Shapers
158469 - 0x009A4 (Blue Tunnel Left Third 1) - True - Arrows & Stars
158470 - 0x018A0 (Blue Tunnel Right Third 1) - True - Arrows & Symmetry
158471 - 0x00A72 (Blue Tunnel Left Fourth 1) - True - Arrows & Shapers & Negative Shapers
158472 - 0x32962 (First Floor Left) - True - Full Dots & Rotated Shapers
158473 - 0x32966 (First Floor Grounded) - True - Stars & Triangles & Rotated Shapers & Black/White Squares & Stars + Same Colored Symbol
158474 - 0x01A31 (First Floor Middle) - True - Stars
158475 - 0x00B71 (First Floor Right) - True - Full Dots & Eraser & Stars & Stars + Same Colored Symbol & Colored Squares & Shapers & Negative Shapers
158478 - 0x288EA (First Wooden Beam) - True - Stars
158479 - 0x288FC (Second Wooden Beam) - True - Shapers & Eraser
158480 - 0x289E7 (Third Wooden Beam) - True - Eraser & Triangles
158481 - 0x288AA (Fourth Wooden Beam) - True - Full Dots & Negative Shapers & Shapers
158482 - 0x17FB9 (Left Upstairs Single) - True - Full Dots & Arrows & Black/White Squares
158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Full Dots & Arrows
158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Full Dots & Arrows
158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Full Dots & Arrows
158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Full Dots & Arrows
158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Full Dots & Arrows
158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots & Black/White Squares & Colored Squares
158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Triangles
158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Stars & Stars + Same Colored Symbol & Shapers & Rotated Shapers
158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Stars & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Eraser & Triangles
158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Shapers & Negative Shapers & Dots
158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Stars & Dots
158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Stars & Stars + Same Colored Symbol & Eraser
158496 - 0x00027 (Right Upstairs Right Row 1) - True - Colored Squares & Black/White Squares & Eraser
158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Shapers & Symmetry
158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Symmetry & Triangles & Eraser
158476 - 0x09DD5 (Lone Pillar) - True - Arrows
Door - 0x019A5 (Pillar Door) - 0x09DD5
158449 - 0x021D7 (Mountain Shortcut Panel) - True - Stars & Stars + Same Colored Symbol & Triangles & Eraser
Door - 0x2D73F (Mountain Shortcut Door) - 0x021D7
158450 - 0x17CF2 (Swamp Shortcut Panel) - True - Arrows
Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2
Path to Challenge (Caves) - Challenge - 0x0A19A:
158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Arrows & Stars + Same Colored Symbol
Door - 0x0A19A (Challenge Entry) - 0x0A16E
Challenge (Challenge) - Tunnels - 0x0348A:
158499 - 0x0A332 (Start Timer) - 11 Lasers - True
158500 - 0x0088E (Small Basic) - 0x0A332 - True
158501 - 0x00BAF (Big Basic) - 0x0088E - True
158502 - 0x00BF3 (Square) - 0x00BAF - Squares & Black/White Squares
158503 - 0x00C09 (Maze Map) - 0x00BF3 - Dots
158504 - 0x00CDB (Stars and Dots) - 0x00C09 - Stars & Dots
158505 - 0x0051F (Symmetry) - 0x00CDB - Symmetry & Colored Dots & Dots
158506 - 0x00524 (Stars and Shapers) - 0x0051F - Stars & Shapers
158507 - 0x00CD4 (Big Basic 2) - 0x00524 - True
158508 - 0x00CB9 (Choice Squares Right) - 0x00CD4 - Squares & Black/White Squares
158509 - 0x00CA1 (Choice Squares Middle) - 0x00CD4 - Squares & Black/White Squares
158510 - 0x00C80 (Choice Squares Left) - 0x00CD4 - Squares & Black/White Squares
158511 - 0x00C68 (Choice Squares 2 Right) - 0x00CB9 | 0x00CA1 | 0x00C80 - Squares & Black/White Squares & Colored Squares
158512 - 0x00C59 (Choice Squares 2 Middle) - 0x00CB9 | 0x00CA1 | 0x00C80 - Squares & Black/White Squares & Colored Squares
158513 - 0x00C22 (Choice Squares 2 Left) - 0x00CB9 | 0x00CA1 | 0x00C80 - Squares & Black/White Squares & Colored Squares
158514 - 0x034F4 (Maze Hidden 1) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles
158515 - 0x034EC (Maze Hidden 2) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles
158516 - 0x1C31A (Dots Pillar) - 0x034F4 & 0x034EC - Dots & Symmetry & Pillar
158517 - 0x1C319 (Squares Pillar) - 0x034F4 & 0x034EC - Squares & Black/White Squares & Symmetry & Pillar
158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True
158518 - 0x039B4 (Tunnels Entry Panel) - True - Arrows
Door - 0x0348A (Tunnels Entry) - 0x039B4
Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87:
158668 - 0x2FAF6 (Vault Box) - True - True
158519 - 0x27732 (Theater Shortcut Panel) - True - True
Door - 0x27739 (Theater Shortcut) - 0x27732
158520 - 0x2773D (Desert Shortcut Panel) - True - True
Door - 0x27263 (Desert Shortcut) - 0x2773D
158521 - 0x09E85 (Town Shortcut Panel) - True - Arrows
Door - 0x09E87 (Town Shortcut) - 0x09E85
Final Room (Mountain Final Room) - Elevator - 0x339BB & 0x33961:
158522 - 0x0383A (Right Pillar 1) - True - Stars & Eraser & Triangles & Stars + Same Colored Symbol
158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Full Dots & Triangles
158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol
158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Eraser & Symmetry & Stars & Stars + Same Colored Symbols & Negative Shapers & Shapers
158526 - 0x0383D (Left Pillar 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol
158527 - 0x0383F (Left Pillar 2) - 0x0383D - Triangles
158528 - 0x03859 (Left Pillar 3) - 0x0383F - Symmetry & Shapers & Black/White Squares
158529 - 0x339BB (Left Pillar 4) - 0x03859 - Symmetry & Black/White Squares & Stars & Stars + Same Colored Symbol & Triangles
Elevator (Mountain Final Room):
158530 - 0x3D9A6 (Elevator Door Closer Left) - True - True
158531 - 0x3D9A7 (Elevator Door Close Right) - True - True
158532 - 0x3C113 (Elevator Entry Left) - 0x3D9A6 | 0x3D9A7 - True
158533 - 0x3C114 (Elevator Entry Right) - 0x3D9A6 | 0x3D9A7 - True
158534 - 0x3D9AA (Back Wall Left) - 0x3D9A6 | 0x3D9A7 - True
158535 - 0x3D9A8 (Back Wall Right) - 0x3D9A6 | 0x3D9A7 - True
158536 - 0x3D9A9 (Elevator Start) - 0x3D9AA | 0x3D9A8 - 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:

View File

@ -1,18 +1,20 @@
""" """
Archipelago init file for The Witness Archipelago init file for The Witness
""" """
import typing import typing
from BaseClasses import Region, RegionType, Location, MultiWorld, Item, Entrance, Tutorial, ItemClassification from BaseClasses import Region, RegionType, Location, MultiWorld, Item, Entrance, Tutorial, ItemClassification
from .hints import get_always_hint_locations, get_always_hint_items, get_priority_hint_locations, \
get_priority_hint_items, make_hints, generate_joke_hints
from ..AutoWorld import World, WebWorld from ..AutoWorld import World, WebWorld
from .player_logic import StaticWitnessLogic, WitnessPlayerLogic from .player_logic import WitnessPlayerLogic
from .static_logic import StaticWitnessLogic
from .locations import WitnessPlayerLocations, StaticWitnessLocations from .locations import WitnessPlayerLocations, StaticWitnessLocations
from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems
from .rules import set_rules 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 .Options import is_option_enabled, the_witness_options, get_option_value
from .utils import best_junk_to_add_based_on_weights from .utils import best_junk_to_add_based_on_weights, get_audio_logs
from logging import warning from logging import warning
@ -36,7 +38,7 @@ class WitnessWorld(World):
""" """
game = "The Witness" game = "The Witness"
topology_present = False topology_present = False
data_version = 7 data_version = 8
static_logic = StaticWitnessLogic() static_logic = StaticWitnessLogic()
static_locat = StaticWitnessLocations() static_locat = StaticWitnessLocations()
@ -59,6 +61,8 @@ class WitnessWorld(World):
'door_hexes': self.items.DOORS, 'door_hexes': self.items.DOORS,
'symbols_not_in_the_game': self.items.SYMBOLS_NOT_IN_THE_GAME, 'symbols_not_in_the_game': self.items.SYMBOLS_NOT_IN_THE_GAME,
'disabled_panels': self.player_logic.COMPLETELY_DISABLED_CHECKS, 'disabled_panels': self.player_logic.COMPLETELY_DISABLED_CHECKS,
'log_ids_to_hints': self.log_ids_to_hints,
'progressive_item_lists': self.items.MULTI_LISTS_BY_CODE
} }
def generate_early(self): def generate_early(self):
@ -77,6 +81,8 @@ class WitnessWorld(World):
self.items = WitnessPlayerItems(self.locat, self.world, self.player, self.player_logic) self.items = WitnessPlayerItems(self.locat, self.world, self.player, self.player_logic)
self.regio = WitnessRegions(self.locat) self.regio = WitnessRegions(self.locat)
self.log_ids_to_hints = dict()
self.junk_items_created = {key: 0 for key in self.items.JUNK_WEIGHTS.keys()} self.junk_items_created = {key: 0 for key in self.items.JUNK_WEIGHTS.keys()}
def generate_basic(self): def generate_basic(self):
@ -84,8 +90,9 @@ class WitnessWorld(World):
pool = [] pool = []
items_by_name = dict() items_by_name = dict()
for item in self.items.ITEM_TABLE: for item in self.items.ITEM_TABLE:
witness_item = self.create_item(item) for i in range(0, self.items.PROG_ITEM_AMOUNTS[item]):
if item in self.items.PROGRESSION_TABLE: if item in self.items.PROGRESSION_TABLE:
witness_item = self.create_item(item)
pool.append(witness_item) pool.append(witness_item)
items_by_name[item] = witness_item items_by_name[item] = witness_item
@ -94,7 +101,7 @@ class WitnessWorld(World):
# Put good item on first check if symbol shuffle is on # Put good item on first check if symbol shuffle is on
symbols = is_option_enabled(self.world, self.player, "shuffle_symbols") symbols = is_option_enabled(self.world, self.player, "shuffle_symbols")
if symbols: if symbols and get_option_value(self.world, self.player, "puzzle_randomization") != 1:
random_good_item = self.world.random.choice(self.items.GOOD_ITEMS) random_good_item = self.world.random.choice(self.items.GOOD_ITEMS)
first_check = self.world.get_location( first_check = self.world.get_location(
@ -138,9 +145,39 @@ class WitnessWorld(World):
set_rules(self.world, self.player, self.player_logic, self.locat) set_rules(self.world, self.player, self.player_logic, self.locat)
def fill_slot_data(self) -> dict: def fill_slot_data(self) -> dict:
slot_data = self._get_slot_data() hint_amount = get_option_value(self.world, self.player, "hint_amount")
slot_data["hard_mode"] = False credits_hint = ("This Randomizer", "is brought to you by", "NewSoupVi, Jarno, jbzdarkid, sigma144", -1)
audio_logs = get_audio_logs().copy()
if hint_amount != 0:
generated_hints = make_hints(self.world, self.player, hint_amount)
self.world.random.shuffle(audio_logs)
duplicates = len(audio_logs) // hint_amount
for _ in range(0, hint_amount):
hint = generated_hints.pop()
for _ in range(0, duplicates):
audio_log = audio_logs.pop()
self.log_ids_to_hints[int(audio_log, 16)] = hint
if audio_logs:
audio_log = audio_logs.pop()
self.log_ids_to_hints[int(audio_log, 16)] = credits_hint
joke_hints = generate_joke_hints(self.world, len(audio_logs))
while audio_logs:
audio_log = audio_logs.pop()
self.log_ids_to_hints[int(audio_log, 16)] = joke_hints.pop()
# generate hints done
slot_data = self._get_slot_data()
for option_name in the_witness_options: for option_name in the_witness_options:
slot_data[option_name] = get_option_value( slot_data[option_name] = get_option_value(

281
worlds/witness/hints.py Normal file
View File

@ -0,0 +1,281 @@
from BaseClasses import MultiWorld
from .Options import is_option_enabled, get_option_value
joke_hints = [
("Quaternions", "break", "my brain"),
("Eclipse", "has nothing", "but you should do it anyway"),
("", "Beep", ""),
("Putting in custom subtitles", "shouldn't have been", "as hard as it was..."),
("BK mode", "is right", "around the corner"),
("", "You can do it!", ""),
("", "I believe in you!", ""),
("The person playing", "is", "cute <3"),
("dash dot, dash dash dash", "dash, dot dot dot dot, dot dot", "dash dot, dash dash dot"),
("When you think about it,", "there are actually a lot of", "bubbles in a stream"),
("Never gonna give you up", "Never gonna let you down", "Never gonna run around and desert you"),
("Thanks to", "the Archipelago developers", "for making this possible."),
("Have you tried ChecksFinder?", "If you like puzzles,", "you might enjoy it!"),
("Have you tried Dark Souls III?", "A tough game like this", "feels better when friends are helping you!"),
("Have you tried Donkey Kong Country 3?", "A legendary game", "from a golden age of platformers!"),
("Have you tried Factorio?", "Alone in an unknown world.", "Sound familiar?"),
("Have you tried Final Fantasy?", "Experience a classic game", "improved to fit modern standards!"),
("Have you tried Hollow Knight?", "Another independent hit", "revolutionising a genre!"),
("Have you tried A Link to the Past?", "The Archipelago game", "that started it all!"),
("Have you tried Meritous?", "You should know that obscure games", "are often groundbreaking!"),
("Have you tried Ocarine of Time?", "One of the biggest randomizers,", "big inspiration for this one's features!"),
("Have you tried Raft?", "Haven't you always wanted to explore", "the ocean surrounding this island?"),
("Have you tried Risk of Rain 2?", "I haven't either.", "But I hear it's incredible!"),
("Have you tried Rogue Legacy?", "After solving so many puzzles", "it's the perfect way to rest your brain."),
("Have you tried Secret of Evermore?", "I haven't either", "But I hear it's great!"),
("Have you tried Slay the Spire?", "Experience the thrill of combat", "without needing fast fingers!"),
("Have you tried SMZ3?", "Why play one incredible game", "when you can play 2 at once?"),
("Have you tried Starcraft 2?", "Use strategy and management", "to crush your enemies!"),
("Have you tried Super Mario 64?", "3-dimensional games like this", "owe everything to that game."),
("Have you tried Super Metroid?", "A classic game", "that started a whole genre."),
("Have you tried Timespinner?", "Everyone who plays it", "ends up loving it!"),
("Have you tried VVVVVV?", "Experience the essence of gaming", "distilled into its purest form!"),
("Have you tried The Witness?", "Oh. I guess you already have.", " Thanks for playing!"),
("One day I was fascinated", "by the subject of", "generation of waves by wind"),
("I don't like sandwiches", "Why would you think I like sandwiches?", "Have you ever seen me with a sandwich?"),
("Where are you right now?", "I'm at soup!", "What do you mean you're at soup?"),
("Remember to ask", "in the Archipelago Discord", "what the Functioning Brain does."),
("", "Don't use your puzzle skips", "you might need them later"),
("", "For an extra challenge", "Try playing blindfolded"),
("Go to the top of the mountain", "and see if you can see", "your house"),
("Yellow = Red + Green", "Cyan = Green + Blue", "Magenta = Red + Blue"),
("", "Maybe that panel really is unsolvable", ""),
("", "Did you make sure it was plugged in?", ""),
("", "Do not look into laser with remaining eye", ""),
("", "Try pressing Space to jump", ""),
("The Witness is a Doom clone.", "Just replace the demons", "with puzzles"),
("", "Test Hint please ignore", ""),
("Shapers can never be placed", "outside the panel boundaries", "even if subtracted."),
("", "The Keep laser panels use", "the same trick on both sides!"),
("Can't get past a door? Try going around.", "Can't go around? Try building a", "nether portal."),
("", "We've been trying to reach you", "about your car's extended warranty"),
("I hate this game. I hate this game.", "I hate this game.", "-chess player Bobby Fischer"),
("Dear Mario,", "Please come to the castle.", "I've baked a cake for you!"),
("Have you tried waking up?", "", "Yeah, me neither."),
("Why do they call it The Witness,", "when wit game the player view", "play of with the game."),
("", "THE WIND FISH IN NAME ONLY", "FOR IT IS NEITHER"),
("Like this game? Try The Wit.nes,", "Understand, INSIGHT, Taiji", "What the Witness?, and Tametsi."),
("", "In a race", "It's survival of the Witnesst"),
("", "This hint has been removed", "We apologize for your inconvenience."),
("", "O-----------", ""),
("Circle is draw", "Square is separate", "Line is win"),
("Circle is draw", "Star is pair", "Line is win"),
("Circle is draw", "Circle is copy", "Line is win"),
("Circle is draw", "Dot is eat", "Line is win"),
("Circle is start", "Walk is draw", "Line is win"),
("Circle is start", "Line is win", "Witness is you"),
("Can't find any items?", "Consider a relaxing boat trip", "around the island"),
("", "Don't forget to like, comment, and subscribe", ""),
("Ah crap, gimme a second.", "[papers rustling]", "Sorry, nothing."),
("", "Trying to get a hint?", "Too bad."),
("", "Here's a hint:", "Get good at the game."),
("", "I'm still not entirely sure", "what we're witnessing here."),
("Have you found a red page yet?", "No?", "Then have you found a blue page?"),
(
"And here we see the Witness player,",
"seeking answers where there are none-",
"Did someone turn on the loudspeaker?"
),
(
"Hints suggested by:",
"IHNN, Beaker, MrPokemon11, Ember, TheM8, NewSoupVi,",
"KF, Yoshi348, Berserker, BowlinJim, oddGarrett, Pink Switch."
),
]
def get_always_hint_items(world: MultiWorld, player: int):
priority = [
"Boat",
"Mountain Bottom Floor Final Room Entry (Door)",
"Caves Mountain Shortcut (Door)",
"Caves Swamp Shortcut (Door)",
"Caves Exits to Main Island",
]
difficulty = get_option_value(world, player, "puzzle_randomization")
discards = is_option_enabled(world, player, "shuffle_discards")
if discards:
if difficulty == 1:
priority.append("Arrows")
else:
priority.append("Triangles")
return priority
def get_always_hint_locations(world: MultiWorld, player: int):
return {
"Swamp Purple Underwater",
"Shipwreck Vault Box",
"Challenge Vault Box",
"Mountain Bottom Floor Discard",
}
def get_priority_hint_items(world: MultiWorld, player: int):
priority = {
"Negative Shapers",
"Sound Dots",
"Colored Dots",
"Stars + Same Colored Symbol",
"Swamp Entry (Panel)",
"Swamp Laser Shortcut (Door)",
}
if is_option_enabled(world, player, "shuffle_lasers"):
lasers = {
"Symmetry Laser",
"Desert Laser",
"Town Laser",
"Keep Laser",
"Swamp Laser",
"Treehouse Laser",
"Monastery Laser",
"Jungle Laser",
"Quarry Laser",
"Bunker Laser",
"Shadows Laser",
}
if get_option_value(world, player, "doors") >= 2:
priority.add("Desert Laser")
lasers.remove("Desert Laser")
priority.update(world.random.sample(lasers, 2))
else:
priority.update(world.random.sample(lasers, 3))
return priority
def get_priority_hint_locations(world: MultiWorld, player: int):
return {
"Town RGB Room Left",
"Town RGB Room Right",
"Treehouse Green Bridge 7",
"Treehouse Green Bridge Discard",
"Shipwreck Discard",
"Desert Vault Box",
"Mountainside Vault Box",
"Mountainside Discard",
}
def make_hint_from_item(world: MultiWorld, player: int, item: str):
location_obj = world.find_item(item, player).item.location
location_name = location_obj.name
if location_obj.player != player:
location_name += " (" + world.get_player_name(location_obj.player) + ")"
return location_name, item, location_obj.address if(location_obj.player == player) else -1
def make_hint_from_location(world: MultiWorld, player: int, location: str):
location_obj = world.get_location(location, player)
item_obj = world.get_location(location, player).item
item_name = item_obj.name
if item_obj.player != player:
item_name += " (" + world.get_player_name(item_obj.player) + ")"
return location, item_name, location_obj.address if(location_obj.player == player) else -1
def make_hints(world: MultiWorld, player: int, hint_amount: int):
hints = list()
prog_items_in_this_world = {
item.name for item in world.get_items()
if item.player == player and item.code and item.advancement
}
loc_in_this_world = {
location.name for location in world.get_locations()
if location.player == player and not location.event
}
always_locations = [
location for location in get_always_hint_locations(world, player)
if location in loc_in_this_world
]
always_items = [
item for item in get_always_hint_items(world, player)
if item in prog_items_in_this_world
]
priority_locations = [
location for location in get_priority_hint_locations(world, player)
if location in loc_in_this_world
]
priority_items = [
item for item in get_priority_hint_items(world, player)
if item in prog_items_in_this_world
]
always_hint_pairs = dict()
for item in always_items:
hint_pair = make_hint_from_item(world, player, item)
always_hint_pairs[hint_pair[0]] = (hint_pair[1], True, hint_pair[2])
for location in always_locations:
hint_pair = make_hint_from_location(world, player, location)
always_hint_pairs[hint_pair[0]] = (hint_pair[1], False, hint_pair[2])
priority_hint_pairs = dict()
for item in priority_items:
hint_pair = make_hint_from_item(world, player, item)
priority_hint_pairs[hint_pair[0]] = (hint_pair[1], True, hint_pair[2])
for location in priority_locations:
hint_pair = make_hint_from_location(world, player, location)
priority_hint_pairs[hint_pair[0]] = (hint_pair[1], False, hint_pair[2])
for loc, item in always_hint_pairs.items():
if item[1]:
hints.append((item[0], "can be found at", loc, item[2]))
else:
hints.append((loc, "contains", item[0], item[2]))
next_random_hint_is_item = world.random.randint(0, 2)
prog_items_in_this_world = sorted(list(prog_items_in_this_world))
locations_in_this_world = sorted(list(loc_in_this_world))
world.random.shuffle(prog_items_in_this_world)
world.random.shuffle(locations_in_this_world)
while len(hints) < hint_amount:
if priority_hint_pairs:
loc = world.random.choice(list(priority_hint_pairs.keys()))
item = priority_hint_pairs[loc]
del priority_hint_pairs[loc]
if item[1]:
hints.append((item[0], "can be found at", loc, item[2]))
else:
hints.append((loc, "contains", item[0], item[2]))
continue
if next_random_hint_is_item:
if not prog_items_in_this_world:
next_random_hint_is_item = not next_random_hint_is_item
continue
hint = make_hint_from_item(world, player, prog_items_in_this_world.pop())
hints.append((hint[1], "can be found at", hint[0], hint[2]))
else:
hint = make_hint_from_location(world, player, locations_in_this_world.pop())
hints.append((hint[0], "contains", hint[1], hint[2]))
next_random_hint_is_item = not next_random_hint_is_item
return hints
def generate_joke_hints(world: MultiWorld, amount: int):
return [(x, y, z, -1) for (x, y, z) in world.random.sample(joke_hints, amount)]

View File

@ -2,6 +2,7 @@
Defines progression, junk and event items for The Witness Defines progression, junk and event items for The Witness
""" """
import copy import copy
from collections import defaultdict
from typing import Dict, NamedTuple, Optional, Set from typing import Dict, NamedTuple, Optional, Set
from BaseClasses import Item, MultiWorld from BaseClasses import Item, MultiWorld
@ -96,6 +97,10 @@ class WitnessPlayerItems:
Class that defines Items for a single world Class that defines Items for a single world
""" """
@staticmethod
def code(item_name: str):
return StaticWitnessItems.ALL_ITEM_TABLE[item_name].code
def __init__(self, locat: WitnessPlayerLocations, world: MultiWorld, player: int, player_logic: WitnessPlayerLogic): def __init__(self, locat: WitnessPlayerLocations, world: MultiWorld, player: int, player_logic: WitnessPlayerLogic):
"""Adds event items after logic changes due to options""" """Adds event items after logic changes due to options"""
self.EVENT_ITEM_TABLE = dict() self.EVENT_ITEM_TABLE = dict()
@ -105,6 +110,8 @@ class WitnessPlayerItems:
self.ITEM_ID_TO_DOOR_HEX = dict() self.ITEM_ID_TO_DOOR_HEX = dict()
self.DOORS = set() self.DOORS = set()
self.PROG_ITEM_AMOUNTS = defaultdict(lambda: 1)
self.SYMBOLS_NOT_IN_THE_GAME = set() self.SYMBOLS_NOT_IN_THE_GAME = set()
self.EXTRA_AMOUNTS = { self.EXTRA_AMOUNTS = {
@ -118,8 +125,17 @@ class WitnessPlayerItems:
if item in StaticWitnessLogic.ALL_SYMBOL_ITEMS: if item in StaticWitnessLogic.ALL_SYMBOL_ITEMS:
self.SYMBOLS_NOT_IN_THE_GAME.add(StaticWitnessItems.ALL_ITEM_TABLE[item[0]].code) self.SYMBOLS_NOT_IN_THE_GAME.add(StaticWitnessItems.ALL_ITEM_TABLE[item[0]].code)
else: else:
if item[0] in StaticWitnessLogic.PROGRESSIVE_TO_ITEMS:
self.PROG_ITEM_AMOUNTS[item[0]] = len(player_logic.MULTI_LISTS[item[0]])
self.PROGRESSION_TABLE[item[0]] = self.ITEM_TABLE[item[0]] self.PROGRESSION_TABLE[item[0]] = self.ITEM_TABLE[item[0]]
self.MULTI_LISTS_BY_CODE = dict()
for item in self.PROG_ITEM_AMOUNTS:
multi_list = player_logic.MULTI_LISTS[item]
self.MULTI_LISTS_BY_CODE[self.code(item)] = [self.code(single_item) for single_item in multi_list]
for entity_hex, items in player_logic.DOOR_ITEMS_BY_ID.items(): for entity_hex, items in player_logic.DOOR_ITEMS_BY_ID.items():
entity_hex_int = int(entity_hex, 16) entity_hex_int = int(entity_hex, 16)
@ -138,11 +154,11 @@ class WitnessPlayerItems:
if doors and symbols: if doors and symbols:
self.GOOD_ITEMS = [ self.GOOD_ITEMS = [
"Dots", "Black/White Squares", "Symmetry" "Progressive Dots", "Black/White Squares", "Symmetry"
] ]
elif symbols: elif symbols:
self.GOOD_ITEMS = [ self.GOOD_ITEMS = [
"Dots", "Black/White Squares", "Stars", "Progressive Dots", "Black/White Squares", "Progressive Stars",
"Shapers", "Symmetry" "Shapers", "Symmetry"
] ]
@ -151,6 +167,10 @@ class WitnessPlayerItems:
if not is_option_enabled(world, player, "disable_non_randomized_puzzles"): if not is_option_enabled(world, player, "disable_non_randomized_puzzles"):
self.GOOD_ITEMS.append("Colored Squares") self.GOOD_ITEMS.append("Colored Squares")
self.GOOD_ITEMS = [
StaticWitnessLogic.ITEMS_TO_PROGRESSIVE.get(item, item) for item in self.GOOD_ITEMS
]
for event_location in locat.EVENT_LOCATION_TABLE: for event_location in locat.EVENT_LOCATION_TABLE:
location = player_logic.EVENT_ITEM_PAIRS[event_location] location = player_logic.EVENT_ITEM_PAIRS[event_location]
self.EVENT_ITEM_TABLE[location] = ItemData(None, True, True) self.EVENT_ITEM_TABLE[location] = ItemData(None, True, True)

View File

@ -3,7 +3,8 @@ Defines constants for different types of locations in the game
""" """
from .Options import is_option_enabled, get_option_value from .Options import is_option_enabled, get_option_value
from .player_logic import StaticWitnessLogic, WitnessPlayerLogic from .player_logic import WitnessPlayerLogic
from .static_logic import StaticWitnessLogic
class StaticWitnessLocations: class StaticWitnessLocations:
@ -52,8 +53,6 @@ class StaticWitnessLocations:
"Desert Light Room 3", "Desert Light Room 3",
"Desert Pond Room 5", "Desert Pond Room 5",
"Desert Flood Room 6", "Desert Flood Room 6",
"Desert Final Bent 3",
"Desert Final Hexagonal",
"Desert Laser Panel", "Desert Laser Panel",
"Quarry Mill Lower Row 6", "Quarry Mill Lower Row 6",
@ -247,6 +246,10 @@ class WitnessPlayerLocations:
StaticWitnessLocations.GENERAL_LOCATIONS StaticWitnessLocations.GENERAL_LOCATIONS
) )
if get_option_value(world, player, "puzzle_randomization") == 1:
self.CHECK_LOCATIONS.remove("Keep Pressure Plates 4")
self.CHECK_LOCATIONS.add("Keep Pressure Plates 2")
doors = get_option_value(world, player, "shuffle_doors") >= 2 doors = get_option_value(world, player, "shuffle_doors") >= 2
earlyutm = is_option_enabled(world, player, "early_secret_area") earlyutm = is_option_enabled(world, player, "early_secret_area")
victory = get_option_value(world, player, "victory_condition") victory = get_option_value(world, player, "victory_condition")

View File

@ -39,7 +39,7 @@ class WitnessPlayerLogic:
if panel_hex in self.COMPLETELY_DISABLED_CHECKS: if panel_hex in self.COMPLETELY_DISABLED_CHECKS:
return frozenset() return frozenset()
check_obj = StaticWitnessLogic.CHECKS_BY_HEX[panel_hex] check_obj = self.REFERENCE_LOGIC.CHECKS_BY_HEX[panel_hex]
these_items = frozenset({frozenset()}) these_items = frozenset({frozenset()})
@ -47,17 +47,21 @@ class WitnessPlayerLogic:
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({
subset.intersection(self.PROG_ITEMS_ACTUALLY_IN_THE_GAME) subset.intersection(self.THEORETICAL_ITEMS_NO_MULTI)
for subset in these_items for subset in these_items
}) })
for subset in these_items:
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI.update(subset)
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]})
all_options = set() all_options = set()
for items_option in these_items:
for dependentItem in door_items: for dependentItem in door_items:
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI.update(dependentItem)
for items_option in these_items:
all_options.add(items_option.union(dependentItem)) all_options.add(items_option.union(dependentItem))
if panel_hex != "0x28A0D": if panel_hex != "0x28A0D":
@ -76,11 +80,11 @@ class WitnessPlayerLogic:
dependent_items_for_option = frozenset({frozenset()}) dependent_items_for_option = frozenset({frozenset()})
for option_panel in option: for option_panel in option:
dep_obj = StaticWitnessLogic.CHECKS_BY_HEX.get(option_panel) dep_obj = self.REFERENCE_LOGIC.CHECKS_BY_HEX.get(option_panel)
if option_panel in self.COMPLETELY_DISABLED_CHECKS: if option_panel in self.COMPLETELY_DISABLED_CHECKS:
new_items = frozenset() new_items = frozenset()
elif option_panel in {"7 Lasers", "11 Lasers"}: elif option_panel in {"7 Lasers", "11 Lasers", "PP2 Weirdness"}:
new_items = frozenset({frozenset([option_panel])}) new_items = frozenset({frozenset([option_panel])})
# If a panel turns on when a panel in a different region turns on, # 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 # the latter panel will be an "event panel", unless it ends up being
@ -113,20 +117,26 @@ class WitnessPlayerLogic:
"""Makes a single logic adjustment based on additional logic file""" """Makes a single logic adjustment based on additional logic file"""
if adj_type == "Items": if adj_type == "Items":
if line not in StaticWitnessItems.ALL_ITEM_TABLE: line_split = line.split(" - ")
raise RuntimeError("Item \"" + line + "\" does not exit.") item = line_split[0]
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME.add(line) if item not in StaticWitnessItems.ALL_ITEM_TABLE:
raise RuntimeError("Item \"" + item + "\" does not exit.")
if line in StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT: self.THEORETICAL_ITEMS.add(item)
panel_hexes = StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT[line][2] self.THEORETICAL_ITEMS_NO_MULTI.update(StaticWitnessLogic.PROGRESSIVE_TO_ITEMS.get(item, [item]))
if item in StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT:
panel_hexes = StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT[item][2]
for panel_hex in panel_hexes: for panel_hex in panel_hexes:
self.DOOR_ITEMS_BY_ID.setdefault(panel_hex, set()).add(line) self.DOOR_ITEMS_BY_ID.setdefault(panel_hex, set()).add(item)
return return
if adj_type == "Remove Items": if adj_type == "Remove Items":
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME.discard(line) self.THEORETICAL_ITEMS.discard(line)
for i in StaticWitnessLogic.PROGRESSIVE_TO_ITEMS.get(line, [line]):
self.THEORETICAL_ITEMS_NO_MULTI.discard(i)
if line in StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT: if line in StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT:
panel_hexes = StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT[line][2] panel_hexes = StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT[line][2]
@ -265,11 +275,22 @@ class WitnessPlayerLogic:
self.REQUIREMENTS_BY_HEX[check_hex] = indep_requirement self.REQUIREMENTS_BY_HEX[check_hex] = indep_requirement
for item in self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI:
if item not in self.THEORETICAL_ITEMS:
corresponding_multi = StaticWitnessLogic.ITEMS_TO_PROGRESSIVE[item]
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME.add(corresponding_multi)
multi_list = StaticWitnessLogic.PROGRESSIVE_TO_ITEMS[StaticWitnessLogic.ITEMS_TO_PROGRESSIVE[item]]
multi_list = [item for item in multi_list if item in self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI]
self.MULTI_AMOUNTS[item] = multi_list.index(item) + 1
self.MULTI_LISTS[corresponding_multi] = multi_list
else:
self.PROG_ITEMS_ACTUALLY_IN_THE_GAME.add(item)
def make_event_item_pair(self, panel): def make_event_item_pair(self, panel):
""" """
Makes a pair of an event panel and its event item Makes a pair of an event panel and its event item
""" """
name = StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" name = self.REFERENCE_LOGIC.CHECKS_BY_HEX[panel]["checkName"] + " Solved"
pair = (name, self.EVENT_ITEM_NAMES[panel]) pair = (name, self.EVENT_ITEM_NAMES[panel])
return pair return pair
@ -287,7 +308,7 @@ class WitnessPlayerLogic:
if panel == "TrueOneWay": if panel == "TrueOneWay":
continue continue
if StaticWitnessLogic.CHECKS_BY_HEX[panel]["region"]["name"] != region_name: if self.REFERENCE_LOGIC.CHECKS_BY_HEX[panel]["region"]["name"] != region_name:
self.EVENT_PANELS_FROM_REGIONS.add(panel) self.EVENT_PANELS_FROM_REGIONS.add(panel)
self.EVENT_PANELS.update(self.EVENT_PANELS_FROM_PANELS) self.EVENT_PANELS.update(self.EVENT_PANELS_FROM_PANELS)
@ -306,12 +327,24 @@ class WitnessPlayerLogic:
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.THEORETICAL_ITEMS = set()
self.THEORETICAL_ITEMS_NO_MULTI = set()
self.MULTI_AMOUNTS = dict()
self.MULTI_LISTS = dict()
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() self.DOOR_ITEMS_BY_ID = dict()
self.STARTING_INVENTORY = set() self.STARTING_INVENTORY = set()
self.CONNECTIONS_BY_REGION_NAME = copy.copy(StaticWitnessLogic.STATIC_CONNECTIONS_BY_REGION_NAME) self.DIFFICULTY = get_option_value(world, player, "puzzle_randomization")
self.DEPENDENT_REQUIREMENTS_BY_HEX = copy.copy(StaticWitnessLogic.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX)
if self.DIFFICULTY == 0:
self.REFERENCE_LOGIC = StaticWitnessLogic.sigma_normal
elif self.DIFFICULTY == 1:
self.REFERENCE_LOGIC = StaticWitnessLogic.sigma_expert
self.CONNECTIONS_BY_REGION_NAME = copy.copy(self.REFERENCE_LOGIC.STATIC_CONNECTIONS_BY_REGION_NAME)
self.DEPENDENT_REQUIREMENTS_BY_HEX = copy.copy(self.REFERENCE_LOGIC.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX)
self.REQUIREMENTS_BY_HEX = dict() self.REQUIREMENTS_BY_HEX = dict()
# Determining which panels need to be events is a difficult process. # Determining which panels need to be events is a difficult process.
@ -333,6 +366,7 @@ class WitnessPlayerLogic:
"0x019DC": "Keep Hedges 2 Knowledge", "0x019DC": "Keep Hedges 2 Knowledge",
"0x019E7": "Keep Hedges 3 Knowledge", "0x019E7": "Keep Hedges 3 Knowledge",
"0x01D3F": "Keep Laser Panel (Pressure Plates) Activates", "0x01D3F": "Keep Laser Panel (Pressure Plates) Activates",
"0x01BE9": "Keep Laser Panel (Pressure Plates) Activates",
"0x09F7F": "Mountain Access", "0x09F7F": "Mountain Access",
"0x0367C": "Quarry Laser Mill Requirement Met", "0x0367C": "Quarry Laser Mill Requirement Met",
"0x009A1": "Swamp Between Bridges Far 1 Activates", "0x009A1": "Swamp Between Bridges Far 1 Activates",
@ -374,6 +408,9 @@ class WitnessPlayerLogic:
"0x0356B": "Challenge Video Pattern Knowledge", "0x0356B": "Challenge Video Pattern Knowledge",
"0x0A15F": "Desert Laser Panel Shutters Open (1)", "0x0A15F": "Desert Laser Panel Shutters Open (1)",
"0x012D7": "Desert Laser Panel Shutters Open (2)", "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",
} }
self.ALWAYS_EVENT_NAMES_BY_HEX = { self.ALWAYS_EVENT_NAMES_BY_HEX = {

View File

@ -4,7 +4,8 @@ and connects them with the proper requirements
""" """
from BaseClasses import MultiWorld, Entrance from BaseClasses import MultiWorld, Entrance
from . import StaticWitnessLogic from .static_logic import StaticWitnessLogic
from .Options import get_option_value
from .locations import WitnessPlayerLocations from .locations import WitnessPlayerLocations
from .player_logic import WitnessPlayerLogic from .player_logic import WitnessPlayerLogic
@ -39,7 +40,7 @@ class WitnessRegions:
connection = Entrance( connection = Entrance(
player, player,
source + " to " + target + " via " + str(panel_hex_to_solve_set), source + " to " + target,
source_region source_region
) )
@ -58,16 +59,23 @@ class WitnessRegions:
create_region(world, player, 'Menu', self.locat, None, ["The Splashscreen?"]), 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
else:
reference_logic = StaticWitnessLogic.sigma_normal
all_locations = set() all_locations = set()
for region_name, region in StaticWitnessLogic.ALL_REGIONS_BY_NAME.items(): for region_name, region in reference_logic.ALL_REGIONS_BY_NAME.items():
locations_for_this_region = [ locations_for_this_region = [
StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] for panel in region["panels"] reference_logic.CHECKS_BY_HEX[panel]["checkName"] for panel in region["panels"]
if StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] in self.locat.CHECK_LOCATION_TABLE if reference_logic.CHECKS_BY_HEX[panel]["checkName"] in self.locat.CHECK_LOCATION_TABLE
] ]
locations_for_this_region += [ locations_for_this_region += [
StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" for panel in region["panels"] reference_logic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" for panel in region["panels"]
if StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" in self.locat.EVENT_LOCATION_TABLE if reference_logic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" in self.locat.EVENT_LOCATION_TABLE
] ]
all_locations = all_locations | set(locations_for_this_region) all_locations = all_locations | set(locations_for_this_region)
@ -76,7 +84,7 @@ class WitnessRegions:
create_region(world, player, 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 StaticWitnessLogic.ALL_REGIONS_BY_NAME.items(): for region_name, region in 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[0] == "Entry": if connection[0] == "Entry":
continue continue
@ -87,7 +95,7 @@ class WitnessRegions:
for subset in connection[1]: for subset in connection[1]:
if all({panel in player_logic.DOOR_ITEMS_BY_ID for panel in subset}): if all({panel in player_logic.DOOR_ITEMS_BY_ID for panel in subset}):
if all({StaticWitnessLogic.CHECKS_BY_HEX[panel]["id"] is None for panel in subset}): if all({reference_logic.CHECKS_BY_HEX[panel]["id"] is None for panel in subset}):
self.connect(world, player, connection[0], region_name, player_logic, frozenset({subset})) self.connect(world, player, connection[0], region_name, player_logic, frozenset({subset}))
self.connect(world, player, region_name, connection[0], player_logic, connection[1]) self.connect(world, player, region_name, connection[0], player_logic, connection[1])

View File

@ -91,11 +91,62 @@ class WitnessLogic(LogicMixin):
if not self._witness_has_lasers(world, player, get_option_value(world, player, "challenge_lasers")): if not self._witness_has_lasers(world, player, get_option_value(world, player, "challenge_lasers")):
valid_option = False valid_option = False
break 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
)
)
backwards_access = (
self.can_reach("Keep 3rd Pressure Plate to Keep 4th Pressure Plate", "Entrance", player)
and backwards_to_fourth
or self.can_reach("Main Island", "Region", player)
and self.can_reach("Keep 4th Pressure Plate to Shadows", "Entrance", player)
)
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 in player_logic.EVENT_PANELS: elif item in player_logic.EVENT_PANELS:
if not self._witness_can_solve_panel(item, world, player, player_logic, locat): if not self._witness_can_solve_panel(item, world, player, player_logic, locat):
valid_option = False valid_option = False
break break
elif not self.has(item, player): elif not self.has(item, player):
prog_dict = StaticWitnessLogic.ITEMS_TO_PROGRESSIVE
if not (item in prog_dict and self.has(prog_dict[item], player, player_logic.MULTI_AMOUNTS[item])):
valid_option = False valid_option = False
break break

View File

@ -0,0 +1,49 @@
0x3C0F7
0x3C0FD
0x32A00
0x3C0FE
0x3C100
0x3C0F4
0x3C102
0x3C10D
0x3C10E
0x3C10B
0x0074F
0x012C7
0x329FF
0x3C106
0x33AFF
0x011F9
0x00763
0x32A08
0x3C101
0x3C0FF
0x3C103
0x00A0F
0x339A9
0x015C0
0x33B36
0x3C10C
0x32A0E
0x329FE
0x32A07
0x00761
0x3C109
0x33B37
0x3C107
0x3C0F3
0x015B7
0x3C10A
0x32A0A
0x015C1
0x3C12A
0x3C104
0x3C105
0x339A8
0x0050A
0x338BD
0x3C135
0x338C9
0x338D7
0x338C1
0x338CA

View File

@ -52,6 +52,10 @@ Disabled Locations:
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)
0x03307 (First Gate)
0x03313 (Second Gate)
0x0C128 (Entry Inner)
0x0C153 (Entry Outer)
0x00B10 (Monastery Entry Left) 0x00B10 (Monastery Entry Left)
0x00C92 (Monastery Entry Right) 0x00C92 (Monastery Entry Right)
0x00290 (Monastery Outside 1) 0x00290 (Monastery Outside 1)
@ -83,6 +87,10 @@ Disabled Locations:
0x15ADD (River Outside Vault) 0x15ADD (River Outside Vault)
0x03702 (River Vault Box) 0x03702 (River Vault Box)
0x17CAA (Monastery Shortcut Panel) 0x17CAA (Monastery Shortcut Panel)
0x0C2A4 (Bunker Entry)
0x17C79 (Tinted Glass Door)
0x0C2A3 (UV Room Entry)
0x0A08D (Elevator Room Entry)
0x17C2E (Door to Bunker) 0x17C2E (Door to Bunker)
0x09F7D (Bunker Intro Left 1) 0x09F7D (Bunker Intro Left 1)
0x09FDC (Bunker Intro Left 2) 0x09FDC (Bunker Intro Left 2)

View File

@ -1,5 +1,6 @@
Items: Items:
Dots Arrows
Progressive Dots
Colored Dots Colored Dots
Sound Dots Sound Dots
Symmetry Symmetry
@ -8,7 +9,6 @@ Eraser
Shapers Shapers
Rotated Shapers Rotated Shapers
Negative Shapers Negative Shapers
Stars Progressive Stars
Stars + Same Colored Symbol
Black/White Squares Black/White Squares
Colored Squares Colored Squares

View File

@ -1,73 +1,15 @@
import os import os
from .utils import define_new_region, parse_lambda from .utils import define_new_region, parse_lambda, lazy
class StaticWitnessLogic: class StaticWitnessLogicObj:
ALL_SYMBOL_ITEMS = set() def read_logic_file(self, file_path="WitnessLogic.txt"):
ALL_DOOR_ITEMS = set()
ALL_DOOR_ITEMS_AS_DICT = dict()
ALL_USEFULS = set()
ALL_TRAPS = set()
ALL_BOOSTS = set()
CONNECTIONS_TO_SEVER_BY_DOOR_HEX = dict()
EVENT_PANELS_FROM_REGIONS = set()
# All regions with a list of panels in them and the connections to other regions, before logic adjustments
ALL_REGIONS_BY_NAME = dict()
STATIC_CONNECTIONS_BY_REGION_NAME = dict()
CHECKS_BY_HEX = dict()
CHECKS_BY_NAME = dict()
STATIC_DEPENDENT_REQUIREMENTS_BY_HEX = dict()
def parse_items(self):
"""
Parses currently defined items from WitnessItems.txt
"""
path = os.path.join(os.path.dirname(__file__), "WitnessItems.txt")
with open(path, "r", encoding="utf-8") as file:
current_set = self.ALL_SYMBOL_ITEMS
for line in file.readlines():
line = line.strip()
if line == "Progression:":
current_set = self.ALL_SYMBOL_ITEMS
continue
if line == "Boosts:":
current_set = self.ALL_BOOSTS
continue
if line == "Traps:":
current_set = self.ALL_TRAPS
continue
if line == "Usefuls:":
current_set = self.ALL_USEFULS
continue
if line == "Doors:":
current_set = self.ALL_DOOR_ITEMS
continue
if line == "":
continue
line_split = line.split(" - ")
if current_set is self.ALL_USEFULS:
current_set.add((line_split[1], int(line_split[0]), line_split[2] == "True"))
elif current_set is self.ALL_DOOR_ITEMS:
new_door = (line_split[1], int(line_split[0]), frozenset(line_split[2].split(",")))
current_set.add(new_door)
self.ALL_DOOR_ITEMS_AS_DICT[line_split[1]] = new_door
else:
current_set.add((line_split[1], int(line_split[0])))
def read_logic_file(self):
""" """
Reads the logic file and does the initial population of data structures Reads the logic file and does the initial population of data structures
""" """
path = os.path.join(os.path.dirname(__file__), "WitnessLogic.txt") path = os.path.join(os.path.dirname(__file__), file_path)
with open(path, "r", encoding="utf-8") as file: with open(path, "r", encoding="utf-8") as file:
current_region = dict() current_region = dict()
@ -157,6 +99,99 @@ class StaticWitnessLogic:
current_region["panels"].add(check_hex) current_region["panels"].add(check_hex)
def __init__(self, file_path="WitnessLogic.txt"):
# 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.STATIC_CONNECTIONS_BY_REGION_NAME = dict()
self.CHECKS_BY_HEX = dict()
self.CHECKS_BY_NAME = dict()
self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX = dict()
self.read_logic_file(file_path)
class StaticWitnessLogic:
ALL_SYMBOL_ITEMS = set()
ITEMS_TO_PROGRESSIVE = dict()
PROGRESSIVE_TO_ITEMS = dict()
ALL_DOOR_ITEMS = set()
ALL_DOOR_ITEMS_AS_DICT = dict()
ALL_USEFULS = set()
ALL_TRAPS = set()
ALL_BOOSTS = set()
CONNECTIONS_TO_SEVER_BY_DOOR_HEX = dict()
ALL_REGIONS_BY_NAME = dict()
STATIC_CONNECTIONS_BY_REGION_NAME = dict()
CHECKS_BY_HEX = dict()
CHECKS_BY_NAME = dict()
STATIC_DEPENDENT_REQUIREMENTS_BY_HEX = dict()
def parse_items(self):
"""
Parses currently defined items from WitnessItems.txt
"""
path = os.path.join(os.path.dirname(__file__), "WitnessItems.txt")
with open(path, "r", encoding="utf-8") as file:
current_set = self.ALL_SYMBOL_ITEMS
for line in file.readlines():
line = line.strip()
if line == "Progression:":
current_set = self.ALL_SYMBOL_ITEMS
continue
if line == "Boosts:":
current_set = self.ALL_BOOSTS
continue
if line == "Traps:":
current_set = self.ALL_TRAPS
continue
if line == "Usefuls:":
current_set = self.ALL_USEFULS
continue
if line == "Doors:":
current_set = self.ALL_DOOR_ITEMS
continue
if line == "":
continue
line_split = line.split(" - ")
if current_set is self.ALL_USEFULS:
current_set.add((line_split[1], int(line_split[0]), line_split[2] == "True"))
elif current_set is self.ALL_DOOR_ITEMS:
new_door = (line_split[1], int(line_split[0]), frozenset(line_split[2].split(",")))
current_set.add(new_door)
self.ALL_DOOR_ITEMS_AS_DICT[line_split[1]] = new_door
else:
if len(line_split) > 2:
progressive_items = line_split[2].split(",")
for i, value in enumerate(progressive_items):
self.ITEMS_TO_PROGRESSIVE[value] = line_split[1]
self.PROGRESSIVE_TO_ITEMS[line_split[1]] = progressive_items
current_set.add((line_split[1], int(line_split[0])))
continue
current_set.add((line_split[1], int(line_split[0])))
@lazy
def sigma_expert(self) -> StaticWitnessLogicObj:
return StaticWitnessLogicObj("WitnessLogicExpert.txt")
@lazy
def sigma_normal(self) -> StaticWitnessLogicObj:
return StaticWitnessLogicObj("WitnessLogic.txt")
def __init__(self): def __init__(self):
self.parse_items() self.parse_items()
self.read_logic_file()
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.CHECKS_BY_HEX.update(self.sigma_normal.CHECKS_BY_HEX)
self.CHECKS_BY_NAME.update(self.sigma_normal.CHECKS_BY_NAME)
self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX.update(self.sigma_normal.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX)

View File

@ -89,6 +89,22 @@ def parse_lambda(lambda_string):
return lambda_set return lambda_set
class lazy(object):
def __init__(self, func, name=None):
self.func = func
self.name = name if name is not None else func.__name__
self.__doc__ = func.__doc__
def __get__(self, instance, class_):
if instance is None:
res = self.func(class_)
setattr(class_, self.name, res)
return res
res = self.func(instance)
setattr(instance, self.name, res)
return res
def get_adjustment_file(adjustment_file): def get_adjustment_file(adjustment_file):
path = os.path.join(os.path.dirname(__file__), adjustment_file) path = os.path.join(os.path.dirname(__file__), adjustment_file)
@ -134,3 +150,8 @@ def get_doors_max_list():
@cache_argsless @cache_argsless
def get_laser_shuffle(): def get_laser_shuffle():
return get_adjustment_file("settings/Laser_Shuffle.txt") return get_adjustment_file("settings/Laser_Shuffle.txt")
@cache_argsless
def get_audio_logs():
return get_adjustment_file("settings/Audio_Logs.txt")