The Witness: Add more panels to the "doors: panels" mode (#2916)

* Add more panels that should be panels

* Make it so the caves panel items don't exist in early caves

* Remove unused import

* oops

* Remove Jungle to Monastery Garden from usefulification list

* Add a basic test

* ruff

---------

Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
This commit is contained in:
NewSoupVi 2024-12-10 21:13:45 +01:00 committed by GitHub
parent 54a0a5ac00
commit 9a37a136a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 67 additions and 13 deletions

View File

@ -56,6 +56,7 @@ Doors:
1119 - Quarry Stoneworks Entry (Panel) - 0x01E5A,0x01E59 1119 - Quarry Stoneworks Entry (Panel) - 0x01E5A,0x01E59
1120 - Quarry Stoneworks Ramp Controls (Panel) - 0x03678,0x03676 1120 - Quarry Stoneworks Ramp Controls (Panel) - 0x03678,0x03676
1122 - Quarry Stoneworks Lift Controls (Panel) - 0x03679,0x03675 1122 - Quarry Stoneworks Lift Controls (Panel) - 0x03679,0x03675
1123 - Quarry Stoneworks Stairs (Panel) - 0x03677
1125 - Quarry Boathouse Ramp Height Control (Panel) - 0x03852 1125 - Quarry Boathouse Ramp Height Control (Panel) - 0x03852
1127 - Quarry Boathouse Ramp Horizontal Control (Panel) - 0x03858 1127 - Quarry Boathouse Ramp Horizontal Control (Panel) - 0x03858
1129 - Quarry Boathouse Hook Control (Panel) - 0x275FA 1129 - Quarry Boathouse Hook Control (Panel) - 0x275FA
@ -84,6 +85,7 @@ Doors:
1205 - Treehouse Laser House Door Timer (Panel) - 0x2700B,0x17CBC 1205 - Treehouse Laser House Door Timer (Panel) - 0x2700B,0x17CBC
1208 - Treehouse Drawbridge (Panel) - 0x037FF 1208 - Treehouse Drawbridge (Panel) - 0x037FF
1175 - Jungle Popup Wall (Panel) - 0x17CAB 1175 - Jungle Popup Wall (Panel) - 0x17CAB
1178 - Jungle Monastery Garden Shortcut (Panel) - 0x17CAA
1180 - Bunker Entry (Panel) - 0x17C2E 1180 - Bunker Entry (Panel) - 0x17C2E
1183 - Bunker Tinted Glass Door (Panel) - 0x0A099 1183 - Bunker Tinted Glass Door (Panel) - 0x0A099
1186 - Bunker Elevator Control (Panel) - 0x0A079 1186 - Bunker Elevator Control (Panel) - 0x0A079
@ -94,12 +96,15 @@ Doors:
1195 - Swamp Rotating Bridge (Panel) - 0x181F5 1195 - Swamp Rotating Bridge (Panel) - 0x181F5
1196 - Swamp Long Bridge (Panel) - 0x17E2B 1196 - Swamp Long Bridge (Panel) - 0x17E2B
1197 - Swamp Maze Controls (Panel) - 0x17C0A,0x17E07 1197 - Swamp Maze Controls (Panel) - 0x17C0A,0x17E07
1199 - Swamp Laser Shortcut (Panel) - 0x17C05
1220 - Mountain Floor 1 Light Bridge (Panel) - 0x09E39 1220 - Mountain Floor 1 Light Bridge (Panel) - 0x09E39
1225 - Mountain Floor 2 Light Bridge Near (Panel) - 0x09E86 1225 - Mountain Floor 2 Light Bridge Near (Panel) - 0x09E86
1230 - Mountain Floor 2 Light Bridge Far (Panel) - 0x09ED8 1230 - Mountain Floor 2 Light Bridge Far (Panel) - 0x09ED8
1235 - Mountain Floor 2 Elevator Control (Panel) - 0x09EEB 1235 - Mountain Floor 2 Elevator Control (Panel) - 0x09EEB
1240 - Caves Entry (Panel) - 0x00FF8 1240 - Caves Entry (Panel) - 0x00FF8
1242 - Caves Elevator Controls (Panel) - 0x335AB,0x335AC,0x3369D 1242 - Caves Elevator Controls (Panel) - 0x335AB,0x335AC,0x3369D
1243 - Caves Mountain Shortcut (Panel) - 0x021D7
1244 - Caves Swamp Shortcut (Panel) - 0x17CF2
1245 - Challenge Entry (Panel) - 0x0A16E 1245 - Challenge Entry (Panel) - 0x0A16E
1250 - Tunnels Entry (Panel) - 0x039B4 1250 - Tunnels Entry (Panel) - 0x039B4
1255 - Tunnels Town Shortcut (Panel) - 0x09E85 1255 - Tunnels Town Shortcut (Panel) - 0x09E85
@ -250,19 +255,20 @@ Doors:
2101 - Outside 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,0x0A015,0x09FA0,0x09F86 2105 - Desert Panels - 0x09FAA,0x1C2DF,0x1831E,0x1C260,0x1831C,0x1C2F3,0x1831D,0x1C2B1,0x1831B,0x0C339,0x0A249,0x0A015,0x09FA0,0x09F86
2110 - Quarry Outside Panels - 0x17C09,0x09E57,0x17CC4 2110 - Quarry Outside Panels - 0x17C09,0x09E57,0x17CC4
2115 - Quarry Stoneworks Panels - 0x01E5A,0x01E59,0x03678,0x03676,0x03679,0x03675 2115 - Quarry Stoneworks Panels - 0x01E5A,0x01E59,0x03678,0x03676,0x03679,0x03675,0x03677
2120 - Quarry Boathouse Panels - 0x03852,0x03858,0x275FA 2120 - Quarry Boathouse Panels - 0x03852,0x03858,0x275FA
2122 - Keep Hedge Maze Panels - 0x00139,0x019DC,0x019E7,0x01A0F 2122 - Keep Hedge Maze Panels - 0x00139,0x019DC,0x019E7,0x01A0F
2125 - Monastery Panels - 0x09D9B,0x00C92,0x00B10 2125 - Monastery Panels - 0x09D9B,0x00C92,0x00B10
2127 - Jungle Panels - 0x17CAB,0x17CAA
2130 - Town Church & RGB House Panels - 0x28998,0x28A0D,0x334D8 2130 - Town Church & RGB House Panels - 0x28998,0x28A0D,0x334D8
2135 - Town Maze Panels - 0x2896A,0x28A79 2135 - Town Maze Panels - 0x2896A,0x28A79
2137 - Town Dockside House Panels - 0x0A0C8,0x09F98 2137 - Town Dockside House Panels - 0x0A0C8,0x09F98
2140 - Windmill & Theater Panels - 0x17D02,0x00815,0x17F5F,0x17F89,0x0A168,0x33AB2 2140 - Windmill & Theater Panels - 0x17D02,0x00815,0x17F5F,0x17F89,0x0A168,0x33AB2
2145 - Treehouse Panels - 0x0A182,0x0288C,0x02886,0x2700B,0x17CBC,0x037FF 2145 - Treehouse Panels - 0x0A182,0x0288C,0x02886,0x2700B,0x17CBC,0x037FF
2150 - Bunker Panels - 0x34BC5,0x34BC6,0x0A079,0x0A099,0x17C2E 2150 - Bunker Panels - 0x34BC5,0x34BC6,0x0A079,0x0A099,0x17C2E
2155 - Swamp Panels - 0x00609,0x18488,0x181F5,0x17E2B,0x17C0A,0x17E07,0x17C0D,0x0056E 2155 - Swamp Panels - 0x00609,0x18488,0x181F5,0x17E2B,0x17C0A,0x17E07,0x17C0D,0x0056E,0x17C05
2160 - Mountain Panels - 0x09ED8,0x09E86,0x09E39,0x09EEB 2160 - Mountain Panels - 0x09ED8,0x09E86,0x09E39,0x09EEB
2165 - Caves Panels - 0x3369D,0x00FF8,0x0A16E,0x335AB,0x335AC 2165 - Caves Panels - 0x3369D,0x00FF8,0x0A16E,0x335AB,0x335AC,0x021D7,0x17CF2
2170 - Tunnels Panels - 0x09E85,0x039B4 2170 - Tunnels Panels - 0x09E85,0x039B4
2200 - Desert Obelisk Key - 0x0332B,0x03367,0x28B8A,0x037B6,0x037B2,0x000F7,0x3351D,0x0053C,0x00771,0x335C8,0x335C9,0x337F8,0x037BB,0x220E4,0x220E5,0x334B9,0x334BC,0x22106,0x0A14C,0x0A14D,0x00359 2200 - Desert Obelisk Key - 0x0332B,0x03367,0x28B8A,0x037B6,0x037B2,0x000F7,0x3351D,0x0053C,0x00771,0x335C8,0x335C9,0x337F8,0x037BB,0x220E4,0x220E5,0x334B9,0x334BC,0x22106,0x0A14C,0x0A14D,0x00359

View File

@ -9,6 +9,7 @@ Desert Flood Room Entry (Panel)
Quarry Entry 1 (Panel) Quarry Entry 1 (Panel)
Quarry Entry 2 (Panel) Quarry Entry 2 (Panel)
Quarry Stoneworks Entry (Panel) Quarry Stoneworks Entry (Panel)
Quarry Stoneworks Stairs (Panel)
Shadows Door Timer (Panel) Shadows Door Timer (Panel)
Keep Hedge Maze 1 (Panel) Keep Hedge Maze 1 (Panel)
Keep Hedge Maze 2 (Panel) Keep Hedge Maze 2 (Panel)
@ -28,11 +29,15 @@ Treehouse Third Door (Panel)
Treehouse Laser House Door Timer (Panel) Treehouse Laser House Door Timer (Panel)
Treehouse Drawbridge (Panel) Treehouse Drawbridge (Panel)
Jungle Popup Wall (Panel) Jungle Popup Wall (Panel)
Jungle Monastery Garden Shortcut (Panel)
Bunker Entry (Panel) Bunker Entry (Panel)
Bunker Tinted Glass Door (Panel) Bunker Tinted Glass Door (Panel)
Swamp Entry (Panel) Swamp Entry (Panel)
Swamp Platform Shortcut (Panel) Swamp Platform Shortcut (Panel)
Swamp Laser Shortcut (Panel)
Caves Entry (Panel) Caves Entry (Panel)
Caves Mountain Shortcut (Panel)
Caves Swamp Shortcut (Panel)
Challenge Entry (Panel) Challenge Entry (Panel)
Tunnels Entry (Panel) Tunnels Entry (Panel)
Tunnels Town Shortcut (Panel) Tunnels Town Shortcut (Panel)

View File

@ -7,6 +7,7 @@ Quarry Stoneworks Panels
Quarry Boathouse Panels Quarry Boathouse Panels
Keep Hedge Maze Panels Keep Hedge Maze Panels
Monastery Panels Monastery Panels
Jungle Panels
Town Church & RGB House Panels Town Church & RGB House Panels
Town Maze Panels Town Maze Panels
Windmill & Theater Panels Windmill & Theater Panels
@ -18,5 +19,4 @@ Mountain Panels
Caves Panels Caves Panels
Tunnels Panels Tunnels Panels
Glass Factory Entry (Panel) Glass Factory Entry (Panel)
Shadows Door Timer (Panel) Shadows Door Timer (Panel)
Jungle Popup Wall (Panel)

View File

@ -3,4 +3,8 @@ Caves Shortcuts
Remove Items: Remove Items:
Caves Mountain Shortcut (Door) Caves Mountain Shortcut (Door)
Caves Swamp Shortcut (Door) Caves Swamp Shortcut (Door)
Forbidden Doors:
0x021D7 (Caves Mountain Shortcut Panel)
0x17CF2 (Caves Swamp Shortcut Panel)

View File

@ -6,4 +6,8 @@ Caves Shortcuts
Remove Items: Remove Items:
Caves Mountain Shortcut (Door) Caves Mountain Shortcut (Door)
Caves Swamp Shortcut (Door) Caves Swamp Shortcut (Door)
Forbidden Doors:
0x021D7 (Caves Mountain Shortcut Panel)
0x17CF2 (Caves Swamp Shortcut Panel)

View File

@ -227,10 +227,13 @@ class WitnessPlayerItems:
Returns the total set of all door IDs that are controlled by items in the pool. Returns the total set of all door IDs that are controlled by items in the pool.
""" """
output: List[int] = [] output: List[int] = []
for item_name, item_data in dict(self.item_data.items()).items():
for item_name, item_data in self.item_data.items():
if not isinstance(item_data.definition, DoorItemDefinition): if not isinstance(item_data.definition, DoorItemDefinition):
continue continue
output += [int(hex_string, 16) for hex_string in item_data.definition.panel_id_hexes]
output += [int(hex_string, 16) for hex_string in item_data.definition.panel_id_hexes
if hex_string not in self._logic.FORBIDDEN_DOORS]
return output return output

View File

@ -82,6 +82,7 @@ class WitnessPlayerLogic:
self.PARENT_ITEM_COUNT_PER_BASE_ITEM: Dict[str, int] = defaultdict(lambda: 1) self.PARENT_ITEM_COUNT_PER_BASE_ITEM: Dict[str, int] = defaultdict(lambda: 1)
self.PROGRESSIVE_LISTS: Dict[str, List[str]] = {} self.PROGRESSIVE_LISTS: Dict[str, List[str]] = {}
self.DOOR_ITEMS_BY_ID: Dict[str, List[str]] = {} self.DOOR_ITEMS_BY_ID: Dict[str, List[str]] = {}
self.FORBIDDEN_DOORS: Set[str] = set()
self.STARTING_INVENTORY: Set[str] = set() self.STARTING_INVENTORY: Set[str] = set()
@ -192,8 +193,9 @@ class WitnessPlayerLogic:
for subset in these_items: for subset in these_items:
self.BASE_PROGESSION_ITEMS_ACTUALLY_IN_THE_GAME.update(subset) self.BASE_PROGESSION_ITEMS_ACTUALLY_IN_THE_GAME.update(subset)
# Handle door entities (door shuffle) # If this entity is opened by a door item that exists in the itempool, add that item to its requirements.
if entity_hex in self.DOOR_ITEMS_BY_ID: # Also, remove any original power requirements this entity might have had.
if entity_hex in self.DOOR_ITEMS_BY_ID and entity_hex not in self.FORBIDDEN_DOORS:
# If this entity is opened by a door item that exists in the itempool, add that item to its requirements. # If this entity is opened by a door item that exists in the itempool, add that item to its requirements.
door_items = frozenset({frozenset([item]) for item in self.DOOR_ITEMS_BY_ID[entity_hex]}) door_items = frozenset({frozenset([item]) for item in self.DOOR_ITEMS_BY_ID[entity_hex]})
@ -329,6 +331,10 @@ class WitnessPlayerLogic:
if entity_hex in self.DOOR_ITEMS_BY_ID and item_name in self.DOOR_ITEMS_BY_ID[entity_hex]: if entity_hex in self.DOOR_ITEMS_BY_ID and item_name in self.DOOR_ITEMS_BY_ID[entity_hex]:
self.DOOR_ITEMS_BY_ID[entity_hex].remove(item_name) self.DOOR_ITEMS_BY_ID[entity_hex].remove(item_name)
if adj_type == "Forbidden Doors":
entity_hex = line[:7]
self.FORBIDDEN_DOORS.add(entity_hex)
if adj_type == "Starting Inventory": if adj_type == "Starting Inventory":
self.STARTING_INVENTORY.add(line) self.STARTING_INVENTORY.add(line)
@ -704,7 +710,7 @@ class WitnessPlayerLogic:
self.make_single_adjustment(current_adjustment_type, line) self.make_single_adjustment(current_adjustment_type, line)
for entity_id in self.COMPLETELY_DISABLED_ENTITIES: for entity_id in self.COMPLETELY_DISABLED_ENTITIES | self.FORBIDDEN_DOORS:
if entity_id in self.DOOR_ITEMS_BY_ID: if entity_id in self.DOOR_ITEMS_BY_ID:
del self.DOOR_ITEMS_BY_ID[entity_id] del self.DOOR_ITEMS_BY_ID[entity_id]

View File

@ -1,4 +1,4 @@
from ..test import WitnessTestBase from ..test import WitnessMultiworldTestBase, WitnessTestBase
class TestIndividualDoors(WitnessTestBase): class TestIndividualDoors(WitnessTestBase):
@ -22,3 +22,29 @@ class TestIndividualDoors(WitnessTestBase):
], ],
only_check_listed=True, only_check_listed=True,
) )
class TestForbiddenDoors(WitnessMultiworldTestBase):
options_per_world = [
{
"early_caves": "off",
},
{
"early_caves": "add_to_pool",
},
]
common_options = {
"shuffle_doors": "panels",
"shuffle_postgame": True,
}
def test_forbidden_doors(self) -> None:
self.assertTrue(
self.get_items_by_name("Caves Mountain Shortcut (Panel)", 1),
"Caves Mountain Shortcut (Panel) should exist in panels shuffle, but it didn't."
)
self.assertFalse(
self.get_items_by_name("Caves Mountain Shortcut (Panel)", 2),
"Caves Mountain Shortcut (Panel) should be removed when Early Caves is enabled, but it still exists."
)