diff --git a/worlds/stardew_valley/logic.py b/worlds/stardew_valley/logic.py index f44ea0c5..48afe1d3 100644 --- a/worlds/stardew_valley/logic.py +++ b/worlds/stardew_valley/logic.py @@ -350,7 +350,7 @@ class StardewLogic: Ingredient.vinegar: self.can_spend_money_at(Region.pierre_store, 200), AnimalProduct.void_egg: self.can_spend_money_at(Region.sewer, 5000) | (self.has_building(Building.fish_pond) & self.has(Fish.void_salmon)), Loot.void_essence: self.can_mine_in_the_mines_floor_81_120() | self.can_mine_in_the_skull_cavern(), - ArtisanGood.void_mayonnaise: self.has(Machine.mayonnaise_machine) & self.has(AnimalProduct.void_egg), + ArtisanGood.void_mayonnaise: (self.can_reach_region(Region.witch_swamp) & self.can_fish()) | (self.has(Machine.mayonnaise_machine) & self.has(AnimalProduct.void_egg)), Ingredient.wheat_flour: self.can_spend_money_at(Region.pierre_store, 100) | (self.has_building(Building.mill) & self.has(Vegetable.wheat)), WaterItem.white_algae: self.can_fish() & self.can_reach_region(Region.mines_floor_20), diff --git a/worlds/stardew_valley/regions.py b/worlds/stardew_valley/regions.py index d115e3ed..60cad4c1 100644 --- a/worlds/stardew_valley/regions.py +++ b/worlds/stardew_valley/regions.py @@ -239,7 +239,7 @@ vanilla_connections = [ ConnectionData(Entrance.mountain_to_tent, Region.tent, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ConnectionData(Entrance.mountain_to_leo_treehouse, Region.leo_treehouse, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA | RandomizationFlag.GINGER_ISLAND), + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA | RandomizationFlag.GINGER_ISLAND), ConnectionData(Entrance.mountain_to_carpenter_shop, Region.carpenter, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ConnectionData(Entrance.mountain_to_maru_room, Region.maru_room, diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 93d45f9b..69d0688a 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -211,7 +211,8 @@ def set_entrance_rules(logic, multi_world, player, world_options: StardewOptions MultiWorldRules.set_rule(multi_world.get_entrance(Entrance.enter_wizard_basement, player), logic.has_relationship(NPC.wizard, 4)) MultiWorldRules.set_rule(multi_world.get_entrance(Entrance.mountain_to_leo_treehouse, player), - logic.has_relationship(NPC.leo, 6) & logic.can_reach_region(Region.island_south)) + logic.has_relationship(NPC.leo, 6) & logic.can_reach_region(Region.island_south) & + logic.can_reach_region(Region.island_east) & logic.can_reach_region(Region.leo_hut)) if ModNames.alec in world_options[options.Mods]: MultiWorldRules.set_rule(multi_world.get_entrance(AlecEntrance.petshop_to_bedroom, player), (logic.has_relationship(ModNPC.alec, 2) | magic.can_blink(logic)).simplify()) diff --git a/worlds/stardew_valley/test/TestRegions.py b/worlds/stardew_valley/test/TestRegions.py index 8045e336..293ce72d 100644 --- a/worlds/stardew_valley/test/TestRegions.py +++ b/worlds/stardew_valley/test/TestRegions.py @@ -2,7 +2,8 @@ import random import sys import unittest -from .. import StardewOptions, options +from . import SVTestBase, setup_solo_multiworld +from .. import StardewOptions, options, StardewValleyWorld from ..regions import vanilla_regions, vanilla_connections, randomize_connections, RandomizationFlag connections_by_name = {connection.name for connection in vanilla_connections} @@ -47,9 +48,9 @@ class TestEntranceRando(unittest.TestCase): connection_in_randomized = connection.name in randomized_connections reverse_in_randomized = connection.reverse in randomized_connections self.assertTrue(connection_in_randomized, - f"Connection {connection.name} should be randomized but it is not in the output. Seed = {seed}") + f"Connection {connection.name} should be randomized but it is not in the output. Seed = {seed}") self.assertTrue(reverse_in_randomized, - f"Connection {connection.reverse} should be randomized but it is not in the output. Seed = {seed}") + f"Connection {connection.reverse} should be randomized but it is not in the output. Seed = {seed}") self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), f"Connections are duplicated in randomization. Seed = {seed}") @@ -71,9 +72,9 @@ class TestEntranceRando(unittest.TestCase): if flag in connection.flag: if RandomizationFlag.GINGER_ISLAND in connection.flag: self.assertNotIn(connection.name, randomized_connections, - f"Connection {connection.name} should not be randomized but it is in the output. Seed = {seed}") + f"Connection {connection.name} should not be randomized but it is in the output. Seed = {seed}") self.assertNotIn(connection.reverse, randomized_connections, - f"Connection {connection.reverse} should not be randomized but it is in the output. Seed = {seed}") + f"Connection {connection.reverse} should not be randomized but it is in the output. Seed = {seed}") else: self.assertIn(connection.name, randomized_connections, f"Connection {connection.name} should be randomized but it is not in the output. Seed = {seed}") @@ -82,3 +83,23 @@ class TestEntranceRando(unittest.TestCase): self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), f"Connections are duplicated in randomization. Seed = {seed}") + + +class TestEntranceClassifications(SVTestBase): + + def test_non_progression_are_all_accessible_with_empty_inventory(self): + for option, flag in [(options.EntranceRandomization.option_pelican_town, RandomizationFlag.PELICAN_TOWN), + (options.EntranceRandomization.option_non_progression, RandomizationFlag.NON_PROGRESSION)]: + seed = random.randrange(sys.maxsize) + with self.subTest(flag=flag, msg=f"Seed: {seed}"): + multiworld_options = {options.EntranceRandomization.internal_name: option} + multiworld = setup_solo_multiworld(multiworld_options, seed) + sv_world: StardewValleyWorld = multiworld.worlds[1] + ap_entrances = {entrance.name: entrance for entrance in multiworld.get_entrances()} + for randomized_entrance in sv_world.randomized_entrances: + if randomized_entrance in ap_entrances: + ap_entrance_origin = ap_entrances[randomized_entrance] + self.assertTrue(ap_entrance_origin.access_rule(multiworld.state)) + if sv_world.randomized_entrances[randomized_entrance] in ap_entrances: + ap_entrance_destination = multiworld.get_entrance(sv_world.randomized_entrances[randomized_entrance], 1) + self.assertTrue(ap_entrance_destination.access_rule(multiworld.state))