102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from abc import ABC, abstractmethod
							 | 
						||
| 
								 | 
							
								from dataclasses import dataclass
							 | 
						||
| 
								 | 
							
								from typing import ClassVar, Optional
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from ...data.fish_data import FishItem
							 | 
						||
| 
								 | 
							
								from ...strings.fish_names import Fish
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								location_prefix = "Fishsanity: "
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def to_location_name(fish: str) -> str:
							 | 
						||
| 
								 | 
							
								    return location_prefix + fish
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def extract_fish_from_location_name(location_name: str) -> Optional[str]:
							 | 
						||
| 
								 | 
							
								    if not location_name.startswith(location_prefix):
							 | 
						||
| 
								 | 
							
								        return None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return location_name[len(location_prefix):]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@dataclass(frozen=True)
							 | 
						||
| 
								 | 
							
								class FishsanityFeature(ABC):
							 | 
						||
| 
								 | 
							
								    is_enabled: ClassVar[bool]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    randomization_ratio: float = 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    to_location_name = staticmethod(to_location_name)
							 | 
						||
| 
								 | 
							
								    extract_fish_from_location_name = staticmethod(extract_fish_from_location_name)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @property
							 | 
						||
| 
								 | 
							
								    def is_randomized(self) -> bool:
							 | 
						||
| 
								 | 
							
								        return self.randomization_ratio != 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @abstractmethod
							 | 
						||
| 
								 | 
							
								    def is_included(self, fish: FishItem) -> bool:
							 | 
						||
| 
								 | 
							
								        ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class FishsanityNone(FishsanityFeature):
							 | 
						||
| 
								 | 
							
								    is_enabled = False
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def is_included(self, fish: FishItem) -> bool:
							 | 
						||
| 
								 | 
							
								        return False
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class FishsanityLegendaries(FishsanityFeature):
							 | 
						||
| 
								 | 
							
								    is_enabled = True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def is_included(self, fish: FishItem) -> bool:
							 | 
						||
| 
								 | 
							
								        return fish.legendary
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class FishsanitySpecial(FishsanityFeature):
							 | 
						||
| 
								 | 
							
								    is_enabled = True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    included_fishes = {
							 | 
						||
| 
								 | 
							
								        Fish.angler,
							 | 
						||
| 
								 | 
							
								        Fish.crimsonfish,
							 | 
						||
| 
								 | 
							
								        Fish.glacierfish,
							 | 
						||
| 
								 | 
							
								        Fish.legend,
							 | 
						||
| 
								 | 
							
								        Fish.mutant_carp,
							 | 
						||
| 
								 | 
							
								        Fish.blobfish,
							 | 
						||
| 
								 | 
							
								        Fish.lava_eel,
							 | 
						||
| 
								 | 
							
								        Fish.octopus,
							 | 
						||
| 
								 | 
							
								        Fish.scorpion_carp,
							 | 
						||
| 
								 | 
							
								        Fish.ice_pip,
							 | 
						||
| 
								 | 
							
								        Fish.super_cucumber,
							 | 
						||
| 
								 | 
							
								        Fish.dorado
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def is_included(self, fish: FishItem) -> bool:
							 | 
						||
| 
								 | 
							
								        return fish.name in self.included_fishes
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class FishsanityAll(FishsanityFeature):
							 | 
						||
| 
								 | 
							
								    is_enabled = True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def is_included(self, fish: FishItem) -> bool:
							 | 
						||
| 
								 | 
							
								        return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class FishsanityExcludeLegendaries(FishsanityFeature):
							 | 
						||
| 
								 | 
							
								    is_enabled = True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def is_included(self, fish: FishItem) -> bool:
							 | 
						||
| 
								 | 
							
								        return not fish.legendary
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class FishsanityExcludeHardFish(FishsanityFeature):
							 | 
						||
| 
								 | 
							
								    is_enabled = True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def is_included(self, fish: FishItem) -> bool:
							 | 
						||
| 
								 | 
							
								        return fish.difficulty < 80
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class FishsanityOnlyEasyFish(FishsanityFeature):
							 | 
						||
| 
								 | 
							
								    is_enabled = True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def is_included(self, fish: FishItem) -> bool:
							 | 
						||
| 
								 | 
							
								        return fish.difficulty < 50
							 |