The Witness: Expert & Hints (#1072)
This commit is contained in:
		
							parent
							
								
									7b3ef012b9
								
							
						
					
					
						commit
						3297be7902
					
				| 
						 | 
					@ -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,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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:
 | 
				
			||||||
| 
						 | 
					@ -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(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)]
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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])
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue