69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from abc import ABC
							 | 
						||
| 
								 | 
							
								from collections import Counter
							 | 
						||
| 
								 | 
							
								from collections.abc import Mapping
							 | 
						||
| 
								 | 
							
								from dataclasses import dataclass, field
							 | 
						||
| 
								 | 
							
								from functools import cache
							 | 
						||
| 
								 | 
							
								from types import MappingProxyType
							 | 
						||
| 
								 | 
							
								from typing import ClassVar
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from ...strings.tool_names import Tool
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def to_progressive_item(tool: str) -> str:
							 | 
						||
| 
								 | 
							
								    """Return the name of the progressive item."""
							 | 
						||
| 
								 | 
							
								    return f"Progressive {tool}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# The golden scythe is always randomized
							 | 
						||
| 
								 | 
							
								VANILLA_TOOL_DISTRIBUTION = MappingProxyType({
							 | 
						||
| 
								 | 
							
								    Tool.scythe: 1,
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PROGRESSIVE_TOOL_DISTRIBUTION = MappingProxyType({
							 | 
						||
| 
								 | 
							
								    Tool.axe: 4,
							 | 
						||
| 
								 | 
							
								    Tool.hoe: 4,
							 | 
						||
| 
								 | 
							
								    Tool.pickaxe: 4,
							 | 
						||
| 
								 | 
							
								    Tool.pan: 4,
							 | 
						||
| 
								 | 
							
								    Tool.trash_can: 4,
							 | 
						||
| 
								 | 
							
								    Tool.watering_can: 4,
							 | 
						||
| 
								 | 
							
								    Tool.fishing_rod: 4,
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Masteries add another tier to the scythe and the fishing rod
							 | 
						||
| 
								 | 
							
								SKILL_MASTERIES_TOOL_DISTRIBUTION = MappingProxyType({
							 | 
						||
| 
								 | 
							
								    Tool.scythe: 1,
							 | 
						||
| 
								 | 
							
								    Tool.fishing_rod: 1,
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@cache
							 | 
						||
| 
								 | 
							
								def get_tools_distribution(progressive_tools_enabled: bool, skill_masteries_enabled: bool) -> Mapping[str, int]:
							 | 
						||
| 
								 | 
							
								    distribution = Counter(VANILLA_TOOL_DISTRIBUTION)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if progressive_tools_enabled:
							 | 
						||
| 
								 | 
							
								        distribution += PROGRESSIVE_TOOL_DISTRIBUTION
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if skill_masteries_enabled:
							 | 
						||
| 
								 | 
							
								        distribution += SKILL_MASTERIES_TOOL_DISTRIBUTION
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return MappingProxyType(distribution)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@dataclass(frozen=True)
							 | 
						||
| 
								 | 
							
								class ToolProgressionFeature(ABC):
							 | 
						||
| 
								 | 
							
								    is_progressive: ClassVar[bool]
							 | 
						||
| 
								 | 
							
								    tool_distribution: Mapping[str, int]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    to_progressive_item = staticmethod(to_progressive_item)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@dataclass(frozen=True)
							 | 
						||
| 
								 | 
							
								class ToolProgressionVanilla(ToolProgressionFeature):
							 | 
						||
| 
								 | 
							
								    is_progressive = False
							 | 
						||
| 
								 | 
							
								    # FIXME change the default_factory to a simple default when python 3.11 is no longer supported
							 | 
						||
| 
								 | 
							
								    tool_distribution: Mapping[str, int] = field(default_factory=lambda: VANILLA_TOOL_DISTRIBUTION)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ToolProgressionProgressive(ToolProgressionFeature):
							 | 
						||
| 
								 | 
							
								    is_progressive = True
							 |