diff --git a/worlds/minecraft/Rules.py b/worlds/minecraft/Rules.py index e1a83c927bfa..dbe7cd7a3475 100644 --- a/worlds/minecraft/Rules.py +++ b/worlds/minecraft/Rules.py @@ -1,6 +1,12 @@ from BaseClasses import CollectionState from worlds.generic.Rules import exclusion_rules +from Options import ExcludeLocations +from .Options import CombatDifficulty, DeathLink, HardAdvancements, StructureCompasses + +from rule_builder.options import OptionFilter +from rule_builder.rules import Has, CanReachRegion + from . import Constants from typing import TYPE_CHECKING @@ -8,655 +14,443 @@ from . import MinecraftWorld -# Helper functions -# moved from logicmixin - -def has_iron_ingots(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Progressive Tools', player) and state.has('Progressive Resource Crafting', player) - - -def has_copper_ingots(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Progressive Tools', player) and state.has('Progressive Resource Crafting', player) - - -def has_gold_ingots(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (state.has('Progressive Resource Crafting', player) - and ( - state.has('Progressive Tools', player, 2) - or state.can_reach_region('The Nether', player) - ) - ) - - -def has_diamond_pickaxe(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Progressive Tools', player, 3) and has_iron_ingots(world, state, player) - - -def craft_crossbow(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Archery', player) and has_iron_ingots(world, state, player) - - -def has_bottle(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Bottles', player) and state.has('Progressive Resource Crafting', player) - - -def has_spyglass(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (has_copper_ingots(world, state, player) - and state.has('Spyglass', player) - and can_adventure(world, state, player) - ) - - -def can_enchant(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Enchanting', player) and has_diamond_pickaxe(world, state, player) # mine obsidian and lapis - - -def can_use_anvil(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (state.has('Enchanting', player) - and state.has('Progressive Resource Crafting', player,2) - and has_iron_ingots(world, state, player) - ) - - -def fortress_loot(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: # blaze rods, wither skulls - return state.can_reach_region('Nether Fortress', player) and basic_combat(world, state, player) - - -def can_excavate(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (has_copper_ingots(world, state, player) and state.has('Brush', player) - and can_adventure(world, state, player) - ) - - -def can_brew_potions(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Blaze Rods', player) and state.has('Brewing', player) and has_bottle(world, state, player) - -def can_piglin_trade(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (has_gold_ingots(world, state, player) - and ( - state.can_reach_region('The Nether', player) - or state.can_reach_region('Bastion Remnant', player) - )) - - -def overworld_villager(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - village_region = state.multiworld.get_region('Village', player).entrances[0].parent_region.name - if village_region == 'The Nether': # 2 options: cure zombie villager or build portal in village - return (state.can_reach_location('Zombie Doctor', player) - or ( - has_diamond_pickaxe(world, state, player) - and state.can_reach_region('Village', player) - )) - elif village_region == 'The End': - return state.can_reach_location('Zombie Doctor', player) - return state.can_reach_region('Village', player) or state.can_reach_location('Zombie Doctor', player) - - -def enter_stronghold(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Blaze Rods', player) and state.has('Brewing', player) and state.has('3 Ender Pearls', player) - - -# Difficulty-dependent functions -def combat_difficulty(world: "MinecraftWorld", state: CollectionState, player: int) -> str: - return world.options.combat_difficulty.current_key - - -def can_adventure(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - death_link_check = not world.options.death_link or state.has('Bed', player) - if combat_difficulty(world, state, player) == 'easy': - return state.has('Progressive Weapons', player, 2) and has_iron_ingots(world, state, player) and death_link_check - elif combat_difficulty(world, state, player) == 'hard': - return True - return (state.has('Progressive Weapons', player) and death_link_check and - (state.has('Progressive Resource Crafting', player) or state.has('Campfire', player))) - - -def basic_combat(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - if combat_difficulty(world, state, player) == 'easy': - return (state.has('Progressive Weapons', player, 2) - and state.has('Progressive Armor', player) - and state.has('Shield', player) - and has_iron_ingots(world, state, player) - ) - elif combat_difficulty(world, state, player) == 'hard': - return True - return (state.has('Progressive Weapons', player) - and ( - state.has('Progressive Armor', player) - or state.has('Shield', player) - ) - and has_iron_ingots(world, state, player) - ) - - -def ominous_vaults(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - if combat_difficulty(world, state, player) == 'easy': - return (state.can_reach_region("Pillager Outpost", player) - and state.has('Progressive Weapons', player, 3) - and state.has('Progressive Armor', player, 2) - and state.has('Shield', player) - and state.has('Progressive Tools', player, 2) - and has_iron_ingots(world, state, player) - ) - elif combat_difficulty(world, state, player) == 'hard': - return (state.can_reach_region("Pillager Outpost", player) - and state.has('Progressive Weapons', player, 2) - and has_iron_ingots(world, state, player) - and ( - state.has('Progressive Armor', player) - or state.has('Shield', player) - ) - ) - return (state.can_reach_region("Pillager Outpost", player) - and state.has('Progressive Weapons', player, 2) - and has_iron_ingots(world, state, player) - and state.has('Progressive Armor', player) - and state.has('Shield', player) - ) - - -def complete_raid(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - reach_regions = (state.can_reach_region('Village', player) - and state.can_reach_region('Pillager Outpost', player)) - if combat_difficulty(world, state, player) == 'easy': - return (reach_regions - and state.has('Progressive Weapons', player, 3) - and state.has('Progressive Armor', player, 2) - and state.has('Shield', player) - and state.has('Archery', player) - and state.has('Progressive Tools', player, 2) - and has_iron_ingots(world, state, player) - ) - elif combat_difficulty(world, state, player) == 'hard': # might be too hard? - return (reach_regions - and state.has('Progressive Weapons', player, 2) - and has_iron_ingots(world, state, player) - and ( - state.has('Progressive Armor', player) - or state.has('Shield', player) - ) - ) - return (reach_regions - and state.has('Progressive Weapons', player, 2) - and has_iron_ingots(world, state, player) - and state.has('Progressive Armor', player) - and state.has('Shield', player) - ) - - -def can_kill_wither(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - normal_kill = (state.has("Progressive Weapons", player, 3) - and state.has("Progressive Armor", player, 2) - and can_brew_potions(world, state, player) - and can_enchant(world, state, player) - ) - if combat_difficulty(world, state, player) == 'easy': - return (fortress_loot(world, state, player) - and normal_kill - and state.has('Archery', player) - ) - elif combat_difficulty(world, state, player) == 'hard': # cheese kill using bedrock ceilings - return (fortress_loot(world, state, player) - and ( - normal_kill - or state.can_reach_region('The Nether', player) - or state.can_reach_region('The End', player) - ) - ) - - return fortress_loot(world, state, player) and normal_kill - - -def can_respawn_ender_dragon(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (state.can_reach_region('The Nether', player) - and state.can_reach_region('The End', player) - and state.has('Progressive Resource Crafting', player) # smelt sand into glass - ) - - -def can_kill_ender_dragon(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - if combat_difficulty(world, state, player) == 'easy': - return (state.has("Progressive Weapons", player, 3) - and state.has("Progressive Armor", player, 2) - and state.has('Archery', player) - and can_brew_potions(world, state, player) - and can_enchant(world, state, player) - ) - if combat_difficulty(world, state, player) == 'hard': - return ( - ( - state.has('Progressive Weapons', player, 2) - and state.has('Progressive Armor', player) - ) or ( - state.has('Progressive Weapons', player, 1) - and state.has('Bed', player) # who needs armor when you can respawn right outside the chamber - ) - ) - return (state.has('Progressive Weapons', player, 2) - and state.has('Progressive Armor', player) - and state.has('Archery', player) - ) - - -def has_structure_compass(world: "MinecraftWorld", state: CollectionState, entrance_name: str, player: int) -> bool: - if not world.options.structure_compasses: - return True - return state.has(f"Structure Compass ({state.multiworld.get_entrance(entrance_name, player).connected_region.name})", player) - - -def get_rules_lookup(world, player: int): - rules_lookup = { - "entrances": { - "Nether Portal": lambda state: state.has('Flint and Steel', player) - and ( - state.has('Bucket', player) - or state.has('Progressive Tools', player, 3) - ) - and has_iron_ingots(world, state, player), - "End Portal": lambda state: enter_stronghold(world, state, player) - and state.has('3 Ender Pearls', player, 4), - "Overworld Structure 1": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Overworld Structure 1", player), - "Overworld Structure 2": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Overworld Structure 2", player), - "Nether Structure 1": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Nether Structure 1", player), - "Nether Structure 2": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Nether Structure 2", player), - "The End Structure": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "The End Structure", player), - "Ocean": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Ocean", player), - "Dark Forest": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Dark Forest", player), - "Deep Dark": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has("Progressive Tools", player, 2) - and has_structure_compass(world, state, "Deep Dark", player), - "Ruins": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Ruins", player), - "Underground": lambda state: can_adventure(world, state, player) and state.has("Progressive Tools", player) - and has_structure_compass(world, state, "Underground", player) - }, - "locations": { - "Ender Dragon": lambda state: can_respawn_ender_dragon(world, state, player) - and can_kill_ender_dragon(world, state, player), - "Wither": lambda state: can_kill_wither(world, state, player), - "Blaze Rods": lambda state: fortress_loot(world, state, player), - "Who is Cutting Onions?": lambda state: can_piglin_trade(world, state, player), - "Oh Shiny": lambda state: can_piglin_trade(world, state, player), - "Suit Up": lambda state: state.has("Progressive Armor", player) - and has_iron_ingots(world, state, player), - "Very Very Frightening": lambda state: state.has("Channeling Book", player) - and can_use_anvil(world, state, player) - and can_enchant(world, state, player) - and overworld_villager(world, state, player), - "Hot Stuff": lambda state: state.has("Bucket", player) - and has_iron_ingots(world, state, player), - "Free the End": lambda state: can_respawn_ender_dragon(world, state, player) - and can_kill_ender_dragon(world, state, player), - "A Furious Cocktail": lambda state: (can_brew_potions(world, state, player) - and state.has("Fishing Rod", player) # Water Breathing - and state.can_reach_region("The Nether", player) # Regeneration, Fire Resistance, gold nuggets - and state.can_reach_region("Village", player) # Night Vision, Invisibility - and state.can_reach_location("Bring Home the Beacon", player) # Resistance - and can_adventure(world, state, player) - and state.can_reach_region("Trial Chambers", player) # Wind Charged - ), - "Bring Home the Beacon": lambda state: can_kill_wither(world, state, player) - and has_diamond_pickaxe(world, state, player) - and state.has("Progressive Resource Crafting", player, 2), - "Not Today, Thank You": lambda state: state.has("Shield", player) - and has_iron_ingots(world, state, player), - "Isn't It Iron Pick": lambda state: state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "Local Brewery": lambda state: can_brew_potions(world, state, player), - "The Next Generation": lambda state: can_respawn_ender_dragon(world, state, player) - and can_kill_ender_dragon(world, state, player), - "Fishy Business": lambda state: state.has("Fishing Rod", player), - "This Boat Has Legs": lambda state: has_iron_ingots(world, state, player) - and state.has("Saddle", player) - and state.has("Fishing Rod", player), - "Sniper Duel": lambda state: state.has("Archery", player), - "Great View From Up Here": lambda state: basic_combat(world, state, player), - "How Did We Get Here?": lambda state: (can_brew_potions(world, state, player) - and has_gold_ingots(world, state, player) # Absorption - and state.can_reach_region('End City', player) # Levitation - and state.can_reach_region('The Nether', player) # potion ingredients - and state.can_reach_region('Ocean Monument', player) # Heart of the Sea, Dolphin's Grace, Mining Fatigue - and state.can_reach_region('Ancient City', player) # Darkness - and state.can_reach_region('Trial Chambers', player) # Wind Charged - and state.has("Fishing Rod", player) # Pufferfish, Nautilus Shells - and state.has("Archery", player) # Spectral Arrows - and state.can_reach_location("Bring Home the Beacon", player) # Haste - and state.can_reach_location("Hero of the Village", player)), # Bad Omen, Hero of the Village - "Bullseye": lambda state: state.has("Archery", player) - and state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "Spooky Scary Skeleton": lambda state: basic_combat(world, state, player), - "Two by Two": lambda state: can_excavate(world, state, player) - and state.can_reach_region("Ocean Monument", player) # Sniffers - and state.has("Bucket", player) # Axolotls - and state.can_reach_region("Village", player) # Cats - and state.has("Brush", player) - and state.has("Fishing Rod", player), # Pufferfish for Nautiluses - "Two Birds, One Arrow": lambda state: craft_crossbow(world, state, player) - and can_enchant(world, state, player), - "Who's the Pillager Now?": lambda state: craft_crossbow(world, state, player), - "Getting an Upgrade": lambda state: state.has("Progressive Tools", player), - "Tactical Fishing": lambda state: state.has("Bucket", player) - and has_iron_ingots(world, state, player), - "Zombie Doctor": lambda state: can_brew_potions(world, state, player) - and has_gold_ingots(world, state, player), - "Ice Bucket Challenge": lambda state: has_diamond_pickaxe(world, state, player), - "Into Fire": lambda state: basic_combat(world, state, player), - "War Pigs": lambda state: basic_combat(world, state, player), - "Take Aim": lambda state: state.has("Archery", player), - "Total Beelocation": lambda state: state.has("Silk Touch Book", player) - and can_use_anvil(world, state, player) - and can_enchant(world, state, player), - "Arbalistic": lambda state: (craft_crossbow(world, state, player) - and state.has("Piercing IV Book", player) - and can_use_anvil(world, state, player) - and can_enchant(world, state, player) - ), - "The End... Again...": lambda state: can_respawn_ender_dragon(world, state, player) - and can_kill_ender_dragon(world, state, player), - "Acquire Hardware": lambda state: has_iron_ingots(world, state, player), - "Not Quite \"Nine\" Lives": lambda state: can_piglin_trade(world, state, player) - and state.has("Progressive Resource Crafting", player, 2), - "Cover Me with Diamonds": lambda state: state.has("Progressive Armor", player, 2) - and state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "Sky's the Limit": lambda state: basic_combat(world, state, player), - "Hired Help": lambda state: state.has("Progressive Resource Crafting", player, 2) - and has_iron_ingots(world, state, player), - "Sweet Dreams": lambda state: state.has("Bed", player) - or state.can_reach_region('Village', player), - "You Need a Mint": lambda state: can_respawn_ender_dragon(world, state, player) - and has_bottle(world, state, player), - "Monsters Hunted": lambda state: can_respawn_ender_dragon(world, state, player) # Ghast, Hoglin, Magma Cube, Piglin - and can_kill_ender_dragon(world, state, player) # Ender Dragon, Enderman, Endermite, Silverfish - and can_kill_wither(world, state, player) # Blaze, Wither, Wither Skeleton, Zombified Piglin - and complete_raid(world, state, player) # Ravagers; Pillager Outposts - and state.can_reach_region('Bastion Remnant', player) # Piglin Brute - and state.can_reach_region('End City', player) # Shulker - and state.can_reach_region('Trial Chambers', player) # Breeze - and state.has("Lead", player) # Zoglins - and state.can_reach_region('Ocean Monument', player) # Drowned - and ( - (can_brew_potions(world, state, player) and state.has("Fishing Rod", player)) # Water Breathing Potions for Elder Guardian, Guardian - or (can_enchant(world, state, player) and state.has("Bucket", player)) # Aqua Affinity/Respiration and Milk/Axolotls for Elder Guardian, Guardian - ), - "Enchanter": lambda state: can_enchant(world, state, player), - "Voluntary Exile": lambda state: basic_combat(world, state, player), - "Eye Spy": lambda state: enter_stronghold(world, state, player), - "Serious Dedication": lambda state: (state.can_reach_location("Hidden in the Depths", player) - and state.has("8 Netherite Scrap", player) - and has_gold_ingots(world, state, player)), - "Postmortal": lambda state: complete_raid(world, state, player), - "Adventuring Time": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has("Progressive Tools", player, 2) - and state.can_reach_region('Ocean Monument', player) # Most Oceans - and state.can_reach_region('Woodland Mansion', player) # Dark Forest - and state.can_reach_region('Ancient City', player) # Deep Dark - and state.can_reach_region('Trail Ruins', player), # Jungle, Birch Forest, Old Growth Birch Forest, all Taiga variants - "Hero of the Village": lambda state: complete_raid(world, state, player), - "Hidden in the Depths": lambda state: can_brew_potions(world, state, player) - and state.has("Bed", player) - and has_diamond_pickaxe(world, state, player), - "Beaconator": lambda state: (can_kill_wither(world, state, player) - and has_diamond_pickaxe(world, state, player) - and state.has("Progressive Resource Crafting", player, 2)), - "Withering Heights": lambda state: can_kill_wither(world, state, player), - "A Balanced Diet": lambda state: (has_bottle(world, state, player) # honey bottle - and state.has("Campfire", player) # honey bottle - and state.has("Fishing Rod", player) - and state.can_reach_location("Overpowered", player) # gapple, notch apple - and state.can_reach_region('The End', player)), # chorus fruit - "Subspace Bubble": lambda state: has_diamond_pickaxe(world, state, player), - "Country Lode, Take Me Home": lambda state: state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "Bee Our Guest": lambda state: state.has("Campfire", player) - and has_bottle(world, state, player), - "Uneasy Alliance": lambda state: has_diamond_pickaxe(world, state, player) - and state.has('Fishing Rod', player), - "Diamonds!": lambda state: state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "A Throwaway Joke": lambda state: basic_combat(world, state, player), - "Sticky Situation": lambda state: state.has("Campfire", player) - and has_bottle(world, state, player), - "Ol' Betsy": lambda state: craft_crossbow(world, state, player), - "Cover Me in Debris": lambda state: state.has("Progressive Armor", player, 2) - and state.has("8 Netherite Scrap", player, 2) - and state.can_reach_location("Hidden in the Depths", player), - "Hot Topic": lambda state: state.has("Progressive Resource Crafting", player), - "The Lie": lambda state: has_iron_ingots(world, state, player) - and state.has("Bucket", player), - "On a Rail": lambda state: has_iron_ingots(world, state, player) - and state.has('Progressive Tools', player, 2), - "When Pigs Fly": lambda state: has_iron_ingots(world, state, player) - and state.has("Saddle", player) - and state.has("Fishing Rod", player) - and can_adventure(world, state, player), - "Overkill": lambda state: ( - can_brew_potions(world, state, player) - and ( - state.has("Progressive Weapons", player) - or state.can_reach_region('The Nether', player) - ) - ) - or ( - state.can_reach_location("Over-Overkill", player) - and world.options.include_hard_advancements - and "Over-Overkill" not in world.options.exclude_locations.value - ), - "Librarian": lambda state: state.has("Enchanting", player), - "Overpowered": lambda state: has_iron_ingots(world, state, player) - and state.has('Progressive Tools', player, 2) - and basic_combat(world, state, player), - "Wax On": lambda state: state.has('Campfire', player) - and has_copper_ingots(world, state, player), - "Wax Off": lambda state: ( - has_copper_ingots(world, state, player) - and state.has('Campfire', player) - ) - or state.can_reach_region("Trial Chambers", player), - "The Cutest Predator": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has('Bucket', player), - "The Healing Power of Friendship": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has('Bucket', player), - "Is It a Bird?": lambda state: has_spyglass(world, state, player), - "Is It a Balloon?": lambda state: has_spyglass(world, state, player), - "Is It a Plane?": lambda state: has_spyglass(world, state, player) - and can_respawn_ender_dragon(world, state, player), - "Surge Protector": lambda state: state.has("Channeling Book", player) - and can_use_anvil(world, state, player) - and can_enchant(world, state, player) - and overworld_villager(world, state, player), - "Light as a Rabbit": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has('Bucket', player), - "Glow and Behold!": lambda state: can_adventure(world, state, player), - "Whatever Floats Your Goat!": lambda state: can_adventure(world, state, player), - "Caves & Cliffs": lambda state: has_iron_ingots(world, state, player) - and state.has('Bucket', player) - and state.has('Progressive Tools', player, 2), - "Feels Like Home": lambda state: has_iron_ingots(world, state, player) - and state.has('Bucket', player) - and state.has('Fishing Rod', player) - and state.has("Saddle", player), - "Sound of Music": lambda state: state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player) - and can_adventure(world, state, player) - and ( - basic_combat(world, state, player) - or state.can_reach_region("The Nether", player) - or state.can_reach_region("Ancient City", player) - ), - "Star Trader": lambda state: has_iron_ingots(world, state, player) - and state.has('Bucket', player) - and ( - state.can_reach_region("The Nether", player) # soul sand in nether - or state.can_reach_region("Nether Fortress", player) # soul sand in fortress if not in nether for water elevator - or can_piglin_trade(world, state, player) # piglins give soul sand - ) - and overworld_villager(world, state, player), - "Birthday Song": lambda state: state.can_reach_location("The Lie", player) - and state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player) - and ( - state.can_reach_region('Pillager Outpost', player) - or ( - basic_combat(world, state, player) - and state.can_reach_region('Woodland Mansion', player) - ) - ), - "Bukkit Bukkit": lambda state: state.has("Bucket", player) - and has_iron_ingots(world, state, player) - and can_adventure(world, state, player), - "It Spreads": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has("Progressive Tools", player, 2), - "Sneak 100": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has("Progressive Tools", player, 2), - "When the Squad Hops into Town": lambda state: can_adventure(world, state, player) - and state.has("Lead", player) - and state.has("Bucket", player) - and has_iron_ingots(world, state, player), - "With Our Powers Combined!": lambda state: can_adventure(world, state, player) - and state.has("Lead", player) - and state.has("Bucket", player) - and has_iron_ingots(world, state, player), - "You've Got a Friend in Me": lambda state: state.can_reach_region('Pillager Outpost', player) - or ( - basic_combat(world, state, player) - and state.can_reach_region('Woodland Mansion', player) - ), - "Smells Interesting": lambda state: can_excavate(world, state, player), - "Little Sniffs": lambda state: can_excavate(world, state, player), - "Planting the Past": lambda state: can_excavate(world, state, player), - "Crafting a New Look": lambda state: has_iron_ingots(world, state, player) # Maybe streamline this one - and ( - fortress_loot(world, state, player) - or ( - state.can_reach_region("Pillager Outpost", player) - and basic_combat(world, state, player) - ) - or ( - state.can_reach_region("Bastion Remnant", player) - and basic_combat(world, state, player) - ) - or ( - state.can_reach_region("End City", player) - and basic_combat(world, state, player) - ) - or ( - state.can_reach_region("Ocean Monument", player) - and basic_combat(world, state, player) - and state.has("Bucket", player) - and can_enchant(world, state, player) - ) - or ( - state.can_reach_region("Woodland Mansion", player) - and basic_combat(world, state, player) - ) - or state.can_reach_region("Ancient City", player) - or ( - state.can_reach_region("Trail Ruins", player) - and state.has("Brush", player) - ) - ), - "Smithing with Style": lambda state: can_excavate(world, state, player) # Wayfinder Armor Trim - and fortress_loot(world, state, player) # Rib Armor Trim - and state.can_reach_region("Bastion Remnant", player) # Snout Armor Trim - and state.can_reach_region("End City", player) # Spire Armor Trim - and ( - ( # Water Breathing Potions - state.has("Fishing Rod", player) - and can_brew_potions(world, state, player) - ) - or ( - state.has("Bucket", player) # Milk/Axolotls - and can_enchant(world, state, player) # Respiration - ) - ) - and state.can_reach_region("Woodland Mansion", player) # Vex Armor Trim - and state.can_reach_region("Ancient City", player) # Ward and Silence Armor Trims - and state.can_reach_region("Trail Ruins", player) - and state.can_reach_region("Ocean Monument", player), # Tide Armor Trim - "Respecting the Remnants": lambda state: can_excavate(world, state, player) - and ( - state.can_reach_region("Ocean Monument", player) - or state.can_reach_region("Trail Ruins", player) - ), - "Careful Restoration": lambda state: can_excavate(world, state, player) - and ( - state.can_reach_region("Ocean Monument", player) - or state.can_reach_region("Trail Ruins", player) - ), - "The Power of Books": lambda state: state.has("Progressive Tools", player, 2), - "Isn't It Scute?": lambda state: can_adventure(world, state, player) - and has_copper_ingots(world, state, player) - and state.has("Brush", player), - "Shear Brilliance": lambda state: can_adventure(world, state, player) - and has_copper_ingots(world, state, player) - and state.has("Brush", player), - "Good as New": lambda state: can_adventure(world, state, player) - and has_copper_ingots(world, state, player) - and state.has("Brush", player), - "The Whole Pack": lambda state: can_adventure(world, state, player), - "Under Lock and Key": lambda state: basic_combat(world, state, player), - "Blowback": lambda state: basic_combat(world, state, player), - "Who Needs Rockets?": lambda state: basic_combat(world, state, player), - "Crafters Crafting Crafters": lambda state: has_iron_ingots(world, state, player) - and state.has("Progressive Tools", player, 2), - "Lighten Up": lambda state: ( - fortress_loot(world, state, player) - and state.has("Progressive Tools", player, 2) - and state.has("Progressive Resource Crafting", player, 2) - ) - or state.can_reach_region("Trial Chambers", player), - "Over-Overkill": lambda state: ominous_vaults(world, state, player), - "Revaulting": lambda state: ominous_vaults(world, state, player), - "Stay Hydrated!": lambda state: state.can_reach_region("The Nether", player) - or can_piglin_trade(world, state, player), - "Heart Transplanter": lambda state: can_adventure(world, state, player) - and ( - ( - basic_combat(world, state, player) - and state.has("Progressive Resource Crafting", player, 2) - ) - or ( - state.has("Silk Touch Book", player) - and can_use_anvil(world, state, player) - and can_enchant(world, state, player) - ) - ), - "Mob Kabob": lambda state: state.has("Progressive Resource Crafting", player) - } - } - return rules_lookup - - -def set_rules(self: "MinecraftWorld") -> None: +def set_all_rules(self: "MinecraftWorld") -> None: + set_main_rules(self) + set_special_rules(self) + + +def set_main_rules(self: "MinecraftWorld") -> None: + # new_world = self.get_entrance("New World") + nether_portal = self.get_entrance("Nether Portal") + end_portal = self.get_entrance("End Portal") + overworld_structure_1 = self.get_entrance("Overworld Structure 1") + overworld_structure_2 = self.get_entrance("Overworld Structure 2") + nether_structure_1 = self.get_entrance("Nether Structure 1") + nether_structure_2 = self.get_entrance("Nether Structure 2") + the_end_structure = self.get_entrance("The End Structure") + ocean = self.get_entrance("Ocean") + dark_forest = self.get_entrance("Dark Forest") + deep_dark = self.get_entrance("Deep Dark") + ruins = self.get_entrance("Ruins") + underground = self.get_entrance("Underground") + + nether = CanReachRegion("The Nether") + the_end = CanReachRegion("The End") + village = CanReachRegion("Village") + outpost = CanReachRegion("Pillager Outpost") + fortress = CanReachRegion("Nether Fortress") + bastion = CanReachRegion("Bastion Remnant") + end_city = CanReachRegion("End City") + monument = CanReachRegion("Ocean Monument") + mansion = CanReachRegion("Woodland Mansion") + ancient_city = CanReachRegion("Ancient City") + trail_ruins = CanReachRegion("Trail Ruins") + trial_chambers = CanReachRegion("Trial Chambers") + + stone_tools = Has("Progressive Tools") + furnace = Has("Progressive Resource Crafting") + iron_ingots = stone_tools & furnace + copper_ingots = iron_ingots + + iron_tools = Has("Progressive Tools", count=2) & iron_ingots + diamond_tools = Has("Progressive Tools", count=3) & iron_ingots + + stone_weapons = Has("Progressive Weapons") + iron_weapons = Has("Progressive Weapons", count=2) & iron_ingots + diamond_weapons = Has("Progressive Weapons", count=3) & iron_tools + + iron_armor = Has("Progressive Armor") & iron_ingots + diamond_armor = Has("Progressive Armor", count=2) & iron_tools + + bow = Has("Archery") + crossbow = bow & iron_ingots + resource_blocks = Has("Progressive Resource Crafting", count=2) + blaze_rods = Has("Blaze Rods") + brewing = Has("Brewing") & blaze_rods + can_enchant = Has("Enchanting") & diamond_tools + anvil = resource_blocks & iron_ingots + enchanted_books = can_enchant & anvil + bucket = Has("Bucket") & iron_ingots + flint_and_steel = Has("Flint and Steel") & iron_ingots + bed = Has("Bed") + bottles = Has("Bottles") & furnace + potions = brewing & bottles + shield = Has("Shield") & iron_ingots + fishing_rod = Has("Fishing Rod") + campfire = Has("Campfire") + netherite_scrap = Has("8 Netherite Scrap") + channeling = Has("Channeling Book") & enchanted_books + silk_touch = Has("Silk Touch Book") & enchanted_books + piercing_iv = Has("Piercing IV Book") & enchanted_books + ender_pearls = Has("3 Ender Pearls") + saddle = Has("Saddle") & iron_ingots + lead = Has("Lead") + brush = Has("Brush") & copper_ingots + + gold_ingots = iron_tools | (nether & Has("Progressive Resource Crafting")) + ancient_debris = nether & potions & bed & diamond_tools + eye_of_ender = ender_pearls & brewing + + piglin_bartering = gold_ingots & (nether | bastion) + + cure_zombie = potions & gold_ingots + + village_dimension = self.get_region("Village").entrances[0].parent_region.name + + if village_dimension == "The Nether": + overworld_villagers = cure_zombie | (village & diamond_tools) + elif village_dimension == "The End": + overworld_villagers = cure_zombie + else: + overworld_villagers = village | cure_zombie + + no_death_link = OptionFilter(DeathLink, False) + death_link_check = no_death_link | bed + + easy = OptionFilter(CombatDifficulty, CombatDifficulty.option_easy) + normal = OptionFilter(CombatDifficulty, CombatDifficulty.option_normal) + hard = OptionFilter(CombatDifficulty, CombatDifficulty.option_hard) + + easy_adventure = easy & iron_weapons & death_link_check + normal_adventure = normal & stone_weapons & (furnace | campfire) & death_link_check + can_adventure = easy_adventure | normal_adventure | hard + + spyglass = Has("Spyglass") & copper_ingots & can_adventure + stronghold = eye_of_ender & can_adventure + + easy_combat = easy & iron_weapons & iron_armor & shield + normal_combat = normal & stone_weapons & (iron_armor | shield) + combat = easy_combat | normal_combat | hard + + loot_fortress = fortress & combat + enchanted_golden_apple = iron_tools & combat & bastion + + easy_ominous_vaults = easy & diamond_weapons & diamond_armor & shield + normal_ominous_vaults = normal & iron_weapons & iron_armor & shield + hard_ominous_vaults = hard & iron_weapons & (iron_armor | shield) + ominous_vaults = trial_chambers & outpost & (easy_ominous_vaults | normal_ominous_vaults | hard_ominous_vaults) + + hard_advancements = OptionFilter(HardAdvancements, True) + exclude_mace = [OptionFilter(ExcludeLocations, ExcludeLocations("Over-Overkill"))] + mace = ominous_vaults & hard_advancements & exclude_mace + + easy_raid = easy & diamond_weapons & diamond_armor & shield & bow + normal_raid = normal & iron_weapons & iron_armor & shield + hard_raid = hard & iron_weapons & (iron_armor | shield) + beat_raid = village & outpost & (easy_raid | normal_raid | hard_raid) + + basic_wither_kill = diamond_weapons & diamond_armor & potions & can_enchant + easy_wither = easy & basic_wither_kill & bow + normal_wither = normal & basic_wither_kill + hard_wither = hard & (basic_wither_kill | nether | the_end) + kill_wither = loot_fortress & (easy_wither | normal_wither | hard_wither) + + beacon = kill_wither & diamond_tools & resource_blocks + + respawn_dragon = the_end & nether & furnace + easy_dragon = easy & diamond_weapons & diamond_armor & bow & potions & can_enchant + normal_dragon = normal & iron_weapons & iron_armor & bow + hard_dragon = hard & ((iron_weapons & iron_armor) | (stone_weapons & bed)) + kill_dragon = respawn_dragon & (easy_dragon | normal_dragon | hard_dragon) + + no_compasses = OptionFilter(StructureCompasses, False) + + # entrances + + overworld_compass_1 = Has(f"Structure Compass ({overworld_structure_1.connected_region.name})") + overworld_compass_2 = Has(f"Structure Compass ({overworld_structure_2.connected_region.name})") + nether_compass_1 = Has(f"Structure Compass ({nether_structure_1.connected_region.name})") + nether_compass_2 = Has(f"Structure Compass ({nether_structure_2.connected_region.name})") + the_end_compass = Has(f"Structure Compass ({the_end_structure.connected_region.name})") + ocean_compass = Has(f"Structure Compass ({ocean.connected_region.name})") + dark_forest_compass = Has(f"Structure Compass ({dark_forest.connected_region.name})") + deep_dark_compass = Has(f"Structure Compass ({deep_dark.connected_region.name})") + ruins_compass = Has(f"Structure Compass ({ruins.connected_region.name})") + underground_compass = Has(f"Structure Compass ({underground.connected_region.name})") + + # self.set_rule(new_world, True_) + self.set_rule(nether_portal, flint_and_steel & (diamond_tools | bucket)) + self.set_rule(end_portal, stronghold & Has("3 Ender Pearls", count=4)) + self.set_rule(overworld_structure_1, can_adventure & (no_compasses | overworld_compass_1)) + self.set_rule(overworld_structure_2, can_adventure & (no_compasses | overworld_compass_2)) + self.set_rule(nether_structure_1, can_adventure & (no_compasses | nether_compass_1)) + self.set_rule(nether_structure_2, can_adventure & (no_compasses | nether_compass_2)) + self.set_rule(the_end_structure, can_adventure & (no_compasses | the_end_compass)) + self.set_rule(ocean, can_adventure & (no_compasses | ocean_compass)) + self.set_rule(dark_forest, can_adventure & (no_compasses | dark_forest_compass)) + self.set_rule(deep_dark, can_adventure & iron_tools & (no_compasses | deep_dark_compass)) + self.set_rule(ruins, can_adventure & (no_compasses | ruins_compass)) + self.set_rule(underground, can_adventure & stone_tools & (no_compasses | underground_compass)) + + # events + + defeat_ender_dragon = self.get_location("Ender Dragon") + defeat_wither = self.get_location("Wither") + obtain_blaze_rods = self.get_location("Blaze Rods") + + # locations + + who_is_cutting_onions = self.get_location("Who is Cutting Onions?") + oh_shiny = self.get_location("Oh Shiny") + suit_up = self.get_location("Suit Up") + very_very_frightening = self.get_location("Very Very Frightening") + hot_stuff = self.get_location("Hot Stuff") + free_the_end = self.get_location("Free the End") + a_furious_cocktail = self.get_location("A Furious Cocktail") + # best_friends_forever = self.get_location("Best Friends Forever") + bring_home_the_beacon = self.get_location("Bring Home the Beacon") + not_today_thank_you = self.get_location("Not Today, Thank You") + isnt_it_iron_pick = self.get_location("Isn't It Iron Pick") + local_brewery = self.get_location("Local Brewery") + the_next_generation = self.get_location("The Next Generation") + fishy_business = self.get_location("Fishy Business") + # hot_tourist_destinations = self.get_location("Hot Tourist Destinations") + this_boat_has_legs = self.get_location("This Boat Has Legs") + sniper_duel = self.get_location("Sniper Duel") + # enter_the_nether = self.get_location("Nether") + great_view_from_up_here = self.get_location("Great View From Up Here") + how_did_we_get_here = self.get_location("How Did We Get Here?") + bullseye = self.get_location("Bullseye") + spooky_scary_skeleton = self.get_location("Spooky Scary Skeleton") + two_by_two = self.get_location("Two by Two") + # stone_age = self.get_location("Stone Age") + two_birds_one_arrow = self.get_location("Two Birds, One Arrow") + # we_need_to_go_deeper = self.get_location("We Need to Go Deeper") + whos_the_pillager_now = self.get_location("Who's the Pillager Now?") + getting_an_upgrade = self.get_location("Getting an Upgrade") + tactical_fishing = self.get_location("Tactical Fishing") + zombie_doctor = self.get_location("Zombie Doctor") + # the_city_at_the_end_of_the_game = self.get_location("The City at the End of the Game") + ice_bucket_challenge = self.get_location("Ice Bucket Challenge") + # remote_getaway = self.get_location("Remote Getaway") + into_fire = self.get_location("Into Fire") + war_pigs = self.get_location("War Pigs") + take_aim = self.get_location("Take Aim") + total_beelocation = self.get_location("Total Beelocation") + arbalistic = self.get_location("Arbalistic") + the_end_again = self.get_location("The End... Again...") + acquire_hardware = self.get_location("Acquire Hardware") + not_quite_nine_lives = self.get_location("Not Quite \"Nine\" Lives") + cover_me_with_diamonds = self.get_location("Cover Me with Diamonds") + skys_the_limit = self.get_location("Sky's the Limit") + hired_help = self.get_location("Hired Help") + # return_to_sender = self.get_location("Return to Sender") + sweet_dreams = self.get_location("Sweet Dreams") + you_need_a_mint = self.get_location("You Need a Mint") + # adventure = self.get_location("Adventure") + monsters_hunted = self.get_location("Monsters Hunted") + enchanter = self.get_location("Enchanter") + voluntary_exile = self.get_location("Voluntary Exile") + eye_spy = self.get_location("Eye Spy") + # enter_the_end = self.get_location("The End") + serious_dedication = self.get_location("Serious Dedication") + postmortal = self.get_location("Postmortal") + # monster_hunter = self.get_location("Monster Hunter") + adventuring_time = self.get_location("Adventuring Time") + # a_seedy_place = self.get_location("A Seedy Place") + # those_were_the_days = self.get_location("Those Were the Days") + hero_of_the_village = self.get_location("Hero of the Village") + hidden_in_the_depths = self.get_location("Hidden in the Depths") + beaconator = self.get_location("Beaconator") + withering_heights = self.get_location("Withering Heights") + a_balanced_diet = self.get_location("A Balanced Diet") + subspace_bubble = self.get_location("Subspace Bubble") + # husbandry = self.get_location("Husbandry") + country_lode_take_me_home = self.get_location("Country Lode, Take Me Home") + bee_our_guest = self.get_location("Bee Our Guest") + # what_a_deal = self.get_location("What a Deal!") + uneasy_alliance = self.get_location("Uneasy Alliance") + diamonds = self.get_location("Diamonds!") + # a_terrible_fortress = self.get_location("A Terrible Fortress") + a_throwaway_joke = self.get_location("A Throwaway Joke") + # minecraft = self.get_location("Minecraft") + sticky_situation = self.get_location("Sticky Situation") + ol_betsy = self.get_location("Ol' Betsy") + cover_me_in_debris = self.get_location("Cover Me in Debris") + # is_this_the_end = self.get_location("The End?") + # the_parrots_and_the_bats = self.get_location("The Parrots and the Bats") + # a_complete_catalogue = self.get_location("A Complete Catalogue") + # getting_wood = self.get_location("Getting Wood") + # time_to_mine = self.get_location("Time to Mine!") + hot_topic = self.get_location("Hot Topic") + # bake_bread = self.get_location("Bake Bread") + the_lie = self.get_location("The Lie") + on_a_rail = self.get_location("On a Rail") + # time_to_strike = self.get_location("Time to Strike!") + # cow_tipper = self.get_location("Cow Tipper") + when_pigs_fly = self.get_location("When Pigs Fly") + overkill = self.get_location("Overkill") + librarian = self.get_location("Librarian") + overpowered = self.get_location("Overpowered") + wax_on = self.get_location("Wax On") + wax_off = self.get_location("Wax Off") + the_cutest_predator = self.get_location("The Cutest Predator") + the_healing_power_of_friendship = self.get_location("The Healing Power of Friendship") + is_it_a_bird = self.get_location("Is It a Bird?") + is_it_a_balloon = self.get_location("Is It a Balloon?") + is_it_a_plane = self.get_location("Is It a Plane?") + surge_protector = self.get_location("Surge Protector") + light_as_a_rabbit = self.get_location("Light as a Rabbit") + glow_and_behold = self.get_location("Glow and Behold!") + whatever_floats_your_goat = self.get_location("Whatever Floats Your Goat!") + caves_and_cliffs = self.get_location("Caves & Cliffs") + feels_like_home = self.get_location("Feels Like Home") + sound_of_music = self.get_location("Sound of Music") + star_trader = self.get_location("Star Trader") + birthday_song = self.get_location("Birthday Song") + bukkit_bukkit = self.get_location("Bukkit Bukkit") + # it_spreads = self.get_location("It Spreads") + # sneak_100 = self.get_location("Sneak 100") + when_the_squad_hops_into_town = self.get_location("When the Squad Hops into Town") + with_our_powers_combined = self.get_location("With Our Powers Combined!") + youve_got_a_friend_in_me = self.get_location("You've Got a Friend in Me") + smells_interesting = self.get_location("Smells Interesting") + little_sniffs = self.get_location("Little Sniffs") + planting_the_past = self.get_location("Planting the Past") + crafting_a_new_look = self.get_location("Crafting a New Look") + smithing_with_style = self.get_location("Smithing with Style") + respecting_the_remnants = self.get_location("Respecting the Remnants") + careful_restoration = self.get_location("Careful Restoration") + the_power_of_books = self.get_location("The Power of Books") + isnt_it_scute = self.get_location("Isn't It Scute?") + shear_brilliance = self.get_location("Shear Brilliance") + good_as_new = self.get_location("Good as New") + the_whole_pack = self.get_location("The Whole Pack") + # minecraft_trials_edition = self.get_location("Minecraft: Trial(s) Edition") + under_lock_and_key = self.get_location("Under Lock and Key") + blowback = self.get_location("Blowback") + who_needs_rockets = self.get_location("Who Needs Rockets?") + crafters_crafting_crafters = self.get_location("Crafters Crafting Crafters") + lighten_up = self.get_location("Lighten Up") + over_overkill = self.get_location("Over-Overkill") + revaulting = self.get_location("Revaulting") + stay_hydrated = self.get_location("Stay Hydrated!") + heart_transplanter = self.get_location("Heart Transplanter") + mob_kabob = self.get_location("Mob Kabob") + + self.set_rule(defeat_ender_dragon, kill_dragon) + self.set_rule(defeat_wither, kill_wither) + self.set_rule(obtain_blaze_rods, loot_fortress) + self.set_rule(who_is_cutting_onions, piglin_bartering) + self.set_rule(oh_shiny, piglin_bartering) + self.set_rule(suit_up, iron_armor) + self.set_rule(very_very_frightening, channeling & overworld_villagers) + self.set_rule(hot_stuff, bucket) + self.set_rule(free_the_end, kill_dragon) + self.set_rule(a_furious_cocktail, potions & fishing_rod & nether & village & beacon & trial_chambers) + self.set_rule(bring_home_the_beacon, beacon) + self.set_rule(not_today_thank_you, shield) + self.set_rule(isnt_it_iron_pick, iron_tools) + self.set_rule(local_brewery, potions) + self.set_rule(the_next_generation, kill_dragon) + self.set_rule(fishy_business, fishing_rod) + self.set_rule(this_boat_has_legs, saddle & fishing_rod) + self.set_rule(sniper_duel, bow) + self.set_rule(great_view_from_up_here, combat) + self.set_rule(how_did_we_get_here, potions & end_city & nether & monument & ancient_city & fishing_rod & bow + & beacon & beat_raid) + self.set_rule(bullseye, bow & iron_tools) + self.set_rule(spooky_scary_skeleton, loot_fortress) + self.set_rule(two_by_two, brush & monument & bucket & village & fishing_rod) + self.set_rule(two_birds_one_arrow, crossbow & can_enchant) + self.set_rule(whos_the_pillager_now, crossbow) + self.set_rule(getting_an_upgrade, stone_tools) + self.set_rule(tactical_fishing, bucket) + self.set_rule(zombie_doctor, cure_zombie) + self.set_rule(ice_bucket_challenge, diamond_tools) + self.set_rule(into_fire, loot_fortress) + self.set_rule(war_pigs, combat) + self.set_rule(take_aim, bow) + self.set_rule(total_beelocation, silk_touch) + self.set_rule(arbalistic, crossbow & piercing_iv) + self.set_rule(the_end_again, kill_dragon) + self.set_rule(acquire_hardware, iron_ingots) + self.set_rule(not_quite_nine_lives, piglin_bartering & resource_blocks) + self.set_rule(cover_me_with_diamonds, diamond_armor) + self.set_rule(skys_the_limit, combat) + self.set_rule(hired_help, resource_blocks & iron_ingots) + self.set_rule(sweet_dreams, bed | village) + self.set_rule(you_need_a_mint, respawn_dragon & bottles) + self.set_rule(monsters_hunted, kill_dragon & kill_wither & beat_raid & bastion & end_city & trial_chambers & lead + & monument & ((potions & fishing_rod) | (can_enchant & bucket))) + self.set_rule(enchanter, can_enchant) + self.set_rule(voluntary_exile, combat) + self.set_rule(eye_spy, stronghold) + self.set_rule(serious_dedication, ancient_debris & netherite_scrap & gold_ingots & diamond_tools) + self.set_rule(postmortal, beat_raid) + self.set_rule(adventuring_time, can_adventure & monument & mansion & ancient_city & trail_ruins) + self.set_rule(hero_of_the_village, beat_raid) + self.set_rule(hidden_in_the_depths, ancient_debris) + self.set_rule(beaconator, beacon) + self.set_rule(withering_heights, kill_wither) + self.set_rule(a_balanced_diet, bottles & campfire & fishing_rod & enchanted_golden_apple & the_end) + self.set_rule(subspace_bubble, diamond_tools) + self.set_rule(country_lode_take_me_home, iron_tools) + self.set_rule(bee_our_guest, campfire & bottles) + self.set_rule(uneasy_alliance, diamond_tools & fishing_rod) + self.set_rule(diamonds, iron_tools) + self.set_rule(a_throwaway_joke, combat) + self.set_rule(sticky_situation, campfire & bottles) + self.set_rule(ol_betsy, crossbow) + self.set_rule(cover_me_in_debris, diamond_armor & Has("8 Netherite Scrap", count=2) & ancient_debris) + self.set_rule(hot_topic, furnace) + self.set_rule(the_lie, bucket) + self.set_rule(on_a_rail, iron_tools) + self.set_rule(when_pigs_fly, saddle & fishing_rod & can_adventure) + self.set_rule(overkill, (potions & (stone_tools | nether)) | mace) + self.set_rule(librarian, Has("Enchanting")) + self.set_rule(overpowered, enchanted_golden_apple) + self.set_rule(wax_on, campfire & copper_ingots) + self.set_rule(wax_off, trial_chambers | (campfire & copper_ingots)) + self.set_rule(the_cutest_predator, can_adventure & bucket) + self.set_rule(the_healing_power_of_friendship, can_adventure & bucket) + self.set_rule(is_it_a_bird, spyglass) + self.set_rule(is_it_a_balloon, spyglass) + self.set_rule(is_it_a_plane, spyglass & respawn_dragon) + self.set_rule(surge_protector, channeling & overworld_villagers) + self.set_rule(light_as_a_rabbit, can_adventure & bucket) + self.set_rule(glow_and_behold, can_adventure) + self.set_rule(whatever_floats_your_goat, can_adventure) + self.set_rule(caves_and_cliffs, bucket & iron_tools) + self.set_rule(feels_like_home, bucket & fishing_rod & saddle) + self.set_rule(sound_of_music, can_adventure & iron_tools & (combat | nether | ancient_city)) + self.set_rule(star_trader, overworld_villagers & bucket & (nether | fortress | piglin_bartering)) + self.set_rule(birthday_song, bucket & iron_tools & (outpost | (combat & mansion))) + self.set_rule(bukkit_bukkit, bucket & can_adventure) + self.set_rule(when_the_squad_hops_into_town, can_adventure & lead & bucket) + self.set_rule(with_our_powers_combined, can_adventure & lead & bucket) + self.set_rule(youve_got_a_friend_in_me, outpost | (combat & mansion)) + self.set_rule(smells_interesting, brush) + self.set_rule(little_sniffs, brush) + self.set_rule(planting_the_past, brush) + self.set_rule(crafting_a_new_look, iron_ingots + & (loot_fortress | ancient_city | (trail_ruins & brush) + | (combat & (outpost | bastion | end_city | mansion | (monument & bucket & can_enchant))))) + self.set_rule(smithing_with_style, iron_ingots & trail_ruins & brush & loot_fortress & bastion & end_city & mansion + & ancient_city & monument & ((fishing_rod & potions) | (bucket & can_enchant))) + self.set_rule(respecting_the_remnants, brush & (monument | trail_ruins)) + self.set_rule(careful_restoration, brush & (monument | trail_ruins)) + self.set_rule(the_power_of_books, iron_tools) + self.set_rule(isnt_it_scute, can_adventure & brush) + self.set_rule(shear_brilliance, can_adventure & brush & iron_ingots) + self.set_rule(good_as_new, can_adventure & brush) + self.set_rule(the_whole_pack, can_adventure) + self.set_rule(under_lock_and_key, combat) + self.set_rule(blowback, combat) + self.set_rule(who_needs_rockets, combat) + self.set_rule(crafters_crafting_crafters, iron_tools) + self.set_rule(lighten_up, trial_chambers | (loot_fortress & iron_tools & resource_blocks)) + self.set_rule(over_overkill, ominous_vaults) + self.set_rule(revaulting, ominous_vaults) + self.set_rule(stay_hydrated, nether | piglin_bartering) + self.set_rule(heart_transplanter, can_adventure & (silk_touch | (combat & resource_blocks))) + self.set_rule(mob_kabob, furnace) + + +def set_special_rules(self: "MinecraftWorld") -> None: multiworld = self.multiworld player = self.player - rules_lookup = get_rules_lookup(self, player) - - # Set entrance rules - for entrance_name, rule in rules_lookup["entrances"].items(): - multiworld.get_entrance(entrance_name, player).access_rule = rule - - # Set location rules - for location_name, rule in rules_lookup["locations"].items(): - multiworld.get_location(location_name, player).access_rule = rule - # Set rules surrounding completion bosses = self.options.required_bosses postgame_advancements = set() diff --git a/worlds/minecraft/__init__.py b/worlds/minecraft/__init__.py index 9234cb873998..3ef4fbc02bba 100644 --- a/worlds/minecraft/__init__.py +++ b/worlds/minecraft/__init__.py @@ -14,7 +14,7 @@ from .Options import MinecraftOptions from .Structures import shuffle_structures from .ItemPool import build_item_pool, get_junk_item_names -from .Rules import set_rules +from .Rules import set_all_rules from ..LauncherComponents import icon_paths client_version = 9 @@ -237,7 +237,7 @@ def create_regions(self) -> None: def create_items(self) -> None: self.multiworld.itempool += build_item_pool(self) - set_rules = set_rules + set_rules = set_all_rules def generate_output(self, output_directory: str) -> None: data = self._get_mc_data() diff --git a/worlds/minecraft/archipelago.json b/worlds/minecraft/archipelago.json index 1cc62f2d31af..d0f1289c2109 100644 --- a/worlds/minecraft/archipelago.json +++ b/worlds/minecraft/archipelago.json @@ -5,6 +5,6 @@ "Seafo", "cjmang" ], - "minimum_ap_version": "0.6.3", + "minimum_ap_version": "0.6.7", "world_version": "2.0.0" } \ No newline at end of file diff --git a/worlds/stardew_valley/data/bundles_data/bundle_data.py b/worlds/stardew_valley/data/bundles_data/bundle_data.py index 11c0446073bb..a08a41677bb2 100644 --- a/worlds/stardew_valley/data/bundles_data/bundle_data.py +++ b/worlds/stardew_valley/data/bundles_data/bundle_data.py @@ -1,10 +1,10 @@ -from .remixed_bundles import * - -all_bundle_items_except_money = [] -all_remixed_bundles = [*crafts_room_bundles_remixed, *pantry_bundles_remixed, *fish_tank_bundles_remixed, - *boiler_room_bundles_remixed, *bulletin_board_bundles_remixed, missing_bundle_thematic, - *giant_stump_bundles_remixed] -for bundle in all_remixed_bundles: - all_bundle_items_except_money.extend(bundle.items) - -all_bundle_items_by_name = {item.item_name: item for item in all_bundle_items_except_money} +from .remixed_bundles import * + +all_bundle_items_except_money = [] +all_remixed_bundles = [*crafts_room_bundles_remixed, *pantry_bundles_remixed, *fish_tank_bundles_remixed, + *boiler_room_bundles_remixed, *bulletin_board_bundles_remixed, missing_bundle_thematic, + *giant_stump_bundles_remixed] +for bundle in all_remixed_bundles: + all_bundle_items_except_money.extend(bundle.items) + +all_bundle_items_by_name = {item.item_name: item for item in all_bundle_items_except_money} diff --git a/worlds/stardew_valley/data/bundles_data/bundle_items_data.py b/worlds/stardew_valley/data/bundles_data/bundle_items_data.py index 8093ab8927b4..b5fb34deaf06 100644 --- a/worlds/stardew_valley/data/bundles_data/bundle_items_data.py +++ b/worlds/stardew_valley/data/bundles_data/bundle_items_data.py @@ -1,599 +1,599 @@ -from ..hats_data import Hats -from ..shirt_data import Shirts -from ...bundles.bundle_item import BundleItem -from ...strings.animal_product_names import AnimalProduct -from ...strings.artisan_good_names import ArtisanGood -from ...strings.book_names import Book -from ...strings.boot_names import Boots -from ...strings.catalogue_names import CatalogueItem -from ...strings.craftable_names import Consumable, Lighting, Fishing, Craftable, Bomb, Furniture, Floor, Edible, Statue -from ...strings.crop_names import Vegetable, Fruit -from ...strings.currency_names import Currency -from ...strings.decoration_names import Decoration -from ...strings.fertilizer_names import Fertilizer, SpeedGro, RetainingSoil -from ...strings.fish_names import Fish, WaterItem, Trash -from ...strings.flower_names import Flower -from ...strings.food_names import Meal, Beverage -from ...strings.forageable_names import Forageable, Mushroom -from ...strings.fruit_tree_names import Sapling -from ...strings.geode_names import Geode -from ...strings.gift_names import Gift -from ...strings.ingredient_names import Ingredient -from ...strings.machine_names import Machine -from ...strings.material_names import Material -from ...strings.meme_item_names import MemeItem -from ...strings.metal_names import Fossil, Ore, MetalBar, Mineral, Artifact -from ...strings.monster_drop_names import Loot -from ...strings.seed_names import TreeSeed, Seed -from ...strings.special_item_names import SpecialItem, NotReallyAnItem - -wild_horseradish = BundleItem(Forageable.wild_horseradish) -daffodil = BundleItem(Forageable.daffodil) -leek = BundleItem(Forageable.leek) -dandelion = BundleItem(Forageable.dandelion) -morel = BundleItem(Mushroom.morel) -common_mushroom = BundleItem(Mushroom.common) -salmonberry = BundleItem(Forageable.salmonberry, can_have_quality=False) -spring_onion = BundleItem(Forageable.spring_onion) - -grape = BundleItem(Fruit.grape) -spice_berry = BundleItem(Forageable.spice_berry) -sweet_pea = BundleItem(Forageable.sweet_pea) -red_mushroom = BundleItem(Mushroom.red) -fiddlehead_fern = BundleItem(Forageable.fiddlehead_fern) - -wild_plum = BundleItem(Forageable.wild_plum) -hazelnut = BundleItem(Forageable.hazelnut) -blackberry = BundleItem(Forageable.blackberry) -chanterelle = BundleItem(Mushroom.chanterelle) - -winter_root = BundleItem(Forageable.winter_root) -crystal_fruit = BundleItem(Forageable.crystal_fruit) -snow_yam = BundleItem(Forageable.snow_yam) -crocus = BundleItem(Forageable.crocus) -holly = BundleItem(Forageable.holly) - -coconut = BundleItem(Forageable.coconut) -golden_coconut = BundleItem(Geode.golden_coconut, source=BundleItem.Sources.island) -cactus_fruit = BundleItem(Forageable.cactus_fruit) -cave_carrot = BundleItem(Forageable.cave_carrot) -purple_mushroom = BundleItem(Mushroom.purple) -maple_syrup = BundleItem(ArtisanGood.maple_syrup) -oak_resin = BundleItem(ArtisanGood.oak_resin) -pine_tar = BundleItem(ArtisanGood.pine_tar) -nautilus_shell = BundleItem(WaterItem.nautilus_shell) -coral = BundleItem(WaterItem.coral) -sea_urchin = BundleItem(WaterItem.sea_urchin) -rainbow_shell = BundleItem(Forageable.rainbow_shell) -clam = BundleItem(Fish.clam) -cockle = BundleItem(Fish.cockle) -mussel = BundleItem(Fish.mussel) -oyster = BundleItem(Fish.oyster) -seaweed = BundleItem(WaterItem.seaweed, can_have_quality=False) - -wood = BundleItem(Material.wood, 99) -stone = BundleItem(Material.stone, 99) -hardwood = BundleItem(Material.hardwood, 10) -clay = BundleItem(Material.clay) -fiber = BundleItem(Material.fiber) -moss = BundleItem(Material.moss) - -mixed_seeds = BundleItem(Seed.mixed) -acorn = BundleItem(TreeSeed.acorn) -maple_seed = BundleItem(TreeSeed.maple) -pine_cone = BundleItem(TreeSeed.pine) -mahogany_seed = BundleItem(TreeSeed.mahogany) -mushroom_tree_seed = BundleItem(TreeSeed.mushroom, source=BundleItem.Sources.island) -mystic_tree_seed = BundleItem(TreeSeed.mystic, source=BundleItem.Sources.masteries) -mossy_seed = BundleItem(TreeSeed.mossy) - -strawberry_seeds = BundleItem(Seed.strawberry) -sunflower_seeds = BundleItem(Seed.sunflower) - -blue_jazz = BundleItem(Flower.blue_jazz) -cauliflower = BundleItem(Vegetable.cauliflower) -green_bean = BundleItem(Vegetable.green_bean) -kale = BundleItem(Vegetable.kale) -parsnip = BundleItem(Vegetable.parsnip) -potato = BundleItem(Vegetable.potato) -strawberry = BundleItem(Fruit.strawberry, source=BundleItem.Sources.festival) -tulip = BundleItem(Flower.tulip) -unmilled_rice = BundleItem(Vegetable.unmilled_rice) -coffee_bean = BundleItem(Seed.coffee) -garlic = BundleItem(Vegetable.garlic) -blueberry = BundleItem(Fruit.blueberry) -corn = BundleItem(Vegetable.corn) -hops = BundleItem(Vegetable.hops) -hot_pepper = BundleItem(Fruit.hot_pepper) -melon = BundleItem(Fruit.melon) -poppy = BundleItem(Flower.poppy) -radish = BundleItem(Vegetable.radish) -summer_spangle = BundleItem(Flower.summer_spangle) -sunflower = BundleItem(Flower.sunflower) -tomato = BundleItem(Vegetable.tomato) -wheat = BundleItem(Vegetable.wheat) -hay = BundleItem(Forageable.hay) -amaranth = BundleItem(Vegetable.amaranth) -bok_choy = BundleItem(Vegetable.bok_choy) -cranberries = BundleItem(Fruit.cranberries) -eggplant = BundleItem(Vegetable.eggplant) -fairy_rose = BundleItem(Flower.fairy_rose) -pumpkin = BundleItem(Vegetable.pumpkin) -yam = BundleItem(Vegetable.yam) -sweet_gem_berry = BundleItem(Fruit.sweet_gem_berry) -rhubarb = BundleItem(Fruit.rhubarb) -beet = BundleItem(Vegetable.beet) -red_cabbage = BundleItem(Vegetable.red_cabbage) -starfruit = BundleItem(Fruit.starfruit) -artichoke = BundleItem(Vegetable.artichoke) -pineapple = BundleItem(Fruit.pineapple, source=BundleItem.Sources.content) -taro_root = BundleItem(Vegetable.taro_root, source=BundleItem.Sources.content) -dragon_tooth = BundleItem(Forageable.dragon_tooth, source=BundleItem.Sources.content) - -carrot = BundleItem(Vegetable.carrot) -summer_squash = BundleItem(Vegetable.summer_squash) -broccoli = BundleItem(Vegetable.broccoli) -powdermelon = BundleItem(Fruit.powdermelon) - -egg = BundleItem(AnimalProduct.egg) -large_egg = BundleItem(AnimalProduct.large_egg) -brown_egg = BundleItem(AnimalProduct.brown_egg) -large_brown_egg = BundleItem(AnimalProduct.large_brown_egg) -wool = BundleItem(AnimalProduct.wool) -milk = BundleItem(AnimalProduct.milk) -large_milk = BundleItem(AnimalProduct.large_milk) -goat_milk = BundleItem(AnimalProduct.goat_milk) -large_goat_milk = BundleItem(AnimalProduct.large_goat_milk) -truffle = BundleItem(AnimalProduct.truffle) -duck_feather = BundleItem(AnimalProduct.duck_feather) -duck_egg = BundleItem(AnimalProduct.duck_egg) -rabbit_foot = BundleItem(AnimalProduct.rabbit_foot) -dinosaur_egg = BundleItem(AnimalProduct.dinosaur_egg) -void_egg = BundleItem(AnimalProduct.void_egg) -ostrich_egg = BundleItem(AnimalProduct.ostrich_egg, source=BundleItem.Sources.content) -golden_egg = BundleItem(AnimalProduct.golden_egg) - -truffle_oil = BundleItem(ArtisanGood.truffle_oil) -cloth = BundleItem(ArtisanGood.cloth) -goat_cheese = BundleItem(ArtisanGood.goat_cheese) -cheese = BundleItem(ArtisanGood.cheese) -honey = BundleItem(ArtisanGood.honey) -beer = BundleItem(Beverage.beer) -mayonnaise = BundleItem(ArtisanGood.mayonnaise) -juice = BundleItem(ArtisanGood.juice) -mead = BundleItem(ArtisanGood.mead) -pale_ale = BundleItem(ArtisanGood.pale_ale) -wine = BundleItem(ArtisanGood.wine) -jelly = BundleItem(ArtisanGood.jelly) -pickles = BundleItem(ArtisanGood.pickles) -caviar = BundleItem(ArtisanGood.caviar) -aged_roe = BundleItem(ArtisanGood.aged_roe) -roe = BundleItem(AnimalProduct.roe) -squid_ink = BundleItem(AnimalProduct.squid_ink) -coffee = BundleItem(Beverage.coffee) -green_tea = BundleItem(ArtisanGood.green_tea) -apple = BundleItem(Fruit.apple) -apricot = BundleItem(Fruit.apricot) -orange = BundleItem(Fruit.orange) -peach = BundleItem(Fruit.peach) -pomegranate = BundleItem(Fruit.pomegranate) -cherry = BundleItem(Fruit.cherry) -banana = BundleItem(Fruit.banana, source=BundleItem.Sources.content) -mango = BundleItem(Fruit.mango, source=BundleItem.Sources.content) - -basic_fertilizer = BundleItem(Fertilizer.basic, 100) -quality_fertilizer = BundleItem(Fertilizer.quality, 20) -deluxe_fertilizer = BundleItem(Fertilizer.deluxe, 5, source=BundleItem.Sources.island) -basic_retaining_soil = BundleItem(RetainingSoil.basic, 80) -quality_retaining_soil = BundleItem(RetainingSoil.quality, 50) -deluxe_retaining_soil = BundleItem(RetainingSoil.deluxe, 20, source=BundleItem.Sources.island) -speed_gro = BundleItem(SpeedGro.basic, 40) -deluxe_speed_gro = BundleItem(SpeedGro.deluxe, 20) -hyper_speed_gro = BundleItem(SpeedGro.hyper, 5, source=BundleItem.Sources.qi_board) -tree_fertilizer = BundleItem(Fertilizer.tree, 20) - -lobster = BundleItem(Fish.lobster) -crab = BundleItem(Fish.crab) -shrimp = BundleItem(Fish.shrimp) -crayfish = BundleItem(Fish.crayfish) -snail = BundleItem(Fish.snail) -periwinkle = BundleItem(Fish.periwinkle) -trash = BundleItem(Trash.trash) -driftwood = BundleItem(Trash.driftwood) -soggy_newspaper = BundleItem(Trash.soggy_newspaper) -broken_cd = BundleItem(Trash.broken_cd) -broken_glasses = BundleItem(Trash.broken_glasses) - -chub = BundleItem(Fish.chub) -catfish = BundleItem(Fish.catfish) -rainbow_trout = BundleItem(Fish.rainbow_trout) -lingcod = BundleItem(Fish.lingcod) -walleye = BundleItem(Fish.walleye) -perch = BundleItem(Fish.perch) -pike = BundleItem(Fish.pike) -bream = BundleItem(Fish.bream) -salmon = BundleItem(Fish.salmon) -sunfish = BundleItem(Fish.sunfish) -tiger_trout = BundleItem(Fish.tiger_trout) -shad = BundleItem(Fish.shad) -smallmouth_bass = BundleItem(Fish.smallmouth_bass) -dorado = BundleItem(Fish.dorado) -carp = BundleItem(Fish.carp) -midnight_carp = BundleItem(Fish.midnight_carp) -largemouth_bass = BundleItem(Fish.largemouth_bass) -sturgeon = BundleItem(Fish.sturgeon) -bullhead = BundleItem(Fish.bullhead) -tilapia = BundleItem(Fish.tilapia) -pufferfish = BundleItem(Fish.pufferfish) -tuna = BundleItem(Fish.tuna) -super_cucumber = BundleItem(Fish.super_cucumber) -flounder = BundleItem(Fish.flounder) -anchovy = BundleItem(Fish.anchovy) -sardine = BundleItem(Fish.sardine) -red_mullet = BundleItem(Fish.red_mullet) -herring = BundleItem(Fish.herring) -eel = BundleItem(Fish.eel) -octopus = BundleItem(Fish.octopus) -red_snapper = BundleItem(Fish.red_snapper) -squid = BundleItem(Fish.squid) -sea_cucumber = BundleItem(Fish.sea_cucumber) -albacore = BundleItem(Fish.albacore) -halibut = BundleItem(Fish.halibut) -scorpion_carp = BundleItem(Fish.scorpion_carp) -sandfish = BundleItem(Fish.sandfish) -woodskip = BundleItem(Fish.woodskip) -lava_eel = BundleItem(Fish.lava_eel) -ice_pip = BundleItem(Fish.ice_pip) -stonefish = BundleItem(Fish.stonefish) -ghostfish = BundleItem(Fish.ghostfish) - -bouquet = BundleItem(Gift.bouquet) -wilted_bouquet = BundleItem(Gift.wilted_bouquet) -copper_bar = BundleItem(MetalBar.copper) -iron_bar = BundleItem(MetalBar.iron) -gold_bar = BundleItem(MetalBar.gold) -iridium_bar = BundleItem(MetalBar.iridium) -radioactive_bar = BundleItem(MetalBar.radioactive, source=BundleItem.Sources.island) -refined_quartz = BundleItem(MetalBar.quartz) -coal = BundleItem(Material.coal) -iridium_ore = BundleItem(Ore.iridium) -gold_ore = BundleItem(Ore.gold) -iron_ore = BundleItem(Ore.iron) -copper_ore = BundleItem(Ore.copper) -radioactive_ore = BundleItem(Ore.radioactive, source=BundleItem.Sources.qi_board) -battery_pack = BundleItem(ArtisanGood.battery_pack) - -quartz = BundleItem(Mineral.quartz) -fire_quartz = BundleItem(Mineral.fire_quartz) -frozen_tear = BundleItem(Mineral.frozen_tear) -earth_crystal = BundleItem(Mineral.earth_crystal) -emerald = BundleItem(Mineral.emerald) -aquamarine = BundleItem(Mineral.aquamarine) -ruby = BundleItem(Mineral.ruby) -amethyst = BundleItem(Mineral.amethyst) -topaz = BundleItem(Mineral.topaz) -jade = BundleItem(Mineral.jade) -obsidian = BundleItem(Mineral.obsidian) -jamborite = BundleItem(Mineral.jamborite) -tigerseye = BundleItem(Mineral.tigerseye) -opal = BundleItem(Mineral.opal) -thunder_egg = BundleItem(Mineral.thunder_egg) -ghost_crystal = BundleItem(Mineral.ghost_crystal) -kyanite = BundleItem(Mineral.kyanite) -lemon_stone = BundleItem(Mineral.lemon_stone) -mudstone = BundleItem(Mineral.mudstone) -limestone = BundleItem(Mineral.limestone) - -slime = BundleItem(Loot.slime, 99) -bug_meat = BundleItem(Loot.bug_meat, 10) -bat_wing = BundleItem(Loot.bat_wing, 10) -solar_essence = BundleItem(Loot.solar_essence) -void_essence = BundleItem(Loot.void_essence) - -petrified_slime = BundleItem(Mineral.petrified_slime) -blue_slime_egg = BundleItem(AnimalProduct.slime_egg_blue) -red_slime_egg = BundleItem(AnimalProduct.slime_egg_red) -purple_slime_egg = BundleItem(AnimalProduct.slime_egg_purple) -green_slime_egg = BundleItem(AnimalProduct.slime_egg_green) -tiger_slime_egg = BundleItem(AnimalProduct.slime_egg_tiger, source=BundleItem.Sources.island) - -cherry_bomb = BundleItem(Bomb.cherry_bomb, 5) -bomb = BundleItem(Bomb.bomb, 2) -mega_bomb = BundleItem(Bomb.mega_bomb) -explosive_ammo = BundleItem(Craftable.explosive_ammo, 5) - -maki_roll = BundleItem(Meal.maki_roll) -fried_egg = BundleItem(Meal.fried_egg) -omelet = BundleItem(Meal.omelet) -pizza = BundleItem(Meal.pizza) -hashbrowns = BundleItem(Meal.hashbrowns) -pancakes = BundleItem(Meal.pancakes) -bread = BundleItem(Meal.bread) -tortilla = BundleItem(Meal.tortilla) -triple_shot_espresso = BundleItem(Beverage.triple_shot_espresso) -farmer_s_lunch = BundleItem(Meal.farmer_lunch) -survival_burger = BundleItem(Meal.survival_burger) -dish_o_the_sea = BundleItem(Meal.dish_o_the_sea) -miner_s_treat = BundleItem(Meal.miners_treat) -roots_platter = BundleItem(Meal.roots_platter) -salad = BundleItem(Meal.salad) -cheese_cauliflower = BundleItem(Meal.cheese_cauliflower) -parsnip_soup = BundleItem(Meal.parsnip_soup) -fried_mushroom = BundleItem(Meal.fried_mushroom) -salmon_dinner = BundleItem(Meal.salmon_dinner) -pepper_poppers = BundleItem(Meal.pepper_poppers) -spaghetti = BundleItem(Meal.spaghetti) -sashimi = BundleItem(Meal.sashimi) -blueberry_tart = BundleItem(Meal.blueberry_tart) -algae_soup = BundleItem(Meal.algae_soup) -pale_broth = BundleItem(Meal.pale_broth) -chowder = BundleItem(Meal.chowder) -cookie = BundleItem(Meal.cookie) -ancient_doll = BundleItem(Artifact.ancient_doll) -ice_cream = BundleItem(Meal.ice_cream) -cranberry_candy = BundleItem(Meal.cranberry_candy) -ginger_ale = BundleItem(Beverage.ginger_ale, source=BundleItem.Sources.island) -pink_cake = BundleItem(Meal.pink_cake) -plum_pudding = BundleItem(Meal.plum_pudding) -chocolate_cake = BundleItem(Meal.chocolate_cake) -rhubarb_pie = BundleItem(Meal.rhubarb_pie) -shrimp_cocktail = BundleItem(Meal.shrimp_cocktail) -pina_colada = BundleItem(Beverage.pina_colada, source=BundleItem.Sources.island) -stuffing = BundleItem(Meal.stuffing) -magic_rock_candy = BundleItem(Meal.magic_rock_candy) -spicy_eel = BundleItem(Meal.spicy_eel) -crab_cakes = BundleItem(Meal.crab_cakes) -eggplant_parmesan = BundleItem(Meal.eggplant_parmesan) -pumpkin_soup = BundleItem(Meal.pumpkin_soup) -lucky_lunch = BundleItem(Meal.lucky_lunch) -joja_cola = BundleItem(Trash.joja_cola) -strange_bun = BundleItem(Meal.strange_bun) -moss_soup = BundleItem(Meal.moss_soup) -roasted_hazelnuts = BundleItem(Meal.roasted_hazelnuts) -maple_bar = BundleItem(Meal.maple_bar) - -green_algae = BundleItem(WaterItem.green_algae) -white_algae = BundleItem(WaterItem.white_algae) -geode = BundleItem(Geode.geode) -frozen_geode = BundleItem(Geode.frozen) -magma_geode = BundleItem(Geode.magma) -omni_geode = BundleItem(Geode.omni) -sap = BundleItem(Material.sap) - -dwarf_scroll_1 = BundleItem(Artifact.dwarf_scroll_i) -dwarf_scroll_2 = BundleItem(Artifact.dwarf_scroll_ii) -dwarf_scroll_3 = BundleItem(Artifact.dwarf_scroll_iii) -dwarf_scroll_4 = BundleItem(Artifact.dwarf_scroll_iv) -elvish_jewelry = BundleItem(Artifact.elvish_jewelry) -ancient_drum = BundleItem(Artifact.ancient_drum) -dried_starfish = BundleItem(Fossil.dried_starfish) -bone_fragment = BundleItem(Fossil.bone_fragment) - -golden_mask = BundleItem(Artifact.golden_mask) -golden_relic = BundleItem(Artifact.golden_relic) -dwarf_gadget = BundleItem(Artifact.dwarf_gadget) -dwarvish_helm = BundleItem(Artifact.dwarvish_helm) -prehistoric_handaxe = BundleItem(Artifact.prehistoric_handaxe) -bone_flute = BundleItem(Artifact.bone_flute) -anchor = BundleItem(Artifact.anchor) -prehistoric_tool = BundleItem(Artifact.prehistoric_tool) -chicken_statue = BundleItem(Artifact.chicken_statue) -rusty_cog = BundleItem(Artifact.rusty_cog) -rusty_spur = BundleItem(Artifact.rusty_spur) -rusty_spoon = BundleItem(Artifact.rusty_spoon) -ancient_sword = BundleItem(Artifact.ancient_sword) -ornamental_fan = BundleItem(Artifact.ornamental_fan) -chipped_amphora = BundleItem(Artifact.chipped_amphora) -strange_doll = BundleItem(Artifact.strange_doll) -strange_doll_green = BundleItem(Artifact.strange_doll_green) -ancient_seed = BundleItem(Artifact.ancient_seed) -rare_disc = BundleItem(Artifact.rare_disc) - -prehistoric_scapula = BundleItem(Fossil.prehistoric_scapula) -prehistoric_tibia = BundleItem(Fossil.prehistoric_tibia) -prehistoric_skull = BundleItem(Fossil.prehistoric_skull) -skeletal_hand = BundleItem(Fossil.skeletal_hand) -prehistoric_rib = BundleItem(Fossil.prehistoric_rib) -prehistoric_vertebra = BundleItem(Fossil.prehistoric_vertebra) -skeletal_tail = BundleItem(Fossil.skeletal_tail) -nautilus_fossil = BundleItem(Fossil.nautilus_fossil) -amphibian_fossil = BundleItem(Fossil.amphibian_fossil) -palm_fossil = BundleItem(Fossil.palm_fossil) -trilobite = BundleItem(Fossil.trilobite) -snake_vertebrae = BundleItem(Fossil.snake_vertebrae, source=BundleItem.Sources.island) -mummified_bat = BundleItem(Fossil.mummified_bat, source=BundleItem.Sources.island) -fossilized_tail = BundleItem(Fossil.fossilized_tail, source=BundleItem.Sources.island) - -dinosaur_mayo = BundleItem(ArtisanGood.dinosaur_mayonnaise) -void_mayo = BundleItem(ArtisanGood.void_mayonnaise) -prismatic_shard = BundleItem(Mineral.prismatic_shard) -diamond = BundleItem(Mineral.diamond) -ancient_fruit = BundleItem(Fruit.ancient_fruit) -void_salmon = BundleItem(Fish.void_salmon) -tea_leaves = BundleItem(Vegetable.tea_leaves) -blobfish = BundleItem(Fish.blobfish) -spook_fish = BundleItem(Fish.spook_fish) -lionfish = BundleItem(Fish.lionfish, source=BundleItem.Sources.island) -blue_discus = BundleItem(Fish.blue_discus, source=BundleItem.Sources.island) -stingray = BundleItem(Fish.stingray, source=BundleItem.Sources.island) -spookfish = BundleItem(Fish.spookfish) -midnight_squid = BundleItem(Fish.midnight_squid) -slimejack = BundleItem(Fish.slimejack) -goby = BundleItem(Fish.goby) - -angler = BundleItem(Fish.angler) -crimsonfish = BundleItem(Fish.crimsonfish) -mutant_carp = BundleItem(Fish.mutant_carp) -glacierfish = BundleItem(Fish.glacierfish) -legend = BundleItem(Fish.legend) - -spinner = BundleItem(Fishing.spinner) -dressed_spinner = BundleItem(Fishing.dressed_spinner) -trap_bobber = BundleItem(Fishing.trap_bobber) -sonar_bobber = BundleItem(Fishing.sonar_bobber) -cork_bobber = BundleItem(Fishing.cork_bobber) -lead_bobber = BundleItem(Fishing.lead_bobber) -treasure_hunter = BundleItem(Fishing.treasure_hunter) -barbed_hook = BundleItem(Fishing.barbed_hook) -curiosity_lure = BundleItem(Fishing.curiosity_lure) -quality_bobber = BundleItem(Fishing.quality_bobber) -bait = BundleItem(Fishing.bait, 100) -deluxe_bait = BundleItem(Fishing.deluxe_bait, 50) -magnet = BundleItem(Fishing.magnet) -wild_bait = BundleItem(Fishing.wild_bait, 20) -magic_bait = BundleItem(Fishing.magic_bait, 10, source=BundleItem.Sources.qi_board) -pearl = BundleItem(Gift.pearl) -challenge_bait = BundleItem(Fishing.challenge_bait, 25, source=BundleItem.Sources.masteries) -targeted_bait = BundleItem(ArtisanGood.targeted_bait, 25, source=BundleItem.Sources.content) -golden_bobber = BundleItem(Fishing.golden_bobber) - -ginger = BundleItem(Forageable.ginger, source=BundleItem.Sources.content) -magma_cap = BundleItem(Mushroom.magma_cap, source=BundleItem.Sources.content) - -wheat_flour = BundleItem(Ingredient.wheat_flour) -sugar = BundleItem(Ingredient.sugar) -vinegar = BundleItem(Ingredient.vinegar) - -jack_o_lantern = BundleItem(Lighting.jack_o_lantern) -prize_ticket = BundleItem(Currency.prize_ticket) -mystery_box = BundleItem(Consumable.mystery_box) -gold_mystery_box = BundleItem(Consumable.gold_mystery_box, source=BundleItem.Sources.masteries) -calico_egg = BundleItem(Currency.calico_egg) -golden_tag = BundleItem(Currency.golden_tag) -stardrop_tea = BundleItem(ArtisanGood.stardrop_tea) -rotten_plant = BundleItem(Decoration.rotten_plant) - -apple_slices = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.apple)) - -infinity_crown = BundleItem(Hats.infinity_crown.name, source=BundleItem.Sources.content) -bowler_hat = BundleItem(Hats.bowler.name, source=BundleItem.Sources.content) -sombrero = BundleItem(Hats.sombrero.name, source=BundleItem.Sources.content) -good_ol_cap = BundleItem(Hats.good_ol_cap.name, source=BundleItem.Sources.content) -living_hat = BundleItem(Hats.living_hat.name, source=BundleItem.Sources.content) -garbage_hat = BundleItem(Hats.garbage_hat.name, source=BundleItem.Sources.content) -golden_helmet = BundleItem(Hats.golden_helmet.name, source=BundleItem.Sources.content) -laurel_wreath_crown = BundleItem(Hats.laurel_wreath_crown.name, source=BundleItem.Sources.content) -joja_cap = BundleItem(Hats.joja_cap.name, source=BundleItem.Sources.content) -deluxe_pirate_hat = BundleItem(Hats.deluxe_pirate_hat.name, source=BundleItem.Sources.content) -dark_cowboy_hat = BundleItem(Hats.dark_cowboy_hat.name, source=BundleItem.Sources.content) -tiger_hat = BundleItem(Hats.tiger_hat.name, source=BundleItem.Sources.content) -mystery_hat = BundleItem(Hats.mystery_hat.name, source=BundleItem.Sources.content) -dark_ballcap = BundleItem(Hats.dark_ballcap.name, source=BundleItem.Sources.content) -goblin_mask = BundleItem(Hats.goblin_mask.name, source=BundleItem.Sources.island) - -vacation_shirt = BundleItem(Shirts.vacation.name) -green_jacket_shirt = BundleItem(Shirts.green_jacket.name) - -mermaid_boots = BundleItem(Boots.mermaid_boots) - -lucky_purple_shorts = BundleItem(SpecialItem.lucky_purple_shorts) -trimmed_purple_shorts = BundleItem(SpecialItem.trimmed_purple_shorts) - -ancient_fruit_wine = BundleItem(ArtisanGood.specific_wine(Fruit.ancient_fruit)) -dried_ancient_fruit = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.ancient_fruit)) -ancient_fruit_jelly = BundleItem(ArtisanGood.specific_jelly(Fruit.ancient_fruit)) -starfruit_wine = BundleItem(ArtisanGood.specific_wine(Fruit.starfruit)) -dried_starfruit = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.starfruit)) -starfruit_jelly = BundleItem(ArtisanGood.specific_jelly(Fruit.starfruit)) -rhubarb_wine = BundleItem(ArtisanGood.specific_wine(Fruit.rhubarb)) -dried_rhubarb = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.rhubarb)) -melon_wine = BundleItem(ArtisanGood.specific_wine(Fruit.melon)) -dried_melon = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.melon)) -pineapple_wine = BundleItem(ArtisanGood.specific_wine(Fruit.pineapple), source=BundleItem.Sources.content) -dried_pineapple = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.pineapple), source=BundleItem.Sources.content) -dried_banana = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.banana), source=BundleItem.Sources.content) -strawberry_wine = BundleItem(ArtisanGood.specific_wine(Fruit.strawberry)) -dried_strawberry = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.strawberry)) -pumpkin_juice = BundleItem(ArtisanGood.specific_juice(Vegetable.pumpkin)) -raisins = BundleItem(ArtisanGood.raisins) -dried_qi_fruit = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.qi_fruit), source=BundleItem.Sources.content) - -aged_lava_eel_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.lava_eel)) -aged_crimsonfish_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.crimsonfish)) -aged_angler_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.angler)) -legend_roe = BundleItem(AnimalProduct.specific_roe(Fish.legend)) -aged_legend_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.legend)) -aged_glacierfish_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.glacierfish)) -aged_mutant_carp_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.mutant_carp)) -midnight_squid_roe = BundleItem(AnimalProduct.specific_roe(Fish.midnight_squid)) - -legend_bait = BundleItem(ArtisanGood.specific_bait(Fish.legend)) - -smoked_legend = BundleItem(ArtisanGood.specific_smoked_fish(Fish.legend)) - -mystic_syrup = BundleItem(ArtisanGood.mystic_syrup) -apple_sapling = BundleItem(Sapling.apple) -apricot_sapling = BundleItem(Sapling.apricot) -banana_sapling = BundleItem(Sapling.banana, source=BundleItem.Sources.content) -cherry_sapling = BundleItem(Sapling.cherry) -mango_sapling = BundleItem(Sapling.mango, source=BundleItem.Sources.content) -orange_sapling = BundleItem(Sapling.orange) -peach_sapling = BundleItem(Sapling.peach) -pomegranate_sapling = BundleItem(Sapling.pomegranate) - -cookout_kit = BundleItem(Craftable.cookout_kit) -tent_kit = BundleItem(Craftable.tent_kit) -bug_steak = BundleItem(Edible.bug_steak) - -tea_set = BundleItem(Gift.tea_set) -golden_pumpkin = BundleItem(Gift.golden_pumpkin) -mermaid_pendant = BundleItem(Gift.mermaid_pendant) -void_ghost_pendant = BundleItem(Gift.void_ghost_pendant) -advanced_tv_remote = BundleItem(SpecialItem.advanced_tv_remote) - -crystal_ball = BundleItem(CatalogueItem.crystal_ball) -amethyst_crystal_ball = BundleItem(CatalogueItem.amethyst_crystal_ball) -aquamarine_crystal_ball = BundleItem(CatalogueItem.aquamarine_crystal_ball) -emerald_crystal_ball = BundleItem(CatalogueItem.emerald_crystal_ball) -ruby_crystal_ball = BundleItem(CatalogueItem.ruby_crystal_ball) -topaz_crystal_ball = BundleItem(CatalogueItem.topaz_crystal_ball) -flute_block = BundleItem(Furniture.flute_block) -candle_lamp = BundleItem(Furniture.candle_lamp) -modern_lamp = BundleItem(Furniture.modern_lamp) -single_bed = BundleItem(Furniture.single_bed) -exotic_double_bed = BundleItem(Furniture.exotic_double_bed, source=BundleItem.Sources.qi_board) -statue_of_endless_fortune = BundleItem(Machine.statue_endless_fortune) -cursed_mannequin = BundleItem(Furniture.cursed_mannequin) -statue_of_blessings = BundleItem(Statue.blessings) -crane_house_plant = BundleItem(Furniture.crane_game_house_plant) - -wood_floor = BundleItem(Floor.wood) -rustic_plank_floor = BundleItem(Floor.rustic) -straw_floor = BundleItem(Floor.straw) -weathered_floor = BundleItem(Floor.weathered) -crystal_floor = BundleItem(Floor.crystal) -stone_floor = BundleItem(Floor.stone) -stone_walkway_floor = BundleItem(Floor.stone_walkway) -brick_floor = BundleItem(Floor.brick) -wood_path = BundleItem(Floor.wood_path) -gravel_path = BundleItem(Floor.gravel_path) -cobblestone_path = BundleItem(Floor.cobblestone_path) -stepping_stone_path = BundleItem(Floor.stepping_stone_path) -crystal_path = BundleItem(Floor.crystal_path) - -warp_totem_beach = BundleItem(Consumable.warp_totem_beach) -warp_totem_mountains = BundleItem(Consumable.warp_totem_mountains) -warp_totem_farm = BundleItem(Consumable.warp_totem_farm) -warp_totem_desert = BundleItem(Consumable.warp_totem_desert, source=BundleItem.Sources.content) -warp_totem_island = BundleItem(Consumable.warp_totem_island, source=BundleItem.Sources.island) -rain_totem = BundleItem(Consumable.rain_totem) -treasure_totem = BundleItem(Consumable.treasure_totem, source=BundleItem.Sources.masteries) - -book_of_mysteries = BundleItem(Book.book_of_mysteries) - -far_away_stone = BundleItem(SpecialItem.far_away_stone) - -death = BundleItem(NotReallyAnItem.death) - -camping_stove = BundleItem(MemeItem.camping_stove) -decorative_pot = BundleItem(MemeItem.decorative_pot) -slime_crate = BundleItem(MemeItem.slime_crate) -supply_crate = BundleItem(MemeItem.supply_crate) -warp_totem_qis_arena = BundleItem(MemeItem.warp_totem_qis_arena) -artifact_spot = BundleItem(MemeItem.artifact_spot) -twig = BundleItem(MemeItem.twig) -weeds = BundleItem(MemeItem.weeds) -lumber = BundleItem(MemeItem.lumber) -green_rain_weeds_0 = BundleItem(MemeItem.green_rain_weeds_0) -seed_spot = BundleItem(MemeItem.seed_spot) -pot_of_gold = BundleItem(MemeItem.pot_of_gold) +from ..hats_data import Hats +from ..shirt_data import Shirts +from ...bundles.bundle_item import BundleItem +from ...strings.animal_product_names import AnimalProduct +from ...strings.artisan_good_names import ArtisanGood +from ...strings.book_names import Book +from ...strings.boot_names import Boots +from ...strings.catalogue_names import CatalogueItem +from ...strings.craftable_names import Consumable, Lighting, Fishing, Craftable, Bomb, Furniture, Floor, Edible, Statue +from ...strings.crop_names import Vegetable, Fruit +from ...strings.currency_names import Currency +from ...strings.decoration_names import Decoration +from ...strings.fertilizer_names import Fertilizer, SpeedGro, RetainingSoil +from ...strings.fish_names import Fish, WaterItem, Trash +from ...strings.flower_names import Flower +from ...strings.food_names import Meal, Beverage +from ...strings.forageable_names import Forageable, Mushroom +from ...strings.fruit_tree_names import Sapling +from ...strings.geode_names import Geode +from ...strings.gift_names import Gift +from ...strings.ingredient_names import Ingredient +from ...strings.machine_names import Machine +from ...strings.material_names import Material +from ...strings.meme_item_names import MemeItem +from ...strings.metal_names import Fossil, Ore, MetalBar, Mineral, Artifact +from ...strings.monster_drop_names import Loot +from ...strings.seed_names import TreeSeed, Seed +from ...strings.special_item_names import SpecialItem, NotReallyAnItem + +wild_horseradish = BundleItem(Forageable.wild_horseradish) +daffodil = BundleItem(Forageable.daffodil) +leek = BundleItem(Forageable.leek) +dandelion = BundleItem(Forageable.dandelion) +morel = BundleItem(Mushroom.morel) +common_mushroom = BundleItem(Mushroom.common) +salmonberry = BundleItem(Forageable.salmonberry, can_have_quality=False) +spring_onion = BundleItem(Forageable.spring_onion) + +grape = BundleItem(Fruit.grape) +spice_berry = BundleItem(Forageable.spice_berry) +sweet_pea = BundleItem(Forageable.sweet_pea) +red_mushroom = BundleItem(Mushroom.red) +fiddlehead_fern = BundleItem(Forageable.fiddlehead_fern) + +wild_plum = BundleItem(Forageable.wild_plum) +hazelnut = BundleItem(Forageable.hazelnut) +blackberry = BundleItem(Forageable.blackberry) +chanterelle = BundleItem(Mushroom.chanterelle) + +winter_root = BundleItem(Forageable.winter_root) +crystal_fruit = BundleItem(Forageable.crystal_fruit) +snow_yam = BundleItem(Forageable.snow_yam) +crocus = BundleItem(Forageable.crocus) +holly = BundleItem(Forageable.holly) + +coconut = BundleItem(Forageable.coconut) +golden_coconut = BundleItem(Geode.golden_coconut, source=BundleItem.Sources.island) +cactus_fruit = BundleItem(Forageable.cactus_fruit) +cave_carrot = BundleItem(Forageable.cave_carrot) +purple_mushroom = BundleItem(Mushroom.purple) +maple_syrup = BundleItem(ArtisanGood.maple_syrup) +oak_resin = BundleItem(ArtisanGood.oak_resin) +pine_tar = BundleItem(ArtisanGood.pine_tar) +nautilus_shell = BundleItem(WaterItem.nautilus_shell) +coral = BundleItem(WaterItem.coral) +sea_urchin = BundleItem(WaterItem.sea_urchin) +rainbow_shell = BundleItem(Forageable.rainbow_shell) +clam = BundleItem(Fish.clam) +cockle = BundleItem(Fish.cockle) +mussel = BundleItem(Fish.mussel) +oyster = BundleItem(Fish.oyster) +seaweed = BundleItem(WaterItem.seaweed, can_have_quality=False) + +wood = BundleItem(Material.wood, 99) +stone = BundleItem(Material.stone, 99) +hardwood = BundleItem(Material.hardwood, 10) +clay = BundleItem(Material.clay) +fiber = BundleItem(Material.fiber) +moss = BundleItem(Material.moss) + +mixed_seeds = BundleItem(Seed.mixed) +acorn = BundleItem(TreeSeed.acorn) +maple_seed = BundleItem(TreeSeed.maple) +pine_cone = BundleItem(TreeSeed.pine) +mahogany_seed = BundleItem(TreeSeed.mahogany) +mushroom_tree_seed = BundleItem(TreeSeed.mushroom, source=BundleItem.Sources.island) +mystic_tree_seed = BundleItem(TreeSeed.mystic, source=BundleItem.Sources.masteries) +mossy_seed = BundleItem(TreeSeed.mossy) + +strawberry_seeds = BundleItem(Seed.strawberry) +sunflower_seeds = BundleItem(Seed.sunflower) + +blue_jazz = BundleItem(Flower.blue_jazz) +cauliflower = BundleItem(Vegetable.cauliflower) +green_bean = BundleItem(Vegetable.green_bean) +kale = BundleItem(Vegetable.kale) +parsnip = BundleItem(Vegetable.parsnip) +potato = BundleItem(Vegetable.potato) +strawberry = BundleItem(Fruit.strawberry, source=BundleItem.Sources.festival) +tulip = BundleItem(Flower.tulip) +unmilled_rice = BundleItem(Vegetable.unmilled_rice) +coffee_bean = BundleItem(Seed.coffee) +garlic = BundleItem(Vegetable.garlic) +blueberry = BundleItem(Fruit.blueberry) +corn = BundleItem(Vegetable.corn) +hops = BundleItem(Vegetable.hops) +hot_pepper = BundleItem(Fruit.hot_pepper) +melon = BundleItem(Fruit.melon) +poppy = BundleItem(Flower.poppy) +radish = BundleItem(Vegetable.radish) +summer_spangle = BundleItem(Flower.summer_spangle) +sunflower = BundleItem(Flower.sunflower) +tomato = BundleItem(Vegetable.tomato) +wheat = BundleItem(Vegetable.wheat) +hay = BundleItem(Forageable.hay) +amaranth = BundleItem(Vegetable.amaranth) +bok_choy = BundleItem(Vegetable.bok_choy) +cranberries = BundleItem(Fruit.cranberries) +eggplant = BundleItem(Vegetable.eggplant) +fairy_rose = BundleItem(Flower.fairy_rose) +pumpkin = BundleItem(Vegetable.pumpkin) +yam = BundleItem(Vegetable.yam) +sweet_gem_berry = BundleItem(Fruit.sweet_gem_berry) +rhubarb = BundleItem(Fruit.rhubarb) +beet = BundleItem(Vegetable.beet) +red_cabbage = BundleItem(Vegetable.red_cabbage) +starfruit = BundleItem(Fruit.starfruit) +artichoke = BundleItem(Vegetable.artichoke) +pineapple = BundleItem(Fruit.pineapple, source=BundleItem.Sources.content) +taro_root = BundleItem(Vegetable.taro_root, source=BundleItem.Sources.content) +dragon_tooth = BundleItem(Forageable.dragon_tooth, source=BundleItem.Sources.content) + +carrot = BundleItem(Vegetable.carrot) +summer_squash = BundleItem(Vegetable.summer_squash) +broccoli = BundleItem(Vegetable.broccoli) +powdermelon = BundleItem(Fruit.powdermelon) + +egg = BundleItem(AnimalProduct.egg) +large_egg = BundleItem(AnimalProduct.large_egg) +brown_egg = BundleItem(AnimalProduct.brown_egg) +large_brown_egg = BundleItem(AnimalProduct.large_brown_egg) +wool = BundleItem(AnimalProduct.wool) +milk = BundleItem(AnimalProduct.milk) +large_milk = BundleItem(AnimalProduct.large_milk) +goat_milk = BundleItem(AnimalProduct.goat_milk) +large_goat_milk = BundleItem(AnimalProduct.large_goat_milk) +truffle = BundleItem(AnimalProduct.truffle) +duck_feather = BundleItem(AnimalProduct.duck_feather) +duck_egg = BundleItem(AnimalProduct.duck_egg) +rabbit_foot = BundleItem(AnimalProduct.rabbit_foot) +dinosaur_egg = BundleItem(AnimalProduct.dinosaur_egg) +void_egg = BundleItem(AnimalProduct.void_egg) +ostrich_egg = BundleItem(AnimalProduct.ostrich_egg, source=BundleItem.Sources.content) +golden_egg = BundleItem(AnimalProduct.golden_egg) + +truffle_oil = BundleItem(ArtisanGood.truffle_oil) +cloth = BundleItem(ArtisanGood.cloth) +goat_cheese = BundleItem(ArtisanGood.goat_cheese) +cheese = BundleItem(ArtisanGood.cheese) +honey = BundleItem(ArtisanGood.honey) +beer = BundleItem(Beverage.beer) +mayonnaise = BundleItem(ArtisanGood.mayonnaise) +juice = BundleItem(ArtisanGood.juice) +mead = BundleItem(ArtisanGood.mead) +pale_ale = BundleItem(ArtisanGood.pale_ale) +wine = BundleItem(ArtisanGood.wine) +jelly = BundleItem(ArtisanGood.jelly) +pickles = BundleItem(ArtisanGood.pickles) +caviar = BundleItem(ArtisanGood.caviar) +aged_roe = BundleItem(ArtisanGood.aged_roe) +roe = BundleItem(AnimalProduct.roe) +squid_ink = BundleItem(AnimalProduct.squid_ink) +coffee = BundleItem(Beverage.coffee) +green_tea = BundleItem(ArtisanGood.green_tea) +apple = BundleItem(Fruit.apple) +apricot = BundleItem(Fruit.apricot) +orange = BundleItem(Fruit.orange) +peach = BundleItem(Fruit.peach) +pomegranate = BundleItem(Fruit.pomegranate) +cherry = BundleItem(Fruit.cherry) +banana = BundleItem(Fruit.banana, source=BundleItem.Sources.content) +mango = BundleItem(Fruit.mango, source=BundleItem.Sources.content) + +basic_fertilizer = BundleItem(Fertilizer.basic, 100) +quality_fertilizer = BundleItem(Fertilizer.quality, 20) +deluxe_fertilizer = BundleItem(Fertilizer.deluxe, 5, source=BundleItem.Sources.island) +basic_retaining_soil = BundleItem(RetainingSoil.basic, 80) +quality_retaining_soil = BundleItem(RetainingSoil.quality, 50) +deluxe_retaining_soil = BundleItem(RetainingSoil.deluxe, 20, source=BundleItem.Sources.island) +speed_gro = BundleItem(SpeedGro.basic, 40) +deluxe_speed_gro = BundleItem(SpeedGro.deluxe, 20) +hyper_speed_gro = BundleItem(SpeedGro.hyper, 5, source=BundleItem.Sources.qi_board) +tree_fertilizer = BundleItem(Fertilizer.tree, 20) + +lobster = BundleItem(Fish.lobster) +crab = BundleItem(Fish.crab) +shrimp = BundleItem(Fish.shrimp) +crayfish = BundleItem(Fish.crayfish) +snail = BundleItem(Fish.snail) +periwinkle = BundleItem(Fish.periwinkle) +trash = BundleItem(Trash.trash) +driftwood = BundleItem(Trash.driftwood) +soggy_newspaper = BundleItem(Trash.soggy_newspaper) +broken_cd = BundleItem(Trash.broken_cd) +broken_glasses = BundleItem(Trash.broken_glasses) + +chub = BundleItem(Fish.chub) +catfish = BundleItem(Fish.catfish) +rainbow_trout = BundleItem(Fish.rainbow_trout) +lingcod = BundleItem(Fish.lingcod) +walleye = BundleItem(Fish.walleye) +perch = BundleItem(Fish.perch) +pike = BundleItem(Fish.pike) +bream = BundleItem(Fish.bream) +salmon = BundleItem(Fish.salmon) +sunfish = BundleItem(Fish.sunfish) +tiger_trout = BundleItem(Fish.tiger_trout) +shad = BundleItem(Fish.shad) +smallmouth_bass = BundleItem(Fish.smallmouth_bass) +dorado = BundleItem(Fish.dorado) +carp = BundleItem(Fish.carp) +midnight_carp = BundleItem(Fish.midnight_carp) +largemouth_bass = BundleItem(Fish.largemouth_bass) +sturgeon = BundleItem(Fish.sturgeon) +bullhead = BundleItem(Fish.bullhead) +tilapia = BundleItem(Fish.tilapia) +pufferfish = BundleItem(Fish.pufferfish) +tuna = BundleItem(Fish.tuna) +super_cucumber = BundleItem(Fish.super_cucumber) +flounder = BundleItem(Fish.flounder) +anchovy = BundleItem(Fish.anchovy) +sardine = BundleItem(Fish.sardine) +red_mullet = BundleItem(Fish.red_mullet) +herring = BundleItem(Fish.herring) +eel = BundleItem(Fish.eel) +octopus = BundleItem(Fish.octopus) +red_snapper = BundleItem(Fish.red_snapper) +squid = BundleItem(Fish.squid) +sea_cucumber = BundleItem(Fish.sea_cucumber) +albacore = BundleItem(Fish.albacore) +halibut = BundleItem(Fish.halibut) +scorpion_carp = BundleItem(Fish.scorpion_carp) +sandfish = BundleItem(Fish.sandfish) +woodskip = BundleItem(Fish.woodskip) +lava_eel = BundleItem(Fish.lava_eel) +ice_pip = BundleItem(Fish.ice_pip) +stonefish = BundleItem(Fish.stonefish) +ghostfish = BundleItem(Fish.ghostfish) + +bouquet = BundleItem(Gift.bouquet) +wilted_bouquet = BundleItem(Gift.wilted_bouquet) +copper_bar = BundleItem(MetalBar.copper) +iron_bar = BundleItem(MetalBar.iron) +gold_bar = BundleItem(MetalBar.gold) +iridium_bar = BundleItem(MetalBar.iridium) +radioactive_bar = BundleItem(MetalBar.radioactive, source=BundleItem.Sources.island) +refined_quartz = BundleItem(MetalBar.quartz) +coal = BundleItem(Material.coal) +iridium_ore = BundleItem(Ore.iridium) +gold_ore = BundleItem(Ore.gold) +iron_ore = BundleItem(Ore.iron) +copper_ore = BundleItem(Ore.copper) +radioactive_ore = BundleItem(Ore.radioactive, source=BundleItem.Sources.qi_board) +battery_pack = BundleItem(ArtisanGood.battery_pack) + +quartz = BundleItem(Mineral.quartz) +fire_quartz = BundleItem(Mineral.fire_quartz) +frozen_tear = BundleItem(Mineral.frozen_tear) +earth_crystal = BundleItem(Mineral.earth_crystal) +emerald = BundleItem(Mineral.emerald) +aquamarine = BundleItem(Mineral.aquamarine) +ruby = BundleItem(Mineral.ruby) +amethyst = BundleItem(Mineral.amethyst) +topaz = BundleItem(Mineral.topaz) +jade = BundleItem(Mineral.jade) +obsidian = BundleItem(Mineral.obsidian) +jamborite = BundleItem(Mineral.jamborite) +tigerseye = BundleItem(Mineral.tigerseye) +opal = BundleItem(Mineral.opal) +thunder_egg = BundleItem(Mineral.thunder_egg) +ghost_crystal = BundleItem(Mineral.ghost_crystal) +kyanite = BundleItem(Mineral.kyanite) +lemon_stone = BundleItem(Mineral.lemon_stone) +mudstone = BundleItem(Mineral.mudstone) +limestone = BundleItem(Mineral.limestone) + +slime = BundleItem(Loot.slime, 99) +bug_meat = BundleItem(Loot.bug_meat, 10) +bat_wing = BundleItem(Loot.bat_wing, 10) +solar_essence = BundleItem(Loot.solar_essence) +void_essence = BundleItem(Loot.void_essence) + +petrified_slime = BundleItem(Mineral.petrified_slime) +blue_slime_egg = BundleItem(AnimalProduct.slime_egg_blue) +red_slime_egg = BundleItem(AnimalProduct.slime_egg_red) +purple_slime_egg = BundleItem(AnimalProduct.slime_egg_purple) +green_slime_egg = BundleItem(AnimalProduct.slime_egg_green) +tiger_slime_egg = BundleItem(AnimalProduct.slime_egg_tiger, source=BundleItem.Sources.island) + +cherry_bomb = BundleItem(Bomb.cherry_bomb, 5) +bomb = BundleItem(Bomb.bomb, 2) +mega_bomb = BundleItem(Bomb.mega_bomb) +explosive_ammo = BundleItem(Craftable.explosive_ammo, 5) + +maki_roll = BundleItem(Meal.maki_roll) +fried_egg = BundleItem(Meal.fried_egg) +omelet = BundleItem(Meal.omelet) +pizza = BundleItem(Meal.pizza) +hashbrowns = BundleItem(Meal.hashbrowns) +pancakes = BundleItem(Meal.pancakes) +bread = BundleItem(Meal.bread) +tortilla = BundleItem(Meal.tortilla) +triple_shot_espresso = BundleItem(Beverage.triple_shot_espresso) +farmer_s_lunch = BundleItem(Meal.farmer_lunch) +survival_burger = BundleItem(Meal.survival_burger) +dish_o_the_sea = BundleItem(Meal.dish_o_the_sea) +miner_s_treat = BundleItem(Meal.miners_treat) +roots_platter = BundleItem(Meal.roots_platter) +salad = BundleItem(Meal.salad) +cheese_cauliflower = BundleItem(Meal.cheese_cauliflower) +parsnip_soup = BundleItem(Meal.parsnip_soup) +fried_mushroom = BundleItem(Meal.fried_mushroom) +salmon_dinner = BundleItem(Meal.salmon_dinner) +pepper_poppers = BundleItem(Meal.pepper_poppers) +spaghetti = BundleItem(Meal.spaghetti) +sashimi = BundleItem(Meal.sashimi) +blueberry_tart = BundleItem(Meal.blueberry_tart) +algae_soup = BundleItem(Meal.algae_soup) +pale_broth = BundleItem(Meal.pale_broth) +chowder = BundleItem(Meal.chowder) +cookie = BundleItem(Meal.cookie) +ancient_doll = BundleItem(Artifact.ancient_doll) +ice_cream = BundleItem(Meal.ice_cream) +cranberry_candy = BundleItem(Meal.cranberry_candy) +ginger_ale = BundleItem(Beverage.ginger_ale, source=BundleItem.Sources.island) +pink_cake = BundleItem(Meal.pink_cake) +plum_pudding = BundleItem(Meal.plum_pudding) +chocolate_cake = BundleItem(Meal.chocolate_cake) +rhubarb_pie = BundleItem(Meal.rhubarb_pie) +shrimp_cocktail = BundleItem(Meal.shrimp_cocktail) +pina_colada = BundleItem(Beverage.pina_colada, source=BundleItem.Sources.island) +stuffing = BundleItem(Meal.stuffing) +magic_rock_candy = BundleItem(Meal.magic_rock_candy) +spicy_eel = BundleItem(Meal.spicy_eel) +crab_cakes = BundleItem(Meal.crab_cakes) +eggplant_parmesan = BundleItem(Meal.eggplant_parmesan) +pumpkin_soup = BundleItem(Meal.pumpkin_soup) +lucky_lunch = BundleItem(Meal.lucky_lunch) +joja_cola = BundleItem(Trash.joja_cola) +strange_bun = BundleItem(Meal.strange_bun) +moss_soup = BundleItem(Meal.moss_soup) +roasted_hazelnuts = BundleItem(Meal.roasted_hazelnuts) +maple_bar = BundleItem(Meal.maple_bar) + +green_algae = BundleItem(WaterItem.green_algae) +white_algae = BundleItem(WaterItem.white_algae) +geode = BundleItem(Geode.geode) +frozen_geode = BundleItem(Geode.frozen) +magma_geode = BundleItem(Geode.magma) +omni_geode = BundleItem(Geode.omni) +sap = BundleItem(Material.sap) + +dwarf_scroll_1 = BundleItem(Artifact.dwarf_scroll_i) +dwarf_scroll_2 = BundleItem(Artifact.dwarf_scroll_ii) +dwarf_scroll_3 = BundleItem(Artifact.dwarf_scroll_iii) +dwarf_scroll_4 = BundleItem(Artifact.dwarf_scroll_iv) +elvish_jewelry = BundleItem(Artifact.elvish_jewelry) +ancient_drum = BundleItem(Artifact.ancient_drum) +dried_starfish = BundleItem(Fossil.dried_starfish) +bone_fragment = BundleItem(Fossil.bone_fragment) + +golden_mask = BundleItem(Artifact.golden_mask) +golden_relic = BundleItem(Artifact.golden_relic) +dwarf_gadget = BundleItem(Artifact.dwarf_gadget) +dwarvish_helm = BundleItem(Artifact.dwarvish_helm) +prehistoric_handaxe = BundleItem(Artifact.prehistoric_handaxe) +bone_flute = BundleItem(Artifact.bone_flute) +anchor = BundleItem(Artifact.anchor) +prehistoric_tool = BundleItem(Artifact.prehistoric_tool) +chicken_statue = BundleItem(Artifact.chicken_statue) +rusty_cog = BundleItem(Artifact.rusty_cog) +rusty_spur = BundleItem(Artifact.rusty_spur) +rusty_spoon = BundleItem(Artifact.rusty_spoon) +ancient_sword = BundleItem(Artifact.ancient_sword) +ornamental_fan = BundleItem(Artifact.ornamental_fan) +chipped_amphora = BundleItem(Artifact.chipped_amphora) +strange_doll = BundleItem(Artifact.strange_doll) +strange_doll_green = BundleItem(Artifact.strange_doll_green) +ancient_seed = BundleItem(Artifact.ancient_seed) +rare_disc = BundleItem(Artifact.rare_disc) + +prehistoric_scapula = BundleItem(Fossil.prehistoric_scapula) +prehistoric_tibia = BundleItem(Fossil.prehistoric_tibia) +prehistoric_skull = BundleItem(Fossil.prehistoric_skull) +skeletal_hand = BundleItem(Fossil.skeletal_hand) +prehistoric_rib = BundleItem(Fossil.prehistoric_rib) +prehistoric_vertebra = BundleItem(Fossil.prehistoric_vertebra) +skeletal_tail = BundleItem(Fossil.skeletal_tail) +nautilus_fossil = BundleItem(Fossil.nautilus_fossil) +amphibian_fossil = BundleItem(Fossil.amphibian_fossil) +palm_fossil = BundleItem(Fossil.palm_fossil) +trilobite = BundleItem(Fossil.trilobite) +snake_vertebrae = BundleItem(Fossil.snake_vertebrae, source=BundleItem.Sources.island) +mummified_bat = BundleItem(Fossil.mummified_bat, source=BundleItem.Sources.island) +fossilized_tail = BundleItem(Fossil.fossilized_tail, source=BundleItem.Sources.island) + +dinosaur_mayo = BundleItem(ArtisanGood.dinosaur_mayonnaise) +void_mayo = BundleItem(ArtisanGood.void_mayonnaise) +prismatic_shard = BundleItem(Mineral.prismatic_shard) +diamond = BundleItem(Mineral.diamond) +ancient_fruit = BundleItem(Fruit.ancient_fruit) +void_salmon = BundleItem(Fish.void_salmon) +tea_leaves = BundleItem(Vegetable.tea_leaves) +blobfish = BundleItem(Fish.blobfish) +spook_fish = BundleItem(Fish.spook_fish) +lionfish = BundleItem(Fish.lionfish, source=BundleItem.Sources.island) +blue_discus = BundleItem(Fish.blue_discus, source=BundleItem.Sources.island) +stingray = BundleItem(Fish.stingray, source=BundleItem.Sources.island) +spookfish = BundleItem(Fish.spookfish) +midnight_squid = BundleItem(Fish.midnight_squid) +slimejack = BundleItem(Fish.slimejack) +goby = BundleItem(Fish.goby) + +angler = BundleItem(Fish.angler) +crimsonfish = BundleItem(Fish.crimsonfish) +mutant_carp = BundleItem(Fish.mutant_carp) +glacierfish = BundleItem(Fish.glacierfish) +legend = BundleItem(Fish.legend) + +spinner = BundleItem(Fishing.spinner) +dressed_spinner = BundleItem(Fishing.dressed_spinner) +trap_bobber = BundleItem(Fishing.trap_bobber) +sonar_bobber = BundleItem(Fishing.sonar_bobber) +cork_bobber = BundleItem(Fishing.cork_bobber) +lead_bobber = BundleItem(Fishing.lead_bobber) +treasure_hunter = BundleItem(Fishing.treasure_hunter) +barbed_hook = BundleItem(Fishing.barbed_hook) +curiosity_lure = BundleItem(Fishing.curiosity_lure) +quality_bobber = BundleItem(Fishing.quality_bobber) +bait = BundleItem(Fishing.bait, 100) +deluxe_bait = BundleItem(Fishing.deluxe_bait, 50) +magnet = BundleItem(Fishing.magnet) +wild_bait = BundleItem(Fishing.wild_bait, 20) +magic_bait = BundleItem(Fishing.magic_bait, 10, source=BundleItem.Sources.qi_board) +pearl = BundleItem(Gift.pearl) +challenge_bait = BundleItem(Fishing.challenge_bait, 25, source=BundleItem.Sources.masteries) +targeted_bait = BundleItem(ArtisanGood.targeted_bait, 25, source=BundleItem.Sources.content) +golden_bobber = BundleItem(Fishing.golden_bobber) + +ginger = BundleItem(Forageable.ginger, source=BundleItem.Sources.content) +magma_cap = BundleItem(Mushroom.magma_cap, source=BundleItem.Sources.content) + +wheat_flour = BundleItem(Ingredient.wheat_flour) +sugar = BundleItem(Ingredient.sugar) +vinegar = BundleItem(Ingredient.vinegar) + +jack_o_lantern = BundleItem(Lighting.jack_o_lantern) +prize_ticket = BundleItem(Currency.prize_ticket) +mystery_box = BundleItem(Consumable.mystery_box) +gold_mystery_box = BundleItem(Consumable.gold_mystery_box, source=BundleItem.Sources.masteries) +calico_egg = BundleItem(Currency.calico_egg) +golden_tag = BundleItem(Currency.golden_tag) +stardrop_tea = BundleItem(ArtisanGood.stardrop_tea) +rotten_plant = BundleItem(Decoration.rotten_plant) + +apple_slices = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.apple)) + +infinity_crown = BundleItem(Hats.infinity_crown.name, source=BundleItem.Sources.content) +bowler_hat = BundleItem(Hats.bowler.name, source=BundleItem.Sources.content) +sombrero = BundleItem(Hats.sombrero.name, source=BundleItem.Sources.content) +good_ol_cap = BundleItem(Hats.good_ol_cap.name, source=BundleItem.Sources.content) +living_hat = BundleItem(Hats.living_hat.name, source=BundleItem.Sources.content) +garbage_hat = BundleItem(Hats.garbage_hat.name, source=BundleItem.Sources.content) +golden_helmet = BundleItem(Hats.golden_helmet.name, source=BundleItem.Sources.content) +laurel_wreath_crown = BundleItem(Hats.laurel_wreath_crown.name, source=BundleItem.Sources.content) +joja_cap = BundleItem(Hats.joja_cap.name, source=BundleItem.Sources.content) +deluxe_pirate_hat = BundleItem(Hats.deluxe_pirate_hat.name, source=BundleItem.Sources.content) +dark_cowboy_hat = BundleItem(Hats.dark_cowboy_hat.name, source=BundleItem.Sources.content) +tiger_hat = BundleItem(Hats.tiger_hat.name, source=BundleItem.Sources.content) +mystery_hat = BundleItem(Hats.mystery_hat.name, source=BundleItem.Sources.content) +dark_ballcap = BundleItem(Hats.dark_ballcap.name, source=BundleItem.Sources.content) +goblin_mask = BundleItem(Hats.goblin_mask.name, source=BundleItem.Sources.island) + +vacation_shirt = BundleItem(Shirts.vacation.name) +green_jacket_shirt = BundleItem(Shirts.green_jacket.name) + +mermaid_boots = BundleItem(Boots.mermaid_boots) + +lucky_purple_shorts = BundleItem(SpecialItem.lucky_purple_shorts) +trimmed_purple_shorts = BundleItem(SpecialItem.trimmed_purple_shorts) + +ancient_fruit_wine = BundleItem(ArtisanGood.specific_wine(Fruit.ancient_fruit)) +dried_ancient_fruit = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.ancient_fruit)) +ancient_fruit_jelly = BundleItem(ArtisanGood.specific_jelly(Fruit.ancient_fruit)) +starfruit_wine = BundleItem(ArtisanGood.specific_wine(Fruit.starfruit)) +dried_starfruit = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.starfruit)) +starfruit_jelly = BundleItem(ArtisanGood.specific_jelly(Fruit.starfruit)) +rhubarb_wine = BundleItem(ArtisanGood.specific_wine(Fruit.rhubarb)) +dried_rhubarb = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.rhubarb)) +melon_wine = BundleItem(ArtisanGood.specific_wine(Fruit.melon)) +dried_melon = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.melon)) +pineapple_wine = BundleItem(ArtisanGood.specific_wine(Fruit.pineapple), source=BundleItem.Sources.content) +dried_pineapple = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.pineapple), source=BundleItem.Sources.content) +dried_banana = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.banana), source=BundleItem.Sources.content) +strawberry_wine = BundleItem(ArtisanGood.specific_wine(Fruit.strawberry)) +dried_strawberry = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.strawberry)) +pumpkin_juice = BundleItem(ArtisanGood.specific_juice(Vegetable.pumpkin)) +raisins = BundleItem(ArtisanGood.raisins) +dried_qi_fruit = BundleItem(ArtisanGood.specific_dried_fruit(Fruit.qi_fruit), source=BundleItem.Sources.content) + +aged_lava_eel_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.lava_eel)) +aged_crimsonfish_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.crimsonfish)) +aged_angler_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.angler)) +legend_roe = BundleItem(AnimalProduct.specific_roe(Fish.legend)) +aged_legend_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.legend)) +aged_glacierfish_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.glacierfish)) +aged_mutant_carp_roe = BundleItem(ArtisanGood.specific_aged_roe(Fish.mutant_carp)) +midnight_squid_roe = BundleItem(AnimalProduct.specific_roe(Fish.midnight_squid)) + +legend_bait = BundleItem(ArtisanGood.specific_bait(Fish.legend)) + +smoked_legend = BundleItem(ArtisanGood.specific_smoked_fish(Fish.legend)) + +mystic_syrup = BundleItem(ArtisanGood.mystic_syrup) +apple_sapling = BundleItem(Sapling.apple) +apricot_sapling = BundleItem(Sapling.apricot) +banana_sapling = BundleItem(Sapling.banana, source=BundleItem.Sources.content) +cherry_sapling = BundleItem(Sapling.cherry) +mango_sapling = BundleItem(Sapling.mango, source=BundleItem.Sources.content) +orange_sapling = BundleItem(Sapling.orange) +peach_sapling = BundleItem(Sapling.peach) +pomegranate_sapling = BundleItem(Sapling.pomegranate) + +cookout_kit = BundleItem(Craftable.cookout_kit) +tent_kit = BundleItem(Craftable.tent_kit) +bug_steak = BundleItem(Edible.bug_steak) + +tea_set = BundleItem(Gift.tea_set) +golden_pumpkin = BundleItem(Gift.golden_pumpkin) +mermaid_pendant = BundleItem(Gift.mermaid_pendant) +void_ghost_pendant = BundleItem(Gift.void_ghost_pendant) +advanced_tv_remote = BundleItem(SpecialItem.advanced_tv_remote) + +crystal_ball = BundleItem(CatalogueItem.crystal_ball) +amethyst_crystal_ball = BundleItem(CatalogueItem.amethyst_crystal_ball) +aquamarine_crystal_ball = BundleItem(CatalogueItem.aquamarine_crystal_ball) +emerald_crystal_ball = BundleItem(CatalogueItem.emerald_crystal_ball) +ruby_crystal_ball = BundleItem(CatalogueItem.ruby_crystal_ball) +topaz_crystal_ball = BundleItem(CatalogueItem.topaz_crystal_ball) +flute_block = BundleItem(Furniture.flute_block) +candle_lamp = BundleItem(Furniture.candle_lamp) +modern_lamp = BundleItem(Furniture.modern_lamp) +single_bed = BundleItem(Furniture.single_bed) +exotic_double_bed = BundleItem(Furniture.exotic_double_bed, source=BundleItem.Sources.qi_board) +statue_of_endless_fortune = BundleItem(Machine.statue_endless_fortune) +cursed_mannequin = BundleItem(Furniture.cursed_mannequin) +statue_of_blessings = BundleItem(Statue.blessings) +crane_house_plant = BundleItem(Furniture.crane_game_house_plant) + +wood_floor = BundleItem(Floor.wood) +rustic_plank_floor = BundleItem(Floor.rustic) +straw_floor = BundleItem(Floor.straw) +weathered_floor = BundleItem(Floor.weathered) +crystal_floor = BundleItem(Floor.crystal) +stone_floor = BundleItem(Floor.stone) +stone_walkway_floor = BundleItem(Floor.stone_walkway) +brick_floor = BundleItem(Floor.brick) +wood_path = BundleItem(Floor.wood_path) +gravel_path = BundleItem(Floor.gravel_path) +cobblestone_path = BundleItem(Floor.cobblestone_path) +stepping_stone_path = BundleItem(Floor.stepping_stone_path) +crystal_path = BundleItem(Floor.crystal_path) + +warp_totem_beach = BundleItem(Consumable.warp_totem_beach) +warp_totem_mountains = BundleItem(Consumable.warp_totem_mountains) +warp_totem_farm = BundleItem(Consumable.warp_totem_farm) +warp_totem_desert = BundleItem(Consumable.warp_totem_desert, source=BundleItem.Sources.content) +warp_totem_island = BundleItem(Consumable.warp_totem_island, source=BundleItem.Sources.island) +rain_totem = BundleItem(Consumable.rain_totem) +treasure_totem = BundleItem(Consumable.treasure_totem, source=BundleItem.Sources.masteries) + +book_of_mysteries = BundleItem(Book.book_of_mysteries) + +far_away_stone = BundleItem(SpecialItem.far_away_stone) + +death = BundleItem(NotReallyAnItem.death) + +camping_stove = BundleItem(MemeItem.camping_stove) +decorative_pot = BundleItem(MemeItem.decorative_pot) +slime_crate = BundleItem(MemeItem.slime_crate) +supply_crate = BundleItem(MemeItem.supply_crate) +warp_totem_qis_arena = BundleItem(MemeItem.warp_totem_qis_arena) +artifact_spot = BundleItem(MemeItem.artifact_spot) +twig = BundleItem(MemeItem.twig) +weeds = BundleItem(MemeItem.weeds) +lumber = BundleItem(MemeItem.lumber) +green_rain_weeds_0 = BundleItem(MemeItem.green_rain_weeds_0) +seed_spot = BundleItem(MemeItem.seed_spot) +pot_of_gold = BundleItem(MemeItem.pot_of_gold) diff --git a/worlds/stardew_valley/data/bundles_data/bundle_set.py b/worlds/stardew_valley/data/bundles_data/bundle_set.py index ac2f3c5ecf54..0455441889fb 100644 --- a/worlds/stardew_valley/data/bundles_data/bundle_set.py +++ b/worlds/stardew_valley/data/bundles_data/bundle_set.py @@ -1,28 +1,28 @@ -from typing import Dict, List - -from .remixed_anywhere_bundles import community_center_remixed_anywhere -from .remixed_bundles import pantry_remixed, crafts_room_remixed, fish_tank_remixed, boiler_room_remixed, bulletin_board_remixed, vault_remixed, \ - abandoned_joja_mart_remixed, giant_stump_remixed -from .thematic_bundles import pantry_thematic, crafts_room_thematic, fish_tank_thematic, boiler_room_thematic, bulletin_board_thematic, vault_thematic, \ - abandoned_joja_mart_thematic, giant_stump_thematic -from .vanilla_bundles import crafts_room_vanilla, pantry_vanilla, fish_tank_vanilla, boiler_room_vanilla, \ - bulletin_board_vanilla, vault_vanilla, abandoned_joja_mart_vanilla, giant_stump_vanilla -from ...bundles.bundle_room import BundleRoomTemplate - - -class BundleSet: - bundles_by_room: Dict[str, BundleRoomTemplate] - - def __init__(self, bundle_rooms: List[BundleRoomTemplate]): - self.bundles_by_room = {bundle_room.name: bundle_room for bundle_room in bundle_rooms} - - -vanilla_bundles = BundleSet([pantry_vanilla, crafts_room_vanilla, fish_tank_vanilla, boiler_room_vanilla, bulletin_board_vanilla, - vault_vanilla, abandoned_joja_mart_vanilla, giant_stump_vanilla]) -thematic_bundles = BundleSet([pantry_thematic, crafts_room_thematic, fish_tank_thematic, boiler_room_thematic, bulletin_board_thematic, - vault_thematic, abandoned_joja_mart_thematic, giant_stump_thematic]) -remixed_bundles = BundleSet([pantry_remixed, crafts_room_remixed, fish_tank_remixed, boiler_room_remixed, bulletin_board_remixed, - vault_remixed, abandoned_joja_mart_remixed, giant_stump_remixed]) -remixed_anywhere_bundles = BundleSet([community_center_remixed_anywhere, abandoned_joja_mart_remixed, giant_stump_remixed]) - -# shuffled_bundles = BundleSet() +from typing import Dict, List + +from .remixed_anywhere_bundles import community_center_remixed_anywhere +from .remixed_bundles import pantry_remixed, crafts_room_remixed, fish_tank_remixed, boiler_room_remixed, bulletin_board_remixed, vault_remixed, \ + abandoned_joja_mart_remixed, giant_stump_remixed +from .thematic_bundles import pantry_thematic, crafts_room_thematic, fish_tank_thematic, boiler_room_thematic, bulletin_board_thematic, vault_thematic, \ + abandoned_joja_mart_thematic, giant_stump_thematic +from .vanilla_bundles import crafts_room_vanilla, pantry_vanilla, fish_tank_vanilla, boiler_room_vanilla, \ + bulletin_board_vanilla, vault_vanilla, abandoned_joja_mart_vanilla, giant_stump_vanilla +from ...bundles.bundle_room import BundleRoomTemplate + + +class BundleSet: + bundles_by_room: Dict[str, BundleRoomTemplate] + + def __init__(self, bundle_rooms: List[BundleRoomTemplate]): + self.bundles_by_room = {bundle_room.name: bundle_room for bundle_room in bundle_rooms} + + +vanilla_bundles = BundleSet([pantry_vanilla, crafts_room_vanilla, fish_tank_vanilla, boiler_room_vanilla, bulletin_board_vanilla, + vault_vanilla, abandoned_joja_mart_vanilla, giant_stump_vanilla]) +thematic_bundles = BundleSet([pantry_thematic, crafts_room_thematic, fish_tank_thematic, boiler_room_thematic, bulletin_board_thematic, + vault_thematic, abandoned_joja_mart_thematic, giant_stump_thematic]) +remixed_bundles = BundleSet([pantry_remixed, crafts_room_remixed, fish_tank_remixed, boiler_room_remixed, bulletin_board_remixed, + vault_remixed, abandoned_joja_mart_remixed, giant_stump_remixed]) +remixed_anywhere_bundles = BundleSet([community_center_remixed_anywhere, abandoned_joja_mart_remixed, giant_stump_remixed]) + +# shuffled_bundles = BundleSet() diff --git a/worlds/stardew_valley/data/bundles_data/meme_bundles.py b/worlds/stardew_valley/data/bundles_data/meme_bundles.py index c3abdca129e8..55e51ab267e9 100644 --- a/worlds/stardew_valley/data/bundles_data/meme_bundles.py +++ b/worlds/stardew_valley/data/bundles_data/meme_bundles.py @@ -1,378 +1,378 @@ -from .bundle_data import all_bundle_items_by_name -from .meme_bundles_data.capitalist_bundle import capitalist_items -from .remixed_bundles import * -from ...bundles.bundle import BureaucracyBundleTemplate, RecursiveBundleTemplate, FixedPriceCurrencyBundleTemplate, \ - FixedPriceBundleTemplate, FixedPriceDeepBundleTemplate, FixedMultiplierBundleTemplate, FixedSlotsBundleTemplate -from ...strings.bundle_names import MemeBundleName -from ...strings.currency_names import MemeCurrency -from ...strings.flower_names import all_flowers -from ...strings.machine_names import Machine -from ...strings.meme_item_names import MemeItem -from ...strings.quality_names import AnimalProductQuality, CropQuality - -burger_king_items = [survival_burger, joja_cola, apple_slices, ice_cream, strange_doll, strange_doll_green, hashbrowns, infinity_crown] -burger_king_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.burger_king, burger_king_items, 6, 3) - -capitalist_bundle = FixedMultiplierBundleTemplate(CCRoom.vault, MemeBundleName.capitalist, capitalist_items, 12, 2) - -romance_items = [lucky_purple_shorts, truffle_oil, super_cucumber, good_ol_cap] -romance_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.romance, romance_items, 4, 4) - -hurricane_tortilla_items = [tortilla.as_amount(4)] -hurricane_tortilla_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.hurricane_tortilla, hurricane_tortilla_items, 6, 6) - -AAAA_items = [battery_pack.as_amount(12), battery_pack.as_amount(8), battery_pack.as_amount(6)] -AAAA_bundle = BundleTemplate(CCRoom.crafts_room, MemeBundleName.AAAA, AAAA_items, 3, 3) - -anything_for_beyonce_items = [beet] -anything_for_beyonce_bundle = BundleTemplate(CCRoom.crafts_room, MemeBundleName.anything_for_beyonce, anything_for_beyonce_items, 1, 1) - -crab_rave_items = [crab.as_amount(8)] -crab_rave_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.crab_rave, crab_rave_items, 12, 8) - -potato_items = [potato.as_amount(8)] -potato_bundle = BundleTemplate(CCRoom.crafts_room, MemeBundleName.potato, potato_items, 12, 8) - -look_at_chickens_items = [duck_egg.as_amount(2)] -look_at_chickens_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.look_at_chickens, look_at_chickens_items, 10, 4) - -lemonade_stand_items = [grape] -lemonade_stand_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.lemonade_stand, lemonade_stand_items, 3, 1) - -what_the_rock_is_cooking_items = [stone.as_amount(1), cookout_kit, strange_bun] -what_the_rock_is_cooking_bundle = FixedPriceBundleTemplate(CCRoom.pantry, MemeBundleName.what_the_rock_is_cooking, what_the_rock_is_cooking_items, 3, 3) - -amons_fall_items = [stone.as_amount(1)] -amons_fall_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.amons_fall, amons_fall_items, 7, 7) - -screw_you_items = [tea_set, ostrich_egg.as_quality(AnimalProductQuality.iridium), snake_vertebrae.as_amount(5), mummified_bat.as_amount(5)] -screw_you_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.screw_you, screw_you_items, 4, 4) - -sunmaid_items = [raisins.as_amount(28)] -sunmaid_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.sunmaid, sunmaid_items, 1, 1) - -rick_items = [pickles] -rick_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.rick, rick_items, 1, 1) - -minecraft_items = [coal, copper_ore, iron_ore, quartz, amethyst, emerald, gold_ore, diamond, obsidian] -minecraft_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.minecraft, minecraft_items, 9, 8) - -balls_items = [blue_jazz, cauliflower, blueberry, melon, red_cabbage, tomato, powdermelon, cranberries, fairy_rose, grape, pumpkin, ancient_fruit, - solar_essence, cherry_bomb, bomb, mega_bomb, coal, iridium_ore, aquamarine, jamborite, geode, magma_geode, ancient_seed, crystal_ball, - amethyst_crystal_ball, aquamarine_crystal_ball, emerald_crystal_ball, ruby_crystal_ball, topaz_crystal_ball, apple, pizza, explosive_ammo, peach, - orange, apricot, tigerseye, coconut, gold_ore, golden_coconut, pufferfish, lucky_lunch, salad, cactus_fruit, radioactive_ore, opal, broken_cd, - void_essence, wild_plum, pomegranate] -balls_items = [item.as_amount(1) for item in balls_items] -balls_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.balls, balls_items, 12, 6) - -tilesanity_items = [wood_floor.as_amount(100), rustic_plank_floor.as_amount(100), straw_floor.as_amount(100), weathered_floor.as_amount(100), - crystal_floor.as_amount(100), stone_floor.as_amount(100), stone_walkway_floor.as_amount(100), brick_floor.as_amount(100), - wood_path.as_amount(100), gravel_path.as_amount(100), cobblestone_path.as_amount(100), stepping_stone_path.as_amount(100), - crystal_path.as_amount(100)] -tilesanity_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.tilesanity, tilesanity_items, 4, 4) - -cap_items = [vacation_shirt, wood.as_amount(999), sap.as_amount(999), pine_cone.as_amount(100), acorn.as_amount(100), - maple_seed.as_amount(100), moss.as_amount(500), exotic_double_bed.as_amount(1)] -cap_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.cap, cap_items, 8, 4) - -big_grapes_items = [coconut] -big_grapes_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.big_grapes, big_grapes_items, 4, 4) - -obelisks_items = [earth_crystal.as_amount(10), clam.as_amount(10), coral.as_amount(10), coconut.as_amount(10), cactus_fruit.as_amount(10), - banana.as_amount(10), dragon_tooth.as_amount(10), iridium_bar.as_amount(45)] -obelisks_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.obelisks, obelisks_items, 8, 8) - -burger_king_revenge_items = [fossilized_tail, void_salmon, ostrich_egg.as_amount(3), tea_leaves.as_amount(10), purple_slime_egg, - moss_soup.as_amount(3), radioactive_ore.as_amount(5), mystic_syrup.as_amount(10), truffle, aged_crimsonfish_roe] -burger_king_revenge_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.burger_king_revenge, burger_king_revenge_items, 8, 8) - -trout_items = [golden_tag.as_amount(10), golden_tag.as_amount(20), golden_tag.as_amount(30)] -trout_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.trout, trout_items, 1, 1) - -eg_items = [egg, brown_egg, large_egg, large_brown_egg, duck_egg, void_egg, golden_egg, dinosaur_egg, fried_egg, ostrich_egg, - thunder_egg, calico_egg, green_slime_egg, blue_slime_egg, purple_slime_egg, tiger_slime_egg, roe, aged_roe] -eg_items = [item.as_amount(57) for item in eg_items] -eg_bundle = FixedPriceBundleTemplate(CCRoom.pantry, MemeBundleName.eg, eg_items, 8, 2) - -doctor_angler_items = [fish.as_quality(FishQuality.iridium) for fish in legendary_fish_items] -doctor_angler_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.doctor_angler, doctor_angler_items, 5, 5) - -smapi_items = [camping_stove, decorative_pot, slime_crate, supply_crate, warp_totem_qis_arena, - artifact_spot, twig, weeds, lumber, green_rain_weeds_0, seed_spot, pot_of_gold] -smapi_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.smapi, smapi_items, 4, 4) - -chaos_emerald_items = [diamond, emerald, ruby, limestone, obsidian, kyanite, lemon_stone] -chaos_emerald_bundle = FixedPriceBundleTemplate(CCRoom.crafts_room, MemeBundleName.chaos_emerald, chaos_emerald_items, 7, 7) - -not_the_bees_items = [BundleItem(ArtisanGood.specific_honey(flower)) for flower in all_flowers] -not_the_bees_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.not_the_bees, not_the_bees_items, 4, 4) - -sappy_items = [golden_pumpkin, magic_rock_candy, pearl, prismatic_shard, rabbit_foot, stardrop_tea] -sappy_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.sappy, sappy_items, 4, 4) - -honorable_items = [stone.as_amount(1), prismatic_shard.as_amount(1)] -honorable_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.honorable, honorable_items, 2, 1) - -caffeinated_items = [coffee_bean.as_amount(500)] -caffeinated_bundle = BundleTemplate(CCRoom.crafts_room, MemeBundleName.caffeinated, caffeinated_items, 1, 1) - -hats_off_to_you_items = [living_hat, garbage_hat, golden_helmet, laurel_wreath_crown, joja_cap, - deluxe_pirate_hat, dark_cowboy_hat, tiger_hat, mystery_hat, dark_ballcap] -hats_off_to_you_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.hats_off_to_you, hats_off_to_you_items, 8, 2) - -speedrunners_items = [parsnip, wine, cheese, sea_urchin, lucky_purple_shorts, mayonnaise] -speedrunners_bundle = FixedPriceBundleTemplate(CCRoom.pantry, MemeBundleName.speedrunners, speedrunners_items, 6, 6) - -snitch_items = [lucky_purple_shorts] -snitch_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.snitch, snitch_items, 1, 1) - -mermaid_items = [pearl, clam.as_amount(2), mermaid_pendant, mermaid_boots, flute_block.as_amount(5)] -mermaid_bundle = FixedPriceBundleTemplate(CCRoom.fish_tank, MemeBundleName.mermaid, mermaid_items, 5, 5) - -commitment_items = [bouquet, mermaid_pendant, wilted_bouquet, ancient_doll.as_amount(2)] -commitment_bundle_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.commitment, commitment_items, 4, 4) - -all_simple_items = [all_bundle_items_by_name[bundle_item_name] for bundle_item_name in all_bundle_items_by_name if - all_bundle_items_by_name[bundle_item_name].amount == 1 and - all_bundle_items_by_name[bundle_item_name].quality.startswith("Basic") and - all_bundle_items_by_name[bundle_item_name].flavor is None and - bundle_item_name != "Honey"] - -permit_a38_items = [*all_simple_items] -permit_a38_bundle = BureaucracyBundleTemplate(CCRoom.vault, MemeBundleName.permit_a38, permit_a38_items, 1, 8) - -journalist_items = [*all_simple_items] -journalist_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.journalist, journalist_items, 1, 1) - -trap_items = [BundleItem(MemeItem.trap)] -trap_bundle = FixedSlotsBundleTemplate(CCRoom.bulletin_board, MemeBundleName.trap, trap_items, 4, 4) - -off_your_back_items = [BundleItem(MemeItem.worn_hat), BundleItem(MemeItem.worn_shirt), BundleItem(MemeItem.worn_pants), - BundleItem(MemeItem.worn_boots), BundleItem(MemeItem.worn_left_ring), BundleItem(MemeItem.worn_right_ring)] -off_your_back_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.off_your_back, off_your_back_items, 6, 6) - -sisyphus_items = [stone.as_amount(1)] -sisyphus_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.sisyphus, sisyphus_items, 12, 12) - -vocaloid_items = [spring_onion, orange, banana, tuna, wine, ice_cream, carrot, bread, eggplant] -vocaloid_items = [item.as_amount(10) for item in vocaloid_items] -vocaloid_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.vocaloid, vocaloid_items, 6, 6) - -legendairy_items = [legend, legend_roe, legend_bait, smoked_legend, aged_legend_roe, - milk.as_amount(10), cheese.as_amount(10), goat_milk.as_amount(10), goat_cheese.as_amount(10)] -legendairy_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.legendairy, legendairy_items, 6, 4) - -kent_c_items = [broken_glasses.as_amount(5), refined_quartz.as_amount(10)] -kent_c_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.kent_c, kent_c_items, 2, 2) - -fruit_items = [tomato, pumpkin, summer_squash, eggplant, hot_pepper] -fruit_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.fruit, fruit_items, 5, 5) - -reverse_items = [*all_simple_items] -reverse_bundle = FixedSlotsBundleTemplate(CCRoom.crafts_room, MemeBundleName.reverse, reverse_items, 4, 4) - -bundle_items = [*all_simple_items] -bundle_bundle = RecursiveBundleTemplate(CCRoom.fish_tank, MemeBundleName.bundle, bundle_items, 16, 16, 4) - -bun_dle_items = [strange_bun, bread, tortilla, rabbit_foot] -bun_dle_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.bun_dle, bun_dle_items, 4, 4) - -celeste_items = [strawberry.as_amount(175), strawberry_seeds.as_amount(4), strawberry.as_quality(CropQuality.gold).as_amount(26)] -celeste_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.celeste, celeste_items, 3, 3) - -automation_items = [copper_bar.as_amount(15), iron_bar.as_amount(36), iron_bar.as_amount(20), copper_bar.as_amount(10)] -automation_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.automation, automation_items, 4, 4) - -animal_well_items = [rare_disc, bone_flute, ruby_crystal_ball, cherry_bomb.as_amount(1), candle_lamp, modern_lamp, advanced_tv_remote] -animal_well_bundle = FixedPriceBundleTemplate(CCRoom.pantry, MemeBundleName.animal_well, animal_well_items, 7, 7) - -schrodinger_items = [*all_simple_items] -schrodinger_bundle = FixedPriceBundleTemplate(CCRoom.fish_tank, MemeBundleName.schrodinger, schrodinger_items, 2, 1) - -ikea_craftables = [Machine.mayonnaise_machine, Machine.bee_house, Machine.preserves_jar, Machine.cheese_press, Machine.keg, Machine.fish_smoker, - Machine.crystalarium, Machine.worm_bin, Furniture.tub_o_flowers] -ikea_items = [BundleItem(craftable) for craftable in ikea_craftables] -ikea_bundle = FixedPriceBundleTemplate(CCRoom.crafts_room, MemeBundleName.ikea, ikea_items, 1, 1) - -this_is_fine_items = [coffee, fire_quartz, fire_quartz, fire_quartz, fire_quartz, fire_quartz, fire_quartz, fire_quartz] -this_is_fine_bundle = FixedPriceBundleTemplate(CCRoom.crafts_room, MemeBundleName.this_is_fine, this_is_fine_items, 8, 8) - -crap_pot_items = [clay, mudstone, truffle, sunflower_seeds, roasted_hazelnuts, plum_pudding, rotten_plant, taro_root] -crap_pot_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.crap_pot, crap_pot_items, 4, 4) - -emmalution_items = [garlic, bread, trash, goblin_mask, rain_totem] -emmalution_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.emmalution, emmalution_items, 5, 5) - -unused_balls = [fairy_rose, melon, grape, geode, ancient_seed, crystal_ball, peach] -yellow_pool_balls = [item.as_amount(1) for item in [solar_essence, topaz_crystal_ball, pizza, apricot, gold_ore, golden_coconut, pufferfish, lucky_lunch]] -blue_pool_balls = [item.as_amount(2) for item in [blue_jazz, blueberry, powdermelon, ancient_fruit, iridium_ore, aquamarine, opal, broken_cd]] -red_pool_balls = [item.as_amount(3) for item in [tomato, mega_bomb, magma_geode, apple, explosive_ammo, cranberries, cherry_bomb]] -purple_pool_balls = [item.as_amount(4) for item in [red_cabbage, pomegranate, void_essence, wild_plum]] -orange_pool_balls = [item.as_amount(5) for item in [pumpkin, orange, tigerseye]] -green_pool_balls = [item.as_amount(6) for item in [cauliflower, jamborite, salad, cactus_fruit, radioactive_ore]] -brown_pool_balls = [item.as_amount(7) for item in [acorn, coconut, hazelnut, maple_bar, maple_syrup, potato, truffle, yam]] -black_pool_balls = [item.as_amount(8) for item in [bomb, coal, void_egg]] -pool_items = [yellow_pool_balls, blue_pool_balls, red_pool_balls, purple_pool_balls, orange_pool_balls, green_pool_balls, brown_pool_balls, black_pool_balls] -pool_bundle = FixedPriceDeepBundleTemplate(CCRoom.boiler_room, MemeBundleName.pool, pool_items, 8, 8) - -argonmatrix_items = [radish.as_amount(32), radish.as_amount(87), melon.as_amount(127), chocolate_cake.as_amount(3), cactus_fruit.as_amount(1)] -argonmatrix_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.argonmatrix, argonmatrix_items, 5, 5) - -frazzleduck_items = [duck_egg, duck_feather, eggplant, green_jacket_shirt] -frazzleduck_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.frazzleduck, frazzleduck_items, 4, 4) - -loser_club_items = [tuna] -loser_club_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.loser_club, loser_club_items, 1, 1) - -ministry_items = [item.as_amount(999) for item in [trash, joja_cola, broken_glasses, broken_cd, soggy_newspaper]] -ministry_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.ministry_of_madness, ministry_items, 4, 1) - -pomnut_items = [pomegranate, hazelnut, carrot] -pomnut_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.pomnut, pomnut_items, 3, 3) - -blossom_garden_items = [banana.as_amount(18), pizza.as_amount(32), spaghetti, single_bed, pink_cake, wood_floor, triple_shot_espresso, maple_bar, bug_steak, void_essence.as_amount(10), crystal_ball, solar_essence.as_amount(10)] -blossom_garden_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.blossom_garden, blossom_garden_items, 12, 6) - -cooperation_items = [*all_simple_items] -cooperation_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.cooperation, cooperation_items, 4, 4) - -doctor_items = [apple.as_amount(365)] -doctor_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.doctor, doctor_items, 1, 1) - -very_sticky_items = [sap.as_amount(125), sap.as_amount(125), sap.as_amount(125), sap.as_amount(125)] -very_sticky_bundle = FixedPriceBundleTemplate(CCRoom.crafts_room, MemeBundleName.very_sticky, very_sticky_items, 4, 4) - -square_hole_items = [*all_simple_items] -square_hole_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.square_hole, square_hole_items, 6, 6) - -distracted_items = [*all_simple_items] # (If you bring more than one item for it, the rest get sent home) -distracted_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.distracted, distracted_items, 4, 4) - -algorerhythm_items =[item.as_amount(2) for item in - [midnight_squid_roe, tea_set, statue_of_endless_fortune, golden_bobber, dried_qi_fruit, cursed_mannequin, - statue_of_blessings, crane_house_plant, book_of_mysteries, far_away_stone, void_ghost_pendant, trimmed_purple_shorts]] -algorerhythm_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.algorerhythm, algorerhythm_items, 12, 4) - - -red_fish_items = [red_mullet, red_snapper, lava_eel, crimsonfish] -blue_fish_items = [anchovy, tuna, sardine, bream, squid, ice_pip, albacore, blue_discus, midnight_squid, spook_fish, glacierfish] -other_fish = [pufferfish, largemouth_bass, smallmouth_bass, rainbow_trout, walleye, perch, carp, catfish, pike, sunfish, herring, eel, octopus, sea_cucumber, - super_cucumber, ghostfish, stonefish, sandfish, scorpion_carp, flounder, midnight_carp, tigerseye, bullhead, tilapia, chub, dorado, shad, - lingcod, halibut, slimejack, stingray, goby, blobfish, angler, legend, mutant_carp] -dr_seuss_items = [other_fish, [fish.as_amount(2) for fish in other_fish], red_fish_items, blue_fish_items] -dr_seuss_bundle = FixedPriceDeepBundleTemplate(CCRoom.crafts_room, MemeBundleName.dr_seuss, dr_seuss_items, 4, 4) - -pollution_items = [trash, broken_cd, broken_glasses, joja_cola, soggy_newspaper, battery_pack] -pollution_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.pollution, pollution_items, 4, 4) - -all_fish_item_names = sorted(list(set([item.item_name for item in [*spring_fish_items, *summer_fish_items, *fall_fish_items, *winter_fish_items]]))) -all_fish_items = [BundleItem(item).as_amount(1).as_quality(FishQuality.basic) for item in all_fish_item_names] -catch_and_release_items = [*all_fish_items] -catch_and_release_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.catch_and_release, catch_and_release_items, 4, 4) - -vampire_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.vampire, BundleItem(MemeCurrency.blood, 200)) -exhaustion_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.exhaustion, BundleItem(MemeCurrency.energy, 400)) -tick_tock_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.tick_tock, BundleItem(MemeCurrency.time, 1440)) -archipela_go_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.archipela_go, BundleItem(MemeCurrency.steps, 20000)) -clique_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.clique, BundleItem(MemeCurrency.clic, 1)) -cookie_clicker_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.cookie_clicker, BundleItem(MemeCurrency.cookies, 200000)) -communism_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.communism, BundleItem.money_bundle(1)) -death_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.death, death) -flashbang_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.flashbang, BundleItem.money_bundle(0)) -connection_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.connection, BundleItem.money_bundle(0)) -reconnection_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.reconnection, BundleItem.money_bundle(0)) -nft_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.nft, BundleItem.money_bundle(0)) -firstborn_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.firstborn, BundleItem(MemeCurrency.child, 1)) -restraint_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.restraint, BundleItem.money_bundle(0)) -fast_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.fast, BundleItem(MemeCurrency.time_elapsed, 1000)) -floor_is_lava_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.floor_is_lava, BundleItem.money_bundle(0)) -joetg_bundle = CurrencyBundleTemplate(CCRoom.bulletin_board, MemeBundleName.joetg, BundleItem(MemeCurrency.dead_pumpkins, 750)) -bad_farmer_bundle = CurrencyBundleTemplate(CCRoom.pantry, MemeBundleName.bad_farmer, BundleItem(MemeCurrency.dead_crops, 400)) -bad_fisherman_bundle = CurrencyBundleTemplate(CCRoom.fish_tank, MemeBundleName.bad_fisherman, BundleItem(MemeCurrency.missed_fish, 20)) -honeywell_bundle = CurrencyBundleTemplate(CCRoom.bulletin_board, MemeBundleName.honeywell, BundleItem(MemeCurrency.honeywell, 1)) -gacha_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.gacha, BundleItem.money_bundle(10000)) -hibernation_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.hibernation, BundleItem(MemeCurrency.sleep_days, 60)) -crowdfunding_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.crowdfunding, BundleItem(MemeCurrency.bank_money, 10000)) -clickbait_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.clickbait, BundleItem.money_bundle(100)) -puzzle_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.puzzle, BundleItem.money_bundle(10)) -asmr_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.asmr, BundleItem.money_bundle(0)) -humble_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.humble, BundleItem.money_bundle(5000)) -deathlink_bundle = CurrencyBundleTemplate(CCRoom.boiler_room, MemeBundleName.deathlink, BundleItem(MemeCurrency.deathlinks, 10)) -investment_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.scam, BundleItem.money_bundle(10000)) -stanley_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.stanley, BundleItem.money_bundle(9999999)) -hairy_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.hairy, BundleItem.money_bundle(0)) -# colored_crystals_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.boiler_room, MemeBundleName.colored_crystals, BundleItem.money_bundle(10)) -hint_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.bulletin_board, MemeBundleName.hint, BundleItem.money_bundle(10)) -sacrifice_bundle = CurrencyBundleTemplate(CCRoom.boiler_room, MemeBundleName.sacrifice, BundleItem(MemeCurrency.goat, 1)) - -# Stopped at 49 responses on the form - -# Todo Bundles -# Acrostic Bundle (Asks for a specific word, you need to donate an item for each letter) -# Bubbles Bundle -# Cipher Bundle (Some sort of code?) -# DLC Bundle -# Doom Bundle -# Dragonball Bundle -# Empty Bundle (donate empty inventory spot) -# Friendship Bundle (Show some NPCs, gotta donate a loved gift for each of them) -# GeoGessr Bundle -# Ghost Bundle (it ghosts you) -# Joja/Morris Bundle -# Leaf Blower Bundle (Leaf Blower Minigame, similar to the cookie clicker one) -# Lingo Bundle -# Lost Axe Bundle (Donate your axe then talk to Robin) -# Maguffin Bundle (Ap items) -# Millibelle Bundle (money, run away, find at spa) -# Minesweeper bundle (donate bombs on correct spots) -# Pico-8 Bundle -# Pollution Bundle -# QA Bundle (Some sort of bug, not sure yet) -# Relay Bundle (Relay Stick passed around the multiworld) -# Robin's Lost Axe Bundle (Give your axe, then Robin brings it back to you) -# Scavenger Bundle (The bundle moves around the map and you need to keep finding it) -# Side Quest Bundle (Sends you on side quests to talk to random NPCs several times) -# Therapy Bundle -# Torrent Bundle (someone must seed it for you) -# Witness Bundle -# Change Cap Bundle to forgetting something at home - - - -# Bundles that need special Mod Handling: -# None - -pantry_bundles_meme = [hurricane_tortilla_bundle, look_at_chickens_bundle, lemonade_stand_bundle, what_the_rock_is_cooking_bundle, sunmaid_bundle, - big_grapes_bundle, eg_bundle, not_the_bees_bundle, speedrunners_bundle, bun_dle_bundle, animal_well_bundle, bad_farmer_bundle] -pantry_meme = BundleRoomTemplate(CCRoom.pantry, pantry_bundles_meme, 6) - -crafts_room_bundles_meme = [AAAA_bundle, anything_for_beyonce_bundle, potato_bundle, chaos_emerald_bundle, caffeinated_bundle, reverse_bundle, - ikea_bundle, this_is_fine_bundle, very_sticky_bundle, dr_seuss_bundle] -crafts_room_meme = BundleRoomTemplate(CCRoom.crafts_room, crafts_room_bundles_meme, 6) - -fish_tank_bundles_meme = [crab_rave_bundle, trout_bundle, doctor_angler_bundle, mermaid_bundle, legendairy_bundle, kent_c_bundle, bundle_bundle, - schrodinger_bundle, bad_fisherman_bundle, pollution_bundle, catch_and_release_bundle] -fish_tank_meme = BundleRoomTemplate(CCRoom.fish_tank, fish_tank_bundles_meme, 6) - -boiler_room_bundles_meme = [amons_fall_bundle, screw_you_bundle, rick_bundle, minecraft_bundle, balls_bundle, tilesanity_bundle, obelisks_bundle, - honorable_bundle, sisyphus_bundle, automation_bundle, crap_pot_bundle, deathlink_bundle, pool_bundle, # colored_crystals_bundle, - sacrifice_bundle] -boiler_room_meme = BundleRoomTemplate(CCRoom.boiler_room, boiler_room_bundles_meme, 3) - -bulletin_board_bundles_meme = [burger_king_bundle, romance_bundle, burger_king_revenge_bundle, smapi_bundle, sappy_bundle, hats_off_to_you_bundle, - snitch_bundle, commitment_bundle_bundle, journalist_bundle, trap_bundle, off_your_back_bundle, vocaloid_bundle, fruit_bundle, - celeste_bundle, cap_bundle, emmalution_bundle, joetg_bundle, honeywell_bundle, cooperation_bundle, square_hole_bundle, - ministry_bundle, loser_club_bundle, frazzleduck_bundle, argonmatrix_bundle, pomnut_bundle, blossom_garden_bundle, doctor_bundle, - hint_bundle, algorerhythm_bundle, distracted_bundle] -bulletin_board_meme = BundleRoomTemplate(CCRoom.bulletin_board, bulletin_board_bundles_meme, 5) - -vault_bundles_meme = [capitalist_bundle, death_bundle, permit_a38_bundle, vampire_bundle, exhaustion_bundle, - tick_tock_bundle, archipela_go_bundle, clique_bundle, cookie_clicker_bundle, communism_bundle, - flashbang_bundle, connection_bundle, reconnection_bundle, nft_bundle, firstborn_bundle, restraint_bundle, fast_bundle, - floor_is_lava_bundle, gacha_bundle, hibernation_bundle, crowdfunding_bundle, clickbait_bundle, - humble_bundle, puzzle_bundle, asmr_bundle, investment_bundle, stanley_bundle, hairy_bundle] -vault_meme = BundleRoomTemplate(CCRoom.vault, vault_bundles_meme, 4) - -all_cc_meme_bundles = [*pantry_bundles_meme, *crafts_room_bundles_meme, *fish_tank_bundles_meme, - *boiler_room_bundles_meme, *bulletin_board_bundles_meme, *vault_bundles_meme] -community_center_meme_bundles = BundleRoomTemplate("Community Center", all_cc_meme_bundles, 30) +from .bundle_data import all_bundle_items_by_name +from .meme_bundles_data.capitalist_bundle import capitalist_items +from .remixed_bundles import * +from ...bundles.bundle import BureaucracyBundleTemplate, RecursiveBundleTemplate, FixedPriceCurrencyBundleTemplate, \ + FixedPriceBundleTemplate, FixedPriceDeepBundleTemplate, FixedMultiplierBundleTemplate, FixedSlotsBundleTemplate +from ...strings.bundle_names import MemeBundleName +from ...strings.currency_names import MemeCurrency +from ...strings.flower_names import all_flowers +from ...strings.machine_names import Machine +from ...strings.meme_item_names import MemeItem +from ...strings.quality_names import AnimalProductQuality, CropQuality + +burger_king_items = [survival_burger, joja_cola, apple_slices, ice_cream, strange_doll, strange_doll_green, hashbrowns, infinity_crown] +burger_king_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.burger_king, burger_king_items, 6, 3) + +capitalist_bundle = FixedMultiplierBundleTemplate(CCRoom.vault, MemeBundleName.capitalist, capitalist_items, 12, 2) + +romance_items = [lucky_purple_shorts, truffle_oil, super_cucumber, good_ol_cap] +romance_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.romance, romance_items, 4, 4) + +hurricane_tortilla_items = [tortilla.as_amount(4)] +hurricane_tortilla_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.hurricane_tortilla, hurricane_tortilla_items, 6, 6) + +AAAA_items = [battery_pack.as_amount(12), battery_pack.as_amount(8), battery_pack.as_amount(6)] +AAAA_bundle = BundleTemplate(CCRoom.crafts_room, MemeBundleName.AAAA, AAAA_items, 3, 3) + +anything_for_beyonce_items = [beet] +anything_for_beyonce_bundle = BundleTemplate(CCRoom.crafts_room, MemeBundleName.anything_for_beyonce, anything_for_beyonce_items, 1, 1) + +crab_rave_items = [crab.as_amount(8)] +crab_rave_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.crab_rave, crab_rave_items, 12, 8) + +potato_items = [potato.as_amount(8)] +potato_bundle = BundleTemplate(CCRoom.crafts_room, MemeBundleName.potato, potato_items, 12, 8) + +look_at_chickens_items = [duck_egg.as_amount(2)] +look_at_chickens_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.look_at_chickens, look_at_chickens_items, 10, 4) + +lemonade_stand_items = [grape] +lemonade_stand_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.lemonade_stand, lemonade_stand_items, 3, 1) + +what_the_rock_is_cooking_items = [stone.as_amount(1), cookout_kit, strange_bun] +what_the_rock_is_cooking_bundle = FixedPriceBundleTemplate(CCRoom.pantry, MemeBundleName.what_the_rock_is_cooking, what_the_rock_is_cooking_items, 3, 3) + +amons_fall_items = [stone.as_amount(1)] +amons_fall_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.amons_fall, amons_fall_items, 7, 7) + +screw_you_items = [tea_set, ostrich_egg.as_quality(AnimalProductQuality.iridium), snake_vertebrae.as_amount(5), mummified_bat.as_amount(5)] +screw_you_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.screw_you, screw_you_items, 4, 4) + +sunmaid_items = [raisins.as_amount(28)] +sunmaid_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.sunmaid, sunmaid_items, 1, 1) + +rick_items = [pickles] +rick_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.rick, rick_items, 1, 1) + +minecraft_items = [coal, copper_ore, iron_ore, quartz, amethyst, emerald, gold_ore, diamond, obsidian] +minecraft_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.minecraft, minecraft_items, 9, 8) + +balls_items = [blue_jazz, cauliflower, blueberry, melon, red_cabbage, tomato, powdermelon, cranberries, fairy_rose, grape, pumpkin, ancient_fruit, + solar_essence, cherry_bomb, bomb, mega_bomb, coal, iridium_ore, aquamarine, jamborite, geode, magma_geode, ancient_seed, crystal_ball, + amethyst_crystal_ball, aquamarine_crystal_ball, emerald_crystal_ball, ruby_crystal_ball, topaz_crystal_ball, apple, pizza, explosive_ammo, peach, + orange, apricot, tigerseye, coconut, gold_ore, golden_coconut, pufferfish, lucky_lunch, salad, cactus_fruit, radioactive_ore, opal, broken_cd, + void_essence, wild_plum, pomegranate] +balls_items = [item.as_amount(1) for item in balls_items] +balls_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.balls, balls_items, 12, 6) + +tilesanity_items = [wood_floor.as_amount(100), rustic_plank_floor.as_amount(100), straw_floor.as_amount(100), weathered_floor.as_amount(100), + crystal_floor.as_amount(100), stone_floor.as_amount(100), stone_walkway_floor.as_amount(100), brick_floor.as_amount(100), + wood_path.as_amount(100), gravel_path.as_amount(100), cobblestone_path.as_amount(100), stepping_stone_path.as_amount(100), + crystal_path.as_amount(100)] +tilesanity_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.tilesanity, tilesanity_items, 4, 4) + +cap_items = [vacation_shirt, wood.as_amount(999), sap.as_amount(999), pine_cone.as_amount(100), acorn.as_amount(100), + maple_seed.as_amount(100), moss.as_amount(500), exotic_double_bed.as_amount(1)] +cap_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.cap, cap_items, 8, 4) + +big_grapes_items = [coconut] +big_grapes_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.big_grapes, big_grapes_items, 4, 4) + +obelisks_items = [earth_crystal.as_amount(10), clam.as_amount(10), coral.as_amount(10), coconut.as_amount(10), cactus_fruit.as_amount(10), + banana.as_amount(10), dragon_tooth.as_amount(10), iridium_bar.as_amount(45)] +obelisks_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.obelisks, obelisks_items, 8, 8) + +burger_king_revenge_items = [fossilized_tail, void_salmon, ostrich_egg.as_amount(3), tea_leaves.as_amount(10), purple_slime_egg, + moss_soup.as_amount(3), radioactive_ore.as_amount(5), mystic_syrup.as_amount(10), truffle, aged_crimsonfish_roe] +burger_king_revenge_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.burger_king_revenge, burger_king_revenge_items, 8, 8) + +trout_items = [golden_tag.as_amount(10), golden_tag.as_amount(20), golden_tag.as_amount(30)] +trout_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.trout, trout_items, 1, 1) + +eg_items = [egg, brown_egg, large_egg, large_brown_egg, duck_egg, void_egg, golden_egg, dinosaur_egg, fried_egg, ostrich_egg, + thunder_egg, calico_egg, green_slime_egg, blue_slime_egg, purple_slime_egg, tiger_slime_egg, roe, aged_roe] +eg_items = [item.as_amount(57) for item in eg_items] +eg_bundle = FixedPriceBundleTemplate(CCRoom.pantry, MemeBundleName.eg, eg_items, 8, 2) + +doctor_angler_items = [fish.as_quality(FishQuality.iridium) for fish in legendary_fish_items] +doctor_angler_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.doctor_angler, doctor_angler_items, 5, 5) + +smapi_items = [camping_stove, decorative_pot, slime_crate, supply_crate, warp_totem_qis_arena, + artifact_spot, twig, weeds, lumber, green_rain_weeds_0, seed_spot, pot_of_gold] +smapi_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.smapi, smapi_items, 4, 4) + +chaos_emerald_items = [diamond, emerald, ruby, limestone, obsidian, kyanite, lemon_stone] +chaos_emerald_bundle = FixedPriceBundleTemplate(CCRoom.crafts_room, MemeBundleName.chaos_emerald, chaos_emerald_items, 7, 7) + +not_the_bees_items = [BundleItem(ArtisanGood.specific_honey(flower)) for flower in all_flowers] +not_the_bees_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.not_the_bees, not_the_bees_items, 4, 4) + +sappy_items = [golden_pumpkin, magic_rock_candy, pearl, prismatic_shard, rabbit_foot, stardrop_tea] +sappy_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.sappy, sappy_items, 4, 4) + +honorable_items = [stone.as_amount(1), prismatic_shard.as_amount(1)] +honorable_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.honorable, honorable_items, 2, 1) + +caffeinated_items = [coffee_bean.as_amount(500)] +caffeinated_bundle = BundleTemplate(CCRoom.crafts_room, MemeBundleName.caffeinated, caffeinated_items, 1, 1) + +hats_off_to_you_items = [living_hat, garbage_hat, golden_helmet, laurel_wreath_crown, joja_cap, + deluxe_pirate_hat, dark_cowboy_hat, tiger_hat, mystery_hat, dark_ballcap] +hats_off_to_you_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.hats_off_to_you, hats_off_to_you_items, 8, 2) + +speedrunners_items = [parsnip, wine, cheese, sea_urchin, lucky_purple_shorts, mayonnaise] +speedrunners_bundle = FixedPriceBundleTemplate(CCRoom.pantry, MemeBundleName.speedrunners, speedrunners_items, 6, 6) + +snitch_items = [lucky_purple_shorts] +snitch_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.snitch, snitch_items, 1, 1) + +mermaid_items = [pearl, clam.as_amount(2), mermaid_pendant, mermaid_boots, flute_block.as_amount(5)] +mermaid_bundle = FixedPriceBundleTemplate(CCRoom.fish_tank, MemeBundleName.mermaid, mermaid_items, 5, 5) + +commitment_items = [bouquet, mermaid_pendant, wilted_bouquet, ancient_doll.as_amount(2)] +commitment_bundle_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.commitment, commitment_items, 4, 4) + +all_simple_items = [all_bundle_items_by_name[bundle_item_name] for bundle_item_name in all_bundle_items_by_name if + all_bundle_items_by_name[bundle_item_name].amount == 1 and + all_bundle_items_by_name[bundle_item_name].quality.startswith("Basic") and + all_bundle_items_by_name[bundle_item_name].flavor is None and + bundle_item_name != "Honey"] + +permit_a38_items = [*all_simple_items] +permit_a38_bundle = BureaucracyBundleTemplate(CCRoom.vault, MemeBundleName.permit_a38, permit_a38_items, 1, 8) + +journalist_items = [*all_simple_items] +journalist_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.journalist, journalist_items, 1, 1) + +trap_items = [BundleItem(MemeItem.trap)] +trap_bundle = FixedSlotsBundleTemplate(CCRoom.bulletin_board, MemeBundleName.trap, trap_items, 4, 4) + +off_your_back_items = [BundleItem(MemeItem.worn_hat), BundleItem(MemeItem.worn_shirt), BundleItem(MemeItem.worn_pants), + BundleItem(MemeItem.worn_boots), BundleItem(MemeItem.worn_left_ring), BundleItem(MemeItem.worn_right_ring)] +off_your_back_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.off_your_back, off_your_back_items, 6, 6) + +sisyphus_items = [stone.as_amount(1)] +sisyphus_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.sisyphus, sisyphus_items, 12, 12) + +vocaloid_items = [spring_onion, orange, banana, tuna, wine, ice_cream, carrot, bread, eggplant] +vocaloid_items = [item.as_amount(10) for item in vocaloid_items] +vocaloid_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.vocaloid, vocaloid_items, 6, 6) + +legendairy_items = [legend, legend_roe, legend_bait, smoked_legend, aged_legend_roe, + milk.as_amount(10), cheese.as_amount(10), goat_milk.as_amount(10), goat_cheese.as_amount(10)] +legendairy_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.legendairy, legendairy_items, 6, 4) + +kent_c_items = [broken_glasses.as_amount(5), refined_quartz.as_amount(10)] +kent_c_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.kent_c, kent_c_items, 2, 2) + +fruit_items = [tomato, pumpkin, summer_squash, eggplant, hot_pepper] +fruit_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.fruit, fruit_items, 5, 5) + +reverse_items = [*all_simple_items] +reverse_bundle = FixedSlotsBundleTemplate(CCRoom.crafts_room, MemeBundleName.reverse, reverse_items, 4, 4) + +bundle_items = [*all_simple_items] +bundle_bundle = RecursiveBundleTemplate(CCRoom.fish_tank, MemeBundleName.bundle, bundle_items, 16, 16, 4) + +bun_dle_items = [strange_bun, bread, tortilla, rabbit_foot] +bun_dle_bundle = BundleTemplate(CCRoom.pantry, MemeBundleName.bun_dle, bun_dle_items, 4, 4) + +celeste_items = [strawberry.as_amount(175), strawberry_seeds.as_amount(4), strawberry.as_quality(CropQuality.gold).as_amount(26)] +celeste_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.celeste, celeste_items, 3, 3) + +automation_items = [copper_bar.as_amount(15), iron_bar.as_amount(36), iron_bar.as_amount(20), copper_bar.as_amount(10)] +automation_bundle = FixedPriceBundleTemplate(CCRoom.boiler_room, MemeBundleName.automation, automation_items, 4, 4) + +animal_well_items = [rare_disc, bone_flute, ruby_crystal_ball, cherry_bomb.as_amount(1), candle_lamp, modern_lamp, advanced_tv_remote] +animal_well_bundle = FixedPriceBundleTemplate(CCRoom.pantry, MemeBundleName.animal_well, animal_well_items, 7, 7) + +schrodinger_items = [*all_simple_items] +schrodinger_bundle = FixedPriceBundleTemplate(CCRoom.fish_tank, MemeBundleName.schrodinger, schrodinger_items, 2, 1) + +ikea_craftables = [Machine.mayonnaise_machine, Machine.bee_house, Machine.preserves_jar, Machine.cheese_press, Machine.keg, Machine.fish_smoker, + Machine.crystalarium, Machine.worm_bin, Furniture.tub_o_flowers] +ikea_items = [BundleItem(craftable) for craftable in ikea_craftables] +ikea_bundle = FixedPriceBundleTemplate(CCRoom.crafts_room, MemeBundleName.ikea, ikea_items, 1, 1) + +this_is_fine_items = [coffee, fire_quartz, fire_quartz, fire_quartz, fire_quartz, fire_quartz, fire_quartz, fire_quartz] +this_is_fine_bundle = FixedPriceBundleTemplate(CCRoom.crafts_room, MemeBundleName.this_is_fine, this_is_fine_items, 8, 8) + +crap_pot_items = [clay, mudstone, truffle, sunflower_seeds, roasted_hazelnuts, plum_pudding, rotten_plant, taro_root] +crap_pot_bundle = BundleTemplate(CCRoom.boiler_room, MemeBundleName.crap_pot, crap_pot_items, 4, 4) + +emmalution_items = [garlic, bread, trash, goblin_mask, rain_totem] +emmalution_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.emmalution, emmalution_items, 5, 5) + +unused_balls = [fairy_rose, melon, grape, geode, ancient_seed, crystal_ball, peach] +yellow_pool_balls = [item.as_amount(1) for item in [solar_essence, topaz_crystal_ball, pizza, apricot, gold_ore, golden_coconut, pufferfish, lucky_lunch]] +blue_pool_balls = [item.as_amount(2) for item in [blue_jazz, blueberry, powdermelon, ancient_fruit, iridium_ore, aquamarine, opal, broken_cd]] +red_pool_balls = [item.as_amount(3) for item in [tomato, mega_bomb, magma_geode, apple, explosive_ammo, cranberries, cherry_bomb]] +purple_pool_balls = [item.as_amount(4) for item in [red_cabbage, pomegranate, void_essence, wild_plum]] +orange_pool_balls = [item.as_amount(5) for item in [pumpkin, orange, tigerseye]] +green_pool_balls = [item.as_amount(6) for item in [cauliflower, jamborite, salad, cactus_fruit, radioactive_ore]] +brown_pool_balls = [item.as_amount(7) for item in [acorn, coconut, hazelnut, maple_bar, maple_syrup, potato, truffle, yam]] +black_pool_balls = [item.as_amount(8) for item in [bomb, coal, void_egg]] +pool_items = [yellow_pool_balls, blue_pool_balls, red_pool_balls, purple_pool_balls, orange_pool_balls, green_pool_balls, brown_pool_balls, black_pool_balls] +pool_bundle = FixedPriceDeepBundleTemplate(CCRoom.boiler_room, MemeBundleName.pool, pool_items, 8, 8) + +argonmatrix_items = [radish.as_amount(32), radish.as_amount(87), melon.as_amount(127), chocolate_cake.as_amount(3), cactus_fruit.as_amount(1)] +argonmatrix_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.argonmatrix, argonmatrix_items, 5, 5) + +frazzleduck_items = [duck_egg, duck_feather, eggplant, green_jacket_shirt] +frazzleduck_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.frazzleduck, frazzleduck_items, 4, 4) + +loser_club_items = [tuna] +loser_club_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.loser_club, loser_club_items, 1, 1) + +ministry_items = [item.as_amount(999) for item in [trash, joja_cola, broken_glasses, broken_cd, soggy_newspaper]] +ministry_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.ministry_of_madness, ministry_items, 4, 1) + +pomnut_items = [pomegranate, hazelnut, carrot] +pomnut_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.pomnut, pomnut_items, 3, 3) + +blossom_garden_items = [banana.as_amount(18), pizza.as_amount(32), spaghetti, single_bed, pink_cake, wood_floor, triple_shot_espresso, maple_bar, bug_steak, void_essence.as_amount(10), crystal_ball, solar_essence.as_amount(10)] +blossom_garden_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.blossom_garden, blossom_garden_items, 12, 6) + +cooperation_items = [*all_simple_items] +cooperation_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.cooperation, cooperation_items, 4, 4) + +doctor_items = [apple.as_amount(365)] +doctor_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.doctor, doctor_items, 1, 1) + +very_sticky_items = [sap.as_amount(125), sap.as_amount(125), sap.as_amount(125), sap.as_amount(125)] +very_sticky_bundle = FixedPriceBundleTemplate(CCRoom.crafts_room, MemeBundleName.very_sticky, very_sticky_items, 4, 4) + +square_hole_items = [*all_simple_items] +square_hole_bundle = FixedPriceBundleTemplate(CCRoom.bulletin_board, MemeBundleName.square_hole, square_hole_items, 6, 6) + +distracted_items = [*all_simple_items] # (If you bring more than one item for it, the rest get sent home) +distracted_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.distracted, distracted_items, 4, 4) + +algorerhythm_items =[item.as_amount(2) for item in + [midnight_squid_roe, tea_set, statue_of_endless_fortune, golden_bobber, dried_qi_fruit, cursed_mannequin, + statue_of_blessings, crane_house_plant, book_of_mysteries, far_away_stone, void_ghost_pendant, trimmed_purple_shorts]] +algorerhythm_bundle = BundleTemplate(CCRoom.bulletin_board, MemeBundleName.algorerhythm, algorerhythm_items, 12, 4) + + +red_fish_items = [red_mullet, red_snapper, lava_eel, crimsonfish] +blue_fish_items = [anchovy, tuna, sardine, bream, squid, ice_pip, albacore, blue_discus, midnight_squid, spook_fish, glacierfish] +other_fish = [pufferfish, largemouth_bass, smallmouth_bass, rainbow_trout, walleye, perch, carp, catfish, pike, sunfish, herring, eel, octopus, sea_cucumber, + super_cucumber, ghostfish, stonefish, sandfish, scorpion_carp, flounder, midnight_carp, tigerseye, bullhead, tilapia, chub, dorado, shad, + lingcod, halibut, slimejack, stingray, goby, blobfish, angler, legend, mutant_carp] +dr_seuss_items = [other_fish, [fish.as_amount(2) for fish in other_fish], red_fish_items, blue_fish_items] +dr_seuss_bundle = FixedPriceDeepBundleTemplate(CCRoom.crafts_room, MemeBundleName.dr_seuss, dr_seuss_items, 4, 4) + +pollution_items = [trash, broken_cd, broken_glasses, joja_cola, soggy_newspaper, battery_pack] +pollution_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.pollution, pollution_items, 4, 4) + +all_fish_item_names = sorted(list(set([item.item_name for item in [*spring_fish_items, *summer_fish_items, *fall_fish_items, *winter_fish_items]]))) +all_fish_items = [BundleItem(item).as_amount(1).as_quality(FishQuality.basic) for item in all_fish_item_names] +catch_and_release_items = [*all_fish_items] +catch_and_release_bundle = BundleTemplate(CCRoom.fish_tank, MemeBundleName.catch_and_release, catch_and_release_items, 4, 4) + +vampire_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.vampire, BundleItem(MemeCurrency.blood, 200)) +exhaustion_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.exhaustion, BundleItem(MemeCurrency.energy, 400)) +tick_tock_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.tick_tock, BundleItem(MemeCurrency.time, 1440)) +archipela_go_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.archipela_go, BundleItem(MemeCurrency.steps, 20000)) +clique_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.clique, BundleItem(MemeCurrency.clic, 1)) +cookie_clicker_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.cookie_clicker, BundleItem(MemeCurrency.cookies, 200000)) +communism_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.communism, BundleItem.money_bundle(1)) +death_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.death, death) +flashbang_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.flashbang, BundleItem.money_bundle(0)) +connection_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.connection, BundleItem.money_bundle(0)) +reconnection_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.reconnection, BundleItem.money_bundle(0)) +nft_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.nft, BundleItem.money_bundle(0)) +firstborn_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.firstborn, BundleItem(MemeCurrency.child, 1)) +restraint_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.restraint, BundleItem.money_bundle(0)) +fast_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.fast, BundleItem(MemeCurrency.time_elapsed, 1000)) +floor_is_lava_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.floor_is_lava, BundleItem.money_bundle(0)) +joetg_bundle = CurrencyBundleTemplate(CCRoom.bulletin_board, MemeBundleName.joetg, BundleItem(MemeCurrency.dead_pumpkins, 750)) +bad_farmer_bundle = CurrencyBundleTemplate(CCRoom.pantry, MemeBundleName.bad_farmer, BundleItem(MemeCurrency.dead_crops, 400)) +bad_fisherman_bundle = CurrencyBundleTemplate(CCRoom.fish_tank, MemeBundleName.bad_fisherman, BundleItem(MemeCurrency.missed_fish, 20)) +honeywell_bundle = CurrencyBundleTemplate(CCRoom.bulletin_board, MemeBundleName.honeywell, BundleItem(MemeCurrency.honeywell, 1)) +gacha_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.gacha, BundleItem.money_bundle(10000)) +hibernation_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.hibernation, BundleItem(MemeCurrency.sleep_days, 60)) +crowdfunding_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.crowdfunding, BundleItem(MemeCurrency.bank_money, 10000)) +clickbait_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.clickbait, BundleItem.money_bundle(100)) +puzzle_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.puzzle, BundleItem.money_bundle(10)) +asmr_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.asmr, BundleItem.money_bundle(0)) +humble_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.humble, BundleItem.money_bundle(5000)) +deathlink_bundle = CurrencyBundleTemplate(CCRoom.boiler_room, MemeBundleName.deathlink, BundleItem(MemeCurrency.deathlinks, 10)) +investment_bundle = CurrencyBundleTemplate(CCRoom.vault, MemeBundleName.scam, BundleItem.money_bundle(10000)) +stanley_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.stanley, BundleItem.money_bundle(9999999)) +hairy_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.vault, MemeBundleName.hairy, BundleItem.money_bundle(0)) +# colored_crystals_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.boiler_room, MemeBundleName.colored_crystals, BundleItem.money_bundle(10)) +hint_bundle = FixedPriceCurrencyBundleTemplate(CCRoom.bulletin_board, MemeBundleName.hint, BundleItem.money_bundle(10)) +sacrifice_bundle = CurrencyBundleTemplate(CCRoom.boiler_room, MemeBundleName.sacrifice, BundleItem(MemeCurrency.goat, 1)) + +# Stopped at 49 responses on the form + +# Todo Bundles +# Acrostic Bundle (Asks for a specific word, you need to donate an item for each letter) +# Bubbles Bundle +# Cipher Bundle (Some sort of code?) +# DLC Bundle +# Doom Bundle +# Dragonball Bundle +# Empty Bundle (donate empty inventory spot) +# Friendship Bundle (Show some NPCs, gotta donate a loved gift for each of them) +# GeoGessr Bundle +# Ghost Bundle (it ghosts you) +# Joja/Morris Bundle +# Leaf Blower Bundle (Leaf Blower Minigame, similar to the cookie clicker one) +# Lingo Bundle +# Lost Axe Bundle (Donate your axe then talk to Robin) +# Maguffin Bundle (Ap items) +# Millibelle Bundle (money, run away, find at spa) +# Minesweeper bundle (donate bombs on correct spots) +# Pico-8 Bundle +# Pollution Bundle +# QA Bundle (Some sort of bug, not sure yet) +# Relay Bundle (Relay Stick passed around the multiworld) +# Robin's Lost Axe Bundle (Give your axe, then Robin brings it back to you) +# Scavenger Bundle (The bundle moves around the map and you need to keep finding it) +# Side Quest Bundle (Sends you on side quests to talk to random NPCs several times) +# Therapy Bundle +# Torrent Bundle (someone must seed it for you) +# Witness Bundle +# Change Cap Bundle to forgetting something at home + + + +# Bundles that need special Mod Handling: +# None + +pantry_bundles_meme = [hurricane_tortilla_bundle, look_at_chickens_bundle, lemonade_stand_bundle, what_the_rock_is_cooking_bundle, sunmaid_bundle, + big_grapes_bundle, eg_bundle, not_the_bees_bundle, speedrunners_bundle, bun_dle_bundle, animal_well_bundle, bad_farmer_bundle] +pantry_meme = BundleRoomTemplate(CCRoom.pantry, pantry_bundles_meme, 6) + +crafts_room_bundles_meme = [AAAA_bundle, anything_for_beyonce_bundle, potato_bundle, chaos_emerald_bundle, caffeinated_bundle, reverse_bundle, + ikea_bundle, this_is_fine_bundle, very_sticky_bundle, dr_seuss_bundle] +crafts_room_meme = BundleRoomTemplate(CCRoom.crafts_room, crafts_room_bundles_meme, 6) + +fish_tank_bundles_meme = [crab_rave_bundle, trout_bundle, doctor_angler_bundle, mermaid_bundle, legendairy_bundle, kent_c_bundle, bundle_bundle, + schrodinger_bundle, bad_fisherman_bundle, pollution_bundle, catch_and_release_bundle] +fish_tank_meme = BundleRoomTemplate(CCRoom.fish_tank, fish_tank_bundles_meme, 6) + +boiler_room_bundles_meme = [amons_fall_bundle, screw_you_bundle, rick_bundle, minecraft_bundle, balls_bundle, tilesanity_bundle, obelisks_bundle, + honorable_bundle, sisyphus_bundle, automation_bundle, crap_pot_bundle, deathlink_bundle, pool_bundle, # colored_crystals_bundle, + sacrifice_bundle] +boiler_room_meme = BundleRoomTemplate(CCRoom.boiler_room, boiler_room_bundles_meme, 3) + +bulletin_board_bundles_meme = [burger_king_bundle, romance_bundle, burger_king_revenge_bundle, smapi_bundle, sappy_bundle, hats_off_to_you_bundle, + snitch_bundle, commitment_bundle_bundle, journalist_bundle, trap_bundle, off_your_back_bundle, vocaloid_bundle, fruit_bundle, + celeste_bundle, cap_bundle, emmalution_bundle, joetg_bundle, honeywell_bundle, cooperation_bundle, square_hole_bundle, + ministry_bundle, loser_club_bundle, frazzleduck_bundle, argonmatrix_bundle, pomnut_bundle, blossom_garden_bundle, doctor_bundle, + hint_bundle, algorerhythm_bundle, distracted_bundle] +bulletin_board_meme = BundleRoomTemplate(CCRoom.bulletin_board, bulletin_board_bundles_meme, 5) + +vault_bundles_meme = [capitalist_bundle, death_bundle, permit_a38_bundle, vampire_bundle, exhaustion_bundle, + tick_tock_bundle, archipela_go_bundle, clique_bundle, cookie_clicker_bundle, communism_bundle, + flashbang_bundle, connection_bundle, reconnection_bundle, nft_bundle, firstborn_bundle, restraint_bundle, fast_bundle, + floor_is_lava_bundle, gacha_bundle, hibernation_bundle, crowdfunding_bundle, clickbait_bundle, + humble_bundle, puzzle_bundle, asmr_bundle, investment_bundle, stanley_bundle, hairy_bundle] +vault_meme = BundleRoomTemplate(CCRoom.vault, vault_bundles_meme, 4) + +all_cc_meme_bundles = [*pantry_bundles_meme, *crafts_room_bundles_meme, *fish_tank_bundles_meme, + *boiler_room_bundles_meme, *bulletin_board_bundles_meme, *vault_bundles_meme] +community_center_meme_bundles = BundleRoomTemplate("Community Center", all_cc_meme_bundles, 30) diff --git a/worlds/stardew_valley/data/bundles_data/meme_bundles_data/capitalist_bundle.py b/worlds/stardew_valley/data/bundles_data/meme_bundles_data/capitalist_bundle.py index 3c37eebcd2ab..e6ad3904d76b 100644 --- a/worlds/stardew_valley/data/bundles_data/meme_bundles_data/capitalist_bundle.py +++ b/worlds/stardew_valley/data/bundles_data/meme_bundles_data/capitalist_bundle.py @@ -1,92 +1,92 @@ -import math -from typing import Dict, List - -from ..bundle_items_data import * -from ....bundles.bundle_item import BundleItem -from ....strings.quality_names import ArtisanQuality - -capitalist_value = 1000000 -ancient_fruit_wines = {ArtisanQuality.basic: 2310, ArtisanQuality.silver: 2886, ArtisanQuality.gold: 3465, ArtisanQuality.iridium: 4620} -starfruit_wines = {ArtisanQuality.basic: 3150, ArtisanQuality.silver: 3936, ArtisanQuality.gold: 4725, ArtisanQuality.iridium: 6300} -rhubarb_wines = {ArtisanQuality.silver: 1155, ArtisanQuality.gold: 1386, ArtisanQuality.iridium: 1848} -melon_wines = {ArtisanQuality.basic: 1050, ArtisanQuality.silver: 1311, ArtisanQuality.gold: 1575, ArtisanQuality.iridium: 2100} -pineapple_wines = {ArtisanQuality.basic: 1260, ArtisanQuality.silver: 1575, ArtisanQuality.gold: 1890, ArtisanQuality.iridium: 2520} -starfruits = {ArtisanQuality.silver: 1030, ArtisanQuality.gold: 1237, ArtisanQuality.iridium: 1650} -sweet_gem_berries = {ArtisanQuality.basic: 3000, ArtisanQuality.silver: 3750, ArtisanQuality.gold: 4500, ArtisanQuality.iridium: 6000} - -# These are just too rude I think -# cherry_saplings = {ArtisanQuality.silver: 1062, ArtisanQuality.gold: 1275, ArtisanQuality.iridium: 1700} -# banana_saplings = {ArtisanQuality.silver: 1062, ArtisanQuality.gold: 1275, ArtisanQuality.iridium: 1700} -# mango_saplings = {ArtisanQuality.silver: 1062, ArtisanQuality.gold: 1275, ArtisanQuality.iridium: 1700} -# orange_saplings = {ArtisanQuality.silver: 1250, ArtisanQuality.gold: 1500, ArtisanQuality.iridium: 2000} -# peach_saplings = {ArtisanQuality.basic: 1500, ArtisanQuality.silver: 1875, ArtisanQuality.gold: 2250, ArtisanQuality.iridium: 3000} -# apple_saplings = {ArtisanQuality.silver: 1250, ArtisanQuality.gold: 1500, ArtisanQuality.iridium: 2000} -# pomegranate_saplings = {ArtisanQuality.basic: 1500, ArtisanQuality.silver: 1875, ArtisanQuality.gold: 2250, ArtisanQuality.iridium: 3000} - - -def get_capitalist_item(item: BundleItem, quality: str, value: int) -> BundleItem: - amount = math.ceil(capitalist_value / value) - assert amount < 1000 - return item.as_quality(quality).as_amount(amount) - - -def get_capitalist_items(item: BundleItem, values_by_quality: Dict[str, int]) -> List[BundleItem]: - return [get_capitalist_item(item, quality, values_by_quality[quality]) for quality in values_by_quality] - - -capitalist_items = [ - *get_capitalist_items(ancient_fruit_wine, ancient_fruit_wines), - get_capitalist_item(dried_ancient_fruit, ArtisanQuality.basic, 5810), - get_capitalist_item(ancient_fruit_jelly, ArtisanQuality.basic, 1610), - get_capitalist_item(ancient_fruit, ArtisanQuality.iridium, 1210), - - *get_capitalist_items(starfruit_wine, starfruit_wines), - get_capitalist_item(dried_starfruit, ArtisanQuality.basic, 7910), - get_capitalist_item(starfruit_jelly, ArtisanQuality.basic, 2170), - *get_capitalist_items(starfruit, starfruits), - - *get_capitalist_items(rhubarb_wine, rhubarb_wines), - get_capitalist_item(dried_rhubarb, ArtisanQuality.basic, 2345), - *get_capitalist_items(melon_wine, melon_wines), - get_capitalist_item(dried_melon, ArtisanQuality.basic, 2660), - *get_capitalist_items(pineapple_wine, pineapple_wines), - - get_capitalist_item(dried_pineapple, ArtisanQuality.basic, 3185), - get_capitalist_item(dried_banana, ArtisanQuality.basic, 1610), - get_capitalist_item(strawberry_wine, ArtisanQuality.iridium, 1008), - get_capitalist_item(dried_strawberry, ArtisanQuality.basic, 1295), - - *get_capitalist_items(sweet_gem_berry, sweet_gem_berries), - get_capitalist_item(pumpkin_juice, ArtisanQuality.basic, 1008), - - get_capitalist_item(goat_cheese, ArtisanQuality.iridium, 1120), - get_capitalist_item(golden_egg, ArtisanQuality.iridium, 1200), - get_capitalist_item(dinosaur_mayo, ArtisanQuality.basic, 1120), - get_capitalist_item(truffle_oil, ArtisanQuality.basic, 1491), - get_capitalist_item(truffle, ArtisanQuality.iridium, 1250), - - get_capitalist_item(aged_lava_eel_roe, ArtisanQuality.basic, 1064), - get_capitalist_item(aged_crimsonfish_roe, ArtisanQuality.basic, 2184), - get_capitalist_item(aged_angler_roe, ArtisanQuality.basic, 1344), - get_capitalist_item(legend_roe, ArtisanQuality.basic, 2530), - get_capitalist_item(aged_legend_roe, ArtisanQuality.basic, 7084), - get_capitalist_item(aged_glacierfish_roe, ArtisanQuality.basic, 1484), - get_capitalist_item(aged_mutant_carp_roe, ArtisanQuality.basic, 1484), - - get_capitalist_item(iridium_bar, ArtisanQuality.basic, 1500), - get_capitalist_item(radioactive_bar, ArtisanQuality.basic, 4500), - get_capitalist_item(prismatic_shard, ArtisanQuality.basic, 2600), - - get_capitalist_item(mystic_syrup, ArtisanQuality.basic, 1250), - - # *get_capitalist_items(cherry_sapling, cherry_saplings), - # *get_capitalist_items(banana_sapling, banana_saplings), - # *get_capitalist_items(mango_sapling, mango_saplings), - # *get_capitalist_items(orange_sapling, orange_saplings), - # *get_capitalist_items(peach_sapling, peach_saplings), - # *get_capitalist_items(apple_sapling, apple_saplings), - # *get_capitalist_items(pomegranate_sapling, pomegranate_saplings), - - bowler_hat, - sombrero, +import math +from typing import Dict, List + +from ..bundle_items_data import * +from ....bundles.bundle_item import BundleItem +from ....strings.quality_names import ArtisanQuality + +capitalist_value = 1000000 +ancient_fruit_wines = {ArtisanQuality.basic: 2310, ArtisanQuality.silver: 2886, ArtisanQuality.gold: 3465, ArtisanQuality.iridium: 4620} +starfruit_wines = {ArtisanQuality.basic: 3150, ArtisanQuality.silver: 3936, ArtisanQuality.gold: 4725, ArtisanQuality.iridium: 6300} +rhubarb_wines = {ArtisanQuality.silver: 1155, ArtisanQuality.gold: 1386, ArtisanQuality.iridium: 1848} +melon_wines = {ArtisanQuality.basic: 1050, ArtisanQuality.silver: 1311, ArtisanQuality.gold: 1575, ArtisanQuality.iridium: 2100} +pineapple_wines = {ArtisanQuality.basic: 1260, ArtisanQuality.silver: 1575, ArtisanQuality.gold: 1890, ArtisanQuality.iridium: 2520} +starfruits = {ArtisanQuality.silver: 1030, ArtisanQuality.gold: 1237, ArtisanQuality.iridium: 1650} +sweet_gem_berries = {ArtisanQuality.basic: 3000, ArtisanQuality.silver: 3750, ArtisanQuality.gold: 4500, ArtisanQuality.iridium: 6000} + +# These are just too rude I think +# cherry_saplings = {ArtisanQuality.silver: 1062, ArtisanQuality.gold: 1275, ArtisanQuality.iridium: 1700} +# banana_saplings = {ArtisanQuality.silver: 1062, ArtisanQuality.gold: 1275, ArtisanQuality.iridium: 1700} +# mango_saplings = {ArtisanQuality.silver: 1062, ArtisanQuality.gold: 1275, ArtisanQuality.iridium: 1700} +# orange_saplings = {ArtisanQuality.silver: 1250, ArtisanQuality.gold: 1500, ArtisanQuality.iridium: 2000} +# peach_saplings = {ArtisanQuality.basic: 1500, ArtisanQuality.silver: 1875, ArtisanQuality.gold: 2250, ArtisanQuality.iridium: 3000} +# apple_saplings = {ArtisanQuality.silver: 1250, ArtisanQuality.gold: 1500, ArtisanQuality.iridium: 2000} +# pomegranate_saplings = {ArtisanQuality.basic: 1500, ArtisanQuality.silver: 1875, ArtisanQuality.gold: 2250, ArtisanQuality.iridium: 3000} + + +def get_capitalist_item(item: BundleItem, quality: str, value: int) -> BundleItem: + amount = math.ceil(capitalist_value / value) + assert amount < 1000 + return item.as_quality(quality).as_amount(amount) + + +def get_capitalist_items(item: BundleItem, values_by_quality: Dict[str, int]) -> List[BundleItem]: + return [get_capitalist_item(item, quality, values_by_quality[quality]) for quality in values_by_quality] + + +capitalist_items = [ + *get_capitalist_items(ancient_fruit_wine, ancient_fruit_wines), + get_capitalist_item(dried_ancient_fruit, ArtisanQuality.basic, 5810), + get_capitalist_item(ancient_fruit_jelly, ArtisanQuality.basic, 1610), + get_capitalist_item(ancient_fruit, ArtisanQuality.iridium, 1210), + + *get_capitalist_items(starfruit_wine, starfruit_wines), + get_capitalist_item(dried_starfruit, ArtisanQuality.basic, 7910), + get_capitalist_item(starfruit_jelly, ArtisanQuality.basic, 2170), + *get_capitalist_items(starfruit, starfruits), + + *get_capitalist_items(rhubarb_wine, rhubarb_wines), + get_capitalist_item(dried_rhubarb, ArtisanQuality.basic, 2345), + *get_capitalist_items(melon_wine, melon_wines), + get_capitalist_item(dried_melon, ArtisanQuality.basic, 2660), + *get_capitalist_items(pineapple_wine, pineapple_wines), + + get_capitalist_item(dried_pineapple, ArtisanQuality.basic, 3185), + get_capitalist_item(dried_banana, ArtisanQuality.basic, 1610), + get_capitalist_item(strawberry_wine, ArtisanQuality.iridium, 1008), + get_capitalist_item(dried_strawberry, ArtisanQuality.basic, 1295), + + *get_capitalist_items(sweet_gem_berry, sweet_gem_berries), + get_capitalist_item(pumpkin_juice, ArtisanQuality.basic, 1008), + + get_capitalist_item(goat_cheese, ArtisanQuality.iridium, 1120), + get_capitalist_item(golden_egg, ArtisanQuality.iridium, 1200), + get_capitalist_item(dinosaur_mayo, ArtisanQuality.basic, 1120), + get_capitalist_item(truffle_oil, ArtisanQuality.basic, 1491), + get_capitalist_item(truffle, ArtisanQuality.iridium, 1250), + + get_capitalist_item(aged_lava_eel_roe, ArtisanQuality.basic, 1064), + get_capitalist_item(aged_crimsonfish_roe, ArtisanQuality.basic, 2184), + get_capitalist_item(aged_angler_roe, ArtisanQuality.basic, 1344), + get_capitalist_item(legend_roe, ArtisanQuality.basic, 2530), + get_capitalist_item(aged_legend_roe, ArtisanQuality.basic, 7084), + get_capitalist_item(aged_glacierfish_roe, ArtisanQuality.basic, 1484), + get_capitalist_item(aged_mutant_carp_roe, ArtisanQuality.basic, 1484), + + get_capitalist_item(iridium_bar, ArtisanQuality.basic, 1500), + get_capitalist_item(radioactive_bar, ArtisanQuality.basic, 4500), + get_capitalist_item(prismatic_shard, ArtisanQuality.basic, 2600), + + get_capitalist_item(mystic_syrup, ArtisanQuality.basic, 1250), + + # *get_capitalist_items(cherry_sapling, cherry_saplings), + # *get_capitalist_items(banana_sapling, banana_saplings), + # *get_capitalist_items(mango_sapling, mango_saplings), + # *get_capitalist_items(orange_sapling, orange_saplings), + # *get_capitalist_items(peach_sapling, peach_saplings), + # *get_capitalist_items(apple_sapling, apple_saplings), + # *get_capitalist_items(pomegranate_sapling, pomegranate_saplings), + + bowler_hat, + sombrero, ] \ No newline at end of file diff --git a/worlds/stardew_valley/data/bundles_data/remixed_anywhere_bundles.py b/worlds/stardew_valley/data/bundles_data/remixed_anywhere_bundles.py index 56504f146e9e..8e4f00fbdb3a 100644 --- a/worlds/stardew_valley/data/bundles_data/remixed_anywhere_bundles.py +++ b/worlds/stardew_valley/data/bundles_data/remixed_anywhere_bundles.py @@ -1,5 +1,5 @@ -from .remixed_bundles import * - -all_cc_remixed_bundles = [*crafts_room_bundles_remixed, *pantry_bundles_remixed, *fish_tank_bundles_remixed, - *boiler_room_bundles_remixed, *bulletin_board_bundles_remixed, *vault_bundles_remixed] -community_center_remixed_anywhere = BundleRoomTemplate("Community Center", all_cc_remixed_bundles, 30) +from .remixed_bundles import * + +all_cc_remixed_bundles = [*crafts_room_bundles_remixed, *pantry_bundles_remixed, *fish_tank_bundles_remixed, + *boiler_room_bundles_remixed, *bulletin_board_bundles_remixed, *vault_bundles_remixed] +community_center_remixed_anywhere = BundleRoomTemplate("Community Center", all_cc_remixed_bundles, 30) diff --git a/worlds/stardew_valley/data/bundles_data/remixed_bundles.py b/worlds/stardew_valley/data/bundles_data/remixed_bundles.py index a4098be4c591..0492cf9e6139 100644 --- a/worlds/stardew_valley/data/bundles_data/remixed_bundles.py +++ b/worlds/stardew_valley/data/bundles_data/remixed_bundles.py @@ -1,245 +1,245 @@ -from .thematic_bundles import * -from ...bundles.bundle import IslandBundleTemplate, FestivalBundleTemplate, CurrencyBundleTemplate -from ...bundles.bundle_room import BundleRoomTemplate -from ...content import content_packs -from ...strings.bundle_names import CCRoom - -# Giant Stump -from ...strings.quality_names import ForageQuality, FishQuality - -giant_stump_bundles_remixed = giant_stump_bundles_thematic -giant_stump_remixed = BundleRoomTemplate(CCRoom.raccoon_requests, giant_stump_bundles_remixed, 8) - -# Crafts Room - -beach_foraging_items = [nautilus_shell, coral, sea_urchin, rainbow_shell, clam, cockle, mussel, oyster, seaweed] -beach_foraging_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.beach_foraging, beach_foraging_items, 4, 4) - -mines_foraging_items = [quartz, earth_crystal, frozen_tear, fire_quartz, red_mushroom, purple_mushroom, cave_carrot] -mines_foraging_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.mines_foraging, mines_foraging_items, 4, 4) - -desert_foraging_items = [cactus_fruit.as_quality(ForageQuality.gold), cactus_fruit.as_amount(5), coconut.as_quality(ForageQuality.gold), coconut.as_amount(5)] -desert_foraging_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.desert_foraging, desert_foraging_items, 2, 2) - -island_foraging_items = [ginger.as_amount(5), magma_cap.as_quality(ForageQuality.gold), magma_cap.as_amount(5), - fiddlehead_fern.as_quality(ForageQuality.gold), fiddlehead_fern.as_amount(5)] -island_foraging_bundle = IslandBundleTemplate(CCRoom.crafts_room, BundleName.island_foraging, island_foraging_items, 2, 2) - -sticky_items = [sap.as_amount(500), sap.as_amount(500)] -sticky_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.sticky, sticky_items, 1, 1) - -forest_items = [moss.as_amount(10), fiber.as_amount(200), acorn.as_amount(10), maple_seed.as_amount(10), pine_cone.as_amount(10), mahogany_seed, - mushroom_tree_seed, mossy_seed.as_amount(5), mystic_tree_seed] -forest_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.forest, forest_items, 4, 2) - -wild_medicine_items = [item.as_amount(5) for item in [purple_mushroom, fiddlehead_fern, white_algae, hops, blackberry, dandelion]] -wild_medicine_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.wild_medicine, wild_medicine_items, 4, 3) - -quality_foraging_items = sorted({item.as_quality(ForageQuality.gold).as_amount(3) - for item in - [*spring_foraging_items_thematic, *summer_foraging_items_thematic, *fall_foraging_items_thematic, - *winter_foraging_items_thematic, *beach_foraging_items, *desert_foraging_items, magma_cap] if item.can_have_quality}) -quality_foraging_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.quality_foraging, quality_foraging_items, 4, 3) - -green_rain_items = [moss.as_amount(200), fiber.as_amount(200), mossy_seed.as_amount(20), fiddlehead_fern.as_amount(10)] -green_rain_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.green_rain, green_rain_items, 4, 3) - -totems_items = [warp_totem_beach.as_amount(5), warp_totem_mountains.as_amount(5), warp_totem_farm.as_amount(5), warp_totem_desert.as_amount(5), - warp_totem_island.as_amount(5), rain_totem.as_amount(5), treasure_totem.as_amount(5)] -totems_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.totems, totems_items, 4, 3) - -crafts_room_bundles_remixed = [*crafts_room_bundles_thematic, beach_foraging_bundle, mines_foraging_bundle, desert_foraging_bundle, - island_foraging_bundle, sticky_bundle, forest_bundle, wild_medicine_bundle, quality_foraging_bundle, green_rain_bundle] -crafts_room_remixed = BundleRoomTemplate(CCRoom.crafts_room, crafts_room_bundles_remixed, 6) - -# Pantry - -rare_crops_items = [ancient_fruit, sweet_gem_berry] -rare_crops_bundle = BundleTemplate(CCRoom.pantry, BundleName.rare_crops, rare_crops_items, 2, 2) - -# all_specific_roes = [BundleItem(AnimalProduct.roe, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fish] -fish_farmer_items = [roe.as_amount(15), aged_roe.as_amount(5), squid_ink, caviar.as_amount(5)] -fish_farmer_bundle = BundleTemplate(CCRoom.pantry, BundleName.fish_farmer, fish_farmer_items, 3, 2) - -garden_items = [tulip, blue_jazz, summer_spangle, sunflower, fairy_rose, poppy, bouquet] -garden_bundle = BundleTemplate(CCRoom.pantry, BundleName.garden, garden_items, 5, 4) - -brewer_items = [mead, pale_ale, wine, juice, green_tea, beer] -brewer_bundle = BundleTemplate(CCRoom.pantry, BundleName.brewer, brewer_items, 5, 4) - -orchard_items = [apple, apricot, orange, peach, pomegranate, cherry, banana, mango] -orchard_bundle = BundleTemplate(CCRoom.pantry, BundleName.orchard, orchard_items, 6, 4) - -island_crops_items = [pineapple, taro_root, banana, mango] -island_crops_bundle = IslandBundleTemplate(CCRoom.pantry, BundleName.island_crops, island_crops_items, 3, 3) - -agronomist_items = [basic_fertilizer, quality_fertilizer, deluxe_fertilizer, - basic_retaining_soil, quality_retaining_soil, deluxe_retaining_soil, - speed_gro, deluxe_speed_gro, hyper_speed_gro, tree_fertilizer] -agronomist_bundle = BundleTemplate(CCRoom.pantry, BundleName.agronomist, agronomist_items, 4, 3) - -slime_farmer_items = [slime.as_amount(99), petrified_slime.as_amount(10), blue_slime_egg, red_slime_egg, - purple_slime_egg, green_slime_egg, tiger_slime_egg] -slime_farmer_bundle = BundleTemplate(CCRoom.pantry, BundleName.slime_farmer, slime_farmer_items, 4, 3) - -sommelier_items = [BundleItem(ArtisanGood.wine, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fruits] -sommelier_bundle = BundleTemplate(CCRoom.pantry, BundleName.sommelier, sommelier_items, 6, 3) - -dry_items = [*[BundleItem(ArtisanGood.dried_fruit, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fruits], - *[BundleItem(ArtisanGood.dried_mushroom, flavor=mushroom, source=BundleItem.Sources.content) for mushroom in all_edible_mushrooms], - BundleItem(ArtisanGood.raisins, source=BundleItem.Sources.content)] -dry_bundle = BundleTemplate(CCRoom.pantry, BundleName.dry, dry_items, 6, 3) - -pantry_bundles_remixed = [*pantry_bundles_thematic, rare_crops_bundle, fish_farmer_bundle, garden_bundle, - brewer_bundle, orchard_bundle, island_crops_bundle, agronomist_bundle, slime_farmer_bundle, sommelier_bundle, dry_bundle] -pantry_remixed = BundleRoomTemplate(CCRoom.pantry, pantry_bundles_remixed, 6) - -# Fish Tank -trash_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.trash, crab_pot_trash_items, 4, 4) - -spring_fish_items = [herring, halibut, shad, flounder, sunfish, sardine, catfish, anchovy, smallmouth_bass, eel, legend] -spring_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.spring_fish, spring_fish_items, 4, 4) - -summer_fish_items = [tuna, pike, red_mullet, sturgeon, red_snapper, super_cucumber, tilapia, pufferfish, rainbow_trout, - octopus, dorado, halibut, shad, flounder, sunfish, crimsonfish] -summer_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.summer_fish, summer_fish_items, 4, 4) - -fall_fish_items = [red_snapper, super_cucumber, tilapia, shad, sardine, catfish, anchovy, smallmouth_bass, eel, midnight_carp, - walleye, sea_cucumber, tiger_trout, albacore, salmon, angler] -fall_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.fall_fish, fall_fish_items, 4, 4) - -winter_fish_items = [perch, squid, lingcod, tuna, pike, red_mullet, sturgeon, red_snapper, herring, halibut, sardine, - midnight_carp, sea_cucumber, tiger_trout, albacore, glacierfish] -winter_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.winter_fish, winter_fish_items, 4, 4) - -rain_fish_items = [red_snapper, shad, catfish, eel, walleye] -rain_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.rain_fish, rain_fish_items, 3, 3) - -quality_fish_items = sorted({ - item.as_quality(FishQuality.gold).as_amount(2) - for item in [*river_fish_items_thematic, *lake_fish_items_thematic, *ocean_fish_items_thematic] -}) -quality_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.quality_fish, quality_fish_items, 4, 3) - -master_fisher_items = [lava_eel, scorpion_carp, octopus, blobfish, lingcod, ice_pip, super_cucumber, stingray, void_salmon, pufferfish] -master_fisher_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.master_fisher, master_fisher_items, 4, 2) - -legendary_fish_items = [angler, legend, mutant_carp, crimsonfish, glacierfish] -legendary_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.legendary_fish, legendary_fish_items, 4, 2) - -island_fish_items = [lionfish, blue_discus, stingray] -island_fish_bundle = IslandBundleTemplate(CCRoom.fish_tank, BundleName.island_fish, island_fish_items, 3, 3) - -tackle_items = [spinner, dressed_spinner, trap_bobber, sonar_bobber, cork_bobber, lead_bobber, treasure_hunter, barbed_hook, curiosity_lure, quality_bobber] -tackle_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.tackle, tackle_items, 3, 2) - -bait_items = [bait, magnet, wild_bait, magic_bait, challenge_bait, deluxe_bait, targeted_bait] -bait_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.bait, bait_items, 3, 2) - -# This bundle could change based on content packs, once the fish are properly in it. Until then, I'm not sure how, so pelican town only -specific_bait_items = [BundleItem(ArtisanGood.targeted_bait, flavor=fish.name).as_amount(10) for fish in content_packs.pelican_town.fishes] -specific_bait_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.specific_bait, specific_bait_items, 6, 3) - -deep_fishing_items = [blobfish, spook_fish, midnight_squid, sea_cucumber, super_cucumber, octopus, pearl, seaweed] -deep_fishing_bundle = FestivalBundleTemplate(CCRoom.fish_tank, BundleName.deep_fishing, deep_fishing_items, 4, 3) - -smokeable_fish = [Fish.largemouth_bass, Fish.bream, Fish.bullhead, Fish.chub, Fish.ghostfish, Fish.flounder, Fish.shad, Fish.rainbow_trout, Fish.tilapia, - Fish.red_mullet, Fish.tuna, Fish.midnight_carp, Fish.salmon, Fish.perch] -fish_smoker_items = [BundleItem(ArtisanGood.smoked_fish, flavor=fish) for fish in smokeable_fish] -fish_smoker_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.fish_smoker, fish_smoker_items, 6, 3) - -fish_tank_bundles_remixed = [*fish_tank_bundles_thematic, spring_fish_bundle, summer_fish_bundle, - fall_fish_bundle, winter_fish_bundle, trash_bundle, rain_fish_bundle, - quality_fish_bundle, master_fisher_bundle, legendary_fish_bundle, - tackle_bundle, bait_bundle, specific_bait_bundle, deep_fishing_bundle, - fish_smoker_bundle] - -# In Remixed, the trash items are in the recycling bundle, so we don't use the thematic version of the crab pot bundle that added trash items to it -fish_tank_bundles_remixed.remove(crab_pot_bundle_thematic) -fish_tank_bundles_remixed.append(crab_pot_bundle_vanilla) - -fish_tank_remixed = BundleRoomTemplate(CCRoom.fish_tank, fish_tank_bundles_remixed, 6) - -# Boiler Room - -# Where to put radioactive bar? -treasure_hunter_items = [emerald, aquamarine, ruby, amethyst, topaz, jade, diamond] -treasure_hunter_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.treasure_hunter, treasure_hunter_items, 6, 5) - -engineer_items = [iridium_ore.as_amount(5), battery_pack, refined_quartz.as_amount(5), diamond] -engineer_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.engineer, engineer_items, 3, 3) - -demolition_items = [cherry_bomb, bomb, mega_bomb, explosive_ammo] -demolition_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.demolition, demolition_items, 3, 3) - -recycling_items = [stone, coal, iron_ore, wood, cloth, refined_quartz] -recycling_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.recycling, recycling_items, 4, 4) - -archaeologist_items = [golden_mask, golden_relic, ancient_drum, dwarf_gadget, dwarvish_helm, prehistoric_handaxe, bone_flute, anchor, prehistoric_tool, - chicken_statue, rusty_cog, rusty_spur, rusty_spoon, ancient_sword, ornamental_fan, elvish_jewelry, ancient_doll, chipped_amphora] -archaeologist_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.archaeologist, archaeologist_items, 6, 3) - -paleontologist_items = [prehistoric_scapula, prehistoric_tibia, prehistoric_skull, skeletal_hand, prehistoric_rib, prehistoric_vertebra, skeletal_tail, - nautilus_fossil, amphibian_fossil, palm_fossil, trilobite] -paleontologist_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.paleontologist, paleontologist_items, 6, 3) - -boiler_room_bundles_remixed = [*boiler_room_bundles_thematic, treasure_hunter_bundle, engineer_bundle, - demolition_bundle, recycling_bundle, archaeologist_bundle, paleontologist_bundle] -boiler_room_remixed = BundleRoomTemplate(CCRoom.boiler_room, boiler_room_bundles_remixed, 3) - -# Bulletin Board -children_items = [salmonberry.as_amount(10), cookie, ancient_doll, ice_cream, cranberry_candy, ginger_ale, - grape.as_amount(10), pink_cake, snail, fairy_rose, plum_pudding] -children_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.children, children_items, 4, 3) - -forager_items = [salmonberry.as_amount(50), blackberry.as_amount(50), wild_plum.as_amount(20), snow_yam.as_amount(20), - common_mushroom.as_amount(20), grape.as_amount(20), spring_onion.as_amount(20)] -forager_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.forager, forager_items, 3, 2) - -home_cook_items = [egg.as_amount(10), milk.as_amount(10), wheat_flour.as_amount(100), sugar.as_amount(100), vinegar.as_amount(100), - chocolate_cake, pancakes, rhubarb_pie] -home_cook_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.home_cook, home_cook_items, 3, 3) - -helper_items = [prize_ticket, mystery_box.as_amount(5), gold_mystery_box] -helper_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.helper, helper_items, 2, 2) - -spirit_eve_items = [jack_o_lantern, corn.as_amount(10), bat_wing.as_amount(10)] -spirit_eve_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.spirit_eve, spirit_eve_items, 3, 3) - -winter_star_items = [holly.as_amount(5), plum_pudding, stuffing, powdermelon.as_amount(5)] -winter_star_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.winter_star, winter_star_items, 2, 2) - -bartender_items = [shrimp_cocktail, triple_shot_espresso, ginger_ale, cranberry_candy, beer, pale_ale, pina_colada] -bartender_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.bartender, bartender_items, 3, 3) - -calico_items = [calico_egg.as_amount(200), calico_egg.as_amount(200), calico_egg.as_amount(200), calico_egg.as_amount(200), - magic_rock_candy, mega_bomb.as_amount(10), mystery_box.as_amount(10), mixed_seeds.as_amount(50), - strawberry_seeds.as_amount(20), - spicy_eel.as_amount(5), crab_cakes.as_amount(5), eggplant_parmesan.as_amount(5), - pumpkin_soup.as_amount(5), lucky_lunch.as_amount(5) ] -calico_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.calico, calico_items, 2, 2) - -raccoon_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.raccoon, raccoon_foraging_items, 4, 4) - -bulletin_board_bundles_remixed = [*bulletin_board_bundles_thematic, children_bundle, forager_bundle, home_cook_bundle, - helper_bundle, spirit_eve_bundle, winter_star_bundle, bartender_bundle, calico_bundle, raccoon_bundle] -bulletin_board_remixed = BundleRoomTemplate(CCRoom.bulletin_board, bulletin_board_bundles_remixed, 5) - -# Abandoned Joja Mart -abandoned_joja_mart_remixed = abandoned_joja_mart_thematic - -# Vault -vault_gambler_items = BundleItem(Currency.qi_coin, 10000) -vault_gambler_bundle = CurrencyBundleTemplate(CCRoom.vault, BundleName.gambler, vault_gambler_items) - -vault_carnival_items = BundleItem(Currency.star_token, 2500, source=BundleItem.Sources.festival) -vault_carnival_bundle = CurrencyBundleTemplate(CCRoom.vault, BundleName.carnival, vault_carnival_items) - -vault_walnut_hunter_items = BundleItem(Currency.golden_walnut, 25) -vault_walnut_hunter_bundle = CurrencyBundleTemplate(CCRoom.vault, BundleName.walnut_hunter, vault_walnut_hunter_items) - -vault_qi_helper_items = BundleItem(Currency.qi_gem, 25, source=BundleItem.Sources.island) -vault_qi_helper_bundle = CurrencyBundleTemplate(CCRoom.vault, BundleName.qi_helper, vault_qi_helper_items) - -vault_bundles_remixed = [*vault_bundles_vanilla, vault_gambler_bundle, vault_qi_helper_bundle, vault_carnival_bundle] # , vault_walnut_hunter_bundle -vault_remixed = BundleRoomTemplate(CCRoom.vault, vault_bundles_remixed, 4) +from .thematic_bundles import * +from ...bundles.bundle import IslandBundleTemplate, FestivalBundleTemplate, CurrencyBundleTemplate +from ...bundles.bundle_room import BundleRoomTemplate +from ...content import content_packs +from ...strings.bundle_names import CCRoom + +# Giant Stump +from ...strings.quality_names import ForageQuality, FishQuality + +giant_stump_bundles_remixed = giant_stump_bundles_thematic +giant_stump_remixed = BundleRoomTemplate(CCRoom.raccoon_requests, giant_stump_bundles_remixed, 8) + +# Crafts Room + +beach_foraging_items = [nautilus_shell, coral, sea_urchin, rainbow_shell, clam, cockle, mussel, oyster, seaweed] +beach_foraging_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.beach_foraging, beach_foraging_items, 4, 4) + +mines_foraging_items = [quartz, earth_crystal, frozen_tear, fire_quartz, red_mushroom, purple_mushroom, cave_carrot] +mines_foraging_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.mines_foraging, mines_foraging_items, 4, 4) + +desert_foraging_items = [cactus_fruit.as_quality(ForageQuality.gold), cactus_fruit.as_amount(5), coconut.as_quality(ForageQuality.gold), coconut.as_amount(5)] +desert_foraging_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.desert_foraging, desert_foraging_items, 2, 2) + +island_foraging_items = [ginger.as_amount(5), magma_cap.as_quality(ForageQuality.gold), magma_cap.as_amount(5), + fiddlehead_fern.as_quality(ForageQuality.gold), fiddlehead_fern.as_amount(5)] +island_foraging_bundle = IslandBundleTemplate(CCRoom.crafts_room, BundleName.island_foraging, island_foraging_items, 2, 2) + +sticky_items = [sap.as_amount(500), sap.as_amount(500)] +sticky_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.sticky, sticky_items, 1, 1) + +forest_items = [moss.as_amount(10), fiber.as_amount(200), acorn.as_amount(10), maple_seed.as_amount(10), pine_cone.as_amount(10), mahogany_seed, + mushroom_tree_seed, mossy_seed.as_amount(5), mystic_tree_seed] +forest_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.forest, forest_items, 4, 2) + +wild_medicine_items = [item.as_amount(5) for item in [purple_mushroom, fiddlehead_fern, white_algae, hops, blackberry, dandelion]] +wild_medicine_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.wild_medicine, wild_medicine_items, 4, 3) + +quality_foraging_items = sorted({item.as_quality(ForageQuality.gold).as_amount(3) + for item in + [*spring_foraging_items_thematic, *summer_foraging_items_thematic, *fall_foraging_items_thematic, + *winter_foraging_items_thematic, *beach_foraging_items, *desert_foraging_items, magma_cap] if item.can_have_quality}) +quality_foraging_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.quality_foraging, quality_foraging_items, 4, 3) + +green_rain_items = [moss.as_amount(200), fiber.as_amount(200), mossy_seed.as_amount(20), fiddlehead_fern.as_amount(10)] +green_rain_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.green_rain, green_rain_items, 4, 3) + +totems_items = [warp_totem_beach.as_amount(5), warp_totem_mountains.as_amount(5), warp_totem_farm.as_amount(5), warp_totem_desert.as_amount(5), + warp_totem_island.as_amount(5), rain_totem.as_amount(5), treasure_totem.as_amount(5)] +totems_bundle = BundleTemplate(CCRoom.crafts_room, BundleName.totems, totems_items, 4, 3) + +crafts_room_bundles_remixed = [*crafts_room_bundles_thematic, beach_foraging_bundle, mines_foraging_bundle, desert_foraging_bundle, + island_foraging_bundle, sticky_bundle, forest_bundle, wild_medicine_bundle, quality_foraging_bundle, green_rain_bundle] +crafts_room_remixed = BundleRoomTemplate(CCRoom.crafts_room, crafts_room_bundles_remixed, 6) + +# Pantry + +rare_crops_items = [ancient_fruit, sweet_gem_berry] +rare_crops_bundle = BundleTemplate(CCRoom.pantry, BundleName.rare_crops, rare_crops_items, 2, 2) + +# all_specific_roes = [BundleItem(AnimalProduct.roe, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fish] +fish_farmer_items = [roe.as_amount(15), aged_roe.as_amount(5), squid_ink, caviar.as_amount(5)] +fish_farmer_bundle = BundleTemplate(CCRoom.pantry, BundleName.fish_farmer, fish_farmer_items, 3, 2) + +garden_items = [tulip, blue_jazz, summer_spangle, sunflower, fairy_rose, poppy, bouquet] +garden_bundle = BundleTemplate(CCRoom.pantry, BundleName.garden, garden_items, 5, 4) + +brewer_items = [mead, pale_ale, wine, juice, green_tea, beer] +brewer_bundle = BundleTemplate(CCRoom.pantry, BundleName.brewer, brewer_items, 5, 4) + +orchard_items = [apple, apricot, orange, peach, pomegranate, cherry, banana, mango] +orchard_bundle = BundleTemplate(CCRoom.pantry, BundleName.orchard, orchard_items, 6, 4) + +island_crops_items = [pineapple, taro_root, banana, mango] +island_crops_bundle = IslandBundleTemplate(CCRoom.pantry, BundleName.island_crops, island_crops_items, 3, 3) + +agronomist_items = [basic_fertilizer, quality_fertilizer, deluxe_fertilizer, + basic_retaining_soil, quality_retaining_soil, deluxe_retaining_soil, + speed_gro, deluxe_speed_gro, hyper_speed_gro, tree_fertilizer] +agronomist_bundle = BundleTemplate(CCRoom.pantry, BundleName.agronomist, agronomist_items, 4, 3) + +slime_farmer_items = [slime.as_amount(99), petrified_slime.as_amount(10), blue_slime_egg, red_slime_egg, + purple_slime_egg, green_slime_egg, tiger_slime_egg] +slime_farmer_bundle = BundleTemplate(CCRoom.pantry, BundleName.slime_farmer, slime_farmer_items, 4, 3) + +sommelier_items = [BundleItem(ArtisanGood.wine, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fruits] +sommelier_bundle = BundleTemplate(CCRoom.pantry, BundleName.sommelier, sommelier_items, 6, 3) + +dry_items = [*[BundleItem(ArtisanGood.dried_fruit, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fruits], + *[BundleItem(ArtisanGood.dried_mushroom, flavor=mushroom, source=BundleItem.Sources.content) for mushroom in all_edible_mushrooms], + BundleItem(ArtisanGood.raisins, source=BundleItem.Sources.content)] +dry_bundle = BundleTemplate(CCRoom.pantry, BundleName.dry, dry_items, 6, 3) + +pantry_bundles_remixed = [*pantry_bundles_thematic, rare_crops_bundle, fish_farmer_bundle, garden_bundle, + brewer_bundle, orchard_bundle, island_crops_bundle, agronomist_bundle, slime_farmer_bundle, sommelier_bundle, dry_bundle] +pantry_remixed = BundleRoomTemplate(CCRoom.pantry, pantry_bundles_remixed, 6) + +# Fish Tank +trash_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.trash, crab_pot_trash_items, 4, 4) + +spring_fish_items = [herring, halibut, shad, flounder, sunfish, sardine, catfish, anchovy, smallmouth_bass, eel, legend] +spring_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.spring_fish, spring_fish_items, 4, 4) + +summer_fish_items = [tuna, pike, red_mullet, sturgeon, red_snapper, super_cucumber, tilapia, pufferfish, rainbow_trout, + octopus, dorado, halibut, shad, flounder, sunfish, crimsonfish] +summer_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.summer_fish, summer_fish_items, 4, 4) + +fall_fish_items = [red_snapper, super_cucumber, tilapia, shad, sardine, catfish, anchovy, smallmouth_bass, eel, midnight_carp, + walleye, sea_cucumber, tiger_trout, albacore, salmon, angler] +fall_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.fall_fish, fall_fish_items, 4, 4) + +winter_fish_items = [perch, squid, lingcod, tuna, pike, red_mullet, sturgeon, red_snapper, herring, halibut, sardine, + midnight_carp, sea_cucumber, tiger_trout, albacore, glacierfish] +winter_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.winter_fish, winter_fish_items, 4, 4) + +rain_fish_items = [red_snapper, shad, catfish, eel, walleye] +rain_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.rain_fish, rain_fish_items, 3, 3) + +quality_fish_items = sorted({ + item.as_quality(FishQuality.gold).as_amount(2) + for item in [*river_fish_items_thematic, *lake_fish_items_thematic, *ocean_fish_items_thematic] +}) +quality_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.quality_fish, quality_fish_items, 4, 3) + +master_fisher_items = [lava_eel, scorpion_carp, octopus, blobfish, lingcod, ice_pip, super_cucumber, stingray, void_salmon, pufferfish] +master_fisher_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.master_fisher, master_fisher_items, 4, 2) + +legendary_fish_items = [angler, legend, mutant_carp, crimsonfish, glacierfish] +legendary_fish_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.legendary_fish, legendary_fish_items, 4, 2) + +island_fish_items = [lionfish, blue_discus, stingray] +island_fish_bundle = IslandBundleTemplate(CCRoom.fish_tank, BundleName.island_fish, island_fish_items, 3, 3) + +tackle_items = [spinner, dressed_spinner, trap_bobber, sonar_bobber, cork_bobber, lead_bobber, treasure_hunter, barbed_hook, curiosity_lure, quality_bobber] +tackle_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.tackle, tackle_items, 3, 2) + +bait_items = [bait, magnet, wild_bait, magic_bait, challenge_bait, deluxe_bait, targeted_bait] +bait_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.bait, bait_items, 3, 2) + +# This bundle could change based on content packs, once the fish are properly in it. Until then, I'm not sure how, so pelican town only +specific_bait_items = [BundleItem(ArtisanGood.targeted_bait, flavor=fish.name).as_amount(10) for fish in content_packs.pelican_town.fishes] +specific_bait_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.specific_bait, specific_bait_items, 6, 3) + +deep_fishing_items = [blobfish, spook_fish, midnight_squid, sea_cucumber, super_cucumber, octopus, pearl, seaweed] +deep_fishing_bundle = FestivalBundleTemplate(CCRoom.fish_tank, BundleName.deep_fishing, deep_fishing_items, 4, 3) + +smokeable_fish = [Fish.largemouth_bass, Fish.bream, Fish.bullhead, Fish.chub, Fish.ghostfish, Fish.flounder, Fish.shad, Fish.rainbow_trout, Fish.tilapia, + Fish.red_mullet, Fish.tuna, Fish.midnight_carp, Fish.salmon, Fish.perch] +fish_smoker_items = [BundleItem(ArtisanGood.smoked_fish, flavor=fish) for fish in smokeable_fish] +fish_smoker_bundle = BundleTemplate(CCRoom.fish_tank, BundleName.fish_smoker, fish_smoker_items, 6, 3) + +fish_tank_bundles_remixed = [*fish_tank_bundles_thematic, spring_fish_bundle, summer_fish_bundle, + fall_fish_bundle, winter_fish_bundle, trash_bundle, rain_fish_bundle, + quality_fish_bundle, master_fisher_bundle, legendary_fish_bundle, + tackle_bundle, bait_bundle, specific_bait_bundle, deep_fishing_bundle, + fish_smoker_bundle] + +# In Remixed, the trash items are in the recycling bundle, so we don't use the thematic version of the crab pot bundle that added trash items to it +fish_tank_bundles_remixed.remove(crab_pot_bundle_thematic) +fish_tank_bundles_remixed.append(crab_pot_bundle_vanilla) + +fish_tank_remixed = BundleRoomTemplate(CCRoom.fish_tank, fish_tank_bundles_remixed, 6) + +# Boiler Room + +# Where to put radioactive bar? +treasure_hunter_items = [emerald, aquamarine, ruby, amethyst, topaz, jade, diamond] +treasure_hunter_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.treasure_hunter, treasure_hunter_items, 6, 5) + +engineer_items = [iridium_ore.as_amount(5), battery_pack, refined_quartz.as_amount(5), diamond] +engineer_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.engineer, engineer_items, 3, 3) + +demolition_items = [cherry_bomb, bomb, mega_bomb, explosive_ammo] +demolition_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.demolition, demolition_items, 3, 3) + +recycling_items = [stone, coal, iron_ore, wood, cloth, refined_quartz] +recycling_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.recycling, recycling_items, 4, 4) + +archaeologist_items = [golden_mask, golden_relic, ancient_drum, dwarf_gadget, dwarvish_helm, prehistoric_handaxe, bone_flute, anchor, prehistoric_tool, + chicken_statue, rusty_cog, rusty_spur, rusty_spoon, ancient_sword, ornamental_fan, elvish_jewelry, ancient_doll, chipped_amphora] +archaeologist_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.archaeologist, archaeologist_items, 6, 3) + +paleontologist_items = [prehistoric_scapula, prehistoric_tibia, prehistoric_skull, skeletal_hand, prehistoric_rib, prehistoric_vertebra, skeletal_tail, + nautilus_fossil, amphibian_fossil, palm_fossil, trilobite] +paleontologist_bundle = BundleTemplate(CCRoom.boiler_room, BundleName.paleontologist, paleontologist_items, 6, 3) + +boiler_room_bundles_remixed = [*boiler_room_bundles_thematic, treasure_hunter_bundle, engineer_bundle, + demolition_bundle, recycling_bundle, archaeologist_bundle, paleontologist_bundle] +boiler_room_remixed = BundleRoomTemplate(CCRoom.boiler_room, boiler_room_bundles_remixed, 3) + +# Bulletin Board +children_items = [salmonberry.as_amount(10), cookie, ancient_doll, ice_cream, cranberry_candy, ginger_ale, + grape.as_amount(10), pink_cake, snail, fairy_rose, plum_pudding] +children_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.children, children_items, 4, 3) + +forager_items = [salmonberry.as_amount(50), blackberry.as_amount(50), wild_plum.as_amount(20), snow_yam.as_amount(20), + common_mushroom.as_amount(20), grape.as_amount(20), spring_onion.as_amount(20)] +forager_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.forager, forager_items, 3, 2) + +home_cook_items = [egg.as_amount(10), milk.as_amount(10), wheat_flour.as_amount(100), sugar.as_amount(100), vinegar.as_amount(100), + chocolate_cake, pancakes, rhubarb_pie] +home_cook_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.home_cook, home_cook_items, 3, 3) + +helper_items = [prize_ticket, mystery_box.as_amount(5), gold_mystery_box] +helper_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.helper, helper_items, 2, 2) + +spirit_eve_items = [jack_o_lantern, corn.as_amount(10), bat_wing.as_amount(10)] +spirit_eve_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.spirit_eve, spirit_eve_items, 3, 3) + +winter_star_items = [holly.as_amount(5), plum_pudding, stuffing, powdermelon.as_amount(5)] +winter_star_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.winter_star, winter_star_items, 2, 2) + +bartender_items = [shrimp_cocktail, triple_shot_espresso, ginger_ale, cranberry_candy, beer, pale_ale, pina_colada] +bartender_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.bartender, bartender_items, 3, 3) + +calico_items = [calico_egg.as_amount(200), calico_egg.as_amount(200), calico_egg.as_amount(200), calico_egg.as_amount(200), + magic_rock_candy, mega_bomb.as_amount(10), mystery_box.as_amount(10), mixed_seeds.as_amount(50), + strawberry_seeds.as_amount(20), + spicy_eel.as_amount(5), crab_cakes.as_amount(5), eggplant_parmesan.as_amount(5), + pumpkin_soup.as_amount(5), lucky_lunch.as_amount(5) ] +calico_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.calico, calico_items, 2, 2) + +raccoon_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.raccoon, raccoon_foraging_items, 4, 4) + +bulletin_board_bundles_remixed = [*bulletin_board_bundles_thematic, children_bundle, forager_bundle, home_cook_bundle, + helper_bundle, spirit_eve_bundle, winter_star_bundle, bartender_bundle, calico_bundle, raccoon_bundle] +bulletin_board_remixed = BundleRoomTemplate(CCRoom.bulletin_board, bulletin_board_bundles_remixed, 5) + +# Abandoned Joja Mart +abandoned_joja_mart_remixed = abandoned_joja_mart_thematic + +# Vault +vault_gambler_items = BundleItem(Currency.qi_coin, 10000) +vault_gambler_bundle = CurrencyBundleTemplate(CCRoom.vault, BundleName.gambler, vault_gambler_items) + +vault_carnival_items = BundleItem(Currency.star_token, 2500, source=BundleItem.Sources.festival) +vault_carnival_bundle = CurrencyBundleTemplate(CCRoom.vault, BundleName.carnival, vault_carnival_items) + +vault_walnut_hunter_items = BundleItem(Currency.golden_walnut, 25) +vault_walnut_hunter_bundle = CurrencyBundleTemplate(CCRoom.vault, BundleName.walnut_hunter, vault_walnut_hunter_items) + +vault_qi_helper_items = BundleItem(Currency.qi_gem, 25, source=BundleItem.Sources.island) +vault_qi_helper_bundle = CurrencyBundleTemplate(CCRoom.vault, BundleName.qi_helper, vault_qi_helper_items) + +vault_bundles_remixed = [*vault_bundles_vanilla, vault_gambler_bundle, vault_qi_helper_bundle, vault_carnival_bundle] # , vault_walnut_hunter_bundle +vault_remixed = BundleRoomTemplate(CCRoom.vault, vault_bundles_remixed, 4) diff --git a/worlds/stardew_valley/data/bundles_data/thematic_bundles.py b/worlds/stardew_valley/data/bundles_data/thematic_bundles.py index 14988835333f..39c81d968e78 100644 --- a/worlds/stardew_valley/data/bundles_data/thematic_bundles.py +++ b/worlds/stardew_valley/data/bundles_data/thematic_bundles.py @@ -1,158 +1,158 @@ -from .vanilla_bundles import * -from ...bundles.bundle import BundleTemplate -from ...bundles.bundle_room import BundleRoomTemplate -from ...strings.bundle_names import CCRoom, BundleName - -# Giant Stump -from ...strings.quality_names import ArtisanQuality, FishQuality - -raccoon_fish_items_flat = [*raccoon_crab_pot_fish_items, *raccoon_smoked_fish_items] -raccoon_fish_bundle_thematic = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_fish, raccoon_fish_items_flat, 3, 2) -raccoon_artisan_bundle_thematic = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_artisan, raccoon_artisan_items, 3, 2) - -raccoon_food_items_thematic = [*all_specific_dried_mushrooms, *raccoon_food_items, brown_egg.as_amount(5), large_egg.as_amount(2), large_brown_egg.as_amount(2), - green_algae.as_amount(10)] -raccoon_food_bundle_thematic = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_food, raccoon_food_items_thematic, 3, 2) - -raccoon_foraging_bundle_thematic = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_foraging, raccoon_foraging_items, 3, 2) - -giant_stump_bundles_thematic = [raccoon_fish_bundle_thematic, raccoon_artisan_bundle_thematic, raccoon_food_bundle_thematic, raccoon_foraging_bundle_thematic] -giant_stump_thematic = BundleRoomTemplate(CCRoom.raccoon_requests, giant_stump_bundles_thematic, 8) - - -# Crafts Room -spring_foraging_items_thematic = [*spring_foraging_items_vanilla, spring_onion, salmonberry, morel] -spring_foraging_bundle_thematic = BundleTemplate.extend_from(spring_foraging_bundle_vanilla, spring_foraging_items_thematic) - -summer_foraging_items_thematic = [*summer_foraging_items_vanilla, fiddlehead_fern, red_mushroom, rainbow_shell] -summer_foraging_bundle_thematic = BundleTemplate.extend_from(summer_foraging_bundle_vanilla, summer_foraging_items_thematic) - -fall_foraging_items_thematic = [*fall_foraging_items_vanilla, chanterelle] -fall_foraging_bundle_thematic = BundleTemplate.extend_from(fall_foraging_bundle_vanilla, fall_foraging_items_thematic) - -winter_foraging_items_thematic = [*winter_foraging_items_vanilla, holly, nautilus_shell] -winter_foraging_bundle_thematic = BundleTemplate.extend_from(winter_foraging_bundle_vanilla, winter_foraging_items_thematic) - -construction_items_thematic = [*construction_items_vanilla, clay.as_amount(10), fiber.as_amount(99), sap.as_amount(50)] -construction_bundle_thematic = BundleTemplate.extend_from(construction_bundle_vanilla, construction_items_thematic) - -exotic_foraging_items_thematic = [*exotic_foraging_items_vanilla, coral, sea_urchin, clam, cockle, mussel, oyster, seaweed] -exotic_foraging_bundle_thematic = BundleTemplate.extend_from(exotic_foraging_bundle_vanilla, exotic_foraging_items_thematic) - -crafts_room_bundles_thematic = [spring_foraging_bundle_thematic, summer_foraging_bundle_thematic, fall_foraging_bundle_thematic, - winter_foraging_bundle_thematic, construction_bundle_thematic, exotic_foraging_bundle_thematic] -crafts_room_thematic = BundleRoomTemplate(CCRoom.crafts_room, crafts_room_bundles_thematic, 6) - -# Pantry -spring_crops_items_thematic = [*spring_crops_items_vanilla, blue_jazz, coffee_bean, garlic, kale, rhubarb, strawberry, tulip, unmilled_rice, carrot] -spring_crops_bundle_thematic = BundleTemplate.extend_from(spring_crops_bundle_vanilla, spring_crops_items_thematic) - -summer_crops_items_thematic = [*summer_crops_items_vanilla, corn, hops, poppy, radish, red_cabbage, starfruit, summer_spangle, sunflower, wheat, summer_squash] -summer_crops_bundle_thematic = BundleTemplate.extend_from(summer_crops_bundle_vanilla, summer_crops_items_thematic) - -fall_crops_items_thematic = [*fall_crops_items_vanilla, amaranth, artichoke, beet, bok_choy, cranberries, fairy_rose, grape, - sunflower, wheat, sweet_gem_berry, broccoli] -fall_crops_bundle_thematic = BundleTemplate.extend_from(fall_crops_bundle_vanilla, fall_crops_items_thematic) - -all_crops_items = sorted({*spring_crops_items_thematic, *summer_crops_items_thematic, *fall_crops_items_thematic, powdermelon}) - -quality_crops_items_thematic = [item.as_quality_crop() for item in all_crops_items] -quality_crops_bundle_thematic = BundleTemplate.extend_from(quality_crops_bundle_vanilla, quality_crops_items_thematic) - -animal_items_thematic = [*animal_items_vanilla, egg, brown_egg, milk, goat_milk, truffle, - duck_feather, rabbit_foot, dinosaur_egg, void_egg, golden_egg, ostrich_egg] -animal_bundle_thematic = BundleTemplate.extend_from(animal_bundle_vanilla, animal_items_thematic) - -artisan_items_thematic = [*artisan_items_vanilla, beer, juice, mead, pale_ale, wine, pickles, caviar, aged_roe, coffee, green_tea, banana, mango] -artisan_bundle_thematic = BundleTemplate.extend_from(artisan_bundle_vanilla, artisan_items_thematic) - -pantry_bundles_thematic = [spring_crops_bundle_thematic, summer_crops_bundle_thematic, fall_crops_bundle_thematic, - quality_crops_bundle_thematic, animal_bundle_thematic, artisan_bundle_thematic] -pantry_thematic = BundleRoomTemplate(CCRoom.pantry, pantry_bundles_thematic, 6) - -# Fish Tank -river_fish_items_thematic = [*river_fish_items_vanilla, chub, rainbow_trout, lingcod, walleye, perch, pike, bream, salmon, smallmouth_bass, dorado] -river_fish_bundle_thematic = BundleTemplate.extend_from(river_fish_bundle_vanilla, river_fish_items_thematic) - -lake_fish_items_thematic = [*lake_fish_items_vanilla, chub, rainbow_trout, lingcod, walleye, perch, midnight_carp] -lake_fish_bundle_thematic = BundleTemplate.extend_from(lake_fish_bundle_vanilla, lake_fish_items_thematic) - -ocean_fish_items_thematic = [*ocean_fish_items_vanilla, pufferfish, super_cucumber, flounder, anchovy, red_mullet, - herring, eel, octopus, squid, sea_cucumber, albacore, halibut] -ocean_fish_bundle_thematic = BundleTemplate.extend_from(ocean_fish_bundle_vanilla, ocean_fish_items_thematic) - -night_fish_items_thematic = [*night_fish_items_vanilla, super_cucumber, squid, midnight_carp, midnight_squid] -night_fish_bundle_thematic = BundleTemplate.extend_from(night_fish_bundle_vanilla, night_fish_items_thematic) - -crab_pot_items_thematic = [*crab_pot_items_vanilla, *crab_pot_trash_items] -crab_pot_bundle_thematic = BundleTemplate.extend_from(crab_pot_bundle_vanilla, crab_pot_items_thematic) - -specialty_fish_items_thematic = [*specialty_fish_items_vanilla, scorpion_carp, eel, octopus, lava_eel, ice_pip, - stonefish, void_salmon, stingray, spookfish, midnight_squid, slimejack, goby] -specialty_fish_bundle_thematic = BundleTemplate.extend_from(specialty_fish_bundle_vanilla, specialty_fish_items_thematic) - -fish_tank_bundles_thematic = [river_fish_bundle_thematic, lake_fish_bundle_thematic, ocean_fish_bundle_thematic, - night_fish_bundle_thematic, crab_pot_bundle_thematic, specialty_fish_bundle_thematic] -fish_tank_thematic = BundleRoomTemplate(CCRoom.fish_tank, fish_tank_bundles_thematic, 6) - -# Boiler Room -blacksmith_items_thematic = [*blacksmith_items_vanilla, iridium_bar, refined_quartz.as_amount(3), wilted_bouquet] -blacksmith_bundle_thematic = BundleTemplate.extend_from(blacksmith_bundle_vanilla, blacksmith_items_thematic) - -geologist_items_thematic = [*geologist_items_vanilla, emerald, aquamarine, ruby, amethyst, topaz, jade, diamond] -geologist_bundle_thematic = BundleTemplate.extend_from(geologist_bundle_vanilla, geologist_items_thematic) - -adventurer_items_thematic = [*adventurer_items_vanilla, bug_meat, coal.as_amount(5), bone_fragment.as_amount(10)] -adventurer_bundle_thematic = BundleTemplate.extend_from(adventurer_bundle_vanilla, adventurer_items_thematic) - -boiler_room_bundles_thematic = [blacksmith_bundle_thematic, geologist_bundle_thematic, adventurer_bundle_thematic] -boiler_room_thematic = BundleRoomTemplate(CCRoom.boiler_room, boiler_room_bundles_thematic, 3) - -# Bulletin Board - -# More recipes? -chef_items_thematic = [maki_roll, fried_egg, omelet, pizza, hashbrowns, pancakes, bread, tortilla, - farmer_s_lunch, survival_burger, dish_o_the_sea, miner_s_treat, roots_platter, salad, - cheese_cauliflower, parsnip_soup, fried_mushroom, salmon_dinner, pepper_poppers, spaghetti, - sashimi, blueberry_tart, algae_soup, pale_broth, chowder] -chef_bundle_thematic = BundleTemplate.extend_from(chef_bundle_vanilla, chef_items_thematic) - -dye_red_items = [cranberries, hot_pepper, radish, rhubarb, spaghetti, strawberry, tomato, tulip, red_mushroom] -dye_orange_items = [poppy, pumpkin, apricot, orange, spice_berry, winter_root] -dye_yellow_items = [corn, parsnip, summer_spangle, sunflower, starfruit] -dye_green_items = [fiddlehead_fern, kale, artichoke, bok_choy, green_bean, cactus_fruit, duck_feather, dinosaur_egg] -dye_blue_items = [blueberry, blue_jazz, blackberry, crystal_fruit, aquamarine] -dye_purple_items = [beet, crocus, eggplant, red_cabbage, sweet_pea, iridium_bar, sea_urchin, amaranth] -dye_items_thematic = [dye_red_items, dye_orange_items, dye_yellow_items, dye_green_items, dye_blue_items, dye_purple_items] -dye_bundle_thematic = DeepBundleTemplate(CCRoom.bulletin_board, BundleName.dye, dye_items_thematic, 6, 6) - -field_research_items_thematic = [*field_research_items_vanilla, geode, magma_geode, omni_geode, - rainbow_shell, amethyst, bream, carp] -field_research_bundle_thematic = BundleTemplate.extend_from(field_research_bundle_vanilla, field_research_items_thematic) - -fodder_items_thematic = [*fodder_items_vanilla, kale.as_amount(3), corn.as_amount(3), green_bean.as_amount(3), - potato.as_amount(3), green_algae.as_amount(5), white_algae.as_amount(3)] -fodder_bundle_thematic = BundleTemplate.extend_from(fodder_bundle_vanilla, fodder_items_thematic) - -enchanter_items_thematic = [*enchanter_items_vanilla, purple_mushroom, solar_essence, - super_cucumber, void_essence, fire_quartz, frozen_tear, jade] -enchanter_bundle_thematic = BundleTemplate.extend_from(enchanter_bundle_vanilla, enchanter_items_thematic) - -bulletin_board_bundles_thematic = [chef_bundle_thematic, dye_bundle_thematic, field_research_bundle_thematic, fodder_bundle_thematic, enchanter_bundle_thematic] -bulletin_board_thematic = BundleRoomTemplate(CCRoom.bulletin_board, bulletin_board_bundles_thematic, 5) - -# Abandoned Joja Mart -missing_bundle_items_thematic = [*missing_bundle_items_vanilla, pale_ale.as_quality(ArtisanQuality.silver), beer.as_quality(ArtisanQuality.silver), - mead.as_quality(ArtisanQuality.silver), - cheese.as_quality(ArtisanQuality.silver), goat_cheese.as_quality(ArtisanQuality.silver), void_mayo, cloth, green_tea, - truffle_oil, diamond, - sweet_gem_berry.as_quality_crop(), starfruit.as_quality_crop(), - tea_leaves.as_amount(5), lava_eel.as_quality(FishQuality.gold), scorpion_carp.as_quality(FishQuality.gold), - blobfish.as_quality(FishQuality.gold)] -missing_bundle_thematic = BundleTemplate.extend_from(missing_bundle_vanilla, missing_bundle_items_thematic) -abandoned_joja_mart_bundles_thematic = [missing_bundle_thematic] -abandoned_joja_mart_thematic = BundleRoomTemplate(CCRoom.abandoned_joja_mart, abandoned_joja_mart_bundles_thematic, 1) - -# Vault -vault_bundles_thematic = vault_bundles_vanilla -vault_thematic = BundleRoomTemplate(CCRoom.vault, vault_bundles_thematic, 4) +from .vanilla_bundles import * +from ...bundles.bundle import BundleTemplate +from ...bundles.bundle_room import BundleRoomTemplate +from ...strings.bundle_names import CCRoom, BundleName + +# Giant Stump +from ...strings.quality_names import ArtisanQuality, FishQuality + +raccoon_fish_items_flat = [*raccoon_crab_pot_fish_items, *raccoon_smoked_fish_items] +raccoon_fish_bundle_thematic = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_fish, raccoon_fish_items_flat, 3, 2) +raccoon_artisan_bundle_thematic = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_artisan, raccoon_artisan_items, 3, 2) + +raccoon_food_items_thematic = [*all_specific_dried_mushrooms, *raccoon_food_items, brown_egg.as_amount(5), large_egg.as_amount(2), large_brown_egg.as_amount(2), + green_algae.as_amount(10)] +raccoon_food_bundle_thematic = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_food, raccoon_food_items_thematic, 3, 2) + +raccoon_foraging_bundle_thematic = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_foraging, raccoon_foraging_items, 3, 2) + +giant_stump_bundles_thematic = [raccoon_fish_bundle_thematic, raccoon_artisan_bundle_thematic, raccoon_food_bundle_thematic, raccoon_foraging_bundle_thematic] +giant_stump_thematic = BundleRoomTemplate(CCRoom.raccoon_requests, giant_stump_bundles_thematic, 8) + + +# Crafts Room +spring_foraging_items_thematic = [*spring_foraging_items_vanilla, spring_onion, salmonberry, morel] +spring_foraging_bundle_thematic = BundleTemplate.extend_from(spring_foraging_bundle_vanilla, spring_foraging_items_thematic) + +summer_foraging_items_thematic = [*summer_foraging_items_vanilla, fiddlehead_fern, red_mushroom, rainbow_shell] +summer_foraging_bundle_thematic = BundleTemplate.extend_from(summer_foraging_bundle_vanilla, summer_foraging_items_thematic) + +fall_foraging_items_thematic = [*fall_foraging_items_vanilla, chanterelle] +fall_foraging_bundle_thematic = BundleTemplate.extend_from(fall_foraging_bundle_vanilla, fall_foraging_items_thematic) + +winter_foraging_items_thematic = [*winter_foraging_items_vanilla, holly, nautilus_shell] +winter_foraging_bundle_thematic = BundleTemplate.extend_from(winter_foraging_bundle_vanilla, winter_foraging_items_thematic) + +construction_items_thematic = [*construction_items_vanilla, clay.as_amount(10), fiber.as_amount(99), sap.as_amount(50)] +construction_bundle_thematic = BundleTemplate.extend_from(construction_bundle_vanilla, construction_items_thematic) + +exotic_foraging_items_thematic = [*exotic_foraging_items_vanilla, coral, sea_urchin, clam, cockle, mussel, oyster, seaweed] +exotic_foraging_bundle_thematic = BundleTemplate.extend_from(exotic_foraging_bundle_vanilla, exotic_foraging_items_thematic) + +crafts_room_bundles_thematic = [spring_foraging_bundle_thematic, summer_foraging_bundle_thematic, fall_foraging_bundle_thematic, + winter_foraging_bundle_thematic, construction_bundle_thematic, exotic_foraging_bundle_thematic] +crafts_room_thematic = BundleRoomTemplate(CCRoom.crafts_room, crafts_room_bundles_thematic, 6) + +# Pantry +spring_crops_items_thematic = [*spring_crops_items_vanilla, blue_jazz, coffee_bean, garlic, kale, rhubarb, strawberry, tulip, unmilled_rice, carrot] +spring_crops_bundle_thematic = BundleTemplate.extend_from(spring_crops_bundle_vanilla, spring_crops_items_thematic) + +summer_crops_items_thematic = [*summer_crops_items_vanilla, corn, hops, poppy, radish, red_cabbage, starfruit, summer_spangle, sunflower, wheat, summer_squash] +summer_crops_bundle_thematic = BundleTemplate.extend_from(summer_crops_bundle_vanilla, summer_crops_items_thematic) + +fall_crops_items_thematic = [*fall_crops_items_vanilla, amaranth, artichoke, beet, bok_choy, cranberries, fairy_rose, grape, + sunflower, wheat, sweet_gem_berry, broccoli] +fall_crops_bundle_thematic = BundleTemplate.extend_from(fall_crops_bundle_vanilla, fall_crops_items_thematic) + +all_crops_items = sorted({*spring_crops_items_thematic, *summer_crops_items_thematic, *fall_crops_items_thematic, powdermelon}) + +quality_crops_items_thematic = [item.as_quality_crop() for item in all_crops_items] +quality_crops_bundle_thematic = BundleTemplate.extend_from(quality_crops_bundle_vanilla, quality_crops_items_thematic) + +animal_items_thematic = [*animal_items_vanilla, egg, brown_egg, milk, goat_milk, truffle, + duck_feather, rabbit_foot, dinosaur_egg, void_egg, golden_egg, ostrich_egg] +animal_bundle_thematic = BundleTemplate.extend_from(animal_bundle_vanilla, animal_items_thematic) + +artisan_items_thematic = [*artisan_items_vanilla, beer, juice, mead, pale_ale, wine, pickles, caviar, aged_roe, coffee, green_tea, banana, mango] +artisan_bundle_thematic = BundleTemplate.extend_from(artisan_bundle_vanilla, artisan_items_thematic) + +pantry_bundles_thematic = [spring_crops_bundle_thematic, summer_crops_bundle_thematic, fall_crops_bundle_thematic, + quality_crops_bundle_thematic, animal_bundle_thematic, artisan_bundle_thematic] +pantry_thematic = BundleRoomTemplate(CCRoom.pantry, pantry_bundles_thematic, 6) + +# Fish Tank +river_fish_items_thematic = [*river_fish_items_vanilla, chub, rainbow_trout, lingcod, walleye, perch, pike, bream, salmon, smallmouth_bass, dorado] +river_fish_bundle_thematic = BundleTemplate.extend_from(river_fish_bundle_vanilla, river_fish_items_thematic) + +lake_fish_items_thematic = [*lake_fish_items_vanilla, chub, rainbow_trout, lingcod, walleye, perch, midnight_carp] +lake_fish_bundle_thematic = BundleTemplate.extend_from(lake_fish_bundle_vanilla, lake_fish_items_thematic) + +ocean_fish_items_thematic = [*ocean_fish_items_vanilla, pufferfish, super_cucumber, flounder, anchovy, red_mullet, + herring, eel, octopus, squid, sea_cucumber, albacore, halibut] +ocean_fish_bundle_thematic = BundleTemplate.extend_from(ocean_fish_bundle_vanilla, ocean_fish_items_thematic) + +night_fish_items_thematic = [*night_fish_items_vanilla, super_cucumber, squid, midnight_carp, midnight_squid] +night_fish_bundle_thematic = BundleTemplate.extend_from(night_fish_bundle_vanilla, night_fish_items_thematic) + +crab_pot_items_thematic = [*crab_pot_items_vanilla, *crab_pot_trash_items] +crab_pot_bundle_thematic = BundleTemplate.extend_from(crab_pot_bundle_vanilla, crab_pot_items_thematic) + +specialty_fish_items_thematic = [*specialty_fish_items_vanilla, scorpion_carp, eel, octopus, lava_eel, ice_pip, + stonefish, void_salmon, stingray, spookfish, midnight_squid, slimejack, goby] +specialty_fish_bundle_thematic = BundleTemplate.extend_from(specialty_fish_bundle_vanilla, specialty_fish_items_thematic) + +fish_tank_bundles_thematic = [river_fish_bundle_thematic, lake_fish_bundle_thematic, ocean_fish_bundle_thematic, + night_fish_bundle_thematic, crab_pot_bundle_thematic, specialty_fish_bundle_thematic] +fish_tank_thematic = BundleRoomTemplate(CCRoom.fish_tank, fish_tank_bundles_thematic, 6) + +# Boiler Room +blacksmith_items_thematic = [*blacksmith_items_vanilla, iridium_bar, refined_quartz.as_amount(3), wilted_bouquet] +blacksmith_bundle_thematic = BundleTemplate.extend_from(blacksmith_bundle_vanilla, blacksmith_items_thematic) + +geologist_items_thematic = [*geologist_items_vanilla, emerald, aquamarine, ruby, amethyst, topaz, jade, diamond] +geologist_bundle_thematic = BundleTemplate.extend_from(geologist_bundle_vanilla, geologist_items_thematic) + +adventurer_items_thematic = [*adventurer_items_vanilla, bug_meat, coal.as_amount(5), bone_fragment.as_amount(10)] +adventurer_bundle_thematic = BundleTemplate.extend_from(adventurer_bundle_vanilla, adventurer_items_thematic) + +boiler_room_bundles_thematic = [blacksmith_bundle_thematic, geologist_bundle_thematic, adventurer_bundle_thematic] +boiler_room_thematic = BundleRoomTemplate(CCRoom.boiler_room, boiler_room_bundles_thematic, 3) + +# Bulletin Board + +# More recipes? +chef_items_thematic = [maki_roll, fried_egg, omelet, pizza, hashbrowns, pancakes, bread, tortilla, + farmer_s_lunch, survival_burger, dish_o_the_sea, miner_s_treat, roots_platter, salad, + cheese_cauliflower, parsnip_soup, fried_mushroom, salmon_dinner, pepper_poppers, spaghetti, + sashimi, blueberry_tart, algae_soup, pale_broth, chowder] +chef_bundle_thematic = BundleTemplate.extend_from(chef_bundle_vanilla, chef_items_thematic) + +dye_red_items = [cranberries, hot_pepper, radish, rhubarb, spaghetti, strawberry, tomato, tulip, red_mushroom] +dye_orange_items = [poppy, pumpkin, apricot, orange, spice_berry, winter_root] +dye_yellow_items = [corn, parsnip, summer_spangle, sunflower, starfruit] +dye_green_items = [fiddlehead_fern, kale, artichoke, bok_choy, green_bean, cactus_fruit, duck_feather, dinosaur_egg] +dye_blue_items = [blueberry, blue_jazz, blackberry, crystal_fruit, aquamarine] +dye_purple_items = [beet, crocus, eggplant, red_cabbage, sweet_pea, iridium_bar, sea_urchin, amaranth] +dye_items_thematic = [dye_red_items, dye_orange_items, dye_yellow_items, dye_green_items, dye_blue_items, dye_purple_items] +dye_bundle_thematic = DeepBundleTemplate(CCRoom.bulletin_board, BundleName.dye, dye_items_thematic, 6, 6) + +field_research_items_thematic = [*field_research_items_vanilla, geode, magma_geode, omni_geode, + rainbow_shell, amethyst, bream, carp] +field_research_bundle_thematic = BundleTemplate.extend_from(field_research_bundle_vanilla, field_research_items_thematic) + +fodder_items_thematic = [*fodder_items_vanilla, kale.as_amount(3), corn.as_amount(3), green_bean.as_amount(3), + potato.as_amount(3), green_algae.as_amount(5), white_algae.as_amount(3)] +fodder_bundle_thematic = BundleTemplate.extend_from(fodder_bundle_vanilla, fodder_items_thematic) + +enchanter_items_thematic = [*enchanter_items_vanilla, purple_mushroom, solar_essence, + super_cucumber, void_essence, fire_quartz, frozen_tear, jade] +enchanter_bundle_thematic = BundleTemplate.extend_from(enchanter_bundle_vanilla, enchanter_items_thematic) + +bulletin_board_bundles_thematic = [chef_bundle_thematic, dye_bundle_thematic, field_research_bundle_thematic, fodder_bundle_thematic, enchanter_bundle_thematic] +bulletin_board_thematic = BundleRoomTemplate(CCRoom.bulletin_board, bulletin_board_bundles_thematic, 5) + +# Abandoned Joja Mart +missing_bundle_items_thematic = [*missing_bundle_items_vanilla, pale_ale.as_quality(ArtisanQuality.silver), beer.as_quality(ArtisanQuality.silver), + mead.as_quality(ArtisanQuality.silver), + cheese.as_quality(ArtisanQuality.silver), goat_cheese.as_quality(ArtisanQuality.silver), void_mayo, cloth, green_tea, + truffle_oil, diamond, + sweet_gem_berry.as_quality_crop(), starfruit.as_quality_crop(), + tea_leaves.as_amount(5), lava_eel.as_quality(FishQuality.gold), scorpion_carp.as_quality(FishQuality.gold), + blobfish.as_quality(FishQuality.gold)] +missing_bundle_thematic = BundleTemplate.extend_from(missing_bundle_vanilla, missing_bundle_items_thematic) +abandoned_joja_mart_bundles_thematic = [missing_bundle_thematic] +abandoned_joja_mart_thematic = BundleRoomTemplate(CCRoom.abandoned_joja_mart, abandoned_joja_mart_bundles_thematic, 1) + +# Vault +vault_bundles_thematic = vault_bundles_vanilla +vault_thematic = BundleRoomTemplate(CCRoom.vault, vault_bundles_thematic, 4) diff --git a/worlds/stardew_valley/data/bundles_data/vanilla_bundles.py b/worlds/stardew_valley/data/bundles_data/vanilla_bundles.py index a30d9807640f..4e13b408a8c9 100644 --- a/worlds/stardew_valley/data/bundles_data/vanilla_bundles.py +++ b/worlds/stardew_valley/data/bundles_data/vanilla_bundles.py @@ -1,167 +1,167 @@ -from .bundle_items_data import * -from ...bundles.bundle import DeepBundleTemplate, BundleTemplate, MoneyBundleTemplate -from ...bundles.bundle_item import BundleItem -from ...bundles.bundle_room import BundleRoomTemplate -from ...content.vanilla.base import all_fruits, all_vegetables -from ...strings.artisan_good_names import ArtisanGood -from ...strings.bundle_names import CCRoom, BundleName -from ...strings.fish_names import Fish -from ...strings.forageable_names import all_edible_mushrooms - -# Giant Stump -from ...strings.quality_names import ArtisanQuality, FishQuality - -all_specific_jellies = [BundleItem(ArtisanGood.jelly, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fruits] -all_specific_pickles = [BundleItem(ArtisanGood.pickles, flavor=vegetable, source=BundleItem.Sources.content) for vegetable in all_vegetables] -all_specific_dried_fruits = [*[BundleItem(ArtisanGood.dried_fruit, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fruits], - BundleItem(ArtisanGood.raisins, source=BundleItem.Sources.content)] -all_specific_juices = [BundleItem(ArtisanGood.juice, flavor=vegetable, source=BundleItem.Sources.content) for vegetable in all_vegetables] - -raccoon_crab_pot_fish_items = [periwinkle.as_amount(5), snail.as_amount(5), crayfish.as_amount(5), mussel.as_amount(5), - oyster.as_amount(5), cockle.as_amount(5), clam.as_amount(5)] -raccoon_smoked_fish_items = [BundleItem(ArtisanGood.smoked_fish, flavor=fish) for fish in - [Fish.largemouth_bass, Fish.bream, Fish.bullhead, Fish.chub, Fish.ghostfish, Fish.flounder, Fish.shad, - Fish.rainbow_trout, Fish.tilapia, Fish.red_mullet, Fish.tuna, Fish.midnight_carp, Fish.salmon, Fish.perch]] - -raccoon_artisan_items = [*all_specific_jellies, *all_specific_pickles, *all_specific_dried_fruits, *all_specific_juices] -raccoon_fish_items_deep = [raccoon_crab_pot_fish_items, raccoon_smoked_fish_items] - -all_specific_dried_mushrooms = [BundleItem(ArtisanGood.dried_mushroom, flavor=mushroom, source=BundleItem.Sources.content) for mushroom in all_edible_mushrooms] -raccoon_food_items = [egg.as_amount(5), cave_carrot.as_amount(5), white_algae.as_amount(5)] - -raccoon_foraging_items = [moss.as_amount(10), rusty_spoon, trash.as_amount(5), slime.as_amount(99), bat_wing.as_amount(10), geode.as_amount(8), - frozen_geode.as_amount(5), magma_geode.as_amount(3), coral.as_amount(4), sea_urchin.as_amount(2), bug_meat.as_amount(10), - diamond, topaz.as_amount(3), ghostfish.as_amount(3)] - -raccoon_fish_bundle_vanilla = DeepBundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_fish, raccoon_fish_items_deep, 2, 2) -raccoon_artisan_bundle_vanilla = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_artisan, raccoon_artisan_items, 2, 2) -raccoon_food_items_vanilla = [all_specific_dried_mushrooms, raccoon_food_items] -raccoon_food_bundle_vanilla = DeepBundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_food, raccoon_food_items_vanilla, 2, 2) -raccoon_foraging_bundle_vanilla = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_foraging, raccoon_foraging_items, 2, 2) -giant_stump_bundles_vanilla = [raccoon_fish_bundle_vanilla, raccoon_artisan_bundle_vanilla, raccoon_food_bundle_vanilla, raccoon_foraging_bundle_vanilla] -giant_stump_vanilla = BundleRoomTemplate(CCRoom.raccoon_requests, giant_stump_bundles_vanilla, 8) - -# Crafts Room -spring_foraging_items_vanilla = [wild_horseradish, daffodil, leek, dandelion] -spring_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.spring_foraging, spring_foraging_items_vanilla, 4, 4) - -summer_foraging_items_vanilla = [grape, spice_berry, sweet_pea] -summer_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.summer_foraging, summer_foraging_items_vanilla, 3, 3) - -fall_foraging_items_vanilla = [common_mushroom, wild_plum, hazelnut, blackberry] -fall_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.fall_foraging, fall_foraging_items_vanilla, 4, 4) - -winter_foraging_items_vanilla = [winter_root, crystal_fruit, snow_yam, crocus] -winter_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.winter_foraging, winter_foraging_items_vanilla, 4, 4) - -construction_items_vanilla = [wood, stone, hardwood] -construction_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.construction, construction_items_vanilla, 4, 4) - -exotic_foraging_items_vanilla = [coconut, cactus_fruit, cave_carrot, red_mushroom, purple_mushroom, maple_syrup, oak_resin, pine_tar, morel] -exotic_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.exotic_foraging, exotic_foraging_items_vanilla, 9, 5) - -crafts_room_bundles_vanilla = [spring_foraging_bundle_vanilla, summer_foraging_bundle_vanilla, fall_foraging_bundle_vanilla, - winter_foraging_bundle_vanilla, construction_bundle_vanilla, exotic_foraging_bundle_vanilla] -crafts_room_vanilla = BundleRoomTemplate(CCRoom.crafts_room, crafts_room_bundles_vanilla, 6) - -# Pantry -spring_crops_items_vanilla = [parsnip, green_bean, cauliflower, potato] -spring_crops_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.spring_crops, spring_crops_items_vanilla, 4, 4) - -summer_crops_items_vanilla = [tomato, hot_pepper, blueberry, melon] -summer_crops_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.summer_crops, summer_crops_items_vanilla, 4, 4) - -fall_crops_items_vanilla = [corn, eggplant, pumpkin, yam] -fall_crops_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.fall_crops, fall_crops_items_vanilla, 4, 4) - -quality_crops_items_vanilla = [item.as_quality_crop() for item in [parsnip, melon, pumpkin, corn]] -quality_crops_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.quality_crops, quality_crops_items_vanilla, 4, 3) - -animal_items_vanilla = [large_milk, large_brown_egg, large_egg, large_goat_milk, wool, duck_egg] -animal_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.animal, animal_items_vanilla, 6, 5) - -artisan_items_vanilla = [truffle_oil, cloth, goat_cheese, cheese, honey, jelly, apple, apricot, orange, peach, pomegranate, cherry] -artisan_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.artisan, artisan_items_vanilla, 12, 6) - -pantry_bundles_vanilla = [spring_crops_bundle_vanilla, summer_crops_bundle_vanilla, fall_crops_bundle_vanilla, - quality_crops_bundle_vanilla, animal_bundle_vanilla, artisan_bundle_vanilla] -pantry_vanilla = BundleRoomTemplate(CCRoom.pantry, pantry_bundles_vanilla, 6) - -# Fish Tank -river_fish_items_vanilla = [sunfish, catfish, shad, tiger_trout] -river_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.river_fish, river_fish_items_vanilla, 4, 4) - -lake_fish_items_vanilla = [largemouth_bass, carp, bullhead, sturgeon] -lake_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.lake_fish, lake_fish_items_vanilla, 4, 4) - -ocean_fish_items_vanilla = [sardine, tuna, red_snapper, tilapia] -ocean_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.ocean_fish, ocean_fish_items_vanilla, 4, 4) - -night_fish_items_vanilla = [walleye, bream, eel] -night_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.night_fish, night_fish_items_vanilla, 3, 3) - -crab_pot_items_vanilla = [lobster, crayfish, crab, cockle, mussel, shrimp, snail, periwinkle, oyster, clam] -crab_pot_trash_items = [trash, driftwood, soggy_newspaper, broken_cd, broken_glasses] -crab_pot_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.crab_pot, crab_pot_items_vanilla, 10, 5) - -specialty_fish_items_vanilla = [pufferfish, ghostfish, sandfish, woodskip] -specialty_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.specialty_fish, specialty_fish_items_vanilla, 4, 4) - -fish_tank_bundles_vanilla = [river_fish_bundle_vanilla, lake_fish_bundle_vanilla, ocean_fish_bundle_vanilla, - night_fish_bundle_vanilla, crab_pot_bundle_vanilla, specialty_fish_bundle_vanilla] -fish_tank_vanilla = BundleRoomTemplate(CCRoom.fish_tank, fish_tank_bundles_vanilla, 6) - -# Boiler Room -blacksmith_items_vanilla = [copper_bar, iron_bar, gold_bar] -blacksmith_bundle_vanilla = BundleTemplate(CCRoom.boiler_room, BundleName.blacksmith, blacksmith_items_vanilla, 3, 3) - -geologist_items_vanilla = [quartz, earth_crystal, frozen_tear, fire_quartz] -geologist_bundle_vanilla = BundleTemplate(CCRoom.boiler_room, BundleName.geologist, geologist_items_vanilla, 4, 4) - -adventurer_items_vanilla = [slime, bat_wing, solar_essence, void_essence] -adventurer_bundle_vanilla = BundleTemplate(CCRoom.boiler_room, BundleName.adventurer, adventurer_items_vanilla, 4, 2) - -boiler_room_bundles_vanilla = [blacksmith_bundle_vanilla, geologist_bundle_vanilla, adventurer_bundle_vanilla] -boiler_room_vanilla = BundleRoomTemplate(CCRoom.boiler_room, boiler_room_bundles_vanilla, 3) - -# Bulletin Board -chef_items_vanilla = [maple_syrup, fiddlehead_fern, truffle, poppy, maki_roll, fried_egg] -chef_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.chef, chef_items_vanilla, 6, 6) - -dye_items_vanilla = [red_mushroom, sea_urchin, sunflower, duck_feather, aquamarine, red_cabbage] -dye_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.dye, dye_items_vanilla, 6, 6) - -field_research_items_vanilla = [purple_mushroom, nautilus_shell, chub, frozen_geode] -field_research_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.field_research, field_research_items_vanilla, 4, 4) - -fodder_items_vanilla = [wheat.as_amount(10), hay.as_amount(10), apple.as_amount(3)] -fodder_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.fodder, fodder_items_vanilla, 3, 3) - -enchanter_items_vanilla = [oak_resin, wine, rabbit_foot, pomegranate] -enchanter_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.enchanter, enchanter_items_vanilla, 4, 4) - -bulletin_board_bundles_vanilla = [chef_bundle_vanilla, dye_bundle_vanilla, field_research_bundle_vanilla, fodder_bundle_vanilla, enchanter_bundle_vanilla] -bulletin_board_vanilla = BundleRoomTemplate(CCRoom.bulletin_board, bulletin_board_bundles_vanilla, 5) - -# Abandoned Joja Mart -missing_bundle_items_vanilla = [wine.as_quality(ArtisanQuality.silver), dinosaur_mayo, prismatic_shard, caviar, - ancient_fruit.as_quality_crop(), void_salmon.as_quality(FishQuality.gold)] -missing_bundle_vanilla = BundleTemplate(CCRoom.abandoned_joja_mart, BundleName.missing_bundle, missing_bundle_items_vanilla, 6, 5) - -abandoned_joja_mart_bundles_vanilla = [missing_bundle_vanilla] -abandoned_joja_mart_vanilla = BundleRoomTemplate(CCRoom.abandoned_joja_mart, abandoned_joja_mart_bundles_vanilla, 1) - - -# Vault -vault_2500_gold = BundleItem.money_bundle(2500) -vault_5000_gold = BundleItem.money_bundle(5000) -vault_10000_gold = BundleItem.money_bundle(10000) -vault_25000_gold = BundleItem.money_bundle(25000) - -vault_2500_bundle = MoneyBundleTemplate(CCRoom.vault, BundleName.money_2500, vault_2500_gold) -vault_5000_bundle = MoneyBundleTemplate(CCRoom.vault, BundleName.money_5000, vault_5000_gold) -vault_10000_bundle = MoneyBundleTemplate(CCRoom.vault, BundleName.money_10000, vault_10000_gold) -vault_25000_bundle = MoneyBundleTemplate(CCRoom.vault, BundleName.money_25000, vault_25000_gold) - -vault_bundles_vanilla = [vault_2500_bundle, vault_5000_bundle, vault_10000_bundle, vault_25000_bundle] -vault_vanilla = BundleRoomTemplate(CCRoom.vault, vault_bundles_vanilla, 4) +from .bundle_items_data import * +from ...bundles.bundle import DeepBundleTemplate, BundleTemplate, MoneyBundleTemplate +from ...bundles.bundle_item import BundleItem +from ...bundles.bundle_room import BundleRoomTemplate +from ...content.vanilla.base import all_fruits, all_vegetables +from ...strings.artisan_good_names import ArtisanGood +from ...strings.bundle_names import CCRoom, BundleName +from ...strings.fish_names import Fish +from ...strings.forageable_names import all_edible_mushrooms + +# Giant Stump +from ...strings.quality_names import ArtisanQuality, FishQuality + +all_specific_jellies = [BundleItem(ArtisanGood.jelly, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fruits] +all_specific_pickles = [BundleItem(ArtisanGood.pickles, flavor=vegetable, source=BundleItem.Sources.content) for vegetable in all_vegetables] +all_specific_dried_fruits = [*[BundleItem(ArtisanGood.dried_fruit, flavor=fruit, source=BundleItem.Sources.content) for fruit in all_fruits], + BundleItem(ArtisanGood.raisins, source=BundleItem.Sources.content)] +all_specific_juices = [BundleItem(ArtisanGood.juice, flavor=vegetable, source=BundleItem.Sources.content) for vegetable in all_vegetables] + +raccoon_crab_pot_fish_items = [periwinkle.as_amount(5), snail.as_amount(5), crayfish.as_amount(5), mussel.as_amount(5), + oyster.as_amount(5), cockle.as_amount(5), clam.as_amount(5)] +raccoon_smoked_fish_items = [BundleItem(ArtisanGood.smoked_fish, flavor=fish) for fish in + [Fish.largemouth_bass, Fish.bream, Fish.bullhead, Fish.chub, Fish.ghostfish, Fish.flounder, Fish.shad, + Fish.rainbow_trout, Fish.tilapia, Fish.red_mullet, Fish.tuna, Fish.midnight_carp, Fish.salmon, Fish.perch]] + +raccoon_artisan_items = [*all_specific_jellies, *all_specific_pickles, *all_specific_dried_fruits, *all_specific_juices] +raccoon_fish_items_deep = [raccoon_crab_pot_fish_items, raccoon_smoked_fish_items] + +all_specific_dried_mushrooms = [BundleItem(ArtisanGood.dried_mushroom, flavor=mushroom, source=BundleItem.Sources.content) for mushroom in all_edible_mushrooms] +raccoon_food_items = [egg.as_amount(5), cave_carrot.as_amount(5), white_algae.as_amount(5)] + +raccoon_foraging_items = [moss.as_amount(10), rusty_spoon, trash.as_amount(5), slime.as_amount(99), bat_wing.as_amount(10), geode.as_amount(8), + frozen_geode.as_amount(5), magma_geode.as_amount(3), coral.as_amount(4), sea_urchin.as_amount(2), bug_meat.as_amount(10), + diamond, topaz.as_amount(3), ghostfish.as_amount(3)] + +raccoon_fish_bundle_vanilla = DeepBundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_fish, raccoon_fish_items_deep, 2, 2) +raccoon_artisan_bundle_vanilla = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_artisan, raccoon_artisan_items, 2, 2) +raccoon_food_items_vanilla = [all_specific_dried_mushrooms, raccoon_food_items] +raccoon_food_bundle_vanilla = DeepBundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_food, raccoon_food_items_vanilla, 2, 2) +raccoon_foraging_bundle_vanilla = BundleTemplate(CCRoom.raccoon_requests, BundleName.raccoon_foraging, raccoon_foraging_items, 2, 2) +giant_stump_bundles_vanilla = [raccoon_fish_bundle_vanilla, raccoon_artisan_bundle_vanilla, raccoon_food_bundle_vanilla, raccoon_foraging_bundle_vanilla] +giant_stump_vanilla = BundleRoomTemplate(CCRoom.raccoon_requests, giant_stump_bundles_vanilla, 8) + +# Crafts Room +spring_foraging_items_vanilla = [wild_horseradish, daffodil, leek, dandelion] +spring_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.spring_foraging, spring_foraging_items_vanilla, 4, 4) + +summer_foraging_items_vanilla = [grape, spice_berry, sweet_pea] +summer_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.summer_foraging, summer_foraging_items_vanilla, 3, 3) + +fall_foraging_items_vanilla = [common_mushroom, wild_plum, hazelnut, blackberry] +fall_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.fall_foraging, fall_foraging_items_vanilla, 4, 4) + +winter_foraging_items_vanilla = [winter_root, crystal_fruit, snow_yam, crocus] +winter_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.winter_foraging, winter_foraging_items_vanilla, 4, 4) + +construction_items_vanilla = [wood, stone, hardwood] +construction_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.construction, construction_items_vanilla, 4, 4) + +exotic_foraging_items_vanilla = [coconut, cactus_fruit, cave_carrot, red_mushroom, purple_mushroom, maple_syrup, oak_resin, pine_tar, morel] +exotic_foraging_bundle_vanilla = BundleTemplate(CCRoom.crafts_room, BundleName.exotic_foraging, exotic_foraging_items_vanilla, 9, 5) + +crafts_room_bundles_vanilla = [spring_foraging_bundle_vanilla, summer_foraging_bundle_vanilla, fall_foraging_bundle_vanilla, + winter_foraging_bundle_vanilla, construction_bundle_vanilla, exotic_foraging_bundle_vanilla] +crafts_room_vanilla = BundleRoomTemplate(CCRoom.crafts_room, crafts_room_bundles_vanilla, 6) + +# Pantry +spring_crops_items_vanilla = [parsnip, green_bean, cauliflower, potato] +spring_crops_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.spring_crops, spring_crops_items_vanilla, 4, 4) + +summer_crops_items_vanilla = [tomato, hot_pepper, blueberry, melon] +summer_crops_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.summer_crops, summer_crops_items_vanilla, 4, 4) + +fall_crops_items_vanilla = [corn, eggplant, pumpkin, yam] +fall_crops_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.fall_crops, fall_crops_items_vanilla, 4, 4) + +quality_crops_items_vanilla = [item.as_quality_crop() for item in [parsnip, melon, pumpkin, corn]] +quality_crops_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.quality_crops, quality_crops_items_vanilla, 4, 3) + +animal_items_vanilla = [large_milk, large_brown_egg, large_egg, large_goat_milk, wool, duck_egg] +animal_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.animal, animal_items_vanilla, 6, 5) + +artisan_items_vanilla = [truffle_oil, cloth, goat_cheese, cheese, honey, jelly, apple, apricot, orange, peach, pomegranate, cherry] +artisan_bundle_vanilla = BundleTemplate(CCRoom.pantry, BundleName.artisan, artisan_items_vanilla, 12, 6) + +pantry_bundles_vanilla = [spring_crops_bundle_vanilla, summer_crops_bundle_vanilla, fall_crops_bundle_vanilla, + quality_crops_bundle_vanilla, animal_bundle_vanilla, artisan_bundle_vanilla] +pantry_vanilla = BundleRoomTemplate(CCRoom.pantry, pantry_bundles_vanilla, 6) + +# Fish Tank +river_fish_items_vanilla = [sunfish, catfish, shad, tiger_trout] +river_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.river_fish, river_fish_items_vanilla, 4, 4) + +lake_fish_items_vanilla = [largemouth_bass, carp, bullhead, sturgeon] +lake_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.lake_fish, lake_fish_items_vanilla, 4, 4) + +ocean_fish_items_vanilla = [sardine, tuna, red_snapper, tilapia] +ocean_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.ocean_fish, ocean_fish_items_vanilla, 4, 4) + +night_fish_items_vanilla = [walleye, bream, eel] +night_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.night_fish, night_fish_items_vanilla, 3, 3) + +crab_pot_items_vanilla = [lobster, crayfish, crab, cockle, mussel, shrimp, snail, periwinkle, oyster, clam] +crab_pot_trash_items = [trash, driftwood, soggy_newspaper, broken_cd, broken_glasses] +crab_pot_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.crab_pot, crab_pot_items_vanilla, 10, 5) + +specialty_fish_items_vanilla = [pufferfish, ghostfish, sandfish, woodskip] +specialty_fish_bundle_vanilla = BundleTemplate(CCRoom.fish_tank, BundleName.specialty_fish, specialty_fish_items_vanilla, 4, 4) + +fish_tank_bundles_vanilla = [river_fish_bundle_vanilla, lake_fish_bundle_vanilla, ocean_fish_bundle_vanilla, + night_fish_bundle_vanilla, crab_pot_bundle_vanilla, specialty_fish_bundle_vanilla] +fish_tank_vanilla = BundleRoomTemplate(CCRoom.fish_tank, fish_tank_bundles_vanilla, 6) + +# Boiler Room +blacksmith_items_vanilla = [copper_bar, iron_bar, gold_bar] +blacksmith_bundle_vanilla = BundleTemplate(CCRoom.boiler_room, BundleName.blacksmith, blacksmith_items_vanilla, 3, 3) + +geologist_items_vanilla = [quartz, earth_crystal, frozen_tear, fire_quartz] +geologist_bundle_vanilla = BundleTemplate(CCRoom.boiler_room, BundleName.geologist, geologist_items_vanilla, 4, 4) + +adventurer_items_vanilla = [slime, bat_wing, solar_essence, void_essence] +adventurer_bundle_vanilla = BundleTemplate(CCRoom.boiler_room, BundleName.adventurer, adventurer_items_vanilla, 4, 2) + +boiler_room_bundles_vanilla = [blacksmith_bundle_vanilla, geologist_bundle_vanilla, adventurer_bundle_vanilla] +boiler_room_vanilla = BundleRoomTemplate(CCRoom.boiler_room, boiler_room_bundles_vanilla, 3) + +# Bulletin Board +chef_items_vanilla = [maple_syrup, fiddlehead_fern, truffle, poppy, maki_roll, fried_egg] +chef_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.chef, chef_items_vanilla, 6, 6) + +dye_items_vanilla = [red_mushroom, sea_urchin, sunflower, duck_feather, aquamarine, red_cabbage] +dye_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.dye, dye_items_vanilla, 6, 6) + +field_research_items_vanilla = [purple_mushroom, nautilus_shell, chub, frozen_geode] +field_research_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.field_research, field_research_items_vanilla, 4, 4) + +fodder_items_vanilla = [wheat.as_amount(10), hay.as_amount(10), apple.as_amount(3)] +fodder_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.fodder, fodder_items_vanilla, 3, 3) + +enchanter_items_vanilla = [oak_resin, wine, rabbit_foot, pomegranate] +enchanter_bundle_vanilla = BundleTemplate(CCRoom.bulletin_board, BundleName.enchanter, enchanter_items_vanilla, 4, 4) + +bulletin_board_bundles_vanilla = [chef_bundle_vanilla, dye_bundle_vanilla, field_research_bundle_vanilla, fodder_bundle_vanilla, enchanter_bundle_vanilla] +bulletin_board_vanilla = BundleRoomTemplate(CCRoom.bulletin_board, bulletin_board_bundles_vanilla, 5) + +# Abandoned Joja Mart +missing_bundle_items_vanilla = [wine.as_quality(ArtisanQuality.silver), dinosaur_mayo, prismatic_shard, caviar, + ancient_fruit.as_quality_crop(), void_salmon.as_quality(FishQuality.gold)] +missing_bundle_vanilla = BundleTemplate(CCRoom.abandoned_joja_mart, BundleName.missing_bundle, missing_bundle_items_vanilla, 6, 5) + +abandoned_joja_mart_bundles_vanilla = [missing_bundle_vanilla] +abandoned_joja_mart_vanilla = BundleRoomTemplate(CCRoom.abandoned_joja_mart, abandoned_joja_mart_bundles_vanilla, 1) + + +# Vault +vault_2500_gold = BundleItem.money_bundle(2500) +vault_5000_gold = BundleItem.money_bundle(5000) +vault_10000_gold = BundleItem.money_bundle(10000) +vault_25000_gold = BundleItem.money_bundle(25000) + +vault_2500_bundle = MoneyBundleTemplate(CCRoom.vault, BundleName.money_2500, vault_2500_gold) +vault_5000_bundle = MoneyBundleTemplate(CCRoom.vault, BundleName.money_5000, vault_5000_gold) +vault_10000_bundle = MoneyBundleTemplate(CCRoom.vault, BundleName.money_10000, vault_10000_gold) +vault_25000_bundle = MoneyBundleTemplate(CCRoom.vault, BundleName.money_25000, vault_25000_gold) + +vault_bundles_vanilla = [vault_2500_bundle, vault_5000_bundle, vault_10000_bundle, vault_25000_bundle] +vault_vanilla = BundleRoomTemplate(CCRoom.vault, vault_bundles_vanilla, 4) diff --git a/worlds/stardew_valley/data/fish_pond_data.py b/worlds/stardew_valley/data/fish_pond_data.py index 0afaac5ce775..33eb6db4c364 100644 --- a/worlds/stardew_valley/data/fish_pond_data.py +++ b/worlds/stardew_valley/data/fish_pond_data.py @@ -1,50 +1,50 @@ -from typing import Dict - -from ..strings.animal_product_names import AnimalProduct -from ..strings.artisan_good_names import ArtisanGood -from ..strings.crop_names import Fruit -from ..strings.fish_names import Fish, WaterItem -from ..strings.food_names import Meal -from ..strings.forageable_names import Forageable -from ..strings.metal_names import Mineral, Ore -from ..strings.monster_drop_names import Loot -from ..strings.seed_names import Seed - -# Some of these are commented out, because they shouldn't be used, because they cause a loop on themselves, even if the loop is one of many ways to complete the quest -# I don't know the correct architectural way to fix this. So in the meantime, obtaining these items from fish ponds is not in logic - -# Dictionary of fish pond requests, in the format of Dict[fish_name, Dict[population, Dict[item_name, item_amount]]] -fish_pond_quests: Dict[str, Dict[int, Dict[str, int]]] = { - Fish.blobfish: { - 1: {WaterItem.coral: 3, Mineral.frozen_tear: 2, WaterItem.sea_urchin: 2, }, - 3: {Seed.coffee: 5, ArtisanGood.mayonnaise: 1, Meal.pizza: 1, }, - 5: {Meal.cookie: 1, ArtisanGood.green_tea: 1, ArtisanGood.wine: 1, }, - 7: {Forageable.rainbow_shell: 1, Meal.rice_pudding: 1, }, - }, - # Fish.lava_eel: { - # 1: {Mineral.fire_quartz: 3, }, - # 3: {"Basalt": 1, Mineral.diamond: 2, Artifact.dwarf_scroll_iii: 1, }, - # 5: {Bomb.mega_bomb: 2, }, - # 7: {MetalBar.iridium: 1, }, - # }, - Fish.lionfish: { - 3: {Forageable.ginger: 3, Fruit.pineapple: 1, }, - 5: {Fruit.mango: 1, }, - }, - # Fish.octopus: { - # 3: {WaterItem.coral: 3, ArtisanGood.honey: 1, Fish.oyster: 1, MetalBar.quartz: 3, }, - # 5: {Fossil.dried_starfish: 1, Mineral.emerald: 2, Geode.omni: 2, Mushroom.purple: 2, }, - # 7: {ArtisanGood.green_tea: 1, }, - # }, - # Fish.super_cucumber: { - # 3: {WaterItem.coral: 3, ArtisanGood.honey: 1, Fish.oyster: 1, Trash.driftwood: 3, MetalBar.quartz: 3, }, - # 5: {Fossil.dried_starfish: 1, Mineral.emerald: 2, Geode.omni: 2, Mushroom.purple: 2 }, - # 7: {Mineral.diamond: 1, MetalBar.gold: 3, Ore.iridium: 1, ArtisanGood.jelly: 1, ArtisanGood.pickles: 1, WaterItem.sea_urchin: 2 }, - # }, - Fish.void_salmon: { - 1: {Loot.void_essence: 5, }, - 3: {Loot.bat_wing: 10, }, - 5: {Mineral.diamond: 1, AnimalProduct.void_egg: 1, }, - 7: {Ore.iridium: 1, }, - }, -} +from typing import Dict + +from ..strings.animal_product_names import AnimalProduct +from ..strings.artisan_good_names import ArtisanGood +from ..strings.crop_names import Fruit +from ..strings.fish_names import Fish, WaterItem +from ..strings.food_names import Meal +from ..strings.forageable_names import Forageable +from ..strings.metal_names import Mineral, Ore +from ..strings.monster_drop_names import Loot +from ..strings.seed_names import Seed + +# Some of these are commented out, because they shouldn't be used, because they cause a loop on themselves, even if the loop is one of many ways to complete the quest +# I don't know the correct architectural way to fix this. So in the meantime, obtaining these items from fish ponds is not in logic + +# Dictionary of fish pond requests, in the format of Dict[fish_name, Dict[population, Dict[item_name, item_amount]]] +fish_pond_quests: Dict[str, Dict[int, Dict[str, int]]] = { + Fish.blobfish: { + 1: {WaterItem.coral: 3, Mineral.frozen_tear: 2, WaterItem.sea_urchin: 2, }, + 3: {Seed.coffee: 5, ArtisanGood.mayonnaise: 1, Meal.pizza: 1, }, + 5: {Meal.cookie: 1, ArtisanGood.green_tea: 1, ArtisanGood.wine: 1, }, + 7: {Forageable.rainbow_shell: 1, Meal.rice_pudding: 1, }, + }, + # Fish.lava_eel: { + # 1: {Mineral.fire_quartz: 3, }, + # 3: {"Basalt": 1, Mineral.diamond: 2, Artifact.dwarf_scroll_iii: 1, }, + # 5: {Bomb.mega_bomb: 2, }, + # 7: {MetalBar.iridium: 1, }, + # }, + Fish.lionfish: { + 3: {Forageable.ginger: 3, Fruit.pineapple: 1, }, + 5: {Fruit.mango: 1, }, + }, + # Fish.octopus: { + # 3: {WaterItem.coral: 3, ArtisanGood.honey: 1, Fish.oyster: 1, MetalBar.quartz: 3, }, + # 5: {Fossil.dried_starfish: 1, Mineral.emerald: 2, Geode.omni: 2, Mushroom.purple: 2, }, + # 7: {ArtisanGood.green_tea: 1, }, + # }, + # Fish.super_cucumber: { + # 3: {WaterItem.coral: 3, ArtisanGood.honey: 1, Fish.oyster: 1, Trash.driftwood: 3, MetalBar.quartz: 3, }, + # 5: {Fossil.dried_starfish: 1, Mineral.emerald: 2, Geode.omni: 2, Mushroom.purple: 2 }, + # 7: {Mineral.diamond: 1, MetalBar.gold: 3, Ore.iridium: 1, ArtisanGood.jelly: 1, ArtisanGood.pickles: 1, WaterItem.sea_urchin: 2 }, + # }, + Fish.void_salmon: { + 1: {Loot.void_essence: 5, }, + 3: {Loot.bat_wing: 10, }, + 5: {Mineral.diamond: 1, AnimalProduct.void_egg: 1, }, + 7: {Ore.iridium: 1, }, + }, +} diff --git a/worlds/stardew_valley/data/hats_data.py b/worlds/stardew_valley/data/hats_data.py index 4149121b4033..ce52a48052c4 100644 --- a/worlds/stardew_valley/data/hats_data.py +++ b/worlds/stardew_valley/data/hats_data.py @@ -1,160 +1,160 @@ -from dataclasses import dataclass -from functools import cached_property -from typing import List - -from worlds.stardew_valley.strings.ap_names.ap_option_names import HatsanityOptionName - -hat_clarifier = " (Hat)" - - -@dataclass(frozen=True) -class HatItem: - name: str - difficulty: frozenset[str] - need_clarifier: bool = False - - def __post_init__(self): - all_hats.append(self) - - @cached_property - def clarified_name(self) -> str: - if self.need_clarifier: - return self.name + hat_clarifier - return self.name - - def __repr__(self) -> str: - return f"{self.name} (Difficulty: {self.difficulty})" - - -def create_hat(name: str, difficulty: List[str] | str, need_clarifier: bool = False) -> HatItem: - if isinstance(difficulty, str): - difficulty = [difficulty] - return HatItem(name, frozenset(difficulty), need_clarifier) - - -all_hats: list[HatItem] = [] - - -class Hats: - abigails_bow = create_hat("Abigail's Bow", HatsanityOptionName.rng) - arcane_hat = create_hat("Arcane Hat", HatsanityOptionName.near_perfection) - archers_cap = create_hat("Archer's Cap", HatsanityOptionName.near_perfection) - beanie = create_hat("Beanie", HatsanityOptionName.tailoring) - blobfish_mask = create_hat("Blobfish Mask", HatsanityOptionName.tailoring) - blue_bonnet = create_hat("Blue Bonnet", HatsanityOptionName.medium) - blue_bow = create_hat("Blue Bow", HatsanityOptionName.easy) - blue_cowboy_hat = create_hat("Blue Cowboy Hat", HatsanityOptionName.rng) - blue_ribbon = create_hat("Blue Ribbon", HatsanityOptionName.medium) - bluebird_mask = create_hat("Bluebird Mask", HatsanityOptionName.medium) - bowler = create_hat("Bowler Hat", HatsanityOptionName.difficult) - bridal_veil = create_hat("Bridal Veil", HatsanityOptionName.tailoring) - bucket_hat = create_hat("Bucket Hat", HatsanityOptionName.medium) - butterfly_bow = create_hat("Butterfly Bow", HatsanityOptionName.easy) - cat_ears = create_hat("Cat Ears", HatsanityOptionName.medium) - chef_hat = create_hat("Chef Hat", HatsanityOptionName.near_perfection) - chicken_mask = create_hat("Chicken Mask", HatsanityOptionName.near_perfection) - concerned_ape_mask = create_hat("???", HatsanityOptionName.post_perfection) - cone_hat = create_hat("Cone Hat", HatsanityOptionName.easy) - cool_cap = create_hat("Cool Cap", HatsanityOptionName.medium) - copper_pan_hat = create_hat("Copper Pan", HatsanityOptionName.easy, need_clarifier=True) - cowboy = create_hat("Cowboy Hat", HatsanityOptionName.near_perfection) - cowgal_hat = create_hat("Cowgal Hat", HatsanityOptionName.difficult) - cowpoke_hat = create_hat("Cowpoke Hat", HatsanityOptionName.difficult) - daisy = create_hat("Daisy", HatsanityOptionName.easy) - dark_ballcap = create_hat("Dark Ballcap", HatsanityOptionName.rng) - dark_cowboy_hat = create_hat("Dark Cowboy Hat", HatsanityOptionName.rng) - dark_velvet_bow = create_hat("Dark Velvet Bow", HatsanityOptionName.easy) - delicate_bow = create_hat("Delicate Bow", HatsanityOptionName.easy) - deluxe_cowboy_hat = create_hat("Deluxe Cowboy Hat", HatsanityOptionName.medium) - deluxe_pirate_hat = create_hat("Deluxe Pirate Hat", HatsanityOptionName.rng) - dinosaur_hat = create_hat("Dinosaur Hat", HatsanityOptionName.tailoring) - earmuffs = create_hat("Earmuffs", HatsanityOptionName.medium) - elegant_turban = create_hat("Elegant Turban", HatsanityOptionName.post_perfection) - emilys_magic_hat = create_hat("Emily's Magic Hat", HatsanityOptionName.medium) - eye_patch = create_hat("Eye Patch", HatsanityOptionName.near_perfection) - fashion_hat = create_hat("Fashion Hat", HatsanityOptionName.tailoring) - fedora = create_hat("Fedora", HatsanityOptionName.easy) - fishing_hat = create_hat("Fishing Hat", HatsanityOptionName.tailoring) - flat_topped_hat = create_hat("Flat Topped Hat", HatsanityOptionName.tailoring) - floppy_beanie = create_hat("Floppy Beanie", HatsanityOptionName.tailoring) - foragers_hat = create_hat("Forager's Hat", HatsanityOptionName.tailoring) - frog_hat = create_hat("Frog Hat", HatsanityOptionName.medium) - garbage_hat = create_hat("Garbage Hat", HatsanityOptionName.rng) - gils_hat = create_hat("Gil's Hat", HatsanityOptionName.difficult) - gnomes_cap = create_hat("Gnome's Cap", HatsanityOptionName.near_perfection) - goblin_mask = create_hat("Goblin Mask", HatsanityOptionName.near_perfection) - goggles = create_hat("Goggles", HatsanityOptionName.tailoring) - gold_pan_hat = create_hat("Gold Pan", HatsanityOptionName.easy, need_clarifier=True) - golden_helmet = create_hat("Golden Helmet", HatsanityOptionName.rng) - golden_mask = create_hat("Golden Mask", HatsanityOptionName.tailoring, need_clarifier=True) - good_ol_cap = create_hat("Good Ol' Cap", HatsanityOptionName.easy) - governors_hat = create_hat("Governor's Hat", HatsanityOptionName.medium) - green_turban = create_hat("Green Turban", HatsanityOptionName.medium) - hair_bone = create_hat("Hair Bone", HatsanityOptionName.tailoring) - hard_hat = create_hat("Hard Hat", HatsanityOptionName.difficult) - hunters_cap = create_hat("Hunter's Cap", HatsanityOptionName.medium) - infinity_crown = create_hat("Infinity Crown", HatsanityOptionName.difficult) - iridium_pan_hat = create_hat("Iridium Pan", HatsanityOptionName.easy, need_clarifier=True) - jester_hat = create_hat("Jester Hat", HatsanityOptionName.easy) - joja_cap = create_hat("Joja Cap", HatsanityOptionName.rng) - junimo_hat = create_hat("Junimo Hat", HatsanityOptionName.post_perfection) - knights_helmet = create_hat("Knight's Helmet", HatsanityOptionName.near_perfection) - laurel_wreath_crown = create_hat("Laurel Wreath Crown", HatsanityOptionName.rng) - leprechaun_hat = create_hat("Leprechaun Hat", HatsanityOptionName.easy) - living_hat = create_hat("Living Hat", HatsanityOptionName.rng) - logo_cap = create_hat("Logo Cap", HatsanityOptionName.tailoring) - lucky_bow = create_hat("Lucky Bow", HatsanityOptionName.medium) - magic_cowboy_hat = create_hat("Magic Cowboy Hat", HatsanityOptionName.difficult) - magic_turban = create_hat("Magic Turban", HatsanityOptionName.difficult) - mouse_ears = create_hat("Mouse Ears", HatsanityOptionName.easy) - mr_qis_hat = create_hat("Mr. Qi's Hat", HatsanityOptionName.medium) - mummy_mask = create_hat("Mummy Mask", HatsanityOptionName.easy) - mushroom_cap = create_hat("Mushroom Cap", HatsanityOptionName.rng) - mystery_hat = create_hat("Mystery Hat", HatsanityOptionName.rng) - official_cap = create_hat("Official Cap", HatsanityOptionName.medium) - pageboy_cap = create_hat("Pageboy Cap", HatsanityOptionName.near_perfection) - panda_hat = create_hat("Panda Hat", "Impossible") - paper_hat = create_hat("Paper Hat", HatsanityOptionName.easy) - party_hat_blue = create_hat("Party Hat (Blue)", HatsanityOptionName.tailoring) - party_hat_green = create_hat("Party Hat (Green)", HatsanityOptionName.tailoring) - party_hat_red = create_hat("Party Hat (Red)", HatsanityOptionName.tailoring) - pink_bow = create_hat("Pink Bow", HatsanityOptionName.easy) - pirate_hat = create_hat("Pirate Hat", HatsanityOptionName.tailoring) - plum_chapeau = create_hat("Plum Chapeau", HatsanityOptionName.difficult) - polka_bow = create_hat("Polka Bow", HatsanityOptionName.medium) - propeller_hat = create_hat("Propeller Hat", HatsanityOptionName.tailoring) - pumpkin_mask = create_hat("Pumpkin Mask", HatsanityOptionName.tailoring) - qi_mask = create_hat("Qi Mask", HatsanityOptionName.tailoring) - raccoon_hat = create_hat("Raccoon Hat", HatsanityOptionName.medium) - radioactive_goggles = create_hat("Radioactive Goggles", HatsanityOptionName.tailoring) - red_cowboy_hat = create_hat("Red Cowboy Hat", HatsanityOptionName.rng) - red_fez = create_hat("Red Fez", HatsanityOptionName.medium) - sailors_cap = create_hat("Sailor's Cap", HatsanityOptionName.easy) - santa_hat = create_hat("Santa Hat", HatsanityOptionName.medium) - skeleton_mask = create_hat("Skeleton Mask", HatsanityOptionName.medium) - small_cap = create_hat("Small Cap", HatsanityOptionName.medium) - sombrero = create_hat("Sombrero", HatsanityOptionName.near_perfection) - souwester = create_hat("Sou'wester", HatsanityOptionName.easy) - space_helmet = create_hat("Space Helmet", HatsanityOptionName.difficult) - sports_cap = create_hat("Sports Cap", HatsanityOptionName.medium) - spotted_headscarf = create_hat("Spotted Headscarf", HatsanityOptionName.tailoring) - squid_hat = create_hat("Squid Hat", HatsanityOptionName.medium) - squires_helmet = create_hat("Squire's Helmet", HatsanityOptionName.rng) - star_helmet = create_hat("Star Helmet", HatsanityOptionName.tailoring) - steel_pan_hat = create_hat("Steel Pan", HatsanityOptionName.easy, need_clarifier=True) - straw = create_hat("Straw Hat", HatsanityOptionName.medium) - sunglasses = create_hat("Sunglasses", HatsanityOptionName.tailoring) - swashbuckler_hat = create_hat("Swashbuckler Hat", HatsanityOptionName.tailoring) - tiara = create_hat("Tiara", HatsanityOptionName.easy) - tiger_hat = create_hat("Tiger Hat", HatsanityOptionName.rng) - top_hat = create_hat("Top Hat", HatsanityOptionName.easy) - totem_mask = create_hat("Totem Mask", HatsanityOptionName.tailoring) - tricorn = create_hat("Tricorn Hat", HatsanityOptionName.rng) - tropiclip = create_hat("Tropiclip", HatsanityOptionName.easy) - trucker_hat = create_hat("Trucker Hat", HatsanityOptionName.medium) - warrior_helmet = create_hat("Warrior Helmet", HatsanityOptionName.tailoring) - watermelon_band = create_hat("Watermelon Band", HatsanityOptionName.difficult) - wearable_dwarf_helm = create_hat("Wearable Dwarf Helm", HatsanityOptionName.tailoring) - white_bow = create_hat("White Bow", HatsanityOptionName.difficult) - white_turban = create_hat("White Turban", HatsanityOptionName.tailoring) - witch_hat = create_hat("Witch Hat", HatsanityOptionName.tailoring) +from dataclasses import dataclass +from functools import cached_property +from typing import List + +from worlds.stardew_valley.strings.ap_names.ap_option_names import HatsanityOptionName + +hat_clarifier = " (Hat)" + + +@dataclass(frozen=True) +class HatItem: + name: str + difficulty: frozenset[str] + need_clarifier: bool = False + + def __post_init__(self): + all_hats.append(self) + + @cached_property + def clarified_name(self) -> str: + if self.need_clarifier: + return self.name + hat_clarifier + return self.name + + def __repr__(self) -> str: + return f"{self.name} (Difficulty: {self.difficulty})" + + +def create_hat(name: str, difficulty: List[str] | str, need_clarifier: bool = False) -> HatItem: + if isinstance(difficulty, str): + difficulty = [difficulty] + return HatItem(name, frozenset(difficulty), need_clarifier) + + +all_hats: list[HatItem] = [] + + +class Hats: + abigails_bow = create_hat("Abigail's Bow", HatsanityOptionName.rng) + arcane_hat = create_hat("Arcane Hat", HatsanityOptionName.near_perfection) + archers_cap = create_hat("Archer's Cap", HatsanityOptionName.near_perfection) + beanie = create_hat("Beanie", HatsanityOptionName.tailoring) + blobfish_mask = create_hat("Blobfish Mask", HatsanityOptionName.tailoring) + blue_bonnet = create_hat("Blue Bonnet", HatsanityOptionName.medium) + blue_bow = create_hat("Blue Bow", HatsanityOptionName.easy) + blue_cowboy_hat = create_hat("Blue Cowboy Hat", HatsanityOptionName.rng) + blue_ribbon = create_hat("Blue Ribbon", HatsanityOptionName.medium) + bluebird_mask = create_hat("Bluebird Mask", HatsanityOptionName.medium) + bowler = create_hat("Bowler Hat", HatsanityOptionName.difficult) + bridal_veil = create_hat("Bridal Veil", HatsanityOptionName.tailoring) + bucket_hat = create_hat("Bucket Hat", HatsanityOptionName.medium) + butterfly_bow = create_hat("Butterfly Bow", HatsanityOptionName.easy) + cat_ears = create_hat("Cat Ears", HatsanityOptionName.medium) + chef_hat = create_hat("Chef Hat", HatsanityOptionName.near_perfection) + chicken_mask = create_hat("Chicken Mask", HatsanityOptionName.near_perfection) + concerned_ape_mask = create_hat("???", HatsanityOptionName.post_perfection) + cone_hat = create_hat("Cone Hat", HatsanityOptionName.easy) + cool_cap = create_hat("Cool Cap", HatsanityOptionName.medium) + copper_pan_hat = create_hat("Copper Pan", HatsanityOptionName.easy, need_clarifier=True) + cowboy = create_hat("Cowboy Hat", HatsanityOptionName.near_perfection) + cowgal_hat = create_hat("Cowgal Hat", HatsanityOptionName.difficult) + cowpoke_hat = create_hat("Cowpoke Hat", HatsanityOptionName.difficult) + daisy = create_hat("Daisy", HatsanityOptionName.easy) + dark_ballcap = create_hat("Dark Ballcap", HatsanityOptionName.rng) + dark_cowboy_hat = create_hat("Dark Cowboy Hat", HatsanityOptionName.rng) + dark_velvet_bow = create_hat("Dark Velvet Bow", HatsanityOptionName.easy) + delicate_bow = create_hat("Delicate Bow", HatsanityOptionName.easy) + deluxe_cowboy_hat = create_hat("Deluxe Cowboy Hat", HatsanityOptionName.medium) + deluxe_pirate_hat = create_hat("Deluxe Pirate Hat", HatsanityOptionName.rng) + dinosaur_hat = create_hat("Dinosaur Hat", HatsanityOptionName.tailoring) + earmuffs = create_hat("Earmuffs", HatsanityOptionName.medium) + elegant_turban = create_hat("Elegant Turban", HatsanityOptionName.post_perfection) + emilys_magic_hat = create_hat("Emily's Magic Hat", HatsanityOptionName.medium) + eye_patch = create_hat("Eye Patch", HatsanityOptionName.near_perfection) + fashion_hat = create_hat("Fashion Hat", HatsanityOptionName.tailoring) + fedora = create_hat("Fedora", HatsanityOptionName.easy) + fishing_hat = create_hat("Fishing Hat", HatsanityOptionName.tailoring) + flat_topped_hat = create_hat("Flat Topped Hat", HatsanityOptionName.tailoring) + floppy_beanie = create_hat("Floppy Beanie", HatsanityOptionName.tailoring) + foragers_hat = create_hat("Forager's Hat", HatsanityOptionName.tailoring) + frog_hat = create_hat("Frog Hat", HatsanityOptionName.medium) + garbage_hat = create_hat("Garbage Hat", HatsanityOptionName.rng) + gils_hat = create_hat("Gil's Hat", HatsanityOptionName.difficult) + gnomes_cap = create_hat("Gnome's Cap", HatsanityOptionName.near_perfection) + goblin_mask = create_hat("Goblin Mask", HatsanityOptionName.near_perfection) + goggles = create_hat("Goggles", HatsanityOptionName.tailoring) + gold_pan_hat = create_hat("Gold Pan", HatsanityOptionName.easy, need_clarifier=True) + golden_helmet = create_hat("Golden Helmet", HatsanityOptionName.rng) + golden_mask = create_hat("Golden Mask", HatsanityOptionName.tailoring, need_clarifier=True) + good_ol_cap = create_hat("Good Ol' Cap", HatsanityOptionName.easy) + governors_hat = create_hat("Governor's Hat", HatsanityOptionName.medium) + green_turban = create_hat("Green Turban", HatsanityOptionName.medium) + hair_bone = create_hat("Hair Bone", HatsanityOptionName.tailoring) + hard_hat = create_hat("Hard Hat", HatsanityOptionName.difficult) + hunters_cap = create_hat("Hunter's Cap", HatsanityOptionName.medium) + infinity_crown = create_hat("Infinity Crown", HatsanityOptionName.difficult) + iridium_pan_hat = create_hat("Iridium Pan", HatsanityOptionName.easy, need_clarifier=True) + jester_hat = create_hat("Jester Hat", HatsanityOptionName.easy) + joja_cap = create_hat("Joja Cap", HatsanityOptionName.rng) + junimo_hat = create_hat("Junimo Hat", HatsanityOptionName.post_perfection) + knights_helmet = create_hat("Knight's Helmet", HatsanityOptionName.near_perfection) + laurel_wreath_crown = create_hat("Laurel Wreath Crown", HatsanityOptionName.rng) + leprechaun_hat = create_hat("Leprechaun Hat", HatsanityOptionName.easy) + living_hat = create_hat("Living Hat", HatsanityOptionName.rng) + logo_cap = create_hat("Logo Cap", HatsanityOptionName.tailoring) + lucky_bow = create_hat("Lucky Bow", HatsanityOptionName.medium) + magic_cowboy_hat = create_hat("Magic Cowboy Hat", HatsanityOptionName.difficult) + magic_turban = create_hat("Magic Turban", HatsanityOptionName.difficult) + mouse_ears = create_hat("Mouse Ears", HatsanityOptionName.easy) + mr_qis_hat = create_hat("Mr. Qi's Hat", HatsanityOptionName.medium) + mummy_mask = create_hat("Mummy Mask", HatsanityOptionName.easy) + mushroom_cap = create_hat("Mushroom Cap", HatsanityOptionName.rng) + mystery_hat = create_hat("Mystery Hat", HatsanityOptionName.rng) + official_cap = create_hat("Official Cap", HatsanityOptionName.medium) + pageboy_cap = create_hat("Pageboy Cap", HatsanityOptionName.near_perfection) + panda_hat = create_hat("Panda Hat", "Impossible") + paper_hat = create_hat("Paper Hat", HatsanityOptionName.easy) + party_hat_blue = create_hat("Party Hat (Blue)", HatsanityOptionName.tailoring) + party_hat_green = create_hat("Party Hat (Green)", HatsanityOptionName.tailoring) + party_hat_red = create_hat("Party Hat (Red)", HatsanityOptionName.tailoring) + pink_bow = create_hat("Pink Bow", HatsanityOptionName.easy) + pirate_hat = create_hat("Pirate Hat", HatsanityOptionName.tailoring) + plum_chapeau = create_hat("Plum Chapeau", HatsanityOptionName.difficult) + polka_bow = create_hat("Polka Bow", HatsanityOptionName.medium) + propeller_hat = create_hat("Propeller Hat", HatsanityOptionName.tailoring) + pumpkin_mask = create_hat("Pumpkin Mask", HatsanityOptionName.tailoring) + qi_mask = create_hat("Qi Mask", HatsanityOptionName.tailoring) + raccoon_hat = create_hat("Raccoon Hat", HatsanityOptionName.medium) + radioactive_goggles = create_hat("Radioactive Goggles", HatsanityOptionName.tailoring) + red_cowboy_hat = create_hat("Red Cowboy Hat", HatsanityOptionName.rng) + red_fez = create_hat("Red Fez", HatsanityOptionName.medium) + sailors_cap = create_hat("Sailor's Cap", HatsanityOptionName.easy) + santa_hat = create_hat("Santa Hat", HatsanityOptionName.medium) + skeleton_mask = create_hat("Skeleton Mask", HatsanityOptionName.medium) + small_cap = create_hat("Small Cap", HatsanityOptionName.medium) + sombrero = create_hat("Sombrero", HatsanityOptionName.near_perfection) + souwester = create_hat("Sou'wester", HatsanityOptionName.easy) + space_helmet = create_hat("Space Helmet", HatsanityOptionName.difficult) + sports_cap = create_hat("Sports Cap", HatsanityOptionName.medium) + spotted_headscarf = create_hat("Spotted Headscarf", HatsanityOptionName.tailoring) + squid_hat = create_hat("Squid Hat", HatsanityOptionName.medium) + squires_helmet = create_hat("Squire's Helmet", HatsanityOptionName.rng) + star_helmet = create_hat("Star Helmet", HatsanityOptionName.tailoring) + steel_pan_hat = create_hat("Steel Pan", HatsanityOptionName.easy, need_clarifier=True) + straw = create_hat("Straw Hat", HatsanityOptionName.medium) + sunglasses = create_hat("Sunglasses", HatsanityOptionName.tailoring) + swashbuckler_hat = create_hat("Swashbuckler Hat", HatsanityOptionName.tailoring) + tiara = create_hat("Tiara", HatsanityOptionName.easy) + tiger_hat = create_hat("Tiger Hat", HatsanityOptionName.rng) + top_hat = create_hat("Top Hat", HatsanityOptionName.easy) + totem_mask = create_hat("Totem Mask", HatsanityOptionName.tailoring) + tricorn = create_hat("Tricorn Hat", HatsanityOptionName.rng) + tropiclip = create_hat("Tropiclip", HatsanityOptionName.easy) + trucker_hat = create_hat("Trucker Hat", HatsanityOptionName.medium) + warrior_helmet = create_hat("Warrior Helmet", HatsanityOptionName.tailoring) + watermelon_band = create_hat("Watermelon Band", HatsanityOptionName.difficult) + wearable_dwarf_helm = create_hat("Wearable Dwarf Helm", HatsanityOptionName.tailoring) + white_bow = create_hat("White Bow", HatsanityOptionName.difficult) + white_turban = create_hat("White Turban", HatsanityOptionName.tailoring) + witch_hat = create_hat("Witch Hat", HatsanityOptionName.tailoring) diff --git a/worlds/stardew_valley/data/secret_note_data.py b/worlds/stardew_valley/data/secret_note_data.py index 410dd2579d28..61f3d28b4cc1 100644 --- a/worlds/stardew_valley/data/secret_note_data.py +++ b/worlds/stardew_valley/data/secret_note_data.py @@ -1,76 +1,76 @@ -from dataclasses import dataclass -from typing import Tuple, Dict, List - -from ..strings.animal_product_names import AnimalProduct -from ..strings.artisan_good_names import ArtisanGood -from ..strings.crop_names import Vegetable, Fruit -from ..strings.flower_names import Flower -from ..strings.food_names import Meal, Beverage -from ..strings.forageable_names import Forageable -from ..strings.metal_names import Mineral, MetalBar -from ..strings.villager_names import NPC - - -class SecretNote: - note_1 = "Secret Note #1: A Page From Abigail's Diary" - note_2 = "Secret Note #2: Sam's Holiday Shopping List" - note_3 = "Secret Note #3: Leah's Perfect Dinner" - note_4 = "Secret Note #4: Maru's Greatest Invention Yet" - note_5 = "Secret Note #5: Penny gets everyone something they love" - note_6 = "Secret Note #6: Stardrop Saloon Special Orders" - note_7 = "Secret Note #7: Older Bachelors In Town" - note_8 = "Secret Note #8: To Haley And Emily" - note_9 = "Secret Note #9: Alex's Strength Training Diet" - note_10 = "Secret Note #10: Cryptic Note" - note_11 = "Secret Note #11: Marnie's Memory" - note_12 = "Secret Note #12: Good Things In Garbage Cans" - note_13 = "Secret Note #13: Junimo Plush" - note_14 = "Secret Note #14: Stone Junimo" - note_15 = "Secret Note #15: Mermaid Show" - note_16 = "Secret Note #16: Treasure Chest" - note_17 = "Secret Note #17: Green Strange Doll" - note_18 = "Secret Note #18: Yellow Strange Doll" - note_19_part_1 = "Secret Note #19: Solid Gold Lewis" - note_19_part_2 = "Secret Note #19: In Town For All To See" - note_20 = "Secret Note #20: Special Charm" - note_21 = "Secret Note #21: A Date In Nature" - note_22 = "Secret Note #22: The Mysterious Qi" - note_23 = "Secret Note #23: Strange Note" - note_24 = "Secret Note #24: M. Jasper's Book On Junimos" - note_25 = "Secret Note #25: Ornate Necklace" - note_26 = "Secret Note #26: Ancient Farming Secrets" - note_27 = "Secret Note #27: A Compendium Of My Greatest Discoveries" - - -@dataclass(frozen=True) -class RequiredGifts: - npc: str - gifts: Tuple[str, ...] - - -gift_requirements: Dict[str, List[RequiredGifts]] = { - SecretNote.note_1: [RequiredGifts(NPC.abigail, (Vegetable.pumpkin, Mineral.amethyst, Meal.chocolate_cake, Meal.spicy_eel, Meal.blackberry_cobbler,)), ], - SecretNote.note_2: [RequiredGifts(NPC.sebastian, (Mineral.frozen_tear, Meal.sashimi,)), - RequiredGifts(NPC.penny, (Mineral.emerald, Flower.poppy,)), - RequiredGifts(NPC.vincent, (Fruit.grape, Meal.cranberry_candy,)), - RequiredGifts(NPC.jodi, (Meal.crispy_bass, Meal.pancakes,)), - RequiredGifts(NPC.kent, (Meal.fiddlehead_risotto, Meal.roasted_hazelnuts,)), - RequiredGifts(NPC.sam, (Forageable.cactus_fruit, Meal.maple_bar, Meal.pizza,)), ], - SecretNote.note_3: [RequiredGifts(NPC.leah, (Meal.salad, ArtisanGood.goat_cheese, AnimalProduct.truffle, ArtisanGood.wine,)), ], - SecretNote.note_4: [RequiredGifts(NPC.maru, (MetalBar.gold, MetalBar.iridium, ArtisanGood.battery_pack, Mineral.diamond, Fruit.strawberry,)), ], - SecretNote.note_5: [RequiredGifts(NPC.pam, (Vegetable.parsnip, Meal.glazed_yams,)), - RequiredGifts(NPC.jas, (Flower.fairy_rose, Meal.plum_pudding,)), - RequiredGifts(NPC.vincent, (Meal.pink_cake, Fruit.grape,)), - RequiredGifts(NPC.george, (Forageable.leek, Meal.fried_mushroom,)), - RequiredGifts(NPC.evelyn, (Vegetable.beet, Flower.tulip,)), ], - SecretNote.note_6: [RequiredGifts(NPC.lewis, (Meal.autumn_bounty,)), - RequiredGifts(NPC.marnie, (Meal.pumpkin_pie,)), - RequiredGifts(NPC.demetrius, (Meal.bean_hotpot,)), - RequiredGifts(NPC.caroline, (Meal.fish_taco,)), ], - SecretNote.note_7: [RequiredGifts(NPC.harvey, (Beverage.coffee, ArtisanGood.pickles,)), - RequiredGifts(NPC.elliott, (Meal.crab_cakes, Fruit.pomegranate,)), - RequiredGifts(NPC.shane, (Beverage.beer, Meal.pizza, Meal.pepper_poppers,)), ], - SecretNote.note_8: [RequiredGifts(NPC.haley, (Meal.pink_cake, Flower.sunflower,)), - RequiredGifts(NPC.emily, (Mineral.amethyst, Mineral.aquamarine, Mineral.emerald, Mineral.jade, Mineral.ruby, Mineral.topaz, AnimalProduct.wool,)), ], - SecretNote.note_9: [RequiredGifts(NPC.alex, (Meal.complete_breakfast, Meal.salmon_dinner,)), ], -} +from dataclasses import dataclass +from typing import Tuple, Dict, List + +from ..strings.animal_product_names import AnimalProduct +from ..strings.artisan_good_names import ArtisanGood +from ..strings.crop_names import Vegetable, Fruit +from ..strings.flower_names import Flower +from ..strings.food_names import Meal, Beverage +from ..strings.forageable_names import Forageable +from ..strings.metal_names import Mineral, MetalBar +from ..strings.villager_names import NPC + + +class SecretNote: + note_1 = "Secret Note #1: A Page From Abigail's Diary" + note_2 = "Secret Note #2: Sam's Holiday Shopping List" + note_3 = "Secret Note #3: Leah's Perfect Dinner" + note_4 = "Secret Note #4: Maru's Greatest Invention Yet" + note_5 = "Secret Note #5: Penny gets everyone something they love" + note_6 = "Secret Note #6: Stardrop Saloon Special Orders" + note_7 = "Secret Note #7: Older Bachelors In Town" + note_8 = "Secret Note #8: To Haley And Emily" + note_9 = "Secret Note #9: Alex's Strength Training Diet" + note_10 = "Secret Note #10: Cryptic Note" + note_11 = "Secret Note #11: Marnie's Memory" + note_12 = "Secret Note #12: Good Things In Garbage Cans" + note_13 = "Secret Note #13: Junimo Plush" + note_14 = "Secret Note #14: Stone Junimo" + note_15 = "Secret Note #15: Mermaid Show" + note_16 = "Secret Note #16: Treasure Chest" + note_17 = "Secret Note #17: Green Strange Doll" + note_18 = "Secret Note #18: Yellow Strange Doll" + note_19_part_1 = "Secret Note #19: Solid Gold Lewis" + note_19_part_2 = "Secret Note #19: In Town For All To See" + note_20 = "Secret Note #20: Special Charm" + note_21 = "Secret Note #21: A Date In Nature" + note_22 = "Secret Note #22: The Mysterious Qi" + note_23 = "Secret Note #23: Strange Note" + note_24 = "Secret Note #24: M. Jasper's Book On Junimos" + note_25 = "Secret Note #25: Ornate Necklace" + note_26 = "Secret Note #26: Ancient Farming Secrets" + note_27 = "Secret Note #27: A Compendium Of My Greatest Discoveries" + + +@dataclass(frozen=True) +class RequiredGifts: + npc: str + gifts: Tuple[str, ...] + + +gift_requirements: Dict[str, List[RequiredGifts]] = { + SecretNote.note_1: [RequiredGifts(NPC.abigail, (Vegetable.pumpkin, Mineral.amethyst, Meal.chocolate_cake, Meal.spicy_eel, Meal.blackberry_cobbler,)), ], + SecretNote.note_2: [RequiredGifts(NPC.sebastian, (Mineral.frozen_tear, Meal.sashimi,)), + RequiredGifts(NPC.penny, (Mineral.emerald, Flower.poppy,)), + RequiredGifts(NPC.vincent, (Fruit.grape, Meal.cranberry_candy,)), + RequiredGifts(NPC.jodi, (Meal.crispy_bass, Meal.pancakes,)), + RequiredGifts(NPC.kent, (Meal.fiddlehead_risotto, Meal.roasted_hazelnuts,)), + RequiredGifts(NPC.sam, (Forageable.cactus_fruit, Meal.maple_bar, Meal.pizza,)), ], + SecretNote.note_3: [RequiredGifts(NPC.leah, (Meal.salad, ArtisanGood.goat_cheese, AnimalProduct.truffle, ArtisanGood.wine,)), ], + SecretNote.note_4: [RequiredGifts(NPC.maru, (MetalBar.gold, MetalBar.iridium, ArtisanGood.battery_pack, Mineral.diamond, Fruit.strawberry,)), ], + SecretNote.note_5: [RequiredGifts(NPC.pam, (Vegetable.parsnip, Meal.glazed_yams,)), + RequiredGifts(NPC.jas, (Flower.fairy_rose, Meal.plum_pudding,)), + RequiredGifts(NPC.vincent, (Meal.pink_cake, Fruit.grape,)), + RequiredGifts(NPC.george, (Forageable.leek, Meal.fried_mushroom,)), + RequiredGifts(NPC.evelyn, (Vegetable.beet, Flower.tulip,)), ], + SecretNote.note_6: [RequiredGifts(NPC.lewis, (Meal.autumn_bounty,)), + RequiredGifts(NPC.marnie, (Meal.pumpkin_pie,)), + RequiredGifts(NPC.demetrius, (Meal.bean_hotpot,)), + RequiredGifts(NPC.caroline, (Meal.fish_taco,)), ], + SecretNote.note_7: [RequiredGifts(NPC.harvey, (Beverage.coffee, ArtisanGood.pickles,)), + RequiredGifts(NPC.elliott, (Meal.crab_cakes, Fruit.pomegranate,)), + RequiredGifts(NPC.shane, (Beverage.beer, Meal.pizza, Meal.pepper_poppers,)), ], + SecretNote.note_8: [RequiredGifts(NPC.haley, (Meal.pink_cake, Flower.sunflower,)), + RequiredGifts(NPC.emily, (Mineral.amethyst, Mineral.aquamarine, Mineral.emerald, Mineral.jade, Mineral.ruby, Mineral.topaz, AnimalProduct.wool,)), ], + SecretNote.note_9: [RequiredGifts(NPC.alex, (Meal.complete_breakfast, Meal.salmon_dinner,)), ], +} diff --git a/worlds/stardew_valley/data/shirt_data.py b/worlds/stardew_valley/data/shirt_data.py index 178ea79456a9..dabcab5ceef3 100644 --- a/worlds/stardew_valley/data/shirt_data.py +++ b/worlds/stardew_valley/data/shirt_data.py @@ -1,33 +1,33 @@ -from typing import List - -from worlds.stardew_valley.strings.animal_product_names import AnimalProduct -from worlds.stardew_valley.strings.forageable_names import Forageable - -all_shirts = [] -all_considered_shirts = [] - - -class Shirt: - name: str - required_items: List[str] - - def __init__(self, name: str, items: List[str]): - self.name = name - self.required_items = items - - -# consider_in_logic exists as a temporary measure because I don't feel like writing out the logic for every single shirt at this stage, -# and I only need some of them for the meme bundle -def shirt(name: str, items: str | List[str], consider_in_logic: bool = True) -> Shirt: - if isinstance(items, str): - items = [items] - new_shirt = Shirt(name, items) - all_shirts.append(new_shirt) - if consider_in_logic: - all_considered_shirts.append(new_shirt) - return new_shirt - - -class Shirts: - vacation = shirt("Vacation Shirt", Forageable.coconut) - green_jacket = shirt("Green Jacket Shirt", AnimalProduct.duck_egg) +from typing import List + +from worlds.stardew_valley.strings.animal_product_names import AnimalProduct +from worlds.stardew_valley.strings.forageable_names import Forageable + +all_shirts = [] +all_considered_shirts = [] + + +class Shirt: + name: str + required_items: List[str] + + def __init__(self, name: str, items: List[str]): + self.name = name + self.required_items = items + + +# consider_in_logic exists as a temporary measure because I don't feel like writing out the logic for every single shirt at this stage, +# and I only need some of them for the meme bundle +def shirt(name: str, items: str | List[str], consider_in_logic: bool = True) -> Shirt: + if isinstance(items, str): + items = [items] + new_shirt = Shirt(name, items) + all_shirts.append(new_shirt) + if consider_in_logic: + all_considered_shirts.append(new_shirt) + return new_shirt + + +class Shirts: + vacation = shirt("Vacation Shirt", Forageable.coconut) + green_jacket = shirt("Green Jacket Shirt", AnimalProduct.duck_egg) diff --git a/worlds/stardew_valley/items/early_items.py b/worlds/stardew_valley/items/early_items.py index 0a0050cf2bdc..a3dd1d069031 100644 --- a/worlds/stardew_valley/items/early_items.py +++ b/worlds/stardew_valley/items/early_items.py @@ -1,97 +1,97 @@ -from random import Random - -from .. import options as stardew_options -from ..content import StardewContent -from ..content.vanilla.ginger_island import ginger_island_content_pack -from ..strings.ap_names.ap_option_names import ChefsanityOptionName, StartWithoutOptionName -from ..strings.ap_names.ap_weapon_names import APWeapon -from ..strings.ap_names.transport_names import Transportation -from ..strings.building_names import Building -from ..strings.region_names import Region -from ..strings.season_names import Season -from ..strings.skill_names import Skill -from ..strings.tv_channel_names import Channel -from ..strings.wallet_item_names import Wallet - -early_candidate_rate = 4 -always_early_candidates = [Region.greenhouse, Transportation.desert_obelisk, Wallet.rusty_key] -seasons = [Season.spring, Season.summer, Season.fall, Season.winter] - - -def setup_early_items(multiworld, options: stardew_options.StardewValleyOptions, content: StardewContent, player: int, random: Random): - early_forced = [] - early_candidates = [] - early_candidates.extend(always_early_candidates) - - add_seasonal_candidates(early_candidates, options) - - if content.features.building_progression.is_progressive: - early_forced.append(Building.shipping_bin) - if Building.coop not in content.features.building_progression.starting_buildings: - early_candidates.append("Progressive Coop") - early_candidates.append("Progressive Barn") - - if options.backpack_progression == stardew_options.BackpackProgression.option_early_progressive: - early_forced.append("Progressive Backpack") - - if content.features.tool_progression.is_progressive: - if content.features.fishsanity.is_enabled: - early_candidates.append("Progressive Fishing Rod") - early_forced.append("Progressive Pickaxe") - - fishing = content.skills.get(Skill.fishing) - if fishing is not None and content.features.skill_progression.is_progressive: - early_forced.append(fishing.level_name) - - if options.quest_locations.has_story_quests(): - early_candidates.append(Wallet.magnifying_glass) - - if options.special_order_locations & stardew_options.SpecialOrderLocations.option_board: - early_candidates.append("Special Order Board") - - if options.cooksanity != stardew_options.Cooksanity.option_none or ChefsanityOptionName.queen_of_sauce in options.chefsanity: - early_candidates.append(Channel.queen_of_sauce) - - if options.craftsanity != stardew_options.Craftsanity.option_none: - early_candidates.append("Furnace Recipe") - - if options.monstersanity == stardew_options.Monstersanity.option_none: - early_candidates.append(APWeapon.weapon) - else: - early_candidates.append(APWeapon.sword) - - if content.is_enabled(ginger_island_content_pack): - early_candidates.append(Transportation.island_obelisk) - early_candidates.append(Transportation.boat_repair) - - if options.walnutsanity.value: - early_candidates.append("Island North Turtle") - early_candidates.append("Island West Turtle") - - if options.museumsanity != stardew_options.Museumsanity.option_none or options.shipsanity >= stardew_options.Shipsanity.option_full_shipment: - early_candidates.append(Wallet.metal_detector) - - if StartWithoutOptionName.landslide in options.start_without: - early_candidates.append("Landslide Removed") - - if StartWithoutOptionName.community_center in options.start_without: - early_candidates.append("Forest Magic") - early_candidates.append("Community Center Key") - early_candidates.append("Wizard Invitation") - - early_forced.extend(random.sample(early_candidates, len(early_candidates) // early_candidate_rate)) - - for item_name in early_forced: - if item_name in multiworld.early_items[player]: - continue - multiworld.early_items[player][item_name] = 1 - - -def add_seasonal_candidates(early_candidates, options): - if options.season_randomization == stardew_options.SeasonRandomization.option_progressive: - early_candidates.extend([Season.progressive] * 3) - return - if options.season_randomization == stardew_options.SeasonRandomization.option_disabled: - return - - early_candidates.extend(seasons) +from random import Random + +from .. import options as stardew_options +from ..content import StardewContent +from ..content.vanilla.ginger_island import ginger_island_content_pack +from ..strings.ap_names.ap_option_names import ChefsanityOptionName, StartWithoutOptionName +from ..strings.ap_names.ap_weapon_names import APWeapon +from ..strings.ap_names.transport_names import Transportation +from ..strings.building_names import Building +from ..strings.region_names import Region +from ..strings.season_names import Season +from ..strings.skill_names import Skill +from ..strings.tv_channel_names import Channel +from ..strings.wallet_item_names import Wallet + +early_candidate_rate = 4 +always_early_candidates = [Region.greenhouse, Transportation.desert_obelisk, Wallet.rusty_key] +seasons = [Season.spring, Season.summer, Season.fall, Season.winter] + + +def setup_early_items(multiworld, options: stardew_options.StardewValleyOptions, content: StardewContent, player: int, random: Random): + early_forced = [] + early_candidates = [] + early_candidates.extend(always_early_candidates) + + add_seasonal_candidates(early_candidates, options) + + if content.features.building_progression.is_progressive: + early_forced.append(Building.shipping_bin) + if Building.coop not in content.features.building_progression.starting_buildings: + early_candidates.append("Progressive Coop") + early_candidates.append("Progressive Barn") + + if options.backpack_progression == stardew_options.BackpackProgression.option_early_progressive: + early_forced.append("Progressive Backpack") + + if content.features.tool_progression.is_progressive: + if content.features.fishsanity.is_enabled: + early_candidates.append("Progressive Fishing Rod") + early_forced.append("Progressive Pickaxe") + + fishing = content.skills.get(Skill.fishing) + if fishing is not None and content.features.skill_progression.is_progressive: + early_forced.append(fishing.level_name) + + if options.quest_locations.has_story_quests(): + early_candidates.append(Wallet.magnifying_glass) + + if options.special_order_locations & stardew_options.SpecialOrderLocations.option_board: + early_candidates.append("Special Order Board") + + if options.cooksanity != stardew_options.Cooksanity.option_none or ChefsanityOptionName.queen_of_sauce in options.chefsanity: + early_candidates.append(Channel.queen_of_sauce) + + if options.craftsanity != stardew_options.Craftsanity.option_none: + early_candidates.append("Furnace Recipe") + + if options.monstersanity == stardew_options.Monstersanity.option_none: + early_candidates.append(APWeapon.weapon) + else: + early_candidates.append(APWeapon.sword) + + if content.is_enabled(ginger_island_content_pack): + early_candidates.append(Transportation.island_obelisk) + early_candidates.append(Transportation.boat_repair) + + if options.walnutsanity.value: + early_candidates.append("Island North Turtle") + early_candidates.append("Island West Turtle") + + if options.museumsanity != stardew_options.Museumsanity.option_none or options.shipsanity >= stardew_options.Shipsanity.option_full_shipment: + early_candidates.append(Wallet.metal_detector) + + if StartWithoutOptionName.landslide in options.start_without: + early_candidates.append("Landslide Removed") + + if StartWithoutOptionName.community_center in options.start_without: + early_candidates.append("Forest Magic") + early_candidates.append("Community Center Key") + early_candidates.append("Wizard Invitation") + + early_forced.extend(random.sample(early_candidates, len(early_candidates) // early_candidate_rate)) + + for item_name in early_forced: + if item_name in multiworld.early_items[player]: + continue + multiworld.early_items[player][item_name] = 1 + + +def add_seasonal_candidates(early_candidates, options): + if options.season_randomization == stardew_options.SeasonRandomization.option_progressive: + early_candidates.extend([Season.progressive] * 3) + return + if options.season_randomization == stardew_options.SeasonRandomization.option_disabled: + return + + early_candidates.extend(seasons) diff --git a/worlds/stardew_valley/items/item_data.py b/worlds/stardew_valley/items/item_data.py index 6fac08a592cf..88ebcda74001 100644 --- a/worlds/stardew_valley/items/item_data.py +++ b/worlds/stardew_valley/items/item_data.py @@ -1,197 +1,197 @@ -from __future__ import annotations - -import csv -import enum -from dataclasses import dataclass, field -from functools import reduce -from typing import Protocol - -from BaseClasses import ItemClassification, Item -from .. import data -from ..content.vanilla.ginger_island import ginger_island_content_pack -from ..logic.logic_event import all_events - -ITEM_CODE_OFFSET = 717000 - - -class StardewItemFactory(Protocol): - def __call__(self, item: str | ItemData, /, *, classification_pre_fill: ItemClassification = None, - classification_post_fill: ItemClassification = None) -> Item: - """ - :param item: The item to create. Can be the name of the item or the item data. - :param classification_pre_fill: The classification to use for the item before the fill. If None, the basic classification of the item is used. - :param classification_post_fill: The classification to use for the item after the fill. If None, the pre_fill classification will be used. - """ - raise NotImplementedError - - -class Group(enum.Enum): - FRIENDSHIP_PACK = enum.auto() - COMMUNITY_REWARD = enum.auto() - TRASH_BEAR = enum.auto() - TRASH = enum.auto() - FOOTWEAR = enum.auto() - WEAPON = enum.auto() - WEAPON_GENERIC = enum.auto() - WEAPON_SWORD = enum.auto() - WEAPON_CLUB = enum.auto() - WEAPON_DAGGER = enum.auto() - WEAPON_SLINGSHOT = enum.auto() - PROGRESSIVE_TOOLS = enum.auto() - SKILL_LEVEL_UP = enum.auto() - SKILL_MASTERY = enum.auto() - BUILDING = enum.auto() - WIZARD_BUILDING = enum.auto() - DESERT_TRANSPORTATION = enum.auto() - ISLAND_TRANSPORTATION = enum.auto() - ARCADE_MACHINE_BUFFS = enum.auto() - BASE_RESOURCE = enum.auto() - WARP_TOTEM = enum.auto() - GEODE = enum.auto() - ORE = enum.auto() - FERTILIZER = enum.auto() - CROPSANITY = enum.auto() - FISHING_RESOURCE = enum.auto() - SEASON = enum.auto() - TRAVELING_MERCHANT_DAY = enum.auto() - MUSEUM = enum.auto() - FRIENDSANITY = enum.auto() - FESTIVAL = enum.auto() - RARECROW = enum.auto() - TRAP = enum.auto() - BONUS = enum.auto() - MAXIMUM_ONE = enum.auto() - AT_LEAST_TWO = enum.auto() - DEPRECATED = enum.auto() - SPECIAL_ORDER_BOARD = enum.auto() - SPECIAL_ORDER_QI = enum.auto() - BABY = enum.auto() - GINGER_ISLAND = enum.auto() - WALNUT_PURCHASE = enum.auto() - TV_CHANNEL = enum.auto() - QI_CRAFTING_RECIPE = enum.auto() - CHEFSANITY = enum.auto() - CHEFSANITY_STARTER = enum.auto() - CHEFSANITY_QOS = enum.auto() - CHEFSANITY_PURCHASE = enum.auto() - CHEFSANITY_FRIENDSHIP = enum.auto() - CHEFSANITY_SKILL = enum.auto() - CRAFTSANITY = enum.auto() - BOOK_POWER = enum.auto() - LOST_BOOK = enum.auto() - PLAYER_BUFF = enum.auto() - EASY_SECRET = enum.auto() - FISHING_SECRET = enum.auto() - SECRET_NOTES_SECRET = enum.auto() - MOVIESANITY = enum.auto() - TRINKET = enum.auto() - EATSANITY_ENZYME = enum.auto() - ENDGAME_LOCATION_ITEMS = enum.auto() - REQUIRES_FRIENDSANITY_MARRIAGE = enum.auto() - BOOKSELLER = enum.auto() - - # Types of filler - FILLER_FARMING = enum.auto() - FILLER_FISHING = enum.auto() - FILLER_FRUIT_TREES = enum.auto() - FILLER_FOOD = enum.auto() - FILLER_BUFF_FOOD = enum.auto() - FILLER_CONSUMABLE = enum.auto() - FILLER_MACHINE = enum.auto() - FILLER_STORAGE = enum.auto() - FILLER_QUALITY_OF_LIFE = enum.auto() - FILLER_MATERIALS = enum.auto() - FILLER_CURRENCY = enum.auto() - FILLER_MONEY = enum.auto() - FILLER_HAT = enum.auto() - FILLER_DECORATION = enum.auto() - FILLER_RING = enum.auto() - - # Mods - MAGIC_SPELL = enum.auto() - MOD_WARP = enum.auto() - - -FILLER_GROUPS = [Group.FILLER_FARMING, Group.FILLER_FISHING, Group.FILLER_FRUIT_TREES, Group.FILLER_FOOD, Group.FILLER_BUFF_FOOD, - Group.FILLER_CONSUMABLE, Group.FILLER_MACHINE, Group.FILLER_STORAGE, Group.FILLER_QUALITY_OF_LIFE, Group.FILLER_MATERIALS, - Group.FILLER_CURRENCY, Group.FILLER_MONEY, Group.FILLER_HAT, Group.FILLER_DECORATION, Group.FILLER_RING, ] - - -@dataclass(frozen=True) -class ItemData: - code_without_offset: int | None - name: str - classification: ItemClassification - content_packs: frozenset[str] = frozenset() - """All the content packs required for this item to be available.""" - groups: set[Group] = field(default_factory=frozenset) - - def __post_init__(self): - if not isinstance(self.groups, frozenset): - super().__setattr__("groups", frozenset(self.groups)) - - @property - def code(self) -> int | None: - return ITEM_CODE_OFFSET + self.code_without_offset if self.code_without_offset is not None else None - - def has_any_group(self, *group: Group) -> bool: - groups = set(group) - return bool(groups.intersection(self.groups)) - - def has_all_groups(self, *group: Group) -> bool: - groups = set(group) - return bool(groups.issubset(self.groups)) - - def has_limited_amount(self) -> bool: - return self.has_any_group(Group.MAXIMUM_ONE, Group.AT_LEAST_TWO) - - -def load_item_csv(): - from importlib.resources import files - - items = [] - with files(data).joinpath("items.csv").open() as file: - item_reader = csv.DictReader(file) - for item in item_reader: - item_id = int(item["id"]) if item["id"] else None - item_name = item["name"] - classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification] for str_classification in item["classification"].split(",")}) - csv_groups = [Group[group] for group in item["groups"].split(",") if group] - groups = set(csv_groups) - csv_content_packs = [cp for cp in item["content_packs"].split(",") if cp] - content_packs = frozenset(csv_content_packs) - - assert len(csv_groups) == len(groups), f"Item '{item_name}' has duplicate groups: {csv_groups}" - assert len(csv_content_packs) == len(content_packs) - - if Group.GINGER_ISLAND in groups: - content_packs |= {ginger_island_content_pack.name} - - items.append(ItemData(item_id, item_name, classification, content_packs, groups)) - return items - - -events = [ - ItemData(None, e, ItemClassification.progression) - for e in sorted(all_events) -] - -all_items: list[ItemData] = load_item_csv() + events -item_table: dict[str, ItemData] = {} -items_by_group: dict[Group, list[ItemData]] = {} - - -def initialize_groups(): - for item in all_items: - for group in item.groups: - item_group = items_by_group.get(group, list()) - item_group.append(item) - items_by_group[group] = item_group - - -def initialize_item_table(): - item_table.update({item.name: item for item in all_items}) - - -initialize_item_table() -initialize_groups() +from __future__ import annotations + +import csv +import enum +from dataclasses import dataclass, field +from functools import reduce +from typing import Protocol + +from BaseClasses import ItemClassification, Item +from .. import data +from ..content.vanilla.ginger_island import ginger_island_content_pack +from ..logic.logic_event import all_events + +ITEM_CODE_OFFSET = 717000 + + +class StardewItemFactory(Protocol): + def __call__(self, item: str | ItemData, /, *, classification_pre_fill: ItemClassification = None, + classification_post_fill: ItemClassification = None) -> Item: + """ + :param item: The item to create. Can be the name of the item or the item data. + :param classification_pre_fill: The classification to use for the item before the fill. If None, the basic classification of the item is used. + :param classification_post_fill: The classification to use for the item after the fill. If None, the pre_fill classification will be used. + """ + raise NotImplementedError + + +class Group(enum.Enum): + FRIENDSHIP_PACK = enum.auto() + COMMUNITY_REWARD = enum.auto() + TRASH_BEAR = enum.auto() + TRASH = enum.auto() + FOOTWEAR = enum.auto() + WEAPON = enum.auto() + WEAPON_GENERIC = enum.auto() + WEAPON_SWORD = enum.auto() + WEAPON_CLUB = enum.auto() + WEAPON_DAGGER = enum.auto() + WEAPON_SLINGSHOT = enum.auto() + PROGRESSIVE_TOOLS = enum.auto() + SKILL_LEVEL_UP = enum.auto() + SKILL_MASTERY = enum.auto() + BUILDING = enum.auto() + WIZARD_BUILDING = enum.auto() + DESERT_TRANSPORTATION = enum.auto() + ISLAND_TRANSPORTATION = enum.auto() + ARCADE_MACHINE_BUFFS = enum.auto() + BASE_RESOURCE = enum.auto() + WARP_TOTEM = enum.auto() + GEODE = enum.auto() + ORE = enum.auto() + FERTILIZER = enum.auto() + CROPSANITY = enum.auto() + FISHING_RESOURCE = enum.auto() + SEASON = enum.auto() + TRAVELING_MERCHANT_DAY = enum.auto() + MUSEUM = enum.auto() + FRIENDSANITY = enum.auto() + FESTIVAL = enum.auto() + RARECROW = enum.auto() + TRAP = enum.auto() + BONUS = enum.auto() + MAXIMUM_ONE = enum.auto() + AT_LEAST_TWO = enum.auto() + DEPRECATED = enum.auto() + SPECIAL_ORDER_BOARD = enum.auto() + SPECIAL_ORDER_QI = enum.auto() + BABY = enum.auto() + GINGER_ISLAND = enum.auto() + WALNUT_PURCHASE = enum.auto() + TV_CHANNEL = enum.auto() + QI_CRAFTING_RECIPE = enum.auto() + CHEFSANITY = enum.auto() + CHEFSANITY_STARTER = enum.auto() + CHEFSANITY_QOS = enum.auto() + CHEFSANITY_PURCHASE = enum.auto() + CHEFSANITY_FRIENDSHIP = enum.auto() + CHEFSANITY_SKILL = enum.auto() + CRAFTSANITY = enum.auto() + BOOK_POWER = enum.auto() + LOST_BOOK = enum.auto() + PLAYER_BUFF = enum.auto() + EASY_SECRET = enum.auto() + FISHING_SECRET = enum.auto() + SECRET_NOTES_SECRET = enum.auto() + MOVIESANITY = enum.auto() + TRINKET = enum.auto() + EATSANITY_ENZYME = enum.auto() + ENDGAME_LOCATION_ITEMS = enum.auto() + REQUIRES_FRIENDSANITY_MARRIAGE = enum.auto() + BOOKSELLER = enum.auto() + + # Types of filler + FILLER_FARMING = enum.auto() + FILLER_FISHING = enum.auto() + FILLER_FRUIT_TREES = enum.auto() + FILLER_FOOD = enum.auto() + FILLER_BUFF_FOOD = enum.auto() + FILLER_CONSUMABLE = enum.auto() + FILLER_MACHINE = enum.auto() + FILLER_STORAGE = enum.auto() + FILLER_QUALITY_OF_LIFE = enum.auto() + FILLER_MATERIALS = enum.auto() + FILLER_CURRENCY = enum.auto() + FILLER_MONEY = enum.auto() + FILLER_HAT = enum.auto() + FILLER_DECORATION = enum.auto() + FILLER_RING = enum.auto() + + # Mods + MAGIC_SPELL = enum.auto() + MOD_WARP = enum.auto() + + +FILLER_GROUPS = [Group.FILLER_FARMING, Group.FILLER_FISHING, Group.FILLER_FRUIT_TREES, Group.FILLER_FOOD, Group.FILLER_BUFF_FOOD, + Group.FILLER_CONSUMABLE, Group.FILLER_MACHINE, Group.FILLER_STORAGE, Group.FILLER_QUALITY_OF_LIFE, Group.FILLER_MATERIALS, + Group.FILLER_CURRENCY, Group.FILLER_MONEY, Group.FILLER_HAT, Group.FILLER_DECORATION, Group.FILLER_RING, ] + + +@dataclass(frozen=True) +class ItemData: + code_without_offset: int | None + name: str + classification: ItemClassification + content_packs: frozenset[str] = frozenset() + """All the content packs required for this item to be available.""" + groups: set[Group] = field(default_factory=frozenset) + + def __post_init__(self): + if not isinstance(self.groups, frozenset): + super().__setattr__("groups", frozenset(self.groups)) + + @property + def code(self) -> int | None: + return ITEM_CODE_OFFSET + self.code_without_offset if self.code_without_offset is not None else None + + def has_any_group(self, *group: Group) -> bool: + groups = set(group) + return bool(groups.intersection(self.groups)) + + def has_all_groups(self, *group: Group) -> bool: + groups = set(group) + return bool(groups.issubset(self.groups)) + + def has_limited_amount(self) -> bool: + return self.has_any_group(Group.MAXIMUM_ONE, Group.AT_LEAST_TWO) + + +def load_item_csv(): + from importlib.resources import files + + items = [] + with files(data).joinpath("items.csv").open() as file: + item_reader = csv.DictReader(file) + for item in item_reader: + item_id = int(item["id"]) if item["id"] else None + item_name = item["name"] + classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification] for str_classification in item["classification"].split(",")}) + csv_groups = [Group[group] for group in item["groups"].split(",") if group] + groups = set(csv_groups) + csv_content_packs = [cp for cp in item["content_packs"].split(",") if cp] + content_packs = frozenset(csv_content_packs) + + assert len(csv_groups) == len(groups), f"Item '{item_name}' has duplicate groups: {csv_groups}" + assert len(csv_content_packs) == len(content_packs) + + if Group.GINGER_ISLAND in groups: + content_packs |= {ginger_island_content_pack.name} + + items.append(ItemData(item_id, item_name, classification, content_packs, groups)) + return items + + +events = [ + ItemData(None, e, ItemClassification.progression) + for e in sorted(all_events) +] + +all_items: list[ItemData] = load_item_csv() + events +item_table: dict[str, ItemData] = {} +items_by_group: dict[Group, list[ItemData]] = {} + + +def initialize_groups(): + for item in all_items: + for group in item.groups: + item_group = items_by_group.get(group, list()) + item_group.append(item) + items_by_group[group] = item_group + + +def initialize_item_table(): + item_table.update({item.name: item for item in all_items}) + + +initialize_item_table() +initialize_groups() diff --git a/worlds/stardew_valley/logic/movie_logic.py b/worlds/stardew_valley/logic/movie_logic.py index c546a65005a4..c30e23823bef 100644 --- a/worlds/stardew_valley/logic/movie_logic.py +++ b/worlds/stardew_valley/logic/movie_logic.py @@ -1,58 +1,58 @@ -from .base_logic import BaseLogicMixin, BaseLogic -from ..data.movies import movies_by_name, npc_snacks, Snack, Movie, snacks_by_name -from ..stardew_rule import StardewRule, Or -from ..strings.villager_names import NPC - - -class MovieLogicMixin(BaseLogicMixin): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.movie = MovieLogic(*args, **kwargs) - - -class MovieLogic(BaseLogic): - - def can_watch_movie(self, movie: str | Movie) -> StardewRule: - if isinstance(movie, str): - movie = movies_by_name[movie] - return self.logic.season.has(movie.season) - - def can_watch_movie_with_loving_npc(self, movie: str | Movie) -> StardewRule: - if isinstance(movie, str): - movie = movies_by_name[movie] - return self.can_watch_movie(movie) & self.logic.relationship.can_meet_any(*movie.loving_npcs) - - def can_invite_to_movie(self, npcs: str | list[str]) -> StardewRule: - if isinstance(npcs, str): - npc = npcs - if npc == NPC.leo: - return self.logic.relationship.has_hearts(NPC.leo, 6) - return self.logic.relationship.can_meet(npc) - return self.logic.or_(*[self.can_invite_to_movie(npc) for npc in npcs]) - - def can_watch_movie_with_loving_npc_and_snack(self, movie: str | Movie) -> StardewRule: - if isinstance(movie, str): - movie = movies_by_name[movie] - potential_partner_rules = [] - for npc in movie.loving_npcs: - meet_rule = self.can_invite_to_movie(npc) - snack_rule = self.can_buy_loved_snack(npc) - potential_partner_rules.append(meet_rule & snack_rule) - return self.can_watch_movie(movie) & Or(*potential_partner_rules) - - def can_buy_loved_snack(self, npc: str) -> StardewRule: - snacks = npc_snacks[npc] - if not snacks: - return self.logic.false_ - snacks_rule = Or(*[self.can_buy_snack(snack) for snack in snacks]) - return snacks_rule - - def can_buy_snack(self, snack: str | Snack) -> StardewRule: - if isinstance(snack, str): - snack = snacks_by_name[snack] - return self.logic.received(snack.category) - - def can_buy_snack_for_someone_who_loves_it(self, snack: str | Snack) -> StardewRule: - if isinstance(snack, str): - snack = snacks_by_name[snack] - return self.logic.received(snack.category) & self.can_invite_to_movie(snack.loving_npcs) +from .base_logic import BaseLogicMixin, BaseLogic +from ..data.movies import movies_by_name, npc_snacks, Snack, Movie, snacks_by_name +from ..stardew_rule import StardewRule, Or +from ..strings.villager_names import NPC + + +class MovieLogicMixin(BaseLogicMixin): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.movie = MovieLogic(*args, **kwargs) + + +class MovieLogic(BaseLogic): + + def can_watch_movie(self, movie: str | Movie) -> StardewRule: + if isinstance(movie, str): + movie = movies_by_name[movie] + return self.logic.season.has(movie.season) + + def can_watch_movie_with_loving_npc(self, movie: str | Movie) -> StardewRule: + if isinstance(movie, str): + movie = movies_by_name[movie] + return self.can_watch_movie(movie) & self.logic.relationship.can_meet_any(*movie.loving_npcs) + + def can_invite_to_movie(self, npcs: str | list[str]) -> StardewRule: + if isinstance(npcs, str): + npc = npcs + if npc == NPC.leo: + return self.logic.relationship.has_hearts(NPC.leo, 6) + return self.logic.relationship.can_meet(npc) + return self.logic.or_(*[self.can_invite_to_movie(npc) for npc in npcs]) + + def can_watch_movie_with_loving_npc_and_snack(self, movie: str | Movie) -> StardewRule: + if isinstance(movie, str): + movie = movies_by_name[movie] + potential_partner_rules = [] + for npc in movie.loving_npcs: + meet_rule = self.can_invite_to_movie(npc) + snack_rule = self.can_buy_loved_snack(npc) + potential_partner_rules.append(meet_rule & snack_rule) + return self.can_watch_movie(movie) & Or(*potential_partner_rules) + + def can_buy_loved_snack(self, npc: str) -> StardewRule: + snacks = npc_snacks[npc] + if not snacks: + return self.logic.false_ + snacks_rule = Or(*[self.can_buy_snack(snack) for snack in snacks]) + return snacks_rule + + def can_buy_snack(self, snack: str | Snack) -> StardewRule: + if isinstance(snack, str): + snack = snacks_by_name[snack] + return self.logic.received(snack.category) + + def can_buy_snack_for_someone_who_loves_it(self, snack: str | Snack) -> StardewRule: + if isinstance(snack, str): + snack = snacks_by_name[snack] + return self.logic.received(snack.category) & self.can_invite_to_movie(snack.loving_npcs) diff --git a/worlds/stardew_valley/logic/special_items_logic.py b/worlds/stardew_valley/logic/special_items_logic.py index 90e18b790091..9af16e52636e 100644 --- a/worlds/stardew_valley/logic/special_items_logic.py +++ b/worlds/stardew_valley/logic/special_items_logic.py @@ -1,45 +1,45 @@ -from .base_logic import BaseLogic, BaseLogicMixin -from ..content.vanilla.ginger_island import ginger_island_content_pack -from ..stardew_rule import StardewRule -from ..strings.ap_names.ap_option_names import SecretsanityOptionName -from ..strings.craftable_names import Consumable -from ..strings.forageable_names import Forageable -from ..strings.metal_names import Artifact -from ..strings.quest_names import Quest -from ..strings.region_names import Region -from ..strings.season_names import Season -from ..strings.special_item_names import SpecialItem -from ..strings.villager_names import NPC - - -class SpecialItemsLogicMixin(BaseLogicMixin): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.special_items = SpecialItemsLogic(*args, **kwargs) - - -class SpecialItemsLogic(BaseLogic): - - def has_purple_shorts(self) -> StardewRule: - has_first_shorts = self.logic.season.has(Season.summer) &\ - self.logic.region.can_reach(Region.ranch) &\ - self.logic.relationship.has_hearts(NPC.marnie, 2) - has_repeatable_shorts = self.logic.region.can_reach(Region.purple_shorts_maze) & self.logic.has(Consumable.warp_totem_farm) - return has_first_shorts & has_repeatable_shorts - - def has_far_away_stone(self) -> StardewRule: - sacrifice_rule = self.logic.has(Artifact.ancient_doll) & self.logic.region.can_reach_any(Region.mines_floor_100, Region.volcano_floor_10) - if SecretsanityOptionName.easy in self.options.secretsanity: - return sacrifice_rule & self.logic.received(SpecialItem.far_away_stone) - return sacrifice_rule - - def has_solid_gold_lewis(self) -> StardewRule: - if SecretsanityOptionName.secret_notes in self.options.secretsanity: - return self.logic.received(SpecialItem.solid_gold_lewis) & self.logic.region.can_reach(Region.town) - return self.logic.has(Forageable.secret_note) & self.logic.region.can_reach(Region.town) - - def has_advanced_tv_remote(self) -> StardewRule: - george_rule = self.logic.relationship.has_hearts(NPC.george, 10) - if ginger_island_content_pack.name in self.content.registered_packs: - return george_rule - return self.logic.quest.can_complete_quest(Quest.the_pirates_wife) & george_rule +from .base_logic import BaseLogic, BaseLogicMixin +from ..content.vanilla.ginger_island import ginger_island_content_pack +from ..stardew_rule import StardewRule +from ..strings.ap_names.ap_option_names import SecretsanityOptionName +from ..strings.craftable_names import Consumable +from ..strings.forageable_names import Forageable +from ..strings.metal_names import Artifact +from ..strings.quest_names import Quest +from ..strings.region_names import Region +from ..strings.season_names import Season +from ..strings.special_item_names import SpecialItem +from ..strings.villager_names import NPC + + +class SpecialItemsLogicMixin(BaseLogicMixin): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.special_items = SpecialItemsLogic(*args, **kwargs) + + +class SpecialItemsLogic(BaseLogic): + + def has_purple_shorts(self) -> StardewRule: + has_first_shorts = self.logic.season.has(Season.summer) &\ + self.logic.region.can_reach(Region.ranch) &\ + self.logic.relationship.has_hearts(NPC.marnie, 2) + has_repeatable_shorts = self.logic.region.can_reach(Region.purple_shorts_maze) & self.logic.has(Consumable.warp_totem_farm) + return has_first_shorts & has_repeatable_shorts + + def has_far_away_stone(self) -> StardewRule: + sacrifice_rule = self.logic.has(Artifact.ancient_doll) & self.logic.region.can_reach_any(Region.mines_floor_100, Region.volcano_floor_10) + if SecretsanityOptionName.easy in self.options.secretsanity: + return sacrifice_rule & self.logic.received(SpecialItem.far_away_stone) + return sacrifice_rule + + def has_solid_gold_lewis(self) -> StardewRule: + if SecretsanityOptionName.secret_notes in self.options.secretsanity: + return self.logic.received(SpecialItem.solid_gold_lewis) & self.logic.region.can_reach(Region.town) + return self.logic.has(Forageable.secret_note) & self.logic.region.can_reach(Region.town) + + def has_advanced_tv_remote(self) -> StardewRule: + george_rule = self.logic.relationship.has_hearts(NPC.george, 10) + if ginger_island_content_pack.name in self.content.registered_packs: + return george_rule + return self.logic.quest.can_complete_quest(Quest.the_pirates_wife) & george_rule diff --git a/worlds/stardew_valley/options/jojapocalypse_options.py b/worlds/stardew_valley/options/jojapocalypse_options.py index b6ec8edba558..beaf66d4ca84 100644 --- a/worlds/stardew_valley/options/jojapocalypse_options.py +++ b/worlds/stardew_valley/options/jojapocalypse_options.py @@ -1,73 +1,73 @@ -from Options import Choice, Range, Toggle - - -class Jojapocalypse(Choice): - """Joja Co opens a new Archipelago branch, selling you any and all location checks you might want or need, in exchange for money. - But are you ready to pay the price... - Disabled: Joja does not sell location checks - Allowed: Joja sells location checks, that you can buy if you want - Forced: The only way to obtain location checks is through Joja - """ - internal_name = "jojapocalypse" - display_name = "Jojapocalypse" - default = 0 - option_disabled = 0 - option_allowed = 1 - option_forced = 2 - - -class JojaStartPrice(Range): - """The price of Jojapocalypse items at the very beginning of the game. This price will increase with each Jojapocalypse purchase - """ - internal_name = "joja_start_price" - display_name = "Jojapocalypse Start Price" - default = 100 - range_start = 1 - range_end = 10000 - - -class JojaEndPrice(Range): - """The price of the very last Jojapocalypse item you will buy. An individual location check will never go above this. - Consider your number of checks before choosing a price, as the total amount of money you spend will highly scale with it. - """ - internal_name = "joja_end_price" - display_name = "Jojapocalypse End Price" - default = 10000 - range_start = 0 - range_end = 100_000 - - -class JojaPricingPattern(Choice): - """Chooses the pricing strategy of Jojapocalypse sold location checks. Prices will always increase, but you can pick the increase pattern. - """ - internal_name = "joja_pricing_pattern" - display_name = "Jojapocalypse Pricing Pattern" - default = 1 - option_linear = 0 - option_exponential = 1 - - -class JojaPurchasesForMembership(Range): - """After buying this number of location checks for Joja, you will earn your very own Joja Membership! - The world will change accordingly. - If you are on "Allowed", receiving your first Movie Theater before earning your membership will close down Joja permanently. - If you obtain your membership, the movie theater will instead replace the Community Center, and some location checks will become only obtainable through Joja. - If you are on "Forced", You will start as a Joja Member. - """ - internal_name = "joja_purchases_for_membership" - display_name = "Purchases For Joja Membership" - default = 10 - range_start = 1 - range_end = 100 - - -class JojaAreYouSure(Toggle): - """Jojapocalypse will be an extremely unfulfilling experience. - The main driving directive behind its Design is to make the player feel bad and guilty about picking Joja. - Most of the things you buy will come with heavy, painful consequences, and they are explicitly done with the intent of being unfun and annoying. - This game mode is not supposed to be fun. You will have a bad time. - Are you really sure you want to do this? - """ - internal_name = "joja_are_you_sure" - display_name = "Are you sure?" - default = Toggle.option_false +from Options import Choice, Range, Toggle + + +class Jojapocalypse(Choice): + """Joja Co opens a new Archipelago branch, selling you any and all location checks you might want or need, in exchange for money. + But are you ready to pay the price... + Disabled: Joja does not sell location checks + Allowed: Joja sells location checks, that you can buy if you want + Forced: The only way to obtain location checks is through Joja + """ + internal_name = "jojapocalypse" + display_name = "Jojapocalypse" + default = 0 + option_disabled = 0 + option_allowed = 1 + option_forced = 2 + + +class JojaStartPrice(Range): + """The price of Jojapocalypse items at the very beginning of the game. This price will increase with each Jojapocalypse purchase + """ + internal_name = "joja_start_price" + display_name = "Jojapocalypse Start Price" + default = 100 + range_start = 1 + range_end = 10000 + + +class JojaEndPrice(Range): + """The price of the very last Jojapocalypse item you will buy. An individual location check will never go above this. + Consider your number of checks before choosing a price, as the total amount of money you spend will highly scale with it. + """ + internal_name = "joja_end_price" + display_name = "Jojapocalypse End Price" + default = 10000 + range_start = 0 + range_end = 100_000 + + +class JojaPricingPattern(Choice): + """Chooses the pricing strategy of Jojapocalypse sold location checks. Prices will always increase, but you can pick the increase pattern. + """ + internal_name = "joja_pricing_pattern" + display_name = "Jojapocalypse Pricing Pattern" + default = 1 + option_linear = 0 + option_exponential = 1 + + +class JojaPurchasesForMembership(Range): + """After buying this number of location checks for Joja, you will earn your very own Joja Membership! + The world will change accordingly. + If you are on "Allowed", receiving your first Movie Theater before earning your membership will close down Joja permanently. + If you obtain your membership, the movie theater will instead replace the Community Center, and some location checks will become only obtainable through Joja. + If you are on "Forced", You will start as a Joja Member. + """ + internal_name = "joja_purchases_for_membership" + display_name = "Purchases For Joja Membership" + default = 10 + range_start = 1 + range_end = 100 + + +class JojaAreYouSure(Toggle): + """Jojapocalypse will be an extremely unfulfilling experience. + The main driving directive behind its Design is to make the player feel bad and guilty about picking Joja. + Most of the things you buy will come with heavy, painful consequences, and they are explicitly done with the intent of being unfun and annoying. + This game mode is not supposed to be fun. You will have a bad time. + Are you really sure you want to do this? + """ + internal_name = "joja_are_you_sure" + display_name = "Are you sure?" + default = Toggle.option_false diff --git a/worlds/stardew_valley/options/settings.py b/worlds/stardew_valley/options/settings.py index 6c5d0a621373..40d455e1fc31 100644 --- a/worlds/stardew_valley/options/settings.py +++ b/worlds/stardew_valley/options/settings.py @@ -1,43 +1,43 @@ -from typing import Union - -from settings import Group, Bool - - -class StardewSettings(Group): - - class AllowAllsanityGoal(Bool): - """Allow players to pick the goal 'Allsanity'. If disallowed, generation will fail.""" - - class AllowPerfectionGoal(Bool): - """Allow players to pick the goal 'Perfection'. If disallowed, generation will fail.""" - - class AllowMaxPriceBundles(Bool): - """Allow players to pick the option 'Bundle Price: Maximum'. If disallowed, it will be replaced with 'Very Expensive'""" - - class AllowChaosER(Bool): - """Allow players to pick the option 'Entrance Randomization: Chaos'. If disallowed, it will be replaced with 'Buildings'""" - - class AllowShipsanityEverything(Bool): - """Allow players to pick the option 'Shipsanity: Everything'. If disallowed, it will be replaced with 'Full Shipment With Fish'""" - - class AllowHatsanityNearOrPostPerfection(Bool): - """Allow players to pick the option 'Hatsanity: Near Perfection OR Post Perfection'. If disallowed, it will be replaced with 'Difficult'""" - - class AllowCustomLogic(Bool): - """Allow players to toggle on Custom logic flags. If disallowed, it will be disabled""" - - class AllowJojapocalypse(Bool): - """Allow players to enable Jojapocalypse. If disallowed, it will be disabled""" - - # class AllowSVE(Bool): - # """Allow players to include the mod 'Stardew Valley Expanded'. If disallowed, it will be removed from the mods""" - - allow_allsanity: Union[AllowAllsanityGoal, bool] = True - allow_perfection: Union[AllowPerfectionGoal, bool] = True - allow_max_bundles: Union[AllowMaxPriceBundles, bool] = True - allow_chaos_er: Union[AllowChaosER, bool] = False - allow_shipsanity_everything: Union[AllowShipsanityEverything, bool] = True - allow_hatsanity_perfection: Union[AllowHatsanityNearOrPostPerfection, bool] = True - allow_custom_logic: Union[AllowCustomLogic, bool] = True - allow_jojapocalypse: Union[AllowJojapocalypse, bool] = False - # allow_sve: Union[AllowSVE, bool] = True +from typing import Union + +from settings import Group, Bool + + +class StardewSettings(Group): + + class AllowAllsanityGoal(Bool): + """Allow players to pick the goal 'Allsanity'. If disallowed, generation will fail.""" + + class AllowPerfectionGoal(Bool): + """Allow players to pick the goal 'Perfection'. If disallowed, generation will fail.""" + + class AllowMaxPriceBundles(Bool): + """Allow players to pick the option 'Bundle Price: Maximum'. If disallowed, it will be replaced with 'Very Expensive'""" + + class AllowChaosER(Bool): + """Allow players to pick the option 'Entrance Randomization: Chaos'. If disallowed, it will be replaced with 'Buildings'""" + + class AllowShipsanityEverything(Bool): + """Allow players to pick the option 'Shipsanity: Everything'. If disallowed, it will be replaced with 'Full Shipment With Fish'""" + + class AllowHatsanityNearOrPostPerfection(Bool): + """Allow players to pick the option 'Hatsanity: Near Perfection OR Post Perfection'. If disallowed, it will be replaced with 'Difficult'""" + + class AllowCustomLogic(Bool): + """Allow players to toggle on Custom logic flags. If disallowed, it will be disabled""" + + class AllowJojapocalypse(Bool): + """Allow players to enable Jojapocalypse. If disallowed, it will be disabled""" + + # class AllowSVE(Bool): + # """Allow players to include the mod 'Stardew Valley Expanded'. If disallowed, it will be removed from the mods""" + + allow_allsanity: Union[AllowAllsanityGoal, bool] = True + allow_perfection: Union[AllowPerfectionGoal, bool] = True + allow_max_bundles: Union[AllowMaxPriceBundles, bool] = True + allow_chaos_er: Union[AllowChaosER, bool] = False + allow_shipsanity_everything: Union[AllowShipsanityEverything, bool] = True + allow_hatsanity_perfection: Union[AllowHatsanityNearOrPostPerfection, bool] = True + allow_custom_logic: Union[AllowCustomLogic, bool] = True + allow_jojapocalypse: Union[AllowJojapocalypse, bool] = False + # allow_sve: Union[AllowSVE, bool] = True diff --git a/worlds/stardew_valley/strings/backpack_tiers.py b/worlds/stardew_valley/strings/backpack_tiers.py index f64935ed2f82..71be80f37e82 100644 --- a/worlds/stardew_valley/strings/backpack_tiers.py +++ b/worlds/stardew_valley/strings/backpack_tiers.py @@ -1,15 +1,15 @@ -class Backpack: - small = "Small Pack" - large = "Large Pack" - deluxe = "Deluxe Pack" - premium = "Premium Pack" - prices_per_tier = {small: 400, large: 2000, deluxe: 10000, premium: 50000} - - @staticmethod - def get_purchasable_tiers(bigger_backpack: bool, start_without_backpack: bool = False) -> list[str]: - tiers = [Backpack.large, Backpack.deluxe] - if bigger_backpack: - tiers.append(Backpack.premium) - if start_without_backpack: - tiers.insert(0, Backpack.small) - return tiers +class Backpack: + small = "Small Pack" + large = "Large Pack" + deluxe = "Deluxe Pack" + premium = "Premium Pack" + prices_per_tier = {small: 400, large: 2000, deluxe: 10000, premium: 50000} + + @staticmethod + def get_purchasable_tiers(bigger_backpack: bool, start_without_backpack: bool = False) -> list[str]: + tiers = [Backpack.large, Backpack.deluxe] + if bigger_backpack: + tiers.append(Backpack.premium) + if start_without_backpack: + tiers.insert(0, Backpack.small) + return tiers diff --git a/worlds/stardew_valley/strings/boot_names.py b/worlds/stardew_valley/strings/boot_names.py index f7b0fb9f2ea0..2462f74fdf2a 100644 --- a/worlds/stardew_valley/strings/boot_names.py +++ b/worlds/stardew_valley/strings/boot_names.py @@ -1,20 +1,20 @@ -from typing import Dict, List - -boots_by_tier: Dict[int, List[str]] = dict() -tier_by_boots: Dict[str, int] = dict() - - -def create_boots(tier: int, name: str) -> str: - if tier not in boots_by_tier: - boots_by_tier[tier] = [] - boots_by_tier[tier].append(name) - tier_by_boots[name] = tier - return name - - -def tier_4_boots(name: str) -> str: - return create_boots(4, name) - - -class Boots: - mermaid_boots = tier_4_boots("Mermaid Boots") +from typing import Dict, List + +boots_by_tier: Dict[int, List[str]] = dict() +tier_by_boots: Dict[str, int] = dict() + + +def create_boots(tier: int, name: str) -> str: + if tier not in boots_by_tier: + boots_by_tier[tier] = [] + boots_by_tier[tier].append(name) + tier_by_boots[name] = tier + return name + + +def tier_4_boots(name: str) -> str: + return create_boots(4, name) + + +class Boots: + mermaid_boots = tier_4_boots("Mermaid Boots") diff --git a/worlds/stardew_valley/strings/catalogue_names.py b/worlds/stardew_valley/strings/catalogue_names.py index 62373ec923a3..9f6fad6cda0b 100644 --- a/worlds/stardew_valley/strings/catalogue_names.py +++ b/worlds/stardew_valley/strings/catalogue_names.py @@ -1,97 +1,97 @@ -from typing import Dict, List - - -class Catalogue: - wizard = "Wizard Catalogue" - furniture = "Furniture Catalogue" - - -items_by_catalogue: Dict[str, List[str]] = dict() - - -def catalogue_item(item: str, catalogue: str) -> str: - if catalogue not in items_by_catalogue: - items_by_catalogue[catalogue] = [] - items_by_catalogue[catalogue].append(item) - return item - - -def wizard_catalogue_item(item: str) -> str: - return catalogue_item(item, Catalogue.wizard) - - -def furniture_catalogue_item(item: str) -> str: - return catalogue_item(item, Catalogue.furniture) - - -class CatalogueItem: - wizard_bed = wizard_catalogue_item("Wizard Bed") - wizard_dresser = wizard_catalogue_item("Wizard Dresser") - wizard_chair = wizard_catalogue_item("Wizard Chair") - wizard_stool = wizard_catalogue_item("Wizard Stool") - wizard_table = wizard_catalogue_item("Wizard Table") - wizard_tea_table = wizard_catalogue_item("Wizard Tea Table") - wizard_end_table = wizard_catalogue_item("Wizard End Table") - wizard_bookcase = wizard_catalogue_item("Wizard Bookcase") - large_wizard_bookcase = wizard_catalogue_item("Large Wizard Bookcase") - short_wizard_bookcase = wizard_catalogue_item("Short Wizard Bookcase") - small_wizard_bookcase = wizard_catalogue_item("Small Wizard Bookcase") - wizard_study = wizard_catalogue_item("Wizard Study") - wizard_bookshelf = wizard_catalogue_item("Wizard Bookshelf") - elixir_shelf = wizard_catalogue_item("Elixir Shelf") - small_elixir_shelf = wizard_catalogue_item("Small Elixir Shelf") - stacked_elixir_shelf = wizard_catalogue_item("Stacked Elixir Shelf") - small_stacked_elixir_shelf = wizard_catalogue_item("Small Stacked Elixir Shelf") - elixir_table = wizard_catalogue_item("Elixir Table") - long_elixir_table = wizard_catalogue_item("Long Elixir Table") - two_elixirs = wizard_catalogue_item("Two Elixirs") - elixir_bundle = wizard_catalogue_item("Elixir Bundle") - cauldron = wizard_catalogue_item("Cauldron") - wizard_fireplace = wizard_catalogue_item("Wizard Fireplace") - crystal_ball = wizard_catalogue_item("Crystal Ball") - amethyst_crystal_ball = wizard_catalogue_item("Amethyst Crystal Ball") - aquamarine_crystal_ball = wizard_catalogue_item("Aquamarine Crystal Ball") - emerald_crystal_ball = wizard_catalogue_item("Emerald Crystal Ball") - ruby_crystal_ball = wizard_catalogue_item("Ruby Crystal Ball") - topaz_crystal_ball = wizard_catalogue_item("Topaz Crystal Ball") - blue_book = wizard_catalogue_item("Blue Book") - fallen_blue_book = wizard_catalogue_item("Fallen Blue Book") - brown_book = wizard_catalogue_item("Brown Book") - fallen_brown_book = wizard_catalogue_item("Fallen Brown Book") - green_book = wizard_catalogue_item("Green Book") - fallen_green_book = wizard_catalogue_item("Fallen Green Book") - purple_book = wizard_catalogue_item("Purple Book") - fallen_purple_book = wizard_catalogue_item("Fallen Purple Book") - red_book = wizard_catalogue_item("Red Book") - fallen_red_book = wizard_catalogue_item("Fallen Red Book") - yellow_book = wizard_catalogue_item("Yellow Book") - fallen_yellow_book = wizard_catalogue_item("Fallen Yellow Book") - book_pile = wizard_catalogue_item("Book Pile") - large_book_pile = wizard_catalogue_item("Large Book Pile") - small_book_pile = wizard_catalogue_item("Small Book Pile") - book_stack = wizard_catalogue_item("Book Stack") - large_book_stack = wizard_catalogue_item("Large Book Stack") - small_book_stack = wizard_catalogue_item("Small Book Stack") - decorative_wizard_door = wizard_catalogue_item("Decorative Wizard Door") - glyph = wizard_catalogue_item("Glyph") - runes = wizard_catalogue_item("'Runes'") - void_swirlds = wizard_catalogue_item("'Void Swirlds'") - wizards_tower = wizard_catalogue_item("'Wizard's Tower'") - witchs_broom = wizard_catalogue_item("Witch's Broom") - rune_rug = wizard_catalogue_item("Rune Rug") - starry_moon_rug = wizard_catalogue_item("Starry Moon Rug") - swirld_rug = wizard_catalogue_item("Swirld Rug") - wizard_cushion = wizard_catalogue_item("Wizard Cushion") - dark_wizard_cushion = wizard_catalogue_item("Dark Wizard Cushion") - wizard_lamp = wizard_catalogue_item("Wizard Lamp") - potted_red_mushroom = wizard_catalogue_item("Potted Red Mushroom") - curly_tree = wizard_catalogue_item("Curly Tree") - swamp_plant = wizard_catalogue_item("Swamp Plant") - stone_flooring = wizard_catalogue_item("Stone Flooring") - - stone_flooring = furniture_catalogue_item("Country Lamp") - box_lamp = furniture_catalogue_item("Box Lamp") - modern_lamp = furniture_catalogue_item("Modern Lamp") - classic_lamp = furniture_catalogue_item("Classic Lamp") - candle_lamp = furniture_catalogue_item("Candle Lamp") - ornate_lamp = furniture_catalogue_item("Ornate Lamp") +from typing import Dict, List + + +class Catalogue: + wizard = "Wizard Catalogue" + furniture = "Furniture Catalogue" + + +items_by_catalogue: Dict[str, List[str]] = dict() + + +def catalogue_item(item: str, catalogue: str) -> str: + if catalogue not in items_by_catalogue: + items_by_catalogue[catalogue] = [] + items_by_catalogue[catalogue].append(item) + return item + + +def wizard_catalogue_item(item: str) -> str: + return catalogue_item(item, Catalogue.wizard) + + +def furniture_catalogue_item(item: str) -> str: + return catalogue_item(item, Catalogue.furniture) + + +class CatalogueItem: + wizard_bed = wizard_catalogue_item("Wizard Bed") + wizard_dresser = wizard_catalogue_item("Wizard Dresser") + wizard_chair = wizard_catalogue_item("Wizard Chair") + wizard_stool = wizard_catalogue_item("Wizard Stool") + wizard_table = wizard_catalogue_item("Wizard Table") + wizard_tea_table = wizard_catalogue_item("Wizard Tea Table") + wizard_end_table = wizard_catalogue_item("Wizard End Table") + wizard_bookcase = wizard_catalogue_item("Wizard Bookcase") + large_wizard_bookcase = wizard_catalogue_item("Large Wizard Bookcase") + short_wizard_bookcase = wizard_catalogue_item("Short Wizard Bookcase") + small_wizard_bookcase = wizard_catalogue_item("Small Wizard Bookcase") + wizard_study = wizard_catalogue_item("Wizard Study") + wizard_bookshelf = wizard_catalogue_item("Wizard Bookshelf") + elixir_shelf = wizard_catalogue_item("Elixir Shelf") + small_elixir_shelf = wizard_catalogue_item("Small Elixir Shelf") + stacked_elixir_shelf = wizard_catalogue_item("Stacked Elixir Shelf") + small_stacked_elixir_shelf = wizard_catalogue_item("Small Stacked Elixir Shelf") + elixir_table = wizard_catalogue_item("Elixir Table") + long_elixir_table = wizard_catalogue_item("Long Elixir Table") + two_elixirs = wizard_catalogue_item("Two Elixirs") + elixir_bundle = wizard_catalogue_item("Elixir Bundle") + cauldron = wizard_catalogue_item("Cauldron") + wizard_fireplace = wizard_catalogue_item("Wizard Fireplace") + crystal_ball = wizard_catalogue_item("Crystal Ball") + amethyst_crystal_ball = wizard_catalogue_item("Amethyst Crystal Ball") + aquamarine_crystal_ball = wizard_catalogue_item("Aquamarine Crystal Ball") + emerald_crystal_ball = wizard_catalogue_item("Emerald Crystal Ball") + ruby_crystal_ball = wizard_catalogue_item("Ruby Crystal Ball") + topaz_crystal_ball = wizard_catalogue_item("Topaz Crystal Ball") + blue_book = wizard_catalogue_item("Blue Book") + fallen_blue_book = wizard_catalogue_item("Fallen Blue Book") + brown_book = wizard_catalogue_item("Brown Book") + fallen_brown_book = wizard_catalogue_item("Fallen Brown Book") + green_book = wizard_catalogue_item("Green Book") + fallen_green_book = wizard_catalogue_item("Fallen Green Book") + purple_book = wizard_catalogue_item("Purple Book") + fallen_purple_book = wizard_catalogue_item("Fallen Purple Book") + red_book = wizard_catalogue_item("Red Book") + fallen_red_book = wizard_catalogue_item("Fallen Red Book") + yellow_book = wizard_catalogue_item("Yellow Book") + fallen_yellow_book = wizard_catalogue_item("Fallen Yellow Book") + book_pile = wizard_catalogue_item("Book Pile") + large_book_pile = wizard_catalogue_item("Large Book Pile") + small_book_pile = wizard_catalogue_item("Small Book Pile") + book_stack = wizard_catalogue_item("Book Stack") + large_book_stack = wizard_catalogue_item("Large Book Stack") + small_book_stack = wizard_catalogue_item("Small Book Stack") + decorative_wizard_door = wizard_catalogue_item("Decorative Wizard Door") + glyph = wizard_catalogue_item("Glyph") + runes = wizard_catalogue_item("'Runes'") + void_swirlds = wizard_catalogue_item("'Void Swirlds'") + wizards_tower = wizard_catalogue_item("'Wizard's Tower'") + witchs_broom = wizard_catalogue_item("Witch's Broom") + rune_rug = wizard_catalogue_item("Rune Rug") + starry_moon_rug = wizard_catalogue_item("Starry Moon Rug") + swirld_rug = wizard_catalogue_item("Swirld Rug") + wizard_cushion = wizard_catalogue_item("Wizard Cushion") + dark_wizard_cushion = wizard_catalogue_item("Dark Wizard Cushion") + wizard_lamp = wizard_catalogue_item("Wizard Lamp") + potted_red_mushroom = wizard_catalogue_item("Potted Red Mushroom") + curly_tree = wizard_catalogue_item("Curly Tree") + swamp_plant = wizard_catalogue_item("Swamp Plant") + stone_flooring = wizard_catalogue_item("Stone Flooring") + + stone_flooring = furniture_catalogue_item("Country Lamp") + box_lamp = furniture_catalogue_item("Box Lamp") + modern_lamp = furniture_catalogue_item("Modern Lamp") + classic_lamp = furniture_catalogue_item("Classic Lamp") + candle_lamp = furniture_catalogue_item("Candle Lamp") + ornate_lamp = furniture_catalogue_item("Ornate Lamp") diff --git a/worlds/stardew_valley/strings/meme_item_names.py b/worlds/stardew_valley/strings/meme_item_names.py index 8689f8e6dd27..f7a256ee3c4b 100644 --- a/worlds/stardew_valley/strings/meme_item_names.py +++ b/worlds/stardew_valley/strings/meme_item_names.py @@ -1,20 +1,20 @@ -class MemeItem: - pot_of_gold = "PotOfGold" - seed_spot = "Seed Spot" - green_rain_weeds_0 = "GreenRainWeeds0" - lumber = "Lumber" - weeds = "Weeds" - twig = "Twig" - artifact_spot = "Artifact Spot" - warp_totem_qis_arena = "Warp Totem: Qi's Arena" - supply_crate = "SupplyCrate" - slime_crate = "Slime Crate" - decorative_pot = "Decorative Pot" - camping_stove = "Camping Stove" - worn_pants = "Worn Pants" - worn_left_ring = "Worn Left Ring" - worn_right_ring = "Worn Right Ring" - worn_shirt = "Worn Shirt" - worn_boots = "Worn Boots" - worn_hat = "Worn Hat" - trap = "Fun Trap" +class MemeItem: + pot_of_gold = "PotOfGold" + seed_spot = "Seed Spot" + green_rain_weeds_0 = "GreenRainWeeds0" + lumber = "Lumber" + weeds = "Weeds" + twig = "Twig" + artifact_spot = "Artifact Spot" + warp_totem_qis_arena = "Warp Totem: Qi's Arena" + supply_crate = "SupplyCrate" + slime_crate = "Slime Crate" + decorative_pot = "Decorative Pot" + camping_stove = "Camping Stove" + worn_pants = "Worn Pants" + worn_left_ring = "Worn Left Ring" + worn_right_ring = "Worn Right Ring" + worn_shirt = "Worn Shirt" + worn_boots = "Worn Boots" + worn_hat = "Worn Hat" + trap = "Fun Trap" diff --git a/worlds/stardew_valley/strings/ring_names.py b/worlds/stardew_valley/strings/ring_names.py index ab7f29425d8d..067c42f7da67 100644 --- a/worlds/stardew_valley/strings/ring_names.py +++ b/worlds/stardew_valley/strings/ring_names.py @@ -1,16 +1,16 @@ -all_ring_names = [] - - -def ring(name: str) -> str: - all_ring_names.append(name) - return name - - -class Ring: - slime_charmer = ring("Slime Charmer Ring") - ring_of_yoba = ring("Ring of Yoba") - sturdy = ring("Sturdy Ring") - burglar = ring("Burglar's Ring") - iridium_band = ring("Iridium Band") - napalm = ring("Napalm Ring") +all_ring_names = [] + + +def ring(name: str) -> str: + all_ring_names.append(name) + return name + + +class Ring: + slime_charmer = ring("Slime Charmer Ring") + ring_of_yoba = ring("Ring of Yoba") + sturdy = ring("Sturdy Ring") + burglar = ring("Burglar's Ring") + iridium_band = ring("Iridium Band") + napalm = ring("Napalm Ring") hot_java = ring("Hot Java Ring") \ No newline at end of file diff --git a/worlds/stardew_valley/strings/special_item_names.py b/worlds/stardew_valley/strings/special_item_names.py index b20f2eb0949f..7b01ab7a16c4 100644 --- a/worlds/stardew_valley/strings/special_item_names.py +++ b/worlds/stardew_valley/strings/special_item_names.py @@ -1,10 +1,10 @@ -class SpecialItem: - lucky_purple_shorts = "Lucky Purple Shorts" - trimmed_purple_shorts = "Trimmed Lucky Purple Shorts" - far_away_stone = "Far Away Stone" - solid_gold_lewis = "Solid Gold Lewis" - advanced_tv_remote = "Advanced TV Remote" - - -class NotReallyAnItem: - death = "Death" +class SpecialItem: + lucky_purple_shorts = "Lucky Purple Shorts" + trimmed_purple_shorts = "Trimmed Lucky Purple Shorts" + far_away_stone = "Far Away Stone" + solid_gold_lewis = "Solid Gold Lewis" + advanced_tv_remote = "Advanced TV Remote" + + +class NotReallyAnItem: + death = "Death" diff --git a/worlds/stardew_valley/test/TestBeta7Logic.py b/worlds/stardew_valley/test/TestBeta7Logic.py index 1fa8b2aed957..2c2861ccbdf8 100644 --- a/worlds/stardew_valley/test/TestBeta7Logic.py +++ b/worlds/stardew_valley/test/TestBeta7Logic.py @@ -1,293 +1,293 @@ -from worlds.stardew_valley import BackpackProgression, ToolProgression, SeasonRandomization -from worlds.stardew_valley.mods.mod_data import ModNames -from worlds.stardew_valley.options import BackpackSize, Mods, QuestLocations, SkillProgression, Secretsanity, Museumsanity, Booksanity, Hatsanity, Cropsanity, \ - StartWithout -from worlds.stardew_valley.strings.ap_names.ap_option_names import SecretsanityOptionName, StartWithoutOptionName -from worlds.stardew_valley.test.bases import SVTestBase - - -class TestAvailableBackpacksSize1(SVTestBase): - options = { - SeasonRandomization: SeasonRandomization.option_disabled, - Cropsanity: Cropsanity.option_disabled, - BackpackProgression: BackpackProgression.option_progressive, - BackpackSize: 1, - StartWithout: frozenset({StartWithoutOptionName.backpack}), - Mods: frozenset({ModNames.big_backpack}), - } - - def test_can_purchase_correct_number_of_backpacks(self): - backpack_names = ["Small Pack", "Large Pack", "Deluxe Pack", "Premium Pack"] - backpack_location_names = [] - for backpack_name in backpack_names: - for i in range(1, 13): - backpack_location_names.append(f"{backpack_name} {i}") - - items_required = ["Shipping Bin", "Progressive Hoe", "Progressive Watering Can"] - for item in items_required: - self.collect(item) - self.collect_lots_of_money(0.15) - number_owned_backpacks = self.multiworld.state.prog_items[self.player]["Progressive Backpack"] - while number_owned_backpacks < 48: - number_available = number_owned_backpacks + 1 - with self.subTest(f"Can Purchase {number_available} backpacks when you own {number_owned_backpacks} backpacks"): - for i in range(0, len(backpack_location_names)): - if i < number_available: - self.assert_can_reach_location(backpack_location_names[i]) - else: - self.assert_cannot_reach_location(backpack_location_names[i]) - self.collect("Progressive Backpack") - number_owned_backpacks = self.multiworld.state.prog_items[self.player]["Progressive Backpack"] - - -class TestAvailableBackpacksSize4(SVTestBase): - options = { - SeasonRandomization: SeasonRandomization.option_disabled, - Cropsanity: Cropsanity.option_disabled, - BackpackProgression: BackpackProgression.option_progressive, - BackpackSize: 4, - StartWithout: frozenset({StartWithoutOptionName.backpack}), - Mods: frozenset({ModNames.big_backpack}), - } - - def test_can_purchase_correct_number_of_backpacks(self): - backpack_names = ["Small Pack", "Large Pack", "Deluxe Pack", "Premium Pack"] - backpack_location_names = [] - for backpack_name in backpack_names: - for i in range(1, 4): - backpack_location_names.append(f"{backpack_name} {i}") - - items_required = ["Shipping Bin", "Progressive Hoe", "Progressive Watering Can"] - for item in items_required: - self.collect(item) - self.collect_lots_of_money(0.15) - - number_owned_backpacks = self.multiworld.state.prog_items[self.player]["Progressive Backpack"] - while number_owned_backpacks * 4 < 48: - number_available = number_owned_backpacks + 1 - with self.subTest(f"Can Purchase {number_available} backpacks when you own {number_owned_backpacks} backpacks"): - for i in range(0, len(backpack_location_names)): - if i < number_available: - self.assert_can_reach_location(backpack_location_names[i]) - else: - self.assert_cannot_reach_location(backpack_location_names[i]) - self.collect("Progressive Backpack") - number_owned_backpacks = self.multiworld.state.prog_items[self.player]["Progressive Backpack"] - - -class TestBeachBridgeWithStartingToolsRequiresNothing(SVTestBase): - options = { - ToolProgression: ToolProgression.option_progressive, - StartWithout: StartWithout.preset_none, - } - - def test_beach_bridge_requires_axe(self): - beach_bridge_location = "Beach Bridge Repair" - self.assert_can_reach_location(beach_bridge_location) - - -class TestBeachBridgeWithoutStartingToolsRequiresAxe(SVTestBase): - options = { - ToolProgression: ToolProgression.option_progressive, - StartWithout: frozenset({StartWithoutOptionName.tools}), - } - - def test_beach_bridge_requires_axe(self): - beach_bridge_location = "Beach Bridge Repair" - self.assert_cannot_reach_location(beach_bridge_location) - self.collect("Progressive Axe") - self.assert_can_reach_location(beach_bridge_location) - - -class TestGrimReaperWithStartingToolsRequiresQuarryAndWeapon(SVTestBase): - options = { - ToolProgression: ToolProgression.option_progressive, - StartWithout: StartWithout.preset_none, - } - - def test_grim_reaper_requires_two_weapons(self): - grim_reaper_location = "Grim Reaper Statue" - self.assert_cannot_reach_location(grim_reaper_location) - self.collect("Landslide Removed") - self.collect("Bridge Repair") - self.assert_cannot_reach_location(grim_reaper_location) - self.collect("Progressive Weapon") - self.assert_cannot_reach_location(grim_reaper_location) - self.collect("Progressive Weapon") - self.assert_can_reach_location(grim_reaper_location) - - -class TestGrimRepairWithoutStartingToolsRequiresQuarryAndPickaxeAndWeapon(SVTestBase): - options = { - ToolProgression: ToolProgression.option_progressive, - StartWithout: frozenset({StartWithoutOptionName.tools}), - } - - def test_grim_reaper_requires_weapon_and_pickaxe(self): - grim_reaper_location = "Grim Reaper Statue" - self.assert_cannot_reach_location(grim_reaper_location) - self.collect("Mountain Shortcuts") - self.collect("Bridge Repair") - self.assert_cannot_reach_location(grim_reaper_location) - self.collect("Progressive Weapon") - self.assert_cannot_reach_location(grim_reaper_location) - self.collect("Progressive Weapon") - self.assert_cannot_reach_location(grim_reaper_location) - self.collect("Progressive Pickaxe") - self.assert_can_reach_location(grim_reaper_location) - - -class TestGatheringQuestsWithStartingToolsRequiresMinesAccess(SVTestBase): - options = { - ToolProgression: ToolProgression.option_progressive, - StartWithout: frozenset({StartWithoutOptionName.landslide}), - QuestLocations: 7, - } - - def test_gathering_quest_requires_landslide(self): - gathering_location = "Help Wanted: Gathering 1" - self.assert_cannot_reach_location(gathering_location) - self.collect("Landslide Removed") - self.assert_can_reach_location(gathering_location) - - -class TestGatheringQuestsWithoutStartingToolsRequiresMinesAndAxeAndPickaxe(SVTestBase): - options = { - ToolProgression: ToolProgression.option_progressive, - StartWithout: frozenset({StartWithoutOptionName.tools, StartWithoutOptionName.landslide}), - QuestLocations: 7, - } - - def test_gathering_quest_requires_landslide_axe_and_pickaxe(self): - gathering_location = "Help Wanted: Gathering 1" - axe = self.create_item("Progressive Axe") - self.assert_cannot_reach_location(gathering_location) - self.collect("Landslide Removed") - self.assert_cannot_reach_location(gathering_location) - self.collect(axe) - self.assert_cannot_reach_location(gathering_location) - self.collect("Progressive Pickaxe") - self.assert_can_reach_location(gathering_location) - self.remove(axe) - self.assert_cannot_reach_location(gathering_location) - - -class TestPrizeTicketAndHelpWanted(SVTestBase): - options = { - ToolProgression: ToolProgression.option_progressive, - StartWithout: frozenset({StartWithoutOptionName.tools, StartWithoutOptionName.landslide}), - QuestLocations: 7, - Booksanity: Booksanity.option_all, - Hatsanity: Hatsanity.preset_all, - } - - def test_prize_tickets_requires_all_help_wanteds_help_wanted(self): - locations = ["Wear Sports Cap", "Wear Chicken Mask", "Wear Polka Bow"] # , "Read Friendship 101"] # Friendship 101's bookseller source messes this up - items_required = ["Shipping Bin", "Progressive Fishing Rod", "Spring", "Progressive Mine Elevator", "Progressive Hoe", "Progressive Watering Can"] - for item in items_required: - self.collect(item) - self.collect_lots_of_money(0.75) - items_to_test = [self.create_item(item) for item in ["Progressive Fishing Rod", "Landslide Removed", "Progressive Axe", - "Progressive Pickaxe", "Progressive Weapon"]] - self.collect(items_to_test) - for location in locations: - with self.subTest(f"{location} can be accessed with all help wanted items"): - self.assert_can_reach_location(location) - for item in items_to_test: - self.remove(item) - with self.subTest(f"{location} Requires {item.name}"): - self.assert_cannot_reach_location(location) - self.collect(item) - self.assert_can_reach_location(location) - - -class TestSecretFishingRequiresFishingLevelsForDistance(SVTestBase): - options = { - SkillProgression: SkillProgression.option_progressive_with_masteries, - ToolProgression: ToolProgression.option_progressive, - StartWithout: frozenset({StartWithoutOptionName.tools}), - Secretsanity: frozenset([SecretsanityOptionName.fishing]), - } - - def test_pyramid_decal_requires_level_1(self): - pyramid_decal_location = "Fishing Secret: Pyramid Decal" - items_required = ["Progressive Fishing Rod", "Shipping Bin"] * 5 - for item in items_required: - self.collect(item) - items_to_test = [self.create_item(item) for item in ["Bus Repair", "Fishing Level"]] - self.collect(items_to_test) - self.assert_can_reach_location(pyramid_decal_location) - for item in items_to_test: - with self.subTest(f"{pyramid_decal_location} Requires {item.name}"): - self.remove(item) - self.assert_cannot_reach_location(pyramid_decal_location) - self.collect(item) - self.assert_can_reach_location(pyramid_decal_location) - - def test_foliage_print_requires_level_4(self): - foliage_print_location = "Fishing Secret: Foliage Print" - items_required = ["Progressive Fishing Rod", "Shipping Bin"] * 5 - items_required.extend(["Fishing Level"] * 3) - for item in items_required: - self.collect(item) - items_to_test = [self.create_item(item) for item in ["Boat Repair", "Island North Turtle", "Fishing Level"]] - self.collect(items_to_test) - self.assert_can_reach_location(foliage_print_location) - for item in items_to_test: - with self.subTest(f"I{foliage_print_location} Requires {item.name}"): - self.remove(item) - self.assert_cannot_reach_location(foliage_print_location) - self.collect(item) - self.assert_can_reach_location(foliage_print_location) - - def test_iridium_krobus_requires_level_15(self): - iridium_krobus_location = "Fishing Secret: Iridium Krobus" - items_required = ["Progressive Sword", "Progressive Pickaxe", "Progressive Footwear", "Combat Level", "Progressive House", "Landslide Removed", "Progressive Mine Elevator", - "Mining Level", "Progressive Watering Can", "Progressive Hoe", "Progressive Fishing Rod", "50 Qi Gems", "Shipping Bin"] * 10 - self.remove_one_by_name("Spring") - items_required.extend(["Summer", "Fall", "Winter"]) - items_required.extend(["Fishing Level"] * 9) - for item in items_required: - self.collect(item) - self.collect_lots_of_money(0.6) - groups_of_items_to_test = {"Quality Seafoam Pudding": [self.create_item(item) for item in - ["Fish Pond", "Qi Walnut Room", "Boat Repair", "Island West Turtle", "Fishing Level"]], - "Enchanted Rod and Seafoam Pudding": [self.create_item(item) for item in - ["Bus Repair", "Fish Pond", "Boat Repair", "Island North Turtle", "Fishing Level", - "Skull Key"]], - "Desert Chef and Escargot": [self.create_item(item) for item in - ["Bus Repair", "Fishing Level", "Garlic Seeds", "Spring"]], - } - for item_group_to_test in groups_of_items_to_test: - items_to_test = groups_of_items_to_test[item_group_to_test] - with self.subTest(f"{iridium_krobus_location} Requires {item_group_to_test}"): - self.collect(items_to_test) - self.assert_can_reach_location(iridium_krobus_location) - for item in items_to_test: - with self.subTest(f"{iridium_krobus_location} Requires {item_group_to_test} [{item.name}]"): - self.remove(item) - self.assert_cannot_reach_location(iridium_krobus_location) - self.collect(item) - self.assert_can_reach_location(iridium_krobus_location) - self.remove(items_to_test) - - -class TestArtifactSpotDonationsRequireHoe(SVTestBase): - options = { - ToolProgression: ToolProgression.option_progressive, - StartWithout: frozenset({StartWithoutOptionName.tools}), - Museumsanity: Museumsanity.option_all, - } - - def test_artifact_spot_requires_hoe(self): - artifact_spot_artifacts = ["Chipped Amphora", "Ancient Doll", "Rusty Spoon", "Chicken Statue", "Prehistoric Tool"] - self.collect_lots_of_money(0.5) - self.collect("Traveling Merchant Metal Detector", 2) - hoe = self.create_item("Progressive Hoe") - for artifact in artifact_spot_artifacts: - with self.subTest(f"Artifact: {artifact}"): - artifact_location = f"Museumsanity: {artifact}" - self.assert_cannot_reach_location(artifact_location) - self.collect(hoe) - self.assert_can_reach_location(artifact_location) - self.remove(hoe) +from worlds.stardew_valley import BackpackProgression, ToolProgression, SeasonRandomization +from worlds.stardew_valley.mods.mod_data import ModNames +from worlds.stardew_valley.options import BackpackSize, Mods, QuestLocations, SkillProgression, Secretsanity, Museumsanity, Booksanity, Hatsanity, Cropsanity, \ + StartWithout +from worlds.stardew_valley.strings.ap_names.ap_option_names import SecretsanityOptionName, StartWithoutOptionName +from worlds.stardew_valley.test.bases import SVTestBase + + +class TestAvailableBackpacksSize1(SVTestBase): + options = { + SeasonRandomization: SeasonRandomization.option_disabled, + Cropsanity: Cropsanity.option_disabled, + BackpackProgression: BackpackProgression.option_progressive, + BackpackSize: 1, + StartWithout: frozenset({StartWithoutOptionName.backpack}), + Mods: frozenset({ModNames.big_backpack}), + } + + def test_can_purchase_correct_number_of_backpacks(self): + backpack_names = ["Small Pack", "Large Pack", "Deluxe Pack", "Premium Pack"] + backpack_location_names = [] + for backpack_name in backpack_names: + for i in range(1, 13): + backpack_location_names.append(f"{backpack_name} {i}") + + items_required = ["Shipping Bin", "Progressive Hoe", "Progressive Watering Can"] + for item in items_required: + self.collect(item) + self.collect_lots_of_money(0.15) + number_owned_backpacks = self.multiworld.state.prog_items[self.player]["Progressive Backpack"] + while number_owned_backpacks < 48: + number_available = number_owned_backpacks + 1 + with self.subTest(f"Can Purchase {number_available} backpacks when you own {number_owned_backpacks} backpacks"): + for i in range(0, len(backpack_location_names)): + if i < number_available: + self.assert_can_reach_location(backpack_location_names[i]) + else: + self.assert_cannot_reach_location(backpack_location_names[i]) + self.collect("Progressive Backpack") + number_owned_backpacks = self.multiworld.state.prog_items[self.player]["Progressive Backpack"] + + +class TestAvailableBackpacksSize4(SVTestBase): + options = { + SeasonRandomization: SeasonRandomization.option_disabled, + Cropsanity: Cropsanity.option_disabled, + BackpackProgression: BackpackProgression.option_progressive, + BackpackSize: 4, + StartWithout: frozenset({StartWithoutOptionName.backpack}), + Mods: frozenset({ModNames.big_backpack}), + } + + def test_can_purchase_correct_number_of_backpacks(self): + backpack_names = ["Small Pack", "Large Pack", "Deluxe Pack", "Premium Pack"] + backpack_location_names = [] + for backpack_name in backpack_names: + for i in range(1, 4): + backpack_location_names.append(f"{backpack_name} {i}") + + items_required = ["Shipping Bin", "Progressive Hoe", "Progressive Watering Can"] + for item in items_required: + self.collect(item) + self.collect_lots_of_money(0.15) + + number_owned_backpacks = self.multiworld.state.prog_items[self.player]["Progressive Backpack"] + while number_owned_backpacks * 4 < 48: + number_available = number_owned_backpacks + 1 + with self.subTest(f"Can Purchase {number_available} backpacks when you own {number_owned_backpacks} backpacks"): + for i in range(0, len(backpack_location_names)): + if i < number_available: + self.assert_can_reach_location(backpack_location_names[i]) + else: + self.assert_cannot_reach_location(backpack_location_names[i]) + self.collect("Progressive Backpack") + number_owned_backpacks = self.multiworld.state.prog_items[self.player]["Progressive Backpack"] + + +class TestBeachBridgeWithStartingToolsRequiresNothing(SVTestBase): + options = { + ToolProgression: ToolProgression.option_progressive, + StartWithout: StartWithout.preset_none, + } + + def test_beach_bridge_requires_axe(self): + beach_bridge_location = "Beach Bridge Repair" + self.assert_can_reach_location(beach_bridge_location) + + +class TestBeachBridgeWithoutStartingToolsRequiresAxe(SVTestBase): + options = { + ToolProgression: ToolProgression.option_progressive, + StartWithout: frozenset({StartWithoutOptionName.tools}), + } + + def test_beach_bridge_requires_axe(self): + beach_bridge_location = "Beach Bridge Repair" + self.assert_cannot_reach_location(beach_bridge_location) + self.collect("Progressive Axe") + self.assert_can_reach_location(beach_bridge_location) + + +class TestGrimReaperWithStartingToolsRequiresQuarryAndWeapon(SVTestBase): + options = { + ToolProgression: ToolProgression.option_progressive, + StartWithout: StartWithout.preset_none, + } + + def test_grim_reaper_requires_two_weapons(self): + grim_reaper_location = "Grim Reaper Statue" + self.assert_cannot_reach_location(grim_reaper_location) + self.collect("Landslide Removed") + self.collect("Bridge Repair") + self.assert_cannot_reach_location(grim_reaper_location) + self.collect("Progressive Weapon") + self.assert_cannot_reach_location(grim_reaper_location) + self.collect("Progressive Weapon") + self.assert_can_reach_location(grim_reaper_location) + + +class TestGrimRepairWithoutStartingToolsRequiresQuarryAndPickaxeAndWeapon(SVTestBase): + options = { + ToolProgression: ToolProgression.option_progressive, + StartWithout: frozenset({StartWithoutOptionName.tools}), + } + + def test_grim_reaper_requires_weapon_and_pickaxe(self): + grim_reaper_location = "Grim Reaper Statue" + self.assert_cannot_reach_location(grim_reaper_location) + self.collect("Mountain Shortcuts") + self.collect("Bridge Repair") + self.assert_cannot_reach_location(grim_reaper_location) + self.collect("Progressive Weapon") + self.assert_cannot_reach_location(grim_reaper_location) + self.collect("Progressive Weapon") + self.assert_cannot_reach_location(grim_reaper_location) + self.collect("Progressive Pickaxe") + self.assert_can_reach_location(grim_reaper_location) + + +class TestGatheringQuestsWithStartingToolsRequiresMinesAccess(SVTestBase): + options = { + ToolProgression: ToolProgression.option_progressive, + StartWithout: frozenset({StartWithoutOptionName.landslide}), + QuestLocations: 7, + } + + def test_gathering_quest_requires_landslide(self): + gathering_location = "Help Wanted: Gathering 1" + self.assert_cannot_reach_location(gathering_location) + self.collect("Landslide Removed") + self.assert_can_reach_location(gathering_location) + + +class TestGatheringQuestsWithoutStartingToolsRequiresMinesAndAxeAndPickaxe(SVTestBase): + options = { + ToolProgression: ToolProgression.option_progressive, + StartWithout: frozenset({StartWithoutOptionName.tools, StartWithoutOptionName.landslide}), + QuestLocations: 7, + } + + def test_gathering_quest_requires_landslide_axe_and_pickaxe(self): + gathering_location = "Help Wanted: Gathering 1" + axe = self.create_item("Progressive Axe") + self.assert_cannot_reach_location(gathering_location) + self.collect("Landslide Removed") + self.assert_cannot_reach_location(gathering_location) + self.collect(axe) + self.assert_cannot_reach_location(gathering_location) + self.collect("Progressive Pickaxe") + self.assert_can_reach_location(gathering_location) + self.remove(axe) + self.assert_cannot_reach_location(gathering_location) + + +class TestPrizeTicketAndHelpWanted(SVTestBase): + options = { + ToolProgression: ToolProgression.option_progressive, + StartWithout: frozenset({StartWithoutOptionName.tools, StartWithoutOptionName.landslide}), + QuestLocations: 7, + Booksanity: Booksanity.option_all, + Hatsanity: Hatsanity.preset_all, + } + + def test_prize_tickets_requires_all_help_wanteds_help_wanted(self): + locations = ["Wear Sports Cap", "Wear Chicken Mask", "Wear Polka Bow"] # , "Read Friendship 101"] # Friendship 101's bookseller source messes this up + items_required = ["Shipping Bin", "Progressive Fishing Rod", "Spring", "Progressive Mine Elevator", "Progressive Hoe", "Progressive Watering Can"] + for item in items_required: + self.collect(item) + self.collect_lots_of_money(0.75) + items_to_test = [self.create_item(item) for item in ["Progressive Fishing Rod", "Landslide Removed", "Progressive Axe", + "Progressive Pickaxe", "Progressive Weapon"]] + self.collect(items_to_test) + for location in locations: + with self.subTest(f"{location} can be accessed with all help wanted items"): + self.assert_can_reach_location(location) + for item in items_to_test: + self.remove(item) + with self.subTest(f"{location} Requires {item.name}"): + self.assert_cannot_reach_location(location) + self.collect(item) + self.assert_can_reach_location(location) + + +class TestSecretFishingRequiresFishingLevelsForDistance(SVTestBase): + options = { + SkillProgression: SkillProgression.option_progressive_with_masteries, + ToolProgression: ToolProgression.option_progressive, + StartWithout: frozenset({StartWithoutOptionName.tools}), + Secretsanity: frozenset([SecretsanityOptionName.fishing]), + } + + def test_pyramid_decal_requires_level_1(self): + pyramid_decal_location = "Fishing Secret: Pyramid Decal" + items_required = ["Progressive Fishing Rod", "Shipping Bin"] * 5 + for item in items_required: + self.collect(item) + items_to_test = [self.create_item(item) for item in ["Bus Repair", "Fishing Level"]] + self.collect(items_to_test) + self.assert_can_reach_location(pyramid_decal_location) + for item in items_to_test: + with self.subTest(f"{pyramid_decal_location} Requires {item.name}"): + self.remove(item) + self.assert_cannot_reach_location(pyramid_decal_location) + self.collect(item) + self.assert_can_reach_location(pyramid_decal_location) + + def test_foliage_print_requires_level_4(self): + foliage_print_location = "Fishing Secret: Foliage Print" + items_required = ["Progressive Fishing Rod", "Shipping Bin"] * 5 + items_required.extend(["Fishing Level"] * 3) + for item in items_required: + self.collect(item) + items_to_test = [self.create_item(item) for item in ["Boat Repair", "Island North Turtle", "Fishing Level"]] + self.collect(items_to_test) + self.assert_can_reach_location(foliage_print_location) + for item in items_to_test: + with self.subTest(f"I{foliage_print_location} Requires {item.name}"): + self.remove(item) + self.assert_cannot_reach_location(foliage_print_location) + self.collect(item) + self.assert_can_reach_location(foliage_print_location) + + def test_iridium_krobus_requires_level_15(self): + iridium_krobus_location = "Fishing Secret: Iridium Krobus" + items_required = ["Progressive Sword", "Progressive Pickaxe", "Progressive Footwear", "Combat Level", "Progressive House", "Landslide Removed", "Progressive Mine Elevator", + "Mining Level", "Progressive Watering Can", "Progressive Hoe", "Progressive Fishing Rod", "50 Qi Gems", "Shipping Bin"] * 10 + self.remove_one_by_name("Spring") + items_required.extend(["Summer", "Fall", "Winter"]) + items_required.extend(["Fishing Level"] * 9) + for item in items_required: + self.collect(item) + self.collect_lots_of_money(0.6) + groups_of_items_to_test = {"Quality Seafoam Pudding": [self.create_item(item) for item in + ["Fish Pond", "Qi Walnut Room", "Boat Repair", "Island West Turtle", "Fishing Level"]], + "Enchanted Rod and Seafoam Pudding": [self.create_item(item) for item in + ["Bus Repair", "Fish Pond", "Boat Repair", "Island North Turtle", "Fishing Level", + "Skull Key"]], + "Desert Chef and Escargot": [self.create_item(item) for item in + ["Bus Repair", "Fishing Level", "Garlic Seeds", "Spring"]], + } + for item_group_to_test in groups_of_items_to_test: + items_to_test = groups_of_items_to_test[item_group_to_test] + with self.subTest(f"{iridium_krobus_location} Requires {item_group_to_test}"): + self.collect(items_to_test) + self.assert_can_reach_location(iridium_krobus_location) + for item in items_to_test: + with self.subTest(f"{iridium_krobus_location} Requires {item_group_to_test} [{item.name}]"): + self.remove(item) + self.assert_cannot_reach_location(iridium_krobus_location) + self.collect(item) + self.assert_can_reach_location(iridium_krobus_location) + self.remove(items_to_test) + + +class TestArtifactSpotDonationsRequireHoe(SVTestBase): + options = { + ToolProgression: ToolProgression.option_progressive, + StartWithout: frozenset({StartWithoutOptionName.tools}), + Museumsanity: Museumsanity.option_all, + } + + def test_artifact_spot_requires_hoe(self): + artifact_spot_artifacts = ["Chipped Amphora", "Ancient Doll", "Rusty Spoon", "Chicken Statue", "Prehistoric Tool"] + self.collect_lots_of_money(0.5) + self.collect("Traveling Merchant Metal Detector", 2) + hoe = self.create_item("Progressive Hoe") + for artifact in artifact_spot_artifacts: + with self.subTest(f"Artifact: {artifact}"): + artifact_location = f"Museumsanity: {artifact}" + self.assert_cannot_reach_location(artifact_location) + self.collect(hoe) + self.assert_can_reach_location(artifact_location) + self.remove(hoe) diff --git a/worlds/stardew_valley/test/TestMovies.py b/worlds/stardew_valley/test/TestMovies.py index 3ad092bd5a2a..9cae34f4eb1d 100644 --- a/worlds/stardew_valley/test/TestMovies.py +++ b/worlds/stardew_valley/test/TestMovies.py @@ -1,85 +1,85 @@ -from .bases import SVTestBase -from .. import SeasonRandomization -from ..data.movies import movies_by_name -from ..options import Moviesanity - - -class MovieTestBase(SVTestBase): - - def test_all_movies_require_theater_and_season(self): - if Moviesanity.internal_name not in self.options or self.options[Moviesanity.internal_name] == Moviesanity.option_none: - return - self.collect_lots_of_money(0.5) - [self.collect(snack) for snack in ["Movie Drinks", "Movie Sweet Snacks", "Movie Salty Snacks"]] - theater_items = [self.create_item("Progressive Movie Theater"), self.create_item("Progressive Movie Theater")] - [self.remove_one_by_name(season) for season in ["Spring", "Summer", "Fall", "Winter"]] - for movie_name in movies_by_name: - movie = movies_by_name[movie_name] - movie_location = f"Watch {movie_name}" - self.collect(movie.season) - with self.subTest(f"{movie_location} requires two movie theaters"): - self.assert_cannot_reach_location(movie_location) - self.collect(theater_items[0]) - self.assert_cannot_reach_location(movie_location) - self.collect(theater_items[1]) - self.assert_can_reach_location(movie_location) - self.remove_one_by_name(movie.season) - with self.subTest(f"{movie_location} requires {movie.season}"): - self.assert_cannot_reach_location(movie_location) - self.collect(movie.season) - self.assert_can_reach_location(movie_location) - self.remove(theater_items) - self.remove_one_by_name(movie.season) - - -class TestOneMovie(SVTestBase): - options = { - SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Moviesanity.internal_name: Moviesanity.option_one - } - - def test_all_movies_require_theater_and_season(self): - self.collect_lots_of_money(0.5) - theater_items = [self.create_item("Progressive Movie Theater"), self.create_item("Progressive Movie Theater")] - movie_location = f"Watch A Movie" - with self.subTest(f"{movie_location} requires two movie theaters"): - self.assert_cannot_reach_location(movie_location) - self.collect(theater_items[0]) - self.assert_cannot_reach_location(movie_location) - self.collect(theater_items[1]) - self.assert_can_reach_location(movie_location) - - -class TestAllMovies(MovieTestBase): - options = { - SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Moviesanity.internal_name: Moviesanity.option_all_movies - } - - -class TestAllMoviesLoved(MovieTestBase): - options = { - SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Moviesanity.internal_name: Moviesanity.option_all_movies_loved - } - - -class TestAllMoviesAndAllSnacks(MovieTestBase): - options = { - SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Moviesanity.internal_name: Moviesanity.option_all_movies_and_all_snacks - } - - -class TestAllMoviesWithLovedSnack(MovieTestBase): - options = { - SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Moviesanity.internal_name: Moviesanity.option_all_movies_with_loved_snack - } - - -class TestAllMoviesAndAllLovedSnacks(MovieTestBase): - options = { - SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Moviesanity.internal_name: Moviesanity.option_all_movies_and_all_loved_snacks +from .bases import SVTestBase +from .. import SeasonRandomization +from ..data.movies import movies_by_name +from ..options import Moviesanity + + +class MovieTestBase(SVTestBase): + + def test_all_movies_require_theater_and_season(self): + if Moviesanity.internal_name not in self.options or self.options[Moviesanity.internal_name] == Moviesanity.option_none: + return + self.collect_lots_of_money(0.5) + [self.collect(snack) for snack in ["Movie Drinks", "Movie Sweet Snacks", "Movie Salty Snacks"]] + theater_items = [self.create_item("Progressive Movie Theater"), self.create_item("Progressive Movie Theater")] + [self.remove_one_by_name(season) for season in ["Spring", "Summer", "Fall", "Winter"]] + for movie_name in movies_by_name: + movie = movies_by_name[movie_name] + movie_location = f"Watch {movie_name}" + self.collect(movie.season) + with self.subTest(f"{movie_location} requires two movie theaters"): + self.assert_cannot_reach_location(movie_location) + self.collect(theater_items[0]) + self.assert_cannot_reach_location(movie_location) + self.collect(theater_items[1]) + self.assert_can_reach_location(movie_location) + self.remove_one_by_name(movie.season) + with self.subTest(f"{movie_location} requires {movie.season}"): + self.assert_cannot_reach_location(movie_location) + self.collect(movie.season) + self.assert_can_reach_location(movie_location) + self.remove(theater_items) + self.remove_one_by_name(movie.season) + + +class TestOneMovie(SVTestBase): + options = { + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Moviesanity.internal_name: Moviesanity.option_one + } + + def test_all_movies_require_theater_and_season(self): + self.collect_lots_of_money(0.5) + theater_items = [self.create_item("Progressive Movie Theater"), self.create_item("Progressive Movie Theater")] + movie_location = f"Watch A Movie" + with self.subTest(f"{movie_location} requires two movie theaters"): + self.assert_cannot_reach_location(movie_location) + self.collect(theater_items[0]) + self.assert_cannot_reach_location(movie_location) + self.collect(theater_items[1]) + self.assert_can_reach_location(movie_location) + + +class TestAllMovies(MovieTestBase): + options = { + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Moviesanity.internal_name: Moviesanity.option_all_movies + } + + +class TestAllMoviesLoved(MovieTestBase): + options = { + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Moviesanity.internal_name: Moviesanity.option_all_movies_loved + } + + +class TestAllMoviesAndAllSnacks(MovieTestBase): + options = { + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Moviesanity.internal_name: Moviesanity.option_all_movies_and_all_snacks + } + + +class TestAllMoviesWithLovedSnack(MovieTestBase): + options = { + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Moviesanity.internal_name: Moviesanity.option_all_movies_with_loved_snack + } + + +class TestAllMoviesAndAllLovedSnacks(MovieTestBase): + options = { + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Moviesanity.internal_name: Moviesanity.option_all_movies_and_all_loved_snacks } \ No newline at end of file diff --git a/worlds/stardew_valley/test/test_options/TestDynamicGingerIslandOptions.py b/worlds/stardew_valley/test/test_options/TestDynamicGingerIslandOptions.py index 8d8d5c4f1168..e3f31f37f63a 100644 --- a/worlds/stardew_valley/test/test_options/TestDynamicGingerIslandOptions.py +++ b/worlds/stardew_valley/test/test_options/TestDynamicGingerIslandOptions.py @@ -1,41 +1,41 @@ -import unittest -from typing import ClassVar - -from test.param import classvar_matrix -from ..options.option_names import get_all_option_choices -from ...options import ExcludeGingerIsland, ArcadeMachineLocations, BackpackProgression, BackpackSize, \ - BundlePerRoom, BundlePrice, ElevatorProgression, FarmType, SeasonRandomization, FestivalLocations, Moviesanity, Museumsanity, ToolProgression -from ...test.assertion import WorldAssertMixin -from ...test.bases import SVTestCase, solo_multiworld, skip_long_tests - -if skip_long_tests(): - raise unittest.SkipTest("Long tests disabled") - -# These options affect logic, but are unrelated to any ginger island content, so pointless for this specific test class -extra_options_to_ignore = [ArcadeMachineLocations.internal_name, BackpackProgression.internal_name, BackpackSize.internal_name, BundlePerRoom.internal_name, - BundlePrice.internal_name, ElevatorProgression.internal_name, FarmType.internal_name, SeasonRandomization.internal_name, - FestivalLocations.internal_name, Moviesanity.internal_name, Museumsanity.internal_name, ToolProgression.internal_name] - - -@classvar_matrix(option_and_choice=get_all_option_choices(extra_options_to_ignore)) -class TestGenerateAllOptionsWithExcludeGingerIsland(WorldAssertMixin, SVTestCase): - option_and_choice: ClassVar[tuple[str, str]] - - def test_given_choice_when_generate_exclude_ginger_island_then_ginger_island_is_properly_excluded(self): - option, option_choice = self.option_and_choice - - if option == ExcludeGingerIsland.internal_name: - self.skipTest("ExcludeGingerIsland is forced to true") - - world_options = { - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, - option: option_choice - } - - with solo_multiworld(world_options) as (multiworld, stardew_world): - - if stardew_world.options.exclude_ginger_island != ExcludeGingerIsland.option_true: - self.skipTest("Some options, like goals, will force Ginger island back in the game. We want to skip testing those.") - - self.assert_basic_checks(multiworld) +import unittest +from typing import ClassVar + +from test.param import classvar_matrix +from ..options.option_names import get_all_option_choices +from ...options import ExcludeGingerIsland, ArcadeMachineLocations, BackpackProgression, BackpackSize, \ + BundlePerRoom, BundlePrice, ElevatorProgression, FarmType, SeasonRandomization, FestivalLocations, Moviesanity, Museumsanity, ToolProgression +from ...test.assertion import WorldAssertMixin +from ...test.bases import SVTestCase, solo_multiworld, skip_long_tests + +if skip_long_tests(): + raise unittest.SkipTest("Long tests disabled") + +# These options affect logic, but are unrelated to any ginger island content, so pointless for this specific test class +extra_options_to_ignore = [ArcadeMachineLocations.internal_name, BackpackProgression.internal_name, BackpackSize.internal_name, BundlePerRoom.internal_name, + BundlePrice.internal_name, ElevatorProgression.internal_name, FarmType.internal_name, SeasonRandomization.internal_name, + FestivalLocations.internal_name, Moviesanity.internal_name, Museumsanity.internal_name, ToolProgression.internal_name] + + +@classvar_matrix(option_and_choice=get_all_option_choices(extra_options_to_ignore)) +class TestGenerateAllOptionsWithExcludeGingerIsland(WorldAssertMixin, SVTestCase): + option_and_choice: ClassVar[tuple[str, str]] + + def test_given_choice_when_generate_exclude_ginger_island_then_ginger_island_is_properly_excluded(self): + option, option_choice = self.option_and_choice + + if option == ExcludeGingerIsland.internal_name: + self.skipTest("ExcludeGingerIsland is forced to true") + + world_options = { + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + option: option_choice + } + + with solo_multiworld(world_options) as (multiworld, stardew_world): + + if stardew_world.options.exclude_ginger_island != ExcludeGingerIsland.option_true: + self.skipTest("Some options, like goals, will force Ginger island back in the game. We want to skip testing those.") + + self.assert_basic_checks(multiworld) self.assert_no_ginger_island_content(multiworld) \ No newline at end of file diff --git a/worlds/stardew_valley/test/test_options/TestDynamicOptions.py b/worlds/stardew_valley/test/test_options/TestDynamicOptions.py index 7770b4b38432..f2a738c89a3e 100644 --- a/worlds/stardew_valley/test/test_options/TestDynamicOptions.py +++ b/worlds/stardew_valley/test/test_options/TestDynamicOptions.py @@ -1,25 +1,25 @@ -import unittest -from typing import ClassVar - -from test.param import classvar_matrix -from ..options.option_names import get_all_option_choices -from ...options import BackpackProgression, BackpackSize, BundlePerRoom, BundlePrice, FarmType -from ...test.assertion import WorldAssertMixin -from ...test.bases import SVTestCase, solo_multiworld, skip_long_tests - -if skip_long_tests(): - raise unittest.SkipTest("Long tests disabled") - -extra_options_to_ignore = [BackpackProgression.internal_name, BackpackSize.internal_name, BundlePerRoom.internal_name, - BundlePrice.internal_name, FarmType.internal_name] - - -@classvar_matrix(option_and_choice=get_all_option_choices(extra_options_to_ignore)) -class TestGenerateDynamicOptions(WorldAssertMixin, SVTestCase): - option_and_choice: ClassVar[tuple[str, str]] - - def test_given_option_and_choice_when_generate_then_basic_checks(self): - option, choice = self.option_and_choice - world_options = {option: choice} - with solo_multiworld(world_options) as (multiworld, stardew_world): +import unittest +from typing import ClassVar + +from test.param import classvar_matrix +from ..options.option_names import get_all_option_choices +from ...options import BackpackProgression, BackpackSize, BundlePerRoom, BundlePrice, FarmType +from ...test.assertion import WorldAssertMixin +from ...test.bases import SVTestCase, solo_multiworld, skip_long_tests + +if skip_long_tests(): + raise unittest.SkipTest("Long tests disabled") + +extra_options_to_ignore = [BackpackProgression.internal_name, BackpackSize.internal_name, BundlePerRoom.internal_name, + BundlePrice.internal_name, FarmType.internal_name] + + +@classvar_matrix(option_and_choice=get_all_option_choices(extra_options_to_ignore)) +class TestGenerateDynamicOptions(WorldAssertMixin, SVTestCase): + option_and_choice: ClassVar[tuple[str, str]] + + def test_given_option_and_choice_when_generate_then_basic_checks(self): + option, choice = self.option_and_choice + world_options = {option: choice} + with solo_multiworld(world_options) as (multiworld, stardew_world): self.assert_basic_checks(multiworld) \ No newline at end of file diff --git a/worlds/stardew_valley/test/test_options/TestGoal.py b/worlds/stardew_valley/test/test_options/TestGoal.py index 2f0b3e7b8a45..58a77ec254e2 100644 --- a/worlds/stardew_valley/test/test_options/TestGoal.py +++ b/worlds/stardew_valley/test/test_options/TestGoal.py @@ -1,27 +1,27 @@ -from typing import ClassVar - -from test.param import classvar_matrix -from ...options import Goal -from ...strings.goal_names import Goal as GoalName -from ...test.bases import SVTestCase, solo_multiworld - - -@classvar_matrix(goal_and_location=[ - ("community_center", GoalName.community_center), - ("grandpa_evaluation", GoalName.grandpa_evaluation), - ("bottom_of_the_mines", GoalName.bottom_of_the_mines), - ("cryptic_note", GoalName.cryptic_note), - ("master_angler", GoalName.master_angler), - ("complete_collection", GoalName.complete_museum), - ("full_house", GoalName.full_house), - ("perfection", GoalName.perfection), -]) -class TestGoal(SVTestCase): - goal_and_location: ClassVar[tuple[str, str]] - - def test_given_goal_when_generate_then_victory_is_in_correct_location(self): - goal, location = self.goal_and_location - world_options = {Goal.internal_name: goal} - with solo_multiworld(world_options) as (multi_world, _): - victory = multi_world.find_item("Victory", 1) +from typing import ClassVar + +from test.param import classvar_matrix +from ...options import Goal +from ...strings.goal_names import Goal as GoalName +from ...test.bases import SVTestCase, solo_multiworld + + +@classvar_matrix(goal_and_location=[ + ("community_center", GoalName.community_center), + ("grandpa_evaluation", GoalName.grandpa_evaluation), + ("bottom_of_the_mines", GoalName.bottom_of_the_mines), + ("cryptic_note", GoalName.cryptic_note), + ("master_angler", GoalName.master_angler), + ("complete_collection", GoalName.complete_museum), + ("full_house", GoalName.full_house), + ("perfection", GoalName.perfection), +]) +class TestGoal(SVTestCase): + goal_and_location: ClassVar[tuple[str, str]] + + def test_given_goal_when_generate_then_victory_is_in_correct_location(self): + goal, location = self.goal_and_location + world_options = {Goal.internal_name: goal} + with solo_multiworld(world_options) as (multi_world, _): + victory = multi_world.find_item("Victory", 1) self.assertEqual(victory.name, location) \ No newline at end of file diff --git a/worlds/stardew_valley/test/test_options/TestOptionFlags.py b/worlds/stardew_valley/test/test_options/TestOptionFlags.py index 9a5f4f5456a1..e71996709d8f 100644 --- a/worlds/stardew_valley/test/test_options/TestOptionFlags.py +++ b/worlds/stardew_valley/test/test_options/TestOptionFlags.py @@ -1,98 +1,98 @@ -from ...options import ToolProgression, BuildingProgression -from ...test.bases import SVTestBase - - -class TestBitFlagsVanilla(SVTestBase): - options = {ToolProgression.internal_name: ToolProgression.option_vanilla, - BuildingProgression.internal_name: BuildingProgression.option_vanilla} - - def test_options_are_not_detected_as_progressive(self): - tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = self.world.content.features.building_progression.is_progressive - self.assertFalse(tool_progressive) - self.assertFalse(building_progressive) - - def test_tools_and_buildings_not_in_pool(self): - item_names = [item.name for item in self.multiworld.itempool] - self.assertNotIn("Progressive Coop", item_names) - self.assertNotIn("Progressive Pickaxe", item_names) - - -class TestBitFlagsVanillaCheap(SVTestBase): - options = {ToolProgression.internal_name: ToolProgression.option_vanilla_cheap, - BuildingProgression.internal_name: BuildingProgression.option_vanilla_cheap} - - def test_options_are_not_detected_as_progressive(self): - tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = self.world.content.features.building_progression.is_progressive - self.assertFalse(tool_progressive) - self.assertFalse(building_progressive) - - def test_tools_and_buildings_not_in_pool(self): - item_names = [item.name for item in self.multiworld.itempool] - self.assertNotIn("Progressive Coop", item_names) - self.assertNotIn("Progressive Pickaxe", item_names) - - -class TestBitFlagsVanillaVeryCheap(SVTestBase): - options = {ToolProgression.internal_name: ToolProgression.option_vanilla_very_cheap, - BuildingProgression.internal_name: BuildingProgression.option_vanilla_very_cheap} - - def test_options_are_not_detected_as_progressive(self): - tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = self.world.content.features.building_progression.is_progressive - self.assertFalse(tool_progressive) - self.assertFalse(building_progressive) - - def test_tools_and_buildings_not_in_pool(self): - item_names = [item.name for item in self.multiworld.itempool] - self.assertNotIn("Progressive Coop", item_names) - self.assertNotIn("Progressive Pickaxe", item_names) - - -class TestBitFlagsProgressive(SVTestBase): - options = {ToolProgression.internal_name: ToolProgression.option_progressive, - BuildingProgression.internal_name: BuildingProgression.option_progressive} - - def test_options_are_detected_as_progressive(self): - tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = self.world.content.features.building_progression.is_progressive - self.assertTrue(tool_progressive) - self.assertTrue(building_progressive) - - def test_tools_and_buildings_in_pool(self): - item_names = [item.name for item in self.multiworld.itempool] - self.assertIn("Progressive Coop", item_names) - self.assertIn("Progressive Pickaxe", item_names) - - -class TestBitFlagsProgressiveCheap(SVTestBase): - options = {ToolProgression.internal_name: ToolProgression.option_progressive_cheap, - BuildingProgression.internal_name: BuildingProgression.option_progressive_cheap} - - def test_options_are_detected_as_progressive(self): - tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = self.world.content.features.building_progression.is_progressive - self.assertTrue(tool_progressive) - self.assertTrue(building_progressive) - - def test_tools_and_buildings_in_pool(self): - item_names = [item.name for item in self.multiworld.itempool] - self.assertIn("Progressive Coop", item_names) - self.assertIn("Progressive Pickaxe", item_names) - - -class TestBitFlagsProgressiveVeryCheap(SVTestBase): - options = {ToolProgression.internal_name: ToolProgression.option_progressive_very_cheap, - BuildingProgression.internal_name: BuildingProgression.option_progressive_very_cheap} - - def test_options_are_detected_as_progressive(self): - tool_progressive = self.world.content.features.tool_progression.is_progressive - building_progressive = self.world.content.features.building_progression.is_progressive - self.assertTrue(tool_progressive) - self.assertTrue(building_progressive) - - def test_tools_and_buildings_in_pool(self): - item_names = [item.name for item in self.multiworld.itempool] - self.assertIn("Progressive Coop", item_names) - self.assertIn("Progressive Pickaxe", item_names) +from ...options import ToolProgression, BuildingProgression +from ...test.bases import SVTestBase + + +class TestBitFlagsVanilla(SVTestBase): + options = {ToolProgression.internal_name: ToolProgression.option_vanilla, + BuildingProgression.internal_name: BuildingProgression.option_vanilla} + + def test_options_are_not_detected_as_progressive(self): + tool_progressive = self.world.content.features.tool_progression.is_progressive + building_progressive = self.world.content.features.building_progression.is_progressive + self.assertFalse(tool_progressive) + self.assertFalse(building_progressive) + + def test_tools_and_buildings_not_in_pool(self): + item_names = [item.name for item in self.multiworld.itempool] + self.assertNotIn("Progressive Coop", item_names) + self.assertNotIn("Progressive Pickaxe", item_names) + + +class TestBitFlagsVanillaCheap(SVTestBase): + options = {ToolProgression.internal_name: ToolProgression.option_vanilla_cheap, + BuildingProgression.internal_name: BuildingProgression.option_vanilla_cheap} + + def test_options_are_not_detected_as_progressive(self): + tool_progressive = self.world.content.features.tool_progression.is_progressive + building_progressive = self.world.content.features.building_progression.is_progressive + self.assertFalse(tool_progressive) + self.assertFalse(building_progressive) + + def test_tools_and_buildings_not_in_pool(self): + item_names = [item.name for item in self.multiworld.itempool] + self.assertNotIn("Progressive Coop", item_names) + self.assertNotIn("Progressive Pickaxe", item_names) + + +class TestBitFlagsVanillaVeryCheap(SVTestBase): + options = {ToolProgression.internal_name: ToolProgression.option_vanilla_very_cheap, + BuildingProgression.internal_name: BuildingProgression.option_vanilla_very_cheap} + + def test_options_are_not_detected_as_progressive(self): + tool_progressive = self.world.content.features.tool_progression.is_progressive + building_progressive = self.world.content.features.building_progression.is_progressive + self.assertFalse(tool_progressive) + self.assertFalse(building_progressive) + + def test_tools_and_buildings_not_in_pool(self): + item_names = [item.name for item in self.multiworld.itempool] + self.assertNotIn("Progressive Coop", item_names) + self.assertNotIn("Progressive Pickaxe", item_names) + + +class TestBitFlagsProgressive(SVTestBase): + options = {ToolProgression.internal_name: ToolProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive} + + def test_options_are_detected_as_progressive(self): + tool_progressive = self.world.content.features.tool_progression.is_progressive + building_progressive = self.world.content.features.building_progression.is_progressive + self.assertTrue(tool_progressive) + self.assertTrue(building_progressive) + + def test_tools_and_buildings_in_pool(self): + item_names = [item.name for item in self.multiworld.itempool] + self.assertIn("Progressive Coop", item_names) + self.assertIn("Progressive Pickaxe", item_names) + + +class TestBitFlagsProgressiveCheap(SVTestBase): + options = {ToolProgression.internal_name: ToolProgression.option_progressive_cheap, + BuildingProgression.internal_name: BuildingProgression.option_progressive_cheap} + + def test_options_are_detected_as_progressive(self): + tool_progressive = self.world.content.features.tool_progression.is_progressive + building_progressive = self.world.content.features.building_progression.is_progressive + self.assertTrue(tool_progressive) + self.assertTrue(building_progressive) + + def test_tools_and_buildings_in_pool(self): + item_names = [item.name for item in self.multiworld.itempool] + self.assertIn("Progressive Coop", item_names) + self.assertIn("Progressive Pickaxe", item_names) + + +class TestBitFlagsProgressiveVeryCheap(SVTestBase): + options = {ToolProgression.internal_name: ToolProgression.option_progressive_very_cheap, + BuildingProgression.internal_name: BuildingProgression.option_progressive_very_cheap} + + def test_options_are_detected_as_progressive(self): + tool_progressive = self.world.content.features.tool_progression.is_progressive + building_progressive = self.world.content.features.building_progression.is_progressive + self.assertTrue(tool_progressive) + self.assertTrue(building_progressive) + + def test_tools_and_buildings_in_pool(self): + item_names = [item.name for item in self.multiworld.itempool] + self.assertIn("Progressive Coop", item_names) + self.assertIn("Progressive Pickaxe", item_names) diff --git a/worlds/stardew_valley/test/test_options/TestSeasonOptions.py b/worlds/stardew_valley/test/test_options/TestSeasonOptions.py index ce26e216af58..126067972a75 100644 --- a/worlds/stardew_valley/test/test_options/TestSeasonOptions.py +++ b/worlds/stardew_valley/test/test_options/TestSeasonOptions.py @@ -1,28 +1,28 @@ -from ...options import SeasonRandomization -from ...strings.season_names import Season -from ...test.bases import SVTestCase, solo_multiworld - - -SEASONS = {Season.spring, Season.summer, Season.fall, Season.winter} - - -class TestSeasonOptions(SVTestCase): - def test_given_disabled_when_generate_then_all_seasons_are_precollected(self): - world_options = {SeasonRandomization.internal_name: SeasonRandomization.option_disabled} - with solo_multiworld(world_options) as (multi_world, _): - precollected_items = {item.name for item in multi_world.precollected_items[1]} - self.assertTrue(all([season in precollected_items for season in SEASONS])) - - def test_given_randomized_when_generate_then_all_seasons_are_in_the_pool_or_precollected(self): - world_options = {SeasonRandomization.internal_name: SeasonRandomization.option_randomized} - with solo_multiworld(world_options) as (multi_world, _): - precollected_items = {item.name for item in multi_world.precollected_items[1]} - items = {item.name for item in multi_world.get_items()} | precollected_items - self.assertTrue(all([season in items for season in SEASONS])) - self.assertEqual(len(SEASONS.intersection(precollected_items)), 1) - - def test_given_progressive_when_generate_then_3_progressive_seasons_are_in_the_pool(self): - world_options = {SeasonRandomization.internal_name: SeasonRandomization.option_progressive} - with solo_multiworld(world_options) as (multi_world, _): - items = [item.name for item in multi_world.get_items()] +from ...options import SeasonRandomization +from ...strings.season_names import Season +from ...test.bases import SVTestCase, solo_multiworld + + +SEASONS = {Season.spring, Season.summer, Season.fall, Season.winter} + + +class TestSeasonOptions(SVTestCase): + def test_given_disabled_when_generate_then_all_seasons_are_precollected(self): + world_options = {SeasonRandomization.internal_name: SeasonRandomization.option_disabled} + with solo_multiworld(world_options) as (multi_world, _): + precollected_items = {item.name for item in multi_world.precollected_items[1]} + self.assertTrue(all([season in precollected_items for season in SEASONS])) + + def test_given_randomized_when_generate_then_all_seasons_are_in_the_pool_or_precollected(self): + world_options = {SeasonRandomization.internal_name: SeasonRandomization.option_randomized} + with solo_multiworld(world_options) as (multi_world, _): + precollected_items = {item.name for item in multi_world.precollected_items[1]} + items = {item.name for item in multi_world.get_items()} | precollected_items + self.assertTrue(all([season in items for season in SEASONS])) + self.assertEqual(len(SEASONS.intersection(precollected_items)), 1) + + def test_given_progressive_when_generate_then_3_progressive_seasons_are_in_the_pool(self): + world_options = {SeasonRandomization.internal_name: SeasonRandomization.option_progressive} + with solo_multiworld(world_options) as (multi_world, _): + items = [item.name for item in multi_world.get_items()] self.assertEqual(items.count(Season.progressive), 3) \ No newline at end of file diff --git a/worlds/stardew_valley/test/test_options/TestToolOptions.py b/worlds/stardew_valley/test/test_options/TestToolOptions.py index 3e5272288b29..532704628e25 100644 --- a/worlds/stardew_valley/test/test_options/TestToolOptions.py +++ b/worlds/stardew_valley/test/test_options/TestToolOptions.py @@ -1,45 +1,45 @@ -import itertools -from collections import Counter - -from BaseClasses import ItemClassification -from ...options import ToolProgression, StartWithout -from ...strings.tool_names import ToolMaterial, Tool, APTool -from ...test.bases import SVTestBase - -TOOLS = {"Hoe", "Pickaxe", "Axe", "Watering Can", "Trash Can", "Fishing Rod"} - - -class TestToolProgression(SVTestBase): - options = { - ToolProgression.internal_name: ToolProgression.option_progressive, - StartWithout.internal_name: StartWithout.preset_none, - } - - def test_given_progressive_when_generate_then_tool_upgrades_are_locations(self): - locations = set(self.get_real_location_names()) - for material, tool in itertools.product(ToolMaterial.tiers.values(), - [Tool.hoe, Tool.pickaxe, Tool.axe, Tool.watering_can, Tool.trash_can]): - if material == ToolMaterial.basic: - continue - self.assertIn(f"{material} {tool} Upgrade", locations) - self.assertIn("Purchase Training Rod", locations) - self.assertIn("Bamboo Pole Cutscene", locations) - self.assertIn("Purchase Fiberglass Rod", locations) - self.assertIn("Purchase Iridium Rod", locations) - - def test_given_progressive_when_generate_then_last_trash_can_is_classified_differently(self): - trash_cans = self.get_items_by_name(APTool.trash_can) - progressive_count = sum([1 for item in trash_cans if item.classification == ItemClassification.progression]) - special_count = sum([1 for item in trash_cans if item.classification == ItemClassification.useful]) - - self.assertEqual(3, progressive_count) - self.assertEqual(1, special_count) - - def test_given_progressive_when_generate_then_last_trash_can_changes_classification_post_fill(self): - trash_can, post_fill_classification = next((classification_to_update - for classification_to_update in self.world.classifications_to_override_post_fill - if classification_to_update[0].name == APTool.trash_can), - (None, None)) - - self.assertEqual(post_fill_classification, ItemClassification.progression_skip_balancing) - self.assertEqual(Counter(), trash_can.events_to_collect) +import itertools +from collections import Counter + +from BaseClasses import ItemClassification +from ...options import ToolProgression, StartWithout +from ...strings.tool_names import ToolMaterial, Tool, APTool +from ...test.bases import SVTestBase + +TOOLS = {"Hoe", "Pickaxe", "Axe", "Watering Can", "Trash Can", "Fishing Rod"} + + +class TestToolProgression(SVTestBase): + options = { + ToolProgression.internal_name: ToolProgression.option_progressive, + StartWithout.internal_name: StartWithout.preset_none, + } + + def test_given_progressive_when_generate_then_tool_upgrades_are_locations(self): + locations = set(self.get_real_location_names()) + for material, tool in itertools.product(ToolMaterial.tiers.values(), + [Tool.hoe, Tool.pickaxe, Tool.axe, Tool.watering_can, Tool.trash_can]): + if material == ToolMaterial.basic: + continue + self.assertIn(f"{material} {tool} Upgrade", locations) + self.assertIn("Purchase Training Rod", locations) + self.assertIn("Bamboo Pole Cutscene", locations) + self.assertIn("Purchase Fiberglass Rod", locations) + self.assertIn("Purchase Iridium Rod", locations) + + def test_given_progressive_when_generate_then_last_trash_can_is_classified_differently(self): + trash_cans = self.get_items_by_name(APTool.trash_can) + progressive_count = sum([1 for item in trash_cans if item.classification == ItemClassification.progression]) + special_count = sum([1 for item in trash_cans if item.classification == ItemClassification.useful]) + + self.assertEqual(3, progressive_count) + self.assertEqual(1, special_count) + + def test_given_progressive_when_generate_then_last_trash_can_changes_classification_post_fill(self): + trash_can, post_fill_classification = next((classification_to_update + for classification_to_update in self.world.classifications_to_override_post_fill + if classification_to_update[0].name == APTool.trash_can), + (None, None)) + + self.assertEqual(post_fill_classification, ItemClassification.progression_skip_balancing) + self.assertEqual(Counter(), trash_can.events_to_collect) diff --git a/worlds/stardew_valley/test/test_options/TestTrapOptions.py b/worlds/stardew_valley/test/test_options/TestTrapOptions.py index 1548b4943711..47b44e30cc9b 100644 --- a/worlds/stardew_valley/test/test_options/TestTrapOptions.py +++ b/worlds/stardew_valley/test/test_options/TestTrapOptions.py @@ -1,28 +1,28 @@ -from ...items import items_by_group, Group -from ...options import TrapDifficulty -from ...test.bases import SVTestCase, solo_multiworld -from ...test.options.presets import allsanity_mods_7_x_x, allsanity_no_mods_7_x_x - - -class TestTraps(SVTestCase): - def test_given_no_traps_when_generate_then_no_trap_in_pool(self): - world_options = allsanity_no_mods_7_x_x().copy() - world_options[TrapDifficulty.internal_name] = TrapDifficulty.option_no_traps - with solo_multiworld(world_options) as (multi_world, _): - trap_items = [item_data.name for item_data in items_by_group[Group.TRAP]] - multiworld_items = [item.name for item in multi_world.get_items()] - - for item in trap_items: - with self.subTest(f"{item}"): - self.assertNotIn(item, multiworld_items) - - def test_given_traps_when_generate_then_all_traps_in_pool(self): - trap_option = TrapDifficulty - world_options = allsanity_mods_7_x_x() - world_options.update({TrapDifficulty.internal_name: trap_option.option_easy}) - with solo_multiworld(world_options) as (multi_world, _): - trap_items = [item_data.name for item_data in items_by_group[Group.TRAP] if Group.DEPRECATED not in item_data.groups] - multiworld_items = [item.name for item in multi_world.get_items()] - for item in trap_items: - with self.subTest(f"Item: {item}"): +from ...items import items_by_group, Group +from ...options import TrapDifficulty +from ...test.bases import SVTestCase, solo_multiworld +from ...test.options.presets import allsanity_mods_7_x_x, allsanity_no_mods_7_x_x + + +class TestTraps(SVTestCase): + def test_given_no_traps_when_generate_then_no_trap_in_pool(self): + world_options = allsanity_no_mods_7_x_x().copy() + world_options[TrapDifficulty.internal_name] = TrapDifficulty.option_no_traps + with solo_multiworld(world_options) as (multi_world, _): + trap_items = [item_data.name for item_data in items_by_group[Group.TRAP]] + multiworld_items = [item.name for item in multi_world.get_items()] + + for item in trap_items: + with self.subTest(f"{item}"): + self.assertNotIn(item, multiworld_items) + + def test_given_traps_when_generate_then_all_traps_in_pool(self): + trap_option = TrapDifficulty + world_options = allsanity_mods_7_x_x() + world_options.update({TrapDifficulty.internal_name: trap_option.option_easy}) + with solo_multiworld(world_options) as (multi_world, _): + trap_items = [item_data.name for item_data in items_by_group[Group.TRAP] if Group.DEPRECATED not in item_data.groups] + multiworld_items = [item.name for item in multi_world.get_items()] + for item in trap_items: + with self.subTest(f"Item: {item}"): self.assertIn(item, multiworld_items) \ No newline at end of file diff --git a/worlds/stardew_valley/utility/logging_random.py b/worlds/stardew_valley/utility/logging_random.py index 2cbe352a7cb0..eff9a13d4e81 100644 --- a/worlds/stardew_valley/utility/logging_random.py +++ b/worlds/stardew_valley/utility/logging_random.py @@ -1,35 +1,35 @@ -from random import Random - - -class LoggingRandom: - internal_random: Random - total_calls: int - - def __init__(self, seed): - # logger.warning(f"Initializing LoggingRandom with seed: {seed}") - self.internal_random = Random(seed) - self.total_calls = 0 - - def sample(self, population, k, *, counts=None): - self.total_calls += 1 - return self.internal_random.sample(population=population, k=k, counts=counts) - - def choice(self, seq): - self.total_calls += 1 - return self.internal_random.choice(seq) - - def choices(self, population, weights=None, *, cum_weights=None, k=1): - self.total_calls += 1 - return self.internal_random.choices(population=population, weights=weights, cum_weights=cum_weights) - - def randint(self, a, b): - self.total_calls += 1 - return self.internal_random.randint(a, b) - - def shuffle(self, x): - self.total_calls += 1 - return self.internal_random.shuffle(x) - - def randrange(self, start, stop=None, step=1): - self.total_calls += 1 +from random import Random + + +class LoggingRandom: + internal_random: Random + total_calls: int + + def __init__(self, seed): + # logger.warning(f"Initializing LoggingRandom with seed: {seed}") + self.internal_random = Random(seed) + self.total_calls = 0 + + def sample(self, population, k, *, counts=None): + self.total_calls += 1 + return self.internal_random.sample(population=population, k=k, counts=counts) + + def choice(self, seq): + self.total_calls += 1 + return self.internal_random.choice(seq) + + def choices(self, population, weights=None, *, cum_weights=None, k=1): + self.total_calls += 1 + return self.internal_random.choices(population=population, weights=weights, cum_weights=cum_weights) + + def randint(self, a, b): + self.total_calls += 1 + return self.internal_random.randint(a, b) + + def shuffle(self, x): + self.total_calls += 1 + return self.internal_random.shuffle(x) + + def randrange(self, start, stop=None, step=1): + self.total_calls += 1 return self.internal_random.randrange(start=start, stop=stop, step=step) \ No newline at end of file