118 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			118 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from __future__ import annotations | ||
|  | 
 | ||
|  | from dataclasses import dataclass, field | ||
|  | from typing import Dict, Iterable, Set, Any, Mapping, Type, Tuple, Union | ||
|  | 
 | ||
|  | from .feature import booksanity, cropsanity, fishsanity, friendsanity | ||
|  | from ..data.fish_data import FishItem | ||
|  | from ..data.game_item import GameItem, ItemSource, ItemTag | ||
|  | from ..data.skill import Skill | ||
|  | from ..data.villagers_data import Villager | ||
|  | 
 | ||
|  | 
 | ||
|  | @dataclass(frozen=True) | ||
|  | class StardewContent: | ||
|  |     features: StardewFeatures | ||
|  |     registered_packs: Set[str] = field(default_factory=set) | ||
|  | 
 | ||
|  |     # regions -> To be used with can reach rule | ||
|  | 
 | ||
|  |     game_items: Dict[str, GameItem] = field(default_factory=dict) | ||
|  |     fishes: Dict[str, FishItem] = field(default_factory=dict) | ||
|  |     villagers: Dict[str, Villager] = field(default_factory=dict) | ||
|  |     skills: Dict[str, Skill] = field(default_factory=dict) | ||
|  |     quests: Dict[str, Any] = field(default_factory=dict) | ||
|  | 
 | ||
|  |     def find_sources_of_type(self, types: Union[Type[ItemSource], Tuple[Type[ItemSource]]]) -> Iterable[ItemSource]: | ||
|  |         for item in self.game_items.values(): | ||
|  |             for source in item.sources: | ||
|  |                 if isinstance(source, types): | ||
|  |                     yield source | ||
|  | 
 | ||
|  |     def source_item(self, item_name: str, *sources: ItemSource): | ||
|  |         item = self.game_items.setdefault(item_name, GameItem(item_name)) | ||
|  |         item.add_sources(sources) | ||
|  | 
 | ||
|  |     def tag_item(self, item_name: str, *tags: ItemTag): | ||
|  |         item = self.game_items.setdefault(item_name, GameItem(item_name)) | ||
|  |         item.add_tags(tags) | ||
|  | 
 | ||
|  |     def untag_item(self, item_name: str, tag: ItemTag): | ||
|  |         self.game_items[item_name].tags.remove(tag) | ||
|  | 
 | ||
|  |     def find_tagged_items(self, tag: ItemTag) -> Iterable[GameItem]: | ||
|  |         # TODO might be worth caching this, but it need to only be cached once the content is finalized... | ||
|  |         for item in self.game_items.values(): | ||
|  |             if tag in item.tags: | ||
|  |                 yield item | ||
|  | 
 | ||
|  | 
 | ||
|  | @dataclass(frozen=True) | ||
|  | class StardewFeatures: | ||
|  |     booksanity: booksanity.BooksanityFeature | ||
|  |     cropsanity: cropsanity.CropsanityFeature | ||
|  |     fishsanity: fishsanity.FishsanityFeature | ||
|  |     friendsanity: friendsanity.FriendsanityFeature | ||
|  | 
 | ||
|  | 
 | ||
|  | @dataclass(frozen=True) | ||
|  | class ContentPack: | ||
|  |     name: str | ||
|  | 
 | ||
|  |     dependencies: Iterable[str] = () | ||
|  |     """ Hard requirement, generation will fail if it's missing. """ | ||
|  |     weak_dependencies: Iterable[str] = () | ||
|  |     """ Not a strict dependency, only used only for ordering the packs to make sure hooks are applied correctly. """ | ||
|  | 
 | ||
|  |     # items | ||
|  |     # def item_hook | ||
|  |     # ... | ||
|  | 
 | ||
|  |     harvest_sources: Mapping[str, Iterable[ItemSource]] = field(default_factory=dict) | ||
|  |     """Harvest sources contains both crops and forageables, but also fruits from trees, the cave farm and stuff harvested from tapping like maple syrup.""" | ||
|  | 
 | ||
|  |     def harvest_source_hook(self, content: StardewContent): | ||
|  |         ... | ||
|  | 
 | ||
|  |     shop_sources: Mapping[str, Iterable[ItemSource]] = field(default_factory=dict) | ||
|  | 
 | ||
|  |     def shop_source_hook(self, content: StardewContent): | ||
|  |         ... | ||
|  | 
 | ||
|  |     fishes: Iterable[FishItem] = () | ||
|  | 
 | ||
|  |     def fish_hook(self, content: StardewContent): | ||
|  |         ... | ||
|  | 
 | ||
|  |     crafting_sources: Mapping[str, Iterable[ItemSource]] = field(default_factory=dict) | ||
|  | 
 | ||
|  |     def crafting_hook(self, content: StardewContent): | ||
|  |         ... | ||
|  | 
 | ||
|  |     artisan_good_sources: Mapping[str, Iterable[ItemSource]] = field(default_factory=dict) | ||
|  | 
 | ||
|  |     def artisan_good_hook(self, content: StardewContent): | ||
|  |         ... | ||
|  | 
 | ||
|  |     villagers: Iterable[Villager] = () | ||
|  | 
 | ||
|  |     def villager_hook(self, content: StardewContent): | ||
|  |         ... | ||
|  | 
 | ||
|  |     skills: Iterable[Skill] = () | ||
|  | 
 | ||
|  |     def skill_hook(self, content: StardewContent): | ||
|  |         ... | ||
|  | 
 | ||
|  |     quests: Iterable[Any] = () | ||
|  | 
 | ||
|  |     def quest_hook(self, content: StardewContent): | ||
|  |         ... | ||
|  | 
 | ||
|  |     def finalize_hook(self, content: StardewContent): | ||
|  |         """Last hook called on the pack, once all other content packs have been registered.
 | ||
|  | 
 | ||
|  |         This is the place to do any final adjustments to the content, like adding rules based on tags applied by other packs. | ||
|  |         """
 | ||
|  |         ... |