mirror of
https://github.com/ArchipelagoMW/Archipelago.git
synced 2026-05-27 14:09:57 -07:00
Stardew Valley: Improve generation performance by around 11% by moving calculating from rule evaluation to collect (#4231)
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import logging
|
||||
from random import Random
|
||||
from typing import Dict, Any, Iterable, Optional, Union, List, TextIO
|
||||
from typing import Dict, Any, Iterable, Optional, List, TextIO
|
||||
|
||||
from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState
|
||||
from Options import PerGameCommonOptions
|
||||
@@ -88,7 +88,6 @@ class StardewValleyWorld(World):
|
||||
randomized_entrances: Dict[str, str]
|
||||
|
||||
total_progression_items: int
|
||||
excluded_from_total_progression_items: List[str] = [Event.received_walnuts]
|
||||
|
||||
def __init__(self, multiworld: MultiWorld, player: int):
|
||||
super().__init__(multiworld, player)
|
||||
@@ -176,7 +175,7 @@ class StardewValleyWorld(World):
|
||||
|
||||
if self.options.season_randomization == SeasonRandomization.option_disabled:
|
||||
for season in season_pool:
|
||||
self.multiworld.push_precollected(self.create_starting_item(season))
|
||||
self.multiworld.push_precollected(self.create_item(season))
|
||||
return
|
||||
|
||||
if [item for item in self.multiworld.precollected_items[self.player]
|
||||
@@ -186,12 +185,12 @@ class StardewValleyWorld(World):
|
||||
if self.options.season_randomization == SeasonRandomization.option_randomized_not_winter:
|
||||
season_pool = [season for season in season_pool if season.name != "Winter"]
|
||||
|
||||
starting_season = self.create_starting_item(self.random.choice(season_pool))
|
||||
starting_season = self.create_item(self.random.choice(season_pool))
|
||||
self.multiworld.push_precollected(starting_season)
|
||||
|
||||
def precollect_farm_type_items(self):
|
||||
if self.options.farm_type == FarmType.option_meadowlands and self.options.building_progression & BuildingProgression.option_progressive:
|
||||
self.multiworld.push_precollected(self.create_starting_item("Progressive Coop"))
|
||||
self.multiworld.push_precollected(self.create_item("Progressive Coop"))
|
||||
|
||||
def setup_logic_events(self):
|
||||
def register_event(name: str, region: str, rule: StardewRule):
|
||||
@@ -271,7 +270,7 @@ class StardewValleyWorld(World):
|
||||
def get_all_location_names(self) -> List[str]:
|
||||
return list(location.name for location in self.multiworld.get_locations(self.player))
|
||||
|
||||
def create_item(self, item: Union[str, ItemData], override_classification: ItemClassification = None) -> StardewItem:
|
||||
def create_item(self, item: str | ItemData, override_classification: ItemClassification = None) -> StardewItem:
|
||||
if isinstance(item, str):
|
||||
item = item_table[item]
|
||||
|
||||
@@ -280,12 +279,6 @@ class StardewValleyWorld(World):
|
||||
|
||||
return StardewItem(item.name, override_classification, item.code, self.player)
|
||||
|
||||
def create_starting_item(self, item: Union[str, ItemData]) -> StardewItem:
|
||||
if isinstance(item, str):
|
||||
item = item_table[item]
|
||||
|
||||
return StardewItem(item.name, item.classification, item.code, self.player)
|
||||
|
||||
def create_event_location(self, location_data: LocationData, rule: StardewRule = None, item: Optional[str] = None):
|
||||
if rule is None:
|
||||
rule = True_()
|
||||
@@ -393,9 +386,19 @@ class StardewValleyWorld(World):
|
||||
if not change:
|
||||
return False
|
||||
|
||||
player_state = state.prog_items[self.player]
|
||||
|
||||
received_progression_count = player_state[Event.received_progression_item]
|
||||
received_progression_count += 1
|
||||
if self.total_progression_items:
|
||||
# Total progression items is not set until all items are created, but collect will be called during the item creation when an item is precollected.
|
||||
# We can't update the percentage if we don't know the total progression items, can't divide by 0.
|
||||
player_state[Event.received_progression_percent] = received_progression_count * 100 // self.total_progression_items
|
||||
player_state[Event.received_progression_item] = received_progression_count
|
||||
|
||||
walnut_amount = self.get_walnut_amount(item.name)
|
||||
if walnut_amount:
|
||||
state.prog_items[self.player][Event.received_walnuts] += walnut_amount
|
||||
player_state[Event.received_walnuts] += walnut_amount
|
||||
|
||||
return True
|
||||
|
||||
@@ -404,9 +407,18 @@ class StardewValleyWorld(World):
|
||||
if not change:
|
||||
return False
|
||||
|
||||
player_state = state.prog_items[self.player]
|
||||
|
||||
received_progression_count = player_state[Event.received_progression_item]
|
||||
received_progression_count -= 1
|
||||
if self.total_progression_items:
|
||||
# We can't update the percentage if we don't know the total progression items, can't divide by 0.
|
||||
player_state[Event.received_progression_percent] = received_progression_count * 100 // self.total_progression_items
|
||||
player_state[Event.received_progression_item] = received_progression_count
|
||||
|
||||
walnut_amount = self.get_walnut_amount(item.name)
|
||||
if walnut_amount:
|
||||
state.prog_items[self.player][Event.received_walnuts] -= walnut_amount
|
||||
player_state[Event.received_walnuts] -= walnut_amount
|
||||
|
||||
return True
|
||||
|
||||
|
||||
Reference in New Issue
Block a user