Stardew Valley: Fixed Leo's Treehouse being randomized too aggressively (#1992)
* - Fixed Leo's Treehouse being randomized too aggressively * - Added an automated test to catch badly tagged Non-progression entrances * - Fixed a logic issue with Void Mayonnaise not being fishable * - Removed unused import
This commit is contained in:
parent
ca46a64abc
commit
257774c31b
|
@ -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),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue