diff --git a/worlds/witness/Options.py b/worlds/witness/Options.py index 2cb9ade0..b858eb19 100644 --- a/worlds/witness/Options.py +++ b/worlds/witness/Options.py @@ -7,7 +7,7 @@ from Options import Toggle, DefaultOnToggle, Option, Range, Choice # "Play the randomizer in hardmode" # display_name = "Hard Mode" -class DisableNonRandomizedPuzzles(DefaultOnToggle): +class DisableNonRandomizedPuzzles(Toggle): """Disables puzzles that cannot be randomized. 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.""" @@ -59,8 +59,9 @@ class ShuffleVaultBoxes(Toggle): class ShufflePostgame(Toggle): - """Adds locations into the pool that are guaranteed to become accessible before or at the same time as your goal. - Use this if you don't play with forfeit on victory.""" + """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. 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" @@ -75,6 +76,13 @@ class VictoryCondition(Choice): 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): """Sets the amount of beams required to enter the final area.""" display_name = "Required Lasers for Mountain Entry" @@ -108,8 +116,17 @@ class PuzzleSkipAmount(Range): 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] = { - # "hard_mode": HardMode, + "puzzle_randomization": PuzzleRandomization, "shuffle_symbols": ShuffleSymbols, "shuffle_doors": ShuffleDoors, "shuffle_lasers": ShuffleLasers, @@ -123,6 +140,7 @@ the_witness_options: Dict[str, type] = { "early_secret_area": EarlySecretArea, "trap_percentage": TrapPercentage, "puzzle_skip_amount": PuzzleSkipAmount, + "hint_amount": HintAmount, } diff --git a/worlds/witness/WitnessItems.txt b/worlds/witness/WitnessItems.txt index fd9b10f9..d58edab0 100644 --- a/worlds/witness/WitnessItems.txt +++ b/worlds/witness/WitnessItems.txt @@ -15,6 +15,8 @@ Progression: 71 - Black/White Squares 72 - Colored Squares 80 - Arrows +200 - Progressive Dots - Dots,Full Dots +260 - Progressive Stars - Stars,Stars + Same Colored Symbol Usefuls: 101 - Functioning Brain - False diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 650cf14c..236d2207 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -120,7 +120,7 @@ Door - 0x03313 (Second Gate) - 0x032FF Orchard End (Orchard): 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 158602 - 0x17CE7 (Discard) - True - Triangles 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 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 158204 - 0x01D3F (Pressure Plates 4) - 0x0A3AD - Shapers & Dots & Symmetry 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 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 Door - 0x0364E (Shortcut) - 0x03713 158208 - 0x00B10 (Entry Left) - True - True @@ -390,11 +390,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 158221 - 0x28AE3 (Vines) - 0x18590 - True 158222 - 0x28938 (Apple Tree) - 0x28AE3 - True 158223 - 0x079DF (Triple Exit) - 0x28938 - True -158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Dots -158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Dots -158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Dots -158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots -158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - 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 & Full 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 & Full Dots +158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1 158225 - 0x28998 (Tinted Glass Door Panel) - True - Stars & Rotated Shapers Door - 0x28A61 (Tinted Glass Door) - 0x28998 @@ -421,7 +421,7 @@ Town Red Rooftop (Town): 158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True 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): 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 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 158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares 158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots -158454 - 0x00190 (Blue Tunnel Right First 1) - True - Dots & Triangles -158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Dots & Triangles -158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Dots & Triangles -158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Dots & Triangles +158454 - 0x00190 (Blue Tunnel Right First 1) - True - Dots & Triangles & Full Dots +158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Dots & Triangles & Full Dots +158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Dots & Triangles & Full Dots +158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Dots & Triangles & Full Dots 158458 - 0x01A0D (Blue Tunnel Left First 1) - True - Symmetry & Triangles 158459 - 0x008B8 (Blue Tunnel Left Second 1) - True - Black/White Squares & 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 158480 - 0x289E7 (Third Wooden Beam) - True - Stars & Black/White Squares 158481 - 0x288AA (Fourth Wooden Beam) - True - Stars & Shapers -158482 - 0x17FB9 (Left Upstairs Single) - True - Shapers & Dots & Negative Shapers -158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots -158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Stars & Dots -158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Black/White Squares & Stars + Same Colored Symbol & Stars -158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Shapers & Dots -158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Rotated Shapers & Dots +158482 - 0x17FB9 (Left Upstairs Single) - True - Shapers & Dots & Negative Shapers & Full Dots +158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full 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 & Full Dots +158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Shapers & Dots & Full 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 158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - 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: 158522 - 0x0383A (Right Pillar 1) - True - Stars 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 158526 - 0x0383D (Left Pillar 1) - True - Dots 158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt new file mode 100644 index 00000000..3c440060 --- /dev/null +++ b/worlds/witness/WitnessLogicExpert.txt @@ -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: diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 0f8f0d75..7f5b9d2b 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -1,18 +1,20 @@ """ Archipelago init file for The Witness """ - import typing 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 .player_logic import StaticWitnessLogic, WitnessPlayerLogic +from .player_logic import WitnessPlayerLogic +from .static_logic import StaticWitnessLogic from .locations import WitnessPlayerLocations, StaticWitnessLocations from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems from .rules import set_rules from .regions import WitnessRegions 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 @@ -36,7 +38,7 @@ class WitnessWorld(World): """ game = "The Witness" topology_present = False - data_version = 7 + data_version = 8 static_logic = StaticWitnessLogic() static_locat = StaticWitnessLocations() @@ -59,6 +61,8 @@ class WitnessWorld(World): 'door_hexes': self.items.DOORS, 'symbols_not_in_the_game': self.items.SYMBOLS_NOT_IN_THE_GAME, '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): @@ -77,6 +81,8 @@ class WitnessWorld(World): self.items = WitnessPlayerItems(self.locat, self.world, self.player, self.player_logic) 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()} def generate_basic(self): @@ -84,17 +90,18 @@ class WitnessWorld(World): pool = [] items_by_name = dict() for item in self.items.ITEM_TABLE: - witness_item = self.create_item(item) - if item in self.items.PROGRESSION_TABLE: - pool.append(witness_item) - items_by_name[item] = witness_item + for i in range(0, self.items.PROG_ITEM_AMOUNTS[item]): + if item in self.items.PROGRESSION_TABLE: + witness_item = self.create_item(item) + pool.append(witness_item) + items_by_name[item] = witness_item less_junk = 0 # Put good item on first check if symbol shuffle is on 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) first_check = self.world.get_location( @@ -138,9 +145,39 @@ class WitnessWorld(World): set_rules(self.world, self.player, self.player_logic, self.locat) 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: slot_data[option_name] = get_option_value( diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py new file mode 100644 index 00000000..3ee010ea --- /dev/null +++ b/worlds/witness/hints.py @@ -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)] diff --git a/worlds/witness/items.py b/worlds/witness/items.py index 9ffd5a11..cbb15540 100644 --- a/worlds/witness/items.py +++ b/worlds/witness/items.py @@ -2,6 +2,7 @@ Defines progression, junk and event items for The Witness """ import copy +from collections import defaultdict from typing import Dict, NamedTuple, Optional, Set from BaseClasses import Item, MultiWorld @@ -96,6 +97,10 @@ class WitnessPlayerItems: 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): """Adds event items after logic changes due to options""" self.EVENT_ITEM_TABLE = dict() @@ -105,6 +110,8 @@ class WitnessPlayerItems: self.ITEM_ID_TO_DOOR_HEX = dict() self.DOORS = set() + self.PROG_ITEM_AMOUNTS = defaultdict(lambda: 1) + self.SYMBOLS_NOT_IN_THE_GAME = set() self.EXTRA_AMOUNTS = { @@ -118,8 +125,17 @@ class WitnessPlayerItems: if item in StaticWitnessLogic.ALL_SYMBOL_ITEMS: self.SYMBOLS_NOT_IN_THE_GAME.add(StaticWitnessItems.ALL_ITEM_TABLE[item[0]].code) 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.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(): entity_hex_int = int(entity_hex, 16) @@ -138,11 +154,11 @@ class WitnessPlayerItems: if doors and symbols: self.GOOD_ITEMS = [ - "Dots", "Black/White Squares", "Symmetry" + "Progressive Dots", "Black/White Squares", "Symmetry" ] elif symbols: self.GOOD_ITEMS = [ - "Dots", "Black/White Squares", "Stars", + "Progressive Dots", "Black/White Squares", "Progressive Stars", "Shapers", "Symmetry" ] @@ -151,6 +167,10 @@ class WitnessPlayerItems: if not is_option_enabled(world, player, "disable_non_randomized_puzzles"): 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: location = player_logic.EVENT_ITEM_PAIRS[event_location] self.EVENT_ITEM_TABLE[location] = ItemData(None, True, True) diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index ea0728b1..99bd3ece 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -3,7 +3,8 @@ Defines constants for different types of locations in the game """ 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: @@ -52,8 +53,6 @@ class StaticWitnessLocations: "Desert Light Room 3", "Desert Pond Room 5", "Desert Flood Room 6", - "Desert Final Bent 3", - "Desert Final Hexagonal", "Desert Laser Panel", "Quarry Mill Lower Row 6", @@ -247,6 +246,10 @@ class WitnessPlayerLocations: 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 earlyutm = is_option_enabled(world, player, "early_secret_area") victory = get_option_value(world, player, "victory_condition") diff --git a/worlds/witness/player_logic.py b/worlds/witness/player_logic.py index 4840ea0a..a58ad8ef 100644 --- a/worlds/witness/player_logic.py +++ b/worlds/witness/player_logic.py @@ -39,7 +39,7 @@ class WitnessPlayerLogic: if panel_hex in self.COMPLETELY_DISABLED_CHECKS: return frozenset() - check_obj = StaticWitnessLogic.CHECKS_BY_HEX[panel_hex] + check_obj = self.REFERENCE_LOGIC.CHECKS_BY_HEX[panel_hex] these_items = frozenset({frozenset()}) @@ -47,17 +47,21 @@ class WitnessPlayerLogic: these_items = self.DEPENDENT_REQUIREMENTS_BY_HEX[panel_hex]["items"] 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: + self.PROG_ITEMS_ACTUALLY_IN_THE_GAME_NO_MULTI.update(subset) + if panel_hex in self.DOOR_ITEMS_BY_ID: door_items = frozenset({frozenset([item]) for item in self.DOOR_ITEMS_BY_ID[panel_hex]}) 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)) if panel_hex != "0x28A0D": @@ -76,11 +80,11 @@ class WitnessPlayerLogic: dependent_items_for_option = frozenset({frozenset()}) 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: 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])}) # 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 @@ -113,20 +117,26 @@ class WitnessPlayerLogic: """Makes a single logic adjustment based on additional logic file""" if adj_type == "Items": - if line not in StaticWitnessItems.ALL_ITEM_TABLE: - raise RuntimeError("Item \"" + line + "\" does not exit.") + line_split = line.split(" - ") + 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: - panel_hexes = StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT[line][2] + self.THEORETICAL_ITEMS.add(item) + 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: - self.DOOR_ITEMS_BY_ID.setdefault(panel_hex, set()).add(line) + self.DOOR_ITEMS_BY_ID.setdefault(panel_hex, set()).add(item) return 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: panel_hexes = StaticWitnessLogic.ALL_DOOR_ITEMS_AS_DICT[line][2] @@ -265,11 +275,22 @@ class WitnessPlayerLogic: 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): """ 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]) return pair @@ -287,7 +308,7 @@ class WitnessPlayerLogic: if panel == "TrueOneWay": 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.update(self.EVENT_PANELS_FROM_PANELS) @@ -306,12 +327,24 @@ class WitnessPlayerLogic: self.EVENT_PANELS_FROM_PANELS = 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.DOOR_ITEMS_BY_ID = dict() self.STARTING_INVENTORY = set() - self.CONNECTIONS_BY_REGION_NAME = copy.copy(StaticWitnessLogic.STATIC_CONNECTIONS_BY_REGION_NAME) - self.DEPENDENT_REQUIREMENTS_BY_HEX = copy.copy(StaticWitnessLogic.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX) + self.DIFFICULTY = get_option_value(world, player, "puzzle_randomization") + + 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() # Determining which panels need to be events is a difficult process. @@ -333,6 +366,7 @@ class WitnessPlayerLogic: "0x019DC": "Keep Hedges 2 Knowledge", "0x019E7": "Keep Hedges 3 Knowledge", "0x01D3F": "Keep Laser Panel (Pressure Plates) Activates", + "0x01BE9": "Keep Laser Panel (Pressure Plates) Activates", "0x09F7F": "Mountain Access", "0x0367C": "Quarry Laser Mill Requirement Met", "0x009A1": "Swamp Between Bridges Far 1 Activates", @@ -374,6 +408,9 @@ class WitnessPlayerLogic: "0x0356B": "Challenge Video Pattern Knowledge", "0x0A15F": "Desert Laser Panel Shutters Open (1)", "0x012D7": "Desert Laser Panel Shutters Open (2)", + "0x03613": "Treehouse Orange Bridge 13 Turns On", + "0x17DEC": "Treehouse Laser House Access Requirement", + "0x03C08": "Town Church Entry Opens", } self.ALWAYS_EVENT_NAMES_BY_HEX = { diff --git a/worlds/witness/regions.py b/worlds/witness/regions.py index 143f3e77..e17acf73 100644 --- a/worlds/witness/regions.py +++ b/worlds/witness/regions.py @@ -4,7 +4,8 @@ and connects them with the proper requirements """ from BaseClasses import MultiWorld, Entrance -from . import StaticWitnessLogic +from .static_logic import StaticWitnessLogic +from .Options import get_option_value from .locations import WitnessPlayerLocations from .player_logic import WitnessPlayerLogic @@ -39,7 +40,7 @@ class WitnessRegions: connection = Entrance( player, - source + " to " + target + " via " + str(panel_hex_to_solve_set), + source + " to " + target, source_region ) @@ -58,16 +59,23 @@ class WitnessRegions: 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() - 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 = [ - StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] for panel in region["panels"] - if StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] in self.locat.CHECK_LOCATION_TABLE + reference_logic.CHECKS_BY_HEX[panel]["checkName"] for panel in region["panels"] + if reference_logic.CHECKS_BY_HEX[panel]["checkName"] in self.locat.CHECK_LOCATION_TABLE ] locations_for_this_region += [ - StaticWitnessLogic.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 + reference_logic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" for panel in region["panels"] + if reference_logic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" in self.locat.EVENT_LOCATION_TABLE ] 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) ] - 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]: if connection[0] == "Entry": continue @@ -87,7 +95,7 @@ class WitnessRegions: for subset in connection[1]: 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, region_name, connection[0], player_logic, connection[1]) diff --git a/worlds/witness/rules.py b/worlds/witness/rules.py index 2b9888b3..02efc5ef 100644 --- a/worlds/witness/rules.py +++ b/worlds/witness/rules.py @@ -91,13 +91,64 @@ class WitnessLogic(LogicMixin): if not self._witness_has_lasers(world, player, get_option_value(world, player, "challenge_lasers")): valid_option = False break + elif item == "PP2 Weirdness": + hedge_2_access = ( + self.can_reach("Keep 2nd Maze to Keep", "Entrance", player) + or self.can_reach("Keep to Keep 2nd Maze", "Entrance", player) + ) + + hedge_3_access = ( + self.can_reach("Keep 3rd Maze to Keep", "Entrance", player) + or self.can_reach("Keep 2nd Maze to Keep 3rd Maze", "Entrance", player) + and hedge_2_access + ) + + hedge_4_access = ( + self.can_reach("Keep 4th Maze to Keep", "Entrance", player) + or self.can_reach("Keep 3rd Maze to Keep 4th Maze", "Entrance", player) + and hedge_3_access + ) + + hedge_access = ( + self.can_reach("Keep 4th Maze to Keep Tower", "Entrance", player) + and self.can_reach("Keep", "Region", player) + and hedge_4_access + ) + + backwards_to_fourth = ( + self.can_reach("Keep", "Region", player) + and self.can_reach("Keep 4th Pressure Plate to Keep Tower", "Entrance", player) + and ( + self.can_reach("Keep Tower to Keep", "Entrance", player) + or hedge_access + ) + ) + + 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: if not self._witness_can_solve_panel(item, world, player, player_logic, locat): valid_option = False break elif not self.has(item, player): - valid_option = False - break + 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 + break if valid_option: return True diff --git a/worlds/witness/settings/Audio_Logs.txt b/worlds/witness/settings/Audio_Logs.txt new file mode 100644 index 00000000..27ce1267 --- /dev/null +++ b/worlds/witness/settings/Audio_Logs.txt @@ -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 \ No newline at end of file diff --git a/worlds/witness/settings/Disable_Unrandomized.txt b/worlds/witness/settings/Disable_Unrandomized.txt index 4f26e313..43c69409 100644 --- a/worlds/witness/settings/Disable_Unrandomized.txt +++ b/worlds/witness/settings/Disable_Unrandomized.txt @@ -52,6 +52,10 @@ Disabled Locations: 0x019E7 (Keep Hedge Maze 3) 0x01A0F (Keep Hedge Maze 4) 0x0360E (Laser Hedges) +0x03307 (First Gate) +0x03313 (Second Gate) +0x0C128 (Entry Inner) +0x0C153 (Entry Outer) 0x00B10 (Monastery Entry Left) 0x00C92 (Monastery Entry Right) 0x00290 (Monastery Outside 1) @@ -83,6 +87,10 @@ Disabled Locations: 0x15ADD (River Outside Vault) 0x03702 (River Vault Box) 0x17CAA (Monastery Shortcut Panel) +0x0C2A4 (Bunker Entry) +0x17C79 (Tinted Glass Door) +0x0C2A3 (UV Room Entry) +0x0A08D (Elevator Room Entry) 0x17C2E (Door to Bunker) 0x09F7D (Bunker Intro Left 1) 0x09FDC (Bunker Intro Left 2) diff --git a/worlds/witness/settings/Symbol_Shuffle.txt b/worlds/witness/settings/Symbol_Shuffle.txt index d03391f5..3d0342f5 100644 --- a/worlds/witness/settings/Symbol_Shuffle.txt +++ b/worlds/witness/settings/Symbol_Shuffle.txt @@ -1,5 +1,6 @@ Items: -Dots +Arrows +Progressive Dots Colored Dots Sound Dots Symmetry @@ -8,7 +9,6 @@ Eraser Shapers Rotated Shapers Negative Shapers -Stars -Stars + Same Colored Symbol +Progressive Stars Black/White Squares Colored Squares \ No newline at end of file diff --git a/worlds/witness/static_logic.py b/worlds/witness/static_logic.py index 646957c4..18a0e19c 100644 --- a/worlds/witness/static_logic.py +++ b/worlds/witness/static_logic.py @@ -1,73 +1,15 @@ import os -from .utils import define_new_region, parse_lambda +from .utils import define_new_region, parse_lambda, lazy -class StaticWitnessLogic: - ALL_SYMBOL_ITEMS = set() - 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): +class StaticWitnessLogicObj: + def read_logic_file(self, file_path="WitnessLogic.txt"): """ 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: current_region = dict() @@ -157,6 +99,99 @@ class StaticWitnessLogic: 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): 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) + diff --git a/worlds/witness/utils.py b/worlds/witness/utils.py index 809b2b1c..a69dabbb 100644 --- a/worlds/witness/utils.py +++ b/worlds/witness/utils.py @@ -89,6 +89,22 @@ def parse_lambda(lambda_string): 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): path = os.path.join(os.path.dirname(__file__), adjustment_file) @@ -134,3 +150,8 @@ def get_doors_max_list(): @cache_argsless def get_laser_shuffle(): return get_adjustment_file("settings/Laser_Shuffle.txt") + + +@cache_argsless +def get_audio_logs(): + return get_adjustment_file("settings/Audio_Logs.txt")