Files
Grinch-AP/worlds/stardew_valley/logic/shipping_logic.py
Jérémie Bolduc bad6a4b211 Stardew Valley: remove BaseLogic generic so importing mixins is no longer needed (#4916)
* remove BaseLogic generic so importing mixins is no longer needed

* self review
2025-04-23 17:31:08 +02:00

48 lines
2.0 KiB
Python

from functools import cached_property
from typing import Union
from Utils import cache_self1
from .base_logic import BaseLogic, BaseLogicMixin
from .building_logic import BuildingLogicMixin
from .has_logic import HasLogicMixin
from .received_logic import ReceivedLogicMixin
from .region_logic import RegionLogicMixin
from ..locations import LocationTags, locations_by_tag
from ..options import ExcludeGingerIsland
from ..options import SpecialOrderLocations
from ..stardew_rule import StardewRule
from ..strings.building_names import Building
class ShippingLogicMixin(BaseLogicMixin):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.shipping = ShippingLogic(*args, **kwargs)
class ShippingLogic(BaseLogic):
@cached_property
def can_use_shipping_bin(self) -> StardewRule:
return self.logic.building.has_building(Building.shipping_bin)
@cache_self1
def can_ship(self, item: str) -> StardewRule:
return self.logic.shipping.can_use_shipping_bin & self.logic.has(item)
def can_ship_everything(self) -> StardewRule:
shipsanity_prefix = "Shipsanity: "
all_items_to_ship = []
exclude_island = self.options.exclude_ginger_island == ExcludeGingerIsland.option_true
exclude_qi = not (self.options.special_order_locations & SpecialOrderLocations.value_qi)
mod_list = self.options.mods.value
for location in locations_by_tag[LocationTags.SHIPSANITY_FULL_SHIPMENT]:
if exclude_island and LocationTags.GINGER_ISLAND in location.tags:
continue
if exclude_qi and LocationTags.REQUIRES_QI_ORDERS in location.tags:
continue
if location.mod_name and location.mod_name not in mod_list:
continue
all_items_to_ship.append(location.name[len(shipsanity_prefix):])
return self.logic.building.has_building(Building.shipping_bin) & self.logic.has_all(*all_items_to_ship)