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:
agilbert1412 2023-07-19 19:20:52 -04:00 committed by GitHub
parent ca46a64abc
commit 257774c31b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 8 deletions

View File

@ -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),

View File

@ -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,

View File

@ -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())

View File

@ -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))