Skip to content

Commit ed4e44b

Browse files
authored
Stardew Valley: Remove some events for a slight performance increase (ArchipelagoMW#4085)
1 parent d36c983 commit ed4e44b

File tree

9 files changed

+48
-76
lines changed

9 files changed

+48
-76
lines changed

worlds/stardew_valley/__init__.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -206,25 +206,10 @@ def precollect_farm_type_items(self):
206206
self.multiworld.push_precollected(self.create_starting_item("Progressive Coop"))
207207

208208
def setup_player_events(self):
209-
self.setup_construction_events()
210-
self.setup_quest_events()
211209
self.setup_action_events()
212210
self.setup_logic_events()
213211

214-
def setup_construction_events(self):
215-
can_construct_buildings = LocationData(None, RegionName.carpenter, Event.can_construct_buildings)
216-
self.create_event_location(can_construct_buildings, True_(), Event.can_construct_buildings)
217-
218-
def setup_quest_events(self):
219-
start_dark_talisman_quest = LocationData(None, RegionName.railroad, Event.start_dark_talisman_quest)
220-
self.create_event_location(start_dark_talisman_quest, self.logic.wallet.has_rusty_key(), Event.start_dark_talisman_quest)
221-
222212
def setup_action_events(self):
223-
can_ship_event = LocationData(None, LogicRegion.shipping, Event.can_ship_items)
224-
self.create_event_location(can_ship_event, true_, Event.can_ship_items)
225-
can_shop_pierre_event = LocationData(None, RegionName.pierre_store, Event.can_shop_at_pierre)
226-
self.create_event_location(can_shop_pierre_event, true_, Event.can_shop_at_pierre)
227-
228213
spring_farming = LocationData(None, LogicRegion.spring_farming, Event.spring_farming)
229214
self.create_event_location(spring_farming, true_, Event.spring_farming)
230215
summer_farming = LocationData(None, LogicRegion.summer_farming, Event.summer_farming)

worlds/stardew_valley/logic/building_logic.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from functools import cached_property
12
from typing import Dict, Union
23

34
from Utils import cache_self1
@@ -8,12 +9,12 @@
89
from .region_logic import RegionLogicMixin
910
from ..options import BuildingProgression
1011
from ..stardew_rule import StardewRule, True_, False_, Has
11-
from ..strings.ap_names.event_names import Event
1212
from ..strings.artisan_good_names import ArtisanGood
1313
from ..strings.building_names import Building
1414
from ..strings.fish_names import WaterItem
1515
from ..strings.material_names import Material
1616
from ..strings.metal_names import MetalBar
17+
from ..strings.region_names import Region
1718

1819
has_group = "building"
1920

@@ -60,7 +61,7 @@ def has_building(self, building: str) -> StardewRule:
6061
return True_()
6162
return self.logic.received(building)
6263

63-
carpenter_rule = self.logic.received(Event.can_construct_buildings)
64+
carpenter_rule = self.logic.building.can_construct_buildings
6465
if not self.options.building_progression & BuildingProgression.option_progressive:
6566
return Has(building, self.registry.building_rules, has_group) & carpenter_rule
6667

@@ -75,6 +76,10 @@ def has_building(self, building: str) -> StardewRule:
7576
building = " ".join(["Progressive", *building.split(" ")[1:]])
7677
return self.logic.received(building, count) & carpenter_rule
7778

79+
@cached_property
80+
def can_construct_buildings(self) -> StardewRule:
81+
return self.logic.region.can_reach(Region.carpenter)
82+
7883
@cache_self1
7984
def has_house(self, upgrade_level: int) -> StardewRule:
8085
if upgrade_level < 1:
@@ -83,7 +88,7 @@ def has_house(self, upgrade_level: int) -> StardewRule:
8388
if upgrade_level > 3:
8489
return False_()
8590

86-
carpenter_rule = self.logic.received(Event.can_construct_buildings)
91+
carpenter_rule = self.logic.building.can_construct_buildings
8792
if self.options.building_progression & BuildingProgression.option_progressive:
8893
return carpenter_rule & self.logic.received(f"Progressive House", upgrade_level)
8994

worlds/stardew_valley/logic/money_logic.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import typing
12
from typing import Union
23

34
from Utils import cache_self1
@@ -11,10 +12,14 @@
1112
from ..data.shop import ShopSource
1213
from ..options import SpecialOrderLocations
1314
from ..stardew_rule import StardewRule, True_, HasProgressionPercent, False_, true_
14-
from ..strings.ap_names.event_names import Event
1515
from ..strings.currency_names import Currency
1616
from ..strings.region_names import Region, LogicRegion
1717

18+
if typing.TYPE_CHECKING:
19+
from .shipping_logic import ShippingLogicMixin
20+
21+
assert ShippingLogicMixin
22+
1823
qi_gem_rewards = ("100 Qi Gems", "50 Qi Gems", "40 Qi Gems", "35 Qi Gems", "25 Qi Gems",
1924
"20 Qi Gems", "15 Qi Gems", "10 Qi Gems")
2025

@@ -26,7 +31,7 @@ def __init__(self, *args, **kwargs):
2631

2732

2833
class MoneyLogic(BaseLogic[Union[RegionLogicMixin, MoneyLogicMixin, TimeLogicMixin, RegionLogicMixin, ReceivedLogicMixin, HasLogicMixin, SeasonLogicMixin,
29-
GrindLogicMixin]]):
34+
GrindLogicMixin, 'ShippingLogicMixin']]):
3035

3136
@cache_self1
3237
def can_have_earned_total(self, amount: int) -> StardewRule:
@@ -37,7 +42,7 @@ def can_have_earned_total(self, amount: int) -> StardewRule:
3742
willy_rule = self.logic.region.can_reach_all((Region.fish_shop, LogicRegion.fishing))
3843
clint_rule = self.logic.region.can_reach_all((Region.blacksmith, Region.mines_floor_5))
3944
robin_rule = self.logic.region.can_reach_all((Region.carpenter, Region.secret_woods))
40-
shipping_rule = self.logic.received(Event.can_ship_items)
45+
shipping_rule = self.logic.shipping.can_use_shipping_bin
4146

4247
if amount < 2000:
4348
selling_any_rule = pierre_rule | willy_rule | clint_rule | robin_rule | shipping_rule
@@ -50,7 +55,7 @@ def can_have_earned_total(self, amount: int) -> StardewRule:
5055
if amount < 10000:
5156
return shipping_rule
5257

53-
seed_rules = self.logic.received(Event.can_shop_at_pierre)
58+
seed_rules = self.logic.region.can_reach(Region.pierre_store)
5459
if amount < 40000:
5560
return shipping_rule & seed_rules
5661

worlds/stardew_valley/logic/shipping_logic.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from ..options import ExcludeGingerIsland, Shipsanity
1212
from ..options import SpecialOrderLocations
1313
from ..stardew_rule import StardewRule
14-
from ..strings.ap_names.event_names import Event
1514
from ..strings.building_names import Building
1615

1716

@@ -29,7 +28,7 @@ def can_use_shipping_bin(self) -> StardewRule:
2928

3029
@cache_self1
3130
def can_ship(self, item: str) -> StardewRule:
32-
return self.logic.received(Event.can_ship_items) & self.logic.has(item)
31+
return self.logic.shipping.can_use_shipping_bin & self.logic.has(item)
3332

3433
def can_ship_everything(self) -> StardewRule:
3534
shipsanity_prefix = "Shipsanity: "
@@ -49,7 +48,7 @@ def can_ship_everything(self) -> StardewRule:
4948

5049
def can_ship_everything_in_slot(self, all_location_names_in_slot: List[str]) -> StardewRule:
5150
if self.options.shipsanity == Shipsanity.option_none:
52-
return self.can_ship_everything()
51+
return self.logic.shipping.can_ship_everything()
5352

5453
rules = [self.logic.building.has_building(Building.shipping_bin)]
5554

worlds/stardew_valley/logic/special_order_logic.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from ..content.vanilla.qi_board import qi_board_content_pack
2222
from ..stardew_rule import StardewRule, Has, false_
2323
from ..strings.animal_product_names import AnimalProduct
24-
from ..strings.ap_names.event_names import Event
2524
from ..strings.ap_names.transport_names import Transportation
2625
from ..strings.artisan_good_names import ArtisanGood
2726
from ..strings.crop_names import Vegetable, Fruit
@@ -61,7 +60,7 @@ def initialize_rules(self):
6160
SpecialOrder.gifts_for_george: self.logic.season.has(Season.spring) & self.logic.has(Forageable.leek),
6261
SpecialOrder.fragments_of_the_past: self.logic.monster.can_kill(Monster.skeleton),
6362
SpecialOrder.gus_famous_omelet: self.logic.has(AnimalProduct.any_egg),
64-
SpecialOrder.crop_order: self.logic.ability.can_farm_perfectly() & self.logic.received(Event.can_ship_items),
63+
SpecialOrder.crop_order: self.logic.ability.can_farm_perfectly() & self.logic.shipping.can_use_shipping_bin,
6564
SpecialOrder.community_cleanup: self.logic.skill.can_crab_pot,
6665
SpecialOrder.the_strong_stuff: self.logic.has(ArtisanGood.specific_juice(Vegetable.potato)),
6766
SpecialOrder.pierres_prime_produce: self.logic.ability.can_farm_perfectly(),
@@ -94,12 +93,12 @@ def initialize_rules(self):
9493
self.update_rules({
9594
SpecialOrder.qis_crop: self.logic.ability.can_farm_perfectly() & self.logic.region.can_reach(Region.greenhouse) &
9695
self.logic.region.can_reach(Region.island_west) & self.logic.skill.has_total_level(50) &
97-
self.logic.has(Machine.seed_maker) & self.logic.received(Event.can_ship_items),
96+
self.logic.has(Machine.seed_maker) & self.logic.shipping.can_use_shipping_bin,
9897
SpecialOrder.lets_play_a_game: self.logic.arcade.has_junimo_kart_max_level(),
9998
SpecialOrder.four_precious_stones: self.logic.time.has_lived_max_months & self.logic.has("Prismatic Shard") &
10099
self.logic.ability.can_mine_perfectly_in_the_skull_cavern(),
101100
SpecialOrder.qis_hungry_challenge: self.logic.ability.can_mine_perfectly_in_the_skull_cavern(),
102-
SpecialOrder.qis_cuisine: self.logic.cooking.can_cook() & self.logic.received(Event.can_ship_items) &
101+
SpecialOrder.qis_cuisine: self.logic.cooking.can_cook() & self.logic.shipping.can_use_shipping_bin &
103102
(self.logic.money.can_spend_at(Region.saloon, 205000) | self.logic.money.can_spend_at(Region.pierre_store, 170000)),
104103
SpecialOrder.qis_kindness: self.logic.relationship.can_give_loved_gifts_to_everyone(),
105104
SpecialOrder.extended_family: self.logic.ability.can_fish_perfectly() & self.logic.has(Fish.angler) & self.logic.has(Fish.glacierfish) &

worlds/stardew_valley/rules.py

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
from .stardew_rule.rule_explain import explain
2828
from .strings.ap_names.ap_option_names import OptionName
2929
from .strings.ap_names.community_upgrade_names import CommunityUpgrade
30-
from .strings.ap_names.event_names import Event
3130
from .strings.ap_names.mods.mod_items import SVEQuestItem, SVERunes
3231
from .strings.ap_names.transport_names import Transportation
3332
from .strings.artisan_good_names import ArtisanGood
@@ -251,7 +250,8 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S
251250
set_entrance_rule(multiworld, player, Entrance.enter_witch_warp_cave, logic.quest.has_dark_talisman() | (logic.mod.magic.can_blink()))
252251
set_entrance_rule(multiworld, player, Entrance.enter_witch_hut, (logic.has(ArtisanGood.void_mayonnaise) | logic.mod.magic.can_blink()))
253252
set_entrance_rule(multiworld, player, Entrance.enter_mutant_bug_lair,
254-
(logic.received(Event.start_dark_talisman_quest) & logic.relationship.can_meet(NPC.krobus)) | logic.mod.magic.can_blink())
253+
(logic.wallet.has_rusty_key() & logic.region.can_reach(Region.railroad) & logic.relationship.can_meet(
254+
NPC.krobus)) | logic.mod.magic.can_blink())
255255
set_entrance_rule(multiworld, player, Entrance.enter_casino, logic.quest.has_club_card())
256256

257257
set_bedroom_entrance_rules(logic, multiworld, player, world_options)
@@ -307,17 +307,15 @@ def set_mines_floor_entrance_rules(logic, multiworld, player):
307307
rule = logic.mine.has_mine_elevator_to_floor(floor - 10)
308308
if floor == 5 or floor == 45 or floor == 85:
309309
rule = rule & logic.mine.can_progress_in_the_mines_from_floor(floor)
310-
entrance = multiworld.get_entrance(dig_to_mines_floor(floor), player)
311-
MultiWorldRules.set_rule(entrance, rule)
310+
set_entrance_rule(multiworld, player, dig_to_mines_floor(floor), rule)
312311

313312

314313
def set_skull_cavern_floor_entrance_rules(logic, multiworld, player):
315314
for floor in range(25, 200 + 25, 25):
316315
rule = logic.mod.elevator.has_skull_cavern_elevator_to_floor(floor - 25)
317316
if floor == 25 or floor == 75 or floor == 125:
318317
rule = rule & logic.mine.can_progress_in_the_skull_cavern_from_floor(floor)
319-
entrance = multiworld.get_entrance(dig_to_skull_floor(floor), player)
320-
MultiWorldRules.set_rule(entrance, rule)
318+
set_entrance_rule(multiworld, player, dig_to_skull_floor(floor), rule)
321319

322320

323321
def set_blacksmith_entrance_rules(logic, multiworld, player):
@@ -346,9 +344,8 @@ def set_skill_entrance_rules(logic, multiworld, player, world_options: StardewVa
346344

347345

348346
def set_blacksmith_upgrade_rule(logic, multiworld, player, entrance_name: str, item_name: str, tool_material: str):
349-
material_entrance = multiworld.get_entrance(entrance_name, player)
350347
upgrade_rule = logic.has(item_name) & logic.money.can_spend(tool_upgrade_prices[tool_material])
351-
MultiWorldRules.set_rule(material_entrance, upgrade_rule)
348+
set_entrance_rule(multiworld, player, entrance_name, upgrade_rule)
352349

353350

354351
def set_festival_entrance_rules(logic, multiworld, player):
@@ -880,25 +877,19 @@ def set_traveling_merchant_day_rules(logic: StardewLogic, multiworld: MultiWorld
880877

881878

882879
def set_arcade_machine_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions):
883-
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.play_junimo_kart, player),
884-
logic.received(Wallet.skull_key))
880+
play_junimo_kart_rule = logic.received(Wallet.skull_key)
881+
885882
if world_options.arcade_machine_locations != ArcadeMachineLocations.option_full_shuffling:
883+
set_entrance_rule(multiworld, player, Entrance.play_junimo_kart, play_junimo_kart_rule)
886884
return
887885

888-
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.play_junimo_kart, player),
889-
logic.has("Junimo Kart Small Buff"))
890-
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_junimo_kart_2, player),
891-
logic.has("Junimo Kart Medium Buff"))
892-
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_junimo_kart_3, player),
893-
logic.has("Junimo Kart Big Buff"))
894-
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_junimo_kart_4, player),
895-
logic.has("Junimo Kart Max Buff"))
896-
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.play_journey_of_the_prairie_king, player),
897-
logic.has("JotPK Small Buff"))
898-
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_jotpk_world_2, player),
899-
logic.has("JotPK Medium Buff"))
900-
MultiWorldRules.add_rule(multiworld.get_entrance(Entrance.reach_jotpk_world_3, player),
901-
logic.has("JotPK Big Buff"))
886+
set_entrance_rule(multiworld, player, Entrance.play_junimo_kart, play_junimo_kart_rule & logic.has("Junimo Kart Small Buff"))
887+
set_entrance_rule(multiworld, player, Entrance.reach_junimo_kart_2, logic.has("Junimo Kart Medium Buff"))
888+
set_entrance_rule(multiworld, player, Entrance.reach_junimo_kart_3, logic.has("Junimo Kart Big Buff"))
889+
set_entrance_rule(multiworld, player, Entrance.reach_junimo_kart_4, logic.has("Junimo Kart Max Buff"))
890+
set_entrance_rule(multiworld, player, Entrance.play_journey_of_the_prairie_king, logic.has("JotPK Small Buff"))
891+
set_entrance_rule(multiworld, player, Entrance.reach_jotpk_world_2, logic.has("JotPK Medium Buff"))
892+
set_entrance_rule(multiworld, player, Entrance.reach_jotpk_world_3, logic.has("JotPK Big Buff"))
902893
MultiWorldRules.add_rule(multiworld.get_location("Journey of the Prairie King Victory", player),
903894
logic.has("JotPK Max Buff"))
904895

@@ -1049,6 +1040,7 @@ def set_entrance_rule(multiworld, player, entrance: str, rule: StardewRule):
10491040
potentially_required_regions = look_for_indirect_connection(rule)
10501041
if potentially_required_regions:
10511042
for region in potentially_required_regions:
1043+
logger.debug(f"Registering indirect condition for {region} -> {entrance}")
10521044
multiworld.register_indirect_condition(multiworld.get_region(region, player), multiworld.get_entrance(entrance, player))
10531045

10541046
MultiWorldRules.set_rule(multiworld.get_entrance(entrance, player), rule)

worlds/stardew_valley/stardew_rule/rule_explain.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@
44
from functools import cached_property, singledispatch
55
from typing import Iterable, Set, Tuple, List, Optional
66

7-
from BaseClasses import CollectionState
7+
from BaseClasses import CollectionState, Location, Entrance
88
from worlds.generic.Rules import CollectionRule
99
from . import StardewRule, AggregatingStardewRule, Count, Has, TotalReceived, Received, Reach, true_
1010

1111

1212
@dataclass
1313
class RuleExplanation:
1414
rule: StardewRule
15-
state: CollectionState
15+
state: CollectionState = field(repr=False, hash=False)
1616
expected: bool
1717
sub_rules: Iterable[StardewRule] = field(default_factory=list)
18-
explored_rules_key: Set[Tuple[str, str]] = field(default_factory=set)
18+
explored_rules_key: Set[Tuple[str, str]] = field(default_factory=set, repr=False, hash=False)
1919
current_rule_explored: bool = False
2020

2121
def __post_init__(self):
@@ -38,13 +38,6 @@ def __str__(self, depth=0):
3838
if i.result is not self.expected else i.summary(depth + 1)
3939
for i in sorted(self.explained_sub_rules, key=lambda x: x.result))
4040

41-
def __repr__(self, depth=0):
42-
if not self.sub_rules:
43-
return self.summary(depth)
44-
45-
return self.summary(depth) + "\n" + "\n".join(i.__repr__(depth + 1)
46-
for i in sorted(self.explained_sub_rules, key=lambda x: x.result))
47-
4841
@cached_property
4942
def result(self) -> bool:
5043
try:
@@ -134,6 +127,10 @@ def _(rule: Reach, state: CollectionState, expected: bool, explored_spots: Set[T
134127
access_rules = [Reach(spot.parent_region.name, "Region", rule.player)]
135128
else:
136129
access_rules = [spot.access_rule, Reach(spot.parent_region.name, "Region", rule.player)]
130+
elif spot.access_rule == Location.access_rule:
131+
# Sometime locations just don't have an access rule and all the relevant logic is in the parent region.
132+
access_rules = [Reach(spot.parent_region.name, "Region", rule.player)]
133+
137134

138135
elif rule.resolution_hint == 'Entrance':
139136
spot = state.multiworld.get_entrance(rule.spot, rule.player)
@@ -143,6 +140,9 @@ def _(rule: Reach, state: CollectionState, expected: bool, explored_spots: Set[T
143140
access_rules = [Reach(spot.parent_region.name, "Region", rule.player)]
144141
else:
145142
access_rules = [spot.access_rule, Reach(spot.parent_region.name, "Region", rule.player)]
143+
elif spot.access_rule == Entrance.access_rule:
144+
# Sometime entrances just don't have an access rule and all the relevant logic is in the parent region.
145+
access_rules = [Reach(spot.parent_region.name, "Region", rule.player)]
146146

147147
else:
148148
spot = state.multiworld.get_region(rule.spot, rule.player)

worlds/stardew_valley/strings/ap_names/event_names.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@ def event(name: str):
88

99
class Event:
1010
victory = event("Victory")
11-
can_construct_buildings = event("Can Construct Buildings")
12-
start_dark_talisman_quest = event("Start Dark Talisman Quest")
13-
can_ship_items = event("Can Ship Items")
14-
can_shop_at_pierre = event("Can Shop At Pierre's")
1511
spring_farming = event("Spring Farming")
1612
summer_farming = event("Summer Farming")
1713
fall_farming = event("Fall Farming")

0 commit comments

Comments
 (0)