diff --git a/worlds/lingo/data/LL1.yaml b/worlds/lingo/data/LL1.yaml index 1a149f2d..f72e63c1 100644 --- a/worlds/lingo/data/LL1.yaml +++ b/worlds/lingo/data/LL1.yaml @@ -112,6 +112,7 @@ HI: id: Entry Room/Panel_hi_hi tag: midwhite + check: True HIDDEN: id: Entry Room/Panel_hidden_hidden tag: midwhite diff --git a/worlds/lingo/player_logic.py b/worlds/lingo/player_logic.py index 0ae30351..3a6eedfe 100644 --- a/worlds/lingo/player_logic.py +++ b/worlds/lingo/player_logic.py @@ -248,30 +248,44 @@ class LingoPlayerLogic: "kind of logic error.") if door_shuffle != ShuffleDoors.option_none and location_classification != LocationClassification.insanity \ - and not early_color_hallways: - # If shuffle doors is on, force a useful item onto the HI panel. This may not necessarily get you out of BK, - # but the goal is to allow you to reach at least one more check. The non-painting ones are hardcoded right - # now. We only allow the entrance to the Pilgrim Room if color shuffle is off, because otherwise there are - # no extra checks in there. We only include the entrance to the Rhyme Room when color shuffle is off and - # door shuffle is on simple, because otherwise there are no extra checks in there. + and not early_color_hallways and world.multiworld.players > 1: + # Under the combination of door shuffle, normal location checks, and no early color hallways, sphere 1 is + # only three checks. In a multiplayer situation, this can be frustrating for the player because they are + # more likely to be stuck in the starting room for a long time. To remedy this, we will force a useful item + # onto the GOOD LUCK check under these circumstances. The goal is to expand sphere 1 to at least four + # checks (and likely more than that). + # + # Note: A very low LEVEL 2 requirement would naturally expand sphere 1 to four checks, but this is a very + # uncommon configuration, so we will ignore it and force a good item anyway. + + # Starting Room - Back Right Door gives access to OPEN and DEAD END. + # Starting Room - Exit Door gives access to OPEN and TRACE. good_item_options: List[str] = ["Starting Room - Back Right Door", "Second Room - Exit Door"] if not color_shuffle: + # HOT CRUST and THIS. good_item_options.append("Pilgrim Room - Sun Painting") + if door_shuffle == ShuffleDoors.option_simple: + # WELCOME BACK, CLOCKWISE, and DRAWL + RUNS. + good_item_options.append("Welcome Back Doors") + else: + # WELCOME BACK and CLOCKWISE. + good_item_options.append("Welcome Back Area - Shortcut to Starting Room") + if door_shuffle == ShuffleDoors.option_simple: - good_item_options += ["Welcome Back Doors"] - - if not color_shuffle: - good_item_options.append("Rhyme Room Doors") - else: - good_item_options += ["Welcome Back Area - Shortcut to Starting Room"] + # Color hallways access (NOTE: reconsider when sunwarp shuffling exists). + good_item_options.append("Rhyme Room Doors") + # When painting shuffle is off, most Starting Room paintings give color hallways access. The Wondrous's + # painting does not, but it gives access to SHRINK and WELCOME BACK. for painting_obj in PAINTINGS_BY_ROOM["Starting Room"]: if not painting_obj.enter_only or painting_obj.required_door is None: continue # If painting shuffle is on, we only want to consider paintings that actually go somewhere. + # + # NOTE: This does not guarantee that there will be any checks on the other side. if painting_shuffle and painting_obj.id not in self.painting_mapping.keys(): continue diff --git a/worlds/lingo/test/TestDoors.py b/worlds/lingo/test/TestDoors.py index 49a0f9c4..f496c5f5 100644 --- a/worlds/lingo/test/TestDoors.py +++ b/worlds/lingo/test/TestDoors.py @@ -8,8 +8,6 @@ class TestRequiredRoomLogic(LingoTestBase): } def test_pilgrim_first(self) -> None: - self.remove_forced_good_item() - self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Pilgrim Antechamber", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player)) @@ -30,8 +28,6 @@ class TestRequiredRoomLogic(LingoTestBase): self.assertTrue(self.can_reach_location("The Seeker - Achievement")) def test_hidden_first(self) -> None: - self.remove_forced_good_item() - self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player)) self.assertFalse(self.can_reach_location("The Seeker - Achievement")) @@ -59,8 +55,6 @@ class TestRequiredDoorLogic(LingoTestBase): } def test_through_rhyme(self) -> None: - self.remove_forced_good_item() - self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) self.collect_by_name("Starting Room - Rhyme Room Entrance") @@ -70,8 +64,6 @@ class TestRequiredDoorLogic(LingoTestBase): self.assertTrue(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) def test_through_hidden(self) -> None: - self.remove_forced_good_item() - self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) self.collect_by_name("Starting Room - Rhyme Room Entrance") @@ -91,8 +83,6 @@ class TestSimpleDoors(LingoTestBase): } def test_requirement(self): - self.remove_forced_good_item() - self.assertFalse(self.multiworld.state.can_reach("Outside The Wanderer", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) diff --git a/worlds/lingo/test/TestOrangeTower.py b/worlds/lingo/test/TestOrangeTower.py index 9170de10..7b0c3bb5 100644 --- a/worlds/lingo/test/TestOrangeTower.py +++ b/worlds/lingo/test/TestOrangeTower.py @@ -8,8 +8,6 @@ class TestProgressiveOrangeTower(LingoTestBase): } def test_from_welcome_back(self) -> None: - self.remove_forced_good_item() - self.assertFalse(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) @@ -85,8 +83,6 @@ class TestProgressiveOrangeTower(LingoTestBase): self.assertTrue(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) def test_from_hub_room(self) -> None: - self.remove_forced_good_item() - self.assertFalse(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) diff --git a/worlds/lingo/test/TestProgressive.py b/worlds/lingo/test/TestProgressive.py index 081d6743..e79fd6bc 100644 --- a/worlds/lingo/test/TestProgressive.py +++ b/worlds/lingo/test/TestProgressive.py @@ -7,8 +7,6 @@ class TestComplexProgressiveHallwayRoom(LingoTestBase): } def test_item(self): - self.remove_forced_good_item() - self.assertFalse(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) @@ -60,8 +58,6 @@ class TestSimpleHallwayRoom(LingoTestBase): } def test_item(self): - self.remove_forced_good_item() - self.assertFalse(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) @@ -90,8 +86,6 @@ class TestProgressiveArtGallery(LingoTestBase): } def test_item(self): - self.remove_forced_good_item() - self.assertFalse(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) diff --git a/worlds/lingo/test/__init__.py b/worlds/lingo/test/__init__.py index 7ff456d8..a4196de1 100644 --- a/worlds/lingo/test/__init__.py +++ b/worlds/lingo/test/__init__.py @@ -6,12 +6,3 @@ from test.bases import WorldTestBase class LingoTestBase(WorldTestBase): game = "Lingo" player: ClassVar[int] = 1 - - def world_setup(self, *args, **kwargs): - super().world_setup(*args, **kwargs) - - def remove_forced_good_item(self): - location = self.multiworld.get_location("Second Room - Good Luck", self.player) - self.remove(location.item) - self.multiworld.itempool.append(location.item) - self.multiworld.state.events.add(location)