290 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			290 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Python
		
	
	
	
from __future__ import annotations
 | 
						|
 | 
						|
from dataclasses import dataclass
 | 
						|
from typing import List, Tuple, Union, Optional
 | 
						|
 | 
						|
from ..strings.monster_names import Monster
 | 
						|
from ..strings.fish_names import WaterChest
 | 
						|
from ..strings.forageable_names import Forageable
 | 
						|
from ..strings.metal_names import Mineral, Artifact, Fossil
 | 
						|
from ..strings.region_names import Region
 | 
						|
from ..strings.geode_names import Geode
 | 
						|
 | 
						|
 | 
						|
@dataclass(frozen=True)
 | 
						|
class MuseumItem:
 | 
						|
    item_name: str
 | 
						|
    locations: Tuple[str, ...]
 | 
						|
    geodes: Tuple[str, ...]
 | 
						|
    monsters: Tuple[str, ...]
 | 
						|
    difficulty: float
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def of(item_name: str,
 | 
						|
           difficulty: float,
 | 
						|
           locations: Union[str, Tuple[str, ...]],
 | 
						|
           geodes: Union[str, Tuple[str, ...]],
 | 
						|
           monsters: Union[str, Tuple[str, ...]]) -> MuseumItem:
 | 
						|
        if isinstance(locations, str):
 | 
						|
            locations = (locations,)
 | 
						|
 | 
						|
        if isinstance(geodes, str):
 | 
						|
            geodes = (geodes,)
 | 
						|
 | 
						|
        if isinstance(monsters, str):
 | 
						|
            monsters = (monsters,)
 | 
						|
 | 
						|
        return MuseumItem(item_name, locations, geodes, monsters, difficulty)
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        return f"{self.item_name} (Locations: {self.locations} |" \
 | 
						|
               f" Geodes: {self.geodes} |" \
 | 
						|
               f" Monsters: {self.monsters}) "
 | 
						|
 | 
						|
 | 
						|
unlikely = ()
 | 
						|
 | 
						|
all_museum_artifacts: List[MuseumItem] = []
 | 
						|
all_museum_minerals: List[MuseumItem] = []
 | 
						|
 | 
						|
all_museum_items: List[MuseumItem] = []
 | 
						|
 | 
						|
 | 
						|
def create_artifact(name: str,
 | 
						|
                    difficulty: float,
 | 
						|
                    locations: Union[str, Tuple[str, ...]] = (),
 | 
						|
                    geodes: Union[str, Tuple[str, ...]] = (),
 | 
						|
                    monsters: Union[str, Tuple[str, ...]] = ()) -> MuseumItem:
 | 
						|
    artifact_item = MuseumItem.of(name, difficulty, locations, geodes, monsters)
 | 
						|
    all_museum_artifacts.append(artifact_item)
 | 
						|
    all_museum_items.append(artifact_item)
 | 
						|
    return artifact_item
 | 
						|
 | 
						|
 | 
						|
def create_mineral(name: str,
 | 
						|
                   locations: Union[str, Tuple[str, ...]] = (),
 | 
						|
                   geodes: Union[str, Tuple[str, ...]] = (),
 | 
						|
                   monsters: Union[str, Tuple[str, ...]] = (),
 | 
						|
                   difficulty: Optional[float] = None) -> MuseumItem:
 | 
						|
    if difficulty is None:
 | 
						|
        difficulty = 0
 | 
						|
        if "Geode" in geodes:
 | 
						|
            difficulty += 1.0 / 32.0 * 100
 | 
						|
        if "Frozen Geode" in geodes:
 | 
						|
            difficulty += 1.0 / 30.0 * 100
 | 
						|
        if "Magma Geode" in geodes:
 | 
						|
            difficulty += 1.0 / 26.0 * 100
 | 
						|
        if "Omni Geode" in geodes:
 | 
						|
            difficulty += 31.0 / 2750.0 * 100
 | 
						|
        if "Fishing Chest" in geodes:
 | 
						|
            difficulty += 4.3
 | 
						|
 | 
						|
    mineral_item = MuseumItem.of(name, difficulty, locations, geodes, monsters)
 | 
						|
    all_museum_minerals.append(mineral_item)
 | 
						|
    all_museum_items.append(mineral_item)
 | 
						|
    return mineral_item
 | 
						|
 | 
						|
 | 
						|
class Artifact:
 | 
						|
    dwarf_scroll_i = create_artifact("Dwarf Scroll I", 5.6, Region.mines_floor_20,
 | 
						|
                                     monsters=unlikely)
 | 
						|
    dwarf_scroll_ii = create_artifact("Dwarf Scroll II", 3, Region.mines_floor_20,
 | 
						|
                                      monsters=unlikely)
 | 
						|
    dwarf_scroll_iii = create_artifact("Dwarf Scroll III", 7.5, Region.mines_floor_60,
 | 
						|
                                       monsters=Monster.blue_slime)
 | 
						|
    dwarf_scroll_iv = create_artifact("Dwarf Scroll IV", 4, Region.mines_floor_100)
 | 
						|
    chipped_amphora = create_artifact("Chipped Amphora", 6.7, Region.town,
 | 
						|
                                      geodes=Geode.artifact_trove)
 | 
						|
    arrowhead = create_artifact("Arrowhead", 8.5, (Region.mountain, Region.forest, Region.bus_stop),
 | 
						|
                                geodes=Geode.artifact_trove)
 | 
						|
    ancient_doll = create_artifact(Artifact.ancient_doll, 13.1, (Region.mountain, Region.forest, Region.bus_stop),
 | 
						|
                                   geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    elvish_jewelry = create_artifact("Elvish Jewelry", 5.3, Region.forest,
 | 
						|
                                     geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    chewing_stick = create_artifact("Chewing Stick", 10.3, (Region.mountain, Region.forest, Region.town),
 | 
						|
                                    geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    ornamental_fan = create_artifact("Ornamental Fan", 7.4, (Region.beach, Region.forest, Region.town),
 | 
						|
                                     geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    dinosaur_egg = create_artifact("Dinosaur Egg", 11.4, (Region.skull_cavern),
 | 
						|
                                   monsters=Monster.pepper_rex)
 | 
						|
    rare_disc = create_artifact("Rare Disc", 5.6, Region.stardew_valley,
 | 
						|
                                geodes=(Geode.artifact_trove, WaterChest.fishing_chest),
 | 
						|
                                monsters=unlikely)
 | 
						|
    ancient_sword = create_artifact("Ancient Sword", 5.8, (Region.forest, Region.mountain),
 | 
						|
                                    geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    rusty_spoon = create_artifact("Rusty Spoon", 9.6, Region.town,
 | 
						|
                                  geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    rusty_spur = create_artifact("Rusty Spur", 15.6, Region.farm,
 | 
						|
                                 geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    rusty_cog = create_artifact("Rusty Cog", 9.6, Region.mountain,
 | 
						|
                                geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    chicken_statue = create_artifact("Chicken Statue", 13.5, Region.farm,
 | 
						|
                                     geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    ancient_seed = create_artifact("Ancient Seed", 8.4, (Region.forest, Region.mountain),
 | 
						|
                                   geodes=(Geode.artifact_trove, WaterChest.fishing_chest),
 | 
						|
                                   monsters=unlikely)
 | 
						|
    prehistoric_tool = create_artifact("Prehistoric Tool", 11.1, (Region.mountain, Region.forest, Region.bus_stop),
 | 
						|
                                       geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    dried_starfish = create_artifact("Dried Starfish", 12.5, Region.beach,
 | 
						|
                                     geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    anchor = create_artifact("Anchor", 8.5, Region.beach, geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    glass_shards = create_artifact("Glass Shards", 11.5, Region.beach,
 | 
						|
                                   geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    bone_flute = create_artifact("Bone Flute", 6.3, (Region.mountain, Region.forest, Region.town),
 | 
						|
                                 geodes=(Geode.artifact_trove, WaterChest.fishing_chest))
 | 
						|
    prehistoric_handaxe = create_artifact(Artifact.prehistoric_handaxe, 13.7,
 | 
						|
                                          (Region.mountain, Region.forest, Region.bus_stop),
 | 
						|
                                          geodes=Geode.artifact_trove)
 | 
						|
    dwarvish_helm = create_artifact("Dwarvish Helm", 8.7, Region.mines_floor_20,
 | 
						|
                                    geodes=(Geode.geode, Geode.omni, Geode.artifact_trove))
 | 
						|
    dwarf_gadget = create_artifact("Dwarf Gadget", 9.7, Region.mines_floor_60,
 | 
						|
                                   geodes=(Geode.magma, Geode.omni, Geode.artifact_trove))
 | 
						|
    ancient_drum = create_artifact("Ancient Drum", 9.5, (Region.bus_stop, Region.forest, Region.town),
 | 
						|
                                   geodes=(Geode.frozen, Geode.omni, Geode.artifact_trove))
 | 
						|
    golden_mask = create_artifact("Golden Mask", 6.7, Region.desert,
 | 
						|
                                  geodes=Geode.artifact_trove)
 | 
						|
    golden_relic = create_artifact("Golden Relic", 9.7, Region.desert,
 | 
						|
                                   geodes=Geode.artifact_trove)
 | 
						|
    strange_doll_green = create_artifact("Strange Doll (Green)", 10, Region.town,
 | 
						|
                                         geodes=Forageable.secret_note)
 | 
						|
    strange_doll = create_artifact("Strange Doll", 10, Region.desert,
 | 
						|
                                   geodes=Forageable.secret_note)
 | 
						|
    prehistoric_scapula = create_artifact("Prehistoric Scapula", 6.2,
 | 
						|
                                          (Region.dig_site, Region.forest, Region.town))
 | 
						|
    prehistoric_tibia = create_artifact("Prehistoric Tibia", 16.6,
 | 
						|
                                        (Region.dig_site, Region.forest, Region.railroad))
 | 
						|
    prehistoric_skull = create_artifact("Prehistoric Skull", 3.9, (Region.dig_site, Region.mountain))
 | 
						|
    skeletal_hand = create_artifact(Fossil.skeletal_hand, 7.9, (Region.dig_site, Region.backwoods, Region.beach))
 | 
						|
    prehistoric_rib = create_artifact("Prehistoric Rib", 15, (Region.dig_site, Region.farm, Region.town),
 | 
						|
                                      monsters=Monster.pepper_rex)
 | 
						|
    prehistoric_vertebra = create_artifact("Prehistoric Vertebra", 12.7, (Region.dig_site, Region.bus_stop),
 | 
						|
                                           monsters=Monster.pepper_rex)
 | 
						|
    skeletal_tail = create_artifact("Skeletal Tail", 5.1, (Region.dig_site, Region.mines_floor_20),
 | 
						|
                                    geodes=WaterChest.fishing_chest)
 | 
						|
    nautilus_fossil = create_artifact("Nautilus Fossil", 6.9, (Region.dig_site, Region.beach),
 | 
						|
                                      geodes=WaterChest.fishing_chest)
 | 
						|
    amphibian_fossil = create_artifact("Amphibian Fossil", 6.3, (Region.dig_site, Region.forest, Region.mountain),
 | 
						|
                                       geodes=WaterChest.fishing_chest)
 | 
						|
    palm_fossil = create_artifact("Palm Fossil", 10.2,
 | 
						|
                                  (Region.dig_site, Region.desert, Region.forest, Region.beach))
 | 
						|
    trilobite = create_artifact("Trilobite", 7.4, (Region.dig_site, Region.desert, Region.forest, Region.beach))
 | 
						|
 | 
						|
 | 
						|
class Mineral:
 | 
						|
    quartz = create_mineral(Mineral.quartz, Region.mines_floor_20, difficulty=100.0 / 5.0)
 | 
						|
    fire_quartz = create_mineral("Fire Quartz", Region.mines_floor_100,
 | 
						|
                                 geodes=(Geode.magma, Geode.omni, WaterChest.fishing_chest),
 | 
						|
                                 difficulty=100.0 / 5.0)
 | 
						|
    frozen_tear = create_mineral("Frozen Tear", Region.mines_floor_60,
 | 
						|
                                 geodes=(Geode.frozen, Geode.omni, WaterChest.fishing_chest),
 | 
						|
                                 monsters=unlikely,
 | 
						|
                                 difficulty=100.0 / 5.0)
 | 
						|
    earth_crystal = create_mineral("Earth Crystal", Region.mines_floor_20,
 | 
						|
                                   geodes=(Geode.geode, Geode.omni, WaterChest.fishing_chest),
 | 
						|
                                   monsters=Monster.duggy,
 | 
						|
                                   difficulty=100.0 / 5.0)
 | 
						|
    emerald = create_mineral("Emerald", Region.mines_floor_100,
 | 
						|
                             geodes=WaterChest.fishing_chest)
 | 
						|
    aquamarine = create_mineral("Aquamarine", Region.mines_floor_60,
 | 
						|
                                geodes=WaterChest.fishing_chest)
 | 
						|
    ruby = create_mineral("Ruby", Region.mines_floor_100,
 | 
						|
                          geodes=WaterChest.fishing_chest)
 | 
						|
    amethyst = create_mineral("Amethyst", Region.mines_floor_20,
 | 
						|
                              geodes=WaterChest.fishing_chest)
 | 
						|
    topaz = create_mineral("Topaz", Region.mines_floor_20,
 | 
						|
                           geodes=WaterChest.fishing_chest)
 | 
						|
    jade = create_mineral("Jade", Region.mines_floor_60,
 | 
						|
                          geodes=WaterChest.fishing_chest)
 | 
						|
    diamond = create_mineral("Diamond", Region.mines_floor_60,
 | 
						|
                             geodes=WaterChest.fishing_chest)
 | 
						|
    prismatic_shard = create_mineral("Prismatic Shard", Region.skull_cavern_100,
 | 
						|
                                     geodes=unlikely,
 | 
						|
                                     monsters=unlikely)
 | 
						|
    alamite = create_mineral("Alamite",
 | 
						|
                             geodes=(Geode.geode, Geode.omni))
 | 
						|
    bixite = create_mineral("Bixite",
 | 
						|
                            geodes=(Geode.magma, Geode.omni),
 | 
						|
                            monsters=unlikely)
 | 
						|
    baryte = create_mineral("Baryte",
 | 
						|
                            geodes=(Geode.magma, Geode.omni))
 | 
						|
    aerinite = create_mineral("Aerinite",
 | 
						|
                              geodes=(Geode.frozen, Geode.omni))
 | 
						|
    calcite = create_mineral("Calcite",
 | 
						|
                             geodes=(Geode.geode, Geode.omni))
 | 
						|
    dolomite = create_mineral("Dolomite",
 | 
						|
                              geodes=(Geode.magma, Geode.omni))
 | 
						|
    esperite = create_mineral("Esperite",
 | 
						|
                              geodes=(Geode.frozen, Geode.omni))
 | 
						|
    fluorapatite = create_mineral("Fluorapatite",
 | 
						|
                                  geodes=(Geode.frozen, Geode.omni))
 | 
						|
    geminite = create_mineral("Geminite",
 | 
						|
                              geodes=(Geode.frozen, Geode.omni))
 | 
						|
    helvite = create_mineral("Helvite",
 | 
						|
                             geodes=(Geode.magma, Geode.omni))
 | 
						|
    jamborite = create_mineral("Jamborite",
 | 
						|
                               geodes=(Geode.geode, Geode.omni))
 | 
						|
    jagoite = create_mineral("Jagoite",
 | 
						|
                             geodes=(Geode.geode, Geode.omni))
 | 
						|
    kyanite = create_mineral("Kyanite",
 | 
						|
                             geodes=(Geode.frozen, Geode.omni))
 | 
						|
    lunarite = create_mineral("Lunarite",
 | 
						|
                              geodes=(Geode.frozen, Geode.omni))
 | 
						|
    malachite = create_mineral("Malachite",
 | 
						|
                               geodes=(Geode.geode, Geode.omni))
 | 
						|
    neptunite = create_mineral("Neptunite",
 | 
						|
                               geodes=(Geode.magma, Geode.omni))
 | 
						|
    lemon_stone = create_mineral("Lemon Stone",
 | 
						|
                                 geodes=(Geode.magma, Geode.omni))
 | 
						|
    nekoite = create_mineral("Nekoite",
 | 
						|
                             geodes=(Geode.geode, Geode.omni))
 | 
						|
    orpiment = create_mineral("Orpiment",
 | 
						|
                              geodes=(Geode.geode, Geode.omni))
 | 
						|
    petrified_slime = create_mineral(Mineral.petrified_slime, Region.slime_hutch)
 | 
						|
    thunder_egg = create_mineral("Thunder Egg",
 | 
						|
                                 geodes=(Geode.geode, Geode.omni))
 | 
						|
    pyrite = create_mineral("Pyrite",
 | 
						|
                            geodes=(Geode.frozen, Geode.omni))
 | 
						|
    ocean_stone = create_mineral("Ocean Stone",
 | 
						|
                                 geodes=(Geode.frozen, Geode.omni))
 | 
						|
    ghost_crystal = create_mineral("Ghost Crystal",
 | 
						|
                                   geodes=(Geode.frozen, Geode.omni))
 | 
						|
    tigerseye = create_mineral("Tigerseye",
 | 
						|
                               geodes=(Geode.magma, Geode.omni))
 | 
						|
    jasper = create_mineral("Jasper",
 | 
						|
                            geodes=(Geode.magma, Geode.omni))
 | 
						|
    opal = create_mineral("Opal",
 | 
						|
                          geodes=(Geode.frozen, Geode.omni))
 | 
						|
    fire_opal = create_mineral("Fire Opal",
 | 
						|
                               geodes=(Geode.magma, Geode.omni))
 | 
						|
    celestine = create_mineral("Celestine",
 | 
						|
                               geodes=(Geode.geode, Geode.omni))
 | 
						|
    marble = create_mineral("Marble",
 | 
						|
                            geodes=(Geode.frozen, Geode.omni))
 | 
						|
    sandstone = create_mineral("Sandstone",
 | 
						|
                               geodes=(Geode.geode, Geode.omni))
 | 
						|
    granite = create_mineral("Granite",
 | 
						|
                             geodes=(Geode.geode, Geode.omni))
 | 
						|
    basalt = create_mineral("Basalt",
 | 
						|
                            geodes=(Geode.magma, Geode.omni))
 | 
						|
    limestone = create_mineral("Limestone",
 | 
						|
                               geodes=(Geode.geode, Geode.omni))
 | 
						|
    soapstone = create_mineral("Soapstone",
 | 
						|
                               geodes=(Geode.frozen, Geode.omni))
 | 
						|
    hematite = create_mineral("Hematite",
 | 
						|
                              geodes=(Geode.frozen, Geode.omni))
 | 
						|
    mudstone = create_mineral("Mudstone",
 | 
						|
                              geodes=(Geode.geode, Geode.omni))
 | 
						|
    obsidian = create_mineral("Obsidian",
 | 
						|
                              geodes=(Geode.magma, Geode.omni))
 | 
						|
    slate = create_mineral("Slate", geodes=(Geode.geode, Geode.omni))
 | 
						|
    fairy_stone = create_mineral("Fairy Stone", geodes=(Geode.frozen, Geode.omni))
 | 
						|
    star_shards = create_mineral("Star Shards", geodes=(Geode.magma, Geode.omni))
 | 
						|
 | 
						|
 | 
						|
dwarf_scrolls = (Artifact.dwarf_scroll_i, Artifact.dwarf_scroll_ii, Artifact.dwarf_scroll_iii, Artifact.dwarf_scroll_iv)
 | 
						|
skeleton_front = (Artifact.prehistoric_skull, Artifact.skeletal_hand, Artifact.prehistoric_scapula)
 | 
						|
skeleton_middle = (Artifact.prehistoric_rib, Artifact.prehistoric_vertebra)
 | 
						|
skeleton_back = (Artifact.prehistoric_tibia, Artifact.skeletal_tail)
 | 
						|
 | 
						|
all_museum_items_by_name = {item.item_name: item for item in all_museum_items}
 |