Stardew Valley: Improve generation performance by around 11% by moving calculating from rule evaluation to collect (#4231)
This commit is contained in:
@@ -4,6 +4,7 @@ from typing import Iterable, Union, List, Tuple, Hashable, TYPE_CHECKING
|
||||
from BaseClasses import CollectionState
|
||||
from .base import BaseStardewRule, CombinableStardewRule
|
||||
from .protocol import StardewRule
|
||||
from ..strings.ap_names.event_names import Event
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .. import StardewValleyWorld
|
||||
@@ -87,45 +88,13 @@ class Reach(BaseStardewRule):
|
||||
return f"Reach {self.resolution_hint} {self.spot}"
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class HasProgressionPercent(CombinableStardewRule):
|
||||
player: int
|
||||
percent: int
|
||||
class HasProgressionPercent(Received):
|
||||
def __init__(self, player: int, percent: int):
|
||||
super().__init__(Event.received_progression_percent, player, percent, event=True)
|
||||
|
||||
def __post_init__(self):
|
||||
assert self.percent > 0, "HasProgressionPercent rule must be above 0%"
|
||||
assert self.percent <= 100, "HasProgressionPercent rule can't require more than 100% of items"
|
||||
|
||||
@property
|
||||
def combination_key(self) -> Hashable:
|
||||
return HasProgressionPercent.__name__
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
return self.percent
|
||||
|
||||
def __call__(self, state: CollectionState) -> bool:
|
||||
stardew_world: "StardewValleyWorld" = state.multiworld.worlds[self.player]
|
||||
total_count = stardew_world.total_progression_items
|
||||
needed_count = (total_count * self.percent) // 100
|
||||
player_state = state.prog_items[self.player]
|
||||
|
||||
if needed_count <= len(player_state) - len(stardew_world.excluded_from_total_progression_items):
|
||||
return True
|
||||
|
||||
total_count = 0
|
||||
for item, item_count in player_state.items():
|
||||
if item in stardew_world.excluded_from_total_progression_items:
|
||||
continue
|
||||
|
||||
total_count += item_count
|
||||
if total_count >= needed_count:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def evaluate_while_simplifying(self, state: CollectionState) -> Tuple[StardewRule, bool]:
|
||||
return self, self(state)
|
||||
assert self.count > 0, "HasProgressionPercent rule must be above 0%"
|
||||
assert self.count <= 100, "HasProgressionPercent rule can't require more than 100% of items"
|
||||
|
||||
def __repr__(self):
|
||||
return f"Received {self.percent}% progression items"
|
||||
return f"Received {self.count}% progression items"
|
||||
|
||||
Reference in New Issue
Block a user