Stardew Valley: Remove some events for a slight performance increase (#4085)

This commit is contained in:
Jouramie 2024-11-29 14:41:26 -05:00 committed by GitHub
parent d36c983461
commit ed4e44b994
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 48 additions and 76 deletions

View File

@ -206,25 +206,10 @@ class StardewValleyWorld(World):
self.multiworld.push_precollected(self.create_starting_item("Progressive Coop")) self.multiworld.push_precollected(self.create_starting_item("Progressive Coop"))
def setup_player_events(self): def setup_player_events(self):
self.setup_construction_events()
self.setup_quest_events()
self.setup_action_events() self.setup_action_events()
self.setup_logic_events() self.setup_logic_events()
def setup_construction_events(self):
can_construct_buildings = LocationData(None, RegionName.carpenter, Event.can_construct_buildings)
self.create_event_location(can_construct_buildings, True_(), Event.can_construct_buildings)
def setup_quest_events(self):
start_dark_talisman_quest = LocationData(None, RegionName.railroad, Event.start_dark_talisman_quest)
self.create_event_location(start_dark_talisman_quest, self.logic.wallet.has_rusty_key(), Event.start_dark_talisman_quest)
def setup_action_events(self): def setup_action_events(self):
can_ship_event = LocationData(None, LogicRegion.shipping, Event.can_ship_items)
self.create_event_location(can_ship_event, true_, Event.can_ship_items)
can_shop_pierre_event = LocationData(None, RegionName.pierre_store, Event.can_shop_at_pierre)
self.create_event_location(can_shop_pierre_event, true_, Event.can_shop_at_pierre)
spring_farming = LocationData(None, LogicRegion.spring_farming, Event.spring_farming) spring_farming = LocationData(None, LogicRegion.spring_farming, Event.spring_farming)
self.create_event_location(spring_farming, true_, Event.spring_farming) self.create_event_location(spring_farming, true_, Event.spring_farming)
summer_farming = LocationData(None, LogicRegion.summer_farming, Event.summer_farming) summer_farming = LocationData(None, LogicRegion.summer_farming, Event.summer_farming)

View File

@ -1,3 +1,4 @@
from functools import cached_property
from typing import Dict, Union from typing import Dict, Union
from Utils import cache_self1 from Utils import cache_self1
@ -8,12 +9,12 @@ from .received_logic import ReceivedLogicMixin
from .region_logic import RegionLogicMixin from .region_logic import RegionLogicMixin
from ..options import BuildingProgression from ..options import BuildingProgression
from ..stardew_rule import StardewRule, True_, False_, Has from ..stardew_rule import StardewRule, True_, False_, Has
from ..strings.ap_names.event_names import Event
from ..strings.artisan_good_names import ArtisanGood from ..strings.artisan_good_names import ArtisanGood
from ..strings.building_names import Building from ..strings.building_names import Building
from ..strings.fish_names import WaterItem from ..strings.fish_names import WaterItem
from ..strings.material_names import Material from ..strings.material_names import Material
from ..strings.metal_names import MetalBar from ..strings.metal_names import MetalBar
from ..strings.region_names import Region
has_group = "building" has_group = "building"
@ -60,7 +61,7 @@ class BuildingLogic(BaseLogic[Union[BuildingLogicMixin, MoneyLogicMixin, RegionL
return True_() return True_()
return self.logic.received(building) return self.logic.received(building)
carpenter_rule = self.logic.received(Event.can_construct_buildings) carpenter_rule = self.logic.building.can_construct_buildings
if not self.options.building_progression & BuildingProgression.option_progressive: if not self.options.building_progression & BuildingProgression.option_progressive:
return Has(building, self.registry.building_rules, has_group) & carpenter_rule return Has(building, self.registry.building_rules, has_group) & carpenter_rule
@ -75,6 +76,10 @@ class BuildingLogic(BaseLogic[Union[BuildingLogicMixin, MoneyLogicMixin, RegionL
building = " ".join(["Progressive", *building.split(" ")[1:]]) building = " ".join(["Progressive", *building.split(" ")[1:]])
return self.logic.received(building, count) & carpenter_rule return self.logic.received(building, count) & carpenter_rule
@cached_property
def can_construct_buildings(self) -> StardewRule:
return self.logic.region.can_reach(Region.carpenter)
@cache_self1 @cache_self1
def has_house(self, upgrade_level: int) -> StardewRule: def has_house(self, upgrade_level: int) -> StardewRule:
if upgrade_level < 1: if upgrade_level < 1:
@ -83,7 +88,7 @@ class BuildingLogic(BaseLogic[Union[BuildingLogicMixin, MoneyLogicMixin, RegionL
if upgrade_level > 3: if upgrade_level > 3:
return False_() return False_()
carpenter_rule = self.logic.received(Event.can_construct_buildings) carpenter_rule = self.logic.building.can_construct_buildings
if self.options.building_progression & BuildingProgression.option_progressive: if self.options.building_progression & BuildingProgression.option_progressive:
return carpenter_rule & self.logic.received(f"Progressive House", upgrade_level) return carpenter_rule & self.logic.received(f"Progressive House", upgrade_level)

View File

@ -1,3 +1,4 @@
import typing
from typing import Union from typing import Union
from Utils import cache_self1 from Utils import cache_self1
@ -11,10 +12,14 @@ from .time_logic import TimeLogicMixin
from ..data.shop import ShopSource from ..data.shop import ShopSource
from ..options import SpecialOrderLocations from ..options import SpecialOrderLocations
from ..stardew_rule import StardewRule, True_, HasProgressionPercent, False_, true_ from ..stardew_rule import StardewRule, True_, HasProgressionPercent, False_, true_
from ..strings.ap_names.event_names import Event
from ..strings.currency_names import Currency from ..strings.currency_names import Currency
from ..strings.region_names import Region, LogicRegion from ..strings.region_names import Region, LogicRegion
if typing.TYPE_CHECKING:
from .shipping_logic import ShippingLogicMixin
assert ShippingLogicMixin
qi_gem_rewards = ("100 Qi Gems", "50 Qi Gems", "40 Qi Gems", "35 Qi Gems", "25 Qi Gems", qi_gem_rewards = ("100 Qi Gems", "50 Qi Gems", "40 Qi Gems", "35 Qi Gems", "25 Qi Gems",
"20 Qi Gems", "15 Qi Gems", "10 Qi Gems") "20 Qi Gems", "15 Qi Gems", "10 Qi Gems")
@ -26,7 +31,7 @@ class MoneyLogicMixin(BaseLogicMixin):
class MoneyLogic(BaseLogic[Union[RegionLogicMixin, MoneyLogicMixin, TimeLogicMixin, RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin, SeasonLogicMixin, class MoneyLogic(BaseLogic[Union[RegionLogicMixin, MoneyLogicMixin, TimeLogicMixin, RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin, SeasonLogicMixin,
GrindLogicMixin]]): GrindLogicMixin, 'ShippingLogicMixin']]):
@cache_self1 @cache_self1
def can_have_earned_total(self, amount: int) -> StardewRule: def can_have_earned_total(self, amount: int) -> StardewRule:
@ -37,7 +42,7 @@ GrindLogicMixin]]):
willy_rule = self.logic.region.can_reach_all((Region.fish_shop, LogicRegion.fishing)) willy_rule = self.logic.region.can_reach_all((Region.fish_shop, LogicRegion.fishing))
clint_rule = self.logic.region.can_reach_all((Region.blacksmith, Region.mines_floor_5)) clint_rule = self.logic.region.can_reach_all((Region.blacksmith, Region.mines_floor_5))
robin_rule = self.logic.region.can_reach_all((Region.carpenter, Region.secret_woods)) robin_rule = self.logic.region.can_reach_all((Region.carpenter, Region.secret_woods))
shipping_rule = self.logic.received(Event.can_ship_items) shipping_rule = self.logic.shipping.can_use_shipping_bin
if amount < 2000: if amount < 2000:
selling_any_rule = pierre_rule | willy_rule | clint_rule | robin_rule | shipping_rule selling_any_rule = pierre_rule | willy_rule | clint_rule | robin_rule | shipping_rule
@ -50,7 +55,7 @@ GrindLogicMixin]]):
if amount < 10000: if amount < 10000:
return shipping_rule return shipping_rule
seed_rules = self.logic.received(Event.can_shop_at_pierre) seed_rules = self.logic.region.can_reach(Region.pierre_store)
if amount < 40000: if amount < 40000:
return shipping_rule & seed_rules return shipping_rule & seed_rules

View File

@ -11,7 +11,6 @@ from ..locations import LocationTags, locations_by_tag
from ..options import ExcludeGingerIsland, Shipsanity from ..options import ExcludeGingerIsland, Shipsanity
from ..options import SpecialOrderLocations from ..options import SpecialOrderLocations
from ..stardew_rule import StardewRule from ..stardew_rule import StardewRule
from ..strings.ap_names.event_names import Event
from ..strings.building_names import Building from ..strings.building_names import Building
@ -29,7 +28,7 @@ class ShippingLogic(BaseLogic[Union[ReceivedLogicMixin, ShippingLogicMixin, Buil
@cache_self1 @cache_self1
def can_ship(self, item: str) -> StardewRule: def can_ship(self, item: str) -> StardewRule:
return self.logic.received(Event.can_ship_items) & self.logic.has(item) return self.logic.shipping.can_use_shipping_bin & self.logic.has(item)
def can_ship_everything(self) -> StardewRule: def can_ship_everything(self) -> StardewRule:
shipsanity_prefix = "Shipsanity: " shipsanity_prefix = "Shipsanity: "
@ -49,7 +48,7 @@ class ShippingLogic(BaseLogic[Union[ReceivedLogicMixin, ShippingLogicMixin, Buil
def can_ship_everything_in_slot(self, all_location_names_in_slot: List[str]) -> StardewRule: def can_ship_everything_in_slot(self, all_location_names_in_slot: List[str]) -> StardewRule:
if self.options.shipsanity == Shipsanity.option_none: if self.options.shipsanity == Shipsanity.option_none:
return self.can_ship_everything() return self.logic.shipping.can_ship_everything()
rules = [self.logic.building.has_building(Building.shipping_bin)] rules = [self.logic.building.has_building(Building.shipping_bin)]

View File

@ -21,7 +21,6 @@ from ..content.vanilla.ginger_island import ginger_island_content_pack
from ..content.vanilla.qi_board import qi_board_content_pack from ..content.vanilla.qi_board import qi_board_content_pack
from ..stardew_rule import StardewRule, Has, false_ from ..stardew_rule import StardewRule, Has, false_
from ..strings.animal_product_names import AnimalProduct from ..strings.animal_product_names import AnimalProduct
from ..strings.ap_names.event_names import Event
from ..strings.ap_names.transport_names import Transportation from ..strings.ap_names.transport_names import Transportation
from ..strings.artisan_good_names import ArtisanGood from ..strings.artisan_good_names import ArtisanGood
from ..strings.crop_names import Vegetable, Fruit from ..strings.crop_names import Vegetable, Fruit
@ -61,7 +60,7 @@ AbilityLogicMixin, SpecialOrderLogicMixin, MonsterLogicMixin]]):
SpecialOrder.gifts_for_george: self.logic.season.has(Season.spring) & self.logic.has(Forageable.leek), SpecialOrder.gifts_for_george: self.logic.season.has(Season.spring) & self.logic.has(Forageable.leek),
SpecialOrder.fragments_of_the_past: self.logic.monster.can_kill(Monster.skeleton), SpecialOrder.fragments_of_the_past: self.logic.monster.can_kill(Monster.skeleton),
SpecialOrder.gus_famous_omelet: self.logic.has(AnimalProduct.any_egg), SpecialOrder.gus_famous_omelet: self.logic.has(AnimalProduct.any_egg),
SpecialOrder.crop_order: self.logic.ability.can_farm_perfectly() & self.logic.received(Event.can_ship_items), SpecialOrder.crop_order: self.logic.ability.can_farm_perfectly() & self.logic.shipping.can_use_shipping_bin,
SpecialOrder.community_cleanup: self.logic.skill.can_crab_pot, SpecialOrder.community_cleanup: self.logic.skill.can_crab_pot,
SpecialOrder.the_strong_stuff: self.logic.has(ArtisanGood.specific_juice(Vegetable.potato)), SpecialOrder.the_strong_stuff: self.logic.has(ArtisanGood.specific_juice(Vegetable.potato)),
SpecialOrder.pierres_prime_produce: self.logic.ability.can_farm_perfectly(), SpecialOrder.pierres_prime_produce: self.logic.ability.can_farm_perfectly(),
@ -94,12 +93,12 @@ AbilityLogicMixin, SpecialOrderLogicMixin, MonsterLogicMixin]]):
self.update_rules({ self.update_rules({
SpecialOrder.qis_crop: self.logic.ability.can_farm_perfectly() & self.logic.region.can_reach(Region.greenhouse) & SpecialOrder.qis_crop: self.logic.ability.can_farm_perfectly() & self.logic.region.can_reach(Region.greenhouse) &
self.logic.region.can_reach(Region.island_west) & self.logic.skill.has_total_level(50) & self.logic.region.can_reach(Region.island_west) & self.logic.skill.has_total_level(50) &
self.logic.has(Machine.seed_maker) & self.logic.received(Event.can_ship_items), self.logic.has(Machine.seed_maker) & self.logic.shipping.can_use_shipping_bin,
SpecialOrder.lets_play_a_game: self.logic.arcade.has_junimo_kart_max_level(), SpecialOrder.lets_play_a_game: self.logic.arcade.has_junimo_kart_max_level(),
SpecialOrder.four_precious_stones: self.logic.time.has_lived_max_months & self.logic.has("Prismatic Shard") & SpecialOrder.four_precious_stones: self.logic.time.has_lived_max_months & self.logic.has("Prismatic Shard") &
self.logic.ability.can_mine_perfectly_in_the_skull_cavern(), self.logic.ability.can_mine_perfectly_in_the_skull_cavern(),
SpecialOrder.qis_hungry_challenge: self.logic.ability.can_mine_perfectly_in_the_skull_cavern(), SpecialOrder.qis_hungry_challenge: self.logic.ability.can_mine_perfectly_in_the_skull_cavern(),
SpecialOrder.qis_cuisine: self.logic.cooking.can_cook() & self.logic.received(Event.can_ship_items) & SpecialOrder.qis_cuisine: self.logic.cooking.can_cook() & self.logic.shipping.can_use_shipping_bin &
(self.logic.money.can_spend_at(Region.saloon, 205000) | self.logic.money.can_spend_at(Region.pierre_store, 170000)), (self.logic.money.can_spend_at(Region.saloon, 205000) | self.logic.money.can_spend_at(Region.pierre_store, 170000)),
SpecialOrder.qis_kindness: self.logic.relationship.can_give_loved_gifts_to_everyone(), SpecialOrder.qis_kindness: self.logic.relationship.can_give_loved_gifts_to_everyone(),
SpecialOrder.extended_family: self.logic.ability.can_fish_perfectly() & self.logic.has(Fish.angler) & self.logic.has(Fish.glacierfish) & SpecialOrder.extended_family: self.logic.ability.can_fish_perfectly() & self.logic.has(Fish.angler) & self.logic.has(Fish.glacierfish) &

View File

@ -27,7 +27,6 @@ from .stardew_rule.indirect_connection import look_for_indirect_connection
from .stardew_rule.rule_explain import explain from .stardew_rule.rule_explain import explain
from .strings.ap_names.ap_option_names import OptionName from .strings.ap_names.ap_option_names import OptionName
from .strings.ap_names.community_upgrade_names import CommunityUpgrade from .strings.ap_names.community_upgrade_names import CommunityUpgrade
from .strings.ap_names.event_names import Event
from .strings.ap_names.mods.mod_items import SVEQuestItem, SVERunes from .strings.ap_names.mods.mod_items import SVEQuestItem, SVERunes
from .strings.ap_names.transport_names import Transportation from .strings.ap_names.transport_names import Transportation
from .strings.artisan_good_names import ArtisanGood from .strings.artisan_good_names import ArtisanGood
@ -251,7 +250,8 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S
set_entrance_rule(multiworld, player, Entrance.enter_witch_warp_cave, logic.quest.has_dark_talisman() | (logic.mod.magic.can_blink())) set_entrance_rule(multiworld, player, Entrance.enter_witch_warp_cave, logic.quest.has_dark_talisman() | (logic.mod.magic.can_blink()))
set_entrance_rule(multiworld, player, Entrance.enter_witch_hut, (logic.has(ArtisanGood.void_mayonnaise) | logic.mod.magic.can_blink())) set_entrance_rule(multiworld, player, Entrance.enter_witch_hut, (logic.has(ArtisanGood.void_mayonnaise) | logic.mod.magic.can_blink()))
set_entrance_rule(multiworld, player, Entrance.enter_mutant_bug_lair, set_entrance_rule(multiworld, player, Entrance.enter_mutant_bug_lair,
(logic.received(Event.start_dark_talisman_quest) & logic.relationship.can_meet(NPC.krobus)) | logic.mod.magic.can_blink()) (logic.wallet.has_rusty_key() & logic.region.can_reach(Region.railroad) & logic.relationship.can_meet(
NPC.krobus)) | logic.mod.magic.can_blink())
set_entrance_rule(multiworld, player, Entrance.enter_casino, logic.quest.has_club_card()) set_entrance_rule(multiworld, player, Entrance.enter_casino, logic.quest.has_club_card())
set_bedroom_entrance_rules(logic, multiworld, player, world_options) set_bedroom_entrance_rules(logic, multiworld, player, world_options)
@ -307,8 +307,7 @@ def set_mines_floor_entrance_rules(logic, multiworld, player):
rule = logic.mine.has_mine_elevator_to_floor(floor - 10) rule = logic.mine.has_mine_elevator_to_floor(floor - 10)
if floor == 5 or floor == 45 or floor == 85: if floor == 5 or floor == 45 or floor == 85:
rule = rule & logic.mine.can_progress_in_the_mines_from_floor(floor) rule = rule & logic.mine.can_progress_in_the_mines_from_floor(floor)
entrance = multiworld.get_entrance(dig_to_mines_floor(floor), player) set_entrance_rule(multiworld, player, dig_to_mines_floor(floor), rule)
MultiWorldRules.set_rule(entrance, rule)
def set_skull_cavern_floor_entrance_rules(logic, multiworld, player): def set_skull_cavern_floor_entrance_rules(logic, multiworld, player):
@ -316,8 +315,7 @@ def set_skull_cavern_floor_entrance_rules(logic, multiworld, player):
rule = logic.mod.elevator.has_skull_cavern_elevator_to_floor(floor - 25) rule = logic.mod.elevator.has_skull_cavern_elevator_to_floor(floor - 25)
if floor == 25 or floor == 75 or floor == 125: if floor == 25 or floor == 75 or floor == 125:
rule = rule & logic.mine.can_progress_in_the_skull_cavern_from_floor(floor) rule = rule & logic.mine.can_progress_in_the_skull_cavern_from_floor(floor)
entrance = multiworld.get_entrance(dig_to_skull_floor(floor), player) set_entrance_rule(multiworld, player, dig_to_skull_floor(floor), rule)
MultiWorldRules.set_rule(entrance, rule)
def set_blacksmith_entrance_rules(logic, multiworld, player): def set_blacksmith_entrance_rules(logic, multiworld, player):
@ -346,9 +344,8 @@ def set_skill_entrance_rules(logic, multiworld, player, world_options: StardewVa
def set_blacksmith_upgrade_rule(logic, multiworld, player, entrance_name: str, item_name: str, tool_material: str): def set_blacksmith_upgrade_rule(logic, multiworld, player, entrance_name: str, item_name: str, tool_material: str):
material_entrance = multiworld.get_entrance(entrance_name, player)
upgrade_rule = logic.has(item_name) & logic.money.can_spend(tool_upgrade_prices[tool_material]) upgrade_rule = logic.has(item_name) & logic.money.can_spend(tool_upgrade_prices[tool_material])
MultiWorldRules.set_rule(material_entrance, upgrade_rule) set_entrance_rule(multiworld, player, entrance_name, upgrade_rule)
def set_festival_entrance_rules(logic, multiworld, player): def set_festival_entrance_rules(logic, multiworld, player):
@ -880,25 +877,19 @@ def set_traveling_merchant_day_rules(logic: StardewLogic, multiworld: MultiWorld
def set_arcade_machine_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions): def set_arcade_machine_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions):
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.play_junimo_kart, player), play_junimo_kart_rule = logic.received(Wallet.skull_key)
logic.received(Wallet.skull_key))
if world_options.arcade_machine_locations != ArcadeMachineLocations.option_full_shuffling: if world_options.arcade_machine_locations != ArcadeMachineLocations.option_full_shuffling:
set_entrance_rule(multiworld, player, Entrance.play_junimo_kart, play_junimo_kart_rule)
return return
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.play_junimo_kart, player), set_entrance_rule(multiworld, player, Entrance.play_junimo_kart, play_junimo_kart_rule & logic.has("Junimo Kart Small Buff"))
logic.has("Junimo Kart Small Buff")) set_entrance_rule(multiworld, player, Entrance.reach_junimo_kart_2, logic.has("Junimo Kart Medium Buff"))
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_junimo_kart_2, player), set_entrance_rule(multiworld, player, Entrance.reach_junimo_kart_3, logic.has("Junimo Kart Big Buff"))
logic.has("Junimo Kart Medium Buff")) set_entrance_rule(multiworld, player, Entrance.reach_junimo_kart_4, logic.has("Junimo Kart Max Buff"))
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_junimo_kart_3, player), set_entrance_rule(multiworld, player, Entrance.play_journey_of_the_prairie_king, logic.has("JotPK Small Buff"))
logic.has("Junimo Kart Big Buff")) set_entrance_rule(multiworld, player, Entrance.reach_jotpk_world_2, logic.has("JotPK Medium Buff"))
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_junimo_kart_4, player), set_entrance_rule(multiworld, player, Entrance.reach_jotpk_world_3, logic.has("JotPK Big Buff"))
logic.has("Junimo Kart Max Buff"))
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.play_journey_of_the_prairie_king, player),
logic.has("JotPK Small Buff"))
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_jotpk_world_2, player),
logic.has("JotPK Medium Buff"))
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_jotpk_world_3, player),
logic.has("JotPK Big Buff"))
MultiWorldRules.add_rule(multiworld.get_location("Journey of the Prairie King Victory", player), MultiWorldRules.add_rule(multiworld.get_location("Journey of the Prairie King Victory", player),
logic.has("JotPK Max Buff")) logic.has("JotPK Max Buff"))
@ -1049,6 +1040,7 @@ def set_entrance_rule(multiworld, player, entrance: str, rule: StardewRule):
potentially_required_regions = look_for_indirect_connection(rule) potentially_required_regions = look_for_indirect_connection(rule)
if potentially_required_regions: if potentially_required_regions:
for region in potentially_required_regions: for region in potentially_required_regions:
logger.debug(f"Registering indirect condition for {region} -> {entrance}")
multiworld.register_indirect_condition(multiworld.get_region(region, player), multiworld.get_entrance(entrance, player)) multiworld.register_indirect_condition(multiworld.get_region(region, player), multiworld.get_entrance(entrance, player))
MultiWorldRules.set_rule(multiworld.get_entrance(entrance, player), rule) MultiWorldRules.set_rule(multiworld.get_entrance(entrance, player), rule)

View File

@ -4,7 +4,7 @@ from dataclasses import dataclass, field
from functools import cached_property, singledispatch from functools import cached_property, singledispatch
from typing import Iterable, Set, Tuple, List, Optional from typing import Iterable, Set, Tuple, List, Optional
from BaseClasses import CollectionState from BaseClasses import CollectionState, Location, Entrance
from worlds.generic.Rules import CollectionRule from worlds.generic.Rules import CollectionRule
from . import StardewRule, AggregatingStardewRule, Count, Has, TotalReceived, Received, Reach, true_ from . import StardewRule, AggregatingStardewRule, Count, Has, TotalReceived, Received, Reach, true_
@ -12,10 +12,10 @@ from . import StardewRule, AggregatingStardewRule, Count, Has, TotalReceived, Re
@dataclass @dataclass
class RuleExplanation: class RuleExplanation:
rule: StardewRule rule: StardewRule
state: CollectionState state: CollectionState = field(repr=False, hash=False)
expected: bool expected: bool
sub_rules: Iterable[StardewRule] = field(default_factory=list) sub_rules: Iterable[StardewRule] = field(default_factory=list)
explored_rules_key: Set[Tuple[str, str]] = field(default_factory=set) explored_rules_key: Set[Tuple[str, str]] = field(default_factory=set, repr=False, hash=False)
current_rule_explored: bool = False current_rule_explored: bool = False
def __post_init__(self): def __post_init__(self):
@ -38,13 +38,6 @@ class RuleExplanation:
if i.result is not self.expected else i.summary(depth + 1) if i.result is not self.expected else i.summary(depth + 1)
for i in sorted(self.explained_sub_rules, key=lambda x: x.result)) for i in sorted(self.explained_sub_rules, key=lambda x: x.result))
def __repr__(self, depth=0):
if not self.sub_rules:
return self.summary(depth)
return self.summary(depth) + "\n" + "\n".join(i.__repr__(depth + 1)
for i in sorted(self.explained_sub_rules, key=lambda x: x.result))
@cached_property @cached_property
def result(self) -> bool: def result(self) -> bool:
try: try:
@ -134,6 +127,10 @@ def _(rule: Reach, state: CollectionState, expected: bool, explored_spots: Set[T
access_rules = [Reach(spot.parent_region.name, "Region", rule.player)] access_rules = [Reach(spot.parent_region.name, "Region", rule.player)]
else: else:
access_rules = [spot.access_rule, Reach(spot.parent_region.name, "Region", rule.player)] access_rules = [spot.access_rule, Reach(spot.parent_region.name, "Region", rule.player)]
elif spot.access_rule == Location.access_rule:
# Sometime locations just don't have an access rule and all the relevant logic is in the parent region.
access_rules = [Reach(spot.parent_region.name, "Region", rule.player)]
elif rule.resolution_hint == 'Entrance': elif rule.resolution_hint == 'Entrance':
spot = state.multiworld.get_entrance(rule.spot, rule.player) spot = state.multiworld.get_entrance(rule.spot, rule.player)
@ -143,6 +140,9 @@ def _(rule: Reach, state: CollectionState, expected: bool, explored_spots: Set[T
access_rules = [Reach(spot.parent_region.name, "Region", rule.player)] access_rules = [Reach(spot.parent_region.name, "Region", rule.player)]
else: else:
access_rules = [spot.access_rule, Reach(spot.parent_region.name, "Region", rule.player)] access_rules = [spot.access_rule, Reach(spot.parent_region.name, "Region", rule.player)]
elif spot.access_rule == Entrance.access_rule:
# Sometime entrances just don't have an access rule and all the relevant logic is in the parent region.
access_rules = [Reach(spot.parent_region.name, "Region", rule.player)]
else: else:
spot = state.multiworld.get_region(rule.spot, rule.player) spot = state.multiworld.get_region(rule.spot, rule.player)

View File

@ -8,10 +8,6 @@ def event(name: str):
class Event: class Event:
victory = event("Victory") victory = event("Victory")
can_construct_buildings = event("Can Construct Buildings")
start_dark_talisman_quest = event("Start Dark Talisman Quest")
can_ship_items = event("Can Ship Items")
can_shop_at_pierre = event("Can Shop At Pierre's")
spring_farming = event("Spring Farming") spring_farming = event("Spring Farming")
summer_farming = event("Summer Farming") summer_farming = event("Summer Farming")
fall_farming = event("Fall Farming") fall_farming = event("Fall Farming")

View File

@ -23,10 +23,6 @@ class TestBuildingLogic(SVTestBase):
self.assertFalse(big_coop_blueprint_rule(self.multiworld.state), self.assertFalse(big_coop_blueprint_rule(self.multiworld.state),
f"Rule is {repr(self.multiworld.get_location('Big Coop Blueprint', self.player).access_rule)}") f"Rule is {repr(self.multiworld.get_location('Big Coop Blueprint', self.player).access_rule)}")
self.multiworld.state.collect(self.create_item("Can Construct Buildings"), prevent_sweep=True)
self.assertFalse(big_coop_blueprint_rule(self.multiworld.state),
f"Rule is {repr(self.multiworld.get_location('Big Coop Blueprint', self.player).access_rule)}")
self.multiworld.state.collect(self.create_item("Progressive Coop"), prevent_sweep=False) self.multiworld.state.collect(self.create_item("Progressive Coop"), prevent_sweep=False)
self.assertTrue(big_coop_blueprint_rule(self.multiworld.state), self.assertTrue(big_coop_blueprint_rule(self.multiworld.state),
f"Rule is {repr(self.multiworld.get_location('Big Coop Blueprint', self.player).access_rule)}") f"Rule is {repr(self.multiworld.get_location('Big Coop Blueprint', self.player).access_rule)}")
@ -35,7 +31,6 @@ class TestBuildingLogic(SVTestBase):
self.assertFalse(self.world.logic.region.can_reach_location("Deluxe Coop Blueprint")(self.multiworld.state)) self.assertFalse(self.world.logic.region.can_reach_location("Deluxe Coop Blueprint")(self.multiworld.state))
self.collect_lots_of_money() self.collect_lots_of_money()
self.multiworld.state.collect(self.create_item("Can Construct Buildings"), prevent_sweep=True)
self.assertFalse(self.world.logic.region.can_reach_location("Deluxe Coop Blueprint")(self.multiworld.state)) self.assertFalse(self.world.logic.region.can_reach_location("Deluxe Coop Blueprint")(self.multiworld.state))
self.multiworld.state.collect(self.create_item("Progressive Coop"), prevent_sweep=True) self.multiworld.state.collect(self.create_item("Progressive Coop"), prevent_sweep=True)
@ -53,10 +48,6 @@ class TestBuildingLogic(SVTestBase):
self.assertFalse(big_shed_rule(self.multiworld.state), self.assertFalse(big_shed_rule(self.multiworld.state),
f"Rule is {repr(self.multiworld.get_location('Big Shed Blueprint', self.player).access_rule)}") f"Rule is {repr(self.multiworld.get_location('Big Shed Blueprint', self.player).access_rule)}")
self.multiworld.state.collect(self.create_item("Can Construct Buildings"), prevent_sweep=True)
self.assertFalse(big_shed_rule(self.multiworld.state),
f"Rule is {repr(self.multiworld.get_location('Big Shed Blueprint', self.player).access_rule)}")
self.multiworld.state.collect(self.create_item("Progressive Shed"), prevent_sweep=True) self.multiworld.state.collect(self.create_item("Progressive Shed"), prevent_sweep=True)
self.assertTrue(big_shed_rule(self.multiworld.state), self.assertTrue(big_shed_rule(self.multiworld.state),
f"Rule is {repr(self.multiworld.get_location('Big Shed Blueprint', self.player).access_rule)}") f"Rule is {repr(self.multiworld.get_location('Big Shed Blueprint', self.player).access_rule)}")