From 707289c7dd5d5f8fac277a832d61e646fa370a40 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 00:18:00 +0100 Subject: [PATCH 001/110] First efforts on area hints --- worlds/witness/Options.py | 8 + worlds/witness/WitnessLogic.txt | 194 +++++++++++------- worlds/witness/WitnessLogicExpert.txt | 14 +- worlds/witness/WitnessLogicVanilla.txt | 14 +- worlds/witness/__init__.py | 9 +- worlds/witness/hints.py | 28 ++- worlds/witness/locations.py | 26 +-- .../witness/settings/EP_Shuffle/EP_Sides.txt | 12 +- worlds/witness/static_logic.py | 19 +- 9 files changed, 215 insertions(+), 109 deletions(-) diff --git a/worlds/witness/Options.py b/worlds/witness/Options.py index 4c4b4f76267f..3d5a38780e09 100644 --- a/worlds/witness/Options.py +++ b/worlds/witness/Options.py @@ -180,6 +180,13 @@ class HintAmount(Range): default = 10 +class HintType(Choice): + display_name = "Hint Type" + option_locations = 0 + option_areas = 1 + default = 1 + + class DeathLink(Toggle): """If on: Whenever you fail a puzzle (with some exceptions), everyone who is also on Death Link dies. The effect of a "death" in The Witness is a Power Surge.""" @@ -208,4 +215,5 @@ class TheWitnessOptions(PerGameCommonOptions): trap_percentage: TrapPercentage puzzle_skip_amount: PuzzleSkipAmount hint_amount: HintAmount + hint_type: HintType death_link: DeathLink diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index acfbe8c14eb0..fcadf30b5ee7 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -1,3 +1,5 @@ +==Tutorial== + Menu (Menu) - Entry - True: Entry (Entry): @@ -58,9 +60,23 @@ Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3: Door - 0x04CA3 (Outpost Exit) - 0x04CA4 158600 - 0x17CFB (Discard) - True - Triangles +Orchard (Orchard) - Main Island - True - Orchard Beyond First Gate - 0x03307: +158071 - 0x00143 (Apple Tree 1) - True - True +158072 - 0x0003B (Apple Tree 2) - 0x00143 - True +158073 - 0x00055 (Apple Tree 3) - 0x0003B - True +Door - 0x03307 (First Gate) - 0x00055 + +Orchard Beyond First Gate (Orchard) - Orchard End - 0x03313: +158074 - 0x032F7 (Apple Tree 4) - 0x00055 - True +158075 - 0x032FF (Apple Tree 5) - 0x032F7 - True +Door - 0x03313 (Second Gate) - 0x032FF + +Orchard End (Orchard): + Main Island (Main Island) - Outside Tutorial - True: 159801 - 0xFFD00 (Reached Independently) - True - True -159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True + +==Glass Factory== Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29: 158027 - 0x01A54 (Entry Panel) - True - Symmetry @@ -85,6 +101,8 @@ Door - 0x0D7ED (Back Wall) - 0x0005C Inside Glass Factory Behind Back Wall (Glass Factory) - The Ocean - 0x17CC8: 158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat +==Symmetry Island== + Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E: 158040 - 0x000B0 (Lower Panel) - 0x0343A - Dots Door - 0x17F3E (Lower) - 0x000B0 @@ -128,18 +146,15 @@ Symmetry Island Upper (Symmetry Island): Laser - 0x00509 (Laser) - 0x0360D 159001 - 0x03367 (Glass Factory Black Line EP) - True - True -Orchard (Orchard) - Main Island - True - Orchard Beyond First Gate - 0x03307: -158071 - 0x00143 (Apple Tree 1) - True - True -158072 - 0x0003B (Apple Tree 2) - 0x00143 - True -158073 - 0x00055 (Apple Tree 3) - 0x0003B - True -Door - 0x03307 (First Gate) - 0x00055 +==Desert== -Orchard Beyond First Gate (Orchard) - Orchard End - 0x03313: -158074 - 0x032F7 (Apple Tree 4) - 0x00055 - True -158075 - 0x032FF (Apple Tree 5) - 0x032F7 - True -Door - 0x03313 (Second Gate) - 0x032FF - -Orchard End (Orchard): +Desert Obelisk (Desert) - Entry - True: +159700 - 0xFFE00 (Obelisk Side 1) - 0x0332B & 0x03367 & 0x28B8A - True +159701 - 0xFFE01 (Obelisk Side 2) - 0x037B6 & 0x037B2 & 0x000F7 - True +159702 - 0xFFE02 (Obelisk Side 3) - 0x3351D - True +159703 - 0xFFE03 (Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True +159704 - 0xFFE04 (Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True +159709 - 0x00359 (Obelisk) - True - True Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE - Desert Vault - 0x03444: 158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots @@ -220,6 +235,16 @@ Door - 0x01317 (Elevator) - 0x03608 Desert Lowest Level Inbetween Shortcuts (Desert): +==Quarry== + +Quarry Obelisk (Quarry) - Entry - True: +159740 - 0xFFE40 (Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True +159741 - 0xFFE41 (Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True +159742 - 0xFFE42 (Obelisk Side 3) - 0x289CF & 0x289D1 - True +159743 - 0xFFE43 (Obelisk Side 4) - 0x33692 - True +159744 - 0xFFE44 (Obelisk Side 5) - 0x03E77 & 0x03E7C - True +159749 - 0x22073 (Obelisk) - True - True + Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: 158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares 158603 - 0x17CF0 (Discard) - True - Triangles @@ -322,6 +347,8 @@ Door - 0x3865F (Second Barrier) - 0x38663 158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers 159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True +==Shadows== + 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 | 0x334DC @@ -361,10 +388,7 @@ Shadows Laser Room (Shadows): 158703 - 0x19650 (Laser Panel) - 0x194B2 & 0x19665 - True Laser - 0x181B3 (Laser) - 0x19650 -Treehouse Beach (Treehouse Beach) - Main Island - True: -159200 - 0x0053D (Rock Shadow EP) - True - True -159201 - 0x0053E (Sand Shadow EP) - True - True -159212 - 0x220BD (Both Orange Bridges EP) - 0x17DA2 & 0x17DDB - True +==Keep== Keep (Keep) - Main Island - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: 158193 - 0x00139 (Hedge Maze 1) - True - True @@ -374,6 +398,7 @@ Door - 0x01954 (Hedge Maze 1 Exit) - 0x00139 Door - 0x01BEC (Pressure Plates 1 Exit) - 0x033EA 159430 - 0x03E77 (Red Flowers EP) - True - True 159431 - 0x03E7C (Purple Flowers EP) - True - True +159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True Keep 2nd Maze (Keep) - Keep - 0x018CE - Keep 3rd Maze - 0x019D8: Door - 0x018CE (Hedge Maze 2 Shortcut) - 0x00139 @@ -408,6 +433,22 @@ Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F 158205 - 0x09E49 (Shadows Shortcut Panel) - True - True Door - 0x09E3D (Shadows Shortcut) - 0x09E49 +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 - True +158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Dots +Laser - 0x014BB (Laser) - 0x0360E | 0x03317 +159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True +159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True +159242 - 0x033DD (Pressure Plates 3 EP) - 0x01CD3 & 0x01CD5 - True +159243 - 0x033E5 (Pressure Plates 4 Left Exit EP) - 0x01D3F - True +159244 - 0x018B6 (Pressure Plates 4 Right Exit EP) - 0x01D3F - True +159250 - 0x28AE9 (Path EP) - True - True +159251 - 0x3348F (Hedges EP) - True - True + +==Shipwreck== + Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True - Shipwreck Vault - 0x17BB4: 158654 - 0x00AFB (Vault Panel) - True - Symmetry & Sound Dots & Colored Dots Door - 0x17BB4 (Vault Door) - 0x00AFB @@ -423,19 +464,16 @@ Door - 0x17BB4 (Vault Door) - 0x00AFB Shipwreck Vault (Shipwreck): 158655 - 0x03535 (Vault Box) - True - True -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 - True -158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Dots -Laser - 0x014BB (Laser) - 0x0360E | 0x03317 -159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True -159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True -159242 - 0x033DD (Pressure Plates 3 EP) - 0x01CD3 & 0x01CD5 - True -159243 - 0x033E5 (Pressure Plates 4 Left Exit EP) - 0x01D3F - True -159244 - 0x018B6 (Pressure Plates 4 Right Exit EP) - 0x01D3F - True -159250 - 0x28AE9 (Path EP) - True - True -159251 - 0x3348F (Hedges EP) - True - True +==Monastery== + +Monastery Obelisk (Monastery) - Entry - True: +159710 - 0xFFE10 (Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True +159711 - 0xFFE11 (Obelisk Side 2) - 0x03AC5 - True +159712 - 0xFFE12 (Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True +159713 - 0xFFE13 (Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True +159714 - 0xFFE14 (Obelisk Side 5) - 0x03E01 - True +159715 - 0xFFE15 (Obelisk Side 6) - 0x289F4 & 0x289F5 - True +159719 - 0x00263 (Obelisk) - True - True Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750: 158207 - 0x03713 (Laser Shortcut Panel) - True - True @@ -470,6 +508,17 @@ Inside Monastery (Monastery): Monastery Garden (Monastery): +==Town== + +Town Obelisk (Town) - Entry - True: +159750 - 0xFFE50 (Obelisk Side 1) - 0x035C7 - True +159751 - 0xFFE51 (Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True +159752 - 0xFFE52 (Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True +159753 - 0xFFE53 (Obelisk Side 4) - 0x28B30 & 0x035C9 - True +159754 - 0xFFE54 (Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True +159755 - 0xFFE55 (Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True +159759 - 0x0A16C (Obelisk) - True - True + Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9: 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers @@ -550,6 +599,8 @@ Laser - 0x032F9 (Laser) - 0x032F5 159422 - 0x33692 (Brown Bridge EP) - True - True 159551 - 0x03BCE (Black Line Tower EP) - True - True +==Windmill & Theater== + Windmill Interior (Windmill) - Theater - 0x17F88: 158247 - 0x17D02 (Turn Control) - True - Dots 158248 - 0x17F89 (Theater Entry Panel) - True - Black/White Squares @@ -573,6 +624,8 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2 159556 - 0x33A2A (Door EP) - 0x03553 - True 159558 - 0x33B06 (Church EP) - 0x0354E - True +==Jungle== + Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF: 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158609 - 0x17F9B (Discard) - True - Triangles @@ -617,6 +670,8 @@ Door - 0x15287 (Vault Door) - 0x15ADD River Vault (River): 158664 - 0x03702 (Vault Box) - True - True +==Bunker== + Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4: 158268 - 0x17C2E (Entry Panel) - True - Black/White Squares Door - 0x0C2A4 (Entry) - 0x17C2E @@ -660,6 +715,8 @@ Bunker Laser Platform (Bunker) - Bunker Elevator - TrueOneWay: 158710 - 0x09DE0 (Laser Panel) - True - True Laser - 0x0C2B2 (Laser) - 0x09DE0 +==Swamp== + Outside Swamp (Swamp) - Swamp Entry Area - 0x00C1C - Main Island - True: 158287 - 0x0056E (Entry Panel) - True - Shapers Door - 0x00C1C (Entry) - 0x0056E @@ -774,6 +831,22 @@ Laser - 0x00BF6 (Laser) - 0x03615 158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Rotated Shapers Door - 0x2D880 (Laser Shortcut) - 0x17C02 +==Treehouse== + +Treehouse Obelisk (Treehouse) - Entry - True: +159720 - 0xFFE20 (Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True +159721 - 0xFFE21 (Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True +159722 - 0xFFE22 (Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True +159723 - 0xFFE23 (Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True +159724 - 0xFFE24 (Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True +159725 - 0xFFE25 (Obelisk Side 6) - 0x28AE9 & 0x3348F - True +159729 - 0x00097 (Obelisk) - True - True + +Treehouse Beach (Treehouse Beach) - Main Island - True: +159200 - 0x0053D (Rock Shadow EP) - True - True +159201 - 0x0053E (Sand Shadow EP) - True - True +159212 - 0x220BD (Both Orange Bridges EP) - 0x17DA2 & 0x17DDB - True + Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309 - The Ocean - 0x17C95: 158343 - 0x17C95 (Boat Spawn) - True - Boat 158344 - 0x0288C (First Door Panel) - True - Stars @@ -882,6 +955,17 @@ Treehouse Laser Room (Treehouse): 158403 - 0x17CBC (Laser House Door Timer Inside) - True - True Laser - 0x028A4 (Laser) - 0x03613 +==Mountain (Outside)== + +Mountainside Obelisk (Mountainside) - Entry - True: +159730 - 0xFFE30 (Obelisk Side 1) - 0x001A3 & 0x335AE - True +159731 - 0xFFE31 (Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True +159732 - 0xFFE32 (Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True +159733 - 0xFFE33 (Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True +159734 - 0xFFE34 (Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True +159735 - 0xFFE35 (Obelisk Side 6) - 0x035CB & 0x035CF - True +159739 - 0x00367 (Obelisk) - True - True + Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085: 158612 - 0x17C42 (Discard) - True - Triangles 158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Dots & Black/White Squares & Dots @@ -903,6 +987,8 @@ Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: 159324 - 0x336C8 (Arch White Right EP) - True - True 159326 - 0x3369A (Arch White Left EP) - True - True +==Mountain (Inside)== + Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Colored Squares & Eraser @@ -987,6 +1073,8 @@ Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D: Door - 0x2D77D (Caves Entry) - 0x00FF8 158448 - 0x334E1 (Rock Control) - True - True +==Caves== + 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 @@ -1046,6 +1134,8 @@ Path to Challenge (Caves) - Challenge - 0x0A19A: 158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol Door - 0x0A19A (Challenge Entry) - 0x0A16E +==Challenge== + Challenge (Challenge) - Tunnels - 0x0348A - Challenge Vault - 0x04D75: 158499 - 0x0A332 (Start Timer) - 11 Lasers - True 158500 - 0x0088E (Small Basic) - 0x0A332 - True @@ -1074,6 +1164,8 @@ Door - 0x0348A (Tunnels Entry) - 0x039B4 Challenge Vault (Challenge): 158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True +==Tunnels== + 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 @@ -1103,6 +1195,8 @@ Elevator (Mountain Final Room): 158535 - 0x3D9A8 (Back Wall Right) - 0x3D9A6 | 0x3D9A7 - True 158536 - 0x3D9A9 (Elevator Start) - 0x3D9AA & 7 Lasers | 0x3D9A8 & 7 Lasers - True +==The Ocean== + The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay: 159042 - 0x22106 (Desert EP) - True - True 159223 - 0x03B25 (Shipwreck CCW Underside EP) - True - True @@ -1114,45 +1208,3 @@ The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Tre 159521 - 0x33879 (Tutorial Reflection EP) - True - True 159522 - 0x03C19 (Tutorial Moss EP) - True - True 159531 - 0x035C9 (Cargo Box EP) - 0x0A0C9 - True - -Obelisks (EPs) - Entry - True: -159700 - 0xFFE00 (Desert Obelisk Side 1) - 0x0332B & 0x03367 & 0x28B8A - True -159701 - 0xFFE01 (Desert Obelisk Side 2) - 0x037B6 & 0x037B2 & 0x000F7 - True -159702 - 0xFFE02 (Desert Obelisk Side 3) - 0x3351D - True -159703 - 0xFFE03 (Desert Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True -159704 - 0xFFE04 (Desert Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True -159709 - 0x00359 (Desert Obelisk) - True - True -159710 - 0xFFE10 (Monastery Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True -159711 - 0xFFE11 (Monastery Obelisk Side 2) - 0x03AC5 - True -159712 - 0xFFE12 (Monastery Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True -159713 - 0xFFE13 (Monastery Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True -159714 - 0xFFE14 (Monastery Obelisk Side 5) - 0x03E01 - True -159715 - 0xFFE15 (Monastery Obelisk Side 6) - 0x289F4 & 0x289F5 - True -159719 - 0x00263 (Monastery Obelisk) - True - True -159720 - 0xFFE20 (Treehouse Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True -159721 - 0xFFE21 (Treehouse Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True -159722 - 0xFFE22 (Treehouse Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True -159723 - 0xFFE23 (Treehouse Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True -159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True -159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True -159729 - 0x00097 (Treehouse Obelisk) - True - True -159730 - 0xFFE30 (River Obelisk Side 1) - 0x001A3 & 0x335AE - True -159731 - 0xFFE31 (River Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True -159732 - 0xFFE32 (River Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True -159733 - 0xFFE33 (River Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True -159734 - 0xFFE34 (River Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True -159735 - 0xFFE35 (River Obelisk Side 6) - 0x035CB & 0x035CF - True -159739 - 0x00367 (River Obelisk) - True - True -159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True -159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True -159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True -159743 - 0xFFE43 (Quarry Obelisk Side 4) - 0x33692 - True -159744 - 0xFFE44 (Quarry Obelisk Side 5) - 0x03E77 & 0x03E7C - True -159749 - 0x22073 (Quarry Obelisk) - True - True -159750 - 0xFFE50 (Town Obelisk Side 1) - 0x035C7 - True -159751 - 0xFFE51 (Town Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True -159752 - 0xFFE52 (Town Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True -159753 - 0xFFE53 (Town Obelisk Side 4) - 0x28B30 & 0x035C9 - True -159754 - 0xFFE54 (Town Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True -159755 - 0xFFE55 (Town Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True -159759 - 0x0A16C (Town Obelisk) - True - True diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index b1d9b8e30e40..14ff4434f29f 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -1136,13 +1136,13 @@ Obelisks (EPs) - Entry - True: 159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True 159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True 159729 - 0x00097 (Treehouse Obelisk) - True - True -159730 - 0xFFE30 (River Obelisk Side 1) - 0x001A3 & 0x335AE - True -159731 - 0xFFE31 (River Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True -159732 - 0xFFE32 (River Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True -159733 - 0xFFE33 (River Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True -159734 - 0xFFE34 (River Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True -159735 - 0xFFE35 (River Obelisk Side 6) - 0x035CB & 0x035CF - True -159739 - 0x00367 (River Obelisk) - True - True +159730 - 0xFFE30 (Mountainside Obelisk Side 1) - 0x001A3 & 0x335AE - True +159731 - 0xFFE31 (Mountainside Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True +159732 - 0xFFE32 (Mountainside Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True +159733 - 0xFFE33 (Mountainside Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True +159734 - 0xFFE34 (Mountainside Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True +159735 - 0xFFE35 (Mountainside Obelisk Side 6) - 0x035CB & 0x035CF - True +159739 - 0x00367 (Mountainside Obelisk) - True - True 159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True 159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True 159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 719eae6c4e56..fb0907a34846 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -1136,13 +1136,13 @@ Obelisks (EPs) - Entry - True: 159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True 159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True 159729 - 0x00097 (Treehouse Obelisk) - True - True -159730 - 0xFFE30 (River Obelisk Side 1) - 0x001A3 & 0x335AE - True -159731 - 0xFFE31 (River Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True -159732 - 0xFFE32 (River Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True -159733 - 0xFFE33 (River Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True -159734 - 0xFFE34 (River Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True -159735 - 0xFFE35 (River Obelisk Side 6) - 0x035CB & 0x035CF - True -159739 - 0x00367 (River Obelisk) - True - True +159730 - 0xFFE30 (Mountainside Obelisk Side 1) - 0x001A3 & 0x335AE - True +159731 - 0xFFE31 (Mountainside Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True +159732 - 0xFFE32 (Mountainside Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True +159733 - 0xFFE33 (Mountainside Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True +159734 - 0xFFE34 (Mountainside Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True +159735 - 0xFFE35 (Mountainside Obelisk Side 6) - 0x035CB & 0x035CF - True +159739 - 0x00367 (Mountainside Obelisk) - True - True 159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True 159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True 159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index c2d2311c1537..c0f32979546e 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -6,11 +6,11 @@ from BaseClasses import Region, Location, MultiWorld, Item, Entrance, Tutorial, CollectionState from Options import PerGameCommonOptions, Toggle -from .hints import get_always_hint_locations, get_always_hint_items, get_priority_hint_locations, \ - get_priority_hint_items, make_hints, generate_joke_hints from worlds.AutoWorld import World, WebWorld from .player_logic import WitnessPlayerLogic from .static_logic import StaticWitnessLogic +from .hints import get_always_hint_locations, get_always_hint_items, get_priority_hint_locations, \ + get_priority_hint_items, make_direct_hints, generate_joke_hints, make_area_hints from .locations import WitnessPlayerLocations, StaticWitnessLocations from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems, ItemData from .regions import WitnessRegions @@ -267,7 +267,10 @@ def fill_slot_data(self) -> dict: audio_logs = get_audio_logs().copy() if hint_amount != 0: - generated_hints = make_hints(self, hint_amount, self.own_itempool) + if self.options.hint_type == 0: + generated_hints = make_direct_hints(self, hint_amount, self.own_itempool) + else: + generated_hints = make_area_hints(self, hint_amount) self.random.shuffle(audio_logs) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 24302f0c6724..db5fc475efe7 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,6 +1,8 @@ +import logging from typing import Tuple, List, TYPE_CHECKING from BaseClasses import Item +from . import StaticWitnessLogic if TYPE_CHECKING: from . import WitnessWorld @@ -248,7 +250,7 @@ def make_hint_from_location(world: "WitnessWorld", location: str): return location, item_name, location_obj.address if (location_obj.player == world.player) else -1 -def make_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item]): +def make_direct_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item]): hints = list() prog_items_in_this_world = { @@ -377,3 +379,27 @@ def make_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item] def generate_joke_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]]: return [(x, -1) for x in world.random.sample(joke_hints, amount)] + + +def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]]: + potential_areas = list(StaticWitnessLogic.ALL_AREAS_BY_NAME.keys()) + actual_amount = min(amount, len(potential_areas)) + + if actual_amount != amount: + player_name = world.multiworld.get_player_name(world.player) + logging.warning(f"There are not enough areas in the game to make {amount} area hints for player {player_name}.") + + hinted_areas = world.random.sample(potential_areas, actual_amount) + + hints = [] + + for area in hinted_areas: + regions = [ + world.multiworld.get_region(region, world.player) + for region in StaticWitnessLogic.ALL_AREAS_BY_NAME[area]["regions"] + ] + locations = [location for region in regions for location in region.get_locations() if location.address] + + print(area, locations) + + return hints diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index d20be2794056..35c7953d9584 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -185,7 +185,7 @@ class StaticWitnessLocations: "Outside Tutorial Town Sewer EP", "Outside Tutorial Path EP", "Outside Tutorial Tractor EP", - "Main Island Thundercloud EP", + "Keep Thundercloud EP", "Glass Factory Vase EP", "Symmetry Island Glass Factory Black Line Reflection EP", "Symmetry Island Glass Factory Black Line EP", @@ -330,12 +330,12 @@ class StaticWitnessLocations: "Treehouse Obelisk Side 4", "Treehouse Obelisk Side 5", "Treehouse Obelisk Side 6", - "River Obelisk Side 1", - "River Obelisk Side 2", - "River Obelisk Side 3", - "River Obelisk Side 4", - "River Obelisk Side 5", - "River Obelisk Side 6", + "Mountainside Obelisk Side 1", + "Mountainside Obelisk Side 2", + "Mountainside Obelisk Side 3", + "Mountainside Obelisk Side 4", + "Mountainside Obelisk Side 5", + "Mountainside Obelisk Side 6", "Quarry Obelisk Side 1", "Quarry Obelisk Side 2", "Quarry Obelisk Side 3", @@ -438,12 +438,12 @@ class StaticWitnessLocations: "Treehouse Obelisk Side 4", "Treehouse Obelisk Side 5", "Treehouse Obelisk Side 6", - "River Obelisk Side 1", - "River Obelisk Side 2", - "River Obelisk Side 3", - "River Obelisk Side 4", - "River Obelisk Side 5", - "River Obelisk Side 6", + "Mountainside Obelisk Side 1", + "Mountainside Obelisk Side 2", + "Mountainside Obelisk Side 3", + "Mountainside Obelisk Side 4", + "Mountainside Obelisk Side 5", + "Mountainside Obelisk Side 6", "Quarry Obelisk Side 1", "Quarry Obelisk Side 2", "Quarry Obelisk Side 3", diff --git a/worlds/witness/settings/EP_Shuffle/EP_Sides.txt b/worlds/witness/settings/EP_Shuffle/EP_Sides.txt index 82ab63329500..d561ffdc183f 100644 --- a/worlds/witness/settings/EP_Shuffle/EP_Sides.txt +++ b/worlds/witness/settings/EP_Shuffle/EP_Sides.txt @@ -16,12 +16,12 @@ Added Locations: 0xFFE23 (Treehouse Obelisk Side 4) 0xFFE24 (Treehouse Obelisk Side 5) 0xFFE25 (Treehouse Obelisk Side 6) -0xFFE30 (River Obelisk Side 1) -0xFFE31 (River Obelisk Side 2) -0xFFE32 (River Obelisk Side 3) -0xFFE33 (River Obelisk Side 4) -0xFFE34 (River Obelisk Side 5) -0xFFE35 (River Obelisk Side 6) +0xFFE30 (Mountainside Obelisk Side 1) +0xFFE31 (Mountainside Obelisk Side 2) +0xFFE32 (Mountainside Obelisk Side 3) +0xFFE33 (Mountainside Obelisk Side 4) +0xFFE34 (Mountainside Obelisk Side 5) +0xFFE35 (Mountainside Obelisk Side 6) 0xFFE40 (Quarry Obelisk Side 1) 0xFFE41 (Quarry Obelisk Side 2) 0xFFE42 (Quarry Obelisk Side 3) diff --git a/worlds/witness/static_logic.py b/worlds/witness/static_logic.py index 29c171d45c33..768eff9b3919 100644 --- a/worlds/witness/static_logic.py +++ b/worlds/witness/static_logic.py @@ -56,6 +56,11 @@ def read_logic_file(self, lines): """ current_region = dict() + current_area = { + "name": "Misc", + "regions": [], + } + self.ALL_AREAS_BY_NAME["Misc"] = current_area for line in lines: if line == "" or line[0] == "#": @@ -67,6 +72,16 @@ def read_logic_file(self, lines): region_name = current_region["name"] self.ALL_REGIONS_BY_NAME[region_name] = current_region self.STATIC_CONNECTIONS_BY_REGION_NAME[region_name] = new_region_and_connections[1] + current_area["regions"].append(region_name) + continue + + if line[0] == "=": + area_name = line[2:-2] + current_area = { + "name": area_name, + "regions": [], + } + self.ALL_AREAS_BY_NAME[area_name] = current_area continue line_split = line.split(" - ") @@ -121,7 +136,6 @@ def read_logic_file(self, lines): location_type = "Laser" elif "Obelisk Side" in entity_name: location_type = "Obelisk Side" - full_entity_name = entity_name elif "EP" in entity_name: location_type = "EP" else: @@ -168,6 +182,7 @@ def __init__(self, lines=None): # All regions with a list of panels in them and the connections to other regions, before logic adjustments self.ALL_REGIONS_BY_NAME = dict() + self.ALL_AREAS_BY_NAME = dict() self.STATIC_CONNECTIONS_BY_REGION_NAME = dict() self.ENTITIES_BY_HEX = dict() @@ -189,6 +204,7 @@ class StaticWitnessLogic: _progressive_lookup: Dict[str, str] = {} ALL_REGIONS_BY_NAME = dict() + ALL_AREAS_BY_NAME = dict() STATIC_CONNECTIONS_BY_REGION_NAME = dict() OBELISK_SIDE_ID_TO_EP_HEXES = dict() @@ -266,6 +282,7 @@ def __init__(self): self.parse_items() self.ALL_REGIONS_BY_NAME.update(self.sigma_normal.ALL_REGIONS_BY_NAME) + self.ALL_AREAS_BY_NAME.update(self.sigma_normal.ALL_AREAS_BY_NAME) self.STATIC_CONNECTIONS_BY_REGION_NAME.update(self.sigma_normal.STATIC_CONNECTIONS_BY_REGION_NAME) self.ENTITIES_BY_HEX.update(self.sigma_normal.ENTITIES_BY_HEX) From 204eb9f986c89b2b0d1b5666c4260f73ec0d2818 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 00:45:59 +0100 Subject: [PATCH 002/110] New hint system finished, doesn't work with Expert or Normal yet --- worlds/witness/WitnessLogic.txt | 38 ++++++------- worlds/witness/__init__.py | 23 +++++--- worlds/witness/hints.py | 95 +++++++++++++++++++++++++++++---- 3 files changed, 119 insertions(+), 37 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index fcadf30b5ee7..5f982ea75482 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -1065,6 +1065,25 @@ Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 +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 & 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 +158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers +158529 - 0x339BB (Left Pillar 4) - 0x03859 - Black/White Squares & Stars & Symmetry + +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 & 7 Lasers | 0x3D9A8 & 7 Lasers - True + Mountain Pink Bridge EP (Mountain Floor 2): 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True @@ -1176,25 +1195,6 @@ Door - 0x27263 (Desert Shortcut) - 0x2773D Door - 0x09E87 (Town Shortcut) - 0x09E85 159557 - 0x33A20 (Theater Flowers EP) - 0x03553 & Theater to Tunnels - True -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 & 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 -158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers -158529 - 0x339BB (Left Pillar 4) - 0x03859 - Black/White Squares & Stars & Symmetry - -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 & 7 Lasers | 0x3D9A8 & 7 Lasers - True - ==The Ocean== The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay: diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index c0f32979546e..0bff293c9065 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -2,6 +2,7 @@ Archipelago init file for The Witness """ import dataclasses +import logging from typing import Dict, Optional from BaseClasses import Region, Location, MultiWorld, Item, Entrance, Tutorial, CollectionState @@ -266,22 +267,28 @@ def fill_slot_data(self) -> dict: audio_logs = get_audio_logs().copy() - if hint_amount != 0: + if hint_amount: if self.options.hint_type == 0: generated_hints = make_direct_hints(self, hint_amount, self.own_itempool) else: generated_hints = make_area_hints(self, hint_amount) - self.random.shuffle(audio_logs) + hint_amount = len(generated_hints) - duplicates = min(3, len(audio_logs) // hint_amount) + if hint_amount: + self.random.shuffle(audio_logs) - for _ in range(0, hint_amount): - hint = generated_hints.pop(0) + duplicates = min(3, len(audio_logs) // hint_amount) - for _ in range(0, duplicates): - audio_log = audio_logs.pop() - self.log_ids_to_hints[int(audio_log, 16)] = hint + for _ in range(0, hint_amount): + hint = generated_hints.pop(0) + + for _ in range(0, duplicates): + audio_log = audio_logs.pop() + self.log_ids_to_hints[int(audio_log, 16)] = hint + else: + player_name = self.multiworld.get_player_name(self.player) + logging.warning(f"For some reason, no hints were able to be generated for {player_name}'s world.") if audio_logs: audio_log = audio_logs.pop() diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index db5fc475efe7..f1de42d1e43f 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,7 +1,7 @@ import logging from typing import Tuple, List, TYPE_CHECKING -from BaseClasses import Item +from BaseClasses import Item, ItemClassification from . import StaticWitnessLogic if TYPE_CHECKING: @@ -383,23 +383,98 @@ def generate_joke_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, i def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]]: potential_areas = list(StaticWitnessLogic.ALL_AREAS_BY_NAME.keys()) - actual_amount = min(amount, len(potential_areas)) + items_per_area = dict() + + for area in potential_areas: + regions = [ + world.multiworld.get_region(region, world.player) + for region in StaticWitnessLogic.ALL_AREAS_BY_NAME[area]["regions"] + ] + items = [location.item for region in regions for location in region.get_locations() if location.address] + + if items: + items_per_area[area] = items + + actual_amount = min(amount, len(items_per_area)) if actual_amount != amount: player_name = world.multiworld.get_player_name(world.player) logging.warning(f"There are not enough areas in the game to make {amount} area hints for player {player_name}.") - hinted_areas = world.random.sample(potential_areas, actual_amount) + hinted_areas = world.random.sample(sorted(items_per_area), actual_amount) hints = [] - for area in hinted_areas: - regions = [ - world.multiworld.get_region(region, world.player) - for region in StaticWitnessLogic.ALL_AREAS_BY_NAME[area]["regions"] - ] - locations = [location for region in regions for location in region.get_locations() if location.address] + for hinted_area in hinted_areas: + corresponding_items = items_per_area[hinted_area] + local_progression = sum( + item.player == world.player + and item.classification in {ItemClassification.progression, ItemClassification.progression_skip_balancing} + for item in corresponding_items + ) + + non_local_progression = sum( + item.player != world.player + and item.classification in {ItemClassification.progression, ItemClassification.progression_skip_balancing} + for item in corresponding_items + ) + + local_lasers = sum( + item.player == world.player and "Laser" in item.name + for item in corresponding_items + ) + + total_progression = non_local_progression + local_progression + + is_multiworld = len(world.multiworld.player_ids) > 1 + + if not total_progression: + hint_string = f"In the {hinted_area} area, you will find no progression items." + + elif total_progression == 1: + hint_string = f"In the {hinted_area} area, you will find 1 progression item." + + if is_multiworld: + if local_lasers: + hint_string += "\nThis item is a laser for this world." + elif non_local_progression: + hint_string += "\nThis item is for another player." + else: + hint_string += "\nThis item is for this world." + else: + if local_lasers: + hint_string += "\nThis item is a laser." - print(area, locations) + else: + hint_string = f"In the {hinted_area} area, you will find {total_progression} progression items." + + if local_lasers == total_progression: + hint_string = f"All of them are lasers" + " for this world." if is_multiworld else "." + + elif is_multiworld: + if local_progression and non_local_progression: + if non_local_progression == 1: + hint_string += f"\nOf them, one is for another player." + else: + hint_string += f"\nOf them, {non_local_progression} are for other players." + elif non_local_progression: + hint_string += "\nAll of them are for other players." + elif local_progression: + hint_string += "\nAll of them are for this world." + + if local_lasers == 1: + hint_string += "\nAlso, one of them is a laser for this world." + elif local_lasers: + hint_string += f"\nAlso, {local_lasers} of them are lasers for this world." + + else: + if local_lasers == 1: + hint_string += "\nOne of them is a laser." + elif local_lasers: + hint_string += f"\n{local_lasers} of them are lasers." + + hints.append((hint_string, -1)) + + print("\n".join(hint[0] for hint in hints)) return hints From 0da9c78908fa569854e08de9faaa6edf6ce53e4b Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 00:51:09 +0100 Subject: [PATCH 003/110] Improved wording --- worlds/witness/hints.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index f1de42d1e43f..5ff6ec2cd5b2 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -428,6 +428,8 @@ def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]] is_multiworld = len(world.multiworld.player_ids) > 1 + correct_word = "Both" if total_progression == 2 else "All" + if not total_progression: hint_string = f"In the {hinted_area} area, you will find no progression items." @@ -449,7 +451,7 @@ def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]] hint_string = f"In the {hinted_area} area, you will find {total_progression} progression items." if local_lasers == total_progression: - hint_string = f"All of them are lasers" + " for this world." if is_multiworld else "." + hint_string = f"{correct_word} of them are lasers" + " for this world." if is_multiworld else "." elif is_multiworld: if local_progression and non_local_progression: @@ -458,9 +460,9 @@ def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]] else: hint_string += f"\nOf them, {non_local_progression} are for other players." elif non_local_progression: - hint_string += "\nAll of them are for other players." + hint_string += f"\n{correct_word} of them are for other players." elif local_progression: - hint_string += "\nAll of them are for this world." + hint_string += f"\n{correct_word} of them are for this world." if local_lasers == 1: hint_string += "\nAlso, one of them is a laser for this world." From f1f8bb4df7c9f96cf10fbe6fc16f55e3c2d9bc89 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 00:53:45 +0100 Subject: [PATCH 004/110] Improvements to natural language, name change, remove print statement --- worlds/witness/WitnessLogic.txt | 6 ++++-- worlds/witness/hints.py | 2 -- worlds/witness/locations.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 5f982ea75482..b4f340b52413 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -390,7 +390,10 @@ Laser - 0x181B3 (Laser) - 0x19650 ==Keep== -Keep (Keep) - Main Island - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: +Outside Keep (Outside Keep) - Main Island - True: +159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True + +Keep (Keep) - Outside Keep - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: 158193 - 0x00139 (Hedge Maze 1) - True - True 158197 - 0x0A3A8 (Reset Pressure Plates 1) - True - True 158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Dots @@ -398,7 +401,6 @@ Door - 0x01954 (Hedge Maze 1 Exit) - 0x00139 Door - 0x01BEC (Pressure Plates 1 Exit) - 0x033EA 159430 - 0x03E77 (Red Flowers EP) - True - True 159431 - 0x03E7C (Purple Flowers EP) - True - True -159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True Keep 2nd Maze (Keep) - Keep - 0x018CE - Keep 3rd Maze - 0x019D8: Door - 0x018CE (Hedge Maze 2 Shortcut) - 0x00139 diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 5ff6ec2cd5b2..aae84fd829d6 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -477,6 +477,4 @@ def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]] hints.append((hint_string, -1)) - print("\n".join(hint[0] for hint in hints)) - return hints diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 35c7953d9584..acf23899d0d4 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -185,7 +185,7 @@ class StaticWitnessLocations: "Outside Tutorial Town Sewer EP", "Outside Tutorial Path EP", "Outside Tutorial Tractor EP", - "Keep Thundercloud EP", + "Outside Keep Thundercloud EP", "Glass Factory Vase EP", "Symmetry Island Glass Factory Black Line Reflection EP", "Symmetry Island Glass Factory Black Line EP", From 920ebf30d340f3833e44d2005e376d4e484c9418 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 01:05:45 +0100 Subject: [PATCH 005/110] Do away with 'River' as a region name --- worlds/witness/WitnessLogic.txt | 4 ++-- worlds/witness/WitnessLogicExpert.txt | 4 ++-- worlds/witness/WitnessLogicVanilla.txt | 4 ++-- worlds/witness/locations.py | 12 ++++++------ 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index b4f340b52413..99e16a5e42c5 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -659,7 +659,7 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True -Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287: +Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots @@ -669,7 +669,7 @@ Door - 0x15287 (Vault Door) - 0x15ADD 159121 - 0x03BE3 (Monastery Garden Right EP) - True - True 159122 - 0x0A409 (Monastery Wall EP) - True - True -River Vault (River): +River Vault (Jungle): 158664 - 0x03702 (Vault Box) - True - True ==Bunker== diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 14ff4434f29f..b2de07a87bbb 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -604,7 +604,7 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True -Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287: +Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots @@ -614,7 +614,7 @@ Door - 0x15287 (Vault Door) - 0x15ADD 159121 - 0x03BE3 (Monastery Garden Right EP) - True - True 159122 - 0x0A409 (Monastery Wall EP) - True - True -River Vault (River): +River Vault (Jungle): 158664 - 0x03702 (Vault Box) - True - True Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4: diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index fb0907a34846..330cb52a1b79 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -604,7 +604,7 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True -Outside Jungle River (River) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287: +Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots @@ -614,7 +614,7 @@ Door - 0x15287 (Vault Door) - 0x15ADD 159121 - 0x03BE3 (Monastery Garden Right EP) - True - True 159122 - 0x0A409 (Monastery Wall EP) - True - True -River Vault (River): +River Vault (Jungle): 158664 - 0x03702 (Vault Box) - True - True Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4: diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index acf23899d0d4..967f74ad627e 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -134,8 +134,8 @@ class StaticWitnessLocations: "Jungle Popup Wall 6", "Jungle Laser Panel", - "River Vault Box", - "River Monastery Garden Shortcut Panel", + "Jungle Vault Box", + "Jungle Monastery Garden Shortcut Panel", "Bunker Entry Panel", "Bunker Intro Left 5", @@ -268,10 +268,10 @@ class StaticWitnessLocations: "Jungle Tree Halo EP", "Jungle Bamboo CCW EP", "Jungle Bamboo CW EP", - "River Green Leaf Moss EP", - "River Monastery Garden Left EP", - "River Monastery Garden Right EP", - "River Monastery Wall EP", + "Jungle Green Leaf Moss EP", + "Jungle Monastery Garden Left EP", + "Jungle Monastery Garden Right EP", + "Jungle Monastery Wall EP", "Bunker Tinted Door EP", "Bunker Green Room Flowers EP", "Swamp Purple Sand Middle EP", From c54ec354919e30ee8b2e6b8af0fc8cc72f505611 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 01:28:03 +0100 Subject: [PATCH 006/110] Probably just call it boat like the checks in the region --- worlds/witness/WitnessLogic.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 99e16a5e42c5..55f3b9853c47 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -1197,7 +1197,7 @@ Door - 0x27263 (Desert Shortcut) - 0x2773D Door - 0x09E87 (Town Shortcut) - 0x09E85 159557 - 0x33A20 (Theater Flowers EP) - 0x03553 & Theater to Tunnels - True -==The Ocean== +==Boat== The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay: 159042 - 0x22106 (Desert EP) - True - True From ba541c87434b1d05efac564bb028e8feb04e2a23 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 01:31:01 +0100 Subject: [PATCH 007/110] LISTEN MEDIC OK YOU'RE RIGHT --- worlds/witness/WitnessLogic.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 55f3b9853c47..905b5c6d544f 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -392,6 +392,8 @@ Laser - 0x181B3 (Laser) - 0x19650 Outside Keep (Outside Keep) - Main Island - True: 159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True +159430 - 0x03E77 (Red Flowers EP) - True - True +159431 - 0x03E7C (Purple Flowers EP) - True - True Keep (Keep) - Outside Keep - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: 158193 - 0x00139 (Hedge Maze 1) - True - True @@ -399,8 +401,6 @@ Keep (Keep) - Outside Keep - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure 158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Dots Door - 0x01954 (Hedge Maze 1 Exit) - 0x00139 Door - 0x01BEC (Pressure Plates 1 Exit) - 0x033EA -159430 - 0x03E77 (Red Flowers EP) - True - True -159431 - 0x03E7C (Purple Flowers EP) - True - True Keep 2nd Maze (Keep) - Keep - 0x018CE - Keep 3rd Maze - 0x019D8: Door - 0x018CE (Hedge Maze 2 Shortcut) - 0x00139 From 3e29dff7b22be7a86480d72c21cbbb8ee5cf7da1 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 01:34:23 +0100 Subject: [PATCH 008/110] Docstring --- worlds/witness/Options.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/worlds/witness/Options.py b/worlds/witness/Options.py index 3d5a38780e09..276ab9a9f483 100644 --- a/worlds/witness/Options.py +++ b/worlds/witness/Options.py @@ -181,6 +181,10 @@ class HintAmount(Range): class HintType(Choice): + """Specify the type of hints you want find on audio logs. + "Location" means that each hint will refer to one location in your world or containing an item for your world. + "Areas" means that any given hint will tell you some general info about the items in a well-defined + geographic area on the island.""" display_name = "Hint Type" option_locations = 0 option_areas = 1 From 03bd61615f91cf37cbf00d8d0b2014ef3a4ec976 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 01:35:02 +0100 Subject: [PATCH 009/110] Modify docstring --- worlds/witness/Options.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/Options.py b/worlds/witness/Options.py index 276ab9a9f483..aaf1f1257603 100644 --- a/worlds/witness/Options.py +++ b/worlds/witness/Options.py @@ -183,8 +183,8 @@ class HintAmount(Range): class HintType(Choice): """Specify the type of hints you want find on audio logs. "Location" means that each hint will refer to one location in your world or containing an item for your world. - "Areas" means that any given hint will tell you some general info about the items in a well-defined - geographic area on the island.""" + "Areas" means that any given hint will tell you some general info about the items you can find in one of the + general geographic areas on the island.""" display_name = "Hint Type" option_locations = 0 option_areas = 1 From 59e324aee8132893c7e969b7f8802b147612547f Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 01:35:20 +0100 Subject: [PATCH 010/110] duplicate word --- worlds/witness/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/Options.py b/worlds/witness/Options.py index aaf1f1257603..be7010d6d079 100644 --- a/worlds/witness/Options.py +++ b/worlds/witness/Options.py @@ -184,7 +184,7 @@ class HintType(Choice): """Specify the type of hints you want find on audio logs. "Location" means that each hint will refer to one location in your world or containing an item for your world. "Areas" means that any given hint will tell you some general info about the items you can find in one of the - general geographic areas on the island.""" + main geographic areas on the island.""" display_name = "Hint Type" option_locations = 0 option_areas = 1 From 922c808e3a7c71f9259222f15782314c77d72c4b Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 21 Nov 2023 13:52:53 +0100 Subject: [PATCH 011/110] Keep -> Outside Keep on the flowers checks --- worlds/witness/locations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 967f74ad627e..75e926266aa9 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -216,8 +216,8 @@ class StaticWitnessLocations: "Treehouse Beach Rock Shadow EP", "Treehouse Beach Sand Shadow EP", "Treehouse Beach Both Orange Bridges EP", - "Keep Red Flowers EP", - "Keep Purple Flowers EP", + "Outside Keep Red Flowers EP", + "Outside Keep Purple Flowers EP", "Shipwreck Circle Near EP", "Shipwreck Circle Left EP", "Shipwreck Circle Far EP", From 5f3d2f0d496f88b5ed5ef99a263e00b8bd1e1d72 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 24 Nov 2023 14:50:49 +0100 Subject: [PATCH 012/110] Fix for not created regions --- worlds/witness/hints.py | 3 ++- worlds/witness/regions.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index aae84fd829d6..813901b3afa7 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -387,8 +387,9 @@ def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]] for area in potential_areas: regions = [ - world.multiworld.get_region(region, world.player) + world.regio.created_regions[region] for region in StaticWitnessLogic.ALL_AREAS_BY_NAME[area]["regions"] + if region in world.regio.created_regions ] items = [location.item for region in regions for location in region.get_locations() if location.address] diff --git a/worlds/witness/regions.py b/worlds/witness/regions.py index 2187010bac07..aa78c04a076e 100644 --- a/worlds/witness/regions.py +++ b/worlds/witness/regions.py @@ -129,9 +129,9 @@ def create_regions(self, world: "WitnessWorld", player_logic: WitnessPlayerLogic regions_to_check.add(target.name) reachable_regions.add(target.name) - final_regions_list = [v for k, v in regions_by_name.items() if k in reachable_regions] + self.created_regions = {k: v for k, v in regions_by_name.items() if k in reachable_regions} - world.multiworld.regions += final_regions_list + world.multiworld.regions += self.created_regions.values() def __init__(self, locat: WitnessPlayerLocations, world: "WitnessWorld"): difficulty = world.options.puzzle_randomization.value @@ -145,3 +145,4 @@ def __init__(self, locat: WitnessPlayerLocations, world: "WitnessWorld"): self.locat = locat self.created_entrances: Dict[Tuple[str, str], List[Entrance]] = KeyedDefaultDict(lambda _: []) + self.created_regions: Dict[str, Region] = dict() From 805ff50d1c50d90a87c478d847015a7a8e5eb681 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 24 Nov 2023 14:54:43 +0100 Subject: [PATCH 013/110] Move all Monastery EPs to Monastery area --- worlds/witness/WitnessLogic.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 905b5c6d544f..708b94ef8385 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -497,6 +497,9 @@ Laser - 0x17C65 (Laser) - 0x17CA4 159137 - 0x03DAC (Facade Left Stairs EP) - True - True 159138 - 0x03DAD (Facade Right Stairs EP) - True - True 159140 - 0x03E01 (Grass Stairs EP) - True - True +159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True +159121 - 0x03BE3 (Monastery Garden Right EP) - True - True +159122 - 0x0A409 (Monastery Wall EP) - True - True Inside Monastery (Monastery): 158213 - 0x09D9B (Shutters Control) - True - Dots @@ -665,9 +668,6 @@ Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots Door - 0x15287 (Vault Door) - 0x15ADD 159110 - 0x03AC5 (Green Leaf Moss EP) - True - True -159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True -159121 - 0x03BE3 (Monastery Garden Right EP) - True - True -159122 - 0x0A409 (Monastery Wall EP) - True - True River Vault (Jungle): 158664 - 0x03702 (Vault Box) - True - True From 8c1fec32b376503f3ceddc4d874cc4b2c0008cb9 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 24 Nov 2023 14:56:49 +0100 Subject: [PATCH 014/110] Move Windmill Entry Panel to Windmill region --- worlds/witness/WitnessLogic.txt | 8 +++++--- worlds/witness/hints.py | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 708b94ef8385..e34d192119f7 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -524,7 +524,7 @@ Town Obelisk (Town) - Entry - True: 159755 - 0xFFE55 (Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True 159759 - 0x0A16C (Obelisk) - True - True -Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9: +Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 @@ -545,8 +545,6 @@ Door - 0x28A61 (RGB House Entry) - 0x28998 Door - 0x03BB0 (Church Entry) - 0x28A0D 158228 - 0x28A79 (Maze Panel) - True - True Door - 0x28AA2 (Maze Stairs) - 0x28A79 -158241 - 0x17F5F (Windmill Entry Panel) - True - Dots -Door - 0x1845B (Windmill Entry) - 0x17F5F 159010 - 0x037B6 (Windmill First Blade EP) - 0x17D02 - True 159011 - 0x037B2 (Windmill Second Blade EP) - 0x17D02 - True 159012 - 0x000F7 (Windmill Third Blade EP) - 0x17D02 - True @@ -606,6 +604,10 @@ Laser - 0x032F9 (Laser) - 0x032F5 ==Windmill & Theater== +Outside Windmill (Windmill) - Windmill Interior - 0x1845B: +158241 - 0x17F5F (Windmill Entry Panel) - True - Dots +Door - 0x1845B (Windmill Entry) - 0x17F5F + Windmill Interior (Windmill) - Theater - 0x17F88: 158247 - 0x17D02 (Turn Control) - True - Dots 158248 - 0x17F89 (Theater Entry Panel) - True - Black/White Squares diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 813901b3afa7..3848fc53dd82 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -478,4 +478,6 @@ def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]] hints.append((hint_string, -1)) + print("\n".join(hint[0] for hint in hints)) + return hints From 4e5dce5a58eb10ce8882c5263789cf8ee3394273 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 24 Nov 2023 14:57:05 +0100 Subject: [PATCH 015/110] oops --- worlds/witness/hints.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 3848fc53dd82..813901b3afa7 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -478,6 +478,4 @@ def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]] hints.append((hint_string, -1)) - print("\n".join(hint[0] for hint in hints)) - return hints From a017f04538fb9f552eb44b9f2b25d18c8eab23d6 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 24 Nov 2023 18:17:30 +0100 Subject: [PATCH 016/110] Areas for Expert and Vanilla as well --- worlds/witness/WitnessLogic.txt | 10 +- worlds/witness/WitnessLogicExpert.txt | 250 +++++++++++++++---------- worlds/witness/WitnessLogicVanilla.txt | 250 +++++++++++++++---------- worlds/witness/locations.py | 8 +- 4 files changed, 315 insertions(+), 203 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index e34d192119f7..257e74f8ed3e 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -497,9 +497,9 @@ Laser - 0x17C65 (Laser) - 0x17CA4 159137 - 0x03DAC (Facade Left Stairs EP) - True - True 159138 - 0x03DAD (Facade Right Stairs EP) - True - True 159140 - 0x03E01 (Grass Stairs EP) - True - True -159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True -159121 - 0x03BE3 (Monastery Garden Right EP) - True - True -159122 - 0x0A409 (Monastery Wall EP) - True - True +159120 - 0x03BE2 (Garden Left EP) - 0x03750 - True +159121 - 0x03BE3 (Garden Right EP) - True - True +159122 - 0x0A409 (Wall EP) - True - True Inside Monastery (Monastery): 158213 - 0x09D9B (Shutters Control) - True - Dots @@ -605,8 +605,8 @@ Laser - 0x032F9 (Laser) - 0x032F5 ==Windmill & Theater== Outside Windmill (Windmill) - Windmill Interior - 0x1845B: -158241 - 0x17F5F (Windmill Entry Panel) - True - Dots -Door - 0x1845B (Windmill Entry) - 0x17F5F +158241 - 0x17F5F (Entry Panel) - True - Dots +Door - 0x1845B (Entry) - 0x17F5F Windmill Interior (Windmill) - Theater - 0x17F88: 158247 - 0x17D02 (Turn Control) - True - Dots diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index b2de07a87bbb..6dae2809ee7f 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -1,3 +1,5 @@ +==Tutorial== + Menu (Menu) - Entry - True: Entry (Entry): @@ -58,9 +60,23 @@ Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3: Door - 0x04CA3 (Outpost Exit) - 0x04CA4 158600 - 0x17CFB (Discard) - True - Arrows +Orchard (Orchard) - Main Island - True - Orchard Beyond First Gate - 0x03307: +158071 - 0x00143 (Apple Tree 1) - True - True +158072 - 0x0003B (Apple Tree 2) - 0x00143 - True +158073 - 0x00055 (Apple Tree 3) - 0x0003B - True +Door - 0x03307 (First Gate) - 0x00055 + +Orchard Beyond First Gate (Orchard) - Orchard End - 0x03313: +158074 - 0x032F7 (Apple Tree 4) - 0x00055 - True +158075 - 0x032FF (Apple Tree 5) - 0x032F7 - True +Door - 0x03313 (Second Gate) - 0x032FF + +Orchard End (Orchard): + Main Island (Main Island) - Outside Tutorial - True: 159801 - 0xFFD00 (Reached Independently) - True - True -159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True + +==Glass Factory== Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29: 158027 - 0x01A54 (Entry Panel) - True - Symmetry @@ -85,6 +101,8 @@ Door - 0x0D7ED (Back Wall) - 0x0005C Inside Glass Factory Behind Back Wall (Glass Factory) - The Ocean - 0x17CC8: 158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat +==Symmetry Island== + Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E: 158040 - 0x000B0 (Lower Panel) - 0x0343A - Triangles Door - 0x17F3E (Lower) - 0x000B0 @@ -128,18 +146,15 @@ Symmetry Island Upper (Symmetry Island): Laser - 0x00509 (Laser) - 0x0360D 159001 - 0x03367 (Glass Factory Black Line EP) - True - True -Orchard (Orchard) - Main Island - True - Orchard Beyond First Gate - 0x03307: -158071 - 0x00143 (Apple Tree 1) - True - True -158072 - 0x0003B (Apple Tree 2) - 0x00143 - True -158073 - 0x00055 (Apple Tree 3) - 0x0003B - True -Door - 0x03307 (First Gate) - 0x00055 - -Orchard Beyond First Gate (Orchard) - Orchard End - 0x03313: -158074 - 0x032F7 (Apple Tree 4) - 0x00055 - True -158075 - 0x032FF (Apple Tree 5) - 0x032F7 - True -Door - 0x03313 (Second Gate) - 0x032FF +==Desert== -Orchard End (Orchard): +Desert Obelisk (Desert) - Entry - True: +159700 - 0xFFE00 (Obelisk Side 1) - 0x0332B & 0x03367 & 0x28B8A - True +159701 - 0xFFE01 (Obelisk Side 2) - 0x037B6 & 0x037B2 & 0x000F7 - True +159702 - 0xFFE02 (Obelisk Side 3) - 0x3351D - True +159703 - 0xFFE03 (Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True +159704 - 0xFFE04 (Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True +159709 - 0x00359 (Obelisk) - True - True Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE - Desert Vault - 0x03444: 158652 - 0x0CC7B (Vault Panel) - True - Dots & Full Dots & Stars & Stars + Same Colored Symbol & Eraser & Triangles & Shapers & Negative Shapers & Colored Squares @@ -220,6 +235,16 @@ Door - 0x01317 (Elevator) - 0x03608 Desert Lowest Level Inbetween Shortcuts (Desert): +==Quarry== + +Quarry Obelisk (Quarry) - Entry - True: +159740 - 0xFFE40 (Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True +159741 - 0xFFE41 (Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True +159742 - 0xFFE42 (Obelisk Side 3) - 0x289CF & 0x289D1 - True +159743 - 0xFFE43 (Obelisk Side 4) - 0x33692 - True +159744 - 0xFFE44 (Obelisk Side 5) - 0x03E77 & 0x03E7C - True +159749 - 0x22073 (Obelisk) - True - True + Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: 158118 - 0x09E57 (Entry 1 Panel) - True - Squares & Black/White Squares & Triangles 158603 - 0x17CF0 (Discard) - True - Arrows @@ -322,6 +347,8 @@ Door - 0x3865F (Second Barrier) - 0x38663 158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol 159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True +==Shadows== + 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 | 0x334DC @@ -361,10 +388,12 @@ Shadows Laser Room (Shadows): 158703 - 0x19650 (Laser Panel) - 0x194B2 & 0x19665 - True Laser - 0x181B3 (Laser) - 0x19650 -Treehouse Beach (Treehouse Beach) - Main Island - True: -159200 - 0x0053D (Rock Shadow EP) - True - True -159201 - 0x0053E (Sand Shadow EP) - True - True -159212 - 0x220BD (Both Orange Bridges EP) - 0x17DA2 & 0x17DDB - True +==Keep== + +Outside Keep (Outside Keep) - Main Island - True: +159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True +159430 - 0x03E77 (Red Flowers EP) - True - True +159431 - 0x03E7C (Purple Flowers EP) - True - True Keep (Keep) - Main Island - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: 158193 - 0x00139 (Hedge Maze 1) - True - True @@ -372,8 +401,6 @@ Keep (Keep) - Main Island - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure P 158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Colored Squares & Triangles & Stars & Stars + Same Colored Symbol Door - 0x01954 (Hedge Maze 1 Exit) - 0x00139 Door - 0x01BEC (Pressure Plates 1 Exit) - 0x033EA -159430 - 0x03E77 (Red Flowers EP) - True - True -159431 - 0x03E7C (Purple Flowers EP) - True - True Keep 2nd Maze (Keep) - Keep - 0x018CE - Keep 3rd Maze - 0x019D8: Door - 0x018CE (Hedge Maze 2 Shortcut) - 0x00139 @@ -408,6 +435,22 @@ Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F 158205 - 0x09E49 (Shadows Shortcut Panel) - True - True Door - 0x09E3D (Shadows Shortcut) - 0x09E49 +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 - True +158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Rotated Shapers & Triangles & Stars & Stars + Same Colored Symbol & Colored Squares & Black/White Squares +Laser - 0x014BB (Laser) - 0x0360E | 0x03317 +159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True +159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True +159242 - 0x033DD (Pressure Plates 3 EP) - 0x01CD3 & 0x01CD5 - True +159243 - 0x033E5 (Pressure Plates 4 Left Exit EP) - 0x01D3F - True +159244 - 0x018B6 (Pressure Plates 4 Right Exit EP) - 0x01D3F - True +159250 - 0x28AE9 (Path EP) - True - True +159251 - 0x3348F (Hedges EP) - True - True + +==Shipwreck== + Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True - Shipwreck Vault - 0x17BB4: 158654 - 0x00AFB (Vault Panel) - True - Symmetry & Sound Dots & Colored Dots Door - 0x17BB4 (Vault Door) - 0x00AFB @@ -423,19 +466,16 @@ Door - 0x17BB4 (Vault Door) - 0x00AFB Shipwreck Vault (Shipwreck): 158655 - 0x03535 (Vault Box) - True - True -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 - True -158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Rotated Shapers & Triangles & Stars & Stars + Same Colored Symbol & Colored Squares & Black/White Squares -Laser - 0x014BB (Laser) - 0x0360E | 0x03317 -159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True -159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True -159242 - 0x033DD (Pressure Plates 3 EP) - 0x01CD3 & 0x01CD5 - True -159243 - 0x033E5 (Pressure Plates 4 Left Exit EP) - 0x01D3F - True -159244 - 0x018B6 (Pressure Plates 4 Right Exit EP) - 0x01D3F - True -159250 - 0x28AE9 (Path EP) - True - True -159251 - 0x3348F (Hedges EP) - True - True +==Monastery== + +Monastery Obelisk (Monastery) - Entry - True: +159710 - 0xFFE10 (Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True +159711 - 0xFFE11 (Obelisk Side 2) - 0x03AC5 - True +159712 - 0xFFE12 (Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True +159713 - 0xFFE13 (Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True +159714 - 0xFFE14 (Obelisk Side 5) - 0x03E01 - True +159715 - 0xFFE15 (Obelisk Side 6) - 0x289F4 & 0x289F5 - True +159719 - 0x00263 (Obelisk) - True - True Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750: 158207 - 0x03713 (Laser Shortcut Panel) - True - True @@ -457,6 +497,9 @@ Laser - 0x17C65 (Laser) - 0x17CA4 159137 - 0x03DAC (Facade Left Stairs EP) - True - True 159138 - 0x03DAD (Facade Right Stairs EP) - True - True 159140 - 0x03E01 (Grass Stairs EP) - True - True +159120 - 0x03BE2 (Garden Left EP) - 0x03750 - True +159121 - 0x03BE3 (Garden Right EP) - True - True +159122 - 0x0A409 (Wall EP) - True - True Inside Monastery (Monastery): 158213 - 0x09D9B (Shutters Control) - True - Dots @@ -470,7 +513,18 @@ Inside Monastery (Monastery): Monastery Garden (Monastery): -Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9: +==Town== + +Town Obelisk (Town) - Entry - True: +159750 - 0xFFE50 (Obelisk Side 1) - 0x035C7 - True +159751 - 0xFFE51 (Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True +159752 - 0xFFE52 (Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True +159753 - 0xFFE53 (Obelisk Side 4) - 0x28B30 & 0x035C9 - True +159754 - 0xFFE54 (Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True +159755 - 0xFFE55 (Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True +159759 - 0x0A16C (Obelisk) - True - True + +Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: 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 @@ -491,8 +545,6 @@ Door - 0x28A61 (RGB House Entry) - 0x28A0D Door - 0x03BB0 (Church Entry) - 0x03C08 158228 - 0x28A79 (Maze Panel) - True - True Door - 0x28AA2 (Maze Stairs) - 0x28A79 -158241 - 0x17F5F (Windmill Entry Panel) - True - Dots -Door - 0x1845B (Windmill Entry) - 0x17F5F 159010 - 0x037B6 (Windmill First Blade EP) - 0x17D02 - True 159011 - 0x037B2 (Windmill Second Blade EP) - 0x17D02 - True 159012 - 0x000F7 (Windmill Third Blade EP) - 0x17D02 - True @@ -550,6 +602,12 @@ Laser - 0x032F9 (Laser) - 0x032F5 159422 - 0x33692 (Brown Bridge EP) - True - True 159551 - 0x03BCE (Black Line Tower EP) - True - True +==Windmill & Theater== + +Outside Windmill (Windmill) - Windmill Interior - 0x1845B: +158241 - 0x17F5F (Entry Panel) - True - Dots +Door - 0x1845B (Entry) - 0x17F5F + Windmill Interior (Windmill) - Theater - 0x17F88: 158247 - 0x17D02 (Turn Control) - True - Dots 158248 - 0x17F89 (Theater Entry Panel) - True - Squares & Black/White Squares & Eraser & Triangles @@ -573,6 +631,8 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2 159556 - 0x33A2A (Door EP) - 0x03553 - True 159558 - 0x33B06 (Church EP) - 0x0354E - True +==Jungle== + Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF: 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158609 - 0x17F9B (Discard) - True - Arrows @@ -610,13 +670,12 @@ Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots Door - 0x15287 (Vault Door) - 0x15ADD 159110 - 0x03AC5 (Green Leaf Moss EP) - True - True -159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True -159121 - 0x03BE3 (Monastery Garden Right EP) - True - True -159122 - 0x0A409 (Monastery Wall EP) - True - True River Vault (Jungle): 158664 - 0x03702 (Vault Box) - True - True +==Bunker== + Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4: 158268 - 0x17C2E (Entry Panel) - True - Squares & Black/White Squares Door - 0x0C2A4 (Entry) - 0x17C2E @@ -667,6 +726,8 @@ Door - 0x00C1C (Entry) - 0x0056E 159322 - 0x03601 (Purple Sand Top EP) - 0x17E2B - True 159327 - 0x035DE (Purple Sand Bottom EP) - True - True +==Swamp== + 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 @@ -774,6 +835,22 @@ Laser - 0x00BF6 (Laser) - 0x03615 158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Stars & Stars + Same Colored Symbol Door - 0x2D880 (Laser Shortcut) - 0x17C02 +==Treehouse== + +Treehouse Obelisk (Treehouse) - Entry - True: +159720 - 0xFFE20 (Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True +159721 - 0xFFE21 (Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True +159722 - 0xFFE22 (Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True +159723 - 0xFFE23 (Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True +159724 - 0xFFE24 (Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True +159725 - 0xFFE25 (Obelisk Side 6) - 0x28AE9 & 0x3348F - True +159729 - 0x00097 (Obelisk) - True - True + +Treehouse Beach (Treehouse Beach) - Main Island - True: +159200 - 0x0053D (Rock Shadow EP) - True - True +159201 - 0x0053E (Sand Shadow EP) - True - True +159212 - 0x220BD (Both Orange Bridges EP) - 0x17DA2 & 0x17DDB - True + Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309 - The Ocean - 0x17C95: 158343 - 0x17C95 (Boat Spawn) - True - Boat 158344 - 0x0288C (First Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles @@ -882,6 +959,17 @@ Treehouse Laser Room (Treehouse): 158403 - 0x17CBC (Laser House Door Timer Inside) - True - True Laser - 0x028A4 (Laser) - 0x03613 +==Mountain (Outside)== + +Mountainside Obelisk (Mountainside) - Entry - True: +159730 - 0xFFE30 (Obelisk Side 1) - 0x001A3 & 0x335AE - True +159731 - 0xFFE31 (Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True +159732 - 0xFFE32 (Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True +159733 - 0xFFE33 (Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True +159734 - 0xFFE34 (Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True +159735 - 0xFFE35 (Obelisk Side 6) - 0x035CB & 0x035CF - True +159739 - 0x00367 (Obelisk) - True - True + Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085: 158612 - 0x17C42 (Discard) - True - Arrows 158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Squares & Triangles & Stars & Stars + Same Colored Symbol @@ -903,6 +991,8 @@ Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: 159324 - 0x336C8 (Arch White Right EP) - True - True 159326 - 0x3369A (Arch White Left EP) - True - True +==Mountain (Inside)== + Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Eraser & Triangles @@ -979,6 +1069,25 @@ Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 +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 - Dots & Full Dots & Triangles & Symmetry +158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol & Symmetry +158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Eraser & Symmetry & Stars & Stars + Same Colored Symbol & Negative Shapers & Shapers +158526 - 0x0383D (Left Pillar 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol +158527 - 0x0383F (Left Pillar 2) - 0x0383D - Triangles & Symmetry +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 & Colored Dots + +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 & 7 Lasers | 0x3D9A8 & 7 Lasers - True + Mountain Pink Bridge EP (Mountain Floor 2): 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True @@ -987,6 +1096,8 @@ Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D: Door - 0x2D77D (Caves Entry) - 0x00FF8 158448 - 0x334E1 (Rock Control) - True - True +==Caves== + 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 @@ -1046,6 +1157,8 @@ 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 (Challenge) - Tunnels - 0x0348A - Challenge Vault - 0x04D75: 158499 - 0x0A332 (Start Timer) - 11 Lasers - True 158500 - 0x0088E (Small Basic) - 0x0A332 - True @@ -1074,6 +1187,8 @@ Door - 0x0348A (Tunnels Entry) - 0x039B4 Challenge Vault (Challenge): 158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True +==Tunnels== + 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 @@ -1084,24 +1199,7 @@ Door - 0x27263 (Desert Shortcut) - 0x2773D Door - 0x09E87 (Town Shortcut) - 0x09E85 159557 - 0x33A20 (Theater Flowers EP) - 0x03553 & Theater to Tunnels - True -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 - Dots & Full Dots & Triangles & Symmetry -158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol & Symmetry -158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Eraser & Symmetry & Stars & Stars + Same Colored Symbol & Negative Shapers & Shapers -158526 - 0x0383D (Left Pillar 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol -158527 - 0x0383F (Left Pillar 2) - 0x0383D - Triangles & Symmetry -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 & Colored Dots - -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 & 7 Lasers | 0x3D9A8 & 7 Lasers - True +==Boat== The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay: 159042 - 0x22106 (Desert EP) - True - True @@ -1114,45 +1212,3 @@ The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Tre 159521 - 0x33879 (Tutorial Reflection EP) - True - True 159522 - 0x03C19 (Tutorial Moss EP) - True - True 159531 - 0x035C9 (Cargo Box EP) - 0x0A0C9 - True - -Obelisks (EPs) - Entry - True: -159700 - 0xFFE00 (Desert Obelisk Side 1) - 0x0332B & 0x03367 & 0x28B8A - True -159701 - 0xFFE01 (Desert Obelisk Side 2) - 0x037B6 & 0x037B2 & 0x000F7 - True -159702 - 0xFFE02 (Desert Obelisk Side 3) - 0x3351D - True -159703 - 0xFFE03 (Desert Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True -159704 - 0xFFE04 (Desert Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True -159709 - 0x00359 (Desert Obelisk) - True - True -159710 - 0xFFE10 (Monastery Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True -159711 - 0xFFE11 (Monastery Obelisk Side 2) - 0x03AC5 - True -159712 - 0xFFE12 (Monastery Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True -159713 - 0xFFE13 (Monastery Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True -159714 - 0xFFE14 (Monastery Obelisk Side 5) - 0x03E01 - True -159715 - 0xFFE15 (Monastery Obelisk Side 6) - 0x289F4 & 0x289F5 - True -159719 - 0x00263 (Monastery Obelisk) - True - True -159720 - 0xFFE20 (Treehouse Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True -159721 - 0xFFE21 (Treehouse Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True -159722 - 0xFFE22 (Treehouse Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True -159723 - 0xFFE23 (Treehouse Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True -159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True -159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True -159729 - 0x00097 (Treehouse Obelisk) - True - True -159730 - 0xFFE30 (Mountainside Obelisk Side 1) - 0x001A3 & 0x335AE - True -159731 - 0xFFE31 (Mountainside Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True -159732 - 0xFFE32 (Mountainside Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True -159733 - 0xFFE33 (Mountainside Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True -159734 - 0xFFE34 (Mountainside Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True -159735 - 0xFFE35 (Mountainside Obelisk Side 6) - 0x035CB & 0x035CF - True -159739 - 0x00367 (Mountainside Obelisk) - True - True -159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True -159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True -159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True -159743 - 0xFFE43 (Quarry Obelisk Side 4) - 0x33692 - True -159744 - 0xFFE44 (Quarry Obelisk Side 5) - 0x03E77 & 0x03E7C - True -159749 - 0x22073 (Quarry Obelisk) - True - True -159750 - 0xFFE50 (Town Obelisk Side 1) - 0x035C7 - True -159751 - 0xFFE51 (Town Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True -159752 - 0xFFE52 (Town Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True -159753 - 0xFFE53 (Town Obelisk Side 4) - 0x28B30 & 0x035C9 - True -159754 - 0xFFE54 (Town Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True -159755 - 0xFFE55 (Town Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True -159759 - 0x0A16C (Town Obelisk) - True - True diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 330cb52a1b79..a370d33ea66f 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -1,3 +1,5 @@ +==Tutorial== + Menu (Menu) - Entry - True: Entry (Entry): @@ -58,9 +60,23 @@ Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3: Door - 0x04CA3 (Outpost Exit) - 0x04CA4 158600 - 0x17CFB (Discard) - True - Triangles +Orchard (Orchard) - Main Island - True - Orchard Beyond First Gate - 0x03307: +158071 - 0x00143 (Apple Tree 1) - True - True +158072 - 0x0003B (Apple Tree 2) - 0x00143 - True +158073 - 0x00055 (Apple Tree 3) - 0x0003B - True +Door - 0x03307 (First Gate) - 0x00055 + +Orchard Beyond First Gate (Orchard) - Orchard End - 0x03313: +158074 - 0x032F7 (Apple Tree 4) - 0x00055 - True +158075 - 0x032FF (Apple Tree 5) - 0x032F7 - True +Door - 0x03313 (Second Gate) - 0x032FF + +Orchard End (Orchard): + Main Island (Main Island) - Outside Tutorial - True: 159801 - 0xFFD00 (Reached Independently) - True - True -159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True + +==Glass Factory== Outside Glass Factory (Glass Factory) - Main Island - True - Inside Glass Factory - 0x01A29: 158027 - 0x01A54 (Entry Panel) - True - Symmetry @@ -85,6 +101,8 @@ Door - 0x0D7ED (Back Wall) - 0x0005C Inside Glass Factory Behind Back Wall (Glass Factory) - The Ocean - 0x17CC8: 158039 - 0x17CC8 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat +==Symmetry Island== + Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island Lower - 0x17F3E: 158040 - 0x000B0 (Lower Panel) - 0x0343A - Dots Door - 0x17F3E (Lower) - 0x000B0 @@ -128,18 +146,15 @@ Symmetry Island Upper (Symmetry Island): Laser - 0x00509 (Laser) - 0x0360D 159001 - 0x03367 (Glass Factory Black Line EP) - True - True -Orchard (Orchard) - Main Island - True - Orchard Beyond First Gate - 0x03307: -158071 - 0x00143 (Apple Tree 1) - True - True -158072 - 0x0003B (Apple Tree 2) - 0x00143 - True -158073 - 0x00055 (Apple Tree 3) - 0x0003B - True -Door - 0x03307 (First Gate) - 0x00055 - -Orchard Beyond First Gate (Orchard) - Orchard End - 0x03313: -158074 - 0x032F7 (Apple Tree 4) - 0x00055 - True -158075 - 0x032FF (Apple Tree 5) - 0x032F7 - True -Door - 0x03313 (Second Gate) - 0x032FF +==Desert== -Orchard End (Orchard): +Desert Obelisk (Desert) - Entry - True: +159700 - 0xFFE00 (Obelisk Side 1) - 0x0332B & 0x03367 & 0x28B8A - True +159701 - 0xFFE01 (Obelisk Side 2) - 0x037B6 & 0x037B2 & 0x000F7 - True +159702 - 0xFFE02 (Obelisk Side 3) - 0x3351D - True +159703 - 0xFFE03 (Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True +159704 - 0xFFE04 (Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True +159709 - 0x00359 (Obelisk) - True - True Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE - Desert Vault - 0x03444: 158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots @@ -220,6 +235,16 @@ Door - 0x01317 (Elevator) - 0x03608 Desert Lowest Level Inbetween Shortcuts (Desert): +==Quarry== + +Quarry Obelisk (Quarry) - Entry - True: +159740 - 0xFFE40 (Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True +159741 - 0xFFE41 (Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True +159742 - 0xFFE42 (Obelisk Side 3) - 0x289CF & 0x289D1 - True +159743 - 0xFFE43 (Obelisk Side 4) - 0x33692 - True +159744 - 0xFFE44 (Obelisk Side 5) - 0x03E77 & 0x03E7C - True +159749 - 0x22073 (Obelisk) - True - True + Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: 158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares 158603 - 0x17CF0 (Discard) - True - Triangles @@ -322,6 +347,8 @@ Door - 0x3865F (Second Barrier) - 0x38663 158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers 159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True +==Shadows== + 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 | 0x334DC @@ -361,10 +388,12 @@ Shadows Laser Room (Shadows): 158703 - 0x19650 (Laser Panel) - 0x194B2 & 0x19665 - True Laser - 0x181B3 (Laser) - 0x19650 -Treehouse Beach (Treehouse Beach) - Main Island - True: -159200 - 0x0053D (Rock Shadow EP) - True - True -159201 - 0x0053E (Sand Shadow EP) - True - True -159212 - 0x220BD (Both Orange Bridges EP) - 0x17DA2 & 0x17DDB - True +==Keep== + +Outside Keep (Outside Keep) - Main Island - True: +159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True +159430 - 0x03E77 (Red Flowers EP) - True - True +159431 - 0x03E7C (Purple Flowers EP) - True - True Keep (Keep) - Main Island - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: 158193 - 0x00139 (Hedge Maze 1) - True - True @@ -372,8 +401,6 @@ Keep (Keep) - Main Island - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure P 158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Dots Door - 0x01954 (Hedge Maze 1 Exit) - 0x00139 Door - 0x01BEC (Pressure Plates 1 Exit) - 0x033EA -159430 - 0x03E77 (Red Flowers EP) - True - True -159431 - 0x03E7C (Purple Flowers EP) - True - True Keep 2nd Maze (Keep) - Keep - 0x018CE - Keep 3rd Maze - 0x019D8: Door - 0x018CE (Hedge Maze 2 Shortcut) - 0x00139 @@ -408,6 +435,22 @@ Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F 158205 - 0x09E49 (Shadows Shortcut Panel) - True - True Door - 0x09E3D (Shadows Shortcut) - 0x09E49 +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 - True +158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Rotated Shapers +Laser - 0x014BB (Laser) - 0x0360E | 0x03317 +159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True +159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True +159242 - 0x033DD (Pressure Plates 3 EP) - 0x01CD3 & 0x01CD5 - True +159243 - 0x033E5 (Pressure Plates 4 Left Exit EP) - 0x01D3F - True +159244 - 0x018B6 (Pressure Plates 4 Right Exit EP) - 0x01D3F - True +159250 - 0x28AE9 (Path EP) - True - True +159251 - 0x3348F (Hedges EP) - True - True + +==Shipwreck== + Shipwreck (Shipwreck) - Keep 3rd Pressure Plate - True - Shipwreck Vault - 0x17BB4: 158654 - 0x00AFB (Vault Panel) - True - Symmetry & Sound Dots & Colored Dots Door - 0x17BB4 (Vault Door) - 0x00AFB @@ -423,19 +466,16 @@ Door - 0x17BB4 (Vault Door) - 0x00AFB Shipwreck Vault (Shipwreck): 158655 - 0x03535 (Vault Box) - True - True -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 - True -158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Rotated Shapers -Laser - 0x014BB (Laser) - 0x0360E | 0x03317 -159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True -159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True -159242 - 0x033DD (Pressure Plates 3 EP) - 0x01CD3 & 0x01CD5 - True -159243 - 0x033E5 (Pressure Plates 4 Left Exit EP) - 0x01D3F - True -159244 - 0x018B6 (Pressure Plates 4 Right Exit EP) - 0x01D3F - True -159250 - 0x28AE9 (Path EP) - True - True -159251 - 0x3348F (Hedges EP) - True - True +==Monastery== + +Monastery Obelisk (Monastery) - Entry - True: +159710 - 0xFFE10 (Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True +159711 - 0xFFE11 (Obelisk Side 2) - 0x03AC5 - True +159712 - 0xFFE12 (Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True +159713 - 0xFFE13 (Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True +159714 - 0xFFE14 (Obelisk Side 5) - 0x03E01 - True +159715 - 0xFFE15 (Obelisk Side 6) - 0x289F4 & 0x289F5 - True +159719 - 0x00263 (Obelisk) - True - True Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750: 158207 - 0x03713 (Laser Shortcut Panel) - True - True @@ -457,6 +497,9 @@ Laser - 0x17C65 (Laser) - 0x17CA4 159137 - 0x03DAC (Facade Left Stairs EP) - True - True 159138 - 0x03DAD (Facade Right Stairs EP) - True - True 159140 - 0x03E01 (Grass Stairs EP) - True - True +159120 - 0x03BE2 (Garden Left EP) - 0x03750 - True +159121 - 0x03BE3 (Garden Right EP) - True - True +159122 - 0x0A409 (Wall EP) - True - True Inside Monastery (Monastery): 158213 - 0x09D9B (Shutters Control) - True - Dots @@ -470,7 +513,18 @@ Inside Monastery (Monastery): Monastery Garden (Monastery): -Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Windmill Interior - 0x1845B - Town Inside Cargo Box - 0x0A0C9: +==Town== + +Town Obelisk (Town) - Entry - True: +159750 - 0xFFE50 (Obelisk Side 1) - 0x035C7 - True +159751 - 0xFFE51 (Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True +159752 - 0xFFE52 (Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True +159753 - 0xFFE53 (Obelisk Side 4) - 0x28B30 & 0x035C9 - True +159754 - 0xFFE54 (Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True +159755 - 0xFFE55 (Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True +159759 - 0x0A16C (Obelisk) - True - True + +Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 @@ -491,8 +545,6 @@ Door - 0x28A61 (RGB House Entry) - 0x28998 Door - 0x03BB0 (Church Entry) - 0x28A0D 158228 - 0x28A79 (Maze Panel) - True - True Door - 0x28AA2 (Maze Stairs) - 0x28A79 -158241 - 0x17F5F (Windmill Entry Panel) - True - Dots -Door - 0x1845B (Windmill Entry) - 0x17F5F 159010 - 0x037B6 (Windmill First Blade EP) - 0x17D02 - True 159011 - 0x037B2 (Windmill Second Blade EP) - 0x17D02 - True 159012 - 0x000F7 (Windmill Third Blade EP) - 0x17D02 - True @@ -550,6 +602,12 @@ Laser - 0x032F9 (Laser) - 0x032F5 159422 - 0x33692 (Brown Bridge EP) - True - True 159551 - 0x03BCE (Black Line Tower EP) - True - True +==Windmill & Theater== + +Outside Windmill (Windmill) - Windmill Interior - 0x1845B: +158241 - 0x17F5F (Entry Panel) - True - Dots +Door - 0x1845B (Entry) - 0x17F5F + Windmill Interior (Windmill) - Theater - 0x17F88: 158247 - 0x17D02 (Turn Control) - True - Dots 158248 - 0x17F89 (Theater Entry Panel) - True - Black/White Squares @@ -573,6 +631,8 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2 159556 - 0x33A2A (Door EP) - 0x03553 - True 159558 - 0x33B06 (Church EP) - 0x0354E - True +==Jungle== + Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF: 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158609 - 0x17F9B (Discard) - True - Triangles @@ -610,13 +670,12 @@ Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots Door - 0x15287 (Vault Door) - 0x15ADD 159110 - 0x03AC5 (Green Leaf Moss EP) - True - True -159120 - 0x03BE2 (Monastery Garden Left EP) - 0x03750 - True -159121 - 0x03BE3 (Monastery Garden Right EP) - True - True -159122 - 0x0A409 (Monastery Wall EP) - True - True River Vault (Jungle): 158664 - 0x03702 (Vault Box) - True - True +==Bunker== + Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4: 158268 - 0x17C2E (Entry Panel) - True - Black/White Squares Door - 0x0C2A4 (Entry) - 0x17C2E @@ -660,6 +719,8 @@ Bunker Laser Platform (Bunker) - Bunker Elevator - TrueOneWay: 158710 - 0x09DE0 (Laser Panel) - True - True Laser - 0x0C2B2 (Laser) - 0x09DE0 +==Swamp== + Outside Swamp (Swamp) - Swamp Entry Area - 0x00C1C - Main Island - True: 158287 - 0x0056E (Entry Panel) - True - Shapers Door - 0x00C1C (Entry) - 0x0056E @@ -774,6 +835,22 @@ Laser - 0x00BF6 (Laser) - 0x03615 158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Rotated Shapers Door - 0x2D880 (Laser Shortcut) - 0x17C02 +==Treehouse== + +Treehouse Obelisk (Treehouse) - Entry - True: +159720 - 0xFFE20 (Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True +159721 - 0xFFE21 (Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True +159722 - 0xFFE22 (Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True +159723 - 0xFFE23 (Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True +159724 - 0xFFE24 (Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True +159725 - 0xFFE25 (Obelisk Side 6) - 0x28AE9 & 0x3348F - True +159729 - 0x00097 (Obelisk) - True - True + +Treehouse Beach (Treehouse Beach) - Main Island - True: +159200 - 0x0053D (Rock Shadow EP) - True - True +159201 - 0x0053E (Sand Shadow EP) - True - True +159212 - 0x220BD (Both Orange Bridges EP) - 0x17DA2 & 0x17DDB - True + Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309 - The Ocean - 0x17C95: 158343 - 0x17C95 (Boat Spawn) - True - Boat 158344 - 0x0288C (First Door Panel) - True - Stars @@ -882,6 +959,17 @@ Treehouse Laser Room (Treehouse): 158403 - 0x17CBC (Laser House Door Timer Inside) - True - True Laser - 0x028A4 (Laser) - 0x03613 +==Mountain (Outside)== + +Mountainside Obelisk (Mountainside) - Entry - True: +159730 - 0xFFE30 (Obelisk Side 1) - 0x001A3 & 0x335AE - True +159731 - 0xFFE31 (Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True +159732 - 0xFFE32 (Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True +159733 - 0xFFE33 (Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True +159734 - 0xFFE34 (Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True +159735 - 0xFFE35 (Obelisk Side 6) - 0x035CB & 0x035CF - True +159739 - 0x00367 (Obelisk) - True - True + Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085: 158612 - 0x17C42 (Discard) - True - Triangles 158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Dots & Black/White Squares @@ -903,6 +991,8 @@ Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: 159324 - 0x336C8 (Arch White Right EP) - True - True 159326 - 0x3369A (Arch White Left EP) - True - True +==Mountain (Inside)== + Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Rotated Shapers @@ -979,6 +1069,25 @@ Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 +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 & Full Dots +158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry +158526 - 0x0383D (Left Pillar 1) - True - Dots & Full Dots +158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares +158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers +158529 - 0x339BB (Left Pillar 4) - 0x03859 - Black/White Squares & Stars & Symmetry + +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 & 7 Lasers | 0x3D9A8 & 7 Lasers - True + Mountain Pink Bridge EP (Mountain Floor 2): 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True @@ -987,6 +1096,8 @@ Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D: Door - 0x2D77D (Caves Entry) - 0x00FF8 158448 - 0x334E1 (Rock Control) - True - True +==Caves== + 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 @@ -1046,6 +1157,8 @@ Path to Challenge (Caves) - Challenge - 0x0A19A: 158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol Door - 0x0A19A (Challenge Entry) - 0x0A16E +==Challenge== + Challenge (Challenge) - Tunnels - 0x0348A - Challenge Vault - 0x04D75: 158499 - 0x0A332 (Start Timer) - 11 Lasers - True 158500 - 0x0088E (Small Basic) - 0x0A332 - True @@ -1074,6 +1187,8 @@ Door - 0x0348A (Tunnels Entry) - 0x039B4 Challenge Vault (Challenge): 158667 - 0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True +==Tunnels== + 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 @@ -1084,24 +1199,7 @@ Door - 0x27263 (Desert Shortcut) - 0x2773D Door - 0x09E87 (Town Shortcut) - 0x09E85 159557 - 0x33A20 (Theater Flowers EP) - 0x03553 & Theater to Tunnels - True -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 & Full Dots -158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry -158526 - 0x0383D (Left Pillar 1) - True - Dots & Full Dots -158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares -158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers -158529 - 0x339BB (Left Pillar 4) - 0x03859 - Black/White Squares & Stars & Symmetry - -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 & 7 Lasers | 0x3D9A8 & 7 Lasers - True +==Boat== The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Treehouse Entry Area - TrueOneWay - Quarry Boathouse Behind Staircase - TrueOneWay - Inside Glass Factory Behind Back Wall - TrueOneWay: 159042 - 0x22106 (Desert EP) - True - True @@ -1114,45 +1212,3 @@ The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Tre 159521 - 0x33879 (Tutorial Reflection EP) - True - True 159522 - 0x03C19 (Tutorial Moss EP) - True - True 159531 - 0x035C9 (Cargo Box EP) - 0x0A0C9 - True - -Obelisks (EPs) - Entry - True: -159700 - 0xFFE00 (Desert Obelisk Side 1) - 0x0332B & 0x03367 & 0x28B8A - True -159701 - 0xFFE01 (Desert Obelisk Side 2) - 0x037B6 & 0x037B2 & 0x000F7 - True -159702 - 0xFFE02 (Desert Obelisk Side 3) - 0x3351D - True -159703 - 0xFFE03 (Desert Obelisk Side 4) - 0x0053C & 0x00771 & 0x335C8 & 0x335C9 & 0x337F8 & 0x037BB & 0x220E4 & 0x220E5 - True -159704 - 0xFFE04 (Desert Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True -159709 - 0x00359 (Desert Obelisk) - True - True -159710 - 0xFFE10 (Monastery Obelisk Side 1) - 0x03ABC & 0x03ABE & 0x03AC0 & 0x03AC4 - True -159711 - 0xFFE11 (Monastery Obelisk Side 2) - 0x03AC5 - True -159712 - 0xFFE12 (Monastery Obelisk Side 3) - 0x03BE2 & 0x03BE3 & 0x0A409 - True -159713 - 0xFFE13 (Monastery Obelisk Side 4) - 0x006E5 & 0x006E6 & 0x006E7 & 0x034A7 & 0x034AD & 0x034AF & 0x03DAB & 0x03DAC & 0x03DAD - True -159714 - 0xFFE14 (Monastery Obelisk Side 5) - 0x03E01 - True -159715 - 0xFFE15 (Monastery Obelisk Side 6) - 0x289F4 & 0x289F5 - True -159719 - 0x00263 (Monastery Obelisk) - True - True -159720 - 0xFFE20 (Treehouse Obelisk Side 1) - 0x0053D & 0x0053E & 0x00769 - True -159721 - 0xFFE21 (Treehouse Obelisk Side 2) - 0x33721 & 0x220A7 & 0x220BD - True -159722 - 0xFFE22 (Treehouse Obelisk Side 3) - 0x03B22 & 0x03B23 & 0x03B24 & 0x03B25 & 0x03A79 & 0x28ABD & 0x28ABE - True -159723 - 0xFFE23 (Treehouse Obelisk Side 4) - 0x3388F & 0x28B29 & 0x28B2A - True -159724 - 0xFFE24 (Treehouse Obelisk Side 5) - 0x018B6 & 0x033BE & 0x033BF & 0x033DD & 0x033E5 - True -159725 - 0xFFE25 (Treehouse Obelisk Side 6) - 0x28AE9 & 0x3348F - True -159729 - 0x00097 (Treehouse Obelisk) - True - True -159730 - 0xFFE30 (Mountainside Obelisk Side 1) - 0x001A3 & 0x335AE - True -159731 - 0xFFE31 (Mountainside Obelisk Side 2) - 0x000D3 & 0x035F5 & 0x09D5D & 0x09D5E & 0x09D63 - True -159732 - 0xFFE32 (Mountainside Obelisk Side 3) - 0x3370E & 0x035DE & 0x03601 & 0x03603 & 0x03D0D & 0x3369A & 0x336C8 & 0x33505 - True -159733 - 0xFFE33 (Mountainside Obelisk Side 4) - 0x03A9E & 0x016B2 & 0x3365F & 0x03731 & 0x036CE & 0x03C07 & 0x03A93 - True -159734 - 0xFFE34 (Mountainside Obelisk Side 5) - 0x03AA6 & 0x3397C & 0x0105D & 0x0A304 - True -159735 - 0xFFE35 (Mountainside Obelisk Side 6) - 0x035CB & 0x035CF - True -159739 - 0x00367 (Mountainside Obelisk) - True - True -159740 - 0xFFE40 (Quarry Obelisk Side 1) - 0x28A7B & 0x005F6 & 0x00859 & 0x17CB9 & 0x28A4A - True -159741 - 0xFFE41 (Quarry Obelisk Side 2) - 0x334B6 & 0x00614 & 0x0069D & 0x28A4C - True -159742 - 0xFFE42 (Quarry Obelisk Side 3) - 0x289CF & 0x289D1 - True -159743 - 0xFFE43 (Quarry Obelisk Side 4) - 0x33692 - True -159744 - 0xFFE44 (Quarry Obelisk Side 5) - 0x03E77 & 0x03E7C - True -159749 - 0x22073 (Quarry Obelisk) - True - True -159750 - 0xFFE50 (Town Obelisk Side 1) - 0x035C7 - True -159751 - 0xFFE51 (Town Obelisk Side 2) - 0x01848 & 0x03D06 & 0x33530 & 0x33600 & 0x28A2F & 0x28A37 & 0x334A3 & 0x3352F - True -159752 - 0xFFE52 (Town Obelisk Side 3) - 0x33857 & 0x33879 & 0x03C19 - True -159753 - 0xFFE53 (Town Obelisk Side 4) - 0x28B30 & 0x035C9 - True -159754 - 0xFFE54 (Town Obelisk Side 5) - 0x03335 & 0x03412 & 0x038A6 & 0x038AA & 0x03E3F & 0x03E40 & 0x28B8E - True -159755 - 0xFFE55 (Town Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True -159759 - 0x0A16C (Town Obelisk) - True - True diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 75e926266aa9..205d669d30f9 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -110,7 +110,7 @@ class StaticWitnessLocations: "Town Red Rooftop 5", "Town Wooden Roof Lower Row 5", "Town Wooden Rooftop", - "Town Windmill Entry Panel", + "Windmill Entry Panel", "Town RGB House Entry Panel", "Town Laser Panel", @@ -269,9 +269,9 @@ class StaticWitnessLocations: "Jungle Bamboo CCW EP", "Jungle Bamboo CW EP", "Jungle Green Leaf Moss EP", - "Jungle Monastery Garden Left EP", - "Jungle Monastery Garden Right EP", - "Jungle Monastery Wall EP", + "Monastery Garden Left EP", + "Monastery Garden Right EP", + "Monastery Wall EP", "Bunker Tinted Door EP", "Bunker Green Room Flowers EP", "Swamp Purple Sand Middle EP", From e068389aa7baaeb04049e5bd584c97de37678ff0 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 24 Nov 2023 19:06:21 +0100 Subject: [PATCH 017/110] allow combining hint types & make areas less likely to be hinted if they already have associated location hints --- worlds/witness/Options.py | 21 +++-- worlds/witness/__init__.py | 18 ++-- worlds/witness/hints.py | 184 ++++++++++++++++++++++--------------- worlds/witness/utils.py | 15 +++ 4 files changed, 148 insertions(+), 90 deletions(-) diff --git a/worlds/witness/Options.py b/worlds/witness/Options.py index be7010d6d079..c51dd6c85f9f 100644 --- a/worlds/witness/Options.py +++ b/worlds/witness/Options.py @@ -180,15 +180,16 @@ class HintAmount(Range): default = 10 -class HintType(Choice): - """Specify the type of hints you want find on audio logs. - "Location" means that each hint will refer to one location in your world or containing an item for your world. - "Areas" means that any given hint will tell you some general info about the items you can find in one of the - main geographic areas on the island.""" - display_name = "Hint Type" - option_locations = 0 - option_areas = 1 - default = 1 +class AreaHintPercentage(Range): + """There are two types of hints for The Witness. + "Location hints" hint one location in your world / containing an item for your world. + "Area hints" will tell you some general info about the items you can find in one of the + main geographic areas on the island. + Use this option to specify how many of your hints you want to be area hints. The rest will be location hints.""" + display_name = "Area Hint Percentage" + range_start = 0 + range_end = 100 + default = 50 class DeathLink(Toggle): @@ -219,5 +220,5 @@ class TheWitnessOptions(PerGameCommonOptions): trap_percentage: TrapPercentage puzzle_skip_amount: PuzzleSkipAmount hint_amount: HintAmount - hint_type: HintType + area_hint_percentage: AreaHintPercentage death_link: DeathLink diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 0bff293c9065..b3a5af8bd139 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -17,7 +17,7 @@ from .regions import WitnessRegions from .rules import set_rules from .Options import TheWitnessOptions -from .utils import get_audio_logs +from .utils import get_audio_logs, build_weighted_int_list from logging import warning, error @@ -268,14 +268,18 @@ def fill_slot_data(self) -> dict: audio_logs = get_audio_logs().copy() if hint_amount: - if self.options.hint_type == 0: - generated_hints = make_direct_hints(self, hint_amount, self.own_itempool) - else: - generated_hints = make_area_hints(self, hint_amount) + area_weight, location_weight = self.options.area_hint_percentage, 100 - self.options.area_hint_percentage + + hint_type_amounts = build_weighted_int_list([area_weight / 100, location_weight / 100], hint_amount) + + generated_hints = [] + generated_hints += make_direct_hints(self, hint_type_amounts[1], self.own_itempool) + + already_hinted_locations = {hint[1] for hint in generated_hints if hint[1] != -1} - hint_amount = len(generated_hints) + generated_hints += make_area_hints(self, hint_type_amounts[0], already_hinted_locations) - if hint_amount: + if len(generated_hints): self.random.shuffle(audio_logs) duplicates = min(3, len(audio_logs) // hint_amount) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 813901b3afa7..2bc25b4df1dd 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,8 +1,9 @@ import logging -from typing import Tuple, List, TYPE_CHECKING +from typing import Tuple, List, TYPE_CHECKING, Set, Dict -from BaseClasses import Item, ItemClassification +from BaseClasses import Item, ItemClassification, Location from . import StaticWitnessLogic +from .utils import weighted_sample_without_replacement if TYPE_CHECKING: from . import WitnessWorld @@ -381,20 +382,22 @@ def generate_joke_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, i return [(x, -1) for x in world.random.sample(joke_hints, amount)] -def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]]: - potential_areas = list(StaticWitnessLogic.ALL_AREAS_BY_NAME.keys()) - items_per_area = dict() +def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[str, List[Location]], + already_hinted_locations: Set[int]) -> List[str]: + """ + Choose areas to hint. + This takes into account that some areas may already have had items hinted in them through location hints. + When this happens, they are made less likely to receive an area hint. + """ - for area in potential_areas: - regions = [ - world.regio.created_regions[region] - for region in StaticWitnessLogic.ALL_AREAS_BY_NAME[area]["regions"] - if region in world.regio.created_regions - ] - items = [location.item for region in regions for location in region.get_locations() if location.address] + unhinted_location_percentage_per_area = dict() + for area_name, locations in locations_per_area.items(): + not_yet_hinted_locations = sum(location.address not in already_hinted_locations for location in locations) + unhinted_location_percentage_per_area[area_name] = not_yet_hinted_locations / len(locations) - if items: - items_per_area[area] = items + items_per_area = {area_name: [location.item for location in locations] + for area_name, locations in locations_per_area.items() + if unhinted_location_percentage_per_area[area_name]} actual_amount = min(amount, len(items_per_area)) @@ -402,79 +405,114 @@ def make_area_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]] player_name = world.multiworld.get_player_name(world.player) logging.warning(f"There are not enough areas in the game to make {amount} area hints for player {player_name}.") - hinted_areas = world.random.sample(sorted(items_per_area), actual_amount) + areas = sorted(items_per_area) + weights = [unhinted_location_percentage_per_area[area] for area in areas] + hinted_areas = weighted_sample_without_replacement(world.random, areas, weights, actual_amount) - hints = [] + return hinted_areas - for hinted_area in hinted_areas: - corresponding_items = items_per_area[hinted_area] - local_progression = sum( - item.player == world.player - and item.classification in {ItemClassification.progression, ItemClassification.progression_skip_balancing} - for item in corresponding_items - ) - non_local_progression = sum( - item.player != world.player - and item.classification in {ItemClassification.progression, ItemClassification.progression_skip_balancing} - for item in corresponding_items - ) +def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: List[Item]) -> str: + """ + Word the hint for an area using natural sounding language. + This takes into account how much progression there is, how much of it is local/non-local, and whether there are + any local lasers to be found in this area. + """ - local_lasers = sum( - item.player == world.player and "Laser" in item.name - for item in corresponding_items - ) + local_progression = sum( + item.player == world.player + and item.classification in {ItemClassification.progression, ItemClassification.progression_skip_balancing} + for item in corresponding_items + ) - total_progression = non_local_progression + local_progression + non_local_progression = sum( + item.player != world.player + and item.classification in {ItemClassification.progression, ItemClassification.progression_skip_balancing} + for item in corresponding_items + ) - is_multiworld = len(world.multiworld.player_ids) > 1 + local_lasers = sum( + item.player == world.player and "Laser" in item.name + for item in corresponding_items + ) - correct_word = "Both" if total_progression == 2 else "All" + total_progression = non_local_progression + local_progression - if not total_progression: - hint_string = f"In the {hinted_area} area, you will find no progression items." + is_multiworld = len(world.multiworld.player_ids) > 1 - elif total_progression == 1: - hint_string = f"In the {hinted_area} area, you will find 1 progression item." + correct_word = "Both" if total_progression == 2 else "All" - if is_multiworld: - if local_lasers: - hint_string += "\nThis item is a laser for this world." - elif non_local_progression: - hint_string += "\nThis item is for another player." - else: - hint_string += "\nThis item is for this world." + if not total_progression: + hint_string = f"In the {hinted_area} area, you will find no progression items." + + elif total_progression == 1: + hint_string = f"In the {hinted_area} area, you will find 1 progression item." + + if is_multiworld: + if local_lasers: + hint_string += "\nThis item is a laser for this world." + elif non_local_progression: + hint_string += "\nThis item is for another player." else: - if local_lasers: - hint_string += "\nThis item is a laser." + hint_string += "\nThis item is for this world." + else: + if local_lasers: + hint_string += "\nThis item is a laser." + + else: + hint_string = f"In the {hinted_area} area, you will find {total_progression} progression items." + + if local_lasers == total_progression: + hint_string = f"{correct_word} of them are lasers" + " for this world." if is_multiworld else "." + + elif is_multiworld: + if local_progression and non_local_progression: + if non_local_progression == 1: + hint_string += f"\nOf them, one is for another player." + else: + hint_string += f"\nOf them, {non_local_progression} are for other players." + elif non_local_progression: + hint_string += f"\n{correct_word} of them are for other players." + elif local_progression: + hint_string += f"\n{correct_word} of them are for this world." + + if local_lasers == 1: + hint_string += "\nAlso, one of them is a laser for this world." + elif local_lasers: + hint_string += f"\nAlso, {local_lasers} of them are lasers for this world." else: - hint_string = f"In the {hinted_area} area, you will find {total_progression} progression items." - - if local_lasers == total_progression: - hint_string = f"{correct_word} of them are lasers" + " for this world." if is_multiworld else "." - - elif is_multiworld: - if local_progression and non_local_progression: - if non_local_progression == 1: - hint_string += f"\nOf them, one is for another player." - else: - hint_string += f"\nOf them, {non_local_progression} are for other players." - elif non_local_progression: - hint_string += f"\n{correct_word} of them are for other players." - elif local_progression: - hint_string += f"\n{correct_word} of them are for this world." - - if local_lasers == 1: - hint_string += "\nAlso, one of them is a laser for this world." - elif local_lasers: - hint_string += f"\nAlso, {local_lasers} of them are lasers for this world." + if local_lasers == 1: + hint_string += "\nOne of them is a laser." + elif local_lasers: + hint_string += f"\n{local_lasers} of them are lasers." - else: - if local_lasers == 1: - hint_string += "\nOne of them is a laser." - elif local_lasers: - hint_string += f"\n{local_lasers} of them are lasers." + return hint_string + + +def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations: Set[int]) -> List[Tuple[str, int]]: + potential_areas = list(StaticWitnessLogic.ALL_AREAS_BY_NAME.keys()) + locations_per_area = dict() + items_per_area = dict() + + for area in potential_areas: + regions = [ + world.regio.created_regions[region] + for region in StaticWitnessLogic.ALL_AREAS_BY_NAME[area]["regions"] + if region in world.regio.created_regions + ] + locations = [location for region in regions for location in region.get_locations() if location.address] + + if locations: + locations_per_area[area] = locations + items_per_area[area] = [location.item for location in locations] + + hinted_areas = choose_areas(world, amount, locations_per_area, already_hinted_locations) + + hints = [] + + for hinted_area in hinted_areas: + hint_string = word_area_hint(world, hinted_area, items_per_area[hinted_area]) hints.append((hint_string, -1)) diff --git a/worlds/witness/utils.py b/worlds/witness/utils.py index fbb670fd0877..5ff3766b79ac 100644 --- a/worlds/witness/utils.py +++ b/worlds/witness/utils.py @@ -2,6 +2,21 @@ from math import floor from typing import List, Collection, FrozenSet, Tuple, Dict, Any, Set from pkgutil import get_data +from random import random + + +def weighted_sample_without_replacement(world_random: random, population: List, weights: List[float], k: int): + positions = range(len(population)) + indices = [] + while True: + needed = k - len(indices) + if not needed: + break + for i in world_random.choices(positions, weights, k=needed): + if weights[i]: + weights[i] = 0.0 + indices.append(i) + return [population[i] for i in indices] def build_weighted_int_list(inputs: Collection[float], total: int) -> List[int]: From 089ddfcef26d9061bd7298f0f20044e65b8a66af Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 24 Nov 2023 19:20:06 +0100 Subject: [PATCH 018/110] fix for 0 of a hint type --- worlds/witness/__init__.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index b3a5af8bd139..ac4bf33e64b1 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -273,11 +273,12 @@ def fill_slot_data(self) -> dict: hint_type_amounts = build_weighted_int_list([area_weight / 100, location_weight / 100], hint_amount) generated_hints = [] - generated_hints += make_direct_hints(self, hint_type_amounts[1], self.own_itempool) - already_hinted_locations = {hint[1] for hint in generated_hints if hint[1] != -1} - - generated_hints += make_area_hints(self, hint_type_amounts[0], already_hinted_locations) + if hint_type_amounts[1]: + generated_hints += make_direct_hints(self, hint_type_amounts[1], self.own_itempool) + if hint_type_amounts[0]: + already_hinted_locations = {hint[1] for hint in generated_hints if hint[1] != -1} + generated_hints += make_area_hints(self, hint_type_amounts[0], already_hinted_locations) if len(generated_hints): self.random.shuffle(audio_logs) From 81c0025a30c7447c1ca5d421f5e266721ccb3091 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 24 Nov 2023 19:23:46 +0100 Subject: [PATCH 019/110] Bump data version --- worlds/witness/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index ac4bf33e64b1..f9c5809a45c9 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -41,7 +41,7 @@ class WitnessWorld(World): """ game = "The Witness" topology_present = False - data_version = 14 + data_version = 15 StaticWitnessLogic() StaticWitnessLocations() From f0b2e72ffe5ace6a022a288757acee316ece319c Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 25 Nov 2023 01:05:37 +0100 Subject: [PATCH 020/110] Failsafes --- worlds/witness/__init__.py | 34 ++++++++++++++++++----- worlds/witness/hints.py | 56 ++++++++++++++++++++------------------ worlds/witness/utils.py | 9 +++++- 3 files changed, 65 insertions(+), 34 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index f9c5809a45c9..da68edb754dd 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -11,7 +11,7 @@ from .player_logic import WitnessPlayerLogic from .static_logic import StaticWitnessLogic from .hints import get_always_hint_locations, get_always_hint_items, get_priority_hint_locations, \ - get_priority_hint_items, make_direct_hints, generate_joke_hints, make_area_hints + get_priority_hint_items, make_direct_hints, generate_joke_hints, make_area_hints, get_hintable_areas from .locations import WitnessPlayerLocations, StaticWitnessLocations from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems, ItemData from .regions import WitnessRegions @@ -271,21 +271,41 @@ def fill_slot_data(self) -> dict: area_weight, location_weight = self.options.area_hint_percentage, 100 - self.options.area_hint_percentage hint_type_amounts = build_weighted_int_list([area_weight / 100, location_weight / 100], hint_amount) + area_hints = hint_type_amounts[0] + location_hints = hint_type_amounts[1] generated_hints = [] - if hint_type_amounts[1]: - generated_hints += make_direct_hints(self, hint_type_amounts[1], self.own_itempool) - if hint_type_amounts[0]: + amount_of_hintable_areas = len(get_hintable_areas(self)[0]) + + if amount_of_hintable_areas < area_hints: + player_name = self.multiworld.get_player_name(self.player) + logging.warning(f"There are not enough areas in the game to make {area_hints} area hints for player " + f"{player_name}. Making {amount_of_hintable_areas} area hints, and filling rest with " + f"location hints. This might result in hinting areas that have all locations hinted " + f"individually.") + + area_hints = amount_of_hintable_areas + location_hints = hint_amount - area_hints + + if location_hints: + generated_hints += make_direct_hints(self, location_hints, self.own_itempool) + if area_hints: already_hinted_locations = {hint[1] for hint in generated_hints if hint[1] != -1} - generated_hints += make_area_hints(self, hint_type_amounts[0], already_hinted_locations) + generated_hints += make_area_hints(self, area_hints, already_hinted_locations) + + if len(generated_hints) != hint_amount: + player_name = self.multiworld.get_player_name(self.player) + logging.warning(f"Couldn't generate {hint_amount} hints for player {player_name}. " + f"Generated {len(generated_hints)} instead.") + hint_amount = len(generated_hints) - if len(generated_hints): + if hint_amount: self.random.shuffle(audio_logs) duplicates = min(3, len(audio_logs) // hint_amount) - for _ in range(0, hint_amount): + for _ in range(0, len(generated_hints)): hint = generated_hints.pop(0) for _ in range(0, duplicates): diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 2bc25b4df1dd..f4c1f345a8e1 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,9 +1,7 @@ -import logging from typing import Tuple, List, TYPE_CHECKING, Set, Dict - from BaseClasses import Item, ItemClassification, Location from . import StaticWitnessLogic -from .utils import weighted_sample_without_replacement +from .utils import weighted_sample_use_zero_if_necessary if TYPE_CHECKING: from . import WitnessWorld @@ -396,22 +394,39 @@ def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[st unhinted_location_percentage_per_area[area_name] = not_yet_hinted_locations / len(locations) items_per_area = {area_name: [location.item for location in locations] - for area_name, locations in locations_per_area.items() - if unhinted_location_percentage_per_area[area_name]} + for area_name, locations in locations_per_area.items()} actual_amount = min(amount, len(items_per_area)) - if actual_amount != amount: - player_name = world.multiworld.get_player_name(world.player) - logging.warning(f"There are not enough areas in the game to make {amount} area hints for player {player_name}.") - areas = sorted(items_per_area) weights = [unhinted_location_percentage_per_area[area] for area in areas] - hinted_areas = weighted_sample_without_replacement(world.random, areas, weights, actual_amount) + + hinted_areas = weighted_sample_use_zero_if_necessary(world.random, areas, weights, actual_amount) return hinted_areas +def get_hintable_areas(world: "WitnessWorld") -> Tuple[Dict[str, List[Location]], Dict[str, List[Item]]]: + potential_areas = list(StaticWitnessLogic.ALL_AREAS_BY_NAME.keys()) + + locations_per_area = dict() + items_per_area = dict() + + for area in potential_areas: + regions = [ + world.regio.created_regions[region] + for region in StaticWitnessLogic.ALL_AREAS_BY_NAME[area]["regions"] + if region in world.regio.created_regions + ] + locations = [location for region in regions for location in region.get_locations() if location.address] + + if locations: + locations_per_area[area] = locations + items_per_area[area] = [location.item for location in locations] + + return locations_per_area, items_per_area + + def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: List[Item]) -> str: """ Word the hint for an area using natural sounding language. @@ -490,22 +505,11 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: return hint_string -def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations: Set[int]) -> List[Tuple[str, int]]: - potential_areas = list(StaticWitnessLogic.ALL_AREAS_BY_NAME.keys()) - locations_per_area = dict() - items_per_area = dict() - - for area in potential_areas: - regions = [ - world.regio.created_regions[region] - for region in StaticWitnessLogic.ALL_AREAS_BY_NAME[area]["regions"] - if region in world.regio.created_regions - ] - locations = [location for region in regions for location in region.get_locations() if location.address] - - if locations: - locations_per_area[area] = locations - items_per_area[area] = [location.item for location in locations] +def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations: Set[int], + locations_per_area: Dict[str, List[Location]] = None, + items_per_area: Dict[str, List[Item]] = None) -> List[Tuple[str, int]]: + if locations_per_area is None or items_per_area is None: + locations_per_area, items_per_area = get_hintable_areas(world) hinted_areas = choose_areas(world, amount, locations_per_area, already_hinted_locations) diff --git a/worlds/witness/utils.py b/worlds/witness/utils.py index 5ff3766b79ac..d00b022937bd 100644 --- a/worlds/witness/utils.py +++ b/worlds/witness/utils.py @@ -5,13 +5,20 @@ from random import random -def weighted_sample_without_replacement(world_random: random, population: List, weights: List[float], k: int): +def weighted_sample_use_zero_if_necessary(world_random: random, population: List, weights: List[float], k: int): + """ + Get a sample of a given size with weights. + Use items with weight 0 if necessary to get the desired size. + """ positions = range(len(population)) indices = [] while True: needed = k - len(indices) if not needed: break + if not sum(weights): + # If it's necessary to use 0 weight items to get the desired amount, do that + weights = [1.0 for _ in weights] for i in world_random.choices(positions, weights, k=needed): if weights[i]: weights[i] = 0.0 From 463bae48247e46709a5a4b8bd442770973f28ab2 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 25 Nov 2023 01:08:24 +0100 Subject: [PATCH 021/110] Better caching --- worlds/witness/__init__.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index da68edb754dd..186b53ca6c6e 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -276,23 +276,29 @@ def fill_slot_data(self) -> dict: generated_hints = [] - amount_of_hintable_areas = len(get_hintable_areas(self)[0]) + locations_by_area, items_by_area = None, None - if amount_of_hintable_areas < area_hints: - player_name = self.multiworld.get_player_name(self.player) - logging.warning(f"There are not enough areas in the game to make {area_hints} area hints for player " - f"{player_name}. Making {amount_of_hintable_areas} area hints, and filling rest with " - f"location hints. This might result in hinting areas that have all locations hinted " - f"individually.") + if area_hints: + locations_by_area, items_by_area = get_hintable_areas(self) + + amount_of_hintable_areas = len(locations_by_area) + + if amount_of_hintable_areas < area_hints: + player_name = self.multiworld.get_player_name(self.player) + logging.warning(f"There are not enough areas in the game to make {area_hints} area hints for " + f"player {player_name}. Making {amount_of_hintable_areas} area hints, and filling " + f"rest with location hints. This might result in hinting areas that have all " + f"locations hinted individually, which is usually prevented.") - area_hints = amount_of_hintable_areas - location_hints = hint_amount - area_hints + area_hints = amount_of_hintable_areas + location_hints = hint_amount - area_hints if location_hints: generated_hints += make_direct_hints(self, location_hints, self.own_itempool) if area_hints: already_hinted_locations = {hint[1] for hint in generated_hints if hint[1] != -1} - generated_hints += make_area_hints(self, area_hints, already_hinted_locations) + generated_hints += make_area_hints(self, area_hints, already_hinted_locations, + locations_by_area, items_by_area) if len(generated_hints) != hint_amount: player_name = self.multiworld.get_player_name(self.player) From 3e0cf743f41595101d1e4d3ce91c82e83ecd9015 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 25 Nov 2023 01:10:26 +0100 Subject: [PATCH 022/110] Another failsafe --- worlds/witness/hints.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index f4c1f345a8e1..8b05e0e08ff3 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,3 +1,4 @@ +import logging from typing import Tuple, List, TYPE_CHECKING, Set, Dict from BaseClasses import Item, ItemClassification, Location from . import StaticWitnessLogic @@ -396,12 +397,14 @@ def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[st items_per_area = {area_name: [location.item for location in locations] for area_name, locations in locations_per_area.items()} - actual_amount = min(amount, len(items_per_area)) - areas = sorted(items_per_area) weights = [unhinted_location_percentage_per_area[area] for area in areas] - hinted_areas = weighted_sample_use_zero_if_necessary(world.random, areas, weights, actual_amount) + if len(weights) < amount: + logging.error("Attempting to choose more areas than there are available. This should never happen.") + amount = len(weights) + + hinted_areas = weighted_sample_use_zero_if_necessary(world.random, areas, weights, amount) return hinted_areas From c638b8d19a96a054b06485ee783966d09b4cf645 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 25 Nov 2023 01:11:15 +0100 Subject: [PATCH 023/110] Better message --- worlds/witness/hints.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 8b05e0e08ff3..50ad8e5c3763 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -401,7 +401,8 @@ def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[st weights = [unhinted_location_percentage_per_area[area] for area in areas] if len(weights) < amount: - logging.error("Attempting to choose more areas than there are available. This should never happen.") + logging.error("Attempting to choose more areas than there are available. This should never happen, " + "as the amount of areas to choose is capped to the amount of valid areas.") amount = len(weights) hinted_areas = weighted_sample_use_zero_if_necessary(world.random, areas, weights, amount) From 4cde51d8a5bcf30ac80afdb65b0b0e18f0c81627 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 25 Nov 2023 01:26:50 +0100 Subject: [PATCH 024/110] Fixed name --- worlds/witness/settings/Door_Shuffle/Complex_Doors.txt | 2 +- worlds/witness/settings/Door_Shuffle/Simple_Doors.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt index 2f2b32171079..6f28060b5a84 100644 --- a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt @@ -154,7 +154,7 @@ Theater Exit Left Panel Theater Exit Right Panel Jungle Laser Shortcut Panel Jungle Popup Wall Control -River Monastery Garden Shortcut Panel +Jungle Monastery Garden Shortcut Panel Bunker Entry Panel Bunker Tinted Glass Door Panel Bunker Glass Room 3 diff --git a/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt b/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt index 91a7132ec113..113391551148 100644 --- a/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt @@ -87,7 +87,7 @@ Theater Exit Left Panel Theater Exit Right Panel Jungle Laser Shortcut Panel Jungle Popup Wall Control -River Monastery Garden Shortcut Panel +Jungle Monastery Garden Shortcut Panel Bunker Entry Panel Bunker Tinted Glass Door Panel Bunker Glass Room 3 From cfdedd70e6f538fa003df99f2ee84faccb96f58e Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 25 Nov 2023 01:27:09 +0100 Subject: [PATCH 025/110] fixed another name --- worlds/witness/settings/Door_Shuffle/Complex_Doors.txt | 2 +- worlds/witness/settings/Door_Shuffle/Simple_Doors.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt index 6f28060b5a84..22f766d0166b 100644 --- a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt @@ -143,7 +143,7 @@ Town Wooden Roof Lower Row 5 Town RGB House Entry Panel Town Church Entry Panel Town Maze Panel -Town Windmill Entry Panel +Windmill Entry Panel Town Sound Room Right Town Red Rooftop 5 Town Church Lattice diff --git a/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt b/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt index 113391551148..7323c14f12fe 100644 --- a/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt @@ -76,7 +76,7 @@ Town Wooden Roof Lower Row 5 Town RGB House Entry Panel Town Church Entry Panel Town Maze Panel -Town Windmill Entry Panel +Windmill Entry Panel Town Sound Room Right Town Red Rooftop 5 Town Church Lattice From 7902d7c128a55a9c62e1ed09c64047d24a8d0bac Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 26 Nov 2023 03:14:33 +0100 Subject: [PATCH 026/110] don't overgenerate location hints --- worlds/witness/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 50ad8e5c3763..c237c61dad7f 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -374,7 +374,7 @@ def make_direct_hints(world: "WitnessWorld", hint_amount: int, own_itempool: Lis next_random_hint_is_item = not next_random_hint_is_item - return hints + return hints[:hint_amount] def generate_joke_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]]: From 584f80acdb82b7223d9a4dab5c5a864f022205a5 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 26 Nov 2023 03:20:36 +0100 Subject: [PATCH 027/110] I mean, technically outside swamp is by definition not in swamp --- worlds/witness/WitnessLogicExpert.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 6dae2809ee7f..be6922371d66 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -719,6 +719,8 @@ Bunker Laser Platform (Bunker) - Bunker Elevator - TrueOneWay: 158710 - 0x09DE0 (Laser Panel) - True - True Laser - 0x0C2B2 (Laser) - 0x09DE0 +==Swamp== + 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 @@ -726,8 +728,6 @@ Door - 0x00C1C (Entry) - 0x0056E 159322 - 0x03601 (Purple Sand Top EP) - 0x17E2B - True 159327 - 0x035DE (Purple Sand Bottom EP) - True - True -==Swamp== - 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 From b5c610c7648622f4110d3fa88d53ce7637238ab5 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 26 Nov 2023 03:21:37 +0100 Subject: [PATCH 028/110] We Lingoing now with all these 'Outside _' areas --- worlds/witness/WitnessLogicExpert.txt | 2 +- worlds/witness/WitnessLogicVanilla.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index be6922371d66..861a05daa1d5 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -395,7 +395,7 @@ Outside Keep (Outside Keep) - Main Island - True: 159430 - 0x03E77 (Red Flowers EP) - True - True 159431 - 0x03E7C (Purple Flowers EP) - True - True -Keep (Keep) - Main Island - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: +Keep (Keep) - Outside Keep - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: 158193 - 0x00139 (Hedge Maze 1) - True - True 158197 - 0x0A3A8 (Reset Pressure Plates 1) - True - True 158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Colored Squares & Triangles & Stars & Stars + Same Colored Symbol diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index a370d33ea66f..a2a908249867 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -395,7 +395,7 @@ Outside Keep (Outside Keep) - Main Island - True: 159430 - 0x03E77 (Red Flowers EP) - True - True 159431 - 0x03E7C (Purple Flowers EP) - True - True -Keep (Keep) - Main Island - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: +Keep (Keep) - Outside Keep - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC: 158193 - 0x00139 (Hedge Maze 1) - True - True 158197 - 0x0A3A8 (Reset Pressure Plates 1) - True - True 158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Dots From 01b2706104d56f66a6109022d7ae66221da760bf Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Sun, 26 Nov 2023 11:03:07 -0500 Subject: [PATCH 029/110] Update hints.py --- worlds/witness/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index c237c61dad7f..08cc8f8a4a68 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -482,7 +482,7 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: hint_string = f"In the {hinted_area} area, you will find {total_progression} progression items." if local_lasers == total_progression: - hint_string = f"{correct_word} of them are lasers" + " for this world." if is_multiworld else "." + hint_string += f"\n{correct_word} of them are lasers" + (" for this world." if is_multiworld else ".") elif is_multiworld: if local_progression and non_local_progression: From 15c912fca5e6c62c89b0facf71f49c38daeb29de Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 26 Nov 2023 18:23:36 +0100 Subject: [PATCH 030/110] The other player vs other players --- worlds/witness/hints.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index c237c61dad7f..7ac3d30d5478 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -457,7 +457,7 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: total_progression = non_local_progression + local_progression - is_multiworld = len(world.multiworld.player_ids) > 1 + player_count = len(world.multiworld.player_ids) correct_word = "Both" if total_progression == 2 else "All" @@ -467,11 +467,12 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: elif total_progression == 1: hint_string = f"In the {hinted_area} area, you will find 1 progression item." - if is_multiworld: + if player_count > 1: if local_lasers: hint_string += "\nThis item is a laser for this world." elif non_local_progression: - hint_string += "\nThis item is for another player." + other_player_str = "the other player" if player_count == 2 else "another player" + hint_string += f"\nThis item is for {other_player_str}." else: hint_string += "\nThis item is for this world." else: @@ -484,14 +485,16 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: if local_lasers == total_progression: hint_string = f"{correct_word} of them are lasers" + " for this world." if is_multiworld else "." - elif is_multiworld: + elif player_count > 1: if local_progression and non_local_progression: if non_local_progression == 1: - hint_string += f"\nOf them, one is for another player." + other_player_str = "the other player" if player_count == 2 else "another player" + hint_string += f"\nOne of them is for {other_player_str}." else: - hint_string += f"\nOf them, {non_local_progression} are for other players." + hint_string += f"\n{non_local_progression} of them are for other players." elif non_local_progression: - hint_string += f"\n{correct_word} of them are for other players." + other_players_str = "the other player" if player_count == 2 else "other players" + hint_string += f"\n{correct_word} of them are for {other_players_str}." elif local_progression: hint_string += f"\n{correct_word} of them are for this world." From dc71dbb5aa86ac84468a9c5fa8be5360bd789120 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 26 Nov 2023 18:23:48 +0100 Subject: [PATCH 031/110] oops --- worlds/witness/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 7ac3d30d5478..5f15ec28c0cc 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -483,7 +483,7 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: hint_string = f"In the {hinted_area} area, you will find {total_progression} progression items." if local_lasers == total_progression: - hint_string = f"{correct_word} of them are lasers" + " for this world." if is_multiworld else "." + hint_string = f"{correct_word} of them are lasers" + " for this world." if player_count > 1 else "." elif player_count > 1: if local_progression and non_local_progression: From 93df37f8472b9a6fea9deb9da43ff68436f60b90 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 00:19:05 +0100 Subject: [PATCH 032/110] Prevent 'All of them are for this world, all of them are lasers for this world' --- worlds/witness/hints.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 523d87591078..163aa07aca61 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -459,7 +459,7 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: player_count = len(world.multiworld.player_ids) - correct_word = "Both" if total_progression == 2 else "All" + area_progression_word = "Both" if total_progression == 2 else "All" if not total_progression: hint_string = f"In the {hinted_area} area, you will find no progression items." @@ -483,7 +483,8 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: hint_string = f"In the {hinted_area} area, you will find {total_progression} progression items." if local_lasers == total_progression: - hint_string += f"\n{correct_word} of them are lasers" + (" for this world." if player_count > 1 else ".") + sentence_end = (" for this world." if player_count > 1 else ".") + hint_string += f"\nAll of them are lasers" + sentence_end elif player_count > 1: if local_progression and non_local_progression: @@ -494,14 +495,17 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: hint_string += f"\n{non_local_progression} of them are for other players." elif non_local_progression: other_players_str = "the other player" if player_count == 2 else "other players" - hint_string += f"\n{correct_word} of them are for {other_players_str}." + hint_string += f"\n{area_progression_word} of them are for {other_players_str}." elif local_progression: - hint_string += f"\n{correct_word} of them are for this world." + hint_string += f"\n{area_progression_word} of them are for this world." if local_lasers == 1: hint_string += "\nAlso, one of them is a laser for this world." elif local_lasers: - hint_string += f"\nAlso, {local_lasers} of them are lasers for this world." + if area_progression_word == "All": + hint_string += f"\nAlso, {local_lasers} of them are lasers." + else: + hint_string += f"\nAlso, {local_lasers} of them are lasers for this world." else: if local_lasers == 1: From 1ac53af67f298dc1cabba45f435438e0a5889893 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 00:20:16 +0100 Subject: [PATCH 033/110] that was not how to do that --- worlds/witness/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 163aa07aca61..d44d76088d26 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -502,7 +502,7 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: if local_lasers == 1: hint_string += "\nAlso, one of them is a laser for this world." elif local_lasers: - if area_progression_word == "All": + if not local_progression: hint_string += f"\nAlso, {local_lasers} of them are lasers." else: hint_string += f"\nAlso, {local_lasers} of them are lasers for this world." From 2d1393860de4efcb59e3b6e0cedc55ad9eedf510 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 00:23:25 +0100 Subject: [PATCH 034/110] Bruh --- worlds/witness/hints.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index d44d76088d26..e26b0810c9e6 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -502,8 +502,9 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: if local_lasers == 1: hint_string += "\nAlso, one of them is a laser for this world." elif local_lasers: - if not local_progression: + if not non_local_progression: hint_string += f"\nAlso, {local_lasers} of them are lasers." + print(hint_string) else: hint_string += f"\nAlso, {local_lasers} of them are lasers for this world." From 6af42446e5e884c0ff486d59e022fa1d66742e27 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 00:28:22 +0100 Subject: [PATCH 035/110] Also do it for this --- worlds/witness/hints.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index e26b0810c9e6..aac9f550e307 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -500,7 +500,10 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: hint_string += f"\n{area_progression_word} of them are for this world." if local_lasers == 1: - hint_string += "\nAlso, one of them is a laser for this world." + if not non_local_progression: + hint_string += "\nAlso, one of them is a laser." + else: + hint_string += "\nAlso, one of them is a laser for this world." elif local_lasers: if not non_local_progression: hint_string += f"\nAlso, {local_lasers} of them are lasers." From b0038562d9671cdd5168a6eda105087346f39325 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 02:00:07 +0100 Subject: [PATCH 036/110] Refactor hints code --- worlds/witness/__init__.py | 11 ++- worlds/witness/hints.py | 182 +++++++++++++++++++------------------ 2 files changed, 101 insertions(+), 92 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 186b53ca6c6e..50613cf1869a 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -11,7 +11,8 @@ from .player_logic import WitnessPlayerLogic from .static_logic import StaticWitnessLogic from .hints import get_always_hint_locations, get_always_hint_items, get_priority_hint_locations, \ - get_priority_hint_items, make_direct_hints, generate_joke_hints, make_area_hints, get_hintable_areas + get_priority_hint_items, make_always_and_priority_hints, generate_joke_hints, make_area_hints, get_hintable_areas, \ + make_random_hints from .locations import WitnessPlayerLocations, StaticWitnessLocations from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems, ItemData from .regions import WitnessRegions @@ -294,7 +295,13 @@ def fill_slot_data(self) -> dict: location_hints = hint_amount - area_hints if location_hints: - generated_hints += make_direct_hints(self, location_hints, self.own_itempool) + always_and_priority, hinted_locs = make_always_and_priority_hints( + self, location_hints, self.own_itempool + ) + + remaining_hints = max(0, location_hints - len(always_and_priority)) + + generated_hints += make_random_hints(self, remaining_hints, self.own_itempool, hinted_locs) if area_hints: already_hinted_locations = {hint[1] for hint in generated_hints if hint[1] != -1} generated_hints += make_area_hints(self, area_hints, already_hinted_locations, diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index aac9f550e307..028d80766546 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,5 +1,5 @@ import logging -from typing import Tuple, List, TYPE_CHECKING, Set, Dict +from typing import Tuple, List, TYPE_CHECKING, Set, Dict, Union, Optional from BaseClasses import Item, ItemClassification, Location from . import StaticWitnessLogic from .utils import weighted_sample_use_zero_if_necessary @@ -225,7 +225,28 @@ def get_priority_hint_locations(_: "WitnessWorld"): } -def make_hint_from_item(world: "WitnessWorld", item_name: str, own_itempool: List[Item]): +def word_direct_hint(world: "WitnessWorld", location: Location, was_location_hint: bool): + location_name = location.name + location_id_for_client = location.address + if location.player != world.player: + location_name += " (" + world.multiworld.get_player_name(location.player) + ")" + location_id_for_client = -1 + + item = location.item + item_name = item.name + if item.player != world.player: + item_name += " (" + world.multiworld.get_player_name(item.player) + ")" + + if was_location_hint: + hint_text = f"{location_name} contains {item_name}." + else: + hint_text = f"{item_name} can be found at {location_name}." + + return hint_text, location_id_for_client + + +def hint_from_item(world: "WitnessWorld", item_name: str, own_itempool: List[Item]) -> Optional[Location]: + locations = [item.location for item in own_itempool if item.name == item_name and item.location] if not locations: @@ -237,28 +258,38 @@ def make_hint_from_item(world: "WitnessWorld", item_name: str, own_itempool: Lis if location_obj.player != world.player: location_name += " (" + world.multiworld.get_player_name(location_obj.player) + ")" - return location_name, item_name, location_obj.address if (location_obj.player == world.player) else -1 + return location_obj -def make_hint_from_location(world: "WitnessWorld", location: str): +def hint_from_location(world: "WitnessWorld", location: str) -> Optional[Location]: location_obj = world.multiworld.get_location(location, world.player) item_obj = world.multiworld.get_location(location, world.player).item item_name = item_obj.name if item_obj.player != world.player: item_name += " (" + world.multiworld.get_player_name(item_obj.player) + ")" - return location, item_name, location_obj.address if (location_obj.player == world.player) else -1 - + return location_obj -def make_direct_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item]): - hints = list() - prog_items_in_this_world = { +def get_items_and_locations_in_random_order(world: "WitnessWorld", own_itempool: List[Item]): + prog_items_in_this_world = sorted( item.name for item in own_itempool if item.advancement and item.code and item.location - } - loc_in_this_world = { + ) + locations_in_this_world = sorted( location.name for location in world.multiworld.get_locations(world.player) if location.address - } + ) + + world.random.shuffle(prog_items_in_this_world) + world.random.shuffle(locations_in_this_world) + + return prog_items_in_this_world, locations_in_this_world + + +def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, + own_itempool: List[Item]) -> Tuple[List[Tuple[str, int]], Set[Location]]: + hints = list() + + prog_items_in_this_world, loc_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) always_locations = [ location for location in get_always_hint_locations(world) @@ -277,104 +308,76 @@ def make_direct_hints(world: "WitnessWorld", hint_amount: int, own_itempool: Lis if item in prog_items_in_this_world ] - always_hint_pairs = dict() + hint_came_from_location: Dict[Location, bool] = dict() - for item in always_items: - hint_pair = make_hint_from_item(world, item, own_itempool) + # Get always and priority location/item hints + always_item_hints = {hint_from_item(world, item, own_itempool) for item in always_items} + always_location_hints = {hint_from_location(world, location) for location in always_locations} + priority_item_hints = {hint_from_item(world, item, own_itempool) for item in priority_items} + priority_location_hints = {hint_from_location(world, location) for location in priority_locations} - if not hint_pair or hint_pair[2] == 158007: # Tutorial Gate Open - continue + # Note whether each hint came from item or location. Location takes precedent + hint_came_from_location.update({location: False for location in always_item_hints | priority_item_hints}) + hint_came_from_location.update({location: True for location in always_location_hints | priority_location_hints}) - always_hint_pairs[hint_pair[0]] = (hint_pair[1], True, hint_pair[2]) + # Combine the sets. This will get rid of duplicates + always_hints_set = always_item_hints | always_location_hints + priority_hints_set = priority_item_hints | priority_location_hints - for location in always_locations: - hint_pair = make_hint_from_location(world, location) - always_hint_pairs[hint_pair[0]] = (hint_pair[1], False, hint_pair[2]) + # Make sure priority hints doesn't contain any hints that are already always hints. + priority_hints_set -= always_hints_set - priority_hint_pairs = dict() + # Convert both hint types to list and then shuffle. Also, get rid of None and Tutorial Gate Open. + always_hints: List[Location] = sorted(hint for hint in always_hints_set if hint and hint.address != 158007) + priority_hints: List[Location] = sorted(hint for hint in priority_hints_set if hint and hint.address != 158007) + world.random.shuffle(always_hints) + world.random.shuffle(priority_hints) - for item in priority_items: - hint_pair = make_hint_from_item(world, item, own_itempool) + already_hinted_locations: Set[Location] = set() - if not hint_pair or hint_pair[2] == 158007: # Tutorial Gate Open - continue + for _ in range(min(max_amount, len(always_hints))): + location = always_hints.pop() + hints.append(word_direct_hint(world, location, hint_came_from_location[location])) + already_hinted_locations.add(location) - priority_hint_pairs[hint_pair[0]] = (hint_pair[1], True, hint_pair[2]) + remaining_hints = max_amount - len(hints) + priority_hint_amount = int(max(0.0, min(len(priority_hints) / 2, remaining_hints / 2))) - for location in priority_locations: - hint_pair = make_hint_from_location(world, location) - priority_hint_pairs[hint_pair[0]] = (hint_pair[1], False, hint_pair[2]) + for _ in range(priority_hint_amount): + location = priority_hints.pop() + hints.append(word_direct_hint(world, location, hint_came_from_location[location])) + already_hinted_locations.add(location) - already_hinted_locations = set() + return hints, already_hinted_locations - for loc, item in always_hint_pairs.items(): - if loc in already_hinted_locations: - continue - - if item[1]: - hints.append((f"{item[0]} can be found at {loc}.", item[2])) - else: - hints.append((f"{loc} contains {item[0]}.", item[2])) - - already_hinted_locations.add(loc) - - world.random.shuffle(hints) # shuffle always hint order in case of low hint amount - - remaining_hints = hint_amount - len(hints) - priority_hint_amount = int(max(0.0, min(len(priority_hint_pairs) / 2, remaining_hints / 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) - - priority_hint_list = list(priority_hint_pairs.items()) - world.random.shuffle(priority_hint_list) - for _ in range(0, priority_hint_amount): - next_priority_hint = priority_hint_list.pop() - loc = next_priority_hint[0] - item = next_priority_hint[1] - if loc in already_hinted_locations: - continue - - if item[1]: - hints.append((f"{item[0]} can be found at {loc}.", item[2])) - else: - hints.append((f"{loc} contains {item[0]}.", item[2])) +def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item], + already_hinted_locations: Set[Location]) -> List[Tuple[str, int]]: + prog_items_in_this_world, locations_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) - already_hinted_locations.add(loc) + next_random_hint_is_location = world.random.randrange(0, 2) - next_random_hint_is_item = world.random.randrange(0, 2) + hints = [] while len(hints) < hint_amount: - 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, prog_items_in_this_world.pop(), own_itempool) - - if not hint or hint[0] in already_hinted_locations: - continue - - hints.append((f"{hint[1]} can be found at {hint[0]}.", hint[2])) - - already_hinted_locations.add(hint[0]) + if not prog_items_in_this_world and not locations_in_this_world: + player_name = world.multiworld.get_player_name(world.player) + f"Ran out of items/locations to hint for player {player_name}." + break + if next_random_hint_is_location: + hint_location = hint_from_location(world, locations_in_this_world.pop()) else: - hint = make_hint_from_location(world, locations_in_this_world.pop()) - - if hint[0] in already_hinted_locations: - continue + hint_location = hint_from_item(world, prog_items_in_this_world.pop(), own_itempool) - hints.append((f"{hint[0]} contains {hint[1]}.", hint[2])) + if not hint_location or hint_location in already_hinted_locations: + continue - already_hinted_locations.add(hint[0]) + hints.append(word_direct_hint(world, hint_location, next_random_hint_is_location)) + already_hinted_locations.add(hint_location) - next_random_hint_is_item = not next_random_hint_is_item + next_random_hint_is_location = not next_random_hint_is_location - return hints[:hint_amount] + return hints def generate_joke_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]]: @@ -507,7 +510,6 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: elif local_lasers: if not non_local_progression: hint_string += f"\nAlso, {local_lasers} of them are lasers." - print(hint_string) else: hint_string += f"\nAlso, {local_lasers} of them are lasers for this world." From d91d0da81bbc06b8e8d7424c78fe45eb7f8dd8d2 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 02:03:13 +0100 Subject: [PATCH 037/110] oop --- worlds/witness/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 50613cf1869a..67ba77352cf6 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -299,9 +299,12 @@ def fill_slot_data(self) -> dict: self, location_hints, self.own_itempool ) + generated_hints += always_and_priority + remaining_hints = max(0, location_hints - len(always_and_priority)) generated_hints += make_random_hints(self, remaining_hints, self.own_itempool, hinted_locs) + if area_hints: already_hinted_locations = {hint[1] for hint in generated_hints if hint[1] != -1} generated_hints += make_area_hints(self, area_hints, already_hinted_locations, From 809ef25634a864a6af9653cd59eae62cbb2da274 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 02:35:12 +0100 Subject: [PATCH 038/110] refactor refactor refactor --- worlds/witness/__init__.py | 42 +++++++++++------------------------ worlds/witness/hints.py | 45 +++++++++++++++++++------------------- worlds/witness/utils.py | 9 +------- 3 files changed, 36 insertions(+), 60 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 67ba77352cf6..348963919e75 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -3,7 +3,7 @@ """ import dataclasses import logging -from typing import Dict, Optional +from typing import Dict, Optional, List, Tuple from BaseClasses import Region, Location, MultiWorld, Item, Entrance, Tutorial, CollectionState from Options import PerGameCommonOptions, Toggle @@ -275,40 +275,23 @@ def fill_slot_data(self) -> dict: area_hints = hint_type_amounts[0] location_hints = hint_type_amounts[1] - generated_hints = [] + generated_hints: List[Tuple[str, Optional[Location]]] = [] - locations_by_area, items_by_area = None, None - - if area_hints: - locations_by_area, items_by_area = get_hintable_areas(self) - - amount_of_hintable_areas = len(locations_by_area) - - if amount_of_hintable_areas < area_hints: - player_name = self.multiworld.get_player_name(self.player) - logging.warning(f"There are not enough areas in the game to make {area_hints} area hints for " - f"player {player_name}. Making {amount_of_hintable_areas} area hints, and filling " - f"rest with location hints. This might result in hinting areas that have all " - f"locations hinted individually, which is usually prevented.") - - area_hints = amount_of_hintable_areas - location_hints = hint_amount - area_hints + already_hinted_locations = set() if location_hints: - always_and_priority, hinted_locs = make_always_and_priority_hints( - self, location_hints, self.own_itempool - ) + always_and_priority = make_always_and_priority_hints(self, location_hints, self.own_itempool) + already_hinted_locations = {hint[1] for hint in always_and_priority} generated_hints += always_and_priority - remaining_hints = max(0, location_hints - len(always_and_priority)) - - generated_hints += make_random_hints(self, remaining_hints, self.own_itempool, hinted_locs) - if area_hints: - already_hinted_locations = {hint[1] for hint in generated_hints if hint[1] != -1} - generated_hints += make_area_hints(self, area_hints, already_hinted_locations, - locations_by_area, items_by_area) + generated_hints += make_area_hints(self, area_hints, already_hinted_locations) + + if len(generated_hints) < hint_amount: + generated_hints += make_random_hints( + self, hint_amount - len(generated_hints), self.own_itempool, already_hinted_locations + ) if len(generated_hints) != hint_amount: player_name = self.multiworld.get_player_name(self.player) @@ -326,7 +309,8 @@ def fill_slot_data(self) -> dict: for _ in range(0, duplicates): audio_log = audio_logs.pop() - self.log_ids_to_hints[int(audio_log, 16)] = hint + location_id = hint[1].address if hint[1] and hint[1].item.player == self.player else -1 + self.log_ids_to_hints[int(audio_log, 16)] = (hint[0], location_id) else: player_name = self.multiworld.get_player_name(self.player) logging.warning(f"For some reason, no hints were able to be generated for {player_name}'s world.") diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 028d80766546..653289953617 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,8 +1,8 @@ import logging from typing import Tuple, List, TYPE_CHECKING, Set, Dict, Union, Optional -from BaseClasses import Item, ItemClassification, Location +from BaseClasses import Item, ItemClassification, Location, LocationProgressType from . import StaticWitnessLogic -from .utils import weighted_sample_use_zero_if_necessary +from .utils import weighted_sample if TYPE_CHECKING: from . import WitnessWorld @@ -227,10 +227,8 @@ def get_priority_hint_locations(_: "WitnessWorld"): def word_direct_hint(world: "WitnessWorld", location: Location, was_location_hint: bool): location_name = location.name - location_id_for_client = location.address if location.player != world.player: location_name += " (" + world.multiworld.get_player_name(location.player) + ")" - location_id_for_client = -1 item = location.item item_name = item.name @@ -242,7 +240,7 @@ def word_direct_hint(world: "WitnessWorld", location: Location, was_location_hin else: hint_text = f"{item_name} can be found at {location_name}." - return hint_text, location_id_for_client + return hint_text, location def hint_from_item(world: "WitnessWorld", item_name: str, own_itempool: List[Item]) -> Optional[Location]: @@ -273,10 +271,12 @@ def hint_from_location(world: "WitnessWorld", location: str) -> Optional[Locatio def get_items_and_locations_in_random_order(world: "WitnessWorld", own_itempool: List[Item]): prog_items_in_this_world = sorted( - item.name for item in own_itempool if item.advancement and item.code and item.location + item.name for item in own_itempool + if item.advancement and item.code and item.location ) locations_in_this_world = sorted( - location.name for location in world.multiworld.get_locations(world.player) if location.address + location.name for location in world.multiworld.get_locations(world.player) + if location.address and location.progress_type != LocationProgressType.EXCLUDED ) world.random.shuffle(prog_items_in_this_world) @@ -286,8 +286,8 @@ def get_items_and_locations_in_random_order(world: "WitnessWorld", own_itempool: def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, - own_itempool: List[Item]) -> Tuple[List[Tuple[str, int]], Set[Location]]: - hints = list() + own_itempool: List[Item]) -> List[Tuple[str, Location]]: + hints: List[Tuple[str, Location]] = list() prog_items_in_this_world, loc_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) @@ -348,11 +348,11 @@ def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, hints.append(word_direct_hint(world, location, hint_came_from_location[location])) already_hinted_locations.add(location) - return hints, already_hinted_locations + return hints def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item], - already_hinted_locations: Set[Location]) -> List[Tuple[str, int]]: + already_hinted_locations: Set[Location]) -> List[Tuple[str, Location]]: prog_items_in_this_world, locations_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) next_random_hint_is_location = world.random.randrange(0, 2) @@ -400,15 +400,12 @@ def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[st items_per_area = {area_name: [location.item for location in locations] for area_name, locations in locations_per_area.items()} - areas = sorted(items_per_area) + areas = sorted(area for area in items_per_area if unhinted_location_percentage_per_area[area]) weights = [unhinted_location_percentage_per_area[area] for area in areas] - if len(weights) < amount: - logging.error("Attempting to choose more areas than there are available. This should never happen, " - "as the amount of areas to choose is capped to the amount of valid areas.") - amount = len(weights) + amount = min(amount, len(weights)) - hinted_areas = weighted_sample_use_zero_if_necessary(world.random, areas, weights, amount) + hinted_areas = weighted_sample(world.random, areas, weights, amount) return hinted_areas @@ -522,11 +519,8 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: return hint_string -def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations: Set[int], - locations_per_area: Dict[str, List[Location]] = None, - items_per_area: Dict[str, List[Item]] = None) -> List[Tuple[str, int]]: - if locations_per_area is None or items_per_area is None: - locations_per_area, items_per_area = get_hintable_areas(world) +def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations: Set[int]) -> List[Tuple[str, None]]: + locations_per_area, items_per_area = get_hintable_areas(world) hinted_areas = choose_areas(world, amount, locations_per_area, already_hinted_locations) @@ -535,6 +529,11 @@ def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations for hinted_area in hinted_areas: hint_string = word_area_hint(world, hinted_area, items_per_area[hinted_area]) - hints.append((hint_string, -1)) + hints.append((hint_string, None)) + + if len(hinted_areas) < amount: + player_name = world.multiworld.get_player_name(world.player) + logging.warning(f"Was not able to make {amount} area hints for player {player_name}. " + f"Made {len(hinted_areas)} instead, and filled the rest with random location hints.") return hints diff --git a/worlds/witness/utils.py b/worlds/witness/utils.py index d00b022937bd..b1f1b6d83100 100644 --- a/worlds/witness/utils.py +++ b/worlds/witness/utils.py @@ -5,20 +5,13 @@ from random import random -def weighted_sample_use_zero_if_necessary(world_random: random, population: List, weights: List[float], k: int): - """ - Get a sample of a given size with weights. - Use items with weight 0 if necessary to get the desired size. - """ +def weighted_sample(world_random: random, population: List, weights: List[float], k: int): positions = range(len(population)) indices = [] while True: needed = k - len(indices) if not needed: break - if not sum(weights): - # If it's necessary to use 0 weight items to get the desired amount, do that - weights = [1.0 for _ in weights] for i in world_random.choices(positions, weights, k=needed): if weights[i]: weights[i] = 0.0 From 28ea1eadfcf5ba364f44087138af84668a4ac4fb Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 02:36:34 +0100 Subject: [PATCH 039/110] Some comments --- worlds/witness/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 348963919e75..0ca3ffc2eb60 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -279,25 +279,30 @@ def fill_slot_data(self) -> dict: already_hinted_locations = set() + # First, make always and priority hints. if location_hints: always_and_priority = make_always_and_priority_hints(self, location_hints, self.own_itempool) already_hinted_locations = {hint[1] for hint in always_and_priority} generated_hints += always_and_priority + # Then, make area hints. if area_hints: generated_hints += make_area_hints(self, area_hints, already_hinted_locations) + # If we don't have enough hints yet, make random location/item hints. if len(generated_hints) < hint_amount: generated_hints += make_random_hints( self, hint_amount - len(generated_hints), self.own_itempool, already_hinted_locations ) + # If we still don't have enough for whatever reason, throw a warning, proceed with the lower amount if len(generated_hints) != hint_amount: player_name = self.multiworld.get_player_name(self.player) logging.warning(f"Couldn't generate {hint_amount} hints for player {player_name}. " f"Generated {len(generated_hints)} instead.") - hint_amount = len(generated_hints) + + hint_amount = len(generated_hints) if hint_amount: self.random.shuffle(audio_logs) From bac75dde8db0d5090aeeb6406da2e5066df74e17 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 03:01:53 +0100 Subject: [PATCH 040/110] More refactoring --- worlds/witness/__init__.py | 18 +++++++++--------- worlds/witness/hints.py | 20 ++++++++++++-------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 0ca3ffc2eb60..61673a32acab 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -2,9 +2,8 @@ Archipelago init file for The Witness """ import dataclasses -import logging -from typing import Dict, Optional, List, Tuple +from typing import Dict, Optional, List, Tuple, Set from BaseClasses import Region, Location, MultiWorld, Item, Entrance, Tutorial, CollectionState from Options import PerGameCommonOptions, Toggle from worlds.AutoWorld import World, WebWorld @@ -286,21 +285,25 @@ def fill_slot_data(self) -> dict: generated_hints += always_and_priority + unhinted_locations_per_area: Dict[str, Set[Location]] = dict() + # Then, make area hints. if area_hints: - generated_hints += make_area_hints(self, area_hints, already_hinted_locations) + area_hints, unhinted_locations_per_area = make_area_hints(self, area_hints, already_hinted_locations) + generated_hints += area_hints # If we don't have enough hints yet, make random location/item hints. if len(generated_hints) < hint_amount: generated_hints += make_random_hints( - self, hint_amount - len(generated_hints), self.own_itempool, already_hinted_locations + self, hint_amount - len(generated_hints), self.own_itempool, already_hinted_locations, + unhinted_locations_per_area ) # If we still don't have enough for whatever reason, throw a warning, proceed with the lower amount if len(generated_hints) != hint_amount: player_name = self.multiworld.get_player_name(self.player) - logging.warning(f"Couldn't generate {hint_amount} hints for player {player_name}. " - f"Generated {len(generated_hints)} instead.") + warning(f"Couldn't generate {hint_amount} hints for player {player_name}. " + f"Generated {len(generated_hints)} instead.") hint_amount = len(generated_hints) @@ -316,9 +319,6 @@ def fill_slot_data(self) -> dict: audio_log = audio_logs.pop() location_id = hint[1].address if hint[1] and hint[1].item.player == self.player else -1 self.log_ids_to_hints[int(audio_log, 16)] = (hint[0], location_id) - else: - player_name = self.multiworld.get_player_name(self.player) - logging.warning(f"For some reason, no hints were able to be generated for {player_name}'s world.") if audio_logs: audio_log = audio_logs.pop() diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 653289953617..a6649b5aecd4 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -352,7 +352,8 @@ def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item], - already_hinted_locations: Set[Location]) -> List[Tuple[str, Location]]: + already_hinted_locations: Set[Location], + unhinted_locations_for_hinted_areas: Dict[str, Set[Location]]) -> List[Tuple[str, Location]]: prog_items_in_this_world, locations_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) next_random_hint_is_location = world.random.randrange(0, 2) @@ -385,16 +386,18 @@ def generate_joke_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, i def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[str, List[Location]], - already_hinted_locations: Set[int]) -> List[str]: + already_hinted_locations: Set[Location]) -> Tuple[List[str], Dict[str, Set[Location]]]: """ Choose areas to hint. This takes into account that some areas may already have had items hinted in them through location hints. When this happens, they are made less likely to receive an area hint. """ + unhinted_locations_per_area = dict() unhinted_location_percentage_per_area = dict() for area_name, locations in locations_per_area.items(): - not_yet_hinted_locations = sum(location.address not in already_hinted_locations for location in locations) + not_yet_hinted_locations = sum(location not in already_hinted_locations for location in locations) + unhinted_locations_per_area[area_name] = {loc for loc in locations if loc not in already_hinted_locations} unhinted_location_percentage_per_area[area_name] = not_yet_hinted_locations / len(locations) items_per_area = {area_name: [location.item for location in locations] @@ -407,7 +410,7 @@ def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[st hinted_areas = weighted_sample(world.random, areas, weights, amount) - return hinted_areas + return hinted_areas, unhinted_locations_per_area def get_hintable_areas(world: "WitnessWorld") -> Tuple[Dict[str, List[Location]], Dict[str, List[Item]]]: @@ -519,10 +522,11 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: return hint_string -def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations: Set[int]) -> List[Tuple[str, None]]: - locations_per_area, items_per_area = get_hintable_areas(world) +def make_area_hints(world: "WitnessWorld", amount: int, + already_hinted_locations: Set[Location]) -> Tuple[List[Tuple[str, None]], Dict[str, Set[Location]]]: + locs_per_area, items_per_area = get_hintable_areas(world) - hinted_areas = choose_areas(world, amount, locations_per_area, already_hinted_locations) + hinted_areas, unhinted_locations_per_area = choose_areas(world, amount, locs_per_area, already_hinted_locations) hints = [] @@ -536,4 +540,4 @@ def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations logging.warning(f"Was not able to make {amount} area hints for player {player_name}. " f"Made {len(hinted_areas)} instead, and filled the rest with random location hints.") - return hints + return hints, unhinted_locations_per_area From 9998fc8f6224a554a3376c5eb69cab4c5a999ba6 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 03:21:29 +0100 Subject: [PATCH 041/110] Prevent hinting from already hinted areas --- worlds/witness/hints.py | 10 ++++++++++ worlds/witness/static_logic.py | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index a6649b5aecd4..fd9a0ed75fb7 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -360,6 +360,8 @@ def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: Lis hints = [] + area_reverse_lookup = {v: k for k, l in unhinted_locations_for_hinted_areas.items() for v in l} + while len(hints) < hint_amount: if not prog_items_in_this_world and not locations_in_this_world: player_name = world.multiworld.get_player_name(world.player) @@ -373,6 +375,14 @@ def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: Lis if not hint_location or hint_location in already_hinted_locations: continue + # Don't hint locations in areas that are almost fully hinted out already + if hint_location in area_reverse_lookup: + area = area_reverse_lookup[hint_location] + if len(unhinted_locations_for_hinted_areas[area]) == 1: + continue + del area_reverse_lookup[hint_location] + unhinted_locations_for_hinted_areas[area] -= {hint_location} + hints.append(word_direct_hint(world, hint_location, next_random_hint_is_location)) already_hinted_locations.add(hint_location) diff --git a/worlds/witness/static_logic.py b/worlds/witness/static_logic.py index 768eff9b3919..6e36bda28345 100644 --- a/worlds/witness/static_logic.py +++ b/worlds/witness/static_logic.py @@ -103,7 +103,7 @@ def read_logic_file(self, lines): "entity_hex": entity_hex, "region": None, "id": None, - "entityType": location_id + "entityType": location_id, } self.ENTITIES_BY_NAME[self.ENTITIES_BY_HEX[entity_hex]["checkName"]] = self.ENTITIES_BY_HEX[entity_hex] From 8cbeefbd1d2b0b7ef53dab4504c944848c7e601b Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 03:29:06 +0100 Subject: [PATCH 042/110] Make it try to reuse always hints --- worlds/witness/__init__.py | 10 +++++----- worlds/witness/hints.py | 10 ++++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 61673a32acab..7d12d5cf3c58 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -275,12 +275,12 @@ def fill_slot_data(self) -> dict: location_hints = hint_type_amounts[1] generated_hints: List[Tuple[str, Optional[Location]]] = [] - - already_hinted_locations = set() + already_hinted_locations: Set[Location] = set() + unused_always_hints: List[Location] = list() # First, make always and priority hints. if location_hints: - always_and_priority = make_always_and_priority_hints(self, location_hints, self.own_itempool) + always_and_priority, unused_always_hints = make_always_and_priority_hints(self, location_hints, self.own_itempool) already_hinted_locations = {hint[1] for hint in always_and_priority} generated_hints += always_and_priority @@ -292,11 +292,11 @@ def fill_slot_data(self) -> dict: area_hints, unhinted_locations_per_area = make_area_hints(self, area_hints, already_hinted_locations) generated_hints += area_hints - # If we don't have enough hints yet, make random location/item hints. + # If we don't have enough hints yet, make random location/item hints, or use remaining always hints. if len(generated_hints) < hint_amount: generated_hints += make_random_hints( self, hint_amount - len(generated_hints), self.own_itempool, already_hinted_locations, - unhinted_locations_per_area + unused_always_hints, unhinted_locations_per_area ) # If we still don't have enough for whatever reason, throw a warning, proceed with the lower amount diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index fd9a0ed75fb7..6a3c6a4b44b5 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -286,7 +286,7 @@ def get_items_and_locations_in_random_order(world: "WitnessWorld", own_itempool: def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, - own_itempool: List[Item]) -> List[Tuple[str, Location]]: + own_itempool: List[Item]) -> Tuple[List[Tuple[str, Location]], List[Location]]: hints: List[Tuple[str, Location]] = list() prog_items_in_this_world, loc_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) @@ -348,11 +348,11 @@ def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, hints.append(word_direct_hint(world, location, hint_came_from_location[location])) already_hinted_locations.add(location) - return hints + return hints, always_hints def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item], - already_hinted_locations: Set[Location], + already_hinted_locations: Set[Location], hints_to_use_first: List[Location], unhinted_locations_for_hinted_areas: Dict[str, Set[Location]]) -> List[Tuple[str, Location]]: prog_items_in_this_world, locations_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) @@ -367,7 +367,9 @@ def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: Lis player_name = world.multiworld.get_player_name(world.player) f"Ran out of items/locations to hint for player {player_name}." break - if next_random_hint_is_location: + if hints_to_use_first: + hint_location = hints_to_use_first.pop() + elif next_random_hint_is_location: hint_location = hint_from_location(world, locations_in_this_world.pop()) else: hint_location = hint_from_item(world, prog_items_in_this_world.pop(), own_itempool) From 5a1c3b640501683efb794276d08b86f7fa347802 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 03:31:23 +0100 Subject: [PATCH 043/110] oop --- worlds/witness/__init__.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 7d12d5cf3c58..6e395af39e54 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -279,11 +279,13 @@ def fill_slot_data(self) -> dict: unused_always_hints: List[Location] = list() # First, make always and priority hints. - if location_hints: - always_and_priority, unused_always_hints = make_always_and_priority_hints(self, location_hints, self.own_itempool) - already_hinted_locations = {hint[1] for hint in always_and_priority} - generated_hints += always_and_priority + always_and_priority, unused_always_hints = make_always_and_priority_hints( + self, location_hints, self.own_itempool + ) + already_hinted_locations = {hint[1] for hint in always_and_priority} + + generated_hints += always_and_priority unhinted_locations_per_area: Dict[str, Set[Location]] = dict() From e126b24b3f55044f641845fb7546d648bf40b827 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 29 Nov 2023 03:32:25 +0100 Subject: [PATCH 044/110] remove some unnecessary definitions --- worlds/witness/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 6e395af39e54..84050a764763 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -275,8 +275,6 @@ def fill_slot_data(self) -> dict: location_hints = hint_type_amounts[1] generated_hints: List[Tuple[str, Optional[Location]]] = [] - already_hinted_locations: Set[Location] = set() - unused_always_hints: List[Location] = list() # First, make always and priority hints. From bd00cc38466aa997272f7ea9fe520337a4f41c25 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 03:22:00 +0100 Subject: [PATCH 045/110] Actually check all cases lmfao --- worlds/witness/hints.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 6a3c6a4b44b5..08704ee1d1fc 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -363,13 +363,13 @@ def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: Lis area_reverse_lookup = {v: k for k, l in unhinted_locations_for_hinted_areas.items() for v in l} while len(hints) < hint_amount: - if not prog_items_in_this_world and not locations_in_this_world: + if not prog_items_in_this_world and not locations_in_this_world and not hints_to_use_first: player_name = world.multiworld.get_player_name(world.player) f"Ran out of items/locations to hint for player {player_name}." break if hints_to_use_first: hint_location = hints_to_use_first.pop() - elif next_random_hint_is_location: + elif next_random_hint_is_location or not prog_items_in_this_world: hint_location = hint_from_location(world, locations_in_this_world.pop()) else: hint_location = hint_from_item(world, prog_items_in_this_world.pop(), own_itempool) From ed3f8d2ed1457c45c43bd2ccfd55a33d1c9376cf Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 03:35:00 +0100 Subject: [PATCH 046/110] location name groups --- worlds/witness/__init__.py | 1 + worlds/witness/locations.py | 6 ++++++ worlds/witness/static_logic.py | 4 +++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 84050a764763..04f75408610b 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -56,6 +56,7 @@ class WitnessWorld(World): } location_name_to_id = StaticWitnessLocations.ALL_LOCATIONS_TO_ID item_name_groups = StaticWitnessItems.item_groups + location_name_groups = StaticWitnessLocations.AREA_LOCATION_GROUPS required_client_version = (0, 4, 4) diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 205d669d30f9..1e0a6ee41ca4 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -459,6 +459,8 @@ class StaticWitnessLocations: ALL_LOCATIONS_TO_ID = dict() + AREA_LOCATION_GROUPS = dict() + @staticmethod def get_id(chex: str): """ @@ -491,6 +493,10 @@ def __init__(self): for key, item in all_loc_to_id.items(): self.ALL_LOCATIONS_TO_ID[key] = item + for loc in all_loc_to_id: + area = StaticWitnessLogic.ENTITIES_BY_NAME[loc]["area"]["name"] + self.AREA_LOCATION_GROUPS.setdefault(area, []).append(loc) + class WitnessPlayerLocations: """ diff --git a/worlds/witness/static_logic.py b/worlds/witness/static_logic.py index 6e36bda28345..52c900ba099a 100644 --- a/worlds/witness/static_logic.py +++ b/worlds/witness/static_logic.py @@ -104,6 +104,7 @@ def read_logic_file(self, lines): "region": None, "id": None, "entityType": location_id, + "area": current_area, } self.ENTITIES_BY_NAME[self.ENTITIES_BY_HEX[entity_hex]["checkName"]] = self.ENTITIES_BY_HEX[entity_hex] @@ -166,7 +167,8 @@ def read_logic_file(self, lines): "entity_hex": entity_hex, "region": current_region, "id": int(location_id), - "entityType": location_type + "entityType": location_type, + "area": current_area, } self.ENTITY_ID_TO_NAME[entity_hex] = full_entity_name From 28b6194dcd49f86c6e513c0af2152f3298a41957 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 03:44:53 +0100 Subject: [PATCH 047/110] Rename some Rivers to Jungles --- worlds/witness/WitnessItems.txt | 2 +- worlds/witness/items.py | 2 +- worlds/witness/settings/Door_Shuffle/Complex_Doors.txt | 2 +- worlds/witness/settings/Exclusions/Vaults.txt | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/witness/WitnessItems.txt b/worlds/witness/WitnessItems.txt index 750d6bd4ebec..fe72bba4be42 100644 --- a/worlds/witness/WitnessItems.txt +++ b/worlds/witness/WitnessItems.txt @@ -164,7 +164,7 @@ Doors: 1756 - Theater Exit Right (Door) - 0x3CCDF 1759 - Jungle Bamboo Laser Shortcut (Door) - 0x3873B 1760 - Jungle Popup Wall (Door) - 0x1475B -1762 - River Monastery Garden Shortcut (Door) - 0x0CF2A +1762 - Jungle Monastery Garden Shortcut (Door) - 0x0CF2A 1765 - Bunker Entry (Door) - 0x0C2A4 1768 - Bunker Tinted Glass Door - 0x17C79 1771 - Bunker UV Room Entry (Door) - 0x0C2A3 diff --git a/worlds/witness/items.py b/worlds/witness/items.py index 15c693b25dd4..ac7fad72a9b7 100644 --- a/worlds/witness/items.py +++ b/worlds/witness/items.py @@ -126,7 +126,7 @@ def __init__(self, world: "WitnessWorld", logic: WitnessPlayerLogic, locat: Witn "Swamp Long Bridge (Panel)"}: # These Bridges/Elevators are not logical access because they may leave you stuck. item_data.classification = ItemClassification.useful - elif item_name in {"River Monastery Garden Shortcut (Door)", + elif item_name in {"Jungle Monastery Garden Shortcut (Door)", "Monastery Laser Shortcut (Door)", "Orchard Second Gate (Door)", "Jungle Bamboo Laser Shortcut (Door)", diff --git a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt index 22f766d0166b..b7e164c6efa7 100644 --- a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt @@ -60,7 +60,7 @@ Theater Exit Left (Door) Theater Exit Right (Door) Jungle Bamboo Laser Shortcut (Door) Jungle Popup Wall (Door) -River Monastery Garden Shortcut (Door) +Jungle Monastery Garden Shortcut (Door) Bunker Entry (Door) Bunker Tinted Glass Door Bunker UV Room Entry (Door) diff --git a/worlds/witness/settings/Exclusions/Vaults.txt b/worlds/witness/settings/Exclusions/Vaults.txt index f23a13183326..d9e5d28cd694 100644 --- a/worlds/witness/settings/Exclusions/Vaults.txt +++ b/worlds/witness/settings/Exclusions/Vaults.txt @@ -8,9 +8,9 @@ Disabled Locations: 0x00AFB (Shipwreck Vault) 0x03535 (Shipwreck Vault Box) 0x17BB4 (Shipwreck Vault Door) -0x15ADD (River Vault) -0x03702 (River Vault Box) -0x15287 (River Vault Door) +0x15ADD (Jungle Vault) +0x03702 (Jungle Vault Box) +0x15287 (Jungle Vault Door) 0x002A6 (Mountainside Vault) 0x03542 (Mountainside Vault Box) 0x00085 (Mountainside Vault Door) From 63e0b347ef1d132e3929785e555b36e821c386af Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:02:29 +0100 Subject: [PATCH 048/110] Some area changes --- worlds/witness/WitnessLogic.txt | 8 +++++--- worlds/witness/WitnessLogicExpert.txt | 8 +++++--- worlds/witness/WitnessLogicVanilla.txt | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 257e74f8ed3e..6047932e9712 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -1,4 +1,4 @@ -==Tutorial== +==Tutorial (Inside)== Menu (Menu) - Entry - True: @@ -25,6 +25,8 @@ Tutorial (Tutorial) - Outside Tutorial - 0x03629: 159513 - 0x33600 (Patio Flowers EP) - 0x0C373 - True 159517 - 0x3352F (Gate EP) - 0x03505 - True +==Tutorial (Outside)== + Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0: 158650 - 0x033D4 (Vault Panel) - True - Dots & Black/White Squares Door - 0x033D0 (Vault Door) - 0x033D4 @@ -390,8 +392,7 @@ Laser - 0x181B3 (Laser) - 0x19650 ==Keep== -Outside Keep (Outside Keep) - Main Island - True: -159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True +Outside Keep (Keep) - Main Island - True: 159430 - 0x03E77 (Red Flowers EP) - True - True 159431 - 0x03E7C (Purple Flowers EP) - True - True @@ -971,6 +972,7 @@ Mountainside Obelisk (Mountainside) - Entry - True: 159739 - 0x00367 (Obelisk) - True - True Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085: +159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True 158612 - 0x17C42 (Discard) - True - Triangles 158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Dots & Black/White Squares & Dots Door - 0x00085 (Vault Door) - 0x002A6 diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 861a05daa1d5..27c759b5596a 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -1,4 +1,4 @@ -==Tutorial== +==Tutorial (Inside)== Menu (Menu) - Entry - True: @@ -25,6 +25,8 @@ Tutorial (Tutorial) - Outside Tutorial - True: 159513 - 0x33600 (Patio Flowers EP) - 0x0C373 - True 159517 - 0x3352F (Gate EP) - 0x03505 - True +==Tutorial (Outside)== + Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0: 158650 - 0x033D4 (Vault Panel) - True - Dots & Full Dots & Squares & Black/White Squares Door - 0x033D0 (Vault Door) - 0x033D4 @@ -390,8 +392,7 @@ Laser - 0x181B3 (Laser) - 0x19650 ==Keep== -Outside Keep (Outside Keep) - Main Island - True: -159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True +Outside Keep (Keep) - Main Island - True: 159430 - 0x03E77 (Red Flowers EP) - True - True 159431 - 0x03E7C (Purple Flowers EP) - True - True @@ -971,6 +972,7 @@ Mountainside Obelisk (Mountainside) - Entry - True: 159739 - 0x00367 (Obelisk) - True - True Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085: +159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True 158612 - 0x17C42 (Discard) - True - Arrows 158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Squares & Triangles & Stars & Stars + Same Colored Symbol Door - 0x00085 (Vault Door) - 0x002A6 diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index a2a908249867..d6239c35dbd1 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -1,4 +1,4 @@ -==Tutorial== +==Tutorial (Inside)== Menu (Menu) - Entry - True: @@ -25,6 +25,8 @@ Tutorial (Tutorial) - Outside Tutorial - 0x03629: 159513 - 0x33600 (Patio Flowers EP) - 0x0C373 - True 159517 - 0x3352F (Gate EP) - 0x03505 - True +==Tutorial (Outside)== + Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0: 158650 - 0x033D4 (Vault Panel) - True - Dots & Black/White Squares Door - 0x033D0 (Vault Door) - 0x033D4 @@ -390,8 +392,7 @@ Laser - 0x181B3 (Laser) - 0x19650 ==Keep== -Outside Keep (Outside Keep) - Main Island - True: -159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True +Outside Keep (Keep) - Main Island - True: 159430 - 0x03E77 (Red Flowers EP) - True - True 159431 - 0x03E7C (Purple Flowers EP) - True - True @@ -971,6 +972,7 @@ Mountainside Obelisk (Mountainside) - Entry - True: 159739 - 0x00367 (Obelisk) - True - True Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085: +159550 - 0x28B91 (Thundercloud EP) - 0x09F98 & 0x012FB - True 158612 - 0x17C42 (Discard) - True - Triangles 158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Dots & Black/White Squares Door - 0x00085 (Vault Door) - 0x002A6 From d238c3421f2adcae4a0c48e08bd45500ec251782 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:04:24 +0100 Subject: [PATCH 049/110] oop --- worlds/witness/locations.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 1e0a6ee41ca4..768a81a3efc6 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -185,7 +185,7 @@ class StaticWitnessLocations: "Outside Tutorial Town Sewer EP", "Outside Tutorial Path EP", "Outside Tutorial Tractor EP", - "Outside Keep Thundercloud EP", + "Mountainside Thundercloud EP", "Glass Factory Vase EP", "Symmetry Island Glass Factory Black Line Reflection EP", "Symmetry Island Glass Factory Black Line EP", @@ -216,8 +216,8 @@ class StaticWitnessLocations: "Treehouse Beach Rock Shadow EP", "Treehouse Beach Sand Shadow EP", "Treehouse Beach Both Orange Bridges EP", - "Outside Keep Red Flowers EP", - "Outside Keep Purple Flowers EP", + "Keep Red Flowers EP", + "Keep Purple Flowers EP", "Shipwreck Circle Near EP", "Shipwreck Circle Left EP", "Shipwreck Circle Far EP", From afeec3f15a755ce323c03aa6883a1a56e38594db Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:06:10 +0100 Subject: [PATCH 050/110] Tutorial First Hallway --- worlds/witness/WitnessLogicVanilla.txt | 4 ++-- worlds/witness/__init__.py | 4 ++-- worlds/witness/locations.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index d6239c35dbd1..0b142e999687 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -4,11 +4,11 @@ Menu (Menu) - Entry - True: Entry (Entry): -First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: +First Hallway (Tutorial First Hallway) - Entry - True - First Hallway Room - 0x00064: 158000 - 0x00064 (Straight) - True - True 159510 - 0x01848 (EP) - 0x00064 - True -First Hallway Room (First Hallway) - Tutorial - 0x00182: +First Hallway Room (Tutorial First Hallway) - Tutorial - 0x00182: 158001 - 0x00182 (Bend) - True - True Tutorial (Tutorial) - Outside Tutorial - 0x03629: diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 04f75408610b..ea745d4018e9 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -176,8 +176,8 @@ def create_regions(self): # Then, add checks in order until the required amount of sphere 1 checks is met. extra_checks = [ - ("First Hallway Room", "First Hallway Bend"), - ("First Hallway", "First Hallway Straight"), + ("Tutorial First Hallway Room", "Tutorial First Hallway Bend"), + ("Tutorial First Hallway", "Tutorial First Hallway Straight"), ("Desert Outside", "Desert Surface 3"), ] diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 768a81a3efc6..2e9ca6d02f70 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -177,7 +177,7 @@ class StaticWitnessLocations: "Mountainside Vault Box", "Mountaintop River Shape", - "First Hallway EP", + "Tutorial First Hallway EP", "Tutorial Cloud EP", "Tutorial Patio Flowers EP", "Tutorial Gate EP", From 27a2b13b5cd2f359630cbc011d6fd186af7c0134 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:06:46 +0100 Subject: [PATCH 051/110] oop --- worlds/witness/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index ea745d4018e9..70efe4315b48 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -176,8 +176,8 @@ def create_regions(self): # Then, add checks in order until the required amount of sphere 1 checks is met. extra_checks = [ - ("Tutorial First Hallway Room", "Tutorial First Hallway Bend"), - ("Tutorial First Hallway", "Tutorial First Hallway Straight"), + ("First Hallway Room", "Tutorial First Hallway Bend"), + ("First Hallway", "Tutorial First Hallway Straight"), ("Desert Outside", "Desert Surface 3"), ] From 9dc75777be0d861a6e14ce347999e1d55e0f78bd Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:09:04 +0100 Subject: [PATCH 052/110] actually don't be dumb --- worlds/witness/WitnessLogic.txt | 4 ++-- worlds/witness/WitnessLogicExpert.txt | 4 ++-- worlds/witness/WitnessLogicVanilla.txt | 4 ++-- worlds/witness/__init__.py | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 6047932e9712..1fe8d5b45f12 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -4,11 +4,11 @@ Menu (Menu) - Entry - True: Entry (Entry): -First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: +Tutorial First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: 158000 - 0x00064 (Straight) - True - True 159510 - 0x01848 (EP) - 0x00064 - True -First Hallway Room (First Hallway) - Tutorial - 0x00182: +Tutorial First Hallway Room (First Hallway) - Tutorial - 0x00182: 158001 - 0x00182 (Bend) - True - True Tutorial (Tutorial) - Outside Tutorial - 0x03629: diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 27c759b5596a..350c3a452f0e 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -4,11 +4,11 @@ Menu (Menu) - Entry - True: Entry (Entry): -First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: +Tutorial First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: 158000 - 0x00064 (Straight) - True - True 159510 - 0x01848 (EP) - 0x00064 - True -First Hallway Room (First Hallway) - Tutorial - 0x00182: +Tutorial First Hallway Room (First Hallway) - Tutorial - 0x00182: 158001 - 0x00182 (Bend) - True - True Tutorial (Tutorial) - Outside Tutorial - True: diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 0b142e999687..77d259b372c9 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -4,11 +4,11 @@ Menu (Menu) - Entry - True: Entry (Entry): -First Hallway (Tutorial First Hallway) - Entry - True - First Hallway Room - 0x00064: +Tutorial First Hallway (Tutorial First Hallway) - Entry - True - First Hallway Room - 0x00064: 158000 - 0x00064 (Straight) - True - True 159510 - 0x01848 (EP) - 0x00064 - True -First Hallway Room (Tutorial First Hallway) - Tutorial - 0x00182: +Tutorial First Hallway Room (Tutorial First Hallway) - Tutorial - 0x00182: 158001 - 0x00182 (Bend) - True - True Tutorial (Tutorial) - Outside Tutorial - 0x03629: diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 70efe4315b48..ea745d4018e9 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -176,8 +176,8 @@ def create_regions(self): # Then, add checks in order until the required amount of sphere 1 checks is met. extra_checks = [ - ("First Hallway Room", "Tutorial First Hallway Bend"), - ("First Hallway", "Tutorial First Hallway Straight"), + ("Tutorial First Hallway Room", "Tutorial First Hallway Bend"), + ("Tutorial First Hallway", "Tutorial First Hallway Straight"), ("Desert Outside", "Desert Surface 3"), ] From 7bb652370d8ad9e8e6753a4d155445824d97e243 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:09:50 +0100 Subject: [PATCH 053/110] dafuq did I do --- worlds/witness/WitnessLogic.txt | 4 ++-- worlds/witness/WitnessLogicExpert.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 1fe8d5b45f12..dd56064cbead 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -4,11 +4,11 @@ Menu (Menu) - Entry - True: Entry (Entry): -Tutorial First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: +Tutorial First Hallway (Tutorial First Hallway) - Entry - True - First Hallway Room - 0x00064: 158000 - 0x00064 (Straight) - True - True 159510 - 0x01848 (EP) - 0x00064 - True -Tutorial First Hallway Room (First Hallway) - Tutorial - 0x00182: +Tutorial First Hallway Room (Tutorial First Hallway) - Tutorial - 0x00182: 158001 - 0x00182 (Bend) - True - True Tutorial (Tutorial) - Outside Tutorial - 0x03629: diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 350c3a452f0e..83dcf0968a3c 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -4,11 +4,11 @@ Menu (Menu) - Entry - True: Entry (Entry): -Tutorial First Hallway (First Hallway) - Entry - True - First Hallway Room - 0x00064: +Tutorial First Hallway (Tutorial First Hallway) - Entry - True - First Hallway Room - 0x00064: 158000 - 0x00064 (Straight) - True - True 159510 - 0x01848 (EP) - 0x00064 - True -Tutorial First Hallway Room (First Hallway) - Tutorial - 0x00182: +Tutorial First Hallway Room (Tutorial First Hallway) - Tutorial - 0x00182: 158001 - 0x00182 (Bend) - True - True Tutorial (Tutorial) - Outside Tutorial - True: From 76bf01cb9f6969443315745dc8b286ebe43eb5c2 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:10:21 +0100 Subject: [PATCH 054/110] bruh --- worlds/witness/WitnessLogic.txt | 2 +- worlds/witness/WitnessLogicExpert.txt | 2 +- worlds/witness/WitnessLogicVanilla.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index dd56064cbead..f0f55e9c190c 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -4,7 +4,7 @@ Menu (Menu) - Entry - True: Entry (Entry): -Tutorial First Hallway (Tutorial First Hallway) - Entry - True - First Hallway Room - 0x00064: +Tutorial First Hallway (Tutorial First Hallway) - Entry - True - Tutorial First Hallway Room - 0x00064: 158000 - 0x00064 (Straight) - True - True 159510 - 0x01848 (EP) - 0x00064 - True diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 83dcf0968a3c..6e72eda3d9c9 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -4,7 +4,7 @@ Menu (Menu) - Entry - True: Entry (Entry): -Tutorial First Hallway (Tutorial First Hallway) - Entry - True - First Hallway Room - 0x00064: +Tutorial First Hallway (Tutorial First Hallway) - Entry - True - Tutorial First Hallway Room - 0x00064: 158000 - 0x00064 (Straight) - True - True 159510 - 0x01848 (EP) - 0x00064 - True diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 77d259b372c9..64076dde871a 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -4,7 +4,7 @@ Menu (Menu) - Entry - True: Entry (Entry): -Tutorial First Hallway (Tutorial First Hallway) - Entry - True - First Hallway Room - 0x00064: +Tutorial First Hallway (Tutorial First Hallway) - Entry - True - Tutorial First Hallway Room - 0x00064: 158000 - 0x00064 (Straight) - True - True 159510 - 0x01848 (EP) - 0x00064 - True From a4f1dc30af788819034e5bc98d075a80afb9c806 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:19:11 +0100 Subject: [PATCH 055/110] Consider Tutorial locations in sphere 1 'hinted' from the start --- worlds/witness/hints.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 08704ee1d1fc..9f00b29d39fd 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,6 +1,6 @@ import logging from typing import Tuple, List, TYPE_CHECKING, Set, Dict, Union, Optional -from BaseClasses import Item, ItemClassification, Location, LocationProgressType +from BaseClasses import Item, ItemClassification, Location, LocationProgressType, CollectionState from . import StaticWitnessLogic from .utils import weighted_sample @@ -407,8 +407,19 @@ def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[st unhinted_locations_per_area = dict() unhinted_location_percentage_per_area = dict() + + state = CollectionState(world.multiworld) + state.sweep_for_events(locations=locations_per_area["Tutorial (Inside)"]) + + early_tutorial = { + loc for loc in world.multiworld.get_reachable_locations(state, world.player) + if loc.address and loc in locations_per_area["Tutorial (Inside)"] + } + + already_hinted_plus_tutorial = already_hinted_locations | early_tutorial + for area_name, locations in locations_per_area.items(): - not_yet_hinted_locations = sum(location not in already_hinted_locations for location in locations) + not_yet_hinted_locations = sum(location not in already_hinted_plus_tutorial for location in locations) unhinted_locations_per_area[area_name] = {loc for loc in locations if loc not in already_hinted_locations} unhinted_location_percentage_per_area[area_name] = not_yet_hinted_locations / len(locations) From 9009c7580f21221577765b4b19a2ed3596248118 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:26:06 +0100 Subject: [PATCH 056/110] This is better --- worlds/witness/__init__.py | 12 ++++++++++-- worlds/witness/hints.py | 23 ++++++----------------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index ea745d4018e9..55e6a4527faa 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -277,12 +277,20 @@ def fill_slot_data(self) -> dict: generated_hints: List[Tuple[str, Optional[Location]]] = [] + state = CollectionState(self.multiworld) + + # Keep track of already hinted locations. Consider early Tutorial as "already hinted" + + already_hinted_locations = { + loc for loc in self.multiworld.get_reachable_locations(state, self.player) + if loc.address and StaticWitnessLogic.ENTITIES_BY_NAME[loc.name]["area"]["name"] == "Tutorial (Inside)" + } + # First, make always and priority hints. always_and_priority, unused_always_hints = make_always_and_priority_hints( - self, location_hints, self.own_itempool + self, location_hints, self.own_itempool, already_hinted_locations ) - already_hinted_locations = {hint[1] for hint in always_and_priority} generated_hints += always_and_priority diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 9f00b29d39fd..50610b8c426a 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -285,8 +285,9 @@ def get_items_and_locations_in_random_order(world: "WitnessWorld", own_itempool: return prog_items_in_this_world, locations_in_this_world -def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, - own_itempool: List[Item]) -> Tuple[List[Tuple[str, Location]], List[Location]]: +def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, own_itempool: List[Item], + already_hinted_locations: Set[Location] + ) -> Tuple[List[Tuple[str, Location]], List[Location]]: hints: List[Tuple[str, Location]] = list() prog_items_in_this_world, loc_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) @@ -328,13 +329,11 @@ def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, priority_hints_set -= always_hints_set # Convert both hint types to list and then shuffle. Also, get rid of None and Tutorial Gate Open. - always_hints: List[Location] = sorted(hint for hint in always_hints_set if hint and hint.address != 158007) - priority_hints: List[Location] = sorted(hint for hint in priority_hints_set if hint and hint.address != 158007) + always_hints = sorted(hint for hint in always_hints_set if hint and hint not in already_hinted_locations) + priority_hints = sorted(hint for hint in priority_hints_set if hint and hint not in already_hinted_locations) world.random.shuffle(always_hints) world.random.shuffle(priority_hints) - already_hinted_locations: Set[Location] = set() - for _ in range(min(max_amount, len(always_hints))): location = always_hints.pop() hints.append(word_direct_hint(world, location, hint_came_from_location[location])) @@ -408,18 +407,8 @@ def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[st unhinted_locations_per_area = dict() unhinted_location_percentage_per_area = dict() - state = CollectionState(world.multiworld) - state.sweep_for_events(locations=locations_per_area["Tutorial (Inside)"]) - - early_tutorial = { - loc for loc in world.multiworld.get_reachable_locations(state, world.player) - if loc.address and loc in locations_per_area["Tutorial (Inside)"] - } - - already_hinted_plus_tutorial = already_hinted_locations | early_tutorial - for area_name, locations in locations_per_area.items(): - not_yet_hinted_locations = sum(location not in already_hinted_plus_tutorial for location in locations) + not_yet_hinted_locations = sum(location not in already_hinted_locations for location in locations) unhinted_locations_per_area[area_name] = {loc for loc in locations if loc not in already_hinted_locations} unhinted_location_percentage_per_area[area_name] = not_yet_hinted_locations / len(locations) From 1ce320afc4e8d74c98c4fbba4c49063f8f4e0892 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:27:23 +0100 Subject: [PATCH 057/110] More consistency --- worlds/witness/WitnessItems.txt | 2 +- worlds/witness/settings/Door_Shuffle/Simple_Panels.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/WitnessItems.txt b/worlds/witness/WitnessItems.txt index fe72bba4be42..5194ee789ac1 100644 --- a/worlds/witness/WitnessItems.txt +++ b/worlds/witness/WitnessItems.txt @@ -241,7 +241,7 @@ Doors: 2035 - Mountain & Caves Control Panels - 0x09ED8,0x09E86,0x09E39,0x09EEB,0x335AB,0x335AC,0x3369D 2100 - Symmetry Island Panels - 0x1C349,0x000B0 -2101 - Tutorial Outpost Panels - 0x0A171,0x04CA4 +2101 - Outside Tutorial Outpost Panels - 0x0A171,0x04CA4 2105 - Desert Panels - 0x09FAA,0x1C2DF,0x1831E,0x1C260,0x1831C,0x1C2F3,0x1831D,0x1C2B1,0x1831B,0x0C339,0x0A249 2110 - Quarry Outside Panels - 0x17C09,0x09E57,0x17CC4 2115 - Quarry Stoneworks Panels - 0x01E5A,0x01E59,0x03678,0x03676,0x03679,0x03675 diff --git a/worlds/witness/settings/Door_Shuffle/Simple_Panels.txt b/worlds/witness/settings/Door_Shuffle/Simple_Panels.txt index 79da154491b7..f69a44894ddc 100644 --- a/worlds/witness/settings/Door_Shuffle/Simple_Panels.txt +++ b/worlds/witness/settings/Door_Shuffle/Simple_Panels.txt @@ -1,6 +1,6 @@ Items: Symmetry Island Panels -Tutorial Outpost Panels +Outside Tutorial Outpost Panels Desert Panels Quarry Outside Panels Quarry Stoneworks Panels From c782c43b75f17aa407ec1a4a99031d3eec3a3b2e Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:31:00 +0100 Subject: [PATCH 058/110] Made patio floor and flowers priority hint locations --- worlds/witness/hints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 50610b8c426a..68a600d3d790 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -209,6 +209,8 @@ def get_priority_hint_items(world: "WitnessWorld"): def get_priority_hint_locations(_: "WitnessWorld"): return { + "Tutorial Patio Floor", + "Tutorial Patio Flowers EP", "Swamp Purple Underwater", "Shipwreck Vault Box", "Town RGB Room Left", From 0bb95371f908e3f92c850ddc58279f9b7a199bbb Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:32:05 +0100 Subject: [PATCH 059/110] More Tutorial renaming --- worlds/witness/WitnessItems.txt | 4 ++-- worlds/witness/settings/Door_Shuffle/Complex_Door_Panels.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/witness/WitnessItems.txt b/worlds/witness/WitnessItems.txt index 5194ee789ac1..178f1d04dd7a 100644 --- a/worlds/witness/WitnessItems.txt +++ b/worlds/witness/WitnessItems.txt @@ -37,8 +37,8 @@ Jokes: Doors: 1100 - Glass Factory Entry (Panel) - 0x01A54 -1101 - Tutorial Outpost Entry (Panel) - 0x0A171 -1102 - Tutorial Outpost Exit (Panel) - 0x04CA4 +1101 - Outside Tutorial Outpost Entry (Panel) - 0x0A171 +1102 - Outside Tutorial Outpost Exit (Panel) - 0x04CA4 1105 - Symmetry Island Lower (Panel) - 0x000B0 1107 - Symmetry Island Upper (Panel) - 0x1C349 1110 - Desert Light Room Entry (Panel) - 0x0C339 diff --git a/worlds/witness/settings/Door_Shuffle/Complex_Door_Panels.txt b/worlds/witness/settings/Door_Shuffle/Complex_Door_Panels.txt index 472403962065..70223bd74924 100644 --- a/worlds/witness/settings/Door_Shuffle/Complex_Door_Panels.txt +++ b/worlds/witness/settings/Door_Shuffle/Complex_Door_Panels.txt @@ -1,7 +1,7 @@ Items: Glass Factory Entry (Panel) -Tutorial Outpost Entry (Panel) -Tutorial Outpost Exit (Panel) +Outside Tutorial Outpost Entry (Panel) +Outside Tutorial Outpost Exit (Panel) Symmetry Island Lower (Panel) Symmetry Island Upper (Panel) Desert Light Room Entry (Panel) From 5be2153f97f60edb78085ad644b03e562b3f62da Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 04:33:53 +0100 Subject: [PATCH 060/110] Jungle Bamboo --- worlds/witness/WitnessItems.txt | 2 +- worlds/witness/items.py | 2 +- worlds/witness/settings/Door_Shuffle/Complex_Doors.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/witness/WitnessItems.txt b/worlds/witness/WitnessItems.txt index 178f1d04dd7a..112cb4a65fa4 100644 --- a/worlds/witness/WitnessItems.txt +++ b/worlds/witness/WitnessItems.txt @@ -162,7 +162,7 @@ Doors: 1750 - Theater Entry (Door) - 0x17F88 1753 - Theater Exit Left (Door) - 0x0A16D 1756 - Theater Exit Right (Door) - 0x3CCDF -1759 - Jungle Bamboo Laser Shortcut (Door) - 0x3873B +1759 - Jungle Laser Shortcut (Door) - 0x3873B 1760 - Jungle Popup Wall (Door) - 0x1475B 1762 - Jungle Monastery Garden Shortcut (Door) - 0x0CF2A 1765 - Bunker Entry (Door) - 0x0C2A4 diff --git a/worlds/witness/items.py b/worlds/witness/items.py index ac7fad72a9b7..af373513d71a 100644 --- a/worlds/witness/items.py +++ b/worlds/witness/items.py @@ -129,7 +129,7 @@ def __init__(self, world: "WitnessWorld", logic: WitnessPlayerLogic, locat: Witn elif item_name in {"Jungle Monastery Garden Shortcut (Door)", "Monastery Laser Shortcut (Door)", "Orchard Second Gate (Door)", - "Jungle Bamboo Laser Shortcut (Door)", + "Jungle Laser Shortcut (Door)", "Keep Pressure Plates 2 Exit (Door)", "Caves Elevator Controls (Panel)"}: # Downgrade doors that don't gate progress. diff --git a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt index b7e164c6efa7..e515304b7d77 100644 --- a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt @@ -58,7 +58,7 @@ Town Tower Third (Door) Theater Entry (Door) Theater Exit Left (Door) Theater Exit Right (Door) -Jungle Bamboo Laser Shortcut (Door) +Jungle Laser Shortcut (Door) Jungle Popup Wall (Door) Jungle Monastery Garden Shortcut (Door) Bunker Entry (Door) From 86f95ea7bb2bf8ff3e64419d0c5524e87204182a Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 30 Nov 2023 17:26:30 +0100 Subject: [PATCH 061/110] Move Windmill EPs to Windmill area --- worlds/witness/WitnessLogic.txt | 6 +++--- worlds/witness/WitnessLogicExpert.txt | 6 +++--- worlds/witness/WitnessLogicVanilla.txt | 6 +++--- worlds/witness/locations.py | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index f0f55e9c190c..f52e996b7c9a 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -546,9 +546,6 @@ Door - 0x28A61 (RGB House Entry) - 0x28998 Door - 0x03BB0 (Church Entry) - 0x28A0D 158228 - 0x28A79 (Maze Panel) - True - True Door - 0x28AA2 (Maze Stairs) - 0x28A79 -159010 - 0x037B6 (Windmill First Blade EP) - 0x17D02 - True -159011 - 0x037B2 (Windmill Second Blade EP) - 0x17D02 - True -159012 - 0x000F7 (Windmill Third Blade EP) - 0x17D02 - True 159540 - 0x03335 (Tower Underside Third EP) - True - True 159541 - 0x03412 (Tower Underside Fourth EP) - True - True 159542 - 0x038A6 (Tower Underside First EP) - True - True @@ -606,6 +603,9 @@ Laser - 0x032F9 (Laser) - 0x032F5 ==Windmill & Theater== Outside Windmill (Windmill) - Windmill Interior - 0x1845B: +159010 - 0x037B6 (First Blade EP) - 0x17D02 - True +159011 - 0x037B2 (Second Blade EP) - 0x17D02 - True +159012 - 0x000F7 (Third Blade EP) - 0x17D02 - True 158241 - 0x17F5F (Entry Panel) - True - Dots Door - 0x1845B (Entry) - 0x17F5F diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 6e72eda3d9c9..a00a9fad7e58 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -546,9 +546,6 @@ Door - 0x28A61 (RGB House Entry) - 0x28A0D Door - 0x03BB0 (Church Entry) - 0x03C08 158228 - 0x28A79 (Maze Panel) - True - True Door - 0x28AA2 (Maze Stairs) - 0x28A79 -159010 - 0x037B6 (Windmill First Blade EP) - 0x17D02 - True -159011 - 0x037B2 (Windmill Second Blade EP) - 0x17D02 - True -159012 - 0x000F7 (Windmill Third Blade EP) - 0x17D02 - True 159540 - 0x03335 (Tower Underside Third EP) - True - True 159541 - 0x03412 (Tower Underside Fourth EP) - True - True 159542 - 0x038A6 (Tower Underside First EP) - True - True @@ -606,6 +603,9 @@ Laser - 0x032F9 (Laser) - 0x032F5 ==Windmill & Theater== Outside Windmill (Windmill) - Windmill Interior - 0x1845B: +159010 - 0x037B6 (First Blade EP) - 0x17D02 - True +159011 - 0x037B2 (Second Blade EP) - 0x17D02 - True +159012 - 0x000F7 (Third Blade EP) - 0x17D02 - True 158241 - 0x17F5F (Entry Panel) - True - Dots Door - 0x1845B (Entry) - 0x17F5F diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 64076dde871a..84ab0dd85f0d 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -546,9 +546,6 @@ Door - 0x28A61 (RGB House Entry) - 0x28998 Door - 0x03BB0 (Church Entry) - 0x28A0D 158228 - 0x28A79 (Maze Panel) - True - True Door - 0x28AA2 (Maze Stairs) - 0x28A79 -159010 - 0x037B6 (Windmill First Blade EP) - 0x17D02 - True -159011 - 0x037B2 (Windmill Second Blade EP) - 0x17D02 - True -159012 - 0x000F7 (Windmill Third Blade EP) - 0x17D02 - True 159540 - 0x03335 (Tower Underside Third EP) - True - True 159541 - 0x03412 (Tower Underside Fourth EP) - True - True 159542 - 0x038A6 (Tower Underside First EP) - True - True @@ -606,6 +603,9 @@ Laser - 0x032F9 (Laser) - 0x032F5 ==Windmill & Theater== Outside Windmill (Windmill) - Windmill Interior - 0x1845B: +159010 - 0x037B6 (First Blade EP) - 0x17D02 - True +159011 - 0x037B2 (Second Blade EP) - 0x17D02 - True +159012 - 0x000F7 (Third Blade EP) - 0x17D02 - True 158241 - 0x17F5F (Entry Panel) - True - Dots Door - 0x1845B (Entry) - 0x17F5F diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 2e9ca6d02f70..daac63fe0cae 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -242,9 +242,9 @@ class StaticWitnessLocations: "Monastery Left Shutter EP", "Monastery Middle Shutter EP", "Monastery Right Shutter EP", - "Town Windmill First Blade EP", - "Town Windmill Second Blade EP", - "Town Windmill Third Blade EP", + "Windmill First Blade EP", + "Windmill Second Blade EP", + "Windmill Third Blade EP", "Town Tower Underside Third EP", "Town Tower Underside Fourth EP", "Town Tower Underside First EP", From d925dc7cb2ea38fa963bcb41f445f27a0b35d6a6 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 31 Dec 2023 04:02:49 +0100 Subject: [PATCH 062/110] oops --- worlds/witness/WitnessLogicVanilla.txt | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 93589dec37bd..e77ae955fce3 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -443,7 +443,7 @@ Door - 0x04F8F (Tower Shortcut) - 0x0361B 158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Rotated Shapers Laser - 0x014BB (Laser) - 0x0360E | 0x03317 159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True -159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True +159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 & 0x01BEA - True 159242 - 0x033DD (Pressure Plates 3 EP) - 0x01CD3 & 0x01CD5 - True 159243 - 0x033E5 (Pressure Plates 4 Left Exit EP) - 0x01D3F - True 159244 - 0x018B6 (Pressure Plates 4 Right Exit EP) - 0x01D3F - True @@ -467,7 +467,6 @@ Door - 0x17BB4 (Vault Door) - 0x00AFB Shipwreck Vault (Shipwreck): 158655 - 0x03535 (Vault Box) - True - True -<<<<<<< HEAD ==Monastery== Monastery Obelisk (Monastery) - Entry - True: @@ -478,21 +477,6 @@ Monastery Obelisk (Monastery) - Entry - True: 159714 - 0xFFE14 (Obelisk Side 5) - 0x03E01 - True 159715 - 0xFFE15 (Obelisk Side 6) - 0x289F4 & 0x289F5 - True 159719 - 0x00263 (Obelisk) - True - True -======= -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 - True -158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Dots & Shapers & Black/White Squares & Rotated Shapers -Laser - 0x014BB (Laser) - 0x0360E | 0x03317 -159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True -159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 & 0x01BEA - True -159242 - 0x033DD (Pressure Plates 3 EP) - 0x01CD3 & 0x01CD5 - True -159243 - 0x033E5 (Pressure Plates 4 Left Exit EP) - 0x01D3F - True -159244 - 0x018B6 (Pressure Plates 4 Right Exit EP) - 0x01D3F - True -159250 - 0x28AE9 (Path EP) - True - True -159251 - 0x3348F (Hedges EP) - True - True ->>>>>>> upstream/main Outside Monastery (Monastery) - Main Island - True - Inside Monastery - 0x0C128 & 0x0C153 - Monastery Garden - 0x03750: 158207 - 0x03713 (Laser Shortcut Panel) - True - True From 7ffbc200af69e298d28fc9280d072f252c10cc0a Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 1 Jan 2024 01:13:33 +0100 Subject: [PATCH 063/110] Wake up honey it's another regional hints revamp --- worlds/witness/__init__.py | 48 ++------- worlds/witness/hints.py | 200 +++++++++++++++++++++++++++---------- 2 files changed, 151 insertions(+), 97 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 55e6a4527faa..5131f37d26d2 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -11,7 +11,7 @@ from .static_logic import StaticWitnessLogic from .hints import get_always_hint_locations, get_always_hint_items, get_priority_hint_locations, \ get_priority_hint_items, make_always_and_priority_hints, generate_joke_hints, make_area_hints, get_hintable_areas, \ - make_random_hints + make_extra_location_hints, create_all_hints from .locations import WitnessPlayerLocations, StaticWitnessLocations from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems, ItemData from .regions import WitnessRegions @@ -273,46 +273,8 @@ def fill_slot_data(self) -> dict: hint_type_amounts = build_weighted_int_list([area_weight / 100, location_weight / 100], hint_amount) area_hints = hint_type_amounts[0] - location_hints = hint_type_amounts[1] - generated_hints: List[Tuple[str, Optional[Location]]] = [] - - state = CollectionState(self.multiworld) - - # Keep track of already hinted locations. Consider early Tutorial as "already hinted" - - already_hinted_locations = { - loc for loc in self.multiworld.get_reachable_locations(state, self.player) - if loc.address and StaticWitnessLogic.ENTITIES_BY_NAME[loc.name]["area"]["name"] == "Tutorial (Inside)" - } - - # First, make always and priority hints. - - always_and_priority, unused_always_hints = make_always_and_priority_hints( - self, location_hints, self.own_itempool, already_hinted_locations - ) - - generated_hints += always_and_priority - - unhinted_locations_per_area: Dict[str, Set[Location]] = dict() - - # Then, make area hints. - if area_hints: - area_hints, unhinted_locations_per_area = make_area_hints(self, area_hints, already_hinted_locations) - generated_hints += area_hints - - # If we don't have enough hints yet, make random location/item hints, or use remaining always hints. - if len(generated_hints) < hint_amount: - generated_hints += make_random_hints( - self, hint_amount - len(generated_hints), self.own_itempool, already_hinted_locations, - unused_always_hints, unhinted_locations_per_area - ) - - # If we still don't have enough for whatever reason, throw a warning, proceed with the lower amount - if len(generated_hints) != hint_amount: - player_name = self.multiworld.get_player_name(self.player) - warning(f"Couldn't generate {hint_amount} hints for player {player_name}. " - f"Generated {len(generated_hints)} instead.") + generated_hints = create_all_hints(self, hint_amount, area_hints) hint_amount = len(generated_hints) @@ -324,10 +286,12 @@ def fill_slot_data(self) -> dict: for _ in range(0, len(generated_hints)): hint = generated_hints.pop(0) + location = hint.location + location_id = location.address if location and location.item.player == self.player else -1 + for _ in range(0, duplicates): audio_log = audio_logs.pop() - location_id = hint[1].address if hint[1] and hint[1].item.player == self.player else -1 - self.log_ids_to_hints[int(audio_log, 16)] = (hint[0], location_id) + self.log_ids_to_hints[int(audio_log, 16)] = (hint.wording, location_id) if audio_logs: audio_log = audio_logs.pop() diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 5f5db91af748..dccae748f3bd 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,4 +1,5 @@ import logging +from dataclasses import dataclass from typing import Tuple, List, TYPE_CHECKING, Set, Dict, Union, Optional from BaseClasses import Item, ItemClassification, Location, LocationProgressType, CollectionState from . import StaticWitnessLogic @@ -163,6 +164,25 @@ ] +@dataclass +class WitnessLocationHint: + location: Location + hint_came_from_location: bool + + # If a hint gets added to a set twice, but once as an item hint and once as a location hint, those are the same + def __hash__(self): + return hash(self.location) + + def __eq__(self, other): + return self.location == other.location + + +@dataclass +class WitnessWordedHint: + wording: str + location: Optional[Location] + + def get_always_hint_items(world: "WitnessWorld") -> List[str]: always = [ "Boat", @@ -271,25 +291,25 @@ def get_priority_hint_locations(_: "WitnessWorld") -> List[str]: ] -def word_direct_hint(world: "WitnessWorld", location: Location, was_location_hint: bool): - location_name = location.name - if location.player != world.player: - location_name += " (" + world.multiworld.get_player_name(location.player) + ")" +def word_direct_hint(world: "WitnessWorld", hint: WitnessLocationHint): + location_name = hint.location.name + if hint.location.player != world.player: + location_name += " (" + world.multiworld.get_player_name(hint.location.player) + ")" - item = location.item + item = hint.location.item item_name = item.name if item.player != world.player: item_name += " (" + world.multiworld.get_player_name(item.player) + ")" - if was_location_hint: + if hint.hint_came_from_location: hint_text = f"{location_name} contains {item_name}." else: hint_text = f"{item_name} can be found at {location_name}." - return hint_text, location + return WitnessWordedHint(hint_text, hint.location) -def hint_from_item(world: "WitnessWorld", item_name: str, own_itempool: List[Item]) -> Optional[Location]: +def hint_from_item(world: "WitnessWorld", item_name: str, own_itempool: List[Item]) -> Optional[WitnessLocationHint]: locations = [item.location for item in own_itempool if item.name == item_name and item.location] @@ -302,17 +322,17 @@ def hint_from_item(world: "WitnessWorld", item_name: str, own_itempool: List[Ite if location_obj.player != world.player: location_name += " (" + world.multiworld.get_player_name(location_obj.player) + ")" - return location_obj + return WitnessLocationHint(location_obj, False) -def hint_from_location(world: "WitnessWorld", location: str) -> Optional[Location]: +def hint_from_location(world: "WitnessWorld", location: str) -> Optional[WitnessLocationHint]: location_obj = world.multiworld.get_location(location, world.player) item_obj = world.multiworld.get_location(location, world.player).item item_name = item_obj.name if item_obj.player != world.player: item_name += " (" + world.multiworld.get_player_name(item_obj.player) + ")" - return location_obj + return WitnessLocationHint(location_obj, True) def get_items_and_locations_in_random_order(world: "WitnessWorld", own_itempool: List[Item]): @@ -331,11 +351,9 @@ def get_items_and_locations_in_random_order(world: "WitnessWorld", own_itempool: return prog_items_in_this_world, locations_in_this_world -def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, own_itempool: List[Item], +def make_always_and_priority_hints(world: "WitnessWorld", own_itempool: List[Item], already_hinted_locations: Set[Location] - ) -> Tuple[List[Tuple[str, Location]], List[Location]]: - hints: List[Tuple[str, Location]] = list() - + ) -> Tuple[List[WitnessLocationHint], List[WitnessLocationHint]]: prog_items_in_this_world, loc_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) always_locations = [ @@ -355,17 +373,11 @@ def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, own_i if item in prog_items_in_this_world ] - hint_came_from_location: Dict[Location, bool] = dict() - # Get always and priority location/item hints - always_item_hints = {hint_from_item(world, item, own_itempool) for item in always_items} always_location_hints = {hint_from_location(world, location) for location in always_locations} - priority_item_hints = {hint_from_item(world, item, own_itempool) for item in priority_items} + always_item_hints = {hint_from_item(world, item, own_itempool) for item in always_items} priority_location_hints = {hint_from_location(world, location) for location in priority_locations} - - # Note whether each hint came from item or location. Location takes precedent - hint_came_from_location.update({location: False for location in always_item_hints | priority_item_hints}) - hint_came_from_location.update({location: True for location in always_location_hints | priority_location_hints}) + priority_item_hints = {hint_from_item(world, item, own_itempool) for item in priority_items} # Combine the sets. This will get rid of duplicates always_hints_set = always_item_hints | always_location_hints @@ -374,31 +386,21 @@ def make_always_and_priority_hints(world: "WitnessWorld", max_amount: int, own_i # Make sure priority hints doesn't contain any hints that are already always hints. priority_hints_set -= always_hints_set + always_generator = [hint for hint in always_hints_set if hint and hint.location not in already_hinted_locations] + priority_generator = [hint for hint in priority_hints_set if hint and hint.location not in already_hinted_locations] + # Convert both hint types to list and then shuffle. Also, get rid of None and Tutorial Gate Open. - always_hints = sorted(hint for hint in always_hints_set if hint and hint not in already_hinted_locations) - priority_hints = sorted(hint for hint in priority_hints_set if hint and hint not in already_hinted_locations) + always_hints = sorted(always_generator, key=lambda h: h.location) + priority_hints = sorted(priority_generator, key=lambda h: h.location) world.random.shuffle(always_hints) world.random.shuffle(priority_hints) - for _ in range(min(max_amount, len(always_hints))): - location = always_hints.pop() - hints.append(word_direct_hint(world, location, hint_came_from_location[location])) - already_hinted_locations.add(location) - - remaining_hints = max_amount - len(hints) - priority_hint_amount = int(max(0.0, min(len(priority_hints) / 2, remaining_hints / 2))) + return always_hints, priority_hints - for _ in range(priority_hint_amount): - location = priority_hints.pop() - hints.append(word_direct_hint(world, location, hint_came_from_location[location])) - already_hinted_locations.add(location) - return hints, always_hints - - -def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item], - already_hinted_locations: Set[Location], hints_to_use_first: List[Location], - unhinted_locations_for_hinted_areas: Dict[str, Set[Location]]) -> List[Tuple[str, Location]]: +def make_extra_location_hints(world: "WitnessWorld", hint_amount: int, own_itempool: List[Item], + already_hinted_locations: Set[Location], hints_to_use_first: List[WitnessLocationHint], + unhinted_locations_for_hinted_areas: Dict[str, Set[Location]]) -> List[WitnessWordedHint]: prog_items_in_this_world, locations_in_this_world = get_items_and_locations_in_random_order(world, own_itempool) next_random_hint_is_location = world.random.randrange(0, 2) @@ -413,25 +415,25 @@ def make_random_hints(world: "WitnessWorld", hint_amount: int, own_itempool: Lis f"Ran out of items/locations to hint for player {player_name}." break if hints_to_use_first: - hint_location = hints_to_use_first.pop() + location_hint = hints_to_use_first.pop() elif next_random_hint_is_location or not prog_items_in_this_world: - hint_location = hint_from_location(world, locations_in_this_world.pop()) + location_hint = hint_from_location(world, locations_in_this_world.pop()) else: - hint_location = hint_from_item(world, prog_items_in_this_world.pop(), own_itempool) + location_hint = hint_from_item(world, prog_items_in_this_world.pop(), own_itempool) - if not hint_location or hint_location in already_hinted_locations: + if not location_hint or location_hint.location in already_hinted_locations: continue # Don't hint locations in areas that are almost fully hinted out already - if hint_location in area_reverse_lookup: - area = area_reverse_lookup[hint_location] + if location_hint.location in area_reverse_lookup: + area = area_reverse_lookup[location_hint.location] if len(unhinted_locations_for_hinted_areas[area]) == 1: continue - del area_reverse_lookup[hint_location] - unhinted_locations_for_hinted_areas[area] -= {hint_location} + del area_reverse_lookup[location_hint.location] + unhinted_locations_for_hinted_areas[area] -= {location_hint.location} - hints.append(word_direct_hint(world, hint_location, next_random_hint_is_location)) - already_hinted_locations.add(hint_location) + hints.append(word_direct_hint(world, location_hint)) + already_hinted_locations.add(location_hint.location) next_random_hint_is_location = not next_random_hint_is_location @@ -580,8 +582,8 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: return hint_string -def make_area_hints(world: "WitnessWorld", amount: int, - already_hinted_locations: Set[Location]) -> Tuple[List[Tuple[str, None]], Dict[str, Set[Location]]]: +def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations: Set[Location] + ) -> Tuple[List[WitnessWordedHint], Dict[str, Set[Location]]]: locs_per_area, items_per_area = get_hintable_areas(world) hinted_areas, unhinted_locations_per_area = choose_areas(world, amount, locs_per_area, already_hinted_locations) @@ -591,7 +593,7 @@ def make_area_hints(world: "WitnessWorld", amount: int, for hinted_area in hinted_areas: hint_string = word_area_hint(world, hinted_area, items_per_area[hinted_area]) - hints.append((hint_string, None)) + hints.append(WitnessWordedHint(hint_string, None)) if len(hinted_areas) < amount: player_name = world.multiworld.get_player_name(world.player) @@ -599,3 +601,91 @@ def make_area_hints(world: "WitnessWorld", amount: int, f"Made {len(hinted_areas)} instead, and filled the rest with random location hints.") return hints, unhinted_locations_per_area + + +def create_all_hints(world: "WitnessWorld", hint_amount: int, area_hints: int) -> List[WitnessWordedHint]: + generated_hints: List[WitnessWordedHint] = [] + + state = CollectionState(world.multiworld) + + # Keep track of already hinted locations. Consider early Tutorial as "already hinted" + + already_hinted_locations = { + loc for loc in world.multiworld.get_reachable_locations(state, world.player) + if loc.address and StaticWitnessLogic.ENTITIES_BY_NAME[loc.name]["area"]["name"] == "Tutorial (Inside)" + } + + intended_location_hints = area_hints - hint_amount + + # First, make always and priority hints. + + always_hints, priority_hints = make_always_and_priority_hints( + world, world.own_itempool, already_hinted_locations + ) + + generated_always_hints = len(always_hints) + possible_priority_hints = len(priority_hints) + + # Make as many always hints as possible + always_hints_to_use = min(intended_location_hints, generated_always_hints) + + # Make up to half of the rest of the location hints priority hints, using up to half of the possibly priority hints + remaining_location_hints = intended_location_hints - always_hints_to_use + priority_hints_to_use = int(max(0.0, min(possible_priority_hints / 2, remaining_location_hints / 2))) + + for _ in range(always_hints_to_use): + location_hint = always_hints.pop() + generated_hints.append(word_direct_hint(world, location_hint)) + already_hinted_locations.add(location_hint.location) + + for _ in range(priority_hints_to_use): + location_hint = priority_hints.pop() + generated_hints.append(word_direct_hint(world, location_hint)) + already_hinted_locations.add(location_hint.location) + + amt_of_used_always_hints = len(always_hints) - always_hints_to_use + amt_of_used_priority_hints = len(priority_hints) - priority_hints_to_use + + location_hints_created_in_round_1 = len(generated_hints) + + unhinted_locations_per_area: Dict[str, Set[Location]] = dict() + + # Then, make area hints. + if area_hints: + generated_area_hints, unhinted_locations_per_area = make_area_hints(world, area_hints, already_hinted_locations) + generated_hints += generated_area_hints + + # If we don't have enough hints yet, recalculate always and priority hints, then fill with random hints + if len(generated_hints) < hint_amount: + remaining_needed_location_hints = hint_amount - len(generated_hints) + + # Recalculate how many always hints and priority hints are supposed to be used + intended_location_hints = remaining_needed_location_hints + location_hints_created_in_round_1 + + always_hints_to_use = min(intended_location_hints, generated_always_hints) + priority_hints_to_use = int(max(0.0, min(possible_priority_hints / 2, remaining_location_hints / 2))) + + # If we now need more always hints and priority hints than we thought previously, make some more. + more_always_hints = always_hints_to_use - amt_of_used_always_hints + more_priority_hints = priority_hints_to_use - amt_of_used_priority_hints + + extra_always_and_priority_hints: List[WitnessLocationHint] = [] + + for _ in range(more_always_hints): + extra_always_and_priority_hints.append(always_hints.pop()) + + for _ in range(more_priority_hints): + extra_always_and_priority_hints.append(priority_hints.pop()) + + generated_hints += make_extra_location_hints( + world, hint_amount - len(generated_hints), world.own_itempool, already_hinted_locations, + extra_always_and_priority_hints, unhinted_locations_per_area + ) + + # If we still don't have enough for whatever reason, throw a warning, proceed with the lower amount + if len(generated_hints) != hint_amount: + player_name = world.multiworld.get_player_name(world.player) + logging.warning(f"Couldn't generate {hint_amount} hints for player {player_name}. " + f"Generated {len(generated_hints)} instead.") + + return generated_hints From 0fd08232f5d69a7ecaf75fb510d99a1c4e22036b Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 1 Jan 2024 01:15:09 +0100 Subject: [PATCH 064/110] don't shadow variable name --- worlds/witness/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 5131f37d26d2..c285440ef3e3 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -276,9 +276,9 @@ def fill_slot_data(self) -> dict: generated_hints = create_all_hints(self, hint_amount, area_hints) - hint_amount = len(generated_hints) + generated_hint_amount = len(generated_hints) - if hint_amount: + if generated_hint_amount: self.random.shuffle(audio_logs) duplicates = min(3, len(audio_logs) // hint_amount) From 36275117d57c044eeb0aefb11f8231d3253579d4 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 5 Jan 2024 12:01:37 +0100 Subject: [PATCH 065/110] Treehouse Laser House Door is not a Laser --- worlds/witness/hints.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index dccae748f3bd..a88004dc56b1 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -513,8 +513,11 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: for item in corresponding_items ) + laser_names = {"Symmetry Laser", "Desert Laser", "Quarry Laser", "Shadows Laser", "Town Laser", "Monastery Laser", + "Jungle Laser", "Bunker Laser", "Swamp Laser", "Treehouse Laser", "Keep Laser"} + local_lasers = sum( - item.player == world.player and "Laser" in item.name + item.player == world.player and item.name in laser_names for item in corresponding_items ) @@ -591,6 +594,7 @@ def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations hints = [] for hinted_area in hinted_areas: + print(items_per_area) hint_string = word_area_hint(world, hinted_area, items_per_area[hinted_area]) hints.append(WitnessWordedHint(hint_string, None)) From a50a6cdd22f38b1c1ebc706220bce6eed7b85768 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 5 Jan 2024 12:02:39 +0100 Subject: [PATCH 066/110] oops --- worlds/witness/hints.py | 1 - 1 file changed, 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index a88004dc56b1..9e1584ce3355 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -594,7 +594,6 @@ def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations hints = [] for hinted_area in hinted_areas: - print(items_per_area) hint_string = word_area_hint(world, hinted_area, items_per_area[hinted_area]) hints.append(WitnessWordedHint(hint_string, None)) From 46f1f6a6409ddc7bda3bce447fb356a34486c0e8 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:09:30 +0100 Subject: [PATCH 067/110] The Dots got lost --- worlds/witness/WitnessLogicVanilla.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index e77ae955fce3..97f3004736f9 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -440,7 +440,7 @@ 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 - True -158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Rotated Shapers +158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Dots & Shapers & Black/White Squares & Rotated Shapers Laser - 0x014BB (Laser) - 0x0360E | 0x03317 159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True 159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 & 0x01BEA - True From 2dc7e7bf8d21eecef700c895179990497625721b Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 6 Jan 2024 01:32:51 +0100 Subject: [PATCH 068/110] I just want the damn green checkmark back :((( --- worlds/witness/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 9e1584ce3355..22a71f477a3e 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -514,7 +514,7 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: ) laser_names = {"Symmetry Laser", "Desert Laser", "Quarry Laser", "Shadows Laser", "Town Laser", "Monastery Laser", - "Jungle Laser", "Bunker Laser", "Swamp Laser", "Treehouse Laser", "Keep Laser"} + "Jungle Laser", "Bunker Laser", "Swamp Laser", "Treehouse Laser", "Keep Laser", } local_lasers = sum( item.player == world.player and item.name in laser_names From fa6468c051a0d79c3cee7219ff3310395bef65f2 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 8 Jan 2024 08:28:08 +0100 Subject: [PATCH 069/110] Change some region names bc why not --- worlds/witness/WitnessLogic.txt | 18 +++++++++--------- worlds/witness/WitnessLogicExpert.txt | 18 +++++++++--------- worlds/witness/WitnessLogicVanilla.txt | 18 +++++++++--------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index f52e996b7c9a..81e841d891a7 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -158,7 +158,7 @@ Desert Obelisk (Desert) - Entry - True: 159704 - 0xFFE04 (Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True 159709 - 0x00359 (Obelisk) - True - True -Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE - Desert Vault - 0x03444: +Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444: 158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots Door - 0x03444 (Vault Door) - 0x0CC7B 158602 - 0x17CE7 (Discard) - True - Triangles @@ -189,14 +189,14 @@ Laser - 0x012FB (Laser) - 0x03608 Desert Vault (Desert): 158653 - 0x0339E (Vault Box) - True - True -Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3: +Desert Light Room (Desert) - Desert Pond Room - 0x0C2C3: 158087 - 0x09FAA (Light Control) - True - True 158088 - 0x00422 (Light Room 1) - 0x09FAA - True 158089 - 0x006E3 (Light Room 2) - 0x09FAA - True 158090 - 0x0A02D (Light Room 3) - 0x09FAA & 0x00422 & 0x006E3 - True Door - 0x0C2C3 (Pond Room Entry) - 0x0A02D -Desert Pond Room (Desert) - Desert Water Levels Room - 0x0A24B: +Desert Pond Room (Desert) - Desert Flood Room - 0x0A24B: 158091 - 0x00C72 (Pond Room 1) - True - True 158092 - 0x0129D (Pond Room 2) - 0x00C72 - True 158093 - 0x008BB (Pond Room 3) - 0x0129D - True @@ -207,7 +207,7 @@ Door - 0x0A24B (Flood Room Entry) - 0x0A249 159043 - 0x0A14C (Pond Room Near Reflection EP) - True - True 159044 - 0x0A14D (Pond Room Far Reflection EP) - True - True -Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316: +Desert Flood 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 @@ -225,7 +225,7 @@ Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316: Door - 0x0C316 (Elevator Room Entry) - 0x18076 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True -Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x01317: +Desert Elevator Room (Desert) - Desert Behind Elevator - 0x01317: 158111 - 0x17C31 (Final Transparent) - True - True 158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - True 158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True @@ -235,7 +235,7 @@ Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x0131 159035 - 0x037BB (Elevator EP) - 0x01317 - True Door - 0x01317 (Elevator) - 0x03608 -Desert Lowest Level Inbetween Shortcuts (Desert): +Desert Behind Elevator (Desert): ==Quarry== @@ -247,7 +247,7 @@ Quarry Obelisk (Quarry) - Entry - True: 159744 - 0xFFE44 (Obelisk Side 5) - 0x03E77 & 0x03E7C - True 159749 - 0x22073 (Obelisk) - True - True -Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: +Outside Quarry (Quarry) - Main Island - True - Quarry Between Entry Doors - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: 158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares 158603 - 0x17CF0 (Discard) - True - Triangles 158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Shapers @@ -263,7 +263,7 @@ Quarry Elevator (Quarry) - Outside Quarry - 0x17CC4 - Quarry - 0x17CC4: 158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser 159403 - 0x17CB9 (Railroad EP) - 0x17CC4 - True -Quarry Between Entrys (Quarry) - Quarry - 0x17C07: +Quarry Between Entry Doors (Quarry) - Quarry - 0x17C07: 158119 - 0x17C09 (Entry 2 Panel) - True - Shapers Door - 0x17C07 (Entry 2) - 0x17C09 @@ -1191,7 +1191,7 @@ Challenge Vault (Challenge): ==Tunnels== -Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87: +Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Behind Elevator - 0x27263 - Town - 0x09E87: 158668 - 0x2FAF6 (Vault Box) - True - True 158519 - 0x27732 (Theater Shortcut Panel) - True - True Door - 0x27739 (Theater Shortcut) - 0x27732 diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index a00a9fad7e58..fb09c5f2b631 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -158,7 +158,7 @@ Desert Obelisk (Desert) - Entry - True: 159704 - 0xFFE04 (Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True 159709 - 0x00359 (Obelisk) - True - True -Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE - Desert Vault - 0x03444: +Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444: 158652 - 0x0CC7B (Vault Panel) - True - Dots & Full Dots & Stars & Stars + Same Colored Symbol & Eraser & Triangles & Shapers & Negative Shapers & Colored Squares Door - 0x03444 (Vault Door) - 0x0CC7B 158602 - 0x17CE7 (Discard) - True - Arrows @@ -189,14 +189,14 @@ Laser - 0x012FB (Laser) - 0x03608 Desert Vault (Desert): 158653 - 0x0339E (Vault Box) - True - True -Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3: +Desert Light Room (Desert) - Desert Pond Room - 0x0C2C3: 158087 - 0x09FAA (Light Control) - True - True 158088 - 0x00422 (Light Room 1) - 0x09FAA - True 158089 - 0x006E3 (Light Room 2) - 0x09FAA - True 158090 - 0x0A02D (Light Room 3) - 0x09FAA & 0x00422 & 0x006E3 - True Door - 0x0C2C3 (Pond Room Entry) - 0x0A02D -Desert Pond Room (Desert) - Desert Water Levels Room - 0x0A24B: +Desert Pond Room (Desert) - Desert Flood Room - 0x0A24B: 158091 - 0x00C72 (Pond Room 1) - True - True 158092 - 0x0129D (Pond Room 2) - 0x00C72 - True 158093 - 0x008BB (Pond Room 3) - 0x0129D - True @@ -207,7 +207,7 @@ Door - 0x0A24B (Flood Room Entry) - 0x0A249 159043 - 0x0A14C (Pond Room Near Reflection EP) - True - True 159044 - 0x0A14D (Pond Room Far Reflection EP) - True - True -Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316: +Desert Flood 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 @@ -225,7 +225,7 @@ Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316: Door - 0x0C316 (Elevator Room Entry) - 0x18076 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True -Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x01317: +Desert Elevator Room (Desert) - Desert Behind Elevator - 0x01317: 158111 - 0x17C31 (Final Transparent) - True - True 158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - True 158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True @@ -235,7 +235,7 @@ Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x0131 159035 - 0x037BB (Elevator EP) - 0x01317 - True Door - 0x01317 (Elevator) - 0x03608 -Desert Lowest Level Inbetween Shortcuts (Desert): +Desert Behind Elevator (Desert): ==Quarry== @@ -247,7 +247,7 @@ Quarry Obelisk (Quarry) - Entry - True: 159744 - 0xFFE44 (Obelisk Side 5) - 0x03E77 & 0x03E7C - True 159749 - 0x22073 (Obelisk) - True - True -Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: +Outside Quarry (Quarry) - Main Island - True - Quarry Between Entry Doors - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: 158118 - 0x09E57 (Entry 1 Panel) - True - Squares & Black/White Squares & Triangles 158603 - 0x17CF0 (Discard) - True - Arrows 158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Triangles & Stars & Stars + Same Colored Symbol @@ -263,7 +263,7 @@ Quarry Elevator (Quarry) - Outside Quarry - 0x17CC4 - Quarry - 0x17CC4: 158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser 159403 - 0x17CB9 (Railroad EP) - 0x17CC4 - True -Quarry Between Entrys (Quarry) - Quarry - 0x17C07: +Quarry Between Entry Doors (Quarry) - Quarry - 0x17C07: 158119 - 0x17C09 (Entry 2 Panel) - True - Shapers & Triangles Door - 0x17C07 (Entry 2) - 0x17C09 @@ -1191,7 +1191,7 @@ Challenge Vault (Challenge): ==Tunnels== -Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87: +Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Behind Elevator - 0x27263 - Town - 0x09E87: 158668 - 0x2FAF6 (Vault Box) - True - True 158519 - 0x27732 (Theater Shortcut Panel) - True - True Door - 0x27739 (Theater Shortcut) - 0x27732 diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 97f3004736f9..3575bb328fa4 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -158,7 +158,7 @@ Desert Obelisk (Desert) - Entry - True: 159704 - 0xFFE04 (Obelisk Side 5) - 0x334B9 & 0x334BC & 0x22106 & 0x0A14C & 0x0A14D - True 159709 - 0x00359 (Obelisk) - True - True -Desert Outside (Desert) - Main Island - True - Desert Floodlight Room - 0x09FEE - Desert Vault - 0x03444: +Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444: 158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots Door - 0x03444 (Vault Door) - 0x0CC7B 158602 - 0x17CE7 (Discard) - True - Triangles @@ -189,14 +189,14 @@ Laser - 0x012FB (Laser) - 0x03608 Desert Vault (Desert): 158653 - 0x0339E (Vault Box) - True - True -Desert Floodlight Room (Desert) - Desert Pond Room - 0x0C2C3: +Desert Light Room (Desert) - Desert Pond Room - 0x0C2C3: 158087 - 0x09FAA (Light Control) - True - True 158088 - 0x00422 (Light Room 1) - 0x09FAA - True 158089 - 0x006E3 (Light Room 2) - 0x09FAA - True 158090 - 0x0A02D (Light Room 3) - 0x09FAA & 0x00422 & 0x006E3 - True Door - 0x0C2C3 (Pond Room Entry) - 0x0A02D -Desert Pond Room (Desert) - Desert Water Levels Room - 0x0A24B: +Desert Pond Room (Desert) - Desert Flood Room - 0x0A24B: 158091 - 0x00C72 (Pond Room 1) - True - True 158092 - 0x0129D (Pond Room 2) - 0x00C72 - True 158093 - 0x008BB (Pond Room 3) - 0x0129D - True @@ -207,7 +207,7 @@ Door - 0x0A24B (Flood Room Entry) - 0x0A249 159043 - 0x0A14C (Pond Room Near Reflection EP) - True - True 159044 - 0x0A14D (Pond Room Far Reflection EP) - True - True -Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316: +Desert Flood 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 @@ -225,7 +225,7 @@ Desert Water Levels Room (Desert) - Desert Elevator Room - 0x0C316: Door - 0x0C316 (Elevator Room Entry) - 0x18076 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True -Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x01317: +Desert Elevator Room (Desert) - Desert Behind Elevator - 0x01317: 158111 - 0x17C31 (Final Transparent) - True - True 158113 - 0x012D7 (Final Hexagonal) - 0x17C31 & 0x0A015 - True 158114 - 0x0A015 (Final Hexagonal Control) - 0x17C31 - True @@ -235,7 +235,7 @@ Desert Elevator Room (Desert) - Desert Lowest Level Inbetween Shortcuts - 0x0131 159035 - 0x037BB (Elevator EP) - 0x01317 - True Door - 0x01317 (Elevator) - 0x03608 -Desert Lowest Level Inbetween Shortcuts (Desert): +Desert Behind Elevator (Desert): ==Quarry== @@ -247,7 +247,7 @@ Quarry Obelisk (Quarry) - Entry - True: 159744 - 0xFFE44 (Obelisk Side 5) - 0x03E77 & 0x03E7C - True 159749 - 0x22073 (Obelisk) - True - True -Outside Quarry (Quarry) - Main Island - True - Quarry Between Entrys - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: +Outside Quarry (Quarry) - Main Island - True - Quarry Between Entry Doors - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01: 158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares 158603 - 0x17CF0 (Discard) - True - Triangles 158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Shapers @@ -263,7 +263,7 @@ Quarry Elevator (Quarry) - Outside Quarry - 0x17CC4 - Quarry - 0x17CC4: 158120 - 0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser 159403 - 0x17CB9 (Railroad EP) - 0x17CC4 - True -Quarry Between Entrys (Quarry) - Quarry - 0x17C07: +Quarry Between Entry Doors (Quarry) - Quarry - 0x17C07: 158119 - 0x17C09 (Entry 2 Panel) - True - Shapers Door - 0x17C07 (Entry 2) - 0x17C09 @@ -1191,7 +1191,7 @@ Challenge Vault (Challenge): ==Tunnels== -Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Lowest Level Inbetween Shortcuts - 0x27263 - Town - 0x09E87: +Tunnels (Tunnels) - Windmill Interior - 0x27739 - Desert Behind Elevator - 0x27263 - Town - 0x09E87: 158668 - 0x2FAF6 (Vault Box) - True - True 158519 - 0x27732 (Theater Shortcut Panel) - True - True Door - 0x27739 (Theater Shortcut) - 0x27732 From 8ea20a3c56279f6bfa61a516966e70f9960f90bd Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 26 Jan 2024 22:15:56 +0100 Subject: [PATCH 070/110] Some region renaming --- worlds/witness/WitnessLogic.txt | 20 ++++++++++---------- worlds/witness/WitnessLogicExpert.txt | 20 ++++++++++---------- worlds/witness/WitnessLogicVanilla.txt | 20 ++++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 3c6256c3e8f9..4508a46313b2 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -983,7 +983,7 @@ Door - 0x00085 (Vault Door) - 0x002A6 Mountainside Vault (Mountainside): 158666 - 0x03542 (Vault Box) - True - True -Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: +Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34: 158405 - 0x0042D (River Shape) - True - True 158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True 158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol @@ -995,10 +995,10 @@ Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: ==Mountain (Inside)== -Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39: +Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Colored Squares & Eraser -Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Top Layer At Door - TrueOneWay: +Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay: 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Dots @@ -1017,7 +1017,7 @@ Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Top Layer At Door - True 158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers 158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shapers -Mountain Top Layer At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: +Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: @@ -1051,10 +1051,10 @@ Mountain Floor 2 Light Bridge Room Far (Mountain Floor 2): Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator - TrueOneWay: 158613 - 0x17F93 (Elevator Discard) - True - Triangles -Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Third Layer - 0x09EEB: +Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Floor 3 - 0x09EEB: 158439 - 0x09EEB (Elevator Control Panel) - True - Dots -Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89 - Mountain Pink Bridge EP - TrueOneWay: +Mountain Floor 3 (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89 - Mountain Pink Bridge EP - TrueOneWay: 158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser 158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Shapers & Eraser 158442 - 0x09F01 (Giant Puzzle Top Right) - True - Rotated Shapers @@ -1064,14 +1064,14 @@ Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueO 159314 - 0x09D5E (Blue Bridge EP) - 0x09E86 & 0x09ED8 - True Door - 0x09F89 (Exit) - 0x09FDA -Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Final Room - 0x0C141: +Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Mountain Bottom Floor Pillars Room - 0x0C141: 158614 - 0x17FA2 (Discard) - 0xFFF00 - Triangles 158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars 158446 - 0x01987 (Final Room Entry Right) - True - Colored Squares & Dots Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 -Final Room (Mountain Final Room) - Elevator - 0x339BB & 0x33961: +Mountain Bottom Floor Pillars 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 & Full Dots @@ -1100,7 +1100,7 @@ Door - 0x2D77D (Caves Entry) - 0x00FF8 ==Caves== -Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Path to Challenge - 0x019A5: +Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves 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 @@ -1155,7 +1155,7 @@ Door - 0x2D73F (Mountain Shortcut Door) - 0x021D7 Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2 159341 - 0x3397C (Skylight EP) - True - True -Path to Challenge (Caves) - Challenge - 0x0A19A: +Caves Path to Challenge (Caves) - Challenge - 0x0A19A: 158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol Door - 0x0A19A (Challenge Entry) - 0x0A16E diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 458550cc5e6f..8aa9e3610dbc 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -983,7 +983,7 @@ Door - 0x00085 (Vault Door) - 0x002A6 Mountainside Vault (Mountainside): 158666 - 0x03542 (Vault Box) - True - True -Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: +Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34: 158405 - 0x0042D (River Shape) - True - True 158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True 158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol & Triangles @@ -995,10 +995,10 @@ Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: ==Mountain (Inside)== -Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39: +Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Eraser & Triangles -Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Top Layer At Door - TrueOneWay: +Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay: 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots & Stars & Stars + Same Colored Symbol 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Triangles 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars & Stars + Same Colored Symbol @@ -1017,7 +1017,7 @@ Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Top Layer At Door - True 158424 - 0x09EAD (Trash Pillar 1) - True - Rotated Shapers & Stars 158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Rotated Shapers & Triangles -Mountain Top Layer At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: +Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: @@ -1051,10 +1051,10 @@ Mountain Floor 2 Light Bridge Room Far (Mountain Floor 2): 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: +Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Floor 3 - 0x09EEB: 158439 - 0x09EEB (Elevator Control Panel) - True - Dots -Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89 - Mountain Pink Bridge EP - TrueOneWay: +Mountain Floor 3 (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89 - Mountain Pink Bridge EP - TrueOneWay: 158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser & Negative Shapers 158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Shapers & Eraser & Negative Shapers 158442 - 0x09F01 (Giant Puzzle Top Right) - True - Shapers & Eraser & Negative Shapers @@ -1064,14 +1064,14 @@ Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueO 159314 - 0x09D5E (Blue Bridge EP) - 0x09E86 & 0x09ED8 - True Door - 0x09F89 (Exit) - 0x09FDA -Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Final Room - 0x0C141: +Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Mountain Bottom Floor Pillars 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 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 -Final Room (Mountain Final Room) - Elevator - 0x339BB & 0x33961: +Mountain Bottom Floor Pillars 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 - Dots & Full Dots & Triangles & Symmetry 158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol & Symmetry @@ -1100,7 +1100,7 @@ Door - 0x2D77D (Caves Entry) - 0x00FF8 ==Caves== -Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Path to Challenge - 0x019A5: +Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves 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 @@ -1155,7 +1155,7 @@ Door - 0x2D73F (Mountain Shortcut Door) - 0x021D7 Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2 159341 - 0x3397C (Skylight EP) - True - True -Path to Challenge (Caves) - Challenge - 0x0A19A: +Caves Path to Challenge (Caves) - Challenge - 0x0A19A: 158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Arrows & Stars + Same Colored Symbol Door - 0x0A19A (Challenge Entry) - 0x0A16E diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index ad691bb9fe6c..224633019c62 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -983,7 +983,7 @@ Door - 0x00085 (Vault Door) - 0x002A6 Mountainside Vault (Mountainside): 158666 - 0x03542 (Vault Box) - True - True -Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: +Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34: 158405 - 0x0042D (River Shape) - True - True 158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True 158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Black/White Squares @@ -995,10 +995,10 @@ Mountaintop (Mountaintop) - Mountain Top Layer - 0x17C34: ==Mountain (Inside)== -Mountain Top Layer (Mountain Floor 1) - Mountain Top Layer Bridge - 0x09E39: +Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Rotated Shapers -Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Top Layer At Door - TrueOneWay: +Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay: 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers @@ -1017,7 +1017,7 @@ Mountain Top Layer Bridge (Mountain Floor 1) - Mountain Top Layer At Door - True 158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers 158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shapers -Mountain Top Layer At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: +Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: @@ -1051,10 +1051,10 @@ Mountain Floor 2 Light Bridge Room Far (Mountain Floor 2): Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator - TrueOneWay: 158613 - 0x17F93 (Elevator Discard) - True - Triangles -Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Third Layer - 0x09EEB: +Mountain Floor 2 Elevator (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EEB - Mountain Floor 3 - 0x09EEB: 158439 - 0x09EEB (Elevator Control Panel) - True - Dots -Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89 - Mountain Pink Bridge EP - TrueOneWay: +Mountain Floor 3 (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueOneWay - Mountain Bottom Floor - 0x09F89 - Mountain Pink Bridge EP - TrueOneWay: 158440 - 0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser 158441 - 0x09F8E (Giant Puzzle Bottom Right) - True - Rotated Shapers & Eraser 158442 - 0x09F01 (Giant Puzzle Top Right) - True - Shapers & Eraser @@ -1064,14 +1064,14 @@ Mountain Third Layer (Mountain Bottom Floor) - Mountain Floor 2 Elevator - TrueO 159314 - 0x09D5E (Blue Bridge EP) - 0x09E86 & 0x09ED8 - True Door - 0x09F89 (Exit) - 0x09FDA -Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Final Room - 0x0C141: +Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Mountain Bottom Floor Pillars Room - 0x0C141: 158614 - 0x17FA2 (Discard) - 0xFFF00 - Triangles 158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars 158446 - 0x01987 (Final Room Entry Right) - True - Colored Squares & Dots Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 -Final Room (Mountain Final Room) - Elevator - 0x339BB & 0x33961: +Mountain Bottom Floor Pillars 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 & Full Dots @@ -1100,7 +1100,7 @@ Door - 0x2D77D (Caves Entry) - 0x00FF8 ==Caves== -Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Path to Challenge - 0x019A5: +Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves 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 @@ -1155,7 +1155,7 @@ Door - 0x2D73F (Mountain Shortcut Door) - 0x021D7 Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2 159341 - 0x3397C (Skylight EP) - True - True -Path to Challenge (Caves) - Challenge - 0x0A19A: +Caves Path to Challenge (Caves) - Challenge - 0x0A19A: 158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol Door - 0x0A19A (Challenge Entry) - 0x0A16E From f512cb5fd4ec55847202a40e7e3c218a6f386e5a Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 26 Jan 2024 23:27:51 +0100 Subject: [PATCH 071/110] That's a great point --- worlds/witness/WitnessLogic.txt | 4 ++-- worlds/witness/WitnessLogicExpert.txt | 4 ++-- worlds/witness/WitnessLogicVanilla.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 4508a46313b2..1b6ac709e32b 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -1071,7 +1071,7 @@ Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 -Mountain Bottom Floor Pillars Room (Mountain Final Room) - Elevator - 0x339BB & 0x33961: +Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - 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 & Full Dots @@ -1081,7 +1081,7 @@ Mountain Bottom Floor Pillars Room (Mountain Final Room) - Elevator - 0x339BB & 158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers 158529 - 0x339BB (Left Pillar 4) - 0x03859 - Black/White Squares & Stars & Symmetry -Elevator (Mountain Final Room): +Elevator (Mountain Bottom Floor): 158530 - 0x3D9A6 (Elevator Door Closer Left) - True - True 158531 - 0x3D9A7 (Elevator Door Close Right) - True - True 158532 - 0x3C113 (Elevator Entry Left) - 0x3D9A6 | 0x3D9A7 - True diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 8aa9e3610dbc..4d8145a39db9 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -1071,7 +1071,7 @@ Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 -Mountain Bottom Floor Pillars Room (Mountain Final Room) - Elevator - 0x339BB & 0x33961: +Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961: 158522 - 0x0383A (Right Pillar 1) - True - Stars & Eraser & Triangles & Stars + Same Colored Symbol 158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Dots & Full Dots & Triangles & Symmetry 158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol & Symmetry @@ -1081,7 +1081,7 @@ Mountain Bottom Floor Pillars Room (Mountain Final Room) - Elevator - 0x339BB & 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 & Colored Dots -Elevator (Mountain Final Room): +Elevator (Mountain Bottom Floor): 158530 - 0x3D9A6 (Elevator Door Closer Left) - True - True 158531 - 0x3D9A7 (Elevator Door Close Right) - True - True 158532 - 0x3C113 (Elevator Entry Left) - 0x3D9A6 | 0x3D9A7 - True diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 224633019c62..5035c4838566 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -1071,7 +1071,7 @@ Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 -Mountain Bottom Floor Pillars Room (Mountain Final Room) - Elevator - 0x339BB & 0x33961: +Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - 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 & Full Dots @@ -1081,7 +1081,7 @@ Mountain Bottom Floor Pillars Room (Mountain Final Room) - Elevator - 0x339BB & 158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers 158529 - 0x339BB (Left Pillar 4) - 0x03859 - Black/White Squares & Stars & Symmetry -Elevator (Mountain Final Room): +Elevator (Mountain Bottom Floor): 158530 - 0x3D9A6 (Elevator Door Closer Left) - True - True 158531 - 0x3D9A7 (Elevator Door Close Right) - True - True 158532 - 0x3C113 (Elevator Entry Left) - 0x3D9A6 | 0x3D9A7 - True From 5fedc913ff8c8b812bcc7a4e5f50205088968679 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 26 Jan 2024 23:28:49 +0100 Subject: [PATCH 072/110] oops --- worlds/witness/locations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index bb3142bb23bd..119101803424 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -412,8 +412,8 @@ class StaticWitnessLocations: "Mountain Bottom Floor Caves Entry Panel", - "Mountain Final Room Left Pillar 4", - "Mountain Final Room Right Pillar 4", + "Mountain Bottom Floor Left Pillar 4", + "Mountain Bottom Floor Right Pillar 4", "Challenge Vault Box", "Theater Challenge Video", From 4aa000e6cd2492c5e8ef53c80cf2cfe7250b64de Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 26 Jan 2024 23:29:34 +0100 Subject: [PATCH 073/110] Find & Replace go brr hopefully that didn't break anything lmfao --- worlds/witness/WitnessItems.txt | 2 +- worlds/witness/WitnessLogic.txt | 6 +++--- worlds/witness/WitnessLogicExpert.txt | 6 +++--- worlds/witness/WitnessLogicVanilla.txt | 6 +++--- worlds/witness/hints.py | 2 +- worlds/witness/locations.py | 4 ++-- worlds/witness/settings/Door_Shuffle/Complex_Doors.txt | 6 +++--- worlds/witness/settings/Door_Shuffle/Simple_Doors.txt | 4 ++-- worlds/witness/settings/Postgame/Mountain_Lower.txt | 6 +++--- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/worlds/witness/WitnessItems.txt b/worlds/witness/WitnessItems.txt index 8895e5cdf862..6f63eccc9521 100644 --- a/worlds/witness/WitnessItems.txt +++ b/worlds/witness/WitnessItems.txt @@ -195,7 +195,7 @@ Doors: 1828 - Mountain Floor 2 Exit (Door) - 0x09EDD 1831 - Mountain Floor 2 Staircase Far (Door) - 0x09E07 1834 - Mountain Bottom Floor Giant Puzzle Exit (Door) - 0x09F89 -1840 - Mountain Bottom Floor Final Room Entry (Door) - 0x0C141 +1840 - Mountain Bottom Floor Pillars Room Entry (Door) - 0x0C141 1843 - Mountain Bottom Floor Rock (Door) - 0x17F33 1846 - Caves Entry (Door) - 0x2D77D 1849 - Caves Pillar Door - 0x019A5 diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 1b6ac709e32b..701563df9dc3 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -1066,9 +1066,9 @@ Door - 0x09F89 (Exit) - 0x09FDA Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Mountain Bottom Floor Pillars Room - 0x0C141: 158614 - 0x17FA2 (Discard) - 0xFFF00 - Triangles -158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars -158446 - 0x01987 (Final Room Entry Right) - True - Colored Squares & Dots -Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 +158445 - 0x01983 (Pillars Room Entry Left) - True - Shapers & Stars +158446 - 0x01987 (Pillars Room Entry Right) - True - Colored Squares & Dots +Door - 0x0C141 (Pillars Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961: diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 4d8145a39db9..eeef2761cf47 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -1066,9 +1066,9 @@ Door - 0x09F89 (Exit) - 0x09FDA Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Mountain Bottom Floor Pillars 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 +158445 - 0x01983 (Pillars Room Entry Left) - True - Shapers & Stars +158446 - 0x01987 (Pillars Room Entry Right) - True - Squares & Colored Squares & Dots +Door - 0x0C141 (Pillars Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961: diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 5035c4838566..ec785c8e5b72 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -1066,9 +1066,9 @@ Door - 0x09F89 (Exit) - 0x09FDA Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Mountain Bottom Floor Pillars Room - 0x0C141: 158614 - 0x17FA2 (Discard) - 0xFFF00 - Triangles -158445 - 0x01983 (Final Room Entry Left) - True - Shapers & Stars -158446 - 0x01987 (Final Room Entry Right) - True - Colored Squares & Dots -Door - 0x0C141 (Final Room Entry) - 0x01983 & 0x01987 +158445 - 0x01983 (Pillars Room Entry Left) - True - Shapers & Stars +158446 - 0x01987 (Pillars Room Entry Right) - True - Colored Squares & Dots +Door - 0x0C141 (Pillars Room Entry) - 0x01983 & 0x01987 Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1 Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961: diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index c4f4ed27f736..22c4ae8b9e51 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -201,7 +201,7 @@ def get_always_hint_items(world: "WitnessWorld") -> List[str]: always.append("Triangles") if wincon == 0: - always += ["Mountain Bottom Floor Final Room Entry (Door)", "Mountain Bottom Floor Doors"] + always += ["Mountain Bottom Floor Pillars Room Entry (Door)", "Mountain Bottom Floor Doors"] if wincon == 1: always += ["Challenge Entry (Panel)", "Caves Panels"] diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 119101803424..569907d4e5a1 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -407,8 +407,8 @@ class StaticWitnessLocations: "Mountain Floor 2 Elevator Discard", "Mountain Bottom Floor Giant Puzzle", - "Mountain Bottom Floor Final Room Entry Left", - "Mountain Bottom Floor Final Room Entry Right", + "Mountain Bottom Floor Pillars Room Entry Left", + "Mountain Bottom Floor Pillars Room Entry Right", "Mountain Bottom Floor Caves Entry Panel", diff --git a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt index e515304b7d77..67534918caf0 100644 --- a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt @@ -85,7 +85,7 @@ Mountain Floor 2 Staircase Near (Door) Mountain Floor 2 Exit (Door) Mountain Floor 2 Staircase Far (Door) Mountain Bottom Floor Giant Puzzle Exit (Door) -Mountain Bottom Floor Final Room Entry (Door) +Mountain Bottom Floor Pillars Room Entry (Door) Mountain Bottom Floor Rock (Door) Caves Entry (Door) Caves Pillar Door @@ -186,8 +186,8 @@ Mountain Floor 2 Light Bridge Controller Near Mountain Floor 2 Light Bridge Controller Far Mountain Floor 2 Far Row 6 Mountain Bottom Floor Giant Puzzle -Mountain Bottom Floor Final Room Entry Left -Mountain Bottom Floor Final Room Entry Right +Mountain Bottom Floor Pillars Room Entry Left +Mountain Bottom Floor Pillars Room Entry Right Mountain Bottom Floor Discard Mountain Bottom Floor Rock Control Mountain Bottom Floor Caves Entry Panel diff --git a/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt b/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt index 7323c14f12fe..b3d2b46531c5 100644 --- a/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt @@ -119,8 +119,8 @@ Mountain Floor 2 Light Bridge Controller Near Mountain Floor 2 Light Bridge Controller Far Mountain Floor 2 Far Row 6 Mountain Bottom Floor Giant Puzzle -Mountain Bottom Floor Final Room Entry Left -Mountain Bottom Floor Final Room Entry Right +Mountain Bottom Floor Pillars Room Entry Left +Mountain Bottom Floor Pillars Room Entry Right Mountain Bottom Floor Discard Mountain Bottom Floor Rock Control Mountain Bottom Floor Caves Entry Panel diff --git a/worlds/witness/settings/Postgame/Mountain_Lower.txt b/worlds/witness/settings/Postgame/Mountain_Lower.txt index 354e3feb82c3..aecddec5adde 100644 --- a/worlds/witness/settings/Postgame/Mountain_Lower.txt +++ b/worlds/witness/settings/Postgame/Mountain_Lower.txt @@ -7,9 +7,9 @@ Disabled Locations: 0x09EFF (Giant Puzzle Top Left) 0x09FDA (Giant Puzzle) 0x09F89 (Exit Door) -0x01983 (Final Room Entry Left) -0x01987 (Final Room Entry Right) -0x0C141 (Final Room Entry Door) +0x01983 (Pillars Room Entry Left) +0x01987 (Pillars Room Entry Right) +0x0C141 (Pillars Room Entry Door) 0x0383A (Right Pillar 1) 0x09E56 (Right Pillar 2) 0x09E5A (Right Pillar 3) From 69c2573c6986f3a771040b337b2d66196214412b Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 27 Jan 2024 00:25:10 +0100 Subject: [PATCH 074/110] Town RGB House renaming --- worlds/witness/WitnessLogic.txt | 12 ++++++------ worlds/witness/WitnessLogicExpert.txt | 12 ++++++------ worlds/witness/WitnessLogicVanilla.txt | 12 ++++++------ worlds/witness/hints.py | 4 ++-- worlds/witness/locations.py | 4 ++-- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 701563df9dc3..db577c0d58e6 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -525,7 +525,7 @@ Town Obelisk (Town) - Entry - True: 159755 - 0xFFE55 (Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True 159759 - 0x0A16C (Obelisk) - True - True -Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: +Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - Town RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 @@ -578,15 +578,15 @@ Town Church (Town): 158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True 159553 - 0x03BD1 (Black Line Church EP) - True - True -RGB House (Town) - RGB Room - 0x2897B: +Town RGB House (Town RGB House) - Town RGB House Upstairs - 0x2897B: 158242 - 0x034E4 (Sound Room Left) - True - True 158243 - 0x034E3 (Sound Room Right) - True - Sound Dots -Door - 0x2897B (RGB House Stairs) - 0x034E4 & 0x034E3 +Door - 0x2897B (Stairs) - 0x034E4 & 0x034E3 -RGB Room (Town): +Town RGB House Upstairs (Town RGB House Upstairs): 158244 - 0x334D8 (RGB Control) - True - Rotated Shapers & Colored Squares -158245 - 0x03C0C (RGB Room Left) - 0x334D8 - Colored Squares & Black/White Squares -158246 - 0x03C08 (RGB Room Right) - 0x334D8 - Stars +158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares +158246 - 0x03C08 (Right) - 0x334D8 - Stars Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27798 & 0x27799 & 0x2779A & 0x2779C: Door - 0x27798 (Second Door) - 0x28ACC diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index eeef2761cf47..8fc8ca4b950d 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -525,7 +525,7 @@ Town Obelisk (Town) - Entry - True: 159755 - 0xFFE55 (Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True 159759 - 0x0A16C (Obelisk) - True - True -Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: +Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - Town RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: 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 @@ -578,15 +578,15 @@ Town Church (Town): 158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True 159553 - 0x03BD1 (Black Line Church EP) - True - True -RGB House (Town) - RGB Room - 0x2897B: +Town RGB House (Town RGB House) - Town RGB House Upstairs - 0x2897B: 158242 - 0x034E4 (Sound Room Left) - True - True 158243 - 0x034E3 (Sound Room Right) - True - Sound Dots -Door - 0x2897B (RGB House Stairs) - 0x034E4 & 0x034E3 +Door - 0x2897B (Stairs) - 0x034E4 & 0x034E3 -RGB Room (Town): +Town RGB House Upstairs (Town RGB House Upstairs): 158244 - 0x334D8 (RGB Control) - True - Rotated Shapers & Squares & Colored Squares & Triangles -158245 - 0x03C0C (RGB Room Left) - 0x334D8 - Squares & Colored Squares & Black/White Squares & Eraser -158246 - 0x03C08 (RGB Room Right) - 0x334D8 & 0x03C0C - Symmetry & Dots & Colored Dots & Triangles +158245 - 0x03C0C (Left) - 0x334D8 - Squares & Colored Squares & Black/White Squares & Eraser +158246 - 0x03C08 (Right) - 0x334D8 & 0x03C0C - Symmetry & Dots & Colored Dots & Triangles Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27798 & 0x27799 & 0x2779A & 0x2779C: Door - 0x27798 (Second Door) - 0x28ACC diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index ec785c8e5b72..d799def7a5de 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -525,7 +525,7 @@ Town Obelisk (Town) - Entry - True: 159755 - 0xFFE55 (Obelisk Side 6) - 0x28B91 & 0x03BCE & 0x03BCF & 0x03BD1 & 0x339B6 & 0x33A20 & 0x33A29 & 0x33A2A & 0x33B06 - True 159759 - 0x0A16C (Obelisk) - True - True -Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: +Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - Town RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True: 158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat 158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8 @@ -578,15 +578,15 @@ Town Church (Town): 158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True 159553 - 0x03BD1 (Black Line Church EP) - True - True -RGB House (Town) - RGB Room - 0x2897B: +Town RGB House (Town RGB House) - Town RGB House Upstairs - 0x2897B: 158242 - 0x034E4 (Sound Room Left) - True - True 158243 - 0x034E3 (Sound Room Right) - True - Sound Dots -Door - 0x2897B (RGB House Stairs) - 0x034E4 & 0x034E3 +Door - 0x2897B (Stairs) - 0x034E4 & 0x034E3 -RGB Room (Town): +Town RGB House Upstairs (Town RGB House Upstairs): 158244 - 0x334D8 (RGB Control) - True - Rotated Shapers & Colored Squares -158245 - 0x03C0C (RGB Room Left) - 0x334D8 - Colored Squares & Black/White Squares -158246 - 0x03C08 (RGB Room Right) - 0x334D8 - Stars +158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares +158246 - 0x03C08 (Right) - 0x334D8 - Stars Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27798 & 0x27799 & 0x2779A & 0x2779C: Door - 0x27798 (Second Door) - 0x28ACC diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 22c4ae8b9e51..7a766a243e69 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -286,8 +286,8 @@ def get_priority_hint_locations(world: "WitnessWorld") -> List[str]: "Tutorial Patio Flowers EP", "Swamp Purple Underwater", "Shipwreck Vault Box", - "Town RGB Room Left", - "Town RGB Room Right", + "Town RGB House Upstairs Left", + "Town RGB House Upstairs Right", "Treehouse Green Bridge 7", "Treehouse Green Bridge Discard", "Shipwreck Discard", diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 569907d4e5a1..dc8b8b96bc26 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -114,8 +114,8 @@ class StaticWitnessLocations: "Town RGB House Entry Panel", "Town Laser Panel", - "Town RGB Room Left", - "Town RGB Room Right", + "Town RGB House Upstairs Left", + "Town RGB House Upstairs Right", "Town Sound Room Right", "Windmill Theater Entry Panel", From 5418bd076ce5edc21151beab6cd5b5a232962c17 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 27 Jan 2024 00:42:21 +0100 Subject: [PATCH 075/110] Oops Sound Room --- worlds/witness/WitnessLogic.txt | 10 ++++++++-- worlds/witness/WitnessLogicExpert.txt | 10 ++++++++-- worlds/witness/WitnessLogicVanilla.txt | 10 ++++++++-- worlds/witness/locations.py | 2 +- worlds/witness/settings/Door_Shuffle/Complex_Doors.txt | 2 +- worlds/witness/settings/Door_Shuffle/Simple_Doors.txt | 2 +- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index db577c0d58e6..696aa4f0ee05 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -588,10 +588,16 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares 158246 - 0x03C08 (Right) - 0x334D8 - Stars -Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27798 & 0x27799 & 0x2779A & 0x2779C: +Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27799C: +Door - 0x27799 (First Door) - 0x28A69 + +Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: Door - 0x27798 (Second Door) - 0x28ACC + +Town Tower After Second Door (Town Tower) - Town Tower After Third Door - 0x2779C: Door - 0x2779C (Third Door) - 0x28AD9 -Door - 0x27799 (First Door) - 0x28A69 + +Town Tower After Third Door (Town Tower) - Town Tower Top - 0x2779A: Door - 0x2779A (Fourth Door) - 0x28B39 Town Tower Top (Town): diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 8fc8ca4b950d..28e036672ab7 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -588,10 +588,16 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Squares & Colored Squares & Black/White Squares & Eraser 158246 - 0x03C08 (Right) - 0x334D8 & 0x03C0C - Symmetry & Dots & Colored Dots & Triangles -Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27798 & 0x27799 & 0x2779A & 0x2779C: +Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27799C: +Door - 0x27799 (First Door) - 0x28A69 + +Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: Door - 0x27798 (Second Door) - 0x28ACC + +Town Tower After Second Door (Town Tower) - Town Tower After Third Door - 0x2779C: Door - 0x2779C (Third Door) - 0x28AD9 -Door - 0x27799 (First Door) - 0x28A69 + +Town Tower After Third Door (Town Tower) - Town Tower Top - 0x2779A: Door - 0x2779A (Fourth Door) - 0x28B39 Town Tower Top (Town): diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index d799def7a5de..54251786a046 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -588,10 +588,16 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares 158246 - 0x03C08 (Right) - 0x334D8 - Stars -Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27798 & 0x27799 & 0x2779A & 0x2779C: +Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27799C: +Door - 0x27799 (First Door) - 0x28A69 + +Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: Door - 0x27798 (Second Door) - 0x28ACC + +Town Tower After Second Door (Town Tower) - Town Tower After Third Door - 0x2779C: Door - 0x2779C (Third Door) - 0x28AD9 -Door - 0x27799 (First Door) - 0x28A69 + +Town Tower After Third Door (Town Tower) - Town Tower Top - 0x2779A: Door - 0x2779A (Fourth Door) - 0x28B39 Town Tower Top (Town): diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index dc8b8b96bc26..cf653aa68eea 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -116,7 +116,7 @@ class StaticWitnessLocations: "Town RGB House Upstairs Left", "Town RGB House Upstairs Right", - "Town Sound Room Right", + "Town RGB House Sound Room Right", "Windmill Theater Entry Panel", "Theater Exit Left Panel", diff --git a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt index 67534918caf0..87ec69f59c81 100644 --- a/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Complex_Doors.txt @@ -144,7 +144,7 @@ Town RGB House Entry Panel Town Church Entry Panel Town Maze Panel Windmill Entry Panel -Town Sound Room Right +Town RGB House Sound Room Right Town Red Rooftop 5 Town Church Lattice Town Tall Hexagonal diff --git a/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt b/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt index b3d2b46531c5..2059f43af62c 100644 --- a/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt +++ b/worlds/witness/settings/Door_Shuffle/Simple_Doors.txt @@ -77,7 +77,7 @@ Town RGB House Entry Panel Town Church Entry Panel Town Maze Panel Windmill Entry Panel -Town Sound Room Right +Town RGB House Sound Room Right Town Red Rooftop 5 Town Church Lattice Town Tall Hexagonal From 6f30c1fe5283e86eef9c6993e1f9b4aa4892cb25 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 27 Jan 2024 00:47:55 +0100 Subject: [PATCH 076/110] Lol --- worlds/witness/WitnessLogic.txt | 2 +- worlds/witness/WitnessLogicExpert.txt | 2 +- worlds/witness/WitnessLogicVanilla.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 696aa4f0ee05..3f50bfc2da82 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -588,7 +588,7 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares 158246 - 0x03C08 (Right) - 0x334D8 - Stars -Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27799C: +Town Tower (Town Tower) - Town - True - Town Tower Top - 0x2779C: Door - 0x27799 (First Door) - 0x28A69 Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 28e036672ab7..027df874e0e1 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -588,7 +588,7 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Squares & Colored Squares & Black/White Squares & Eraser 158246 - 0x03C08 (Right) - 0x334D8 & 0x03C0C - Symmetry & Dots & Colored Dots & Triangles -Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27799C: +Town Tower (Town Tower) - Town - True - Town Tower Top - 0x2779C: Door - 0x27799 (First Door) - 0x28A69 Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 54251786a046..5205aee9cae7 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -588,7 +588,7 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares 158246 - 0x03C08 (Right) - 0x334D8 - Stars -Town Tower (Town Tower) - Town - True - Town Tower Top - 0x27799C: +Town Tower (Town Tower) - Town - True - Town Tower Top - 0x2779C: Door - 0x27799 (First Door) - 0x28A69 Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: From eb661e13141b8d18795b212156a6c04f8972667f Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 27 Jan 2024 00:49:43 +0100 Subject: [PATCH 077/110] Is that... right... now??? --- worlds/witness/WitnessLogic.txt | 2 +- worlds/witness/WitnessLogicExpert.txt | 2 +- worlds/witness/WitnessLogicVanilla.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 3f50bfc2da82..7d4f1084bd70 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -588,7 +588,7 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares 158246 - 0x03C08 (Right) - 0x334D8 - Stars -Town Tower (Town Tower) - Town - True - Town Tower Top - 0x2779C: +Town Tower (Town Tower) - Town - True - Town Tower After First Door - 0x27799: Door - 0x27799 (First Door) - 0x28A69 Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 027df874e0e1..ea0068ddfbbb 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -588,7 +588,7 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Squares & Colored Squares & Black/White Squares & Eraser 158246 - 0x03C08 (Right) - 0x334D8 & 0x03C0C - Symmetry & Dots & Colored Dots & Triangles -Town Tower (Town Tower) - Town - True - Town Tower Top - 0x2779C: +Town Tower (Town Tower) - Town - True - Town Tower After First Door - 0x27799: Door - 0x27799 (First Door) - 0x28A69 Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 5205aee9cae7..61b7457cf674 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -588,7 +588,7 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares 158246 - 0x03C08 (Right) - 0x334D8 - Stars -Town Tower (Town Tower) - Town - True - Town Tower Top - 0x2779C: +Town Tower (Town Tower) - Town - True - Town Tower After First Door - 0x27799: Door - 0x27799 (First Door) - 0x28A69 Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: From 5f948b448d48dadc5690b59d2e607e8fe7f1bd30 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 27 Jan 2024 00:50:30 +0100 Subject: [PATCH 078/110] This is probably a bit more clear --- worlds/witness/WitnessLogic.txt | 2 +- worlds/witness/WitnessLogicExpert.txt | 2 +- worlds/witness/WitnessLogicVanilla.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 7d4f1084bd70..ed475933246b 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -588,7 +588,7 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares 158246 - 0x03C08 (Right) - 0x334D8 - Stars -Town Tower (Town Tower) - Town - True - Town Tower After First Door - 0x27799: +Town Tower Bottom (Town Tower) - Town - True - Town Tower After First Door - 0x27799: Door - 0x27799 (First Door) - 0x28A69 Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index ea0068ddfbbb..f3235e605ea4 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -588,7 +588,7 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Squares & Colored Squares & Black/White Squares & Eraser 158246 - 0x03C08 (Right) - 0x334D8 & 0x03C0C - Symmetry & Dots & Colored Dots & Triangles -Town Tower (Town Tower) - Town - True - Town Tower After First Door - 0x27799: +Town Tower Bottom (Town Tower) - Town - True - Town Tower After First Door - 0x27799: Door - 0x27799 (First Door) - 0x28A69 Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 61b7457cf674..930f65f0ece5 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -588,7 +588,7 @@ Town RGB House Upstairs (Town RGB House Upstairs): 158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares 158246 - 0x03C08 (Right) - 0x334D8 - Stars -Town Tower (Town Tower) - Town - True - Town Tower After First Door - 0x27799: +Town Tower Bottom (Town Tower) - Town - True - Town Tower After First Door - 0x27799: Door - 0x27799 (First Door) - 0x28A69 Town Tower After First Door (Town Tower) - Town Tower After Second Door - 0x27798: From 59450f38f4c35eb334b618d694d825573a23029e Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 27 Jan 2024 18:24:17 +0100 Subject: [PATCH 079/110] This code was so broken wtf --- worlds/witness/hints.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 7a766a243e69..b0172351c005 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -634,7 +634,7 @@ def create_all_hints(world: "WitnessWorld", hint_amount: int, area_hints: int) - if loc.address and StaticWitnessLogic.ENTITIES_BY_NAME[loc.name]["area"]["name"] == "Tutorial (Inside)" } - intended_location_hints = area_hints - hint_amount + intended_location_hints = hint_amount - area_hints # First, make always and priority hints. @@ -652,19 +652,21 @@ def create_all_hints(world: "WitnessWorld", hint_amount: int, area_hints: int) - remaining_location_hints = intended_location_hints - always_hints_to_use priority_hints_to_use = int(max(0.0, min(possible_priority_hints / 2, remaining_location_hints / 2))) + amt_of_used_always_hints = 0 + amt_of_used_priority_hints = 0 + for _ in range(always_hints_to_use): + amt_of_used_always_hints += 1 location_hint = always_hints.pop() generated_hints.append(word_direct_hint(world, location_hint)) already_hinted_locations.add(location_hint.location) for _ in range(priority_hints_to_use): + amt_of_used_priority_hints += 1 location_hint = priority_hints.pop() generated_hints.append(word_direct_hint(world, location_hint)) already_hinted_locations.add(location_hint.location) - amt_of_used_always_hints = len(always_hints) - always_hints_to_use - amt_of_used_priority_hints = len(priority_hints) - priority_hints_to_use - location_hints_created_in_round_1 = len(generated_hints) unhinted_locations_per_area: Dict[str, Set[Location]] = dict() From 26bab7767e661a4f51a362daf09228cd90bb7af0 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 27 Jan 2024 18:26:22 +0100 Subject: [PATCH 080/110] This is better I think --- worlds/witness/hints.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index b0172351c005..66075f260cc1 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -652,17 +652,12 @@ def create_all_hints(world: "WitnessWorld", hint_amount: int, area_hints: int) - remaining_location_hints = intended_location_hints - always_hints_to_use priority_hints_to_use = int(max(0.0, min(possible_priority_hints / 2, remaining_location_hints / 2))) - amt_of_used_always_hints = 0 - amt_of_used_priority_hints = 0 - for _ in range(always_hints_to_use): - amt_of_used_always_hints += 1 location_hint = always_hints.pop() generated_hints.append(word_direct_hint(world, location_hint)) already_hinted_locations.add(location_hint.location) for _ in range(priority_hints_to_use): - amt_of_used_priority_hints += 1 location_hint = priority_hints.pop() generated_hints.append(word_direct_hint(world, location_hint)) already_hinted_locations.add(location_hint.location) @@ -680,6 +675,10 @@ def create_all_hints(world: "WitnessWorld", hint_amount: int, area_hints: int) - if len(generated_hints) < hint_amount: remaining_needed_location_hints = hint_amount - len(generated_hints) + # Save old values for used always and priority hints for later calculations + amt_of_used_always_hints = always_hints_to_use + amt_of_used_priority_hints = priority_hints_to_use + # Recalculate how many always hints and priority hints are supposed to be used intended_location_hints = remaining_needed_location_hints + location_hints_created_in_round_1 From 824891d00c3822253ce6562d475cb625b2fbbdbc Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 27 Jan 2024 22:43:37 +0100 Subject: [PATCH 081/110] Bring Jungle Vault region name in line with location name change --- worlds/witness/WitnessLogic.txt | 4 ++-- worlds/witness/WitnessLogicExpert.txt | 4 ++-- worlds/witness/WitnessLogicVanilla.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index ed475933246b..b57f402d2b6d 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -671,14 +671,14 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True -Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287: +Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - Jungle Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots Door - 0x15287 (Vault Door) - 0x15ADD 159110 - 0x03AC5 (Green Leaf Moss EP) - True - True -River Vault (Jungle): +Jungle Vault (Jungle): 158664 - 0x03702 (Vault Box) - True - True ==Bunker== diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index f3235e605ea4..b508a20d8566 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -671,14 +671,14 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True -Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287: +Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - Jungle Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots Door - 0x15287 (Vault Door) - 0x15ADD 159110 - 0x03AC5 (Green Leaf Moss EP) - True - True -River Vault (Jungle): +Jungle Vault (Jungle): 158664 - 0x03702 (Vault Box) - True - True ==Bunker== diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 930f65f0ece5..155eb247a017 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -671,14 +671,14 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True -Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - River Vault - 0x15287: +Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - Jungle Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA 158663 - 0x15ADD (Vault Panel) - True - Black/White Squares & Dots Door - 0x15287 (Vault Door) - 0x15ADD 159110 - 0x03AC5 (Green Leaf Moss EP) - True - True -River Vault (Jungle): +Jungle Vault (Jungle): 158664 - 0x03702 (Vault Box) - True - True ==Bunker== From f61e2da5ae74c503f4b006e3b1fc28f81e500928 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 27 Jan 2024 22:56:00 +0100 Subject: [PATCH 082/110] Add Bunker Cyan Room --- worlds/witness/WitnessLogic.txt | 4 +++- worlds/witness/WitnessLogicExpert.txt | 4 +++- worlds/witness/WitnessLogicVanilla.txt | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index b57f402d2b6d..8fc4aa060186 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -716,9 +716,11 @@ Door - 0x0A08D (Elevator Room Entry) - 0x17E67 Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True -Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: +Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Cyan Room - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares +Bunker Cyan Room (Bunker) - Bunker Elevator - TrueOneWay: + Bunker Green Room (Bunker) - Bunker Elevator - TrueOneWay: 159310 - 0x000D3 (Green Room Flowers EP) - True - True diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index b508a20d8566..363aa68940ce 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -716,9 +716,11 @@ Door - 0x0A08D (Elevator Room Entry) - 0x17E67 Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True -Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: +Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Cyan Room - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares +Bunker Cyan Room (Bunker) - Bunker Elevator - TrueOneWay: + Bunker Green Room (Bunker) - Bunker Elevator - TrueOneWay: 159310 - 0x000D3 (Green Room Flowers EP) - True - True diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 155eb247a017..cb1cf546c336 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -716,9 +716,11 @@ Door - 0x0A08D (Elevator Room Entry) - 0x17E67 Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True -Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: +Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Cyan Room - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares +Bunker Cyan Room (Bunker) - Bunker Elevator - TrueOneWay: + Bunker Green Room (Bunker) - Bunker Elevator - TrueOneWay: 159310 - 0x000D3 (Green Room Flowers EP) - True - True From 9540158fec1e99e87f5e2112aebb2c81c46df665 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 4 Feb 2024 06:26:50 +0100 Subject: [PATCH 083/110] region rename --- worlds/witness/WitnessLogic.txt | 4 ++-- worlds/witness/WitnessLogicExpert.txt | 4 ++-- worlds/witness/WitnessLogicVanilla.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 8fc4aa060186..303048bb8295 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -860,13 +860,13 @@ Treehouse Beach (Treehouse Beach) - Main Island - True: 159201 - 0x0053E (Sand Shadow EP) - True - True 159212 - 0x220BD (Both Orange Bridges EP) - 0x17DA2 & 0x17DDB - True -Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309 - The Ocean - 0x17C95: +Treehouse Entry Area (Treehouse) - Treehouse Between Entry Doors - 0x0C309 - The Ocean - 0x17C95: 158343 - 0x17C95 (Boat Spawn) - True - Boat 158344 - 0x0288C (First Door Panel) - True - Stars Door - 0x0C309 (First Door) - 0x0288C 159210 - 0x33721 (Buoy EP) - 0x17C95 - True -Treehouse Between Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310: +Treehouse Between Entry Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310: 158345 - 0x02886 (Second Door Panel) - True - Stars Door - 0x0C310 (Second Door) - 0x02886 diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index 363aa68940ce..e228296272b2 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -860,13 +860,13 @@ Treehouse Beach (Treehouse Beach) - Main Island - True: 159201 - 0x0053E (Sand Shadow EP) - True - True 159212 - 0x220BD (Both Orange Bridges EP) - 0x17DA2 & 0x17DDB - True -Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309 - The Ocean - 0x17C95: +Treehouse Entry Area (Treehouse) - Treehouse Between Entry Doors - 0x0C309 - The Ocean - 0x17C95: 158343 - 0x17C95 (Boat Spawn) - True - Boat 158344 - 0x0288C (First Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles Door - 0x0C309 (First Door) - 0x0288C 159210 - 0x33721 (Buoy EP) - 0x17C95 - True -Treehouse Between Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310: +Treehouse Between Entry Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310: 158345 - 0x02886 (Second Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles Door - 0x0C310 (Second Door) - 0x02886 diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index cb1cf546c336..fc3bb5545d6f 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -860,13 +860,13 @@ Treehouse Beach (Treehouse Beach) - Main Island - True: 159201 - 0x0053E (Sand Shadow EP) - True - True 159212 - 0x220BD (Both Orange Bridges EP) - 0x17DA2 & 0x17DDB - True -Treehouse Entry Area (Treehouse) - Treehouse Between Doors - 0x0C309 - The Ocean - 0x17C95: +Treehouse Entry Area (Treehouse) - Treehouse Between Entry Doors - 0x0C309 - The Ocean - 0x17C95: 158343 - 0x17C95 (Boat Spawn) - True - Boat 158344 - 0x0288C (First Door Panel) - True - Stars Door - 0x0C309 (First Door) - 0x0288C 159210 - 0x33721 (Buoy EP) - 0x17C95 - True -Treehouse Between Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310: +Treehouse Between Entry Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310: 158345 - 0x02886 (Second Door Panel) - True - Stars Door - 0x0C310 (Second Door) - 0x02886 From a280f29a4e7cf0b99383c932df3128de8454af5f Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 4 Feb 2024 06:30:57 +0100 Subject: [PATCH 084/110] What if we ****** on the Treehouse Drawbridge Platform jk unless --- worlds/witness/WitnessLogic.txt | 4 ++-- worlds/witness/WitnessLogicExpert.txt | 4 ++-- worlds/witness/WitnessLogicVanilla.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 303048bb8295..8d593cac8fa0 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -895,7 +895,7 @@ Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x1 158360 - 0x17D2D (First Purple Bridge 4) - 0x17CE4 - Stars & Dots 158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Dots -Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2: +Treehouse Right Orange Bridge (Treehouse) - Treehouse Drawbridge Platform - 0x17DA2: 158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars 158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars 158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars @@ -909,7 +909,7 @@ Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2: 158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars 158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars -Treehouse Bridge Platform (Treehouse) - Main Island - 0x0C32D: +Treehouse Drawbridge Platform (Treehouse) - Main Island - 0x0C32D: 158404 - 0x037FF (Drawbridge Panel) - True - Stars Door - 0x0C32D (Drawbridge) - 0x037FF diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index e228296272b2..f0703fa40fd5 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -895,7 +895,7 @@ Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x1 158360 - 0x17D2D (First Purple Bridge 4) - 0x17CE4 - Stars & Dots & Full Dots 158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Dots & Full Dots -Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2: +Treehouse Right Orange Bridge (Treehouse) - Treehouse Drawbridge 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 @@ -909,7 +909,7 @@ Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2: 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: +Treehouse Drawbridge Platform (Treehouse) - Main Island - 0x0C32D: 158404 - 0x037FF (Drawbridge Panel) - True - Stars Door - 0x0C32D (Drawbridge) - 0x037FF diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index fc3bb5545d6f..72596363c070 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -895,7 +895,7 @@ Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x1 158360 - 0x17D2D (First Purple Bridge 4) - 0x17CE4 - Stars & Dots 158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Dots -Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2: +Treehouse Right Orange Bridge (Treehouse) - Treehouse Drawbridge Platform - 0x17DA2: 158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars 158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars 158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars @@ -909,7 +909,7 @@ Treehouse Right Orange Bridge (Treehouse) - Treehouse Bridge Platform - 0x17DA2: 158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars 158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars -Treehouse Bridge Platform (Treehouse) - Main Island - 0x0C32D: +Treehouse Drawbridge Platform (Treehouse) - Main Island - 0x0C32D: 158404 - 0x037FF (Drawbridge Panel) - True - Stars Door - 0x0C32D (Drawbridge) - 0x037FF From 02af9389c901215e62e40d0e2b2dbd42d3754a87 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 5 Feb 2024 05:23:39 +0100 Subject: [PATCH 085/110] I think this is fine??? --- worlds/witness/WitnessLogic.txt | 4 +--- worlds/witness/WitnessLogicExpert.txt | 4 +--- worlds/witness/WitnessLogicVanilla.txt | 4 +--- worlds/witness/regions.py | 2 ++ 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt index 8d593cac8fa0..e3bacfb4b0e4 100644 --- a/worlds/witness/WitnessLogic.txt +++ b/worlds/witness/WitnessLogic.txt @@ -1028,7 +1028,7 @@ Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneW Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B -Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: +Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 At Door - 0x09ED8 & 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: 158426 - 0x09FD3 (Near Row 1) - True - Stars & Colored Squares & Stars + Same Colored Symbol 158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars & Colored Squares & Stars + Same Colored Symbol 158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Colored Squares & Stars + Same Colored Symbol @@ -1036,8 +1036,6 @@ Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Colored Squares & Symmetry & Colored Dots Door - 0x09FFB (Staircase Near) - 0x09FD8 -Mountain Floor 2 Blue Bridge (Mountain Floor 2) - Mountain Floor 2 Beyond Bridge - TrueOneWay - Mountain Floor 2 At Door - 0x09ED8: - Mountain Floor 2 At Door (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EDD: Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86 diff --git a/worlds/witness/WitnessLogicExpert.txt b/worlds/witness/WitnessLogicExpert.txt index f0703fa40fd5..b01d5551ec55 100644 --- a/worlds/witness/WitnessLogicExpert.txt +++ b/worlds/witness/WitnessLogicExpert.txt @@ -1028,7 +1028,7 @@ Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneW Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B -Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: +Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 At Door - 0x09ED8 & 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: 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 @@ -1036,8 +1036,6 @@ Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 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 - 0x09ED8: - Mountain Floor 2 At Door (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EDD: Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86 diff --git a/worlds/witness/WitnessLogicVanilla.txt b/worlds/witness/WitnessLogicVanilla.txt index 72596363c070..62c38d412427 100644 --- a/worlds/witness/WitnessLogicVanilla.txt +++ b/worlds/witness/WitnessLogicVanilla.txt @@ -1028,7 +1028,7 @@ Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneW Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B -Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Blue Bridge - 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: +Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 At Door - 0x09ED8 & 0x09E86 - Mountain Pink Bridge EP - TrueOneWay: 158426 - 0x09FD3 (Near Row 1) - True - Colored Squares 158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Colored Squares & Dots 158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Colored Squares & Stars + Same Colored Symbol @@ -1036,8 +1036,6 @@ Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Colored Squares Door - 0x09FFB (Staircase Near) - 0x09FD8 -Mountain Floor 2 Blue Bridge (Mountain Floor 2) - Mountain Floor 2 Beyond Bridge - TrueOneWay - Mountain Floor 2 At Door - 0x09ED8: - Mountain Floor 2 At Door (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EDD: Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86 diff --git a/worlds/witness/regions.py b/worlds/witness/regions.py index 54246652ea5d..7d2e104d3618 100644 --- a/worlds/witness/regions.py +++ b/worlds/witness/regions.py @@ -68,6 +68,8 @@ def connect_if_possible(self, world: "WitnessWorld", source: str, target: str, r connection.access_rule = self.make_lambda(final_requirement, world) + source_region.connect() + source_region.exits.append(connection) connection.connect(target_region) From e53d30b141a813e34a7a82b8f55a9224132a76ca Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 5 Feb 2024 05:24:39 +0100 Subject: [PATCH 086/110] I deleted that what the heck --- worlds/witness/regions.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/worlds/witness/regions.py b/worlds/witness/regions.py index 7d2e104d3618..54246652ea5d 100644 --- a/worlds/witness/regions.py +++ b/worlds/witness/regions.py @@ -68,8 +68,6 @@ def connect_if_possible(self, world: "WitnessWorld", source: str, target: str, r connection.access_rule = self.make_lambda(final_requirement, world) - source_region.connect() - source_region.exits.append(connection) connection.connect(target_region) From 77c716bf56c73260e294be190d8c36678eb9efb1 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 11 Feb 2024 18:01:07 +0100 Subject: [PATCH 087/110] Send more information about hinted locations to client --- worlds/witness/__init__.py | 11 ++++++----- worlds/witness/hints.py | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 75dc113f719e..651cfbcc95b7 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -279,9 +279,9 @@ def fill_slot_data(self) -> dict: hint_amount = self.options.hint_amount.value credits_hint = ( - "This Randomizer is brought to you by", - "NewSoupVi, Jarno, blastron,", - "jbzdarkid, sigma144, IHNN, oddGarrett, Exempt-Medic.", -1 + "This Randomizer is brought to you by\n" + "NewSoupVi, Jarno, blastron,\n", + "jbzdarkid, sigma144, IHNN, oddGarrett, Exempt-Medic.", -1, -1 ) audio_logs = get_audio_logs().copy() @@ -305,11 +305,12 @@ def fill_slot_data(self) -> dict: hint = generated_hints.pop(0) location = hint.location - location_id = location.address if location and location.item.player == self.player else -1 + location_id = location.address if location else -1 + player = location.player if location else self.player for _ in range(0, duplicates): audio_log = audio_logs.pop() - self.log_ids_to_hints[int(audio_log, 16)] = (hint.wording, location_id) + self.log_ids_to_hints[int(audio_log, 16)] = (hint.wording, location_id, player) if audio_logs: audio_log = audio_logs.pop() diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 6de0e080b379..c068660bd714 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -459,8 +459,8 @@ def make_extra_location_hints(world: "WitnessWorld", hint_amount: int, own_itemp return hints -def generate_joke_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int]]: - return [(x, -1) for x in world.random.sample(joke_hints, amount)] +def generate_joke_hints(world: "WitnessWorld", amount: int) -> List[Tuple[str, int, int]]: + return [(x, -1, -1) for x in world.random.sample(joke_hints, amount)] def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[str, List[Location]], From 6cab4af48d9f9a206a09524445ccb07866eeb830 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 11 Feb 2024 18:11:22 +0100 Subject: [PATCH 088/110] Give me my checkmark back --- worlds/witness/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 651cfbcc95b7..b759bba0bc2f 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -305,12 +305,12 @@ def fill_slot_data(self) -> dict: hint = generated_hints.pop(0) location = hint.location - location_id = location.address if location else -1 + location_address = location.address if location else -1 player = location.player if location else self.player for _ in range(0, duplicates): audio_log = audio_logs.pop() - self.log_ids_to_hints[int(audio_log, 16)] = (hint.wording, location_id, player) + self.log_ids_to_hints[int(audio_log, 16)] = (hint.wording, location_address, player) if audio_logs: audio_log = audio_logs.pop() From 48edd234bc0a0b77e0494195d91ef9562fcd8d0d Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 11 Feb 2024 18:17:42 +0100 Subject: [PATCH 089/110] Remove some unused imports --- worlds/witness/__init__.py | 2 +- worlds/witness/hints.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index b759bba0bc2f..c69a98b5b950 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -3,7 +3,7 @@ """ import dataclasses -from typing import Dict, Optional, List, Tuple, Set +from typing import Dict, Optional from BaseClasses import Region, Location, MultiWorld, Item, Entrance, Tutorial, CollectionState from Options import PerGameCommonOptions, Toggle from .presets import witness_option_presets diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index c068660bd714..cd45833a9e8d 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -1,6 +1,6 @@ import logging from dataclasses import dataclass -from typing import Tuple, List, TYPE_CHECKING, Set, Dict, Union, Optional +from typing import Tuple, List, TYPE_CHECKING, Set, Dict, Optional from BaseClasses import Item, ItemClassification, Location, LocationProgressType, CollectionState from . import StaticWitnessLogic from .utils import weighted_sample From a518065cb3605cffb6bf11591187ebb6eb0eb1bc Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 11 Feb 2024 18:18:33 +0100 Subject: [PATCH 090/110] Fix a renaming conflict --- worlds/witness/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index cd45833a9e8d..2a7dda06f5e3 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -227,7 +227,7 @@ def get_always_hint_locations(world: "WitnessWorld") -> List[str]: if world.options.EP_difficulty != "normal": always.append("Treehouse Obelisk Side 4") # Couch EP - always.append("River Obelisk Side 1") # Cloud Cycle EP. Needs to be changed to "Mountainside Obelisk" soon + always.append("Mountainside Obelisk Side 1") # Cloud Cycle EP. return always From f5cca7fceb4828161b8a5d9082864ec2770e2eca Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 13 Feb 2024 18:48:46 +0100 Subject: [PATCH 091/110] What was I cooking lmfao --- worlds/witness/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 2a7dda06f5e3..ae18dccdd17a 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -431,7 +431,7 @@ def make_extra_location_hints(world: "WitnessWorld", hint_amount: int, own_itemp while len(hints) < hint_amount: if not prog_items_in_this_world and not locations_in_this_world and not hints_to_use_first: player_name = world.multiworld.get_player_name(world.player) - f"Ran out of items/locations to hint for player {player_name}." + logging.warning(f"Ran out of items/locations to hint for player {player_name}.") break if hints_to_use_first: location_hint = hints_to_use_first.pop() From 1a713e8241da5224fc119e6d2d2d98200ab7bfd1 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:34:20 +0100 Subject: [PATCH 092/110] Update worlds/witness/hints.py Co-authored-by: Scipio Wright --- worlds/witness/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index ae18dccdd17a..f73317c17a4b 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -542,7 +542,7 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: total_progression = non_local_progression + local_progression - player_count = len(world.multiworld.player_ids) + player_count = world.multiworld.players area_progression_word = "Both" if total_progression == 2 else "All" From 95ff4e8e6537d4ec69650b4640ba39e994dda1a1 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 14 Feb 2024 09:01:58 +0100 Subject: [PATCH 093/110] item.advancement --- worlds/witness/hints.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index f73317c17a4b..2099d4253a70 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -520,17 +520,8 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: any local lasers to be found in this area. """ - local_progression = sum( - item.player == world.player - and item.classification in {ItemClassification.progression, ItemClassification.progression_skip_balancing} - for item in corresponding_items - ) - - non_local_progression = sum( - item.player != world.player - and item.classification in {ItemClassification.progression, ItemClassification.progression_skip_balancing} - for item in corresponding_items - ) + local_progression = sum(item.player == world.player and item.advancement for item in corresponding_items) + non_local_progression = sum(item.player != world.player and item.advancement for item in corresponding_items) laser_names = {"Symmetry Laser", "Desert Laser", "Quarry Laser", "Shadows Laser", "Town Laser", "Monastery Laser", "Jungle Laser", "Bunker Laser", "Swamp Laser", "Treehouse Laser", "Keep Laser", } From 6020853c076d499206aa72cc76e3d8f88e843221 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 14 Feb 2024 09:03:32 +0100 Subject: [PATCH 094/110] comment --- worlds/witness/hints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 2099d4253a70..659a46fe3708 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -426,6 +426,7 @@ def make_extra_location_hints(world: "WitnessWorld", hint_amount: int, own_itemp hints = [] + # This is a way to reverse a Dict[a,List[b]] to a Dict[b,a] area_reverse_lookup = {v: k for k, l in unhinted_locations_for_hinted_areas.items() for v in l} while len(hints) < hint_amount: From 3ed517bf7d87275d7d21caaf5ee3fd1ceae62219 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 14 Feb 2024 09:06:41 +0100 Subject: [PATCH 095/110] Update worlds/witness/hints.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/witness/hints.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 659a46fe3708..fd53592399d0 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -569,7 +569,8 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: other_player_str = "the other player" if player_count == 2 else "another player" hint_string += f"\nOne of them is for {other_player_str}." else: - hint_string += f"\n{non_local_progression} of them are for other players." + other_player_str = "the other player" if player_count == 2 else "other players" + hint_string += f"\n{non_local_progression} of them are for {other_player_str}." elif non_local_progression: other_players_str = "the other player" if player_count == 2 else "other players" hint_string += f"\n{area_progression_word} of them are for {other_players_str}." From 12fb5ee2e48cac675e7391f736145b2f39d46800 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 14 Feb 2024 21:11:59 +0100 Subject: [PATCH 096/110] =?UTF-8?q?=E1=83=9A(=E0=B2=A0=5F=E0=B2=A0?= =?UTF-8?q?=E1=83=9A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- worlds/witness/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index c69a98b5b950..2636f3e44a3b 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -287,10 +287,7 @@ def fill_slot_data(self) -> dict: audio_logs = get_audio_logs().copy() if hint_amount: - area_weight, location_weight = self.options.area_hint_percentage, 100 - self.options.area_hint_percentage - - hint_type_amounts = build_weighted_int_list([area_weight / 100, location_weight / 100], hint_amount) - area_hints = hint_type_amounts[0] + area_hints = round(self.options.area_hint_percentage / 100 * hint_amount) generated_hints = create_all_hints(self, hint_amount, area_hints) From c089b8bbcf46e271c376de2d575347ffedc0b478 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 14 Feb 2024 21:19:24 +0100 Subject: [PATCH 097/110] remove unused import --- worlds/witness/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 2636f3e44a3b..c58f32f4e26c 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -18,7 +18,7 @@ from .regions import WitnessRegions from .rules import set_rules from .options import TheWitnessOptions -from .utils import get_audio_logs, build_weighted_int_list +from .utils import get_audio_logs from logging import warning, error From 886924c24f4a3c9a12bcbee17b1330a4312e6d29 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 21 Feb 2024 21:43:17 +0100 Subject: [PATCH 098/110] Add area info to hints --- worlds/witness/__init__.py | 2 +- worlds/witness/hints.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index c58f32f4e26c..fce196c184bc 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -302,7 +302,7 @@ def fill_slot_data(self) -> dict: hint = generated_hints.pop(0) location = hint.location - location_address = location.address if location else -1 + location_address = location.address if location else (hint.area if hint.area else None) player = location.player if location else self.player for _ in range(0, duplicates): diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index fd53592399d0..a602e175ca13 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -183,7 +183,8 @@ def __eq__(self, other): @dataclass class WitnessWordedHint: wording: str - location: Optional[Location] + location: Optional[Location] = None + area: Optional[str] = None def get_always_hint_items(world: "WitnessWorld") -> List[str]: @@ -608,7 +609,7 @@ def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations for hinted_area in hinted_areas: hint_string = word_area_hint(world, hinted_area, items_per_area[hinted_area]) - hints.append(WitnessWordedHint(hint_string, None)) + hints.append(WitnessWordedHint(hint_string, None, hinted_area)) if len(hinted_areas) < amount: player_name = world.multiworld.get_player_name(world.player) From f45a59a0b3163dfa45f6008d54051f49de34d4f2 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 21 Feb 2024 21:49:26 +0100 Subject: [PATCH 099/110] Disambiguate between message line and area hint --- worlds/witness/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index a602e175ca13..29effcf0876f 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -609,7 +609,7 @@ def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations for hinted_area in hinted_areas: hint_string = word_area_hint(world, hinted_area, items_per_area[hinted_area]) - hints.append(WitnessWordedHint(hint_string, None, hinted_area)) + hints.append(WitnessWordedHint(hint_string, None, f"hinted_area:{hinted_area}")) if len(hinted_areas) < amount: player_name = world.multiworld.get_player_name(world.player) From 3bac9146941b116418a2fea8c0620c7aa6b42e6c Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 22 Feb 2024 23:46:32 +0100 Subject: [PATCH 100/110] Add area progression amount info as well --- worlds/witness/__init__.py | 26 ++++++++++++++------------ worlds/witness/hints.py | 9 +++++---- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index fce196c184bc..618314ec8200 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -291,23 +291,25 @@ def fill_slot_data(self) -> dict: generated_hints = create_all_hints(self, hint_amount, area_hints) - generated_hint_amount = len(generated_hints) + self.random.shuffle(audio_logs) - if generated_hint_amount: - self.random.shuffle(audio_logs) + duplicates = min(3, len(audio_logs) // hint_amount) - duplicates = min(3, len(audio_logs) // hint_amount) + for _ in range(0, len(generated_hints)): + hint = generated_hints.pop(0) - for _ in range(0, len(generated_hints)): - hint = generated_hints.pop(0) + location = hint.location + area_amount = hint.area_amount - location = hint.location - location_address = location.address if location else (hint.area if hint.area else None) - player = location.player if location else self.player + # None if junk hint, address if location hint, area string if area hint + arg_1 = location.address if location else (hint.area if hint.area else None) - for _ in range(0, duplicates): - audio_log = audio_logs.pop() - self.log_ids_to_hints[int(audio_log, 16)] = (hint.wording, location_address, player) + # self.player if junk hint, player if location hint, progression amount if area hint + arg_2 = area_amount if area_amount is not None else (location.player if location else self.player) + + for _ in range(0, duplicates): + audio_log = audio_logs.pop() + self.log_ids_to_hints[int(audio_log, 16)] = (hint.wording, arg_1, arg_2) if audio_logs: audio_log = audio_logs.pop() diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 29effcf0876f..a75ad619ab80 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -185,6 +185,7 @@ class WitnessWordedHint: wording: str location: Optional[Location] = None area: Optional[str] = None + area_amount: Optional[int] = None def get_always_hint_items(world: "WitnessWorld") -> List[str]: @@ -515,7 +516,7 @@ def get_hintable_areas(world: "WitnessWorld") -> Tuple[Dict[str, List[Location]] return locations_per_area, items_per_area -def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: List[Item]) -> str: +def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: List[Item]) -> Tuple[str, int]: """ Word the hint for an area using natural sounding language. This takes into account how much progression there is, how much of it is local/non-local, and whether there are @@ -595,7 +596,7 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, corresponding_items: elif local_lasers: hint_string += f"\n{local_lasers} of them are lasers." - return hint_string + return hint_string, total_progression def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations: Set[Location] @@ -607,9 +608,9 @@ def make_area_hints(world: "WitnessWorld", amount: int, already_hinted_locations hints = [] for hinted_area in hinted_areas: - hint_string = word_area_hint(world, hinted_area, items_per_area[hinted_area]) + hint_string, prog_amount = word_area_hint(world, hinted_area, items_per_area[hinted_area]) - hints.append(WitnessWordedHint(hint_string, None, f"hinted_area:{hinted_area}")) + hints.append(WitnessWordedHint(hint_string, None, f"hinted_area:{hinted_area}", prog_amount)) if len(hinted_areas) < amount: player_name = world.multiworld.get_player_name(world.player) From 8c1ec83f6550ba9a2d90ae35820a335fb4bc851c Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 24 Feb 2024 15:27:03 +0100 Subject: [PATCH 101/110] Add area hint percentage to presets --- worlds/witness/presets.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/worlds/witness/presets.py b/worlds/witness/presets.py index 1fee1a7968b2..3f02de550b15 100644 --- a/worlds/witness/presets.py +++ b/worlds/witness/presets.py @@ -32,6 +32,7 @@ "trap_percentage": TrapPercentage.default, "puzzle_skip_amount": PuzzleSkipAmount.default, "hint_amount": HintAmount.default, + "area_hint_percentage": AreaHintPercentage.default, "death_link": DeathLink.default, }, @@ -64,6 +65,7 @@ "trap_percentage": TrapPercentage.default, "puzzle_skip_amount": 15, "hint_amount": HintAmount.default, + "area_hint_percentage": AreaHintPercentage.default, "death_link": DeathLink.default, }, @@ -96,6 +98,7 @@ "trap_percentage": TrapPercentage.default, "puzzle_skip_amount": 15, "hint_amount": HintAmount.default, + "area_hint_percentage": AreaHintPercentage.default, "death_link": DeathLink.default, }, } From 8a4e78c1a1c0a8aff1fcc152659752502d02de7f Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 24 Feb 2024 15:31:18 +0100 Subject: [PATCH 102/110] Make default hints 8 location hints and 4 area hints --- worlds/witness/options.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/options.py b/worlds/witness/options.py index f898d5a8e919..68a4ac7fc231 100644 --- a/worlds/witness/options.py +++ b/worlds/witness/options.py @@ -187,7 +187,7 @@ class HintAmount(Range): display_name = "Hints on Audio Logs" range_start = 0 range_end = 49 - default = 10 + default = 12 class AreaHintPercentage(Range): @@ -199,7 +199,7 @@ class AreaHintPercentage(Range): display_name = "Area Hint Percentage" range_start = 0 range_end = 100 - default = 50 + default = 33 class DeathLink(Toggle): From 354dbaeb896b4cc308cd2bf3d60b61e0a9b2fe60 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 26 Feb 2024 23:20:28 +0100 Subject: [PATCH 103/110] Prevent crash in a game with few locations --- worlds/witness/hints.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index a75ad619ab80..2b123b1ef13b 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -436,12 +436,18 @@ def make_extra_location_hints(world: "WitnessWorld", hint_amount: int, own_itemp player_name = world.multiworld.get_player_name(world.player) logging.warning(f"Ran out of items/locations to hint for player {player_name}.") break + if hints_to_use_first: location_hint = hints_to_use_first.pop() - elif next_random_hint_is_location or not prog_items_in_this_world: + elif next_random_hint_is_location and locations_in_this_world: location_hint = hint_from_location(world, locations_in_this_world.pop()) - else: + elif not next_random_hint_is_location and prog_items_in_this_world: location_hint = hint_from_item(world, prog_items_in_this_world.pop(), own_itempool) + # The list that the hint was supposed to be taken from was empty. + # Try the other list, which by definition has to still have something. + else: + next_random_hint_is_location = not next_random_hint_is_location + continue if not location_hint or location_hint.location in already_hinted_locations: continue From 1f4e581119733861b18b847f5ad8baf2051b93b5 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 26 Feb 2024 23:21:13 +0100 Subject: [PATCH 104/110] change comment slightly --- worlds/witness/hints.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 2b123b1ef13b..971856fb6928 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -444,7 +444,8 @@ def make_extra_location_hints(world: "WitnessWorld", hint_amount: int, own_itemp elif not next_random_hint_is_location and prog_items_in_this_world: location_hint = hint_from_item(world, prog_items_in_this_world.pop(), own_itempool) # The list that the hint was supposed to be taken from was empty. - # Try the other list, which by definition has to still have something. + # Try the other list, which has to still have something, as otherwise, all lists would be empty, which triggers + # the guard condition above. else: next_random_hint_is_location = not next_random_hint_is_location continue From 7c1f47f5651c75f6c16fb189dc9f159d073629b5 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 26 Feb 2024 23:21:32 +0100 Subject: [PATCH 105/110] formatting again --- worlds/witness/hints.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 971856fb6928..f428adeebd93 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -444,8 +444,8 @@ def make_extra_location_hints(world: "WitnessWorld", hint_amount: int, own_itemp elif not next_random_hint_is_location and prog_items_in_this_world: location_hint = hint_from_item(world, prog_items_in_this_world.pop(), own_itempool) # The list that the hint was supposed to be taken from was empty. - # Try the other list, which has to still have something, as otherwise, all lists would be empty, which triggers - # the guard condition above. + # Try the other list, which has to still have something, as otherwise, all lists would be empty, + # which would have triggered the guard condition above. else: next_random_hint_is_location = not next_random_hint_is_location continue From 2721fbfe21b46be85261a2440f3b136d8c798b54 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 26 Feb 2024 23:28:15 +0100 Subject: [PATCH 106/110] this is no longer necessary --- worlds/witness/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 618314ec8200..c38898b33d4e 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -295,9 +295,7 @@ def fill_slot_data(self) -> dict: duplicates = min(3, len(audio_logs) // hint_amount) - for _ in range(0, len(generated_hints)): - hint = generated_hints.pop(0) - + for hint in generated_hints: location = hint.location area_amount = hint.area_amount From ca9c69853d4366df4c306d61c54e57c6e3448924 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 26 Feb 2024 23:29:55 +0100 Subject: [PATCH 107/110] Update worlds/witness/hints.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/witness/hints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index f428adeebd93..6394c85a2a1a 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -230,6 +230,7 @@ def get_always_hint_locations(world: "WitnessWorld") -> List[str]: if world.options.EP_difficulty != "normal": always.append("Treehouse Obelisk Side 4") # Couch EP always.append("Mountainside Obelisk Side 1") # Cloud Cycle EP. + always.append("Town Obelisk Side 2") # Tutorial Patio Flowers EP. return always From 7fd5cbbb4c83bc4cd2303c144a0fd9253502b187 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 26 Feb 2024 23:31:00 +0100 Subject: [PATCH 108/110] That EP only exists if disable non randomized is off --- worlds/witness/hints.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 6394c85a2a1a..e8c7a146366f 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -230,7 +230,9 @@ def get_always_hint_locations(world: "WitnessWorld") -> List[str]: if world.options.EP_difficulty != "normal": always.append("Treehouse Obelisk Side 4") # Couch EP always.append("Mountainside Obelisk Side 1") # Cloud Cycle EP. - always.append("Town Obelisk Side 2") # Tutorial Patio Flowers EP. + + if not world.options.disable_non_randomized_puzzles: + always.append("Town Obelisk Side 2") # Tutorial Patio Flowers EP. return always From 3923fd9434d924e2514e69664868cbf3bf0ffb2f Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 26 Feb 2024 23:32:14 +0100 Subject: [PATCH 109/110] That's also not where that's supposed to be lol --- worlds/witness/hints.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index e8c7a146366f..bafaf280e148 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -231,9 +231,6 @@ def get_always_hint_locations(world: "WitnessWorld") -> List[str]: always.append("Treehouse Obelisk Side 4") # Couch EP always.append("Mountainside Obelisk Side 1") # Cloud Cycle EP. - if not world.options.disable_non_randomized_puzzles: - always.append("Town Obelisk Side 2") # Tutorial Patio Flowers EP. - return always @@ -312,6 +309,9 @@ def get_priority_hint_locations(world: "WitnessWorld") -> List[str]: priority.append("Town Obelisk Side 6") # Theater Flowers EP priority.append("Treehouse Obelisk Side 4") # Shipwreck Green EP + if not world.options.disable_non_randomized_puzzles: + priority.append("Town Obelisk Side 2") # Tutorial Patio Flowers EP. + return priority From b4f6cc03887409571cd9b64fc60729eeb8a1fd74 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 27 Feb 2024 00:00:19 +0100 Subject: [PATCH 110/110] Change Obelisk hint conditions to just directly check for the EP --- worlds/witness/hints.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index bafaf280e148..545aef221677 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -224,11 +224,13 @@ def get_always_hint_locations(world: "WitnessWorld") -> List[str]: ] # Add Obelisk Sides that contain EPs that are meant to be hinted, if they are necessary to complete the Obelisk Side - if world.options.EP_difficulty == "eclipse": + if "0x339B6" not in world.player_logic.COMPLETELY_DISABLED_ENTITIES: always.append("Town Obelisk Side 6") # Eclipse EP - if world.options.EP_difficulty != "normal": + if "0x3388F" not in world.player_logic.COMPLETELY_DISABLED_ENTITIES: always.append("Treehouse Obelisk Side 4") # Couch EP + + if "0x335AE" not in world.player_logic.COMPLETELY_DISABLED_ENTITIES: always.append("Mountainside Obelisk Side 1") # Cloud Cycle EP. return always @@ -305,11 +307,13 @@ def get_priority_hint_locations(world: "WitnessWorld") -> List[str]: ] # Add Obelisk Sides that contain EPs that are meant to be hinted, if they are necessary to complete the Obelisk Side - if world.options.EP_difficulty != "normal": + if "0x33A20" not in world.player_logic.COMPLETELY_DISABLED_ENTITIES: priority.append("Town Obelisk Side 6") # Theater Flowers EP + + if "0x28B29" not in world.player_logic.COMPLETELY_DISABLED_ENTITIES: priority.append("Treehouse Obelisk Side 4") # Shipwreck Green EP - if not world.options.disable_non_randomized_puzzles: + if "0x33600" not in world.player_logic.COMPLETELY_DISABLED_ENTITIES: priority.append("Town Obelisk Side 2") # Tutorial Patio Flowers EP. return priority