Focus of the Update: Compatibility with Stardew Valley 1.6 Released on March 19th 2024 This includes randomization for pretty much all of the new content, including but not limited to - Raccoon Bundles - Booksanity - Skill Masteries - New Recipes, Craftables, Fish, Maps, Farm Type, Festivals and Quests This also includes a significant reorganisation of the code into "Content Packs", to allow for easier modularity of various game mechanics between the settings and the supported mods. This improves maintainability quite a bit. In addition to that, a few **very** requested new features have been introduced, although they weren't the focus of this update - Walnutsanity - Player Buffs - More customizability in settings, such as shorter special orders, ER without farmhouse - New Remixed Bundles
		
			
				
	
	
		
			61 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from functools import cached_property
 | 
						|
from typing import Union, List
 | 
						|
 | 
						|
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, Shipsanity
 | 
						|
from ..options import SpecialOrderLocations
 | 
						|
from ..stardew_rule import StardewRule
 | 
						|
from ..strings.ap_names.event_names import Event
 | 
						|
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[Union[ReceivedLogicMixin, ShippingLogicMixin, BuildingLogicMixin, RegionLogicMixin, HasLogicMixin]]):
 | 
						|
 | 
						|
    @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.received(Event.can_ship_items) & 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)
 | 
						|
 | 
						|
    def can_ship_everything_in_slot(self, all_location_names_in_slot: List[str]) -> StardewRule:
 | 
						|
        if self.options.shipsanity == Shipsanity.option_none:
 | 
						|
            return self.can_ship_everything()
 | 
						|
 | 
						|
        rules = [self.logic.building.has_building(Building.shipping_bin)]
 | 
						|
 | 
						|
        for shipsanity_location in locations_by_tag[LocationTags.SHIPSANITY]:
 | 
						|
            if shipsanity_location.name not in all_location_names_in_slot:
 | 
						|
                continue
 | 
						|
            rules.append(self.logic.region.can_reach_location(shipsanity_location.name))
 | 
						|
        return self.logic.and_(*rules)
 |