From cc2216164489f89d78ac1e53aaa71b9dce04ac28 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Fri, 26 Jul 2024 04:53:11 -0400 Subject: [PATCH] Lingo: Add panels mode door shuffle (#3163) * Created panels mode door shuffle * Added some panel door item names * Remove RUNT TURN panel door Not really useful. * Fix logic with First SIX related stuff * Add group_doors to slot data * Fix LEVEL 2 behavior with panels mode * Fixed unit tests * Fixed duplicate IDs from merge * Just regenerated new IDs * Fixed duplication of color and door group items * Removed unnecessary unit test option * Fix The Seeker being achievable without entrance door * Fix The Observant being achievable without locked panels * Added some more panel doors * Added Progressive Suits Area * Lingo: Fix Basement access with THE MASTER * Added indirect conditions for MASTER-blocked entrances * Fixed Incomparable achievement access * Fix STAIRS panel logic * Fix merge error with good items * Is this clearer? * DREAD and TURN LEARN * Allow a weird edge case for reduced locations Panels mode door shuffle + grouped doors + color shuffle + pilgrimage enabled is exactly the right number of items for reduced locations. Removing color shuffle also allows for disabling pilgrimage, adding sunwarp locking, or both, with a couple of locations left over. * Prevent small sphere one on panels mode * Added shuffle_doors aliases for old options * Fixed a unit test * Updated datafile * Tweaked requirements for reduced locations * Added player name to OptionError messages * Update generated.dat --- worlds/lingo/__init__.py | 3 +- worlds/lingo/data/LL1.yaml | 694 +++++++++++++++++++++-- worlds/lingo/data/generated.dat | Bin 136563 -> 148903 bytes worlds/lingo/data/ids.yaml | 142 +++++ worlds/lingo/datatypes.py | 11 + worlds/lingo/items.py | 17 +- worlds/lingo/options.py | 29 +- worlds/lingo/player_logic.py | 121 +++- worlds/lingo/rules.py | 10 +- worlds/lingo/static_logic.py | 32 +- worlds/lingo/test/TestDoors.py | 56 +- worlds/lingo/test/TestOptions.py | 17 +- worlds/lingo/test/TestOrangeTower.py | 2 +- worlds/lingo/test/TestPanelsanity.py | 2 +- worlds/lingo/test/TestPilgrimage.py | 8 +- worlds/lingo/test/TestProgressive.py | 7 +- worlds/lingo/test/TestSunwarps.py | 21 +- worlds/lingo/utils/assign_ids.rb | 40 ++ worlds/lingo/utils/pickle_static_data.py | 124 +++- worlds/lingo/utils/validate_config.rb | 88 ++- 20 files changed, 1274 insertions(+), 150 deletions(-) diff --git a/worlds/lingo/__init__.py b/worlds/lingo/__init__.py index a1b8b7c1..9853be73 100644 --- a/worlds/lingo/__init__.py +++ b/worlds/lingo/__init__.py @@ -170,7 +170,8 @@ class LingoWorld(World): slot_options = [ "death_link", "victory_condition", "shuffle_colors", "shuffle_doors", "shuffle_paintings", "shuffle_panels", "enable_pilgrimage", "sunwarp_access", "mastery_achievements", "level_2_requirement", "location_checks", - "early_color_hallways", "pilgrimage_allows_roof_access", "pilgrimage_allows_paintings", "shuffle_sunwarps" + "early_color_hallways", "pilgrimage_allows_roof_access", "pilgrimage_allows_paintings", "shuffle_sunwarps", + "group_doors" ] slot_data = { diff --git a/worlds/lingo/data/LL1.yaml b/worlds/lingo/data/LL1.yaml index 3035446e..1c9f4e55 100644 --- a/worlds/lingo/data/LL1.yaml +++ b/worlds/lingo/data/LL1.yaml @@ -1,6 +1,13 @@ --- # This file is an associative array where the keys are region names. Rooms - # have four properties: entrances, panels, doors, and paintings. + # have a number of properties: + # - entrances + # - panels + # - doors + # - panel_doors + # - paintings + # - progression + # - sunwarps # # entrances is an array of regions from which this room can be accessed. The # key of each entry is the room that can access this one. The value is a list @@ -13,7 +20,7 @@ # room that the door is in. The room name may be omitted if the door is # located in the current room. # - # panels is an array of panels in the room. The key of the array is an + # panels is a named array of panels in the room. The key of the array is an # arbitrary name for the panel. Panels can have the following fields: # - id: The internal ID of the panel in the LINGO map # - required_room: In addition to having access to this room, the player must @@ -45,7 +52,7 @@ # - hunt: If True, the tracker will show this panel even when it is # not a check. Used for hunts like the Number Hunt. # - # doors is an array of doors associated with this room. When door + # doors is a named array of doors associated with this room. When door # randomization is enabled, each of these is an item. The key is a name that # will be displayed as part of the item's name. Doors can have the following # fields: @@ -78,6 +85,18 @@ # - event: Denotes that the door is event only. This is similar to # setting both skip_location and skip_item. # + # panel_doors is a named array of "panel doors" associated with this room. + # When panel door shuffle is enabled, each of these becomes an item, and those + # items block access to the listed panels. The key is a name for internal + # reference only. Panel doors can have the following fields: + # - panels: Required. This is the set of panels that are blocked by this + # panel door. + # - item_name: Overrides the name of the item generated for this panel + # door. If not specified, the item name will be generated from + # the room name and the name(s) of the panel(s). + # - panel_group: When region grouping is enabled, all panel doors with the + # same group will be covered by a single item. + # # paintings is an array of paintings in the room. This is used for painting # shuffling. # - id: The internal painting ID from the LINGO map. @@ -105,6 +124,14 @@ # fine in door shuffle mode. # - move: Denotes that the painting is able to move. # + # progression is a named array of items that define an ordered set of items. + # progression items do not have any true connection to the rooms that they + # are defined in, but it is best to place them in a thematically appropriate + # room. The key for a progression entry is the name of the item that will be + # created. A progression entry is a dictionary with one or both of a "doors" + # key and a "panel_doors" key. These fields should be lists of doors or + # panel doors that will be contained in this progressive item. + # # sunwarps is an array of sunwarps in the room. This is used for sunwarp # shuffling. # - dots: The number of dots on this sunwarp. @@ -193,6 +220,10 @@ panel: RACECAR (Black) - room: The Tenacious panel: SOLOS (Black) + panel_doors: + HIDDEN: + panels: + - HIDDEN paintings: - id: arrows_painting exit_only: True @@ -303,6 +334,10 @@ panel: SOLOS (Black) - room: Hub Room panel: RAT + panel_doors: + OPEN: + panels: + - OPEN paintings: - id: owl_painting orientation: north @@ -317,7 +352,13 @@ panels: Achievement: id: Countdown Panels/Panel_seeker_seeker - required_room: Hidden Room + # The Seeker uniquely has the property that 1) it can be entered (through the Pilgrim Room) without opening the + # front door in panels mode door shuffle, and 2) the front door panel is part of the CDP. This necessitates this + # required_panel clause, because the entrance panel needs to be solvable for the achievement even if an + # alternate entrance to the room is used. + required_panel: + room: Hidden Room + panel: OPEN tag: forbid check: True achievement: The Seeker @@ -537,6 +578,23 @@ item_group: Achievement Room Entrances panels: - OPEN + panel_doors: + ORDER: + panels: + - ORDER + SLAUGHTER: + panel_group: Tenacious Entrance Panels + panels: + - SLAUGHTER + TRACE: + panels: + - TRACE + RAT: + panels: + - RAT + OPEN: + panels: + - OPEN paintings: - id: maze_painting orientation: west @@ -608,12 +666,13 @@ item_name: "6 Sunwarp" progression: Progressive Pilgrimage: - - 1 Sunwarp - - 2 Sunwarp - - 3 Sunwarp - - 4 Sunwarp - - 5 Sunwarp - - 6 Sunwarp + doors: + - 1 Sunwarp + - 2 Sunwarp + - 3 Sunwarp + - 4 Sunwarp + - 5 Sunwarp + - 6 Sunwarp Pilgrim Antechamber: # The entrances to this room are special. When pilgrimage is enabled, we use a special access rule to determine # whether a pilgrimage can succeed. When pilgrimage is disabled, the sun painting will be added to the pool. @@ -881,6 +940,24 @@ panel: READS + RUST - room: Ending Area panel: THE END + panel_doors: + DECAY: + panel_group: Tenacious Entrance Panels + panels: + - DECAY + NOPE: + panels: + - NOPE + WE ROT: + panels: + - WE ROT + WORDS SWORD: + panels: + - WORDS + - SWORD + BEND HI: + panels: + - BEND HI paintings: - id: eye_painting disable: True @@ -895,6 +972,14 @@ direction: exit entrance_indicator_pos: [ -17, 2.5, -41.01 ] orientation: north + progression: + Progressive Suits Area: + panel_doors: + - WORDS SWORD + - room: Lost Area + panel_door: LOST + - room: Amen Name Area + panel_door: AMEN NAME Lost Area: entrances: Outside The Agreeable: @@ -920,6 +1005,11 @@ panels: - LOST (1) - LOST (2) + panel_doors: + LOST: + panels: + - LOST (1) + - LOST (2) Amen Name Area: entrances: Crossroads: @@ -953,6 +1043,11 @@ panels: - AMEN - NAME + panel_doors: + AMEN NAME: + panels: + - AMEN + - NAME Suits Area: entrances: Amen Name Area: @@ -1056,6 +1151,13 @@ - LEVEL (White) - RACECAR (White) - SOLOS (White) + panel_doors: + Black Palindromes: + item_name: The Tenacious - Black Palindromes (Panels) + panels: + - LEVEL (Black) + - RACECAR (Black) + - SOLOS (Black) Near Far Area: entrances: Hub Room: True @@ -1081,6 +1183,21 @@ panels: - NEAR - FAR + panel_doors: + NEAR FAR: + item_name: Symmetry Room - NEAR, FAR (Panels) + panel_group: Symmetry Room Panels + panels: + - NEAR + - FAR + progression: + Progressive Symmetry Room: + panel_doors: + - NEAR FAR + - room: Warts Straw Area + panel_door: WARTS STRAW + - room: Leaf Feel Area + panel_door: LEAF FEEL Warts Straw Area: entrances: Near Far Area: @@ -1108,6 +1225,13 @@ panels: - WARTS - STRAW + panel_doors: + WARTS STRAW: + item_name: Symmetry Room - WARTS, STRAW (Panels) + panel_group: Symmetry Room Panels + panels: + - WARTS + - STRAW Leaf Feel Area: entrances: Warts Straw Area: @@ -1135,6 +1259,13 @@ panels: - LEAF - FEEL + panel_doors: + LEAF FEEL: + item_name: Symmetry Room - LEAF, FEEL (Panels) + panel_group: Symmetry Room Panels + panels: + - LEAF + - FEEL Outside The Agreeable: entrances: Crossroads: @@ -1243,6 +1374,20 @@ panels: - room: Color Hunt panel: PURPLE + panel_doors: + MASSACRED: + panel_group: Tenacious Entrance Panels + panels: + - MASSACRED + BLACK: + panels: + - BLACK + CLOSE: + panels: + - CLOSE + RIGHT: + panels: + - RIGHT paintings: - id: eyes_yellow_painting orientation: east @@ -1294,6 +1439,14 @@ - WINTER - DIAMONDS - FIRE + panel_doors: + Lookout: + item_name: Compass Room Panels + panels: + - NORTH + - WINTER + - DIAMONDS + - FIRE paintings: - id: pencil_painting7 orientation: north @@ -1510,6 +1663,10 @@ - HIDE (3) - room: Outside The Agreeable panel: HIDE + panel_doors: + DOWN: + panels: + - DOWN The Perceptive: entrances: Starting Room: @@ -1531,6 +1688,10 @@ check: True exclude_reduce: True tag: botwhite + panel_doors: + GAZE: + panels: + - GAZE paintings: - id: garden_painting_tower orientation: north @@ -1572,9 +1733,10 @@ - EAT progression: Progressive Fearless: - - Second Floor - - room: The Fearless (Second Floor) - door: Third Floor + doors: + - Second Floor + - room: The Fearless (Second Floor) + door: Third Floor The Fearless (Second Floor): entrances: The Fearless (First Floor): @@ -1669,6 +1831,10 @@ tag: forbid required_door: door: Stairs + required_panel: + - panel: FOUR (1) + - panel: FOUR (2) + - panel: SIX achievement: The Observant FOUR (1): id: Look Room/Panel_four_back @@ -1782,6 +1948,16 @@ door_group: Observant Doors panels: - SIX + panel_doors: + BACKSIDE: + item_name: The Observant - Backside Entrance Panels + panel_group: Backside Entrance Panels + panels: + - FOUR (1) + - FOUR (2) + STAIRS: + panels: + - SIX The Incomparable: entrances: The Observant: @@ -1798,9 +1974,12 @@ check: True tag: forbid required_room: - - Elements Area - - Courtyard - Eight Room + required_panel: + - room: Courtyard + panel: I + - room: Elements Area + panel: A achievement: The Incomparable A (One): id: Strand Room/Panel_blank_a @@ -1865,6 +2044,15 @@ panel: I - room: Elements Area panel: A + panel_doors: + Giant Sevens: + item_name: Giant Seven Panels + panels: + - I (Seven) + - room: Courtyard + panel: I + - room: Elements Area + panel: A paintings: - id: crown_painting orientation: east @@ -1972,14 +2160,31 @@ panel: DRAWL + RUNS - room: Owl Hallway panel: READS + RUST + panel_doors: + Access: + item_name: Orange Tower Panels + panels: + - room: Orange Tower First Floor + panel: DADS + ALE + - room: Outside The Undeterred + panel: ART + ART + - room: Orange Tower Third Floor + panel: DEER + WREN + - room: Orange Tower Fourth Floor + panel: LEARNS + UNSEW + - room: Orange Tower Fifth Floor + panel: DRAWL + RUNS + - room: Owl Hallway + panel: READS + RUST progression: Progressive Orange Tower: - - Second Floor - - Third Floor - - Fourth Floor - - Fifth Floor - - Sixth Floor - - Seventh Floor + doors: + - Second Floor + - Third Floor + - Fourth Floor + - Fifth Floor + - Sixth Floor + - Seventh Floor Orange Tower First Floor: entrances: Hub Room: @@ -2022,6 +2227,10 @@ - SALT - room: Directional Gallery panel: PEPPER + panel_doors: + SECRET: + panels: + - SECRET sunwarps: - dots: 4 direction: enter @@ -2174,6 +2383,10 @@ id: Shuffle Room Area Doors/Door_hotcrust_shortcuts panels: - HOT CRUSTS + panel_doors: + HOT CRUSTS: + panels: + - HOT CRUSTS sunwarps: - dots: 5 direction: enter @@ -2288,6 +2501,12 @@ panels: - SIZE (Small) - SIZE (Big) + panel_doors: + SIZE: + item_name: Orange Tower Fifth Floor - SIZE Panels + panels: + - SIZE (Small) + - SIZE (Big) paintings: - id: hi_solved_painting3 orientation: south @@ -2631,6 +2850,15 @@ - SECOND - THIRD - FOURTH + panel_doors: + FIRST SECOND THIRD FOURTH: + item_name: Courtyard - Ordinal Panels + panel_group: Backside Entrance Panels + panels: + - FIRST + - SECOND + - THIRD + - FOURTH The Colorful (White): entrances: Courtyard: True @@ -2648,6 +2876,12 @@ location_name: The Colorful - White panels: - BEGIN + panel_doors: + BEGIN: + item_name: The Colorful - BEGIN (Panel) + panel_group: Colorful Panels + panels: + - BEGIN The Colorful (Black): entrances: The Colorful (White): @@ -2668,6 +2902,12 @@ door_group: Colorful Doors panels: - FOUND + panel_doors: + FOUND: + item_name: The Colorful - FOUND (Panel) + panel_group: Colorful Panels + panels: + - FOUND The Colorful (Red): entrances: The Colorful (Black): @@ -2688,6 +2928,12 @@ door_group: Colorful Doors panels: - LOAF + panel_doors: + LOAF: + item_name: The Colorful - LOAF (Panel) + panel_group: Colorful Panels + panels: + - LOAF The Colorful (Yellow): entrances: The Colorful (Red): @@ -2708,6 +2954,12 @@ door_group: Colorful Doors panels: - CREAM + panel_doors: + CREAM: + item_name: The Colorful - CREAM (Panel) + panel_group: Colorful Panels + panels: + - CREAM The Colorful (Blue): entrances: The Colorful (Yellow): @@ -2728,6 +2980,12 @@ door_group: Colorful Doors panels: - SUN + panel_doors: + SUN: + item_name: The Colorful - SUN (Panel) + panel_group: Colorful Panels + panels: + - SUN The Colorful (Purple): entrances: The Colorful (Blue): @@ -2748,6 +3006,12 @@ door_group: Colorful Doors panels: - SPOON + panel_doors: + SPOON: + item_name: The Colorful - SPOON (Panel) + panel_group: Colorful Panels + panels: + - SPOON The Colorful (Orange): entrances: The Colorful (Purple): @@ -2768,6 +3032,12 @@ door_group: Colorful Doors panels: - LETTERS + panel_doors: + LETTERS: + item_name: The Colorful - LETTERS (Panel) + panel_group: Colorful Panels + panels: + - LETTERS The Colorful (Green): entrances: The Colorful (Orange): @@ -2788,6 +3058,12 @@ door_group: Colorful Doors panels: - WALLS + panel_doors: + WALLS: + item_name: The Colorful - WALLS (Panel) + panel_group: Colorful Panels + panels: + - WALLS The Colorful (Brown): entrances: The Colorful (Green): @@ -2808,6 +3084,12 @@ door_group: Colorful Doors panels: - IRON + panel_doors: + IRON: + item_name: The Colorful - IRON (Panel) + panel_group: Colorful Panels + panels: + - IRON The Colorful (Gray): entrances: The Colorful (Brown): @@ -2828,6 +3110,12 @@ door_group: Colorful Doors panels: - OBSTACLE + panel_doors: + OBSTACLE: + item_name: The Colorful - OBSTACLE (Panel) + panel_group: Colorful Panels + panels: + - OBSTACLE The Colorful: entrances: The Colorful (Gray): @@ -2866,26 +3154,48 @@ orientation: north progression: Progressive Colorful: - - room: The Colorful (White) - door: Progress Door - - room: The Colorful (Black) - door: Progress Door - - room: The Colorful (Red) - door: Progress Door - - room: The Colorful (Yellow) - door: Progress Door - - room: The Colorful (Blue) - door: Progress Door - - room: The Colorful (Purple) - door: Progress Door - - room: The Colorful (Orange) - door: Progress Door - - room: The Colorful (Green) - door: Progress Door - - room: The Colorful (Brown) - door: Progress Door - - room: The Colorful (Gray) - door: Progress Door + doors: + - room: The Colorful (White) + door: Progress Door + - room: The Colorful (Black) + door: Progress Door + - room: The Colorful (Red) + door: Progress Door + - room: The Colorful (Yellow) + door: Progress Door + - room: The Colorful (Blue) + door: Progress Door + - room: The Colorful (Purple) + door: Progress Door + - room: The Colorful (Orange) + door: Progress Door + - room: The Colorful (Green) + door: Progress Door + - room: The Colorful (Brown) + door: Progress Door + - room: The Colorful (Gray) + door: Progress Door + panel_doors: + - room: The Colorful (White) + panel_door: BEGIN + - room: The Colorful (Black) + panel_door: FOUND + - room: The Colorful (Red) + panel_door: LOAF + - room: The Colorful (Yellow) + panel_door: CREAM + - room: The Colorful (Blue) + panel_door: SUN + - room: The Colorful (Purple) + panel_door: SPOON + - room: The Colorful (Orange) + panel_door: LETTERS + - room: The Colorful (Green) + panel_door: WALLS + - room: The Colorful (Brown) + panel_door: IRON + - room: The Colorful (Gray) + panel_door: OBSTACLE Welcome Back Area: entrances: Starting Room: @@ -2958,6 +3268,10 @@ door_group: Hedge Maze Doors panels: - STRAYS + panel_doors: + STRAYS: + panels: + - STRAYS paintings: - id: arrows_painting_8 orientation: south @@ -3155,6 +3469,13 @@ panel: I - room: Elements Area panel: A + panel_doors: + UNCOVER: + panels: + - UNCOVER + OXEN: + panels: + - OXEN paintings: - id: clock_painting_5 orientation: east @@ -3524,6 +3845,13 @@ - RISE (Sunrise) - ZEN - SON + panel_doors: + UNOPEN: + panels: + - UNOPEN + BEGIN: + panels: + - BEGIN paintings: - id: pencil_painting2 orientation: west @@ -3819,6 +4147,34 @@ item_group: Achievement Room Entrances panels: - ZERO + panel_doors: + ZERO: + panels: + - ZERO + PEN: + panels: + - PEN + TWO: + item_name: Two Panels + panels: + - TWO (1) + - TWO (2) + THREE: + item_name: Three Panels + panels: + - THREE (1) + - THREE (2) + - THREE (3) + FOUR: + item_name: Four Panels + panels: + - FOUR + - room: Hub Room + panel: FOUR + - room: Dead End Area + panel: FOUR + - room: The Traveled + panel: FOUR paintings: - id: maze_painting_3 enter_only: True @@ -3994,6 +4350,10 @@ panel: FIVE (1) - room: Directional Gallery panel: FIVE (2) + First Six: + event: True + panels: + - SIX Sevens: id: - Count Up Room Area Doors/Door_seven_hider @@ -4102,12 +4462,109 @@ panel: NINE - room: Elements Area panel: NINE + panel_doors: + FIVE: + item_name: Five Panels + panels: + - FIVE + - room: Outside The Agreeable + panel: FIVE (1) + - room: Outside The Agreeable + panel: FIVE (2) + - room: Directional Gallery + panel: FIVE (1) + - room: Directional Gallery + panel: FIVE (2) + SIX: + item_name: Six Panels + panels: + - SIX + - room: Outside The Bold + panel: SIX + - room: Directional Gallery + panel: SIX (1) + - room: Directional Gallery + panel: SIX (2) + - room: The Bearer (East) + panel: SIX + - room: The Bearer (South) + panel: SIX + SEVEN: + item_name: Seven Panels + panels: + - SEVEN + - room: Directional Gallery + panel: SEVEN + - room: Knight Night Exit + panel: SEVEN (1) + - room: Knight Night Exit + panel: SEVEN (2) + - room: Knight Night Exit + panel: SEVEN (3) + - room: Outside The Initiated + panel: SEVEN (1) + - room: Outside The Initiated + panel: SEVEN (2) + EIGHT: + item_name: Eight Panels + panels: + - EIGHT + - room: Directional Gallery + panel: EIGHT + - room: The Eyes They See + panel: EIGHT + - room: Dead End Area + panel: EIGHT + - room: Crossroads + panel: EIGHT + - room: Hot Crusts Area + panel: EIGHT + - room: Art Gallery + panel: EIGHT + - room: Outside The Initiated + panel: EIGHT + NINE: + item_name: Nine Panels + panels: + - NINE + - room: Directional Gallery + panel: NINE + - room: Amen Name Area + panel: NINE + - room: Yellow Backside Area + panel: NINE + - room: Outside The Initiated + panel: NINE + - room: Outside The Bold + panel: NINE + - room: Rhyme Room (Cross) + panel: NINE + - room: Orange Tower Fifth Floor + panel: NINE + - room: Elements Area + panel: NINE paintings: - id: smile_painting_5 enter_only: True orientation: east required_door: door: Eights + progression: + Progressive Number Hunt: + panel_doors: + - room: Outside The Undeterred + panel_door: TWO + - room: Outside The Undeterred + panel_door: THREE + - room: Outside The Undeterred + panel_door: FOUR + - FIVE + - SIX + - SEVEN + - EIGHT + - NINE + - room: Outside The Undeterred + panel_door: ZERO Directional Gallery: entrances: Outside The Agreeable: @@ -4195,7 +4652,7 @@ tag: midorange required_door: room: Number Hunt - door: Sixes + door: First Six PARANOID: id: Backside Room/Panel_paranoid_paranoid tag: midwhite @@ -4203,7 +4660,7 @@ exclude_reduce: True required_door: room: Number Hunt - door: Sixes + door: First Six YELLOW: id: Color Arrow Room/Panel_yellow_afar tag: midwhite @@ -4266,6 +4723,11 @@ panels: - room: Color Hunt panel: YELLOW + panel_doors: + TURN LEARN: + panels: + - TURN + - LEARN paintings: - id: smile_painting_7 orientation: south @@ -4277,7 +4739,7 @@ move: True required_door: room: Number Hunt - door: Sixes + door: First Six - id: boxes_painting orientation: south - id: cherry_painting @@ -4344,6 +4806,34 @@ id: Rock Room Doors/Door_hint panels: - EXIT + panel_doors: + EXIT: + panels: + - EXIT + RED: + panel_group: Color Hunt Panels + panels: + - RED + BLUE: + panel_group: Color Hunt Panels + panels: + - BLUE + YELLOW: + panel_group: Color Hunt Panels + panels: + - YELLOW + ORANGE: + panel_group: Color Hunt Panels + panels: + - ORANGE + PURPLE: + panel_group: Color Hunt Panels + panels: + - PURPLE + GREEN: + panel_group: Color Hunt Panels + panels: + - GREEN paintings: - id: arrows_painting_7 orientation: east @@ -4481,6 +4971,14 @@ event: True panels: - HEART + panel_doors: + FARTHER: + panel_group: Backside Entrance Panels + panels: + - FARTHER + MIDDLE: + panels: + - MIDDLE The Bearer (East): entrances: Cross Tower (East): True @@ -5333,6 +5831,11 @@ item_name: Knight Night Room - Exit panels: - TRUSTED + panel_doors: + TRUSTED: + item_name: Knight Night Room - TRUSTED (Panel) + panels: + - TRUSTED Knight Night Exit: entrances: Knight Night (Outer Ring): @@ -6017,6 +6520,10 @@ item_group: Achievement Room Entrances panels: - SHRINK + panel_doors: + SHRINK: + panels: + - SHRINK The Wondrous (Doorknob): entrances: Outside The Wondrous: @@ -6228,18 +6735,36 @@ - KEEP - BAILEY - TOWER + panel_doors: + CASTLE: + item_name: Hallway Room - First Room Panels + panel_group: Hallway Room Panels + panels: + - WALL + - KEEP + - BAILEY + - TOWER paintings: - id: panda_painting orientation: south progression: Progressive Hallway Room: - - Exit - - room: Hallway Room (2) - door: Exit - - room: Hallway Room (3) - door: Exit - - room: Hallway Room (4) - door: Exit + doors: + - Exit + - room: Hallway Room (2) + door: Exit + - room: Hallway Room (3) + door: Exit + - room: Hallway Room (4) + door: Exit + panel_doors: + - CASTLE + - room: Hallway Room (2) + panel_door: COUNTERCLOCKWISE + - room: Hallway Room (3) + panel_door: TRANSFORMATION + - room: Hallway Room (4) + panel_door: WHEELBARROW Hallway Room (2): entrances: Hallway Room (1): @@ -6278,6 +6803,15 @@ - CLOCK - ER - COUNT + panel_doors: + COUNTERCLOCKWISE: + item_name: Hallway Room - Second Room Panels + panel_group: Hallway Room Panels + panels: + - WISE + - CLOCK + - ER + - COUNT Hallway Room (3): entrances: Hallway Room (2): @@ -6316,6 +6850,15 @@ - FORM - A - SHUN + panel_doors: + TRANSFORMATION: + item_name: Hallway Room - Third Room Panels + panel_group: Hallway Room Panels + panels: + - TRANCE + - FORM + - A + - SHUN Hallway Room (4): entrances: Hallway Room (3): @@ -6338,6 +6881,12 @@ panels: - WHEEL include_reduce: True + panel_doors: + WHEELBARROW: + item_name: Hallway Room - WHEEL + panel_group: Hallway Room Panels + panels: + - WHEEL Elements Area: entrances: Roof: True @@ -6412,6 +6961,10 @@ panels: - room: The Wanderer panel: Achievement + panel_doors: + WANDERLUST: + panels: + - WANDERLUST The Wanderer: entrances: Outside The Wanderer: @@ -6553,6 +7106,10 @@ item_group: Achievement Room Entrances panels: - ORDER + panel_doors: + ORDER: + panels: + - ORDER paintings: - id: smile_painting_3 orientation: west @@ -6566,10 +7123,11 @@ orientation: south progression: Progressive Art Gallery: - - Second Floor - - Third Floor - - Fourth Floor - - Fifth Floor + doors: + - Second Floor + - Third Floor + - Fourth Floor + - Fifth Floor Art Gallery (Second Floor): entrances: Art Gallery: @@ -7281,8 +7839,8 @@ id: Panel Room/Panel_broomed_bedroom colors: yellow tag: midyellow - required_door: - door: Excavation + required_panel: + panel: WALL (1) LAYS: id: Panel Room/Panel_lays_maze colors: purple @@ -7309,13 +7867,24 @@ Excavation: event: True panels: - - WALL (1) + - STAIRS Cellar Exit: id: - Tower Room Area Doors/Door_panel_basement - Tower Room Area Doors/Door_panel_basement2 panels: - BASE + panel_doors: + STAIRS: + panel_group: Room Room Panels + panels: + - STAIRS + Colors: + panel_group: Room Room Panels + panels: + - BROOMED + - LAYS + - BASE Cellar: entrances: Room Room: @@ -7354,6 +7923,11 @@ panels: - KITTEN - CAT + panel_doors: + KITTEN CAT: + panels: + - KITTEN + - CAT paintings: - id: arrows_painting_2 orientation: east @@ -7608,6 +8182,10 @@ item_group: Achievement Room Entrances panels: - OPEN + panel_doors: + OPEN: + panels: + - OPEN The Scientific: entrances: Outside The Scientific: diff --git a/worlds/lingo/data/generated.dat b/worlds/lingo/data/generated.dat index 4a751b25ec5f143b6b055fd2043a6543754ef5b1..d221b8168d9164576b3f1c5b2fc57c604da5f100 100644 GIT binary patch delta 33771 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