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:
parent
54a0a5ac00
commit
9a37a136a1
|
@ -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
|
||||||
|
|
|
@ -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)
|
|
@ -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
|
||||||
|
@ -19,4 +20,3 @@ 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)
|
|
|
@ -4,3 +4,7 @@ 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)
|
|
@ -7,3 +7,7 @@ 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)
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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]
|
||||||
|
|
||||||
|
|
|
@ -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."
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue