{"version":3,"sources":["../src/common/query-base.ts","../data/achievements.json","../src/modules/achievements/index.ts","../data/animals.json","../src/modules/animals/index.ts","../data/bundles.json","../src/modules/bundles/index.ts","../data/artisan-goods.json","../src/modules/artisan-goods/index.ts","../src/modules/calculator/index.ts","../data/crops.json","../src/modules/crops/index.ts","../data/maps.json","../src/modules/maps/index.ts","../data/monster-loot.json","../data/monsters.json","../src/modules/monsters/index.ts","../data/monster-slayer-goals.json","../src/modules/monster-slayer-goals/index.ts","../data/artifacts.json","../src/modules/artifacts/index.ts","../data/bait.json","../src/modules/bait/index.ts","../data/cooking.json","../src/modules/cooking/index.ts","../data/crafting.json","../src/modules/crafting/index.ts","../data/fish.json","../src/modules/fish/index.ts","../data/footwear.json","../src/modules/footwear/index.ts","../data/forageables.json","../src/modules/forageables/index.ts","../data/hats.json","../src/modules/hats/index.ts","../data/minerals.json","../src/modules/minerals/index.ts","../data/rarecrows.json","../src/modules/rarecrows/index.ts","../data/rings.json","../src/modules/rings/index.ts","../data/tackle.json","../src/modules/tackle/index.ts","../data/tools.json","../src/modules/tools/index.ts","../data/trees.json","../src/modules/trees/index.ts","../data/weapons.json","../src/modules/weapons/index.ts","../src/modules/search/index.ts","../data/skills.json","../data/professions.json","../src/modules/professions/index.ts","../src/modules/skills/index.ts","../data/mixed-seeds.json","../src/modules/mixed-seeds/index.ts","../data/seasons.json","../src/modules/seasons/index.ts","../data/universal-gifts.json","../src/modules/universal-gifts/index.ts","../data/quests.json","../src/modules/quests/index.ts","../data/villagers.json","../src/modules/villagers/index.ts","../data/weather.json","../src/modules/weather/index.ts","../data/weapon-stats.json","../src/modules/weapon-stats/index.ts","../data/collections.json","../src/modules/collections/index.ts","../data/perfection.json","../src/modules/perfection/index.ts","../data/qi-shop.json","../src/modules/qi-shop/index.ts","../data/medical-supplies-shop.json","../src/modules/medical-supplies-shop/index.ts","../data/blacksmith-shop.json","../src/modules/blacksmith-shop/index.ts","../data/joja-shop.json","../src/modules/joja-shop/index.ts","../data/pierre-shop.json","../src/modules/pierre-shop/index.ts","../data/saloon-shop.json","../src/modules/saloon-shop/index.ts","../data/krobus-shop.json","../src/modules/krobus-shop/index.ts","../data/marnie-shop.json","../src/modules/marnie-shop/index.ts","../data/wizard-shop.json","../src/modules/wizard-shop/index.ts","../data/willy-shop.json","../src/modules/willy-shop/index.ts","../data/guild-shop.json","../src/modules/guild-shop/index.ts","../data/carpenter-shop.json","../src/modules/carpenter-shop/index.ts","../data/casino-shop.json","../src/modules/casino-shop/index.ts","../data/desert-trader-shop.json","../src/modules/desert-trader-shop/index.ts","../data/oasis-shop.json","../src/modules/oasis-shop/index.ts","../data/volcano-shop.json","../src/modules/volcano-shop/index.ts","../data/island-trader-shop.json","../src/modules/island-trader-shop/index.ts","../data/field-office.json","../src/modules/field-office/index.ts","../src/modules/grandpa/index.ts","../data/dwarf-shop.json","../src/modules/dwarf-shop/index.ts","../data/locations.json","../src/modules/locations/index.ts","../data/special-items.json","../src/modules/special-items/index.ts","../data/bookseller-shop.json","../src/modules/bookseller-shop/index.ts","../data/concessions.json","../src/modules/concessions/index.ts","../data/farmhouse.json","../src/modules/farmhouse/index.ts","../data/secret-notes.json","../src/modules/secret-notes/index.ts","../data/trinkets.json","../src/modules/trinkets/index.ts","../data/lost-books.json","../src/modules/lost-books/index.ts","../data/stardrops.json","../src/modules/stardrops/index.ts","../data/golden-walnuts.json","../src/modules/golden-walnuts/index.ts","../data/special-orders.json","../src/modules/special-orders/index.ts","../data/events.json","../src/modules/events/index.ts","../data/buildings.json","../src/modules/buildings/index.ts","../src/save-file/index.ts","../src/save-file/parsers/util.ts","../src/save-file/parsers/v1/achievements.ts","../src/save-file/parsers/v1/animals.ts","../src/save-file/parsers/v1/buildings.ts","../src/save-file/parsers/item-names.ts","../src/save-file/parsers/v1/bundles.ts","../src/save-file/parsers/v1/community-center.ts","../src/save-file/parsers/v1/date.ts","../src/save-file/parsers/v1/family.ts","../src/save-file/parsers/v1/fish.ts","../src/save-file/parsers/v1/friendships.ts","../src/save-file/parsers/v1/inventory.ts","../data/island-upgrades.json","../src/save-file/parsers/v1/island-upgrades.ts","../data/joja-development.json","../src/save-file/parsers/v1/joja.ts","../src/save-file/parsers/v1/mail.ts","../src/save-file/parsers/v1/mine-progress.ts","../src/save-file/parsers/v1/monsters.ts","../src/save-file/parsers/v1/museum.ts","../src/save-file/parsers/v1/perfection.ts","../src/save-file/parsers/v1/player.ts","../src/save-file/parsers/v1/powers.ts","../src/save-file/parsers/v1/professions.ts","../src/save-file/parsers/v1/quests.ts","../src/save-file/parsers/v1/raccoons.ts","../src/save-file/parsers/v1/rarecrows.ts","../src/save-file/parsers/v1/recipes.ts","../src/save-file/parsers/v1/secret-notes.ts","../src/save-file/parsers/v1/shipping.ts","../src/save-file/parsers/v1/stardrops.ts","../src/save-file/parsers/v1/stats.ts","../src/save-file/parsers/v1/walnuts.ts","../src/save-file/parser-registry.ts","../src/save-file/parsers/v1/events.ts","../src/save-file/versions.ts"],"sourcesContent":["/**\n * Abstract base class providing the five standard terminal methods shared by all query builders.\n * Subclasses hold a typed data array and implement domain-specific filter and sort methods.\n */\nexport abstract class QueryBase<T extends { id: string; name: string }> {\n  constructor(protected readonly data: T[]) {}\n\n  /** Return all results as an array. */\n  get(): T[] {\n    return this.data;\n  }\n\n  /** Return the first result, or `undefined` if there are none. */\n  first(): T | undefined {\n    return this.data[0];\n  }\n\n  /** Find an item by its exact ID. */\n  find(id: string): T | undefined {\n    return this.data.find((x) => x.id === id);\n  }\n\n  /** Find an item by name (case-insensitive exact match). */\n  findByName(name: string): T | undefined {\n    const q = name.toLowerCase();\n    return this.data.find((x) => x.name.toLowerCase() === q);\n  }\n\n  /** Return the number of results. */\n  count(): number {\n    return this.data.length;\n  }\n}\n","[\n  {\n    \"id\": \"0\",\n    \"name\": \"Greenhorn\",\n    \"description\": \"Earn 15,000g.\",\n    \"image\": \"images/achievements/Achievement_Greenhorn.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_12.png\",\n    \"reward\": \"Good Ol' Cap\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"1\",\n    \"name\": \"Cowpoke\",\n    \"description\": \"Earn 50,000g.\",\n    \"image\": \"images/achievements/Achievement_Cowpoke.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_02.png\",\n    \"reward\": \"Lucky Bow\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"2\",\n    \"name\": \"Homesteader\",\n    \"description\": \"Earn 250,000g.\",\n    \"image\": \"images/achievements/Achievement_Homesteader.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_11.png\",\n    \"reward\": \"Cool Cap\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"3\",\n    \"name\": \"Millionaire\",\n    \"description\": \"Earn 1,000,000g.\",\n    \"image\": \"images/achievements/Achievement_Millionaire.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_09.png\",\n    \"reward\": \"Bowler Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"4\",\n    \"name\": \"Legend\",\n    \"description\": \"Earn 10,000,000g.\",\n    \"image\": \"images/achievements/Achievement_Legend.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_04.png\",\n    \"reward\": \"Sombrero\",\n    \"secret\": true\n  },\n  {\n    \"id\": \"5\",\n    \"name\": \"A Complete Collection\",\n    \"description\": \"Complete the museum collection.\",\n    \"image\": \"images/achievements/Achievement_A_Complete_Collection.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_02.png\",\n    \"reward\": \"Cowboy Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"6\",\n    \"name\": \"A New Friend\",\n    \"description\": \"Reach a 5-heart friend level with someone.\",\n    \"image\": \"images/achievements/Achievement_A_New_Friend.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_02.png\",\n    \"reward\": \"Butterfly Bow\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"7\",\n    \"name\": \"Best Friends\",\n    \"description\": \"Reach a 10-heart friend level with someone.\",\n    \"image\": \"images/achievements/Achievement_Best_Friends.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_04.png\",\n    \"reward\": \"Mouse Ears\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"9\",\n    \"name\": \"The Beloved Farmer\",\n    \"description\": \"Reach a 10-heart friend level with 8 people.\",\n    \"image\": \"images/achievements/Achievement_The_Beloved_Farmer.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_06.png\",\n    \"reward\": \"Cat Ears\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"11\",\n    \"name\": \"Cliques\",\n    \"description\": \"Reach a 5-heart friend level with 4 people.\",\n    \"image\": \"images/achievements/Achievement_Cliques.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_10.png\",\n    \"reward\": \"Tiara\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"12\",\n    \"name\": \"Networking\",\n    \"description\": \"Reach a 5-heart friend level with 10 people.\",\n    \"image\": \"images/achievements/Achievement_Networking.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_04.png\",\n    \"reward\": \"Santa Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"13\",\n    \"name\": \"Popular\",\n    \"description\": \"Reach a 5-heart friend level with 20 people.\",\n    \"image\": \"images/achievements/Achievement_Popular.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_09.png\",\n    \"reward\": \"Earmuffs\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"15\",\n    \"name\": \"Cook\",\n    \"description\": \"Cook 10 different recipes.\",\n    \"image\": \"images/achievements/Achievement_Cook.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_02.png\",\n    \"reward\": \"Delicate Bow\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"16\",\n    \"name\": \"Sous Chef\",\n    \"description\": \"Cook 25 different recipes.\",\n    \"image\": \"images/achievements/Achievement_Sous_Chef.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_09.png\",\n    \"reward\": \"Plum Chapeau\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"17\",\n    \"name\": \"Gourmet Chef\",\n    \"description\": \"Cook every recipe.\",\n    \"image\": \"images/achievements/Achievement_Gourmet_Chef.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_08.png\",\n    \"reward\": \"Archer's Cap, Chef Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"18\",\n    \"name\": \"Moving Up\",\n    \"description\": \"Upgrade your house.\",\n    \"image\": \"images/achievements/Achievement_Moving_Up.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_01.png\",\n    \"reward\": \"Tropiclip\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"19\",\n    \"name\": \"Living Large\",\n    \"description\": \"Upgrade your house to the maximum size.\",\n    \"image\": \"images/achievements/Achievement_Living_Large.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_09.png\",\n    \"reward\": \"Hunter's Cap\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"20\",\n    \"name\": \"D.I.Y.\",\n    \"description\": \"Craft 15 different items.\",\n    \"image\": \"images/achievements/Achievement_DIY.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_06.png\",\n    \"reward\": \"Daisy\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"21\",\n    \"name\": \"Artisan\",\n    \"description\": \"Craft 30 different items.\",\n    \"image\": \"images/achievements/Achievement_Artisan.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_06.png\",\n    \"reward\": \"Trucker Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"22\",\n    \"name\": \"Craft Master\",\n    \"description\": \"Craft every item.\",\n    \"image\": \"images/achievements/Achievement_Master_Craft.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_10.png\",\n    \"reward\": \"Gnome's Cap\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"24\",\n    \"name\": \"Fisherman\",\n    \"description\": \"Catch 10 different fish.\",\n    \"image\": \"images/achievements/Achievement_Fisherman.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_06.png\",\n    \"reward\": \"Sou'wester\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"25\",\n    \"name\": \"Ol' Mariner\",\n    \"description\": \"Catch 24 different fish.\",\n    \"image\": \"images/achievements/Achievement_Ol_Mariner.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_06.png\",\n    \"reward\": \"Official Cap\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"26\",\n    \"name\": \"Master Angler\",\n    \"description\": \"Catch every fish.\",\n    \"image\": \"images/achievements/Achievement_Master_Angler.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_07.png\",\n    \"reward\": \"Eye Patch\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"27\",\n    \"name\": \"Mother Catch\",\n    \"description\": \"Catch 100 fish.\",\n    \"image\": \"images/achievements/Achievement_Mother_Catch.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_08.png\",\n    \"reward\": \"Watermelon Band\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"28\",\n    \"name\": \"Treasure Trove\",\n    \"description\": \"Donate 40 different items to the museum.\",\n    \"image\": \"images/achievements/Achievement_Treasure_Trove.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_08.png\",\n    \"reward\": \"Blue Bonnet\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"29\",\n    \"name\": \"Gofer\",\n    \"description\": \"Complete 10 'Help Wanted' requests.\",\n    \"image\": \"images/achievements/Achievement_Gofer.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_10.png\",\n    \"reward\": \"Polka Bow\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"30\",\n    \"name\": \"A Big Help\",\n    \"description\": \"Complete 40 'Help Wanted' requests.\",\n    \"image\": \"images/achievements/Achievement_A_Big_Help.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_06.png\",\n    \"reward\": \"Chicken Mask\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"31\",\n    \"name\": \"Polyculture\",\n    \"description\": \"Ship 15 of each crop.\",\n    \"image\": \"images/achievements/Achievement_Polyculture.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_12.png\",\n    \"reward\": \"Cowpoke Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"32\",\n    \"name\": \"Monoculture\",\n    \"description\": \"Ship 300 of one crop.\",\n    \"image\": \"images/achievements/Achievement_Monoculture.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_01.png\",\n    \"reward\": \"Cowgal Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"34\",\n    \"name\": \"Full Shipment\",\n    \"description\": \"Ship every item.\",\n    \"image\": \"images/achievements/Achievement_Full_Shipment.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_04.png\",\n    \"reward\": \"Goblin Mask\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"prairie-king\",\n    \"name\": \"Prairie King\",\n    \"description\": \"Beat 'Journey of the Prairie King'.\",\n    \"image\": \"images/achievements/Achievement_Prarie_King.jpg\",\n    \"icon\": null,\n    \"reward\": \"Prairie King Arcade System\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"the-bottom\",\n    \"name\": \"The Bottom\",\n    \"description\": \"Reach the lowest level of the mines.\",\n    \"image\": \"images/achievements/Achievement_The_Bottom.jpg\",\n    \"icon\": null,\n    \"reward\": \"Skull Key\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"local-legend\",\n    \"name\": \"Local Legend\",\n    \"description\": \"Restore the Pelican Town Community Center.\",\n    \"image\": \"images/achievements/Achievement_Local_Legend.jpg\",\n    \"icon\": null,\n    \"reward\": \"Stardew Hero Trophy\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"joja-co-member-of-the-year\",\n    \"name\": \"Joja Co. Member Of The Year\",\n    \"description\": \"Purchase all Joja Community Development projects.\",\n    \"image\": \"images/achievements/Achievement_Joja_Co._Member_Of_The_Year.jpg\",\n    \"icon\": null,\n    \"reward\": \"Soda Machine\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"mystery-of-the-stardrops\",\n    \"name\": \"Mystery Of The Stardrops\",\n    \"description\": \"Find every stardrop.\",\n    \"image\": \"images/achievements/Achievement_Mystery_Of_The_Stardrops.jpg\",\n    \"icon\": null,\n    \"reward\": null,\n    \"secret\": false\n  },\n  {\n    \"id\": \"full-house\",\n    \"name\": \"Full House\",\n    \"description\": \"Get married and have two kids.\",\n    \"image\": \"images/achievements/Achievement_Full_House.jpg\",\n    \"icon\": null,\n    \"reward\": null,\n    \"secret\": false\n  },\n  {\n    \"id\": \"singular-talent\",\n    \"name\": \"Singular Talent\",\n    \"description\": \"Reach level 10 in a skill.\",\n    \"image\": \"images/achievements/Achievement_Singular_Talent.jpg\",\n    \"icon\": null,\n    \"reward\": null,\n    \"secret\": false\n  },\n  {\n    \"id\": \"master-of-the-five-ways\",\n    \"name\": \"Master Of The Five Ways\",\n    \"description\": \"Reach level 10 in every skill.\",\n    \"image\": \"images/achievements/Achievement_Master_Of_The_Five_Ways.jpg\",\n    \"icon\": null,\n    \"reward\": null,\n    \"secret\": false\n  },\n  {\n    \"id\": \"protector-of-the-valley\",\n    \"name\": \"Protector Of The Valley\",\n    \"description\": \"Complete all of the Adventure Guild Monster Slayer goals.\",\n    \"image\": \"images/achievements/Achievement_Protector_Of_The_Valley.jpg\",\n    \"icon\": null,\n    \"reward\": null,\n    \"secret\": false\n  },\n  {\n    \"id\": \"fectors-challenge\",\n    \"name\": \"Fector's Challenge\",\n    \"description\": \"Beat 'Journey Of The Prairie King' without dying.\",\n    \"image\": \"images/achievements/Achievement_Fectors_Challenge.jpg\",\n    \"icon\": null,\n    \"reward\": null,\n    \"secret\": true\n  },\n  {\n    \"id\": \"40\",\n    \"name\": \"A Distant Shore\",\n    \"description\": \"Reach Ginger Island.\",\n    \"image\": \"images/achievements/Achievement_A_Distant_Shore.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_09.png\",\n    \"reward\": \"Paper Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"35\",\n    \"name\": \"Well-Read\",\n    \"description\": \"Read every book.\",\n    \"image\": \"images/achievements/Achievement_Well-Read.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_06.png\",\n    \"reward\": \"Pageboy Cap\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"36\",\n    \"name\": \"Two Thumbs Up\",\n    \"description\": \"See a movie.\",\n    \"image\": \"images/achievements/Achievement_Two_Thumbs_Up.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_08.png\",\n    \"reward\": \"Jester Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"37\",\n    \"name\": \"Blue Ribbon\",\n    \"description\": \"Get 1st place in the Stardew Valley Fair competition.\",\n    \"image\": \"images/achievements/Achievement_Blue_Ribbon.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_08.png\",\n    \"reward\": \"Blue Ribbon\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"38\",\n    \"name\": \"An Unforgettable Soup\",\n    \"description\": \"Delight the Governor.\",\n    \"image\": \"images/achievements/Achievement_An_Unforgettable_Soup.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_02.png\",\n    \"reward\": \"Governor's Hat\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"39\",\n    \"name\": \"Good Neighbors\",\n    \"description\": \"Help your forest neighbors grow their family.\",\n    \"image\": \"images/achievements/Achievement_Good_Neighbors.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_11.png\",\n    \"reward\": \"White Bow\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"41\",\n    \"name\": \"Danger In The Deep\",\n    \"description\": \"Reach the bottom of the 'dangerous' mines.\",\n    \"image\": \"images/achievements/Achievement_Danger_In_The_Deep.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_03.png\",\n    \"reward\": \"Space Helmet\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"42\",\n    \"name\": \"Infinite Power\",\n    \"description\": \"Obtain the most powerful weapon.\",\n    \"image\": \"images/achievements/Achievement_Infinite_Power.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_07.png\",\n    \"reward\": \"Infinity Crown\",\n    \"secret\": false\n  },\n  {\n    \"id\": \"44\",\n    \"name\": \"Perfection\",\n    \"description\": \"Reach the summit.\",\n    \"image\": \"images/achievements/Achievement_Perfection.jpg\",\n    \"icon\": \"images/achievements/Achievement_Star_10.png\",\n    \"reward\": \"Junimo Hat\",\n    \"secret\": false\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport achievementData from '@/data/achievements.json';\nimport { Achievement } from '@/types';\n\nconst achievementsData: Achievement[] = achievementData as Achievement[];\n\n/** Query builder for achievement data. All filter and sort methods return a new AchievementQuery for chaining. */\nexport class AchievementQuery extends QueryBase<Achievement> {\n  constructor(data: Achievement[] = achievementsData) {\n    super(data);\n  }\n\n  /** Filter to secret achievements (hidden until unlocked). */\n  secret(): AchievementQuery {\n    return new AchievementQuery(this.data.filter((a) => a.secret));\n  }\n\n  /**\n   * Filter to in-game achievements (those with an in-game icon).\n   * Excludes platform-only achievements that only appear in Steam/GOG.\n   */\n  inGame(): AchievementQuery {\n    return new AchievementQuery(this.data.filter((a) => a.icon !== null));\n  }\n\n  /** Filter to achievements that grant an in-game reward (hat, title, etc.). */\n  withReward(): AchievementQuery {\n    return new AchievementQuery(this.data.filter((a) => a.reward !== null));\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): AchievementQuery {\n    return new AchievementQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n}\n\n/** Returns an AchievementQuery for all achievement data. Pass `source` to wrap a pre-filtered array. */\nexport function achievements(source: Achievement[] = achievementsData): AchievementQuery {\n  return new AchievementQuery(source);\n}\n","[\n  {\n    \"type\": \"pet\",\n    \"id\": \"cat-1\",\n    \"name\": \"Cat\",\n    \"variant\": 1,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Cat 1.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"cat-2\",\n    \"name\": \"Cat\",\n    \"variant\": 2,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Cat 2.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"cat-3\",\n    \"name\": \"Cat\",\n    \"variant\": 3,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Cat 3.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"cat-4\",\n    \"name\": \"Cat\",\n    \"variant\": 4,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Cat 4.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"cat-5\",\n    \"name\": \"Cat\",\n    \"variant\": 5,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Cat 5.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"dog-1\",\n    \"name\": \"Dog\",\n    \"variant\": 1,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Dog 1.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"dog-2\",\n    \"name\": \"Dog\",\n    \"variant\": 2,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Dog 2.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"dog-3\",\n    \"name\": \"Dog\",\n    \"variant\": 3,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Dog 3.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"dog-4\",\n    \"name\": \"Dog\",\n    \"variant\": 4,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Dog 4.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"dog-5\",\n    \"name\": \"Dog\",\n    \"variant\": 5,\n    \"purchasePrice\": 40000,\n    \"image\": \"images/animals/Dog 5.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"turtle\",\n    \"name\": \"Turtle\",\n    \"variant\": 1,\n    \"purchasePrice\": 60000,\n    \"image\": \"images/animals/Turtle.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"iridium-turtle\",\n    \"name\": \"Iridium Turtle\",\n    \"variant\": 2,\n    \"purchasePrice\": 500000,\n    \"image\": \"images/animals/Iridium Turtle.png\"\n  },\n  {\n    \"type\": \"pet\",\n    \"id\": \"horse\",\n    \"name\": \"Horse\",\n    \"purchasePrice\": null,\n    \"image\": \"images/animals/horse.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"white-chicken\",\n    \"name\": \"White Chicken\",\n    \"description\": \"A common farm bird. Lays an egg each morning.\",\n    \"building\": \"Coop\",\n    \"purchasePrice\": 400,\n    \"sellPrice\": 800,\n    \"daysToMature\": 3,\n    \"daysToProduce\": 1,\n    \"harvestMethod\": \"drop\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"176\",\n      \"name\": \"Egg\",\n      \"sellPrice\": 50,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": {\n      \"id\": \"174\",\n      \"name\": \"Large Egg\",\n      \"sellPrice\": 95,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Large Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"image\": \"images/animals/White Chicken.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"brown-chicken\",\n    \"name\": \"Brown Chicken\",\n    \"description\": \"A common farm bird with brown plumage. Lays brown eggs each morning.\",\n    \"building\": \"Coop\",\n    \"purchasePrice\": null,\n    \"sellPrice\": 800,\n    \"daysToMature\": 3,\n    \"daysToProduce\": 1,\n    \"harvestMethod\": \"drop\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"180\",\n      \"name\": \"Brown Egg\",\n      \"sellPrice\": 50,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Brown Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": {\n      \"id\": \"182\",\n      \"name\": \"Large Brown Egg\",\n      \"sellPrice\": 95,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Large Brown Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"image\": \"images/animals/Brown Chicken.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"blue-chicken\",\n    \"name\": \"Blue Chicken\",\n    \"description\": \"A rare blue-feathered chicken unlocked through a deep friendship with Shane. Produces white eggs daily.\",\n    \"building\": \"Coop\",\n    \"purchasePrice\": null,\n    \"sellPrice\": 800,\n    \"daysToMature\": 3,\n    \"daysToProduce\": 1,\n    \"harvestMethod\": \"drop\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"176\",\n      \"name\": \"Egg\",\n      \"sellPrice\": 50,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": {\n      \"id\": \"174\",\n      \"name\": \"Large Egg\",\n      \"sellPrice\": 95,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Large Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"image\": \"images/animals/Blue Chicken.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"void-chicken\",\n    \"name\": \"Void Chicken\",\n    \"description\": \"A dark, magical chicken hatched from a Void Egg. Produces Void Eggs daily.\",\n    \"building\": \"Coop\",\n    \"purchasePrice\": null,\n    \"sellPrice\": 800,\n    \"daysToMature\": 3,\n    \"daysToProduce\": 1,\n    \"harvestMethod\": \"drop\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"305\",\n      \"name\": \"Void Egg\",\n      \"sellPrice\": 65,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Void Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": null,\n    \"image\": \"images/animals/Void Chicken.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"golden-chicken\",\n    \"name\": \"Golden Chicken\",\n    \"description\": \"A rare golden chicken hatched from a Golden Egg. Produces Golden Eggs daily.\",\n    \"building\": \"Coop\",\n    \"purchasePrice\": null,\n    \"sellPrice\": 800,\n    \"daysToMature\": 3,\n    \"daysToProduce\": 1,\n    \"harvestMethod\": \"drop\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"928\",\n      \"name\": \"Golden Egg\",\n      \"sellPrice\": 500,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Golden Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": null,\n    \"image\": \"images/animals/Golden Chicken.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"duck\",\n    \"name\": \"Duck\",\n    \"description\": \"A waterfowl that lays a Duck Egg every other day. Happy ducks occasionally drop a valuable Duck Feather.\",\n    \"building\": \"Big Coop\",\n    \"purchasePrice\": 600,\n    \"sellPrice\": 1200,\n    \"daysToMature\": 5,\n    \"daysToProduce\": 2,\n    \"harvestMethod\": \"drop\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"442\",\n      \"name\": \"Duck Egg\",\n      \"sellPrice\": 95,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Duck Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": {\n      \"id\": \"444\",\n      \"name\": \"Duck Feather\",\n      \"sellPrice\": 250,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Duck Feather.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"image\": \"images/animals/Duck.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"rabbit\",\n    \"name\": \"Rabbit\",\n    \"description\": \"A fluffy coop animal that sheds Wool every few days. Very happy rabbits may drop a lucky Rabbit's Foot.\",\n    \"building\": \"Deluxe Coop\",\n    \"purchasePrice\": 4000,\n    \"sellPrice\": 8000,\n    \"daysToMature\": 6,\n    \"daysToProduce\": 4,\n    \"harvestMethod\": \"drop\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"440\",\n      \"name\": \"Wool\",\n      \"sellPrice\": 340,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Wool.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": {\n      \"id\": \"446\",\n      \"name\": \"Rabbit's Foot\",\n      \"sellPrice\": 565,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Rabbit's Foot.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"image\": \"images/animals/Rabbit.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"dinosaur\",\n    \"name\": \"Dinosaur\",\n    \"description\": \"A prehistoric creature hatched from a Dinosaur Egg found in the mines. Lays another Dinosaur Egg each week.\",\n    \"building\": \"Coop\",\n    \"purchasePrice\": null,\n    \"sellPrice\": 1000,\n    \"daysToMature\": 0,\n    \"daysToProduce\": 7,\n    \"harvestMethod\": \"drop\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"107\",\n      \"name\": \"Dinosaur Egg\",\n      \"sellPrice\": 350,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Dinosaur Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": null,\n    \"image\": \"images/animals/Dinosaur.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"white-cow\",\n    \"name\": \"White Cow\",\n    \"description\": \"A dairy cow that produces milk daily. Must be milked with a Milk Pail.\",\n    \"building\": \"Barn\",\n    \"purchasePrice\": 750,\n    \"sellPrice\": 1500,\n    \"daysToMature\": 5,\n    \"daysToProduce\": 1,\n    \"harvestMethod\": \"tool\",\n    \"harvestTool\": \"Milk Pail\",\n    \"produce\": {\n      \"id\": \"184\",\n      \"name\": \"Milk\",\n      \"sellPrice\": 125,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Milk.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": {\n      \"id\": \"186\",\n      \"name\": \"Large Milk\",\n      \"sellPrice\": 190,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Large Milk.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"image\": \"images/animals/White Cow.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"brown-cow\",\n    \"name\": \"Brown Cow\",\n    \"description\": \"A dairy cow with brown markings. Produces milk daily and must be milked with a Milk Pail.\",\n    \"building\": \"Barn\",\n    \"purchasePrice\": null,\n    \"sellPrice\": 1500,\n    \"daysToMature\": 5,\n    \"daysToProduce\": 1,\n    \"harvestMethod\": \"tool\",\n    \"harvestTool\": \"Milk Pail\",\n    \"produce\": {\n      \"id\": \"184\",\n      \"name\": \"Milk\",\n      \"sellPrice\": 125,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Milk.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": {\n      \"id\": \"186\",\n      \"name\": \"Large Milk\",\n      \"sellPrice\": 190,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Large Milk.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"image\": \"images/animals/Brown Cow.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"goat\",\n    \"name\": \"Goat\",\n    \"description\": \"A barn animal that produces Goat Milk every other day. Must be milked with a Milk Pail.\",\n    \"building\": \"Big Barn\",\n    \"purchasePrice\": 2000,\n    \"sellPrice\": 4000,\n    \"daysToMature\": 5,\n    \"daysToProduce\": 2,\n    \"harvestMethod\": \"tool\",\n    \"harvestTool\": \"Milk Pail\",\n    \"produce\": {\n      \"id\": \"436\",\n      \"name\": \"Goat Milk\",\n      \"sellPrice\": 225,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Goat Milk.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": {\n      \"id\": \"438\",\n      \"name\": \"Large Goat Milk\",\n      \"sellPrice\": 345,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Large Goat Milk.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"image\": \"images/animals/Goat.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"sheep\",\n    \"name\": \"Sheep\",\n    \"description\": \"A barn animal that grows a fleece every three days. Must be sheared with Shears. Very friendly sheep grow wool faster.\",\n    \"building\": \"Deluxe Barn\",\n    \"purchasePrice\": 4000,\n    \"sellPrice\": 8000,\n    \"daysToMature\": 4,\n    \"daysToProduce\": 3,\n    \"harvestMethod\": \"tool\",\n    \"harvestTool\": \"Shears\",\n    \"produce\": {\n      \"id\": \"440\",\n      \"name\": \"Wool\",\n      \"sellPrice\": 340,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Wool.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": null,\n    \"image\": \"images/animals/Sheep.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"pig\",\n    \"name\": \"Pig\",\n    \"description\": \"Forages for Truffles outside each day in clear weather. Cannot produce in winter.\",\n    \"building\": \"Deluxe Barn\",\n    \"purchasePrice\": 8000,\n    \"sellPrice\": 16000,\n    \"daysToMature\": 10,\n    \"daysToProduce\": 1,\n    \"harvestMethod\": \"dig\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"430\",\n      \"name\": \"Truffle\",\n      \"sellPrice\": 625,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Truffle.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": null,\n    \"image\": \"images/animals/Pig.png\"\n  },\n  {\n    \"type\": \"farm-animal\",\n    \"id\": \"ostrich\",\n    \"name\": \"Ostrich\",\n    \"description\": \"A large bird hatched from an Ostrich Egg found on Ginger Island. Produces a massive egg every seven days.\",\n    \"building\": \"Barn\",\n    \"purchasePrice\": null,\n    \"sellPrice\": 16000,\n    \"daysToMature\": 7,\n    \"daysToProduce\": 7,\n    \"harvestMethod\": \"drop\",\n    \"harvestTool\": null,\n    \"produce\": {\n      \"id\": \"289\",\n      \"name\": \"Ostrich Egg\",\n      \"sellPrice\": 600,\n      \"profession\": [\"rancher\"],\n      \"image\": \"images/animals/produce/Ostrich Egg.png\",\n      \"maxQuality\": \"iridium\"\n    },\n    \"deluxeProduce\": null,\n    \"image\": \"images/animals/Ostrich.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/animals.json';\nimport { Animal, FarmAnimal, Pet } from '@/types';\n\nconst animalData: Animal[] = data as Animal[];\n\n/** Type guard: narrows an Animal to Pet. */\nexport function isPet(animal: Animal): animal is Pet {\n  return animal.type === 'pet';\n}\n\n/** Type guard: narrows an Animal to FarmAnimal. */\nexport function isFarmAnimal(animal: Animal): animal is FarmAnimal {\n  return animal.type === 'farm-animal';\n}\n\n/**\n * Query builder for animal data (pets and farm animals).\n * All filter methods return a new AnimalQuery for chaining.\n * Use `.pets()` or `.farmAnimals()` to narrow to a specific subtype.\n */\nexport class AnimalQuery extends QueryBase<Animal> {\n  constructor(data: Animal[] = animalData) {\n    super(data);\n  }\n\n  /** Filter to pets only. */\n  pets(): AnimalQuery {\n    return new AnimalQuery(this.data.filter(isPet));\n  }\n\n  /** Filter to a specific pet breed by name (case-insensitive). Only matches pets. */\n  byPetName(name: string): AnimalQuery {\n    return new AnimalQuery(\n      this.data.filter((a) => isPet(a) && a.name.toLowerCase() === name.toLowerCase()),\n    );\n  }\n\n  /** Filter to farm animals only. */\n  farmAnimals(): AnimalQuery {\n    return new AnimalQuery(this.data.filter(isFarmAnimal));\n  }\n\n  /** Filter farm animals by their required building (e.g. `'Coop'`, `'Barn'`). */\n  byBuilding(building: string): AnimalQuery {\n    return new AnimalQuery(\n      this.data.filter(\n        (a) => isFarmAnimal(a) && a.building.toLowerCase() === building.toLowerCase(),\n      ),\n    );\n  }\n\n  /** Filter farm animals by harvest method (`'tool'` or `'auto'`). */\n  byHarvestMethod(method: FarmAnimal['harvestMethod']): AnimalQuery {\n    return new AnimalQuery(this.data.filter((a) => isFarmAnimal(a) && a.harvestMethod === method));\n  }\n\n  /** Filter to farm animals with a purchase price (excludes animals obtained by other means). */\n  purchasable(): AnimalQuery {\n    return new AnimalQuery(this.data.filter((a) => isFarmAnimal(a) && a.purchasePrice !== null));\n  }\n}\n\n/** Returns an AnimalQuery for all animal data. Pass `source` to wrap a pre-filtered array. */\nexport function animals(source: Animal[] = animalData): AnimalQuery {\n  return new AnimalQuery(source);\n}\n","[\n  {\n    \"id\": \"Crafts Room/13\",\n    \"type\": \"items\",\n    \"name\": \"Spring Foraging Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 1,\n    \"image\": \"images/bundles/bundle-images/Spring Foraging Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Wild Horseradish\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Daffodil\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Leek\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Dandelion\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Spring Seeds\",\n      \"quantity\": 30\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Crafts Room/13-remix\",\n    \"type\": \"items\",\n    \"name\": \"Spring Foraging Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 1,\n    \"image\": \"images/bundles/bundle-images/Spring Foraging Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Wild Horseradish\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Daffodil\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Leek\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Dandelion\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Spring Onion\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": true,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Spring Seeds\",\n      \"quantity\": 30\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Crafts Room/14\",\n    \"type\": \"items\",\n    \"name\": \"Summer Foraging Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 2,\n    \"image\": \"images/bundles/bundle-images/Summer Foraging Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Grape\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Spice Berry\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sweet Pea\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Summer Seeds\",\n      \"quantity\": 30\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Crafts Room/15\",\n    \"type\": \"items\",\n    \"name\": \"Fall Foraging Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 3,\n    \"image\": \"images/bundles/bundle-images/Fall Foraging Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Common Mushroom\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Wild Plum\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Hazelnut\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Blackberry\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Fall Seeds\",\n      \"quantity\": 30\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Crafts Room/16\",\n    \"type\": \"items\",\n    \"name\": \"Winter Foraging Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 4,\n    \"image\": \"images/bundles/bundle-images/Winter Foraging Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Winter Root\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Crystal Fruit\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Snow Yam\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Crocus\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Winter Seeds\",\n      \"quantity\": 30\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Crafts Room/16-remix\",\n    \"type\": \"items\",\n    \"name\": \"Winter Foraging Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 4,\n    \"image\": \"images/bundles/bundle-images/Winter Foraging Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Winter Root\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Crystal Fruit\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Snow Yam\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Crocus\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Holly\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": true,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Winter Seeds\",\n      \"quantity\": 30\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Crafts Room/17\",\n    \"type\": \"items\",\n    \"name\": \"Construction Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 5,\n    \"image\": \"images/bundles/bundle-images/Construction Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Wood\",\n        \"quantity\": 99\n      },\n      {\n        \"name\": \"Stone\",\n        \"quantity\": 99\n      },\n      {\n        \"name\": \"Hardwood\",\n        \"quantity\": 10\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Charcoal Kiln\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Crafts Room/sticky-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Sticky Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 5,\n    \"image\": \"images/bundles/bundle-images/Sticky Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Sap\",\n        \"quantity\": 500\n      }\n    ],\n    \"itemsRequired\": 1,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 1,\n    \"reward\": {\n      \"name\": \"Charcoal Kiln\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Crafts Room/forest-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Forest Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 5,\n    \"image\": \"images/bundles/bundle-images/Forest Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Moss\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Fiber\",\n        \"quantity\": 200\n      },\n      {\n        \"name\": \"Acorn\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Maple Seed\",\n        \"quantity\": 10\n      }\n    ],\n    \"itemsRequired\": 1,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Charcoal Kiln\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Crafts Room/19\",\n    \"type\": \"items\",\n    \"name\": \"Exotic Foraging Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 6,\n    \"image\": \"images/bundles/bundle-images/Exotic Foraging Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Coconut\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Cactus Fruit\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Cave Carrot\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Red Mushroom\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Purple Mushroom\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Maple Syrup\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Oak Resin\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Pine Tar\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Morel\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 5,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 9,\n    \"reward\": {\n      \"name\": \"Autumn's Bounty\",\n      \"quantity\": 5\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Crafts Room/wild-medicine-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Wild Medicine Bundle\",\n    \"room\": \"crafts-room\",\n    \"bundleGroup\": 6,\n    \"image\": \"images/bundles/bundle-images/Wild Medicine Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Purple Mushroom\",\n        \"quantity\": 5\n      },\n      {\n        \"name\": \"Fiddlehead Fern\",\n        \"quantity\": 5\n      },\n      {\n        \"name\": \"White Algae\",\n        \"quantity\": 5\n      },\n      {\n        \"name\": \"Hops\",\n        \"quantity\": 5\n      }\n    ],\n    \"itemsRequired\": 1,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Cookout Kit\",\n      \"quantity\": 2\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Pantry/0\",\n    \"type\": \"items\",\n    \"name\": \"Spring Crops Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 1,\n    \"image\": \"images/bundles/bundle-images/Spring Crops Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Parsnip\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Green Bean\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Cauliflower\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Potato\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Speed-Gro\",\n      \"quantity\": 20\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Pantry/0-remix\",\n    \"type\": \"items\",\n    \"name\": \"Spring Crops Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 1,\n    \"image\": \"images/bundles/bundle-images/Spring Crops Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Parsnip\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Green Bean\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Cauliflower\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Potato\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Kale\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Carrot\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": true,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Speed-Gro\",\n      \"quantity\": 20\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Pantry/1\",\n    \"type\": \"items\",\n    \"name\": \"Summer Crops Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 2,\n    \"image\": \"images/bundles/bundle-images/Summer Crops Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Tomato\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Hot Pepper\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Blueberry\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Melon\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Quality Sprinkler\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Pantry/1-remix\",\n    \"type\": \"items\",\n    \"name\": \"Summer Crops Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 2,\n    \"image\": \"images/bundles/bundle-images/Summer Crops Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Tomato\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Hot Pepper\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Blueberry\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Melon\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Summer Squash\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": true,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Quality Sprinkler\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Pantry/2\",\n    \"type\": \"items\",\n    \"name\": \"Fall Crops Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 3,\n    \"image\": \"images/bundles/bundle-images/Fall Crops Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Corn\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Eggplant\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Pumpkin\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Yam\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Bee House\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Pantry/2-remix\",\n    \"type\": \"items\",\n    \"name\": \"Fall Crops Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 3,\n    \"image\": \"images/bundles/bundle-images/Fall Crops Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Corn\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Eggplant\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Pumpkin\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Yam\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Broccoli\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": true,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Bee House\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Pantry/3\",\n    \"type\": \"items\",\n    \"name\": \"Quality Crops Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 4,\n    \"image\": \"images/bundles/bundle-images/Quality Crops Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Parsnip\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Melon\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Pumpkin\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Corn\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Preserves Jar\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Pantry/3-remix\",\n    \"type\": \"items\",\n    \"name\": \"Quality Crops Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 4,\n    \"image\": \"images/bundles/bundle-images/Quality Crops Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Parsnip\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Green Bean\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Potato\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Cauliflower\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Melon\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Blueberry\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Hot Pepper\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Pumpkin\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Yam\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Eggplant\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Corn\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": true,\n    \"numItemsAvailable\": 11,\n    \"reward\": {\n      \"name\": \"Preserves Jar\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Pantry/rare-crop-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Rare Crops Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 4,\n    \"image\": \"images/bundles/bundle-images/Rare Crops Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Ancient Fruit\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sweet Gem Berry\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 1,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 2,\n    \"reward\": {\n      \"name\": \"Preserves Jar\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Pantry/4\",\n    \"type\": \"items\",\n    \"name\": \"Animal Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 5,\n    \"image\": \"images/bundles/bundle-images/Animal Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Large Milk\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Large Egg (Brown)\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Large Egg\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Large Goat Milk\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Wool\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Duck Egg\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 5,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 6,\n    \"reward\": {\n      \"name\": \"Cheese Press\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Pantry/fish-farmers-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Fish Farmer's Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 5,\n    \"image\": \"images/bundles/bundle-images/Fish Farmer's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Roe\",\n        \"quantity\": 15\n      },\n      {\n        \"name\": \"Aged Roe\",\n        \"quantity\": 15\n      },\n      {\n        \"name\": \"Squid Ink\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 2,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Worm Bin\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Pantry/garden-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Garden Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 5,\n    \"image\": \"images/bundles/bundle-images/Garden Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Tulip\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Blue Jazz\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Summer Spangle\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sunflower\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Fairy Rose\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 5,\n    \"reward\": {\n      \"name\": \"Quality Sprinkler\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Pantry/5\",\n    \"type\": \"items\",\n    \"name\": \"Artisan Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 6,\n    \"image\": \"images/bundles/bundle-images/Artisan Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Truffle Oil\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Cloth\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Goat Cheese\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Cheese\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Honey\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Jelly\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Apple\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Apricot\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Orange\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Peach\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Pomegranate\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Cherry\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 6,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 12,\n    \"reward\": {\n      \"name\": \"Keg\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Pantry/brewers-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Brewer's Bundle\",\n    \"room\": \"pantry\",\n    \"bundleGroup\": 6,\n    \"image\": \"images/bundles/bundle-images/Brewer's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Mead\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Pale Ale\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Wine\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Juice\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Green Tea\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 5,\n    \"reward\": {\n      \"name\": \"Keg\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Fish Tank/6\",\n    \"type\": \"items\",\n    \"name\": \"River Fish Bundle\",\n    \"room\": \"fish-tank\",\n    \"bundleGroup\": 1,\n    \"image\": \"images/bundles/bundle-images/River Fish Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Sunfish\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Catfish\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Shad\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Tiger Trout\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Deluxe Bait\",\n      \"quantity\": 30\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Fish Tank/7\",\n    \"type\": \"items\",\n    \"name\": \"Lake Fish Bundle\",\n    \"room\": \"fish-tank\",\n    \"bundleGroup\": 2,\n    \"image\": \"images/bundles/bundle-images/Lake Fish Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Largemouth Bass\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Carp\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Bullhead\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sturgeon\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"reward\": {\n      \"name\": \"Dressed Spinner\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Fish Tank/8\",\n    \"type\": \"items\",\n    \"name\": \"Ocean Fish Bundle\",\n    \"room\": \"fish-tank\",\n    \"bundleGroup\": 3,\n    \"image\": \"images/bundles/bundle-images/Ocean Fish Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Sardine\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Tuna\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Red Snapper\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Tilapia\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Warp Totem: Beach\",\n      \"quantity\": 5\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Fish Tank/9\",\n    \"type\": \"items\",\n    \"name\": \"Night Fishing Bundle\",\n    \"room\": \"fish-tank\",\n    \"bundleGroup\": 4,\n    \"image\": \"images/bundles/bundle-images/Night Fishing Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Walleye\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Bream\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Eel\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Glow Ring\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Fish Tank/11\",\n    \"type\": \"items\",\n    \"name\": \"Crab Pot Bundle\",\n    \"room\": \"fish-tank\",\n    \"bundleGroup\": 5,\n    \"image\": \"images/bundles/bundle-images/Crab Pot Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Lobster\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Crayfish\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Crab\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Cockle\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Mussel\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Shrimp\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Snail\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Periwinkle\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Oyster\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Clam\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 5,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 10,\n    \"reward\": {\n      \"name\": \"Crab Pot\",\n      \"quantity\": 3\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Fish Tank/10\",\n    \"type\": \"items\",\n    \"name\": \"Specialty Fish Bundle\",\n    \"room\": \"fish-tank\",\n    \"bundleGroup\": 6,\n    \"image\": \"images/bundles/bundle-images/Specialty Fish Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Pufferfish\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Ghostfish\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sandfish\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Woodskip\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Dish O' The Sea\",\n      \"quantity\": 5\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Fish Tank/quality-fish-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Quality Fish Bundle\",\n    \"room\": \"fish-tank\",\n    \"bundleGroup\": 6,\n    \"image\": \"images/bundles/bundle-images/Quality Fish Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Largemouth Bass\",\n        \"quantity\": 1,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Shad\",\n        \"quantity\": 1,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Tuna\",\n        \"quantity\": 1,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Walleye\",\n        \"quantity\": 1,\n        \"quality\": \"gold\"\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Dish O' The Sea\",\n      \"quantity\": 5\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Fish Tank/master-fishers-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Master Fisher's Bundle\",\n    \"room\": \"fish-tank\",\n    \"bundleGroup\": 6,\n    \"image\": \"images/bundles/bundle-images/Master Fisher's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Lava Eel\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Scorpion Carp\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Octopus\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Blobfish\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Dish O' The Sea\",\n      \"quantity\": 5\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Boiler Room/20\",\n    \"type\": \"items\",\n    \"name\": \"Blacksmith's Bundle\",\n    \"room\": \"boiler-room\",\n    \"bundleGroup\": 1,\n    \"image\": \"images/bundles/bundle-images/Blacksmith Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Copper Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Gold Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Furnace\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Boiler Room/21\",\n    \"type\": \"items\",\n    \"name\": \"Geologist's Bundle\",\n    \"room\": \"boiler-room\",\n    \"bundleGroup\": 2,\n    \"image\": \"images/bundles/bundle-images/Geologist's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Quartz\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Earth Crystal\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Frozen Tear\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Fire Quartz\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Omni Geode\",\n      \"quantity\": 5\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Boiler Room/22\",\n    \"type\": \"items\",\n    \"name\": \"Adventurer's Bundle\",\n    \"room\": \"boiler-room\",\n    \"bundleGroup\": 3,\n    \"image\": \"images/bundles/bundle-images/Adventurer's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Slime\",\n        \"quantity\": 99\n      },\n      {\n        \"name\": \"Bat Wing\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Solar Essence\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Void Essence\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 2,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Small Magnet Ring\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Boiler Room/22-remix\",\n    \"type\": \"items\",\n    \"name\": \"Adventurer's Bundle\",\n    \"room\": \"boiler-room\",\n    \"bundleGroup\": 3,\n    \"image\": \"images/bundles/bundle-images/Adventurer's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Slime\",\n        \"quantity\": 99\n      },\n      {\n        \"name\": \"Bat Wing\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Solar Essence\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Void Essence\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Bone Fragment\",\n        \"quantity\": 10\n      }\n    ],\n    \"itemsRequired\": 2,\n    \"itemsChosenRandom\": true,\n    \"numItemsAvailable\": 5,\n    \"reward\": {\n      \"name\": \"Small Magnet Ring\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Boiler Room/treasure-hunters-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Treasure Hunter's Bundle\",\n    \"room\": \"boiler-room\",\n    \"bundleGroup\": 4,\n    \"image\": \"images/bundles/bundle-images/Treasure Hunter's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Amethyst\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Aquamarine\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Diamond\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Emerald\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Ruby\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Topaz\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 5,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 6,\n    \"reward\": {\n      \"name\": \"Lucky Lunch\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Boiler Room/engineers-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Engineer's Bundle\",\n    \"room\": \"boiler-room\",\n    \"bundleGroup\": 5,\n    \"image\": \"images/bundles/bundle-images/Engineer's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Iridium Ore\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Battery Pack\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Refined Quartz\",\n        \"quantity\": 5\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Furnace\",\n      \"quantity\": 2\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Bulletin Board/31\",\n    \"type\": \"items\",\n    \"name\": \"Chef's Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 1,\n    \"image\": \"images/bundles/bundle-images/Chef's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Maple Syrup\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Fiddlehead Fern\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Truffle\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Poppy\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Maki Roll\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Fried Egg\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 6,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 6,\n    \"reward\": {\n      \"name\": \"Pink Cake\",\n      \"quantity\": 3\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Bulletin Board/34\",\n    \"type\": \"items\",\n    \"name\": \"Dye Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 2,\n    \"image\": \"images/bundles/bundle-images/Dye Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Red Mushroom\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sea Urchin\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sunflower\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Duck Feather\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Aquamarine\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Red Cabbage\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 6,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 6,\n    \"reward\": {\n      \"name\": \"Seed Maker\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Bulletin Board/34-remix\",\n    \"type\": \"items\",\n    \"name\": \"Dye Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 2,\n    \"image\": \"images/bundles/bundle-images/Dye Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Red Mushroom\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Beet\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sea Urchin\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Amaranth\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sunflower\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Starfruit\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Duck Feather\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Cactus Fruit\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Aquamarine\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Blueberry\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Red Cabbage\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 6,\n    \"itemsChosenRandom\": true,\n    \"numItemsAvailable\": 6,\n    \"reward\": {\n      \"name\": \"Seed Maker\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Bulletin Board/32\",\n    \"type\": \"items\",\n    \"name\": \"Field Research Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 3,\n    \"image\": \"images/bundles/bundle-images/Field Research Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Purple Mushroom\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Nautilus Shell\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Chub\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Frozen Geode\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Recycling Machine\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Bulletin Board/35\",\n    \"type\": \"items\",\n    \"name\": \"Fodder Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 4,\n    \"image\": \"images/bundles/bundle-images/Fodder Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Wheat\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Hay\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Apple\",\n        \"quantity\": 3\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Heater\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Bulletin Board/33\",\n    \"type\": \"items\",\n    \"name\": \"Enchanter's Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 5,\n    \"image\": \"images/bundles/bundle-images/Enchanter's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Oak Resin\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Wine\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Rabbit's Foot\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Pomegranate\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 4,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Gold Bar\",\n      \"quantity\": 5\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Bulletin Board/childrens-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Children's Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 6,\n    \"image\": \"images/bundles/bundle-images/Children's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Salmonberry\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Cookie\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Ancient Doll\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Ice Cream\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Battery Pack\",\n      \"quantity\": 3\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Bulletin Board/Foragers-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Forager's Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 7,\n    \"image\": \"images/bundles/bundle-images/Forager's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Salmonberry\",\n        \"quantity\": 50\n      },\n      {\n        \"name\": \"Blackberry\",\n        \"quantity\": 50\n      },\n      {\n        \"name\": \"Wild Plum\",\n        \"quantity\": 15\n      }\n    ],\n    \"itemsRequired\": 2,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Tapper\",\n      \"quantity\": 3\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Bulletin Board/home-cooks-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Home Cook's Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 8,\n    \"image\": \"images/bundles/bundle-images/Home Cook's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Egg\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Milk\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Wheat Flour\",\n        \"quantity\": 100\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Complete Breakfast\",\n      \"quantity\": 5\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Bulletin Board/helpers-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Helper's Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 9,\n    \"image\": \"images/bundles/bundle-images/Helper's Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Prize Ticket\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Mystery Box\",\n        \"quantity\": 5\n      }\n    ],\n    \"itemsRequired\": 2,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 2,\n    \"reward\": {\n      \"name\": \"Stardrop Tea\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Bulletin Board/spirits-eve-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Spirit's Eve Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 10,\n    \"image\": \"images/bundles/bundle-images/Spirit's Eve Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Jack-O-Lantern\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Corn\",\n        \"quantity\": 10\n      },\n      {\n        \"name\": \"Bat Wing\",\n        \"quantity\": 10\n      }\n    ],\n    \"itemsRequired\": 3,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 3,\n    \"reward\": {\n      \"name\": \"Complete Breakfast\",\n      \"quantity\": 5\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Bulletin Board/winter-star-bundle\",\n    \"type\": \"items\",\n    \"name\": \"Winter Star Bundle\",\n    \"room\": \"bulletin-board\",\n    \"bundleGroup\": 11,\n    \"image\": \"images/bundles/bundle-images/Winter Star Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Holly\",\n        \"quantity\": 5\n      },\n      {\n        \"name\": \"Plum Pudding\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Stuffing\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Powdermelon\",\n        \"quantity\": 5\n      }\n    ],\n    \"itemsRequired\": 2,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 4,\n    \"reward\": {\n      \"name\": \"Mystery Box\",\n      \"quantity\": 3\n    },\n    \"remixBundle\": true\n  },\n  {\n    \"id\": \"Vault/23\",\n    \"type\": \"gold\",\n    \"name\": \"2,500g Bundle\",\n    \"room\": \"vault\",\n    \"bundleGroup\": 1,\n    \"image\": \"images/bundles/bundle-images/2500 Bundle.png\",\n    \"goldCost\": 2500,\n    \"reward\": {\n      \"name\": \"Chocolate Cake\",\n      \"quantity\": 3\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Vault/24\",\n    \"type\": \"gold\",\n    \"name\": \"5,000g Bundle\",\n    \"room\": \"vault\",\n    \"bundleGroup\": 2,\n    \"image\": \"images/bundles/bundle-images/5000 Bundle.png\",\n    \"goldCost\": 5000,\n    \"reward\": {\n      \"name\": \"Quality Fertilizer\",\n      \"quantity\": 30\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Vault/25\",\n    \"type\": \"gold\",\n    \"name\": \"10,000g Bundle\",\n    \"room\": \"vault\",\n    \"bundleGroup\": 3,\n    \"image\": \"images/bundles/bundle-images/10000 Bundle.png\",\n    \"goldCost\": 10000,\n    \"reward\": {\n      \"name\": \"Lightning Rod\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Vault/26\",\n    \"type\": \"gold\",\n    \"name\": \"25,000g Bundle\",\n    \"room\": \"vault\",\n    \"bundleGroup\": 4,\n    \"image\": \"images/bundles/bundle-images/25000 Bundle.png\",\n    \"goldCost\": 25000,\n    \"reward\": {\n      \"name\": \"Crystalarium\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"Abandoned Joja Mart/36\",\n    \"type\": \"items\",\n    \"name\": \"The Missing Bundle\",\n    \"room\": \"abandoned-joja-mart\",\n    \"bundleGroup\": 1,\n    \"image\": \"images/bundles/bundle-images/The Missing Bundle.png\",\n    \"items\": [\n      {\n        \"name\": \"Wine\",\n        \"quantity\": 1,\n        \"quality\": \"silver\"\n      },\n      {\n        \"name\": \"Dinosaur Mayonnaise\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Prismatic Shard\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Ancient Fruit\",\n        \"quantity\": 5,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Void Salmon\",\n        \"quantity\": 1,\n        \"quality\": \"gold\"\n      },\n      {\n        \"name\": \"Caviar\",\n        \"quantity\": 1\n      }\n    ],\n    \"itemsRequired\": 5,\n    \"itemsChosenRandom\": false,\n    \"numItemsAvailable\": 5,\n    \"reward\": {\n      \"name\": \"Movie Theater\",\n      \"quantity\": 1\n    },\n    \"remixBundle\": false\n  },\n  {\n    \"id\": \"minecarts-joja\",\n    \"type\": \"joja mart\",\n    \"name\": \"Minecarts\",\n    \"description\": \"Repairs the minecart system that runs between the bus stop, the mountains, and Pelican Town.\",\n    \"goldCost\": 15000,\n    \"unlock\": \"Minecarts\"\n  },\n  {\n    \"id\": \"panning-joja\",\n    \"type\": \"joja mart\",\n    \"name\": \"Panning\",\n    \"description\": \"Removes the glimmering boulder near the mine entrance.\",\n    \"goldCost\": 20000,\n    \"unlock\": \"Panning\"\n  },\n  {\n    \"id\": \"bridge-joja\",\n    \"type\": \"joja mart\",\n    \"name\": \"Bridge\",\n    \"description\": \"Repairs the broken bridge in the mountains. The broken bridge east of the Mines will be repaired, enabling access to the Quarry.\",\n    \"goldCost\": 25000,\n    \"unlock\": \"Bridge\"\n  },\n  {\n    \"id\": \"greenhouse-joja\",\n    \"type\": \"joja mart\",\n    \"name\": \"Greenhouse\",\n    \"description\": \"Repairs the old ruins on the farm, turning it into a greenhouse.\",\n    \"goldCost\": 35000,\n    \"unlock\": \"Greenhouse\"\n  },\n  {\n    \"id\": \"bus-joja\",\n    \"type\": \"joja mart\",\n    \"name\": \"Bus\",\n    \"description\": \"Repairs the bus that runs to the Calico Desert.\",\n    \"goldCost\": 40000,\n    \"unlock\": \"Bus\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport bundleData from '@/data/bundles.json';\nimport { Bundle, BundleRoom, GoldBundle, ItemBundle, JojaBundle } from '@/types';\n\nconst bundlesData: Bundle[] = bundleData as Bundle[];\n\n/**\n * Query builder for Community Center bundle data.\n * Covers item bundles, gold bundles, and the Joja Mart restoration.\n * All filter and sort methods return a new BundleQuery for chaining.\n */\nexport class BundleQuery extends QueryBase<Bundle> {\n  constructor(data: Bundle[] = bundlesData) {\n    super(data);\n  }\n\n  /** Filter to bundles in the given room. Joja bundles (no room) are excluded. */\n  byRoom(room: BundleRoom): BundleQuery {\n    return new BundleQuery(\n      this.data.filter(\n        (b): b is ItemBundle | GoldBundle => b.type !== 'joja mart' && b.room === room,\n      ),\n    );\n  }\n\n  /**\n   * Return the active remix bundle selection: for each bundle group, returns the\n   * remix variant if one exists, otherwise falls back to the non-remix entry.\n   * Joja bundles are excluded.\n   */\n  remix(): BundleQuery {\n    const eligible = this.data.filter((b): b is ItemBundle | GoldBundle => b.type !== 'joja mart');\n    const groups = new Map<string, (ItemBundle | GoldBundle)[]>();\n    for (const b of eligible) {\n      const key = `${b.room}:${b.bundleGroup}`;\n      const group = groups.get(key) ?? [];\n      group.push(b);\n      groups.set(key, group);\n    }\n    const result: (ItemBundle | GoldBundle)[] = [];\n    for (const group of groups.values()) {\n      const remixEntries = group.filter((b) => b.remixBundle);\n      result.push(...(remixEntries.length > 0 ? remixEntries : group));\n    }\n    return new BundleQuery(result);\n  }\n\n  /** Filter to standard (non-remix) Community Center bundles. Joja bundles are excluded. */\n  standard(): BundleQuery {\n    return new BundleQuery(\n      this.data.filter(\n        (b): b is ItemBundle | GoldBundle => b.type !== 'joja mart' && !b.remixBundle,\n      ),\n    );\n  }\n\n  /** Filter to item bundles (type `'items'`). */\n  itemBundles(): BundleQuery {\n    return new BundleQuery(this.data.filter((b): b is ItemBundle => b.type === 'items'));\n  }\n\n  /** Filter to gold bundles (type `'gold'`). */\n  goldBundles(): BundleQuery {\n    return new BundleQuery(this.data.filter((b): b is GoldBundle => b.type === 'gold'));\n  }\n\n  /** Filter to Joja Mart restoration bundles. */\n  jojaBundles(): BundleQuery {\n    return new BundleQuery(this.data.filter((b): b is JojaBundle => b.type === 'joja mart'));\n  }\n\n  /** Sort by room order (as they appear in the Community Center), then by bundle group number within each room. */\n  sortByRoomAndBundleGroup(): BundleQuery {\n    const ROOM_ORDER: BundleRoom[] = [\n      'crafts-room',\n      'pantry',\n      'fish-tank',\n      'boiler-room',\n      'bulletin-board',\n      'vault',\n      'abandoned-joja-mart',\n    ];\n    return new BundleQuery(\n      [...this.data].sort((a, b) => {\n        const aRoom = 'room' in a ? ROOM_ORDER.indexOf(a.room) : Infinity;\n        const bRoom = 'room' in b ? ROOM_ORDER.indexOf(b.room) : Infinity;\n        if (aRoom !== bRoom) return aRoom - bRoom;\n        const aGroup = 'bundleGroup' in a ? a.bundleGroup : Infinity;\n        const bGroup = 'bundleGroup' in b ? b.bundleGroup : Infinity;\n        return aGroup - bGroup;\n      }),\n    );\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): BundleQuery {\n    return new BundleQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n}\n\n/** Returns a BundleQuery for all bundle data. Pass `source` to wrap a pre-filtered array. */\nexport function bundles(source: Bundle[] = bundlesData): BundleQuery {\n  return new BundleQuery(source);\n}\n","[\n  {\n    \"id\": \"340\",\n    \"name\": \"Honey\",\n    \"description\": \"It's a sweet syrup produced by bees.\",\n    \"equipment\": \"Bee House\",\n    \"ingredients\": [\n      {\n        \"name\": \"Flower (nearby)\",\n        \"id\": null,\n        \"quantity\": null\n      }\n    ],\n    \"processingMinutes\": 6400,\n    \"processingDays\": 4,\n    \"sellPrice\": null,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"100g for wild honey; 2× nearby flower base price + 100 for flower honey\",\n    \"priceFormula\": {\n      \"multiplier\": 2,\n      \"addend\": 100\n    },\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Honey.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"348\",\n    \"name\": \"Wine\",\n    \"description\": \"Drink in moderation.\",\n    \"equipment\": \"Keg\",\n    \"ingredients\": [\n      {\n        \"name\": \"Any Fruit\",\n        \"id\": null,\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 10000,\n    \"processingDays\": 6.25,\n    \"sellPrice\": null,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"3× base fruit price\",\n    \"priceFormula\": {\n      \"multiplier\": 3,\n      \"addend\": 0\n    },\n    \"qualityLevels\": true,\n    \"cask\": {\n      \"silverDays\": 14,\n      \"goldDays\": 28,\n      \"iridiumDays\": 56\n    },\n    \"energyHealthFormula\": \"1.75× base fruit energy & health\",\n    \"energyHealth\": null,\n    \"buffs\": [\n      {\n        \"stat\": \"Speed\",\n        \"value\": -1\n      }\n    ],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Wine.png\",\n    \"maxQuality\": \"iridium\"\n  },\n  {\n    \"id\": \"350\",\n    \"name\": \"Juice\",\n    \"description\": \"A sweet, nutritious beverage.\",\n    \"equipment\": \"Keg\",\n    \"ingredients\": [\n      {\n        \"name\": \"Any Vegetable\",\n        \"id\": null,\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 6000,\n    \"processingDays\": 3.75,\n    \"sellPrice\": null,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"2.25× base vegetable price\",\n    \"priceFormula\": {\n      \"multiplier\": 2.25,\n      \"addend\": 0\n    },\n    \"qualityLevels\": true,\n    \"cask\": {\n      \"silverDays\": 14,\n      \"goldDays\": 28,\n      \"iridiumDays\": 56\n    },\n    \"energyHealthFormula\": \"2× base vegetable energy & health\",\n    \"energyHealth\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Juice.png\",\n    \"maxQuality\": \"iridium\"\n  },\n  {\n    \"id\": \"303\",\n    \"name\": \"Pale Ale\",\n    \"description\": \"Drink in moderation.\",\n    \"equipment\": \"Keg\",\n    \"ingredients\": [\n      {\n        \"name\": \"Hops\",\n        \"id\": \"304\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 2250,\n    \"processingDays\": 1.41,\n    \"sellPrice\": 300,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": true,\n    \"cask\": {\n      \"silverDays\": 9,\n      \"goldDays\": 18,\n      \"iridiumDays\": 36\n    },\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"buffs\": [\n      {\n        \"stat\": \"Speed\",\n        \"value\": -1\n      }\n    ],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Pale Ale.png\",\n    \"maxQuality\": \"iridium\"\n  },\n  {\n    \"id\": \"346\",\n    \"name\": \"Beer\",\n    \"description\": \"Drink in moderation.\",\n    \"equipment\": \"Keg\",\n    \"ingredients\": [\n      {\n        \"name\": \"Wheat\",\n        \"id\": \"262\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 1750,\n    \"processingDays\": 1.09,\n    \"sellPrice\": 200,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": true,\n    \"cask\": {\n      \"silverDays\": 7,\n      \"goldDays\": 14,\n      \"iridiumDays\": 28\n    },\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"buffs\": [\n      {\n        \"stat\": \"Speed\",\n        \"value\": -1\n      }\n    ],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Beer.png\",\n    \"maxQuality\": \"iridium\"\n  },\n  {\n    \"id\": \"459\",\n    \"name\": \"Mead\",\n    \"description\": \"Drink in moderation.\",\n    \"equipment\": \"Keg\",\n    \"ingredients\": [\n      {\n        \"name\": \"Honey\",\n        \"id\": \"340\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 600,\n    \"processingDays\": 0.38,\n    \"sellPrice\": 300,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": true,\n    \"cask\": {\n      \"silverDays\": 7,\n      \"goldDays\": 14,\n      \"iridiumDays\": 28\n    },\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"buffs\": [\n      {\n        \"stat\": \"Speed\",\n        \"value\": -1\n      }\n    ],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Mead.png\",\n    \"maxQuality\": \"iridium\"\n  },\n  {\n    \"id\": \"395\",\n    \"name\": \"Coffee\",\n    \"description\": \"It smells delicious. This is sure to give you a boost.\",\n    \"equipment\": \"Keg\",\n    \"ingredients\": [\n      {\n        \"name\": \"Coffee Bean\",\n        \"id\": \"433\",\n        \"quantity\": 5\n      }\n    ],\n    \"processingMinutes\": 120,\n    \"processingDays\": 0.08,\n    \"sellPrice\": 150,\n    \"profession\": [],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 3,\n      \"health\": 1\n    },\n    \"buffs\": [\n      {\n        \"stat\": \"Speed\",\n        \"value\": 1\n      }\n    ],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Coffee.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"419\",\n    \"name\": \"Vinegar\",\n    \"description\": \"A fermented liquid used in cooking and preservation.\",\n    \"equipment\": \"Keg\",\n    \"ingredients\": [\n      {\n        \"name\": \"Rice\",\n        \"id\": \"423\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 600,\n    \"processingDays\": 0.38,\n    \"sellPrice\": 100,\n    \"profession\": [],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Vinegar.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"614\",\n    \"name\": \"Green Tea\",\n    \"description\": \"A soothing beverage made from tea leaves.\",\n    \"equipment\": \"Keg\",\n    \"ingredients\": [\n      {\n        \"name\": \"Tea Leaves\",\n        \"id\": \"815\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 180,\n    \"processingDays\": 0.11,\n    \"sellPrice\": 100,\n    \"profession\": [],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"buffs\": [\n      {\n        \"stat\": \"Speed\",\n        \"value\": 0.5\n      }\n    ],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Green Tea.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"344\",\n    \"name\": \"Jelly\",\n    \"description\": \"A sweet fruit preserve.\",\n    \"equipment\": \"Preserves Jar\",\n    \"ingredients\": [\n      {\n        \"name\": \"Any Fruit\",\n        \"id\": null,\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 4000,\n    \"processingDays\": 2.5,\n    \"sellPrice\": null,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"50 + 2× base fruit price\",\n    \"priceFormula\": {\n      \"multiplier\": 2,\n      \"addend\": 50\n    },\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": \"2× base fruit energy & health\",\n    \"energyHealth\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Jelly.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"342\",\n    \"name\": \"Pickles\",\n    \"description\": \"A jar of your home-grown pickles.\",\n    \"equipment\": \"Preserves Jar\",\n    \"ingredients\": [\n      {\n        \"name\": \"Any Vegetable\",\n        \"id\": null,\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 4000,\n    \"processingDays\": 2.5,\n    \"sellPrice\": null,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"50 + 2× base vegetable price\",\n    \"priceFormula\": {\n      \"multiplier\": 2,\n      \"addend\": 50\n    },\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": \"1.75× base vegetable energy & health\",\n    \"energyHealth\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Pickles.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"447\",\n    \"name\": \"Aged Roe\",\n    \"description\": \"Aged to a delicate, complex flavor.\",\n    \"equipment\": \"Preserves Jar\",\n    \"ingredients\": [\n      {\n        \"name\": \"Roe\",\n        \"id\": \"812\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 4000,\n    \"processingDays\": 2.5,\n    \"sellPrice\": null,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"2× base roe price\",\n    \"priceFormula\": {\n      \"multiplier\": 2,\n      \"addend\": 0\n    },\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 100,\n      \"health\": 45\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Aged Roe.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"445\",\n    \"name\": \"Caviar\",\n    \"description\": \"Fish eggs prepared with care.\",\n    \"equipment\": \"Preserves Jar\",\n    \"ingredients\": [\n      {\n        \"name\": \"Sturgeon Roe\",\n        \"id\": \"812S\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 6000,\n    \"processingDays\": 3.75,\n    \"sellPrice\": 500,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 175,\n      \"health\": 78\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Caviar.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"424\",\n    \"name\": \"Cheese\",\n    \"description\": \"It's a basic necessity of life.\",\n    \"equipment\": \"Cheese Press\",\n    \"ingredients\": [\n      {\n        \"name\": \"Milk\",\n        \"id\": \"184\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Large Milk\",\n        \"id\": \"186\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 200,\n    \"processingDays\": 0.13,\n    \"sellPrice\": 230,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"Large Milk produces Gold quality (345g)\",\n    \"priceFormula\": null,\n    \"qualityLevels\": true,\n    \"cask\": {\n      \"silverDays\": 7,\n      \"goldDays\": 14,\n      \"iridiumDays\": 28\n    },\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 125,\n      \"health\": 56\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Cheese.png\",\n    \"maxQuality\": \"iridium\"\n  },\n  {\n    \"id\": \"426\",\n    \"name\": \"Goat Cheese\",\n    \"description\": \"Soft cheese made from goat's milk.\",\n    \"equipment\": \"Cheese Press\",\n    \"ingredients\": [\n      {\n        \"name\": \"Goat Milk\",\n        \"id\": \"436\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Large Goat Milk\",\n        \"id\": \"438\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 200,\n    \"processingDays\": 0.13,\n    \"sellPrice\": 400,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"Large Goat Milk produces Gold quality (600g)\",\n    \"priceFormula\": null,\n    \"qualityLevels\": true,\n    \"cask\": {\n      \"silverDays\": 7,\n      \"goldDays\": 14,\n      \"iridiumDays\": 28\n    },\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 125,\n      \"health\": 56\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Goat Cheese.png\",\n    \"maxQuality\": \"iridium\"\n  },\n  {\n    \"id\": \"428\",\n    \"name\": \"Cloth\",\n    \"description\": \"A bolt of fine wool cloth.\",\n    \"equipment\": \"Loom\",\n    \"ingredients\": [\n      {\n        \"name\": \"Wool\",\n        \"id\": \"440\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 240,\n    \"processingDays\": 0.15,\n    \"sellPrice\": 470,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Cloth.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"432\",\n    \"name\": \"Truffle Oil\",\n    \"description\": \"A gourmet cooking ingredient.\",\n    \"equipment\": \"Oil Maker\",\n    \"ingredients\": [\n      {\n        \"name\": \"Truffle\",\n        \"id\": \"430\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 360,\n    \"processingDays\": 0.23,\n    \"sellPrice\": 1065,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Truffle Oil.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"247\",\n    \"name\": \"Oil\",\n    \"description\": \"A multipurpose cooking oil.\",\n    \"equipment\": \"Oil Maker\",\n    \"ingredients\": [\n      {\n        \"name\": \"Sunflower\",\n        \"id\": \"421\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Sunflower Seeds\",\n        \"id\": \"431\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Corn\",\n        \"id\": \"270\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 1000,\n    \"processingDays\": 0.63,\n    \"sellPrice\": 100,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Oil.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"306\",\n    \"name\": \"Mayonnaise\",\n    \"description\": \"It's a thick, creamy sauce.\",\n    \"equipment\": \"Mayonnaise Machine\",\n    \"ingredients\": [\n      {\n        \"name\": \"Egg\",\n        \"id\": \"176\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Large Egg\",\n        \"id\": \"174\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Brown Egg\",\n        \"id\": \"180\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Large Brown Egg\",\n        \"id\": \"182\",\n        \"quantity\": 1\n      },\n      {\n        \"name\": \"Golden Egg\",\n        \"id\": \"928\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 180,\n    \"processingDays\": 0.11,\n    \"sellPrice\": 190,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"Large Egg produces 2× Mayonnaise; Golden Egg produces Gold quality\",\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Mayonnaise.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"307\",\n    \"name\": \"Duck Mayonnaise\",\n    \"description\": \"This mayonnaise was made with a duck egg.\",\n    \"equipment\": \"Mayonnaise Machine\",\n    \"ingredients\": [\n      {\n        \"name\": \"Duck Egg\",\n        \"id\": \"442\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 180,\n    \"processingDays\": 0.11,\n    \"sellPrice\": 375,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Duck Mayonnaise.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"308\",\n    \"name\": \"Void Mayonnaise\",\n    \"description\": \"A dark, mysterious condiment.\",\n    \"equipment\": \"Mayonnaise Machine\",\n    \"ingredients\": [\n      {\n        \"name\": \"Void Egg\",\n        \"id\": \"305\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 180,\n    \"processingDays\": 0.11,\n    \"sellPrice\": 275,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": -75,\n      \"health\": 0,\n      \"poison\": true\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Void Mayonnaise.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"807\",\n    \"name\": \"Dinosaur Mayonnaise\",\n    \"description\": \"It's thick and creamy, with a distinct prehistoric smell.\",\n    \"equipment\": \"Mayonnaise Machine\",\n    \"ingredients\": [\n      {\n        \"name\": \"Dinosaur Egg\",\n        \"id\": \"107\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 180,\n    \"processingDays\": 0.11,\n    \"sellPrice\": 800,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 125,\n      \"health\": 56\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Dinosaur Mayonnaise.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"Raisins\",\n    \"name\": \"Raisins\",\n    \"description\": \"Dried grapes. They have a very sweet flavor.\",\n    \"equipment\": \"Dehydrator\",\n    \"ingredients\": [\n      {\n        \"name\": \"Grape\",\n        \"id\": \"398\",\n        \"quantity\": 5\n      }\n    ],\n    \"processingMinutes\": 1600,\n    \"processingDays\": 1,\n    \"sellPrice\": 600,\n    \"profession\": [],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 125,\n      \"health\": 56\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Raisins.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"DriedFruit\",\n    \"name\": \"Dried Fruit\",\n    \"description\": \"A sweet and chewy snack.\",\n    \"equipment\": \"Dehydrator\",\n    \"ingredients\": [\n      {\n        \"name\": \"Any Fruit\",\n        \"id\": null,\n        \"quantity\": 5\n      }\n    ],\n    \"processingMinutes\": 1600,\n    \"processingDays\": 1,\n    \"sellPrice\": null,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"2.5× base fruit price\",\n    \"priceFormula\": {\n      \"multiplier\": 2.5,\n      \"addend\": 0\n    },\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": \"3× base fruit energy & health\",\n    \"energyHealth\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Dried Fruit.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"DriedMushrooms\",\n    \"name\": \"Dried Mushrooms\",\n    \"description\": \"Concentrated mushroom flavor. Goes great in soups.\",\n    \"equipment\": \"Dehydrator\",\n    \"ingredients\": [\n      {\n        \"name\": \"Any Edible Mushroom\",\n        \"id\": null,\n        \"quantity\": 2\n      }\n    ],\n    \"processingMinutes\": 1600,\n    \"processingDays\": 1,\n    \"sellPrice\": null,\n    \"profession\": [\"artisan\"],\n    \"sellPriceFormula\": \"2.5× base mushroom price\",\n    \"priceFormula\": {\n      \"multiplier\": 2.5,\n      \"addend\": 0\n    },\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": \"3× base mushroom energy & health\",\n    \"energyHealth\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Dried Mushrooms.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"SmokedFish\",\n    \"name\": \"Smoked Fish\",\n    \"description\": \"Preserving fish through smoking gives it a rich, complex flavor.\",\n    \"equipment\": \"Fish Smoker\",\n    \"ingredients\": [\n      {\n        \"name\": \"Any Fish\",\n        \"id\": null,\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 50,\n    \"processingDays\": 0.03,\n    \"sellPrice\": null,\n    \"profession\": [\"fisher\", \"artisan\", \"angler\"],\n    \"sellPriceFormula\": \"2× base fish sell price\",\n    \"priceFormula\": {\n      \"multiplier\": 2,\n      \"addend\": 0\n    },\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": \"1.5× base fish energy & health\",\n    \"energyHealth\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Smoked Fish.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"MysticSyrup\",\n    \"name\": \"Mystic Syrup\",\n    \"description\": \"A syrup with a powerful magical essence.\",\n    \"equipment\": \"Tapper\",\n    \"ingredients\": [\n      {\n        \"name\": \"Mystic Tree\",\n        \"id\": null,\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 10080,\n    \"processingDays\": 7,\n    \"sellPrice\": 1000,\n    \"profession\": [\"tapper\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 500,\n      \"health\": 225\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/artisan-goods/Mystic Syrup.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"724\",\n    \"name\": \"Maple Syrup\",\n    \"description\": \"A sweet syrup with a unique flavor.\",\n    \"equipment\": \"Tapper\",\n    \"ingredients\": [\n      {\n        \"name\": \"Maple Tree\",\n        \"id\": \"2\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 14400,\n    \"processingDays\": 9,\n    \"sellPrice\": 200,\n    \"profession\": [\"tapper\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/forageables/Maple Syrup.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"725\",\n    \"name\": \"Oak Resin\",\n    \"description\": \"A sticky, fragrant substance obtained from oak trees.\",\n    \"equipment\": \"Tapper\",\n    \"ingredients\": [\n      {\n        \"name\": \"Oak Tree\",\n        \"id\": \"1\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 11200,\n    \"processingDays\": 7,\n    \"sellPrice\": 150,\n    \"profession\": [\"tapper\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/forageables/Oak Resin.png\",\n    \"maxQuality\": \"base\"\n  },\n  {\n    \"id\": \"726\",\n    \"name\": \"Pine Tar\",\n    \"description\": \"A dark, sticky substance derived from pine trees.\",\n    \"equipment\": \"Tapper\",\n    \"ingredients\": [\n      {\n        \"name\": \"Pine Tree\",\n        \"id\": \"3\",\n        \"quantity\": 1\n      }\n    ],\n    \"processingMinutes\": 8000,\n    \"processingDays\": 5,\n    \"sellPrice\": 100,\n    \"profession\": [\"tapper\"],\n    \"sellPriceFormula\": null,\n    \"priceFormula\": null,\n    \"qualityLevels\": false,\n    \"cask\": null,\n    \"energyHealthFormula\": null,\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"image\": \"images/forageables/Pine Tar.png\",\n    \"maxQuality\": \"base\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/artisan-goods.json';\nimport { ArtisanGood, PriceFormula } from '@/types';\n\nconst artisanGoodData: ArtisanGood[] = data as ArtisanGood[];\n\n/** Query builder for artisan good data. All filter methods return a new ArtisanGoodQuery for chaining. */\nexport class ArtisanGoodQuery extends QueryBase<ArtisanGood> {\n  constructor(data: ArtisanGood[] = artisanGoodData) {\n    super(data);\n  }\n\n  /** Filter by the equipment that produces the good (case-insensitive, e.g. `'Keg'`, `'Preserves Jar'`). */\n  byEquipment(equipment: string): ArtisanGoodQuery {\n    return new ArtisanGoodQuery(\n      this.data.filter((a) => a.equipment.toLowerCase() === equipment.toLowerCase()),\n    );\n  }\n\n  /** Filter to goods that can be aged in a Cask (have `cask` data). */\n  caskAgeable(): ArtisanGoodQuery {\n    return new ArtisanGoodQuery(this.data.filter((a) => a.cask !== null));\n  }\n\n  /** Filter to goods that can achieve Silver/Gold/Iridium quality. */\n  withQualityLevels(): ArtisanGoodQuery {\n    return new ArtisanGoodQuery(this.data.filter((a) => a.qualityLevels));\n  }\n\n  /** Filter to goods with a fixed sell price (not formula-based). */\n  fixedPrice(): ArtisanGoodQuery {\n    return new ArtisanGoodQuery(this.data.filter((a) => a.sellPrice !== null));\n  }\n\n  /** Filter to goods whose sell price is calculated from an ingredient (formula-based). */\n  formulaPrice(): ArtisanGoodQuery {\n    return new ArtisanGoodQuery(this.data.filter((a) => a.sellPrice === null));\n  }\n}\n\n/** Returns an ArtisanGoodQuery for all artisan good data. Pass `source` to wrap a pre-filtered array. */\nexport function artisanGoods(source: ArtisanGood[] = artisanGoodData): ArtisanGoodQuery {\n  return new ArtisanGoodQuery(source);\n}\n\n/**\n * Calculate the sell price of an artisan good given the ingredient's base sell price.\n * Formula: Math.floor(ingredientBasePrice * multiplier) + addend\n * Returns null if the good has no price formula (fixed-price items).\n */\nexport function calculateArtisanPrice(\n  good: ArtisanGood,\n  ingredientBasePrice: number,\n): number | null {\n  if (!good.priceFormula) return null;\n  return applyPriceFormula(good.priceFormula, ingredientBasePrice);\n}\n\n/**\n * Apply a PriceFormula directly to an ingredient base price.\n * Useful when you already have a formula object.\n */\nexport function applyPriceFormula(formula: PriceFormula, ingredientBasePrice: number): number {\n  return Math.floor(ingredientBasePrice * formula.multiplier) + formula.addend;\n}\n","import {\n  ArtisanEnergyResult,\n  ArtisanResult,\n  Quality,\n  QualityEnergyHealth,\n  QualityPrice,\n} from '@/types';\n\nconst QUALITY_ICONS: Record<Quality, string> = {\n  silver: 'images/misc/Silver Quality.png',\n  gold: 'images/misc/Gold Quality.png',\n  iridium: 'images/misc/Iridium Quality.png',\n};\n\nconst SELL_MULTIPLIERS: Record<Quality, number> = {\n  silver: 1.25,\n  gold: 1.5,\n  iridium: 2,\n};\n\nconst ENERGY_MULTIPLIERS: Record<Quality, number> = {\n  silver: 1.4,\n  gold: 1.8,\n  iridium: 2.6,\n};\n\nconst QUALITIES: Quality[] = ['silver', 'gold', 'iridium'];\n\n/**\n * Calculates quality-scaled sell prices and energy/health values.\n * Mirrors the game's item quality formulas for Silver, Gold, and Iridium tiers.\n */\nexport class QualityCalculator {\n  /**\n   * Calculate sell prices for Silver, Gold, and Iridium quality.\n   * Calculation: Math.floor(basePrice * multiplier)\n   * Multipliers: Silver ×1.25, Gold ×1.5, Iridium ×2\n   */\n  sellPrices(basePrice: number): QualityPrice[] {\n    return QUALITIES.map((quality) => ({\n      quality,\n      icon: QUALITY_ICONS[quality],\n      value: Math.floor(basePrice * SELL_MULTIPLIERS[quality]),\n    }));\n  }\n\n  /**\n   * Calculate energy and health for Silver, Gold, and Iridium quality.\n   * The same multiplier is applied independently to each base value.\n   * Multipliers: Silver ×1.4, Gold ×1.8, Iridium ×2.6\n   */\n  energyHealth(baseEnergy: number, baseHealth: number): QualityEnergyHealth[] {\n    return QUALITIES.map((quality) => ({\n      quality,\n      icon: QUALITY_ICONS[quality],\n      energy: Math.floor(baseEnergy * ENERGY_MULTIPLIERS[quality]),\n      health: Math.floor(baseHealth * ENERGY_MULTIPLIERS[quality]),\n    }));\n  }\n}\n\n/** Returns a QualityCalculator instance for computing quality-scaled prices and energy/health values. */\nexport function qualityCalculator(): QualityCalculator {\n  return new QualityCalculator();\n}\n\n/**\n * Calculates sell prices and energy/health values for artisan goods.\n * Each method accepts pre-computed base values for the source ingredient.\n */\nexport class ArtisanCalculator {\n  /** Roe sell price: `30 + Math.floor(baseFishPrice / 2)` */\n  roe(baseFishPrice: number): ArtisanResult {\n    return { sellPrice: 30 + Math.floor(baseFishPrice / 2) };\n  }\n\n  /** Aged Roe sell price: `60 + baseFishPrice` */\n  agedRoe(baseFishPrice: number): ArtisanResult {\n    return { sellPrice: 60 + baseFishPrice };\n  }\n\n  /**\n   * Honey sell price: `100 + (baseFlowerPrice * 2)`.\n   * Pass `0` for wild honey (no nearby flower).\n   */\n  honey(baseFlowerPrice: number): ArtisanResult {\n    return { sellPrice: 100 + baseFlowerPrice * 2 };\n  }\n\n  /** Wine sell price (`Math.floor(baseFruitPrice * 3)`) and energy/health (`×1.75`). */\n  wine(baseFruitPrice: number, baseEnergy: number, baseHealth: number): ArtisanEnergyResult {\n    return {\n      sellPrice: Math.floor(baseFruitPrice * 3),\n      energy: Math.floor(baseEnergy * 1.75),\n      health: Math.floor(baseHealth * 1.75),\n    };\n  }\n\n  /** Juice sell price (`Math.floor(basePrice * 2.25)`) and energy/health (`×2`). */\n  juice(basePrice: number, baseEnergy: number, baseHealth: number): ArtisanEnergyResult {\n    return {\n      sellPrice: Math.floor(basePrice * 2.25),\n      energy: Math.floor(baseEnergy * 2),\n      health: Math.floor(baseHealth * 2),\n    };\n  }\n\n  /** Pickles sell price (`Math.floor(basePrice * 2) + 50`) and energy/health (`×1.75`). */\n  pickles(basePrice: number, baseEnergy: number, baseHealth: number): ArtisanEnergyResult {\n    return {\n      sellPrice: Math.floor(basePrice * 2) + 50,\n      energy: Math.floor(baseEnergy * 1.75),\n      health: Math.floor(baseHealth * 1.75),\n    };\n  }\n\n  /** Jelly sell price (`Math.floor(baseFruitPrice * 2) + 50`) and energy/health (`×2`). */\n  jelly(baseFruitPrice: number, baseEnergy: number, baseHealth: number): ArtisanEnergyResult {\n    return {\n      sellPrice: Math.floor(baseFruitPrice * 2) + 50,\n      energy: Math.floor(baseEnergy * 2),\n      health: Math.floor(baseHealth * 2),\n    };\n  }\n\n  /** Dried Mushrooms sell price (`Math.floor(baseMushroomPrice * 7.5) + 25`) and energy/health (`×3`). */\n  driedMushrooms(\n    baseMushroomPrice: number,\n    baseEnergy: number,\n    baseHealth: number,\n  ): ArtisanEnergyResult {\n    return {\n      sellPrice: Math.floor(baseMushroomPrice * 7.5) + 25,\n      energy: Math.floor(baseEnergy * 3),\n      health: Math.floor(baseHealth * 3),\n    };\n  }\n\n  /** Dried Fruit sell price (`Math.floor(baseFruitPrice * 7.5)`) and energy/health (`×3`). */\n  driedFruit(baseFruitPrice: number, baseEnergy: number, baseHealth: number): ArtisanEnergyResult {\n    return {\n      sellPrice: Math.floor(baseFruitPrice * 7.5),\n      energy: Math.floor(baseEnergy * 3),\n      health: Math.floor(baseHealth * 3),\n    };\n  }\n\n  /** Smoked Fish sell price (`Math.floor(baseFishPrice * 2)`) and energy/health (`×1.5`). */\n  smokedFish(baseFishPrice: number, baseEnergy: number, baseHealth: number): ArtisanEnergyResult {\n    return {\n      sellPrice: Math.floor(baseFishPrice * 2),\n      energy: Math.floor(baseEnergy * 1.5),\n      health: Math.floor(baseHealth * 1.5),\n    };\n  }\n}\n\n/** Returns an ArtisanCalculator instance for computing artisan good sell prices and energy/health values. */\nexport function artisanCalculator(): ArtisanCalculator {\n  return new ArtisanCalculator();\n}\n\n/**\n * Calculates sell prices with profession bonuses applied.\n * Each method takes a base sell price and returns the adjusted value.\n */\nexport class ProfessionCalculator {\n  /** Artisan profession bonus: `Math.floor(price * 1.4)` */\n  artisan(price: number): number {\n    return Math.floor(price * 1.4);\n  }\n\n  /** Rancher profession bonus: `Math.floor(price * 1.2)` */\n  rancher(price: number): number {\n    return Math.floor(price * 1.2);\n  }\n\n  /** Tiller profession bonus: `Math.floor(price * 1.1)` */\n  tiller(price: number): number {\n    return Math.floor(price * 1.1);\n  }\n\n  /** Blacksmith profession bonus: `Math.floor(price * 1.5)` */\n  blacksmith(price: number): number {\n    return Math.floor(price * 1.5);\n  }\n\n  /** Gemologist profession bonus: `Math.floor(price * 1.3)` */\n  gemologist(price: number): number {\n    return Math.floor(price * 1.3);\n  }\n\n  /** Tapper profession bonus: `Math.floor(price * 1.25)` */\n  tapper(price: number): number {\n    return Math.floor(price * 1.25);\n  }\n\n  /** Fisher profession bonus: `Math.floor(price * 1.25)` */\n  fisher(price: number): number {\n    return Math.floor(price * 1.25);\n  }\n\n  /** Angler profession bonus: `Math.floor(price * 1.5)` */\n  angler(price: number): number {\n    return Math.floor(price * 1.5);\n  }\n}\n\n/** Returns a ProfessionCalculator instance for computing profession-adjusted sell prices. */\nexport function professionCalculator(): ProfessionCalculator {\n  return new ProfessionCalculator();\n}\n\n/**\n * Calculates sell prices with special knowledge bonuses applied.\n * Each method takes a base sell price and returns the adjusted value.\n */\nexport class KnowledgeCalculator {\n  /** Spring Onion Mastery bonus: `Math.floor(price * 5)` */\n  springOnionMastery(price: number): number {\n    return Math.floor(price * 5);\n  }\n\n  /** Bear's Knowledge bonus: `Math.floor(price * 3)` */\n  bearsKnowledge(price: number): number {\n    return Math.floor(price * 3);\n  }\n}\n\n/** Returns a KnowledgeCalculator instance for computing knowledge bonus sell prices. */\nexport function knowledgeCalculator(): KnowledgeCalculator {\n  return new KnowledgeCalculator();\n}\n\nconst TOTAL_GOLDEN_WALNUTS = 130;\nconst JOJA_PARROT_COST_PER_WALNUT = 10000;\n\n/**\n * Calculates the cost to purchase remaining Golden Walnuts from the Joja Parrot.\n * Each unfound walnut costs 10,000g. All remaining walnuts are delivered after sleeping.\n */\nexport class JojaParrotCalculator {\n  /** Calculate the gold cost to buy all remaining walnuts. */\n  cost(walnutsFound: number): number {\n    const remaining = Math.max(0, TOTAL_GOLDEN_WALNUTS - walnutsFound);\n    return remaining * JOJA_PARROT_COST_PER_WALNUT;\n  }\n\n  /** Returns how many walnuts are still unfound. */\n  remaining(walnutsFound: number): number {\n    return Math.max(0, TOTAL_GOLDEN_WALNUTS - walnutsFound);\n  }\n\n  /** The total number of Golden Walnuts available in the game. */\n  get total(): number {\n    return TOTAL_GOLDEN_WALNUTS;\n  }\n\n  /** The cost per individual unfound walnut (10,000g). */\n  get costPerWalnut(): number {\n    return JOJA_PARROT_COST_PER_WALNUT;\n  }\n}\n\n/** Returns a JojaParrotCalculator instance for computing Golden Walnut purchase costs. */\nexport function jojaParrotCalculator(): JojaParrotCalculator {\n  return new JojaParrotCalculator();\n}\n","[\n  {\n    \"id\": \"24\",\n    \"name\": \"Parsnip\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 4,\n    \"regrowDays\": null,\n    \"seedId\": \"472\",\n    \"seedName\": \"Parsnip Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 20\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 25\n      }\n    ],\n    \"seedSellPrice\": 10,\n    \"cropSellPrice\": 35,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A spring tuber closely related to the carrot. It has a sweet, fresh taste.\",\n    \"image\": \"images/crops/parsnip/crop.png\",\n    \"seedImage\": \"images/crops/parsnip/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/parsnip/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/parsnip/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/parsnip/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/parsnip/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/parsnip/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"farmingXP\": 8,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"188\",\n    \"name\": \"Green Bean\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 10,\n    \"regrowDays\": 3,\n    \"seedId\": \"473\",\n    \"seedName\": \"Bean Starter\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 60\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 75\n      }\n    ],\n    \"seedSellPrice\": 30,\n    \"cropSellPrice\": 40,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": true,\n    \"giant\": false,\n    \"description\": \"A young, tender bean in the pod.\",\n    \"image\": \"images/crops/green-bean/crop.png\",\n    \"seedImage\": \"images/crops/green-bean/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/green-bean/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/green-bean/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/green-bean/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/green-bean/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/green-bean/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/green-bean/stage-6.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/green-bean/stage-7.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"farmingXP\": 9,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"190\",\n    \"name\": \"Cauliflower\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 12,\n    \"regrowDays\": null,\n    \"seedId\": \"474\",\n    \"seedName\": \"Cauliflower Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 80\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 100\n      }\n    ],\n    \"seedSellPrice\": 40,\n    \"cropSellPrice\": 175,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": true,\n    \"description\": \"It's actually a type of flower! A massive head of tightly packed white florets.\",\n    \"image\": \"images/crops/cauliflower/crop.png\",\n    \"giantImage\": \"images/crops/cauliflower/giant.png\",\n    \"seedImage\": \"images/crops/cauliflower/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/cauliflower/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/cauliflower/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/cauliflower/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/cauliflower/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/cauliflower/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/cauliflower/stage-6.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"farmingXP\": 23,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"192\",\n    \"name\": \"Potato\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 6,\n    \"regrowDays\": null,\n    \"seedId\": \"475\",\n    \"seedName\": \"Potato Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 50\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 63\n      }\n    ],\n    \"seedSellPrice\": 25,\n    \"cropSellPrice\": 80,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 4\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A widely cultivated plant, the potato is one of the most important food crops in the world.\",\n    \"image\": \"images/crops/potato/crop.png\",\n    \"seedImage\": \"images/crops/potato/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/potato/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/potato/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/potato/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/potato/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/potato/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/potato/stage-6.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"farmingXP\": 14,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"248\",\n    \"name\": \"Garlic\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 4,\n    \"regrowDays\": null,\n    \"seedId\": \"476\",\n    \"seedName\": \"Garlic Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 40\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 50\n      }\n    ],\n    \"seedSellPrice\": 20,\n    \"cropSellPrice\": 60,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A pungent herb used in cooking. The aroma is known to keep monsters at bay.\",\n    \"image\": \"images/crops/garlic/crop.png\",\n    \"seedImage\": \"images/crops/garlic/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/garlic/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/garlic/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/garlic/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/garlic/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/garlic/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 20,\n      \"health\": 9\n    },\n    \"farmingXP\": 12,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"250\",\n    \"name\": \"Kale\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 6,\n    \"regrowDays\": null,\n    \"seedId\": \"477\",\n    \"seedName\": \"Kale Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 70\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 88\n      }\n    ],\n    \"seedSellPrice\": 35,\n    \"cropSellPrice\": 110,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"This dark leafy green is impressively healthy and grows quickly.\",\n    \"image\": \"images/crops/kale/crop.png\",\n    \"seedImage\": \"images/crops/kale/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/kale/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/kale/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/kale/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/kale/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/kale/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"farmingXP\": 17,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"252\",\n    \"name\": \"Rhubarb\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 13,\n    \"regrowDays\": null,\n    \"seedId\": \"478\",\n    \"seedName\": \"Rhubarb Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Oasis\",\n        \"price\": 100\n      }\n    ],\n    \"seedSellPrice\": 50,\n    \"cropSellPrice\": 220,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A spring crop sold at the Oasis Shop. It's tart but flavorful when cooked.\",\n    \"image\": \"images/crops/rhubarb/crop.png\",\n    \"seedImage\": \"images/crops/rhubarb/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/rhubarb/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/rhubarb/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/rhubarb/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/rhubarb/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/rhubarb/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/rhubarb/stage-6.png\"\n      }\n    ],\n    \"farmingXP\": 26,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"400\",\n    \"name\": \"Strawberry\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 8,\n    \"regrowDays\": 4,\n    \"seedId\": \"745\",\n    \"seedName\": \"Strawberry Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Egg Festival\",\n        \"price\": 100\n      }\n    ],\n    \"seedSellPrice\": 0,\n    \"cropSellPrice\": 120,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"This plump, delicious berry will continue to produce after the first harvest.\",\n    \"image\": \"images/crops/strawberry/crop.png\",\n    \"seedImage\": \"images/crops/strawberry/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/strawberry/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/strawberry/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/strawberry/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/strawberry/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/strawberry/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/strawberry/stage-6.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/strawberry/stage-7.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"farmingXP\": 18,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"271\",\n    \"name\": \"Unmilled Rice\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 8,\n    \"regrowDays\": null,\n    \"seedId\": \"273\",\n    \"seedName\": \"Rice Shoot\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 40\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 50\n      }\n    ],\n    \"seedSellPrice\": 20,\n    \"cropSellPrice\": 30,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"Needs to be milled before eating. Thrives in paddy conditions near water.\",\n    \"image\": \"images/crops/unmilled-rice/crop.png\",\n    \"seedImage\": \"images/crops/unmilled-rice/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/unmilled-rice/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/unmilled-rice/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/unmilled-rice/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/unmilled-rice/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/unmilled-rice/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 3,\n      \"health\": 1\n    },\n    \"farmingXP\": 7,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"591\",\n    \"name\": \"Tulip\",\n    \"category\": \"flower\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 6,\n    \"regrowDays\": null,\n    \"seedId\": \"427\",\n    \"seedName\": \"Tulip Bulb\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 20\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 25\n      }\n    ],\n    \"seedSellPrice\": 10,\n    \"cropSellPrice\": 30,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A vivid spring flower that turns the meadow red and yellow.\",\n    \"image\": \"images/crops/tulip/crop.png\",\n    \"seedImage\": \"images/crops/tulip/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/tulip/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/tulip/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/tulip/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/tulip/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/tulip/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 45,\n      \"health\": 20\n    },\n    \"farmingXP\": 7,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": true,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"597\",\n    \"name\": \"Blue Jazz\",\n    \"category\": \"flower\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 7,\n    \"regrowDays\": null,\n    \"seedId\": \"429\",\n    \"seedName\": \"Jazz Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 30\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 38\n      }\n    ],\n    \"seedSellPrice\": 15,\n    \"cropSellPrice\": 50,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A delicate flower with a lovely blue hue.\",\n    \"image\": \"images/crops/blue-jazz/crop.png\",\n    \"seedImage\": \"images/crops/blue-jazz/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/blue-jazz/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/blue-jazz/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/blue-jazz/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/blue-jazz/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 45,\n      \"health\": 20\n    },\n    \"farmingXP\": 10,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": true,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"Carrot\",\n    \"name\": \"Carrot\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"spring\"],\n    \"growDays\": 3,\n    \"regrowDays\": null,\n    \"seedId\": \"CarrotSeeds\",\n    \"seedName\": \"Carrot Seeds\",\n    \"seedBuyPrices\": [],\n    \"seedSellPrice\": 15,\n    \"cropSellPrice\": 35,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A bright orange root vegetable. Good for your eyesight.\",\n    \"image\": \"images/crops/carrot/crop.png\",\n    \"seedImage\": \"images/crops/carrot/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/carrot/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/carrot/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/carrot/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/carrot/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"farmingXP\": 8,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"433\",\n    \"name\": \"Coffee Bean\",\n    \"category\": \"seed\",\n    \"seasons\": [\"spring\", \"summer\"],\n    \"growDays\": 10,\n    \"regrowDays\": 2,\n    \"seedId\": \"433\",\n    \"seedName\": \"Coffee Bean\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Traveling Cart\",\n        \"price\": 2500\n      }\n    ],\n    \"seedSellPrice\": 15,\n    \"cropSellPrice\": 15,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 4,\n      \"max\": 4\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"It'll keep you buzzin'. Plant in spring or summer to harvest more beans.\",\n    \"image\": \"images/crops/coffee-bean/crop.png\",\n    \"seedImage\": \"images/crops/coffee-bean/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/coffee-bean/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/coffee-bean/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/coffee-bean/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/coffee-bean/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/coffee-bean/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/coffee-bean/stage-6.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/coffee-bean/stage-7.png\"\n      }\n    ],\n    \"farmingXP\": 4,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"254\",\n    \"name\": \"Melon\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 12,\n    \"regrowDays\": null,\n    \"seedId\": \"479\",\n    \"seedName\": \"Melon Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 80\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 100\n      }\n    ],\n    \"seedSellPrice\": 40,\n    \"cropSellPrice\": 250,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": true,\n    \"description\": \"A large sweet fruit that grows in summer. It's one of the most popular at festivals.\",\n    \"image\": \"images/crops/melon/crop.png\",\n    \"giantImage\": \"images/crops/melon/giant.png\",\n    \"seedImage\": \"images/crops/melon/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/melon/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/melon/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/melon/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/melon/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/melon/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/melon/stage-6.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 113,\n      \"health\": 50\n    },\n    \"farmingXP\": 27,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"256\",\n    \"name\": \"Tomato\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 11,\n    \"regrowDays\": 4,\n    \"seedId\": \"480\",\n    \"seedName\": \"Tomato Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 50\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 63\n      }\n    ],\n    \"seedSellPrice\": 25,\n    \"cropSellPrice\": 60,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": true,\n    \"giant\": false,\n    \"description\": \"A juicy, nutritious summer vegetable used in cooking worldwide.\",\n    \"image\": \"images/crops/tomato/crop.png\",\n    \"seedImage\": \"images/crops/tomato/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/tomato/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/tomato/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/tomato/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/tomato/stage-4.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/tomato/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 20,\n      \"health\": 9\n    },\n    \"farmingXP\": 12,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"258\",\n    \"name\": \"Blueberry\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 13,\n    \"regrowDays\": 4,\n    \"seedId\": \"481\",\n    \"seedName\": \"Blueberry Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 80\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 100\n      }\n    ],\n    \"seedSellPrice\": 40,\n    \"cropSellPrice\": 50,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 3,\n      \"max\": 3\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A popular berry among the residents of Stardew Valley.\",\n    \"image\": \"images/crops/blueberry/crop.png\",\n    \"seedImage\": \"images/crops/blueberry/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/blueberry/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/blueberry/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/blueberry/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/blueberry/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/blueberry/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/blueberry/stage-6.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/blueberry/stage-7.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"farmingXP\": 10,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"260\",\n    \"name\": \"Hot Pepper\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 5,\n    \"regrowDays\": 3,\n    \"seedId\": \"482\",\n    \"seedName\": \"Pepper Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 40\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 50\n      }\n    ],\n    \"seedSellPrice\": 20,\n    \"cropSellPrice\": 40,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"Fiery hot! A perfect flavoring for spicy summer dishes.\",\n    \"image\": \"images/crops/hot-pepper/crop.png\",\n    \"seedImage\": \"images/crops/hot-pepper/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/hot-pepper/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/hot-pepper/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/hot-pepper/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/hot-pepper/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/hot-pepper/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/hot-pepper/stage-6.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/hot-pepper/stage-7.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"farmingXP\": 9,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"264\",\n    \"name\": \"Radish\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 6,\n    \"regrowDays\": null,\n    \"seedId\": \"484\",\n    \"seedName\": \"Radish Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 40\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 50\n      }\n    ],\n    \"seedSellPrice\": 20,\n    \"cropSellPrice\": 90,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A crisp, peppery vegetable used in many summer salads and dishes.\",\n    \"image\": \"images/crops/radish/crop.png\",\n    \"seedImage\": \"images/crops/radish/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/radish/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/radish/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/radish/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/radish/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/radish/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 45,\n      \"health\": 20\n    },\n    \"farmingXP\": 15,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"266\",\n    \"name\": \"Red Cabbage\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 9,\n    \"regrowDays\": null,\n    \"seedId\": \"485\",\n    \"seedName\": \"Red Cabbage Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 100\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 125\n      }\n    ],\n    \"seedSellPrice\": 50,\n    \"cropSellPrice\": 260,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A blushing vegetable available from Pierre's starting in year two.\",\n    \"image\": \"images/crops/red-cabbage/crop.png\",\n    \"seedImage\": \"images/crops/red-cabbage/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/red-cabbage/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/red-cabbage/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/red-cabbage/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/red-cabbage/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/red-cabbage/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/red-cabbage/stage-6.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"farmingXP\": 28,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"268\",\n    \"name\": \"Starfruit\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 13,\n    \"regrowDays\": null,\n    \"seedId\": \"486\",\n    \"seedName\": \"Starfruit Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Oasis\",\n        \"price\": 400\n      }\n    ],\n    \"seedSellPrice\": 200,\n    \"cropSellPrice\": 750,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A delicious fruit that is said to be the sweetest thing you can grow.\",\n    \"image\": \"images/crops/starfruit/crop.png\",\n    \"seedImage\": \"images/crops/starfruit/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/starfruit/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/starfruit/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/starfruit/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/starfruit/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/starfruit/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/starfruit/stage-6.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 125,\n      \"health\": 56\n    },\n    \"farmingXP\": 43,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"304\",\n    \"name\": \"Hops\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 11,\n    \"regrowDays\": 1,\n    \"seedId\": \"302\",\n    \"seedName\": \"Hops Starter\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 60\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 75\n      }\n    ],\n    \"seedSellPrice\": 30,\n    \"cropSellPrice\": 25,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": true,\n    \"giant\": false,\n    \"description\": \"The flower clusters of the hops plant are used to brew beer.\",\n    \"image\": \"images/crops/hops/crop.png\",\n    \"seedImage\": \"images/crops/hops/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/hops/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/hops/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/hops/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/hops/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/hops/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/hops/stage-6.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/hops/stage-7.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 45,\n      \"health\": 20\n    },\n    \"farmingXP\": 6,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"376\",\n    \"name\": \"Poppy\",\n    \"category\": \"flower\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 7,\n    \"regrowDays\": null,\n    \"seedId\": \"453\",\n    \"seedName\": \"Poppy Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 100\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 125\n      }\n    ],\n    \"seedSellPrice\": 50,\n    \"cropSellPrice\": 140,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"The poppy is a sweet, delicate flower with a bold and powerful flavor.\",\n    \"image\": \"images/crops/poppy/crop.png\",\n    \"seedImage\": \"images/crops/poppy/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/poppy/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/poppy/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/poppy/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/poppy/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/poppy/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 45,\n      \"health\": 20\n    },\n    \"farmingXP\": 20,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": true,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"593\",\n    \"name\": \"Summer Spangle\",\n    \"category\": \"flower\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 8,\n    \"regrowDays\": null,\n    \"seedId\": \"455\",\n    \"seedName\": \"Spangle Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 50\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 63\n      }\n    ],\n    \"seedSellPrice\": 25,\n    \"cropSellPrice\": 90,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A tropical bloom that thrives in the summer heat.\",\n    \"image\": \"images/crops/summer-spangle/crop.png\",\n    \"seedImage\": \"images/crops/summer-spangle/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/summer-spangle/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/summer-spangle/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/summer-spangle/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/summer-spangle/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/summer-spangle/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 45,\n      \"health\": 20\n    },\n    \"farmingXP\": 15,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": true,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"SummerSquash\",\n    \"name\": \"Summer Squash\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"summer\"],\n    \"growDays\": 6,\n    \"regrowDays\": 3,\n    \"seedId\": \"SummerSquashSeeds\",\n    \"seedName\": \"Summer Squash Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 40\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 50\n      }\n    ],\n    \"seedSellPrice\": 20,\n    \"cropSellPrice\": 45,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A versatile summer squash that's great for cooking.\",\n    \"image\": \"images/crops/summer-squash/crop.png\",\n    \"seedImage\": \"images/crops/summer-squash/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/summer-squash/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/summer-squash/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/summer-squash/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/summer-squash/stage-4.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/summer-squash/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 63,\n      \"health\": 28\n    },\n    \"farmingXP\": 9,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"830\",\n    \"name\": \"Taro Root\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"summer\", \"ginger island\"],\n    \"growDays\": 10,\n    \"regrowDays\": null,\n    \"seedId\": \"831\",\n    \"seedName\": \"Taro Tuber\",\n    \"seedBuyPrices\": [],\n    \"seedSellPrice\": 20,\n    \"cropSellPrice\": 100,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A starchy root vegetable that grows best in wet, paddy conditions.\",\n    \"image\": \"images/crops/taro-root/crop.png\",\n    \"seedImage\": \"images/crops/taro-root/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/taro-root/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/taro-root/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/taro-root/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/taro-root/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"farmingXP\": 16,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"270\",\n    \"name\": \"Corn\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"summer\", \"fall\"],\n    \"growDays\": 14,\n    \"regrowDays\": 4,\n    \"seedId\": \"487\",\n    \"seedName\": \"Corn Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 150\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 188\n      }\n    ],\n    \"seedSellPrice\": 75,\n    \"cropSellPrice\": 50,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A sweet and filling crop that grows in both summer and fall.\",\n    \"image\": \"images/crops/corn/crop.png\",\n    \"seedImage\": \"images/crops/corn/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/corn/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/corn/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/corn/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/corn/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/corn/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/corn/stage-6.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/corn/stage-7.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"farmingXP\": 10,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"262\",\n    \"name\": \"Wheat\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"summer\", \"fall\"],\n    \"growDays\": 4,\n    \"regrowDays\": null,\n    \"seedId\": \"483\",\n    \"seedName\": \"Wheat Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 10\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 13\n      }\n    ],\n    \"seedSellPrice\": 5,\n    \"cropSellPrice\": 25,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A common grain used to make flour. Harvest with a scythe.\",\n    \"image\": \"images/crops/wheat/crop.png\",\n    \"seedImage\": \"images/crops/wheat/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/wheat/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/wheat/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/wheat/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/wheat/stage-4.png\"\n      }\n    ],\n    \"farmingXP\": 6,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"421\",\n    \"name\": \"Sunflower\",\n    \"category\": \"flower\",\n    \"seasons\": [\"summer\", \"fall\"],\n    \"growDays\": 8,\n    \"regrowDays\": null,\n    \"seedId\": \"431\",\n    \"seedName\": \"Sunflower Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 200\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 250\n      }\n    ],\n    \"seedSellPrice\": 20,\n    \"cropSellPrice\": 80,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A giant, warming flower that also produces useful seeds.\",\n    \"image\": \"images/crops/sunflower/crop.png\",\n    \"seedImage\": \"images/crops/sunflower/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/sunflower/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/sunflower/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/sunflower/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/sunflower/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 45,\n      \"health\": 20\n    },\n    \"farmingXP\": 5,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": true,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"276\",\n    \"name\": \"Pumpkin\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 13,\n    \"regrowDays\": null,\n    \"seedId\": \"490\",\n    \"seedName\": \"Pumpkin Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 100\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 125\n      }\n    ],\n    \"seedSellPrice\": 50,\n    \"cropSellPrice\": 320,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": true,\n    \"description\": \"A fall favorite, grown for its flavor and its festive orange color.\",\n    \"image\": \"images/crops/pumpkin/crop.png\",\n    \"giantImage\": \"images/crops/pumpkin/giant.png\",\n    \"seedImage\": \"images/crops/pumpkin/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/pumpkin/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/pumpkin/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/pumpkin/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/pumpkin/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/pumpkin/stage-5.png\"\n      }\n    ],\n    \"farmingXP\": 31,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"272\",\n    \"name\": \"Eggplant\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 5,\n    \"regrowDays\": 5,\n    \"seedId\": \"488\",\n    \"seedName\": \"Eggplant Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 20\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 25\n      }\n    ],\n    \"seedSellPrice\": 10,\n    \"cropSellPrice\": 60,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A purple vegetable most often used in cooking.\",\n    \"image\": \"images/crops/eggplant/crop.png\",\n    \"seedImage\": \"images/crops/eggplant/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/eggplant/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/eggplant/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/eggplant/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/eggplant/stage-4.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/eggplant/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 20,\n      \"health\": 9\n    },\n    \"farmingXP\": 12,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"274\",\n    \"name\": \"Artichoke\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 8,\n    \"regrowDays\": null,\n    \"seedId\": \"489\",\n    \"seedName\": \"Artichoke Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 30\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 38\n      }\n    ],\n    \"seedSellPrice\": 15,\n    \"cropSellPrice\": 160,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A hearty crop that takes a while to grow, but the rewards are worth the wait.\",\n    \"image\": \"images/crops/artichoke/crop.png\",\n    \"seedImage\": \"images/crops/artichoke/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/artichoke/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/artichoke/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/artichoke/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/artichoke/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/artichoke/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 30,\n      \"health\": 13\n    },\n    \"farmingXP\": 22,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"300\",\n    \"name\": \"Amaranth\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 7,\n    \"regrowDays\": null,\n    \"seedId\": \"299\",\n    \"seedName\": \"Amaranth Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 70\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 88\n      }\n    ],\n    \"seedSellPrice\": 35,\n    \"cropSellPrice\": 150,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"This grain has been cultivated by humans for thousands of years.\",\n    \"image\": \"images/crops/amaranth/crop.png\",\n    \"seedImage\": \"images/crops/amaranth/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/amaranth/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/amaranth/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/amaranth/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/amaranth/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"farmingXP\": 21,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"398\",\n    \"name\": \"Grape\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 10,\n    \"regrowDays\": 3,\n    \"seedId\": \"301\",\n    \"seedName\": \"Grape Starter\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 60\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 75\n      }\n    ],\n    \"seedSellPrice\": 30,\n    \"cropSellPrice\": 80,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": true,\n    \"giant\": false,\n    \"description\": \"A sweet fruit that grows on a vine trellis in the fall.\",\n    \"image\": \"images/crops/grape/crop.png\",\n    \"seedImage\": \"images/crops/grape/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/grape/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/grape/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/grape/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/grape/stage-4.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/grape/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"farmingXP\": 14,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"282\",\n    \"name\": \"Cranberries\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 7,\n    \"regrowDays\": 5,\n    \"seedId\": \"493\",\n    \"seedName\": \"Cranberry Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 240\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 300\n      }\n    ],\n    \"seedSellPrice\": 120,\n    \"cropSellPrice\": 75,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 2,\n      \"max\": 2\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A sharp, tangy red berry often used in fall cooking. Each plant bears multiple fruits.\",\n    \"image\": \"images/crops/cranberries/crop.png\",\n    \"seedImage\": \"images/crops/cranberries/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/cranberries/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/cranberries/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/cranberries/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/cranberries/stage-4.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/cranberries/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"farmingXP\": 14,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"278\",\n    \"name\": \"Bok Choy\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 4,\n    \"regrowDays\": null,\n    \"seedId\": \"491\",\n    \"seedName\": \"Bok Choy Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 50\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 63\n      }\n    ],\n    \"seedSellPrice\": 25,\n    \"cropSellPrice\": 80,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A type of cabbage with a firm texture and a mild, sweet flavor.\",\n    \"image\": \"images/crops/bok-choy/crop.png\",\n    \"seedImage\": \"images/crops/bok-choy/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/bok-choy/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/bok-choy/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/bok-choy/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/bok-choy/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"farmingXP\": 14,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"280\",\n    \"name\": \"Yam\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 10,\n    \"regrowDays\": null,\n    \"seedId\": \"492\",\n    \"seedName\": \"Yam Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 60\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 75\n      }\n    ],\n    \"seedSellPrice\": 30,\n    \"cropSellPrice\": 160,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"It's a starchy yam. Looks like food...\",\n    \"image\": \"images/crops/yam/crop.png\",\n    \"seedImage\": \"images/crops/yam/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/yam/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/yam/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/yam/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/yam/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 45,\n      \"health\": 20\n    },\n    \"farmingXP\": 22,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"284\",\n    \"name\": \"Beet\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 6,\n    \"regrowDays\": null,\n    \"seedId\": \"494\",\n    \"seedName\": \"Beet Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Oasis\",\n        \"price\": 20\n      }\n    ],\n    \"seedSellPrice\": 10,\n    \"cropSellPrice\": 100,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A sweet root vegetable. Can be used at the mill to make sugar.\",\n    \"image\": \"images/crops/beet/crop.png\",\n    \"seedImage\": \"images/crops/beet/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/beet/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/beet/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/beet/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/beet/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 30,\n      \"health\": 13\n    },\n    \"farmingXP\": 16,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"417\",\n    \"name\": \"Sweet Gem Berry\",\n    \"category\": \"special\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 24,\n    \"regrowDays\": null,\n    \"seedId\": \"347\",\n    \"seedName\": \"Rare Seed\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Traveling Cart\",\n        \"price\": 1000\n      }\n    ],\n    \"seedSellPrice\": 200,\n    \"cropSellPrice\": 3000,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"The rarest of all gems in the known world. It's an extraordinary sweet fruit.\",\n    \"image\": \"images/crops/sweet-gem-berry/crop.png\",\n    \"seedImage\": \"images/crops/sweet-gem-berry/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/sweet-gem-berry/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/sweet-gem-berry/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/sweet-gem-berry/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/sweet-gem-berry/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/sweet-gem-berry/stage-5.png\"\n      }\n    ],\n    \"farmingXP\": 64,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"595\",\n    \"name\": \"Fairy Rose\",\n    \"category\": \"flower\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 12,\n    \"regrowDays\": null,\n    \"seedId\": \"425\",\n    \"seedName\": \"Fairy Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 200\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 250\n      }\n    ],\n    \"seedSellPrice\": 100,\n    \"cropSellPrice\": 290,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"An extremely rare flower with a powerful, sweet perfume.\",\n    \"image\": \"images/crops/fairy-rose/crop.png\",\n    \"seedImage\": \"images/crops/fairy-rose/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/fairy-rose/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/fairy-rose/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/fairy-rose/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/fairy-rose/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 45,\n      \"health\": 20\n    },\n    \"farmingXP\": 29,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": true,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"Broccoli\",\n    \"name\": \"Broccoli\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"fall\"],\n    \"growDays\": 8,\n    \"regrowDays\": 4,\n    \"seedId\": \"BroccoliSeeds\",\n    \"seedName\": \"Broccoli Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 80\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 100\n      }\n    ],\n    \"seedSellPrice\": 40,\n    \"cropSellPrice\": 70,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A dark green vegetable with many densely-packed florets.\",\n    \"image\": \"images/crops/broccoli/crop.png\",\n    \"seedImage\": \"images/crops/broccoli/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/broccoli/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/broccoli/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/broccoli/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/broccoli/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/broccoli/stage-5.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/broccoli/stage-6.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 63,\n      \"health\": 28\n    },\n    \"farmingXP\": 13,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"Powdermelon\",\n    \"name\": \"Powdermelon\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"winter\"],\n    \"growDays\": 7,\n    \"regrowDays\": null,\n    \"seedId\": \"PowdermelonSeeds\",\n    \"seedName\": \"Powdermelon Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 40\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 50\n      }\n    ],\n    \"seedSellPrice\": 20,\n    \"cropSellPrice\": 60,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": true,\n    \"description\": \"A mysterious pale melon that flourishes in winter.\",\n    \"image\": \"images/crops/powdermelon/crop.png\",\n    \"seedImage\": \"images/crops/powdermelon/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/powdermelon/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/powdermelon/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/powdermelon/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/powdermelon/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/powdermelon/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 63,\n      \"health\": 28\n    },\n    \"farmingXP\": 12,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    },\n    \"giantImage\": \"images/crops/powdermelon/giant.png\"\n  },\n  {\n    \"id\": \"454\",\n    \"name\": \"Ancient Fruit\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\"],\n    \"growDays\": 28,\n    \"regrowDays\": 7,\n    \"seedId\": \"499\",\n    \"seedName\": \"Ancient Seeds\",\n    \"seedBuyPrices\": [],\n    \"seedSellPrice\": 30,\n    \"cropSellPrice\": 550,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A very rare fruit that has survived since ancient times. It's extraordinarily sweet.\",\n    \"image\": \"images/crops/ancient-fruit/crop.png\",\n    \"seedImage\": \"images/crops/ancient-fruit/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/ancient-fruit/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/ancient-fruit/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/ancient-fruit/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/ancient-fruit/stage-4.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/ancient-fruit/stage-5.png\"\n      }\n    ],\n    \"farmingXP\": 38,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"90\",\n    \"name\": \"Cactus Fruit\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"growDays\": 12,\n    \"regrowDays\": 3,\n    \"seedId\": \"802\",\n    \"seedName\": \"Cactus Seeds\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Oasis\",\n        \"price\": 150\n      }\n    ],\n    \"seedSellPrice\": 0,\n    \"cropSellPrice\": 75,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"The sweet fruit of a cactus. Grows year-round indoors or on Ginger Island.\",\n    \"image\": \"images/crops/cactus-fruit/crop.png\",\n    \"seedImage\": \"images/crops/cactus-fruit/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/cactus-fruit/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/cactus-fruit/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/cactus-fruit/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/cactus-fruit/stage-4.png\"\n      },\n      {\n        \"name\": \"stage 5\",\n        \"image\": \"images/crops/cactus-fruit/stage-5.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/cactus-fruit/stage-6.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/cactus-fruit/stage-7.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"farmingXP\": 14,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"832\",\n    \"name\": \"Pineapple\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"summer\", \"ginger island\"],\n    \"growDays\": 14,\n    \"regrowDays\": 7,\n    \"seedId\": \"833\",\n    \"seedName\": \"Pineapple Seeds\",\n    \"seedBuyPrices\": [],\n    \"seedSellPrice\": 240,\n    \"cropSellPrice\": 300,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"A prickly, succulent fruit found in tropical climates.\",\n    \"image\": \"images/crops/pineapple/crop.png\",\n    \"seedImage\": \"images/crops/pineapple/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/pineapple/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/pineapple/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/pineapple/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/pineapple/stage-4.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/pineapple/stage-5.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 138,\n      \"health\": 62\n    },\n    \"farmingXP\": 30,\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"889\",\n    \"name\": \"Qi Fruit\",\n    \"category\": \"fruit\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"growDays\": 4,\n    \"regrowDays\": null,\n    \"seedId\": \"890\",\n    \"seedName\": \"Qi Bean\",\n    \"seedBuyPrices\": [],\n    \"seedSellPrice\": 1,\n    \"cropSellPrice\": 1,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": true,\n    \"description\": \"A fruit imbued with the essence of Qi. Used to complete Qi's special orders.\",\n    \"image\": \"images/crops/qi-fruit/crop.png\",\n    \"giantImage\": \"images/crops/qi-fruit/giant.png\",\n    \"seedImage\": \"images/crops/qi-fruit/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/qi-fruit/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/qi-fruit/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/qi-fruit/stage-3.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/qi-fruit/stage-4.png\"\n      }\n    ],\n    \"energyHealth\": {\n      \"energy\": 3,\n      \"health\": 1\n    },\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"815\",\n    \"name\": \"Tea Leaves\",\n    \"category\": \"vegetable\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\"],\n    \"growDays\": 20,\n    \"regrowDays\": 1,\n    \"seedId\": \"251\",\n    \"seedName\": \"Tea Sapling\",\n    \"seedBuyPrices\": [\n      {\n        \"place\": \"Traveling Cart\",\n        \"price\": 750\n      }\n    ],\n    \"seedSellPrice\": 250,\n    \"cropSellPrice\": 50,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"The young leaves of the tea plant. Can be brewed into the popular, energizing beverage.\",\n    \"image\": \"images/crops/tea-leaves/crop.png\",\n    \"seedImage\": \"images/crops/tea-leaves/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/tea-leaves/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/tea-leaves/stage-2.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/tea-leaves/harvest.png\"\n      },\n      {\n        \"name\": \"regrowth\",\n        \"image\": \"images/crops/tea-leaves/stage-3.png\"\n      }\n    ],\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    },\n    \"farmingXP\": 11\n  },\n  {\n    \"id\": \"771\",\n    \"name\": \"Fiber\",\n    \"category\": \"resource\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"growDays\": 7,\n    \"regrowDays\": null,\n    \"seedId\": \"885\",\n    \"seedName\": \"Fiber Seeds\",\n    \"seedBuyPrices\": [],\n    \"seedSellPrice\": 5,\n    \"cropSellPrice\": 1,\n    \"profession\": [\"tiller\"],\n    \"harvestQuantity\": {\n      \"min\": 4,\n      \"max\": 7\n    },\n    \"trellis\": false,\n    \"giant\": false,\n    \"description\": \"Plant these in any season. Does not require watering. Harvest with the scythe.\",\n    \"image\": \"images/crops/fiber/crop.png\",\n    \"seedImage\": \"images/crops/fiber/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/crops/fiber/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/crops/fiber/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/crops/fiber/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/crops/fiber/stage-4.png\"\n      },\n      {\n        \"name\": \"harvest\",\n        \"image\": \"images/crops/fiber/stage-5.png\"\n      }\n    ],\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/crops.json';\nimport { ArtisanUses, Crop, Season } from '@/types';\n\nconst cropData: Crop[] = data as Crop[];\n\n/** Query builder for crop data. All filter and sort methods return a new CropQuery for chaining. */\nexport class CropQuery extends QueryBase<Crop> {\n  constructor(data: Crop[] = cropData) {\n    super(data);\n  }\n\n  /** Filter to crops available in the given season. */\n  bySeason(season: Season): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.seasons.includes(season)));\n  }\n\n  /** Filter by category string (e.g. `'Vegetable'`, `'Fruit'`). */\n  byCategory(category: string): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.category === category));\n  }\n\n  /** Filter to crops whose seed is sold at the given shop (case-insensitive). */\n  byShop(shop: string): CropQuery {\n    return new CropQuery(\n      this.data.filter((c) =>\n        c.seedBuyPrices.some((p) => p.place.toLowerCase() === shop.toLowerCase()),\n      ),\n    );\n  }\n\n  /** Filter to crops that regrow after harvesting (have a `regrowDays` value). */\n  regrowing(): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.regrowDays !== null));\n  }\n\n  /** Filter to crops that can grow into giant crops. */\n  giant(): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.giant));\n  }\n\n  /** Filter to crops that require a trellis. */\n  trellis(): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.trellis));\n  }\n\n  /** Filter to crops available in more than one season. */\n  multiSeason(): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.seasons.length > 1));\n  }\n\n  /** Filter to crops with a variable harvest that can yield more than 1 item. */\n  extraHarvest(): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.harvestQuantity.max > 1));\n  }\n\n  /** Filter to crops whose seeds are purchasable somewhere. */\n  availableInShop(): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.seedBuyPrices.length > 0));\n  }\n\n  /** Filter to crops with energy/health values (edible when consumed). */\n  eatable(): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.energyHealth !== undefined));\n  }\n\n  /** Filter to crops that can be used to produce the given artisan good (e.g. `'wine'`, `'honey'`). */\n  byArtisanUse(use: keyof ArtisanUses): CropQuery {\n    return new CropQuery(this.data.filter((c) => c.artisanUses[use]));\n  }\n\n  /** Sort by crop sell price. Default: `'desc'` (most valuable first). */\n  sortBySellPrice(order: 'asc' | 'desc' = 'desc'): CropQuery {\n    return new CropQuery(\n      [...this.data].sort((a, b) =>\n        order === 'desc' ? b.cropSellPrice - a.cropSellPrice : a.cropSellPrice - b.cropSellPrice,\n      ),\n    );\n  }\n\n  /** Sort by grow days. Default: `'asc'` (fastest first). */\n  sortByGrowDays(order: 'asc' | 'desc' = 'asc'): CropQuery {\n    return new CropQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.growDays - b.growDays : b.growDays - a.growDays,\n      ),\n    );\n  }\n}\n\n/** Returns a CropQuery for all crop data. Pass `source` to wrap a pre-filtered array. */\nexport function crops(source: Crop[] = cropData): CropQuery {\n  return new CropQuery(source);\n}\n","[\n  {\n    \"id\": \"0\",\n    \"name\": \"Standard\",\n    \"description\": \"The most spacious farming layout with the largest contiguous tillable area. Ideal for crops and animals.\",\n    \"skills\": [\"Farming\"],\n    \"tillableTiles\": 3427,\n    \"features\": [\n      \"Largest contiguous tillable area of all farm types (63 x 31 tiles)\",\n      \"No special restrictions or bonuses\"\n    ],\n    \"startingItems\": [\"15 Parsnip Seeds\"],\n    \"image\": \"images/maps/full-image/Standard Farm Map.png\",\n    \"icon\": \"images/maps/icons/Standard Farm Map Icon.png\"\n  },\n  {\n    \"id\": \"1\",\n    \"name\": \"Riverland\",\n    \"description\": \"Water significantly decreases the overall farming area, but fishing is more rewarding.\",\n    \"skills\": [\"Fishing\"],\n    \"tillableTiles\": 1578,\n    \"features\": [\n      \"Random bubble fishing spots appear exclusively on this farm\",\n      \"70% town river fish, 30% forest fish\",\n      \"Smallest farming area due to water coverage\"\n    ],\n    \"startingItems\": [\"15 Parsnip Seeds\", \"Fish Smoker\"],\n    \"image\": \"images/maps/full-image/Riverland Farm Map.png\",\n    \"icon\": \"images/maps/icons/Riverland Farm Map Icon.png\"\n  },\n  {\n    \"id\": \"2\",\n    \"name\": \"Forest\",\n    \"description\": \"The border features trees and foliage resembling the Secret Woods, emphasizing resource gathering.\",\n    \"skills\": [\"Foraging\"],\n    \"tillableTiles\": 1413,\n    \"features\": [\n      \"16 renewable berry bushes along the southern border\",\n      \"8 renewable hardwood stumps in the western clearing\",\n      \"Seasonal forage items spawn on the farm\",\n      \"Woodskip can be caught in the farm pond\"\n    ],\n    \"startingItems\": [\"15 Parsnip Seeds\"],\n    \"image\": \"images/maps/full-image/Forest Farm Map.png\",\n    \"icon\": \"images/maps/icons/Forest Farm Map Icon.png\"\n  },\n  {\n    \"id\": \"3\",\n    \"name\": \"Hill-top\",\n    \"description\": \"Features a quarry for mining operations and resource extraction.\",\n    \"skills\": [\"Mining\"],\n    \"tillableTiles\": 1648,\n    \"features\": [\n      \"Southwest quarry spawns stones, ores, and geodes daily\",\n      \"Ore quality scales with mining level (copper, iron, gold, iridium)\",\n      \"Geode types progress with mining level\"\n    ],\n    \"startingItems\": [\"15 Parsnip Seeds\"],\n    \"image\": \"images/maps/full-image/Hilltop Farm Map.png\",\n    \"icon\": \"images/maps/icons/Hilltop Farm Map Icon.png\"\n  },\n  {\n    \"id\": \"4\",\n    \"name\": \"Wilderness\",\n    \"description\": \"Combat-focused farm where monsters spawn at night and scale with the player's combat level.\",\n    \"skills\": [\"Combat\"],\n    \"tillableTiles\": 2131,\n    \"features\": [\n      \"Monsters spawn at night and scale with combat level\",\n      \"Iridium Golems can spawn at Combat level 9+ and drop Iridium Ore\",\n      \"35% lake fish, 65% trash from the farm pond\"\n    ],\n    \"startingItems\": [\"15 Parsnip Seeds\"],\n    \"image\": \"images/maps/full-image/Wilderness Farm Map.png\",\n    \"icon\": \"images/maps/icons/Wilderness Farm Map Icon.png\"\n  },\n  {\n    \"id\": \"5\",\n    \"name\": \"Four Corners\",\n    \"description\": \"The farming area is split by cliffs into four distinct areas, each reminiscent of other farm types. Best suited for multiplayer.\",\n    \"skills\": [\"Multiplayer\"],\n    \"tillableTiles\": 2952,\n    \"features\": [\n      \"Top-left: forest area with renewable hardwood stump\",\n      \"Top-right: open standard farmland (largest quadrant)\",\n      \"Bottom-left: pond with 50% forest fish catch rate\",\n      \"Bottom-right: small quarry with mining nodes\"\n    ],\n    \"startingItems\": [\"15 Parsnip Seeds\"],\n    \"image\": \"images/maps/full-image/Four Corners Farm Map.png\",\n    \"icon\": \"images/maps/icons/Four Corners Farm Map Icon.png\"\n  },\n  {\n    \"id\": \"6\",\n    \"name\": \"Beach\",\n    \"description\": \"Offers foraging and fishing but limits farming due to sandy soil. Intended for seasoned players.\",\n    \"skills\": [\"Foraging\", \"Fishing\"],\n    \"tillableTiles\": 2700,\n    \"features\": [\n      \"Sprinklers do not work on sandy soil (only 202 tiles are sprinkler-compatible)\",\n      \"Supply crates occasionally wash ashore\",\n      \"Both forest and ocean forage items spawn\",\n      \"52.73% ocean fish, 15% seaweed, 5.1% shellfish from fishing\"\n    ],\n    \"startingItems\": [\"15 Parsnip Seeds\"],\n    \"image\": \"images/maps/full-image/Beach Farm Map.png\",\n    \"icon\": \"images/maps/icons/Beach Farm Map Icon.png\"\n  },\n  {\n    \"id\": \"MeadowlandsFarm\",\n    \"name\": \"Meadowlands\",\n    \"description\": \"An animal-focused farm with a pre-built coop, two chickens, and special blue grass that animals love.\",\n    \"skills\": [\"Farming\"],\n    \"tillableTiles\": 2066,\n    \"features\": [\n      \"Starts with a pre-built coop and two randomly-named chickens\",\n      \"Special blue grass that animals love grows naturally\",\n      \"40% forest pond fish, 60% trash from fishing\"\n    ],\n    \"startingItems\": [\"15 Hay\", \"Coop\", \"2 Chickens\"],\n    \"image\": \"images/maps/full-image/Meadowlands Farm Map.png\",\n    \"icon\": \"images/maps/icons/Meadowlands Farm Map Icon.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/maps.json';\nimport { FarmMap } from '@/types';\n\nconst mapData: FarmMap[] = data as FarmMap[];\n\n/** Query builder for farm map data. All filter methods return a new FarmMapQuery for chaining. */\nexport class FarmMapQuery extends QueryBase<FarmMap> {\n  constructor(data: FarmMap[] = mapData) {\n    super(data);\n  }\n\n  /** Filter to maps that grant a bonus to the given skill (case-insensitive). */\n  bySkill(skill: string): FarmMapQuery {\n    return new FarmMapQuery(\n      this.data.filter((m) => m.skills.some((s) => s.toLowerCase() === skill.toLowerCase())),\n    );\n  }\n}\n\n/** Returns a FarmMapQuery for all farm map data. Pass `source` to wrap a pre-filtered array. */\nexport function maps(source: FarmMap[] = mapData): FarmMapQuery {\n  return new FarmMapQuery(source);\n}\n","[\n  {\n    \"id\": \"684\",\n    \"name\": \"Bug Meat\",\n    \"sellPrice\": 8,\n    \"image\": \"images/monsters/monster-loot/Bug Meat.png\",\n    \"droppedBy\": [\"Bug\", \"Grub\", \"Fly\"]\n  },\n  {\n    \"id\": \"766\",\n    \"name\": \"Slime\",\n    \"sellPrice\": 5,\n    \"image\": \"images/monsters/monster-loot/Slime.png\",\n    \"droppedBy\": [\"Green Slime\", \"Big Slime\", \"Tiger Slime\"]\n  },\n  {\n    \"id\": \"767\",\n    \"name\": \"Bat Wing\",\n    \"sellPrice\": 15,\n    \"image\": \"images/monsters/monster-loot/Bat Wing.png\",\n    \"droppedBy\": [\"Bat\", \"Frost Bat\", \"Lava Bat\"]\n  },\n  {\n    \"id\": \"768\",\n    \"name\": \"Solar Essence\",\n    \"sellPrice\": 40,\n    \"image\": \"images/monsters/monster-loot/Solar Essence.png\",\n    \"droppedBy\": [\n      \"Ghost\",\n      \"Squid Kid\",\n      \"Metal Head\",\n      \"Hot Head\",\n      \"Mummy\",\n      \"Iridium Bat\",\n      \"Blue Squid\",\n      \"Haunted Skull\"\n    ]\n  },\n  {\n    \"id\": \"769\",\n    \"name\": \"Void Essence\",\n    \"sellPrice\": 50,\n    \"image\": \"images/monsters/monster-loot/Void Essence.png\",\n    \"droppedBy\": [\n      \"Shadow Brute\",\n      \"Shadow Shaman\",\n      \"Serpent\",\n      \"Royal Serpent\",\n      \"Spider\",\n      \"Shadow Sniper\",\n      \"Haunted Skull\"\n    ]\n  },\n  {\n    \"id\": \"852\",\n    \"name\": \"Dragon Tooth\",\n    \"sellPrice\": 500,\n    \"image\": \"images/monsters/monster-loot/Dragon Tooth.png\",\n    \"droppedBy\": [\"Lava Lurk\"]\n  }\n]\n","[\n  {\n    \"id\": \"Green Slime\",\n    \"name\": \"Green Slime\",\n    \"hp\": 24,\n    \"damage\": 5,\n    \"speed\": 0,\n    \"xp\": 3,\n    \"image\": \"images/monsters/Green Slime.png\",\n    \"locations\": [\"The Mines (Floors 1-29)\", \"The Farm\"],\n    \"lootIds\": [\"766\"],\n    \"dangerous\": false,\n    \"variants\": [\n      {\n        \"name\": \"Red Slime\",\n        \"hp\": 205,\n        \"damage\": 16,\n        \"speed\": 0,\n        \"xp\": 10,\n        \"image\": \"images/monsters/Red Slime.png\",\n        \"locations\": [\"The Mines (Floors 81-119)\", \"The Farm\"],\n        \"lootIds\": [\"766\"],\n        \"dangerous\": false\n      },\n      {\n        \"name\": \"Purple Slime\",\n        \"hp\": 410,\n        \"damage\": 16,\n        \"speed\": 2,\n        \"xp\": 10,\n        \"image\": \"images/monsters/Purple Slime.png\",\n        \"locations\": [\"Skull Cavern\", \"The Farm\"],\n        \"lootIds\": [\"766\"],\n        \"dangerous\": false\n      },\n      {\n        \"name\": \"Copper Slime\",\n        \"hp\": 102,\n        \"damage\": 16,\n        \"speed\": 4,\n        \"xp\": 10,\n        \"image\": \"images/monsters/Copper Slime.png\",\n        \"locations\": [\"Quarry Mine\"],\n        \"lootIds\": [\"766\"],\n        \"dangerous\": false\n      },\n      {\n        \"name\": \"Iron Slime\",\n        \"hp\": 205,\n        \"damage\": 16,\n        \"speed\": 1,\n        \"xp\": 10,\n        \"image\": \"images/monsters/Iron Slime.png\",\n        \"locations\": [\"Quarry Mine\"],\n        \"lootIds\": [\"766\"],\n        \"dangerous\": false\n      }\n    ]\n  },\n  {\n    \"id\": \"Frost Jelly\",\n    \"name\": \"Frost Jelly\",\n    \"hp\": 106,\n    \"damage\": 7,\n    \"speed\": 0,\n    \"xp\": 6,\n    \"image\": \"images/monsters/Blue Slime.png\",\n    \"locations\": [\"The Mines (Floors 41-79)\", \"The Farm\"],\n    \"lootIds\": [\"766\"],\n    \"dangerous\": false,\n    \"variants\": []\n  },\n  {\n    \"id\": \"Big Slime\",\n    \"name\": \"Big Slime\",\n    \"hp\": 60,\n    \"damage\": 5,\n    \"speed\": 0,\n    \"xp\": 7,\n    \"image\": \"images/monsters/Big Slime.png\",\n    \"locations\": [\"Skull Cavern\", \"The Mines\"],\n    \"lootIds\": [\"766\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Tiger Slime\",\n    \"name\": \"Tiger Slime\",\n    \"hp\": 415,\n    \"damage\": 23,\n    \"speed\": 0,\n    \"xp\": 20,\n    \"image\": \"images/monsters/Tiger Slime.png\",\n    \"locations\": [\"Volcano Dungeon\"],\n    \"lootIds\": [\"766\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Bat\",\n    \"name\": \"Bat\",\n    \"hp\": 24,\n    \"damage\": 6,\n    \"speed\": 0,\n    \"xp\": 3,\n    \"image\": \"images/monsters/Bat.png\",\n    \"locations\": [\"The Mines (Floors 31-39)\", \"The Farm\"],\n    \"lootIds\": [\"767\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Frost Bat\",\n    \"name\": \"Frost Bat\",\n    \"hp\": 36,\n    \"damage\": 7,\n    \"speed\": 0,\n    \"xp\": 7,\n    \"image\": \"images/monsters/Frost Bat.png\",\n    \"locations\": [\"The Mines (Floors 41-79)\", \"The Farm\"],\n    \"lootIds\": [\"767\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Lava Bat\",\n    \"name\": \"Lava Bat\",\n    \"hp\": 80,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Lava Bat.png\",\n    \"locations\": [\"The Mines (Floors 81-119)\", \"Skull Cavern\", \"The Farm\"],\n    \"lootIds\": [\"767\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Iridium Bat\",\n    \"name\": \"Iridium Bat\",\n    \"hp\": 300,\n    \"damage\": 30,\n    \"speed\": 0,\n    \"xp\": 22,\n    \"image\": \"images/monsters/Iridium Bat.png\",\n    \"locations\": [\"Skull Cavern\", \"The Farm\"],\n    \"lootIds\": [\"768\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Bug\",\n    \"name\": \"Bug\",\n    \"hp\": 1,\n    \"damage\": 8,\n    \"speed\": 0,\n    \"xp\": 1,\n    \"image\": \"images/monsters/Bug.png\",\n    \"locations\": [\"The Mines\"],\n    \"lootIds\": [\"684\"],\n    \"dangerous\": false,\n    \"variants\": [\n      {\n        \"name\": \"Armored Bug\",\n        \"hp\": 1,\n        \"damage\": 8,\n        \"speed\": 2,\n        \"xp\": 1,\n        \"image\": \"images/monsters/Armored Bug.png\",\n        \"locations\": [\"Skull Cavern\"],\n        \"lootIds\": [\"684\"],\n        \"dangerous\": false\n      }\n    ]\n  },\n  {\n    \"id\": \"Grub\",\n    \"name\": \"Grub\",\n    \"hp\": 20,\n    \"damage\": 4,\n    \"speed\": 0,\n    \"xp\": 2,\n    \"image\": \"images/monsters/Grub.png\",\n    \"locations\": [\"The Mines (Floors 1-29)\"],\n    \"lootIds\": [\"684\"],\n    \"dangerous\": false,\n    \"variants\": [\n      {\n        \"name\": \"Mutant Grub\",\n        \"hp\": 100,\n        \"damage\": 12,\n        \"speed\": 1,\n        \"xp\": 6,\n        \"image\": \"images/monsters/Mutant Grub.png\",\n        \"locations\": [\"Mutant Bug Lair\"],\n        \"lootIds\": [\"684\"],\n        \"dangerous\": false\n      }\n    ]\n  },\n  {\n    \"id\": \"Fly\",\n    \"name\": \"Cave Fly\",\n    \"hp\": 22,\n    \"damage\": 6,\n    \"speed\": 0,\n    \"xp\": 10,\n    \"image\": \"images/monsters/Cave Fly.png\",\n    \"locations\": [\"The Mines (Floors 1-29)\"],\n    \"lootIds\": [\"684\"],\n    \"dangerous\": false,\n    \"variants\": [\n      {\n        \"name\": \"Mutant Fly\",\n        \"hp\": 66,\n        \"damage\": 12,\n        \"speed\": 2,\n        \"xp\": 10,\n        \"image\": \"images/monsters/Mutant Fly.png\",\n        \"locations\": [\"Mutant Bug Lair\"],\n        \"lootIds\": [\"684\"],\n        \"dangerous\": false\n      }\n    ]\n  },\n  {\n    \"id\": \"Dust Spirit\",\n    \"name\": \"Dust Sprite\",\n    \"hp\": 40,\n    \"damage\": 6,\n    \"speed\": 0,\n    \"xp\": 2,\n    \"image\": \"images/monsters/Dust Sprite.png\",\n    \"locations\": [\"The Mines (Floors 41-79)\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Ghost\",\n    \"name\": \"Ghost\",\n    \"hp\": 96,\n    \"damage\": 10,\n    \"speed\": 3,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Ghost.png\",\n    \"locations\": [\"The Mines (Floors 41-79)\"],\n    \"lootIds\": [\"768\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Carbon Ghost\",\n    \"name\": \"Carbon Ghost\",\n    \"hp\": 190,\n    \"damage\": 25,\n    \"speed\": 3,\n    \"xp\": 20,\n    \"image\": \"images/monsters/Carbon Ghost.png\",\n    \"locations\": [\"Skull Cavern\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Putrid Ghost\",\n    \"name\": \"Putrid Ghost\",\n    \"hp\": 500,\n    \"damage\": 25,\n    \"speed\": 3,\n    \"xp\": 25,\n    \"image\": \"images/monsters/Putrid Ghost.png\",\n    \"locations\": [\"Dangerous Mines\", \"Dangerous Skull Cavern\"],\n    \"lootIds\": [],\n    \"dangerous\": true\n  },\n  {\n    \"id\": \"Haunted Skull\",\n    \"name\": \"Haunted Skull\",\n    \"hp\": 160,\n    \"damage\": 15,\n    \"speed\": 3,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Haunted Skull.png\",\n    \"locations\": [\"Quarry Mine\", \"The Mines\"],\n    \"lootIds\": [\"768\", \"769\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Shadow Brute\",\n    \"name\": \"Shadow Brute\",\n    \"hp\": 160,\n    \"damage\": 18,\n    \"speed\": 0,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Shadow Brute.png\",\n    \"locations\": [\"The Mines (Floors 81-119)\", \"The Farm\"],\n    \"lootIds\": [\"769\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Shadow Shaman\",\n    \"name\": \"Shadow Shaman\",\n    \"hp\": 80,\n    \"damage\": 17,\n    \"speed\": 0,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Shadow Shaman.png\",\n    \"locations\": [\"The Mines (Floors 81-119)\", \"The Farm\"],\n    \"lootIds\": [\"769\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Shadow Sniper\",\n    \"name\": \"Shadow Sniper\",\n    \"hp\": 300,\n    \"damage\": 18,\n    \"speed\": 0,\n    \"xp\": 20,\n    \"image\": \"images/monsters/Shadow Sniper.png\",\n    \"locations\": [\"Dangerous Mines\"],\n    \"lootIds\": [\"769\"],\n    \"dangerous\": true\n  },\n  {\n    \"id\": \"Skeleton\",\n    \"name\": \"Skeleton\",\n    \"hp\": 140,\n    \"damage\": 10,\n    \"speed\": 2,\n    \"xp\": 8,\n    \"image\": \"images/monsters/Skeleton.png\",\n    \"locations\": [\"The Mines (Floors 41-79)\", \"Skull Cavern\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Skeleton Mage\",\n    \"name\": \"Skeleton Mage\",\n    \"hp\": 60,\n    \"damage\": 5,\n    \"speed\": 2,\n    \"xp\": 8,\n    \"image\": \"images/monsters/Skeleton Mage.png\",\n    \"locations\": [\"Dangerous Mines\"],\n    \"lootIds\": [],\n    \"dangerous\": true\n  },\n  {\n    \"id\": \"Mummy\",\n    \"name\": \"Mummy\",\n    \"hp\": 260,\n    \"damage\": 30,\n    \"speed\": 3,\n    \"xp\": 20,\n    \"image\": \"images/monsters/Mummy.png\",\n    \"locations\": [\"Skull Cavern\"],\n    \"lootIds\": [\"768\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Stone Golem\",\n    \"name\": \"Stone Golem\",\n    \"hp\": 45,\n    \"damage\": 5,\n    \"speed\": 0,\n    \"xp\": 5,\n    \"image\": \"images/monsters/Stone Golem.png\",\n    \"locations\": [\"The Mines (Floors 31-39)\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Wilderness Golem\",\n    \"name\": \"Wilderness Golem\",\n    \"hp\": 30,\n    \"damage\": 5,\n    \"speed\": 0,\n    \"xp\": 5,\n    \"image\": \"images/monsters/Wilderness Golem.png\",\n    \"locations\": [\"The Farm\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Iridium Golem\",\n    \"name\": \"Iridium Golem\",\n    \"hp\": 30,\n    \"damage\": 5,\n    \"speed\": 0,\n    \"xp\": 5,\n    \"image\": \"images/monsters/Iridium Golem.png\",\n    \"locations\": [\"The Farm\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Duggy\",\n    \"name\": \"Duggy\",\n    \"hp\": 40,\n    \"damage\": 6,\n    \"speed\": 0,\n    \"xp\": 10,\n    \"image\": \"images/monsters/Duggy.png\",\n    \"locations\": [\"The Mines (Floors 1-29)\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Magma Duggy\",\n    \"name\": \"Magma Duggy\",\n    \"hp\": 380,\n    \"damage\": 16,\n    \"speed\": 0,\n    \"xp\": 18,\n    \"image\": \"images/monsters/Magma Duggy.png\",\n    \"locations\": [\"Volcano Dungeon\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Rock Crab\",\n    \"name\": \"Rock Crab\",\n    \"hp\": 30,\n    \"damage\": 5,\n    \"speed\": 0,\n    \"xp\": 4,\n    \"image\": \"images/monsters/Rock Crab.png\",\n    \"locations\": [\"The Mines (Floors 1-29)\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Lava Crab\",\n    \"name\": \"Lava Crab\",\n    \"hp\": 120,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 12,\n    \"image\": \"images/monsters/Lava Crab.png\",\n    \"locations\": [\"The Mines (Floors 81-119)\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Iridium Crab\",\n    \"name\": \"Iridium Crab\",\n    \"hp\": 240,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 20,\n    \"image\": \"images/monsters/Iridium Crab.png\",\n    \"locations\": [\"Skull Cavern\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Truffle Crab\",\n    \"name\": \"Truffle Crab\",\n    \"hp\": 30,\n    \"damage\": 5,\n    \"speed\": 0,\n    \"xp\": 4,\n    \"image\": \"images/monsters/Truffle Crab.png\",\n    \"locations\": [\"The Farm\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Squid Kid\",\n    \"name\": \"Squid Kid\",\n    \"hp\": 1,\n    \"damage\": 18,\n    \"speed\": 0,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Squid Kid.png\",\n    \"locations\": [\"The Mines (Floors 81-119)\"],\n    \"lootIds\": [\"768\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Blue Squid\",\n    \"name\": \"Blue Squid\",\n    \"hp\": 80,\n    \"damage\": 18,\n    \"speed\": 0,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Blue Squid.png\",\n    \"locations\": [\"Dangerous Mines\"],\n    \"lootIds\": [\"768\"],\n    \"dangerous\": true\n  },\n  {\n    \"id\": \"Metal Head\",\n    \"name\": \"Metal Head\",\n    \"hp\": 40,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 6,\n    \"image\": \"images/monsters/Metal Head.png\",\n    \"locations\": [\"The Mines (Floors 81-119)\"],\n    \"lootIds\": [\"768\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Serpent\",\n    \"name\": \"Serpent\",\n    \"hp\": 150,\n    \"damage\": 23,\n    \"speed\": 2,\n    \"xp\": 20,\n    \"image\": \"images/monsters/Serpent.png\",\n    \"locations\": [\"Skull Cavern\", \"The Farm\"],\n    \"lootIds\": [\"769\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Royal Serpent\",\n    \"name\": \"Royal Serpent\",\n    \"hp\": 150,\n    \"damage\": 23,\n    \"speed\": 2,\n    \"xp\": 20,\n    \"image\": \"images/monsters/Royal Serpent.png\",\n    \"locations\": [\"Dangerous Skull Cavern\"],\n    \"lootIds\": [\"769\"],\n    \"dangerous\": true\n  },\n  {\n    \"id\": \"Spider\",\n    \"name\": \"Spider\",\n    \"hp\": 200,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Spider.png\",\n    \"locations\": [\"Dangerous Mines\", \"Skull Cavern\"],\n    \"lootIds\": [\"769\"],\n    \"dangerous\": true\n  },\n  {\n    \"id\": \"Pepper Rex\",\n    \"name\": \"Pepper Rex\",\n    \"hp\": 300,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 7,\n    \"image\": \"images/monsters/Pepper Rex.png\",\n    \"locations\": [\"Skull Cavern\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Stick Bug\",\n    \"name\": \"Stick Bug\",\n    \"hp\": 700,\n    \"damage\": 20,\n    \"speed\": 3,\n    \"xp\": 4,\n    \"image\": \"images/monsters/Stick Bug.png\",\n    \"locations\": [\"Dangerous Mines\"],\n    \"lootIds\": [],\n    \"dangerous\": true\n  },\n  {\n    \"id\": \"Lava Lurk\",\n    \"name\": \"Lava Lurk\",\n    \"hp\": 220,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 12,\n    \"image\": \"images/monsters/Lava Lurk.png\",\n    \"locations\": [\"Volcano Dungeon\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Hot Head\",\n    \"name\": \"Hot Head\",\n    \"hp\": 250,\n    \"damage\": 18,\n    \"speed\": 0,\n    \"xp\": 16,\n    \"image\": \"images/monsters/Hot Head.png\",\n    \"locations\": [\"Volcano Dungeon\"],\n    \"lootIds\": [\"768\"],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Magma Sprite\",\n    \"name\": \"Magma Sprite\",\n    \"hp\": 220,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Magma Sprite.png\",\n    \"locations\": [\"Volcano Dungeon\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Magma Sparker\",\n    \"name\": \"Magma Sparker\",\n    \"hp\": 310,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 17,\n    \"image\": \"images/monsters/Magma Sparker.png\",\n    \"locations\": [\"Volcano Dungeon\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"False Magma Cap\",\n    \"name\": \"False Magma Cap\",\n    \"hp\": 290,\n    \"damage\": 15,\n    \"speed\": 0,\n    \"xp\": 14,\n    \"image\": \"images/monsters/False Magma Cap.png\",\n    \"locations\": [\"Volcano Dungeon\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Dwarvish Sentry\",\n    \"name\": \"Dwarvish Sentry\",\n    \"hp\": 300,\n    \"damage\": 18,\n    \"speed\": 0,\n    \"xp\": 15,\n    \"image\": \"images/monsters/Dwarvish Sentry.png\",\n    \"locations\": [\"Volcano Dungeon\"],\n    \"lootIds\": [],\n    \"dangerous\": false\n  },\n  {\n    \"id\": \"Prismatic Slime\",\n    \"name\": \"Prismatic Slime\",\n    \"hp\": 1000,\n    \"damage\": 35,\n    \"speed\": 2,\n    \"xp\": 10,\n    \"image\": \"images/monsters/Prismatic Slime.gif\",\n    \"locations\": [\"The Mines\", \"Quarry Mine\", \"Skull Cavern\"],\n    \"lootIds\": [\"766\", \"74\"],\n    \"dangerous\": false,\n    \"variants\": []\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport monsterLootData from '@/data/monster-loot.json';\nimport monsterData from '@/data/monsters.json';\nimport { Monster, MonsterLoot } from '@/types';\n\nconst monstersData: Monster[] = monsterData as Monster[];\nconst lootData: MonsterLoot[] = monsterLootData as MonsterLoot[];\n\n/** Query builder for monster data. All filter and sort methods return a new MonsterQuery for chaining. */\nexport class MonsterQuery extends QueryBase<Monster> {\n  constructor(data: Monster[] = monstersData) {\n    super(data);\n  }\n\n  /** Filter to monsters that spawn in the given location (case-insensitive substring match). */\n  byLocation(location: string): MonsterQuery {\n    const q = location.toLowerCase();\n    return new MonsterQuery(\n      this.data.filter((m) => m.locations.some((l) => l.toLowerCase().includes(q))),\n    );\n  }\n\n  /** Filter to monsters that drop the given loot item ID. */\n  dropsLoot(lootId: string): MonsterQuery {\n    return new MonsterQuery(this.data.filter((m) => m.lootIds.includes(lootId)));\n  }\n\n  /** Filter to Dangerous mode variants only. */\n  dangerous(): MonsterQuery {\n    return new MonsterQuery(this.data.filter((m) => m.dangerous));\n  }\n\n  /** Filter to standard (non-Dangerous) variants only. */\n  standard(): MonsterQuery {\n    return new MonsterQuery(this.data.filter((m) => !m.dangerous));\n  }\n\n  /** Sort by XP rewarded on kill. Default: `'desc'` (most XP first). */\n  sortByXp(order: 'asc' | 'desc' = 'desc'): MonsterQuery {\n    return new MonsterQuery(\n      [...this.data].sort((a, b) => (order === 'desc' ? b.xp - a.xp : a.xp - b.xp)),\n    );\n  }\n\n  /** Sort by max HP. Default: `'desc'` (tankiest first). */\n  sortByHp(order: 'asc' | 'desc' = 'desc'): MonsterQuery {\n    return new MonsterQuery(\n      [...this.data].sort((a, b) => (order === 'desc' ? b.hp - a.hp : a.hp - b.hp)),\n    );\n  }\n}\n\n/** Query builder for monster loot data. Filter methods return a new MonsterLootQuery for chaining. */\nexport class MonsterLootQuery extends QueryBase<MonsterLoot> {\n  constructor(data: MonsterLoot[] = lootData) {\n    super(data);\n  }\n\n  /** Filter to loot items dropped by the given monster ID. */\n  droppedBy(monsterId: string): MonsterLootQuery {\n    return new MonsterLootQuery(this.data.filter((l) => l.droppedBy.includes(monsterId)));\n  }\n}\n\n/** Returns a MonsterQuery for all monster data. Pass `source` to wrap a pre-filtered array. */\nexport function monsters(source: Monster[] = monstersData): MonsterQuery {\n  return new MonsterQuery(source);\n}\n\n/** Returns a MonsterLootQuery for all monster loot data. Pass `source` to wrap a pre-filtered array. */\nexport function monsterLoot(source: MonsterLoot[] = lootData): MonsterLootQuery {\n  return new MonsterLootQuery(source);\n}\n","[\n  {\n    \"id\": \"Slimes\",\n    \"name\": \"Slime\",\n    \"killTarget\": 1000,\n    \"monsters\": [\"Green Slime\", \"Frost Jelly\", \"Big Slime\", \"Tiger Slime\", \"Prismatic Slime\"],\n    \"reward\": {\n      \"name\": \"Slime Charmer Ring\",\n      \"itemId\": \"(O)520\",\n      \"image\": \"images/rings/Slime Charmer Ring.png\"\n    }\n  },\n  {\n    \"id\": \"Shadows\",\n    \"name\": \"Void Spirits\",\n    \"killTarget\": 150,\n    \"monsters\": [\"Shadow Shaman\", \"Shadow Brute\", \"Shadow Sniper\"],\n    \"reward\": {\n      \"name\": \"Savage Ring\",\n      \"itemId\": \"(O)523\",\n      \"image\": \"images/rings/Savage Ring.png\"\n    }\n  },\n  {\n    \"id\": \"Bats\",\n    \"name\": \"Bats\",\n    \"killTarget\": 200,\n    \"monsters\": [\"Bat\", \"Frost Bat\", \"Lava Bat\", \"Iridium Bat\"],\n    \"reward\": {\n      \"name\": \"Vampire Ring\",\n      \"itemId\": \"(O)522\",\n      \"image\": \"images/rings/Vampire Ring.png\"\n    }\n  },\n  {\n    \"id\": \"Skeletons\",\n    \"name\": \"Skeletons\",\n    \"killTarget\": 50,\n    \"monsters\": [\"Skeleton\", \"Skeleton Mage\"],\n    \"reward\": {\n      \"name\": \"Skeleton Mask\",\n      \"itemId\": \"(H)8\",\n      \"image\": \"images/hats/Skeleton Mask.png\"\n    }\n  },\n  {\n    \"id\": \"Insects\",\n    \"name\": \"Cave Insects\",\n    \"killTarget\": 80,\n    \"monsters\": [\"Grub\", \"Cave Fly\", \"Bug\"],\n    \"reward\": {\n      \"name\": \"Insect Head\",\n      \"itemId\": \"(W)13\",\n      \"image\": \"images/weapons/swords/Insect Head.png\"\n    }\n  },\n  {\n    \"id\": \"Duggy\",\n    \"name\": \"Duggies\",\n    \"killTarget\": 30,\n    \"monsters\": [\"Duggy\", \"Magma Duggy\"],\n    \"reward\": {\n      \"name\": \"Hard Hat\",\n      \"itemId\": \"(H)27\",\n      \"image\": \"images/hats/Hard Hat.png\"\n    }\n  },\n  {\n    \"id\": \"DustSpirits\",\n    \"name\": \"Dust Sprites\",\n    \"killTarget\": 500,\n    \"monsters\": [\"Dust Spirit\"],\n    \"reward\": {\n      \"name\": \"Burglar's Ring\",\n      \"itemId\": \"(O)526\",\n      \"image\": \"images/rings/Burglar's Ring.png\"\n    }\n  },\n  {\n    \"id\": \"Crabs\",\n    \"name\": \"Rock Crabs\",\n    \"killTarget\": 60,\n    \"monsters\": [\"Rock Crab\", \"Lava Crab\", \"Iridium Crab\"],\n    \"reward\": {\n      \"name\": \"Crabshell Ring\",\n      \"itemId\": \"(O)810\",\n      \"image\": \"images/rings/Crabshell Ring.png\"\n    }\n  },\n  {\n    \"id\": \"Mummies\",\n    \"name\": \"Mummies\",\n    \"killTarget\": 100,\n    \"monsters\": [\"Mummy\"],\n    \"reward\": {\n      \"name\": \"Arcane Hat\",\n      \"itemId\": \"(H)60\",\n      \"image\": \"images/hats/Arcane Hat.png\"\n    }\n  },\n  {\n    \"id\": \"Dinos\",\n    \"name\": \"Pepper Rex\",\n    \"killTarget\": 50,\n    \"monsters\": [\"Pepper Rex\"],\n    \"reward\": {\n      \"name\": \"Knight's Helmet\",\n      \"itemId\": \"(H)50\",\n      \"image\": \"images/hats/Knight's Helmet.png\"\n    }\n  },\n  {\n    \"id\": \"Serpents\",\n    \"name\": \"Serpents\",\n    \"killTarget\": 250,\n    \"monsters\": [\"Serpent\", \"Royal Serpent\"],\n    \"reward\": {\n      \"name\": \"Napalm Ring\",\n      \"itemId\": \"(O)811\",\n      \"image\": \"images/rings/Napalm Ring.png\"\n    }\n  },\n  {\n    \"id\": \"FlameSpirits\",\n    \"name\": \"Magma Sprites\",\n    \"killTarget\": 150,\n    \"monsters\": [\"Magma Sprite\", \"Magma Sparker\"],\n    \"reward\": {\n      \"name\": \"Marlon's Phone Number\",\n      \"itemId\": null,\n      \"image\": null\n    }\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport goalData from '@/data/monster-slayer-goals.json';\nimport { MonsterSlayerGoal } from '@/types';\n\nconst monsterSlayerGoalData: MonsterSlayerGoal[] = goalData as MonsterSlayerGoal[];\n\n/** Query builder for monster slayer goal data. All filter and sort methods return a new MonsterSlayerGoalQuery for chaining. */\nexport class MonsterSlayerGoalQuery extends QueryBase<MonsterSlayerGoal> {\n  constructor(data: MonsterSlayerGoal[] = monsterSlayerGoalData) {\n    super(data);\n  }\n\n  /** Sort by kill target. Default: `'asc'` (easiest first). */\n  sortByKillTarget(order: 'asc' | 'desc' = 'asc'): MonsterSlayerGoalQuery {\n    return new MonsterSlayerGoalQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.killTarget - b.killTarget : b.killTarget - a.killTarget,\n      ),\n    );\n  }\n}\n\n/** Returns a MonsterSlayerGoalQuery for all monster slayer goal data. Pass `source` to wrap a pre-filtered array. */\nexport function monsterSlayerGoals(\n  source: MonsterSlayerGoal[] = monsterSlayerGoalData,\n): MonsterSlayerGoalQuery {\n  return new MonsterSlayerGoalQuery(source);\n}\n","[\n  {\n    \"id\": \"96\",\n    \"name\": \"Dwarf Scroll I\",\n    \"description\": \"A yellowed scroll of parchment filled with dwarven script. This one's tied with a red bow.\",\n    \"sellPrice\": 1,\n    \"locations\": [\"Tilling in Mines/Skull Cavern (any floor)\", \"Several monsters (0.5% each)\"],\n    \"donationNotes\": \"One of four scrolls; donating all four unlocks Dwarvish Translation Guide\",\n    \"image\": \"images/artifacts/Dwarf Scroll I.png\"\n  },\n  {\n    \"id\": \"97\",\n    \"name\": \"Dwarf Scroll II\",\n    \"description\": \"A yellowed scroll of parchment filled with dwarven script. This one's tied with a green ribbon.\",\n    \"sellPrice\": 1,\n    \"locations\": [\n      \"Tilling in Mines (floor 1-39)\",\n      \"Ghost, Frost Bat, Dust Sprite, Blue Slime drop (0.5%)\"\n    ],\n    \"donationNotes\": \"One of four scrolls; donating all four unlocks Dwarvish Translation Guide\",\n    \"image\": \"images/artifacts/Dwarf Scroll II.png\"\n  },\n  {\n    \"id\": \"98\",\n    \"name\": \"Dwarf Scroll III\",\n    \"description\": \"A yellowed scroll of parchment filled with dwarven script. This one's tied with a blue rope.\",\n    \"sellPrice\": 1,\n    \"locations\": [\"Several monsters (0.5-1.5%)\"],\n    \"donationNotes\": \"One of four scrolls; donating all four unlocks Dwarvish Translation Guide\",\n    \"image\": \"images/artifacts/Dwarf Scroll III.png\"\n  },\n  {\n    \"id\": \"99\",\n    \"name\": \"Dwarf Scroll IV\",\n    \"description\": \"A yellowed scroll of parchment filled with dwarven script. This one's tied with a golden chain.\",\n    \"sellPrice\": 1,\n    \"locations\": [\"Most monsters (0.1%)\", \"Tilling in Mines (floor 80+) (0.2%)\"],\n    \"donationNotes\": \"One of four scrolls; donating all four unlocks Dwarvish Translation Guide\",\n    \"image\": \"images/artifacts/Dwarf Scroll IV.png\"\n  },\n  {\n    \"id\": \"100\",\n    \"name\": \"Chipped Amphora\",\n    \"description\": \"An ancient vessel made of ceramic material. Used to transport both dry and wet goods.\",\n    \"sellPrice\": 40,\n    \"locations\": [\"Town (3%)\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Chipped Amphora.png\"\n  },\n  {\n    \"id\": \"101\",\n    \"name\": \"Arrowhead\",\n    \"description\": \"A crudely fashioned point used for hunting.\",\n    \"sellPrice\": 40,\n    \"locations\": [\"Mountain (1.6%)\", \"Forest (1.6%)\", \"Bus Stop (1.6%)\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Arrowhead.png\"\n  },\n  {\n    \"id\": \"103\",\n    \"name\": \"Ancient Doll\",\n    \"description\": \"An ancient doll covered in grime. This doll may have been used as a toy, a decoration, or a prop in some kind of ritual.\",\n    \"sellPrice\": 60,\n    \"locations\": [\n      \"Mountain (3%)\",\n      \"Forest (2.4%)\",\n      \"Bus Stop (2.4%)\",\n      \"Town (0.8%)\",\n      \"Fishing Treasure Chest\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Ancient Doll.png\"\n  },\n  {\n    \"id\": \"104\",\n    \"name\": \"Elvish Jewelry\",\n    \"description\": \"Dirty but still beautiful. On the side is a flowing script thought by some to be the ancient language of the elves.\",\n    \"sellPrice\": 200,\n    \"locations\": [\"Forest (0.8%)\", \"Fishing Treasure Chest\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Elvish Jewelry.png\"\n  },\n  {\n    \"id\": \"105\",\n    \"name\": \"Chewing Stick\",\n    \"description\": \"Ancient people chewed on these to keep their teeth clean.\",\n    \"sellPrice\": 50,\n    \"locations\": [\n      \"Mountain (1.5%)\",\n      \"Forest (1.5%)\",\n      \"Town (0.8%)\",\n      \"Fishing Treasure Chest\",\n      \"Duggy drop (2%)\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Chewing Stick.png\"\n  },\n  {\n    \"id\": \"106\",\n    \"name\": \"Ornamental Fan\",\n    \"description\": \"This exquisite fan most likely belonged to a noblewoman. Historians believe that the valley was a popular sixth-era vacation spot for the wealthy.\",\n    \"sellPrice\": 300,\n    \"locations\": [\n      \"Beach (1.6%)\",\n      \"Forest (0.7%)\",\n      \"Town (0.6%)\",\n      \"Fishing Treasure Chest\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Ornamental Fan.png\"\n  },\n  {\n    \"id\": \"107\",\n    \"name\": \"Dinosaur Egg\",\n    \"description\": \"A giant dino egg... The entire shell is still intact!\",\n    \"sellPrice\": 350,\n    \"locations\": [\n      \"Mountain (0.6%)\",\n      \"Fishing Treasure Chest\",\n      \"Prehistoric floors in Skull Cavern\",\n      \"Pepper Rex drop (10%)\"\n    ],\n    \"donationNotes\": \"Can be hatched in an Incubator to obtain a Dinosaur\",\n    \"image\": \"images/animals/produce/Dinosaur Egg.png\"\n  },\n  {\n    \"id\": \"108\",\n    \"name\": \"Rare Disc\",\n    \"description\": \"A heavy black disc studded with peculiar red stones. When you hold it, you're overwhelmed with a feeling of dread.\",\n    \"sellPrice\": 300,\n    \"locations\": [\n      \"Fishing Treasure Chest\",\n      \"Most Bats (0.1%)\",\n      \"Shadow Brute, Shadow Shaman, Spider drop (0.3%)\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Rare Disc.png\"\n  },\n  {\n    \"id\": \"109\",\n    \"name\": \"Ancient Sword\",\n    \"description\": \"It's the remains of an ancient sword. Most of the blade has turned to rust, but the hilt is very finely crafted.\",\n    \"sellPrice\": 100,\n    \"locations\": [\n      \"Forest (0.7%)\",\n      \"Mountain (0.6%)\",\n      \"Fishing Treasure Chest\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Ancient Sword.png\"\n  },\n  {\n    \"id\": \"110\",\n    \"name\": \"Rusty Spoon\",\n    \"description\": \"A plain old spoon, probably ten years old. Not very interesting.\",\n    \"sellPrice\": 25,\n    \"locations\": [\n      \"Town (4-11%)\",\n      \"Fishing Treasure Chest\",\n      \"Tilling in Mines/Skull Cavern\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Rusty Spoon.png\"\n  },\n  {\n    \"id\": \"111\",\n    \"name\": \"Rusty Spur\",\n    \"description\": \"An old spur that was once attached to a cowboy's boot. People must have been raising animals in this area for many generations.\",\n    \"sellPrice\": 25,\n    \"locations\": [\"Farm (10%)\", \"Fishing Treasure Chest\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Rusty Spur.png\"\n  },\n  {\n    \"id\": \"112\",\n    \"name\": \"Rusty Cog\",\n    \"description\": \"A well preserved cog that must have been part of some ancient machine. This could be dwarven technology.\",\n    \"sellPrice\": 25,\n    \"locations\": [\n      \"Mountain (4%)\",\n      \"Tilling in Mines/Skull Cavern\",\n      \"Fishing Treasure Chest\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Rusty Cog.png\"\n  },\n  {\n    \"id\": \"113\",\n    \"name\": \"Chicken Statue\",\n    \"description\": \"It's a statue of a chicken on a bronze base. The ancient people of this area must have been very fond of chickens.\",\n    \"sellPrice\": 50,\n    \"locations\": [\"Farm (9%)\", \"Fishing Treasure Chest\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Chicken Statue.png\"\n  },\n  {\n    \"id\": \"114\",\n    \"name\": \"Ancient Seed\",\n    \"description\": \"It's a dry old seed from some ancient plant. By all appearances it's long since dead...\",\n    \"sellPrice\": 5,\n    \"locations\": [\n      \"Forest (0.7%)\",\n      \"Mountain (0.7%)\",\n      \"Fishing Treasure Chest\",\n      \"Bug, Cave Fly, Grub drop (0.5%)\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": \"Donating grants Ancient Seed crafting recipe and 1 Ancient Seeds pack\",\n    \"image\": \"images/artifacts/Ancient Seed.png\"\n  },\n  {\n    \"id\": \"115\",\n    \"name\": \"Prehistoric Tool\",\n    \"description\": \"Some kind of gnarly old digging tool.\",\n    \"sellPrice\": 50,\n    \"locations\": [\n      \"Bus Stop (3%)\",\n      \"Forest (2.1%)\",\n      \"Mountain (2%)\",\n      \"Fishing Treasure Chest\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Prehistoric Tool.png\"\n  },\n  {\n    \"id\": \"116\",\n    \"name\": \"Dried Starfish\",\n    \"description\": \"A starfish from the primordial ocean. It's an unusually pristine specimen!\",\n    \"sellPrice\": 40,\n    \"locations\": [\"Beach (8%)\", \"Fishing Treasure Chest\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Dried Starfish.png\"\n  },\n  {\n    \"id\": \"117\",\n    \"name\": \"Anchor\",\n    \"description\": \"It may have belonged to ancient pirates.\",\n    \"sellPrice\": 100,\n    \"locations\": [\"Beach (4%)\", \"Fishing Treasure Chest\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Anchor.png\"\n  },\n  {\n    \"id\": \"118\",\n    \"name\": \"Glass Shards\",\n    \"description\": \"A mixture of glass shards smoothed by centuries of ocean surf. These could have belonged to an ancient mosaic or necklace.\",\n    \"sellPrice\": 20,\n    \"locations\": [\"Beach (7%)\", \"Fishing Treasure Chest\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Glass Shards.png\"\n  },\n  {\n    \"id\": \"119\",\n    \"name\": \"Bone Flute\",\n    \"description\": \"It's a prehistoric wind instrument carved from an animal's bone. It produces an eerie tone.\",\n    \"sellPrice\": 100,\n    \"locations\": [\n      \"Forest (0.7%)\",\n      \"Mountain (0.7%)\",\n      \"Town (0.4%)\",\n      \"Fishing Treasure Chest\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": \"Donating grants a Flute Block\",\n    \"image\": \"images/artifacts/Bone Flute.png\"\n  },\n  {\n    \"id\": \"120\",\n    \"name\": \"Prehistoric Handaxe\",\n    \"description\": \"One of the earliest tools employed by humans. This \\\"crude\\\" tool was created by striking one rock with another to form a sharp edge.\",\n    \"sellPrice\": 50,\n    \"locations\": [\"Bus Stop (4%)\", \"Mountain (3%)\", \"Forest (3%)\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Prehistoric Handaxe.png\"\n  },\n  {\n    \"id\": \"121\",\n    \"name\": \"Dwarvish Helm\",\n    \"description\": \"It's one of the helmets commonly worn by dwarves. The thick metal plating protects them from falling debris and stalactites.\",\n    \"sellPrice\": 100,\n    \"locations\": [\n      \"Tilling in Mines (floor 1-39) (0.1%)\",\n      \"Geode (3%)\",\n      \"Omni Geode (1%)\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Dwarvish Helm.png\"\n  },\n  {\n    \"id\": \"122\",\n    \"name\": \"Dwarf Gadget\",\n    \"description\": \"It's a piece of the advanced technology once known to the dwarves. It's still glowing and humming, but you're unable to understand how it works.\",\n    \"sellPrice\": 200,\n    \"locations\": [\n      \"Tilling in Mines (floor 40-79) (0.1%)\",\n      \"Magma Geode (4%)\",\n      \"Omni Geode (1%)\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Dwarf Gadget.png\"\n  },\n  {\n    \"id\": \"123\",\n    \"name\": \"Ancient Drum\",\n    \"description\": \"It's a drum made from wood and animal skin. It has a low, reverberating tone.\",\n    \"sellPrice\": 100,\n    \"locations\": [\n      \"Bus Stop (0.7%)\",\n      \"Forest (0.7%)\",\n      \"Town (0.4%)\",\n      \"Frozen Geode (3%)\",\n      \"Omni Geode (1%)\",\n      \"Artifact Trove (3.6%)\"\n    ],\n    \"donationNotes\": \"Donating grants a Drum Block\",\n    \"image\": \"images/artifacts/Ancient Drum.png\"\n  },\n  {\n    \"id\": \"124\",\n    \"name\": \"Golden Mask\",\n    \"description\": \"A creepy golden mask probably used in an ancient magic ritual. A socket in the forehead contains a large purple gemstone.\",\n    \"sellPrice\": 500,\n    \"locations\": [\"Desert (3%)\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Golden Mask.png\"\n  },\n  {\n    \"id\": \"125\",\n    \"name\": \"Golden Relic\",\n    \"description\": \"It's a golden slab with hieroglyphs and pictures emblazoned onto the front.\",\n    \"sellPrice\": 250,\n    \"locations\": [\"Desert (6%)\", \"Artifact Trove (3.6%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Golden Relic.png\"\n  },\n  {\n    \"id\": \"126\",\n    \"name\": \"Strange Doll (green)\",\n    \"description\": \"???\",\n    \"sellPrice\": 1000,\n    \"locations\": [\"Various dig spots (very rare)\", \"Fishing Treasure Chest\", \"Secret Note #17\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Strange Doll (green).png\"\n  },\n  {\n    \"id\": \"127\",\n    \"name\": \"Strange Doll (yellow)\",\n    \"description\": \"???\",\n    \"sellPrice\": 1000,\n    \"locations\": [\"Various dig spots (very rare)\", \"Fishing Treasure Chest\", \"Secret Note #18\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Strange Doll (yellow).png\"\n  },\n  {\n    \"id\": \"579\",\n    \"name\": \"Prehistoric Scapula\",\n    \"description\": \"Commonly known as a \\\"shoulder blade\\\"... It's unclear what species it belonged to.\",\n    \"sellPrice\": 100,\n    \"locations\": [\"Forest (3-6%)\", \"Town (0.7%)\", \"Skeleton drop (0.5%)\", \"Bone Nodes (0.8%)\"],\n    \"donationNotes\": \"Part of the Sloth Skeleton display in the museum\",\n    \"image\": \"images/artifacts/Prehistoric Scapula.png\"\n  },\n  {\n    \"id\": \"580\",\n    \"name\": \"Prehistoric Tibia\",\n    \"description\": \"A thick and sturdy leg bone.\",\n    \"sellPrice\": 100,\n    \"locations\": [\"Railroad (4-8%)\", \"Forest (0.6%)\", \"Pepper Rex drop (30%)\", \"Bone Nodes (0.8%)\"],\n    \"donationNotes\": \"Part of the Sloth Skeleton display in the museum\",\n    \"image\": \"images/artifacts/Prehistoric Tibia.png\"\n  },\n  {\n    \"id\": \"581\",\n    \"name\": \"Prehistoric Skull\",\n    \"description\": \"This is definitely a mammalian skull.\",\n    \"sellPrice\": 100,\n    \"locations\": [\"Mountain (0.6-6%)\", \"Haunted Skull drop (1.3%)\", \"Bone Nodes (0.8%)\"],\n    \"donationNotes\": \"Part of the Sloth Skeleton display in the museum\",\n    \"image\": \"images/artifacts/Prehistoric Skull.png\"\n  },\n  {\n    \"id\": \"582\",\n    \"name\": \"Skeletal Hand\",\n    \"description\": \"It's a wonder all these ancient little pieces lasted so long.\",\n    \"sellPrice\": 100,\n    \"locations\": [\n      \"Backwoods (4-8%)\",\n      \"Beach (0.6%)\",\n      \"Haunted Skull drop (1.3%)\",\n      \"Bone Nodes (0.8%)\"\n    ],\n    \"donationNotes\": \"Part of the Sloth Skeleton display in the museum\",\n    \"image\": \"images/artifacts/Skeletal Hand.png\"\n  },\n  {\n    \"id\": \"583\",\n    \"name\": \"Prehistoric Rib\",\n    \"description\": \"Little gouge marks on the side suggest that this rib was someone's dinner.\",\n    \"sellPrice\": 100,\n    \"locations\": [\"Town (2-4%)\", \"Farm (0.8%)\", \"Pepper Rex drop (30%)\", \"Bone Nodes (0.8%)\"],\n    \"donationNotes\": \"Part of the Sloth Skeleton display in the museum\",\n    \"image\": \"images/artifacts/Prehistoric Rib.png\"\n  },\n  {\n    \"id\": \"584\",\n    \"name\": \"Prehistoric Vertebra\",\n    \"description\": \"A segment of some prehistoric creature's spine.\",\n    \"sellPrice\": 100,\n    \"locations\": [\"Bus Stop (0.7-5%)\", \"Pepper Rex drop (30%)\", \"Bone Nodes (0.8%)\"],\n    \"donationNotes\": \"Part of the Sloth Skeleton display in the museum\",\n    \"image\": \"images/artifacts/Prehistoric Vertebra.png\"\n  },\n  {\n    \"id\": \"585\",\n    \"name\": \"Skeletal Tail\",\n    \"description\": \"It's pretty short for a tail.\",\n    \"sellPrice\": 100,\n    \"locations\": [\n      \"Tilling in Mines/Skull Cavern\",\n      \"Fishing Treasure Chest (3.1-3.4%)\",\n      \"Bone Nodes (0.8%)\"\n    ],\n    \"donationNotes\": \"Part of the Sloth Skeleton display in the museum\",\n    \"image\": \"images/artifacts/Skeletal Tail.png\"\n  },\n  {\n    \"id\": \"586\",\n    \"name\": \"Nautilus Fossil\",\n    \"description\": \"This must've washed up ages ago from an ancient coral reef.\",\n    \"sellPrice\": 80,\n    \"locations\": [\"Beach (1.8%)\", \"Fishing Treasure Chest (3.1-3.4%)\", \"Bone Nodes (0.8%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Nautilus Fossil.png\"\n  },\n  {\n    \"id\": \"587\",\n    \"name\": \"Amphibian Fossil\",\n    \"description\": \"The relatively short hind legs suggest some kind of primordial toad.\",\n    \"sellPrice\": 150,\n    \"locations\": [\n      \"Forest (0.6%)\",\n      \"Mountain (0.6%)\",\n      \"Fishing Treasure Chest (3.1-3.4%)\",\n      \"Bone Nodes (0.8%)\"\n    ],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Amphibian Fossil.png\"\n  },\n  {\n    \"id\": \"588\",\n    \"name\": \"Palm Fossil\",\n    \"description\": \"Palm Fossils are relatively common, but this happens to be a particularly well-preserved specimen.\",\n    \"sellPrice\": 100,\n    \"locations\": [\"Desert (7%)\", \"Forest (0.6-5%)\", \"Beach (0.6%)\", \"Bone Nodes (0.8%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Palm Fossil.png\"\n  },\n  {\n    \"id\": \"589\",\n    \"name\": \"Trilobite\",\n    \"description\": \"A long extinct relative of the crab.\",\n    \"sellPrice\": 50,\n    \"locations\": [\"Beach (1.7-5%)\", \"Forest (1.9%)\", \"Mountain (1.8%)\", \"Bone Nodes (0.8%)\"],\n    \"donationNotes\": null,\n    \"image\": \"images/artifacts/Trilobite.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport artifactData from '@/data/artifacts.json';\nimport { Artifact } from '@/types';\n\nconst allArtifactData: Artifact[] = artifactData as Artifact[];\n\n/** Query builder for artifact data. All filter and sort methods return a new ArtifactQuery for chaining. */\nexport class ArtifactQuery extends QueryBase<Artifact> {\n  constructor(data: Artifact[] = allArtifactData) {\n    super(data);\n  }\n\n  /** Filter to artifacts with donation notes (most artifacts can be donated; these have additional reward notes). */\n  withDonationNotes(): ArtifactQuery {\n    return new ArtifactQuery(this.data.filter((a) => a.donationNotes !== null));\n  }\n\n  /** Filter to artifacts found via fishing treasure chests. */\n  fromFishing(): ArtifactQuery {\n    return new ArtifactQuery(\n      this.data.filter((a) => a.locations.some((l) => l.toLowerCase().includes('fishing'))),\n    );\n  }\n\n  /** Sort alphabetically by name. Default: 'asc'. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): ArtifactQuery {\n    return new ArtifactQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /** Sort by sell price. Default: 'desc' (highest first). */\n  sortBySellPrice(order: 'asc' | 'desc' = 'desc'): ArtifactQuery {\n    return new ArtifactQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.sellPrice - b.sellPrice : b.sellPrice - a.sellPrice,\n      ),\n    );\n  }\n}\n\n/** Returns an ArtifactQuery for all artifact data. Pass `source` to wrap a pre-filtered array. */\nexport function artifacts(source: Artifact[] = allArtifactData): ArtifactQuery {\n  return new ArtifactQuery(source);\n}\n","[\n  {\n    \"id\": \"685\",\n    \"name\": \"Bait\",\n    \"description\": \"Causes fish to bite faster. Must first be attached to a fishing rod.\",\n    \"sellPrice\": 1,\n    \"image\": \"images/fish/bait/Bait.png\"\n  },\n  {\n    \"id\": \"ChallengeBait\",\n    \"name\": \"Challenge Bait\",\n    \"description\": \"A 'perfect' catch yields triple the fish. Each escape reduces the catch.\",\n    \"sellPrice\": 1,\n    \"image\": \"images/fish/bait/Challenge Bait.png\"\n  },\n  {\n    \"id\": \"DeluxeBait\",\n    \"name\": \"Deluxe Bait\",\n    \"description\": \"Causes fish to bite even faster and increases the size of the fishing bar.\",\n    \"sellPrice\": 1,\n    \"image\": \"images/fish/bait/Deluxe Bait.png\"\n  },\n  {\n    \"id\": \"908\",\n    \"name\": \"Magic Bait\",\n    \"description\": \"Allows you to catch fish from any season, time, or weather, from whichever type of water you cast into.\",\n    \"sellPrice\": 1,\n    \"image\": \"images/fish/bait/Magic Bait.png\"\n  },\n  {\n    \"id\": \"703\",\n    \"name\": \"Magnet\",\n    \"description\": \"Increases the chance of finding treasure while fishing.\",\n    \"sellPrice\": 15,\n    \"image\": \"images/fish/bait/Magnet.png\"\n  },\n  {\n    \"id\": \"SpecificBait\",\n    \"name\": \"Specific Bait\",\n    \"description\": \"Increases your chances of catching a specific fish.\",\n    \"sellPrice\": 5,\n    \"image\": \"images/fish/bait/Pink Bait.png\"\n  },\n  {\n    \"id\": \"774\",\n    \"name\": \"Wild Bait\",\n    \"description\": \"A unique recipe from Linus that gives you a chance to catch two fish at once.\",\n    \"sellPrice\": 15,\n    \"image\": \"images/fish/bait/Wild Bait.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/bait.json';\nimport { Bait } from '@/types';\n\nconst baitData: Bait[] = data as Bait[];\n\n/** Query builder for fishing bait data. All sort methods return a new BaitQuery for chaining. */\nexport class BaitQuery extends QueryBase<Bait> {\n  constructor(data: Bait[] = baitData) {\n    super(data);\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): BaitQuery {\n    return new BaitQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /** Sort by sell price. Default: `'desc'` (most valuable first). */\n  sortBySellPrice(order: 'asc' | 'desc' = 'desc'): BaitQuery {\n    return new BaitQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.sellPrice - b.sellPrice : b.sellPrice - a.sellPrice,\n      ),\n    );\n  }\n}\n\n/** Returns a BaitQuery for all bait data. Pass `source` to wrap a pre-filtered array. */\nexport function bait(source: Bait[] = baitData): BaitQuery {\n  return new BaitQuery(source);\n}\n","[\n  {\n    \"id\": \"194\",\n    \"name\": \"Fried Egg\",\n    \"description\": \"Sunny-side up.\",\n    \"sellPrice\": 35,\n    \"energyHealth\": { \"energy\": 50, \"health\": 22 },\n    \"ingredients\": [{ \"id\": \"-5\", \"name\": \"Any Egg\", \"quantity\": 1 }],\n    \"image\": \"images/cooking/Fried Egg.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"default\" }]\n  },\n  {\n    \"id\": \"195\",\n    \"name\": \"Omelet\",\n    \"description\": \"It's super fluffy.\",\n    \"sellPrice\": 125,\n    \"energyHealth\": { \"energy\": 100, \"health\": 45 },\n    \"ingredients\": [\n      { \"id\": \"-5\", \"name\": \"Any Egg\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Omelet.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [\n      { \"type\": \"queen-of-sauce\", \"season\": \"spring\", \"day\": 28, \"year\": 1 },\n      { \"type\": \"purchase\", \"from\": \"Gus\", \"price\": 100, \"currency\": \"g\" }\n    ]\n  },\n  {\n    \"id\": \"196\",\n    \"name\": \"Salad\",\n    \"description\": \"A healthy garden salad.\",\n    \"sellPrice\": 110,\n    \"energyHealth\": { \"energy\": 113, \"health\": 50 },\n    \"ingredients\": [\n      { \"id\": \"20\", \"name\": \"Leek\", \"quantity\": 1 },\n      { \"id\": \"22\", \"name\": \"Dandelion\", \"quantity\": 1 },\n      { \"id\": \"419\", \"name\": \"Vinegar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Salad.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Emily\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"197\",\n    \"name\": \"Cheese Cauliflower\",\n    \"description\": \"It smells great!\",\n    \"sellPrice\": 300,\n    \"energyHealth\": { \"energy\": 138, \"health\": 62 },\n    \"ingredients\": [\n      { \"id\": \"190\", \"name\": \"Cauliflower\", \"quantity\": 1 },\n      { \"id\": \"424\", \"name\": \"Cheese\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Cheese Cauliflower.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Pam\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"198\",\n    \"name\": \"Baked Fish\",\n    \"description\": \"Baked fish on a bed of herbs.\",\n    \"sellPrice\": 100,\n    \"energyHealth\": { \"energy\": 75, \"health\": 33 },\n    \"ingredients\": [\n      { \"id\": \"145\", \"name\": \"Sunfish\", \"quantity\": 1 },\n      { \"id\": \"132\", \"name\": \"Bream\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Baked Fish.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"summer\", \"day\": 7, \"year\": 1 }]\n  },\n  {\n    \"id\": \"199\",\n    \"name\": \"Parsnip Soup\",\n    \"description\": \"It's fresh and hearty.\",\n    \"sellPrice\": 120,\n    \"energyHealth\": { \"energy\": 85, \"health\": 38 },\n    \"ingredients\": [\n      { \"id\": \"24\", \"name\": \"Parsnip\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 },\n      { \"id\": \"419\", \"name\": \"Vinegar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Parsnip Soup.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Caroline\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"200\",\n    \"name\": \"Vegetable Medley\",\n    \"description\": \"This is very nutritious.\",\n    \"sellPrice\": 120,\n    \"energyHealth\": { \"energy\": 165, \"health\": 74 },\n    \"ingredients\": [\n      { \"id\": \"256\", \"name\": \"Tomato\", \"quantity\": 1 },\n      { \"id\": \"284\", \"name\": \"Beet\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Vegetable Medley.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Caroline\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"201\",\n    \"name\": \"Complete Breakfast\",\n    \"description\": \"You'll feel ready to take on the world!\",\n    \"sellPrice\": 350,\n    \"energyHealth\": { \"energy\": 200, \"health\": 90 },\n    \"ingredients\": [\n      { \"id\": \"194\", \"name\": \"Fried Egg\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 },\n      { \"id\": \"210\", \"name\": \"Hashbrowns\", \"quantity\": 1 },\n      { \"id\": \"211\", \"name\": \"Pancakes\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Complete Breakfast.png\",\n    \"buffs\": [\n      { \"stat\": \"Farming\", \"value\": 2 },\n      { \"stat\": \"Max Energy\", \"value\": 50 }\n    ],\n    \"buffDuration\": 420,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"spring\", \"day\": 21, \"year\": 2 }]\n  },\n  {\n    \"id\": \"202\",\n    \"name\": \"Fried Calamari\",\n    \"description\": \"It's so chewy.\",\n    \"sellPrice\": 150,\n    \"energyHealth\": { \"energy\": 80, \"health\": 36 },\n    \"ingredients\": [\n      { \"id\": \"151\", \"name\": \"Squid\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Fried Calamari.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Jodi\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"203\",\n    \"name\": \"Strange Bun\",\n    \"description\": \"What's inside?\",\n    \"sellPrice\": 225,\n    \"energyHealth\": { \"energy\": 100, \"health\": 45 },\n    \"ingredients\": [\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"722\", \"name\": \"Periwinkle\", \"quantity\": 1 },\n      { \"id\": \"308\", \"name\": \"Void Mayonnaise\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Strange Bun.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Shane\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"204\",\n    \"name\": \"Lucky Lunch\",\n    \"description\": \"A special little meal.\",\n    \"sellPrice\": 250,\n    \"energyHealth\": { \"energy\": 100, \"health\": 45 },\n    \"ingredients\": [\n      { \"id\": \"154\", \"name\": \"Sea Cucumber\", \"quantity\": 1 },\n      { \"id\": \"229\", \"name\": \"Tortilla\", \"quantity\": 1 },\n      { \"id\": \"597\", \"name\": \"Blue Jazz\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Lucky Lunch.png\",\n    \"buffs\": [{ \"stat\": \"Luck\", \"value\": 3 }],\n    \"buffDuration\": 672,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"spring\", \"day\": 28, \"year\": 2 }]\n  },\n  {\n    \"id\": \"205\",\n    \"name\": \"Fried Mushroom\",\n    \"description\": \"Earthy and aromatic.\",\n    \"sellPrice\": 200,\n    \"energyHealth\": { \"energy\": 135, \"health\": 60 },\n    \"ingredients\": [\n      { \"id\": \"404\", \"name\": \"Common Mushroom\", \"quantity\": 1 },\n      { \"id\": \"257\", \"name\": \"Morel\", \"quantity\": 1 },\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Fried Mushroom.png\",\n    \"buffs\": [{ \"stat\": \"Attack\", \"value\": 2 }],\n    \"buffDuration\": 420,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Demetrius\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"206\",\n    \"name\": \"Pizza\",\n    \"description\": \"It's popular for all the right reasons.\",\n    \"sellPrice\": 300,\n    \"energyHealth\": { \"energy\": 150, \"health\": 67 },\n    \"ingredients\": [\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"256\", \"name\": \"Tomato\", \"quantity\": 1 },\n      { \"id\": \"424\", \"name\": \"Cheese\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Pizza.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [\n      { \"type\": \"queen-of-sauce\", \"season\": \"spring\", \"day\": 7, \"year\": 2 },\n      { \"type\": \"purchase\", \"from\": \"Gus\", \"price\": 150, \"currency\": \"g\" }\n    ]\n  },\n  {\n    \"id\": \"207\",\n    \"name\": \"Bean Hotpot\",\n    \"description\": \"It sure is healthy.\",\n    \"sellPrice\": 100,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [{ \"id\": \"188\", \"name\": \"Green Bean\", \"quantity\": 2 }],\n    \"image\": \"images/cooking/Bean Hotpot.png\",\n    \"buffs\": [\n      { \"stat\": \"Max Energy\", \"value\": 30 },\n      { \"stat\": \"Magnetism\", \"value\": 32 }\n    ],\n    \"buffDuration\": 420,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Clint\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"208\",\n    \"name\": \"Glazed Yams\",\n    \"description\": \"Sweet and satisfying...The sugar gives it a hint of caramel.\",\n    \"sellPrice\": 200,\n    \"energyHealth\": { \"energy\": 200, \"health\": 90 },\n    \"ingredients\": [\n      { \"id\": \"280\", \"name\": \"Yam\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Glazed Yams.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"fall\", \"day\": 21, \"year\": 1 }]\n  },\n  {\n    \"id\": \"209\",\n    \"name\": \"Carp Surprise\",\n    \"description\": \"It's bland and oily.\",\n    \"sellPrice\": 150,\n    \"energyHealth\": { \"energy\": 90, \"health\": 40 },\n    \"ingredients\": [{ \"id\": \"142\", \"name\": \"Carp\", \"quantity\": 4 }],\n    \"image\": \"images/cooking/Carp Surprise.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"summer\", \"day\": 7, \"year\": 2 }]\n  },\n  {\n    \"id\": \"210\",\n    \"name\": \"Hashbrowns\",\n    \"description\": \"Crispy and golden-brown!\",\n    \"sellPrice\": 120,\n    \"energyHealth\": { \"energy\": 90, \"health\": 40 },\n    \"ingredients\": [\n      { \"id\": \"192\", \"name\": \"Potato\", \"quantity\": 1 },\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Hashbrowns.png\",\n    \"buffs\": [{ \"stat\": \"Farming\", \"value\": 1 }],\n    \"buffDuration\": 336,\n    \"recipeSources\": [\n      { \"type\": \"queen-of-sauce\", \"season\": \"spring\", \"day\": 14, \"year\": 2 },\n      { \"type\": \"purchase\", \"from\": \"Gus\", \"price\": 50, \"currency\": \"g\" }\n    ]\n  },\n  {\n    \"id\": \"211\",\n    \"name\": \"Pancakes\",\n    \"description\": \"A double stack of fluffy, soft pancakes.\",\n    \"sellPrice\": 80,\n    \"energyHealth\": { \"energy\": 90, \"health\": 40 },\n    \"ingredients\": [\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"-5\", \"name\": \"Any Egg\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Pancakes.png\",\n    \"buffs\": [{ \"stat\": \"Foraging\", \"value\": 2 }],\n    \"buffDuration\": 672,\n    \"recipeSources\": [\n      { \"type\": \"queen-of-sauce\", \"season\": \"summer\", \"day\": 14, \"year\": 1 },\n      { \"type\": \"purchase\", \"from\": \"Gus\", \"price\": 100, \"currency\": \"g\" }\n    ]\n  },\n  {\n    \"id\": \"212\",\n    \"name\": \"Salmon Dinner\",\n    \"description\": \"The lemon spritz makes it special.\",\n    \"sellPrice\": 300,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [\n      { \"id\": \"139\", \"name\": \"Salmon\", \"quantity\": 1 },\n      { \"id\": \"300\", \"name\": \"Amaranth\", \"quantity\": 1 },\n      { \"id\": \"250\", \"name\": \"Kale\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Salmon Dinner.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Gus\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"213\",\n    \"name\": \"Fish Taco\",\n    \"description\": \"It smells delicious.\",\n    \"sellPrice\": 500,\n    \"energyHealth\": { \"energy\": 165, \"health\": 74 },\n    \"ingredients\": [\n      { \"id\": \"130\", \"name\": \"Tuna\", \"quantity\": 1 },\n      { \"id\": \"229\", \"name\": \"Tortilla\", \"quantity\": 1 },\n      { \"id\": \"266\", \"name\": \"Red Cabbage\", \"quantity\": 1 },\n      { \"id\": \"306\", \"name\": \"Mayonnaise\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Fish Taco.png\",\n    \"buffs\": [{ \"stat\": \"Fishing\", \"value\": 2 }],\n    \"buffDuration\": 420,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Linus\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"214\",\n    \"name\": \"Crispy Bass\",\n    \"description\": \"Wow, the breading is perfect.\",\n    \"sellPrice\": 150,\n    \"energyHealth\": { \"energy\": 90, \"health\": 40 },\n    \"ingredients\": [\n      { \"id\": \"136\", \"name\": \"Largemouth Bass\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Crispy Bass.png\",\n    \"buffs\": [{ \"stat\": \"Magnetism\", \"value\": 64 }],\n    \"buffDuration\": 420,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Kent\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"215\",\n    \"name\": \"Pepper Poppers\",\n    \"description\": \"Spicy breaded peppers filled with cheese.\",\n    \"sellPrice\": 200,\n    \"energyHealth\": { \"energy\": 130, \"health\": 58 },\n    \"ingredients\": [\n      { \"id\": \"260\", \"name\": \"Hot Pepper\", \"quantity\": 1 },\n      { \"id\": \"424\", \"name\": \"Cheese\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Pepper Poppers.png\",\n    \"buffs\": [\n      { \"stat\": \"Farming\", \"value\": 2 },\n      { \"stat\": \"Speed\", \"value\": 1 }\n    ],\n    \"buffDuration\": 420,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Shane\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"216\",\n    \"name\": \"Bread\",\n    \"description\": \"A crusty baguette.\",\n    \"sellPrice\": 60,\n    \"energyHealth\": { \"energy\": 50, \"health\": 22 },\n    \"ingredients\": [{ \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 }],\n    \"image\": \"images/cooking/Bread.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [\n      { \"type\": \"queen-of-sauce\", \"season\": \"summer\", \"day\": 28, \"year\": 1 },\n      { \"type\": \"purchase\", \"from\": \"Gus\", \"price\": 100, \"currency\": \"g\" }\n    ]\n  },\n  {\n    \"id\": \"218\",\n    \"name\": \"Tom Kha Soup\",\n    \"description\": \"These flavors are incredible!\",\n    \"sellPrice\": 250,\n    \"energyHealth\": { \"energy\": 175, \"health\": 78 },\n    \"ingredients\": [\n      { \"id\": \"88\", \"name\": \"Coconut\", \"quantity\": 1 },\n      { \"id\": \"720\", \"name\": \"Shrimp\", \"quantity\": 1 },\n      { \"id\": \"404\", \"name\": \"Common Mushroom\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Tom Kha Soup.png\",\n    \"buffs\": [\n      { \"stat\": \"Farming\", \"value\": 2 },\n      { \"stat\": \"Max Energy\", \"value\": 30 }\n    ],\n    \"buffDuration\": 420,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Sandy\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"219\",\n    \"name\": \"Trout Soup\",\n    \"description\": \"Pretty salty.\",\n    \"sellPrice\": 100,\n    \"energyHealth\": { \"energy\": 100, \"health\": 45 },\n    \"ingredients\": [\n      { \"id\": \"138\", \"name\": \"Rainbow Trout\", \"quantity\": 1 },\n      { \"id\": \"153\", \"name\": \"Green Algae\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Trout Soup.png\",\n    \"buffs\": [{ \"stat\": \"Fishing\", \"value\": 1 }],\n    \"buffDuration\": 280,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"fall\", \"day\": 14, \"year\": 1 }]\n  },\n  {\n    \"id\": \"220\",\n    \"name\": \"Chocolate Cake\",\n    \"description\": \"Rich and moist with a thick fudge icing.\",\n    \"sellPrice\": 200,\n    \"energyHealth\": { \"energy\": 150, \"health\": 67 },\n    \"ingredients\": [\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 },\n      { \"id\": \"-5\", \"name\": \"Any Egg\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Chocolate Cake.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"winter\", \"day\": 14, \"year\": 1 }]\n  },\n  {\n    \"id\": \"221\",\n    \"name\": \"Pink Cake\",\n    \"description\": \"There's little heart candies on top.\",\n    \"sellPrice\": 480,\n    \"energyHealth\": { \"energy\": 250, \"health\": 112 },\n    \"ingredients\": [\n      { \"id\": \"254\", \"name\": \"Melon\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 },\n      { \"id\": \"-5\", \"name\": \"Any Egg\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Pink Cake.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"summer\", \"day\": 21, \"year\": 2 }]\n  },\n  {\n    \"id\": \"222\",\n    \"name\": \"Rhubarb Pie\",\n    \"description\": \"Mmm, tangy and sweet!\",\n    \"sellPrice\": 400,\n    \"energyHealth\": { \"energy\": 215, \"health\": 96 },\n    \"ingredients\": [\n      { \"id\": \"252\", \"name\": \"Rhubarb\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Rhubarb Pie.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Marnie\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"223\",\n    \"name\": \"Cookie\",\n    \"description\": \"Very chewy.\",\n    \"sellPrice\": 140,\n    \"energyHealth\": { \"energy\": 90, \"health\": 40 },\n    \"ingredients\": [\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 },\n      { \"id\": \"-5\", \"name\": \"Any Egg\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Cookie.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"cutscene\", \"description\": \"Evelyn 4-heart event\" }]\n  },\n  {\n    \"id\": \"224\",\n    \"name\": \"Spaghetti\",\n    \"description\": \"An old favorite.\",\n    \"sellPrice\": 120,\n    \"energyHealth\": { \"energy\": 75, \"health\": 33 },\n    \"ingredients\": [\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"256\", \"name\": \"Tomato\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Spaghetti.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Lewis\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"225\",\n    \"name\": \"Fried Eel\",\n    \"description\": \"Greasy but flavorful.\",\n    \"sellPrice\": 120,\n    \"energyHealth\": { \"energy\": 75, \"health\": 33 },\n    \"ingredients\": [\n      { \"id\": \"148\", \"name\": \"Eel\", \"quantity\": 1 },\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Fried Eel.png\",\n    \"buffs\": [{ \"stat\": \"Luck\", \"value\": 1 }],\n    \"buffDuration\": 420,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"George\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"226\",\n    \"name\": \"Spicy Eel\",\n    \"description\": \"It's really spicy! Be careful.\",\n    \"sellPrice\": 175,\n    \"energyHealth\": { \"energy\": 115, \"health\": 51 },\n    \"ingredients\": [\n      { \"id\": \"148\", \"name\": \"Eel\", \"quantity\": 1 },\n      { \"id\": \"260\", \"name\": \"Hot Pepper\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Spicy Eel.png\",\n    \"buffs\": [\n      { \"stat\": \"Luck\", \"value\": 1 },\n      { \"stat\": \"Speed\", \"value\": 1 }\n    ],\n    \"buffDuration\": 420,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"George\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"227\",\n    \"name\": \"Sashimi\",\n    \"description\": \"Raw fish sliced into thin pieces.\",\n    \"sellPrice\": 75,\n    \"energyHealth\": { \"energy\": 75, \"health\": 33 },\n    \"ingredients\": [{ \"id\": \"-4\", \"name\": \"Any Fish\", \"quantity\": 1 }],\n    \"image\": \"images/cooking/Sashimi.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Linus\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"228\",\n    \"name\": \"Maki Roll\",\n    \"description\": \"Fish and rice wrapped in seaweed.\",\n    \"sellPrice\": 220,\n    \"energyHealth\": { \"energy\": 100, \"health\": 45 },\n    \"ingredients\": [\n      { \"id\": \"-4\", \"name\": \"Any Fish\", \"quantity\": 1 },\n      { \"id\": \"152\", \"name\": \"Seaweed\", \"quantity\": 1 },\n      { \"id\": \"423\", \"name\": \"Rice\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Maki Roll.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [\n      { \"type\": \"queen-of-sauce\", \"season\": \"summer\", \"day\": 21, \"year\": 1 },\n      { \"type\": \"purchase\", \"from\": \"Gus\", \"price\": 300, \"currency\": \"g\" }\n    ]\n  },\n  {\n    \"id\": \"229\",\n    \"name\": \"Tortilla\",\n    \"description\": \"Can be used as a vessel for food or eaten by itself.\",\n    \"sellPrice\": 50,\n    \"energyHealth\": { \"energy\": 50, \"health\": 22 },\n    \"ingredients\": [{ \"id\": \"270\", \"name\": \"Corn\", \"quantity\": 1 }],\n    \"image\": \"images/cooking/Tortilla.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [\n      { \"type\": \"queen-of-sauce\", \"season\": \"fall\", \"day\": 7, \"year\": 1 },\n      { \"type\": \"purchase\", \"from\": \"Gus\", \"price\": 100, \"currency\": \"g\" }\n    ]\n  },\n  {\n    \"id\": \"230\",\n    \"name\": \"Red Plate\",\n    \"description\": \"Full of antioxidants.\",\n    \"sellPrice\": 400,\n    \"energyHealth\": { \"energy\": 240, \"health\": 108 },\n    \"ingredients\": [\n      { \"id\": \"266\", \"name\": \"Red Cabbage\", \"quantity\": 1 },\n      { \"id\": \"264\", \"name\": \"Radish\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Red Plate.png\",\n    \"buffs\": [{ \"stat\": \"Max Energy\", \"value\": 50 }],\n    \"buffDuration\": 210,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Emily\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"231\",\n    \"name\": \"Eggplant Parmesan\",\n    \"description\": \"Tangy, cheesy, and wonderful.\",\n    \"sellPrice\": 200,\n    \"energyHealth\": { \"energy\": 175, \"health\": 78 },\n    \"ingredients\": [\n      { \"id\": \"272\", \"name\": \"Eggplant\", \"quantity\": 1 },\n      { \"id\": \"256\", \"name\": \"Tomato\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Eggplant Parmesan.png\",\n    \"buffs\": [\n      { \"stat\": \"Mining\", \"value\": 1 },\n      { \"stat\": \"Defense\", \"value\": 3 }\n    ],\n    \"buffDuration\": 280,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Lewis\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"232\",\n    \"name\": \"Rice Pudding\",\n    \"description\": \"It's creamy, sweet, and fun to eat.\",\n    \"sellPrice\": 260,\n    \"energyHealth\": { \"energy\": 115, \"health\": 51 },\n    \"ingredients\": [\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 },\n      { \"id\": \"423\", \"name\": \"Rice\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Rice Pudding.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Evelyn\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"233\",\n    \"name\": \"Ice Cream\",\n    \"description\": \"It's hard to find someone who doesn't like this.\",\n    \"sellPrice\": 120,\n    \"energyHealth\": { \"energy\": 100, \"health\": 45 },\n    \"ingredients\": [\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Ice Cream.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Jodi\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"234\",\n    \"name\": \"Blueberry Tart\",\n    \"description\": \"It's subtle and refreshing.\",\n    \"sellPrice\": 150,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [\n      { \"id\": \"258\", \"name\": \"Blueberry\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 },\n      { \"id\": \"-5\", \"name\": \"Any Egg\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Blueberry Tart.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Pierre\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"235\",\n    \"name\": \"Autumn's Bounty\",\n    \"description\": \"A taste of the season.\",\n    \"sellPrice\": 350,\n    \"energyHealth\": { \"energy\": 220, \"health\": 99 },\n    \"ingredients\": [\n      { \"id\": \"280\", \"name\": \"Yam\", \"quantity\": 1 },\n      { \"id\": \"276\", \"name\": \"Pumpkin\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Autumn's Bounty.png\",\n    \"buffs\": [\n      { \"stat\": \"Foraging\", \"value\": 2 },\n      { \"stat\": \"Defense\", \"value\": 2 }\n    ],\n    \"buffDuration\": 462,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Demetrius\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"236\",\n    \"name\": \"Pumpkin Soup\",\n    \"description\": \"A seasonal favorite.\",\n    \"sellPrice\": 300,\n    \"energyHealth\": { \"energy\": 200, \"health\": 90 },\n    \"ingredients\": [\n      { \"id\": \"276\", \"name\": \"Pumpkin\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Pumpkin Soup.png\",\n    \"buffs\": [\n      { \"stat\": \"Luck\", \"value\": 2 },\n      { \"stat\": \"Defense\", \"value\": 2 }\n    ],\n    \"buffDuration\": 462,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Robin\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"237\",\n    \"name\": \"Super Meal\",\n    \"description\": \"It's a really energizing meal.\",\n    \"sellPrice\": 220,\n    \"energyHealth\": { \"energy\": 160, \"health\": 72 },\n    \"ingredients\": [\n      { \"id\": \"278\", \"name\": \"Bok Choy\", \"quantity\": 1 },\n      { \"id\": \"282\", \"name\": \"Cranberries\", \"quantity\": 1 },\n      { \"id\": \"274\", \"name\": \"Artichoke\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Super Meal.png\",\n    \"buffs\": [\n      { \"stat\": \"Max Energy\", \"value\": 40 },\n      { \"stat\": \"Speed\", \"value\": 1 }\n    ],\n    \"buffDuration\": 210,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Kent\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"238\",\n    \"name\": \"Cranberry Sauce\",\n    \"description\": \"A festive treat.\",\n    \"sellPrice\": 120,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [\n      { \"id\": \"282\", \"name\": \"Cranberries\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Cranberry Sauce.png\",\n    \"buffs\": [{ \"stat\": \"Mining\", \"value\": 2 }],\n    \"buffDuration\": 210,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Gus\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"239\",\n    \"name\": \"Stuffing\",\n    \"description\": \"Ahh... the smell of warm bread and sage.\",\n    \"sellPrice\": 165,\n    \"energyHealth\": { \"energy\": 170, \"health\": 76 },\n    \"ingredients\": [\n      { \"id\": \"216\", \"name\": \"Bread\", \"quantity\": 1 },\n      { \"id\": \"282\", \"name\": \"Cranberries\", \"quantity\": 1 },\n      { \"id\": \"408\", \"name\": \"Hazelnut\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Stuffing.png\",\n    \"buffs\": [{ \"stat\": \"Defense\", \"value\": 2 }],\n    \"buffDuration\": 336,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Pam\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"240\",\n    \"name\": \"Farmer's Lunch\",\n    \"description\": \"This'll keep you going.\",\n    \"sellPrice\": 150,\n    \"energyHealth\": { \"energy\": 200, \"health\": 90 },\n    \"ingredients\": [\n      { \"id\": \"195\", \"name\": \"Omelet\", \"quantity\": 1 },\n      { \"id\": \"24\", \"name\": \"Parsnip\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Farmer's Lunch.png\",\n    \"buffs\": [{ \"stat\": \"Farming\", \"value\": 3 }],\n    \"buffDuration\": 336,\n    \"recipeSources\": [{ \"type\": \"skill\", \"skill\": \"Farming\", \"level\": 3 }]\n  },\n  {\n    \"id\": \"241\",\n    \"name\": \"Survival Burger\",\n    \"description\": \"A convenient snack for the explorer.\",\n    \"sellPrice\": 180,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [\n      { \"id\": \"216\", \"name\": \"Bread\", \"quantity\": 1 },\n      { \"id\": \"78\", \"name\": \"Cave Carrot\", \"quantity\": 1 },\n      { \"id\": \"272\", \"name\": \"Eggplant\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Survival Burger.png\",\n    \"buffs\": [{ \"stat\": \"Foraging\", \"value\": 3 }],\n    \"buffDuration\": 336,\n    \"recipeSources\": [{ \"type\": \"skill\", \"skill\": \"Foraging\", \"level\": 8 }]\n  },\n  {\n    \"id\": \"242\",\n    \"name\": \"Dish O' The Sea\",\n    \"description\": \"This'll keep you warm in the cold sea air.\",\n    \"sellPrice\": 220,\n    \"energyHealth\": { \"energy\": 150, \"health\": 67 },\n    \"ingredients\": [\n      { \"id\": \"131\", \"name\": \"Sardine\", \"quantity\": 2 },\n      { \"id\": \"210\", \"name\": \"Hashbrowns\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Dish O' The Sea.png\",\n    \"buffs\": [{ \"stat\": \"Fishing\", \"value\": 3 }],\n    \"buffDuration\": 336,\n    \"recipeSources\": [{ \"type\": \"skill\", \"skill\": \"Fishing\", \"level\": 3 }]\n  },\n  {\n    \"id\": \"243\",\n    \"name\": \"Miner's Treat\",\n    \"description\": \"This should keep your energy up.\",\n    \"sellPrice\": 200,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [\n      { \"id\": \"78\", \"name\": \"Cave Carrot\", \"quantity\": 2 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Miner's Treat.png\",\n    \"buffs\": [\n      { \"stat\": \"Mining\", \"value\": 3 },\n      { \"stat\": \"Magnetism\", \"value\": 32 }\n    ],\n    \"buffDuration\": 336,\n    \"recipeSources\": [{ \"type\": \"skill\", \"skill\": \"Mining\", \"level\": 3 }]\n  },\n  {\n    \"id\": \"244\",\n    \"name\": \"Roots Platter\",\n    \"description\": \"This'll get you digging for more.\",\n    \"sellPrice\": 100,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [\n      { \"id\": \"78\", \"name\": \"Cave Carrot\", \"quantity\": 1 },\n      { \"id\": \"412\", \"name\": \"Winter Root\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Roots Platter.png\",\n    \"buffs\": [{ \"stat\": \"Attack\", \"value\": 3 }],\n    \"buffDuration\": 336,\n    \"recipeSources\": [{ \"type\": \"skill\", \"skill\": \"Combat\", \"level\": 3 }]\n  },\n  {\n    \"id\": \"253\",\n    \"name\": \"Triple Shot Espresso\",\n    \"description\": \"It's more potent than regular coffee!\",\n    \"sellPrice\": 450,\n    \"energyHealth\": { \"energy\": 8, \"health\": 3 },\n    \"ingredients\": [{ \"id\": \"395\", \"name\": \"Coffee\", \"quantity\": 3 }],\n    \"image\": \"images/cooking/Triple Shot Espresso.png\",\n    \"buffs\": [{ \"stat\": \"Speed\", \"value\": 1 }],\n    \"buffDuration\": 252,\n    \"recipeSources\": [{ \"type\": \"purchase\", \"from\": \"Gus\", \"price\": 5000, \"currency\": \"g\" }]\n  },\n  {\n    \"id\": \"265\",\n    \"name\": \"Seafoam Pudding\",\n    \"description\": \"This briny pudding will really get you into the maritime mindset!\",\n    \"sellPrice\": 300,\n    \"energyHealth\": { \"energy\": 175, \"health\": 78 },\n    \"ingredients\": [\n      { \"id\": \"267\", \"name\": \"Flounder\", \"quantity\": 1 },\n      { \"id\": \"269\", \"name\": \"Midnight Carp\", \"quantity\": 1 },\n      { \"id\": \"814\", \"name\": \"Squid Ink\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Seafoam Pudding.png\",\n    \"buffs\": [{ \"stat\": \"Fishing\", \"value\": 4 }],\n    \"buffDuration\": 210,\n    \"recipeSources\": [{ \"type\": \"skill\", \"skill\": \"Fishing\", \"level\": 9 }]\n  },\n  {\n    \"id\": \"456\",\n    \"name\": \"Algae Soup\",\n    \"description\": \"It's a little slimy.\",\n    \"sellPrice\": 100,\n    \"energyHealth\": { \"energy\": 75, \"health\": 33 },\n    \"ingredients\": [{ \"id\": \"153\", \"name\": \"Green Algae\", \"quantity\": 4 }],\n    \"image\": \"images/cooking/Algae Soup.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Clint\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"457\",\n    \"name\": \"Pale Broth\",\n    \"description\": \"A delicate broth with a hint of sulfur.\",\n    \"sellPrice\": 150,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [{ \"id\": \"157\", \"name\": \"White Algae\", \"quantity\": 2 }],\n    \"image\": \"images/cooking/Pale Broth.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Marnie\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"604\",\n    \"name\": \"Plum Pudding\",\n    \"description\": \"A traditional holiday treat.\",\n    \"sellPrice\": 260,\n    \"energyHealth\": { \"energy\": 175, \"health\": 78 },\n    \"ingredients\": [\n      { \"id\": \"406\", \"name\": \"Wild Plum\", \"quantity\": 2 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Plum Pudding.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"winter\", \"day\": 7, \"year\": 1 }]\n  },\n  {\n    \"id\": \"605\",\n    \"name\": \"Artichoke Dip\",\n    \"description\": \"It's cool and refreshing.\",\n    \"sellPrice\": 210,\n    \"energyHealth\": { \"energy\": 100, \"health\": 45 },\n    \"ingredients\": [\n      { \"id\": \"274\", \"name\": \"Artichoke\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Artichoke Dip.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"fall\", \"day\": 28, \"year\": 1 }]\n  },\n  {\n    \"id\": \"606\",\n    \"name\": \"Stir Fry\",\n    \"description\": \"Julienned vegetables on a bed of rice.\",\n    \"sellPrice\": 335,\n    \"energyHealth\": { \"energy\": 200, \"health\": 90 },\n    \"ingredients\": [\n      { \"id\": \"78\", \"name\": \"Cave Carrot\", \"quantity\": 1 },\n      { \"id\": \"404\", \"name\": \"Common Mushroom\", \"quantity\": 1 },\n      { \"id\": \"250\", \"name\": \"Kale\", \"quantity\": 1 },\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Stir Fry.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"spring\", \"day\": 7, \"year\": 1 }]\n  },\n  {\n    \"id\": \"607\",\n    \"name\": \"Roasted Hazelnuts\",\n    \"description\": \"The roasting process creates a rich forest flavor.\",\n    \"sellPrice\": 270,\n    \"energyHealth\": { \"energy\": 175, \"health\": 78 },\n    \"ingredients\": [{ \"id\": \"408\", \"name\": \"Hazelnut\", \"quantity\": 3 }],\n    \"image\": \"images/cooking/Roasted Hazelnuts.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"summer\", \"day\": 28, \"year\": 2 }]\n  },\n  {\n    \"id\": \"608\",\n    \"name\": \"Pumpkin Pie\",\n    \"description\": \"Silky pumpkin cream in a flaky crust.\",\n    \"sellPrice\": 385,\n    \"energyHealth\": { \"energy\": 225, \"health\": 101 },\n    \"ingredients\": [\n      { \"id\": \"276\", \"name\": \"Pumpkin\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Pumpkin Pie.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"winter\", \"day\": 21, \"year\": 1 }]\n  },\n  {\n    \"id\": \"609\",\n    \"name\": \"Radish Salad\",\n    \"description\": \"The radishes are so crisp!\",\n    \"sellPrice\": 300,\n    \"energyHealth\": { \"energy\": 200, \"health\": 90 },\n    \"ingredients\": [\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 },\n      { \"id\": \"419\", \"name\": \"Vinegar\", \"quantity\": 1 },\n      { \"id\": \"264\", \"name\": \"Radish\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Radish Salad.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"spring\", \"day\": 21, \"year\": 1 }]\n  },\n  {\n    \"id\": \"610\",\n    \"name\": \"Fruit Salad\",\n    \"description\": \"A delicious combination of summer fruits.\",\n    \"sellPrice\": 450,\n    \"energyHealth\": { \"energy\": 263, \"health\": 118 },\n    \"ingredients\": [\n      { \"id\": \"258\", \"name\": \"Blueberry\", \"quantity\": 1 },\n      { \"id\": \"254\", \"name\": \"Melon\", \"quantity\": 1 },\n      { \"id\": \"634\", \"name\": \"Apricot\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Fruit Salad.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"fall\", \"day\": 7, \"year\": 2 }]\n  },\n  {\n    \"id\": \"611\",\n    \"name\": \"Blackberry Cobbler\",\n    \"description\": \"There's nothing quite like it.\",\n    \"sellPrice\": 260,\n    \"energyHealth\": { \"energy\": 175, \"health\": 78 },\n    \"ingredients\": [\n      { \"id\": \"410\", \"name\": \"Blackberry\", \"quantity\": 2 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Blackberry Cobbler.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"fall\", \"day\": 14, \"year\": 2 }]\n  },\n  {\n    \"id\": \"612\",\n    \"name\": \"Cranberry Candy\",\n    \"description\": \"It's sweet enough to mask the bitter fruit.\",\n    \"sellPrice\": 175,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [\n      { \"id\": \"282\", \"name\": \"Cranberries\", \"quantity\": 1 },\n      { \"id\": \"613\", \"name\": \"Apple\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Cranberry Candy.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"winter\", \"day\": 28, \"year\": 1 }]\n  },\n  {\n    \"id\": \"618\",\n    \"name\": \"Bruschetta\",\n    \"description\": \"Roasted tomatoes on a crisp white bread.\",\n    \"sellPrice\": 210,\n    \"energyHealth\": { \"energy\": 113, \"health\": 50 },\n    \"ingredients\": [\n      { \"id\": \"216\", \"name\": \"Bread\", \"quantity\": 1 },\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 },\n      { \"id\": \"256\", \"name\": \"Tomato\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Bruschetta.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"winter\", \"day\": 21, \"year\": 2 }]\n  },\n  {\n    \"id\": \"648\",\n    \"name\": \"Coleslaw\",\n    \"description\": \"It's light, fresh and very healthy.\",\n    \"sellPrice\": 345,\n    \"energyHealth\": { \"energy\": 213, \"health\": 95 },\n    \"ingredients\": [\n      { \"id\": \"266\", \"name\": \"Red Cabbage\", \"quantity\": 1 },\n      { \"id\": \"419\", \"name\": \"Vinegar\", \"quantity\": 1 },\n      { \"id\": \"306\", \"name\": \"Mayonnaise\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Coleslaw.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"spring\", \"day\": 14, \"year\": 1 }]\n  },\n  {\n    \"id\": \"649\",\n    \"name\": \"Fiddlehead Risotto\",\n    \"description\": \"A creamy rice dish served with sauteed fern heads. It's a little bland.\",\n    \"sellPrice\": 350,\n    \"energyHealth\": { \"energy\": 225, \"health\": 101 },\n    \"ingredients\": [\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 },\n      { \"id\": \"259\", \"name\": \"Fiddlehead Fern\", \"quantity\": 1 },\n      { \"id\": \"248\", \"name\": \"Garlic\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Fiddlehead Risotto.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"fall\", \"day\": 28, \"year\": 2 }]\n  },\n  {\n    \"id\": \"651\",\n    \"name\": \"Poppyseed Muffin\",\n    \"description\": \"It has a soothing effect.\",\n    \"sellPrice\": 250,\n    \"energyHealth\": { \"energy\": 150, \"health\": 67 },\n    \"ingredients\": [\n      { \"id\": \"376\", \"name\": \"Poppy\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Poppyseed Muffin.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"winter\", \"day\": 7, \"year\": 2 }]\n  },\n  {\n    \"id\": \"727\",\n    \"name\": \"Chowder\",\n    \"description\": \"A perfect way to warm yourself after a cold night at sea.\",\n    \"sellPrice\": 135,\n    \"energyHealth\": { \"energy\": 225, \"health\": 101 },\n    \"ingredients\": [\n      { \"id\": \"372\", \"name\": \"Clam\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Chowder.png\",\n    \"buffs\": [{ \"stat\": \"Fishing\", \"value\": 1 }],\n    \"buffDuration\": 1008,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Willy\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"728\",\n    \"name\": \"Fish Stew\",\n    \"description\": \"It smells a lot like the sea. Tastes better, though.\",\n    \"sellPrice\": 175,\n    \"energyHealth\": { \"energy\": 225, \"health\": 101 },\n    \"ingredients\": [\n      { \"id\": \"716\", \"name\": \"Crayfish\", \"quantity\": 1 },\n      { \"id\": \"719\", \"name\": \"Mussel\", \"quantity\": 1 },\n      { \"id\": \"722\", \"name\": \"Periwinkle\", \"quantity\": 1 },\n      { \"id\": \"256\", \"name\": \"Tomato\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Fish Stew.png\",\n    \"buffs\": [{ \"stat\": \"Fishing\", \"value\": 3 }],\n    \"buffDuration\": 1008,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Willy\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"729\",\n    \"name\": \"Escargot\",\n    \"description\": \"Butter-soaked snails cooked to perfection.\",\n    \"sellPrice\": 125,\n    \"energyHealth\": { \"energy\": 225, \"health\": 101 },\n    \"ingredients\": [\n      { \"id\": \"721\", \"name\": \"Snail\", \"quantity\": 1 },\n      { \"id\": \"248\", \"name\": \"Garlic\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Escargot.png\",\n    \"buffs\": [{ \"stat\": \"Fishing\", \"value\": 2 }],\n    \"buffDuration\": 1008,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Willy\", \"hearts\": 5 }]\n  },\n  {\n    \"id\": \"730\",\n    \"name\": \"Lobster Bisque\",\n    \"description\": \"This delicate soup is a secret family recipe of Willy's.\",\n    \"sellPrice\": 205,\n    \"energyHealth\": { \"energy\": 225, \"health\": 101 },\n    \"ingredients\": [\n      { \"id\": \"715\", \"name\": \"Lobster\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Lobster Bisque.png\",\n    \"buffs\": [\n      { \"stat\": \"Fishing\", \"value\": 3 },\n      { \"stat\": \"Max Energy\", \"value\": 50 }\n    ],\n    \"buffDuration\": 1008,\n    \"recipeSources\": [\n      { \"type\": \"queen-of-sauce\", \"season\": \"winter\", \"day\": 14, \"year\": 2 },\n      { \"type\": \"friendship\", \"villager\": \"Willy\", \"hearts\": 9 }\n    ]\n  },\n  {\n    \"id\": \"731\",\n    \"name\": \"Maple Bar\",\n    \"description\": \"It's a sweet doughnut topped with a rich maple glaze.\",\n    \"sellPrice\": 300,\n    \"energyHealth\": { \"energy\": 225, \"health\": 101 },\n    \"ingredients\": [\n      { \"id\": \"724\", \"name\": \"Maple Syrup\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Maple Bar.png\",\n    \"buffs\": [\n      { \"stat\": \"Farming\", \"value\": 1 },\n      { \"stat\": \"Fishing\", \"value\": 1 },\n      { \"stat\": \"Mining\", \"value\": 1 }\n    ],\n    \"buffDuration\": 1008,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"summer\", \"day\": 14, \"year\": 2 }]\n  },\n  {\n    \"id\": \"732\",\n    \"name\": \"Crab Cakes\",\n    \"description\": \"Crab, bread crumbs, and egg formed into patties then fried to golden brown.\",\n    \"sellPrice\": 275,\n    \"energyHealth\": { \"energy\": 225, \"health\": 101 },\n    \"ingredients\": [\n      { \"id\": \"717\", \"name\": \"Crab\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"-5\", \"name\": \"Any Egg\", \"quantity\": 1 },\n      { \"id\": \"247\", \"name\": \"Oil\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Crab Cakes.png\",\n    \"buffs\": [\n      { \"stat\": \"Speed\", \"value\": 1 },\n      { \"stat\": \"Defense\", \"value\": 1 }\n    ],\n    \"buffDuration\": 1008,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"fall\", \"day\": 21, \"year\": 2 }]\n  },\n  {\n    \"id\": \"733\",\n    \"name\": \"Shrimp Cocktail\",\n    \"description\": \"A sumptuous appetizer made with freshly-caught shrimp.\",\n    \"sellPrice\": 160,\n    \"energyHealth\": { \"energy\": 225, \"health\": 101 },\n    \"ingredients\": [\n      { \"id\": \"720\", \"name\": \"Shrimp\", \"quantity\": 1 },\n      { \"id\": \"256\", \"name\": \"Tomato\", \"quantity\": 1 },\n      { \"id\": \"16\", \"name\": \"Wild Horseradish\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Shrimp Cocktail.png\",\n    \"buffs\": [\n      { \"stat\": \"Fishing\", \"value\": 1 },\n      { \"stat\": \"Luck\", \"value\": 1 }\n    ],\n    \"buffDuration\": 602,\n    \"recipeSources\": [{ \"type\": \"queen-of-sauce\", \"season\": \"winter\", \"day\": 28, \"year\": 2 }]\n  },\n  {\n    \"id\": \"903\",\n    \"name\": \"Ginger Ale\",\n    \"description\": \"A zesty soda known for its soothing effect on the stomach.\",\n    \"sellPrice\": 200,\n    \"energyHealth\": { \"energy\": 63, \"health\": 28 },\n    \"ingredients\": [\n      { \"id\": \"829\", \"name\": \"Ginger\", \"quantity\": 3 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Ginger Ale.png\",\n    \"buffs\": [{ \"stat\": \"Luck\", \"value\": 1 }],\n    \"buffDuration\": 301,\n    \"recipeSources\": [{ \"type\": \"purchase\", \"from\": \"Dwarf Shop\", \"price\": 1000, \"currency\": \"g\" }]\n  },\n  {\n    \"id\": \"904\",\n    \"name\": \"Banana Pudding\",\n    \"description\": \"A creamy dessert with a wonderful tropical flavor.\",\n    \"sellPrice\": 260,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [\n      { \"id\": \"91\", \"name\": \"Banana\", \"quantity\": 1 },\n      { \"id\": \"-6\", \"name\": \"Any Milk\", \"quantity\": 1 },\n      { \"id\": \"245\", \"name\": \"Sugar\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Banana Pudding.png\",\n    \"buffs\": [\n      { \"stat\": \"Mining\", \"value\": 1 },\n      { \"stat\": \"Luck\", \"value\": 1 },\n      { \"stat\": \"Defense\", \"value\": 1 }\n    ],\n    \"buffDuration\": 301,\n    \"recipeSources\": [\n      { \"type\": \"purchase\", \"from\": \"Island Trader\", \"price\": 30, \"currency\": \"Bone Fragment\" }\n    ]\n  },\n  {\n    \"id\": \"905\",\n    \"name\": \"Mango Sticky Rice\",\n    \"description\": \"Sweet mango and coconut transforms this rice into something very special.\",\n    \"sellPrice\": 250,\n    \"energyHealth\": { \"energy\": 113, \"health\": 50 },\n    \"ingredients\": [\n      { \"id\": \"834\", \"name\": \"Mango\", \"quantity\": 1 },\n      { \"id\": \"88\", \"name\": \"Coconut\", \"quantity\": 1 },\n      { \"id\": \"423\", \"name\": \"Rice\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Mango Sticky Rice.png\",\n    \"buffs\": [{ \"stat\": \"Defense\", \"value\": 3 }],\n    \"buffDuration\": 301,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Leo\", \"hearts\": 7 }]\n  },\n  {\n    \"id\": \"906\",\n    \"name\": \"Poi\",\n    \"description\": \"A traditional food with a delicate, sweet flavor when eaten fresh.\",\n    \"sellPrice\": 400,\n    \"energyHealth\": { \"energy\": 75, \"health\": 33 },\n    \"ingredients\": [{ \"id\": \"830\", \"name\": \"Taro Root\", \"quantity\": 4 }],\n    \"image\": \"images/cooking/Poi.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"friendship\", \"villager\": \"Leo\", \"hearts\": 3 }]\n  },\n  {\n    \"id\": \"907\",\n    \"name\": \"Tropical Curry\",\n    \"description\": \"An exotic, fragrant curry served in a pineapple bowl.\",\n    \"sellPrice\": 500,\n    \"energyHealth\": { \"energy\": 150, \"health\": 67 },\n    \"ingredients\": [\n      { \"id\": \"88\", \"name\": \"Coconut\", \"quantity\": 1 },\n      { \"id\": \"832\", \"name\": \"Pineapple\", \"quantity\": 1 },\n      { \"id\": \"260\", \"name\": \"Hot Pepper\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Tropical Curry.png\",\n    \"buffs\": [{ \"stat\": \"Foraging\", \"value\": 4 }],\n    \"buffDuration\": 301,\n    \"recipeSources\": [\n      { \"type\": \"purchase\", \"from\": \"Ginger Island Resort\", \"price\": 2000, \"currency\": \"g\" }\n    ]\n  },\n  {\n    \"id\": \"921\",\n    \"name\": \"Squid Ink Ravioli\",\n    \"description\": \"Temporarily protects from debuffs.\",\n    \"sellPrice\": 150,\n    \"energyHealth\": { \"energy\": 125, \"health\": 56 },\n    \"ingredients\": [\n      { \"id\": \"814\", \"name\": \"Squid Ink\", \"quantity\": 1 },\n      { \"id\": \"246\", \"name\": \"Wheat Flour\", \"quantity\": 1 },\n      { \"id\": \"256\", \"name\": \"Tomato\", \"quantity\": 1 }\n    ],\n    \"image\": \"images/cooking/Squid Ink Ravioli.png\",\n    \"buffs\": [\n      { \"stat\": \"Mining\", \"value\": 1 },\n      { \"stat\": \"Debuff Immunity\", \"value\": 1 }\n    ],\n    \"buffDuration\": 280,\n    \"recipeSources\": [{ \"type\": \"skill\", \"skill\": \"Combat\", \"level\": 9 }]\n  },\n  {\n    \"id\": \"MossSoup\",\n    \"name\": \"Moss Soup\",\n    \"description\": \"It's thick and slimy, but edible.\",\n    \"sellPrice\": 80,\n    \"energyHealth\": { \"energy\": 70, \"health\": 31 },\n    \"ingredients\": [{ \"id\": \"Moss\", \"name\": \"Moss\", \"quantity\": 20 }],\n    \"image\": \"images/cooking/Moss Soup.png\",\n    \"buffs\": [],\n    \"buffDuration\": null,\n    \"recipeSources\": [{ \"type\": \"skill\", \"skill\": \"Foraging\", \"level\": 3 }]\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/cooking.json';\nimport { CookedDish } from '@/types';\n\nconst cookingData: CookedDish[] = data as CookedDish[];\n\n/** Query builder for cooked dish data. All filter and sort methods return a new CookingQuery for chaining. */\nexport class CookingQuery extends QueryBase<CookedDish> {\n  constructor(data: CookedDish[] = cookingData) {\n    super(data);\n  }\n\n  /** Filter to dishes that require a specific ingredient by ID. */\n  withIngredient(ingredientId: string): CookingQuery {\n    return new CookingQuery(\n      this.data.filter((d) => d.ingredients.some((i) => i.id === ingredientId)),\n    );\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): CookingQuery {\n    return new CookingQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /** Sort by sell price. Default: `'desc'` (most valuable first). */\n  sortBySellPrice(order: 'asc' | 'desc' = 'desc'): CookingQuery {\n    return new CookingQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.sellPrice - b.sellPrice : b.sellPrice - a.sellPrice,\n      ),\n    );\n  }\n\n  /**\n   * Sort by energy restored. Dishes with no energy value sort as 0.\n   * Default: `'desc'` (most energising first).\n   */\n  sortByEnergy(order: 'asc' | 'desc' = 'desc'): CookingQuery {\n    return new CookingQuery(\n      [...this.data].sort((a, b) => {\n        const ea = a.energyHealth.energy ?? 0;\n        const eb = b.energyHealth.energy ?? 0;\n        return order === 'asc' ? ea - eb : eb - ea;\n      }),\n    );\n  }\n}\n\n/** Returns a CookingQuery for all cooked dish data. Pass `source` to wrap a pre-filtered array. */\nexport function cooking(source: CookedDish[] = cookingData): CookingQuery {\n  return new CookingQuery(source);\n}\n","[\n  {\n    \"id\": \"Bomb\",\n    \"name\": \"Bomb\",\n    \"description\": \"Generates a powerful explosion.\",\n    \"category\": \"Bombs\",\n    \"source\": \"Mining Level 6\",\n    \"output\": {\n      \"id\": \"287\",\n      \"name\": \"Bomb\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"380\",\n        \"name\": \"Iron Ore\",\n        \"quantity\": 4\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/bombs/Bomb.png\"\n  },\n  {\n    \"id\": \"Cherry Bomb\",\n    \"name\": \"Cherry Bomb\",\n    \"description\": \"Creates a small explosion. Radius 3.\",\n    \"category\": \"Bombs\",\n    \"source\": \"Mining Level 1\",\n    \"output\": {\n      \"id\": \"286\",\n      \"name\": \"Cherry Bomb\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"378\",\n        \"name\": \"Copper Ore\",\n        \"quantity\": 4\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/bombs/Cherry Bomb.png\"\n  },\n  {\n    \"id\": \"Mega Bomb\",\n    \"name\": \"Mega Bomb\",\n    \"description\": \"Generates a massive explosion.\",\n    \"category\": \"Bombs\",\n    \"source\": \"Mining Level 8\",\n    \"output\": {\n      \"id\": \"288\",\n      \"name\": \"Mega Bomb\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"384\",\n        \"name\": \"Gold Ore\",\n        \"quantity\": 4\n      },\n      {\n        \"id\": \"768\",\n        \"name\": \"Solar Essence\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"769\",\n        \"name\": \"Void Essence\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/bombs/Mega Bomb.png\"\n  },\n  {\n    \"id\": \"Gate\",\n    \"name\": \"Gate\",\n    \"description\": \"Allows you and your animals to pass through a fence.\",\n    \"category\": \"Fences\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"325\",\n      \"name\": \"Gate\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/craftable/fences/Gate.png\"\n  },\n  {\n    \"id\": \"Hardwood Fence\",\n    \"name\": \"Hardwood Fence\",\n    \"description\": \"Extremely durable. Lasts about 505 days.\",\n    \"category\": \"Fences\",\n    \"source\": \"Farming Level 6\",\n    \"output\": {\n      \"id\": \"298\",\n      \"name\": \"Hardwood Fence\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/fences/Hardwood Fence.png\"\n  },\n  {\n    \"id\": \"Iron Fence\",\n    \"name\": \"Iron Fence\",\n    \"description\": \"Very long lasting. Lasts about 226 days.\",\n    \"category\": \"Fences\",\n    \"source\": \"Farming Level 4\",\n    \"output\": {\n      \"id\": \"324\",\n      \"name\": \"Iron Fence\",\n      \"quantity\": 10,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/fences/Iron Fence.png\"\n  },\n  {\n    \"id\": \"Stone Fence\",\n    \"name\": \"Stone Fence\",\n    \"description\": \"Longer lasting than wood. Lasts about 109 days.\",\n    \"category\": \"Fences\",\n    \"source\": \"Farming Level 2\",\n    \"output\": {\n      \"id\": \"323\",\n      \"name\": \"Stone Fence\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/craftable/fences/Stone Fence.png\"\n  },\n  {\n    \"id\": \"Wood Fence\",\n    \"name\": \"Wood Fence\",\n    \"description\": \"Contains grass and animals. Lasts about 52 days.\",\n    \"category\": \"Fences\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"322\",\n      \"name\": \"Wood Fence\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/craftable/fences/Wood Fence.png\"\n  },\n  {\n    \"id\": \"Big Chest\",\n    \"name\": \"Big Chest\",\n    \"description\": \"Store your items in this. Holds nearly twice as much as a regular chest.\",\n    \"category\": \"Storage\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"BigChest\",\n      \"name\": \"Big Chest\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 120\n      },\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/craftable/storage/Big Chest.png\"\n  },\n  {\n    \"id\": \"Big Stone Chest\",\n    \"name\": \"Big Stone Chest\",\n    \"description\": \"Store your items in this. Holds nearly twice as much as a regular stone chest.\",\n    \"category\": \"Storage\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"BigStoneChest\",\n      \"name\": \"Big Stone Chest\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 250\n      }\n    ],\n    \"image\": \"images/craftable/storage/Big Stone Chest.png\"\n  },\n  {\n    \"id\": \"Chest\",\n    \"name\": \"Chest\",\n    \"description\": \"Store your items in this.\",\n    \"category\": \"Storage\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"130\",\n      \"name\": \"Chest\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 50\n      }\n    ],\n    \"image\": \"images/craftable/storage/Chest.png\"\n  },\n  {\n    \"id\": \"Stone Chest\",\n    \"name\": \"Stone Chest\",\n    \"description\": \"Store your items in this.\",\n    \"category\": \"Storage\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"232\",\n      \"name\": \"Stone Chest\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 50\n      }\n    ],\n    \"image\": \"images/craftable/storage/Stone Chest.png\"\n  },\n  {\n    \"id\": \"Dark Sign\",\n    \"name\": \"Dark Sign\",\n    \"description\": \"Use items on this to change what's displayed.\",\n    \"category\": \"Signs\",\n    \"source\": \"Krobus (3 hearts)\",\n    \"output\": {\n      \"id\": \"39\",\n      \"name\": \"Dark Sign\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"767\",\n        \"name\": \"Bat Wing\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"881\",\n        \"name\": \"Bone Fragment\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/signs/Dark Sign.png\"\n  },\n  {\n    \"id\": \"Stone Sign\",\n    \"name\": \"Stone Sign\",\n    \"description\": \"Use items on this to change what's displayed.\",\n    \"category\": \"Signs\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"38\",\n      \"name\": \"Stone Sign\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 25\n      }\n    ],\n    \"image\": \"images/craftable/signs/Stone Sign.png\"\n  },\n  {\n    \"id\": \"Text Sign\",\n    \"name\": \"Text Sign\",\n    \"description\": \"Write a custom message on this sign.\",\n    \"category\": \"Signs\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"TextSign\",\n      \"name\": \"Text Sign\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 25\n      }\n    ],\n    \"image\": \"images/craftable/signs/Text Sign.png\"\n  },\n  {\n    \"id\": \"Wood Sign\",\n    \"name\": \"Wood Sign\",\n    \"description\": \"Use items on this to change what's displayed.\",\n    \"category\": \"Signs\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"37\",\n      \"name\": \"Wood Sign\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 25\n      }\n    ],\n    \"image\": \"images/craftable/signs/Wood Sign.png\"\n  },\n  {\n    \"id\": \"Bee House\",\n    \"name\": \"Bee House\",\n    \"description\": \"Place outside and bees will make honey for you. Honey is ready to harvest every few days. (Not during winter)\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Farming Level 3\",\n    \"output\": {\n      \"id\": \"10\",\n      \"name\": \"Bee House\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 40\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 8\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"724\",\n        \"name\": \"Maple Syrup\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Bee House.png\"\n  },\n  {\n    \"id\": \"Cask\",\n    \"name\": \"Cask\",\n    \"description\": \"Allows you to age artisan goods. Place in a cellar to use.\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"163\",\n      \"name\": \"Cask\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 20\n      },\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Cask.png\"\n  },\n  {\n    \"id\": \"Cheese Press\",\n    \"name\": \"Cheese Press\",\n    \"description\": \"Turns milk into cheese.\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Farming Level 6\",\n    \"output\": {\n      \"id\": \"16\",\n      \"name\": \"Cheese Press\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 45\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 45\n      },\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Cheese Press.png\"\n  },\n  {\n    \"id\": \"Dehydrator\",\n    \"name\": \"Dehydrator\",\n    \"description\": \"Place 5 fruit or edible mushrooms inside to dry them.\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"Dehydrator\",\n      \"name\": \"Dehydrator\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 30\n      },\n      {\n        \"id\": \"330\",\n        \"name\": \"Clay\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"82\",\n        \"name\": \"Fire Quartz\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Dehydrator.png\"\n  },\n  {\n    \"id\": \"Fish Smoker\",\n    \"name\": \"Fish Smoker\",\n    \"description\": \"Create smoked fish, worth twice as much with quality preserved.\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"FishSmoker\",\n      \"name\": \"Fish Smoker\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"SeaJelly\",\n        \"name\": \"Sea Jelly\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"RiverJelly\",\n        \"name\": \"River Jelly\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"CaveJelly\",\n        \"name\": \"Cave Jelly\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Fish Smoker.png\"\n  },\n  {\n    \"id\": \"Keg\",\n    \"name\": \"Keg\",\n    \"description\": \"Place a fruit or vegetable in here. Eventually it will turn into a beverage.\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Farming Level 8\",\n    \"output\": {\n      \"id\": \"12\",\n      \"name\": \"Keg\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 30\n      },\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"725\",\n        \"name\": \"Oak Resin\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Keg.png\"\n  },\n  {\n    \"id\": \"Loom\",\n    \"name\": \"Loom\",\n    \"description\": \"Turns raw wool into fine cloth.\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Farming Level 7\",\n    \"output\": {\n      \"id\": \"17\",\n      \"name\": \"Loom\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 60\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 30\n      },\n      {\n        \"id\": \"726\",\n        \"name\": \"Pine Tar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Loom.png\"\n  },\n  {\n    \"id\": \"Mayonnaise Machine\",\n    \"name\": \"Mayonnaise Machine\",\n    \"description\": \"Turns eggs into mayonnaise.\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Farming Level 2\",\n    \"output\": {\n      \"id\": \"24\",\n      \"name\": \"Mayonnaise Machine\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 15\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 15\n      },\n      {\n        \"id\": \"86\",\n        \"name\": \"Earth Crystal\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Mayonnaise Machine.png\"\n  },\n  {\n    \"id\": \"Oil Maker\",\n    \"name\": \"Oil Maker\",\n    \"description\": \"Produces gourmet truffle oil when given a truffle.\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Farming Level 8\",\n    \"output\": {\n      \"id\": \"19\",\n      \"name\": \"Oil Maker\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"766\",\n        \"name\": \"Slime\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 20\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Oil Maker.png\"\n  },\n  {\n    \"id\": \"Preserves Jar\",\n    \"name\": \"Preserves Jar\",\n    \"description\": \"Turns vegetables into pickles and fruit into jam.\",\n    \"category\": \"Artisan Equipment\",\n    \"source\": \"Farming Level 4\",\n    \"output\": {\n      \"id\": \"15\",\n      \"name\": \"Preserves Jar\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 40\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 8\n      }\n    ],\n    \"image\": \"images/craftable/artisan-equipment/Preserves Jar.png\"\n  },\n  {\n    \"id\": \"Bait Maker\",\n    \"name\": \"Bait Maker\",\n    \"description\": \"Place a fish inside to create targeted bait.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Fishing Level 6\",\n    \"output\": {\n      \"id\": \"BaitMaker\",\n      \"name\": \"Bait Maker\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 3\n      },\n      {\n        \"id\": \"393\",\n        \"name\": \"Coral\",\n        \"quantity\": 3\n      },\n      {\n        \"id\": \"397\",\n        \"name\": \"Sea Urchin\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Bait Maker.png\"\n  },\n  {\n    \"id\": \"Bone Mill\",\n    \"name\": \"Bone Mill\",\n    \"description\": \"Converts bone items into fertilizer.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"90\",\n      \"name\": \"Bone Mill\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"881\",\n        \"name\": \"Bone Fragment\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"330\",\n        \"name\": \"Clay\",\n        \"quantity\": 3\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 20\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Bone Mill.png\"\n  },\n  {\n    \"id\": \"Charcoal Kiln\",\n    \"name\": \"Charcoal Kiln\",\n    \"description\": \"Turns 10 pieces of wood into 1 piece of coal.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Foraging Level 2\",\n    \"output\": {\n      \"id\": \"114\",\n      \"name\": \"Charcoal Kiln\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 20\n      },\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Charcoal Kiln.png\"\n  },\n  {\n    \"id\": \"Crystalarium\",\n    \"name\": \"Crystalarium\",\n    \"description\": \"Insert a gem inside and it will grow copies of that gem.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Mining Level 9\",\n    \"output\": {\n      \"id\": \"21\",\n      \"name\": \"Crystalarium\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 99\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"337\",\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"787\",\n        \"name\": \"Battery Pack\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Crystalarium.png\"\n  },\n  {\n    \"id\": \"Deluxe Worm Bin\",\n    \"name\": \"Deluxe Worm Bin\",\n    \"description\": \"Produces Deluxe Bait regularly. Worms are self-sufficient.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Fishing Level 8\",\n    \"output\": {\n      \"id\": \"DeluxeWormBin\",\n      \"name\": \"Deluxe Worm Bin\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"(BC)154\",\n        \"name\": \"Worm Bin\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"Moss\",\n        \"name\": \"Moss\",\n        \"quantity\": 30\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Deluxe Worm Bin.png\"\n  },\n  {\n    \"id\": \"Furnace\",\n    \"name\": \"Furnace\",\n    \"description\": \"Converts ore and coal into metal bars.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Mining Level 2\",\n    \"output\": {\n      \"id\": \"13\",\n      \"name\": \"Furnace\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"378\",\n        \"name\": \"Copper Ore\",\n        \"quantity\": 20\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 25\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Furnace.png\"\n  },\n  {\n    \"id\": \"Geode Crusher\",\n    \"name\": \"Geode Crusher\",\n    \"description\": \"Automatically breaks open geodes when supplied with coal.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"182\",\n      \"name\": \"Geode Crusher\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"72\",\n        \"name\": \"Diamond\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Geode Crusher.png\"\n  },\n  {\n    \"id\": \"Heavy Furnace\",\n    \"name\": \"Heavy Furnace\",\n    \"description\": \"Converts ore and coal into metal bars. Requires more ore but less coal per use.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Mining Level 2\",\n    \"output\": {\n      \"id\": \"HeavyFurnace\",\n      \"name\": \"Heavy Furnace\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"(BC)13\",\n        \"name\": \"Furnace\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 3\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 50\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Heavy Furnace.png\"\n  },\n  {\n    \"id\": \"Heavy Tapper\",\n    \"name\": \"Heavy Tapper\",\n    \"description\": \"Place on a tree. Works twice as fast as a tapper.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"264\",\n      \"name\": \"Heavy Tapper\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 30\n      },\n      {\n        \"id\": \"910\",\n        \"name\": \"Radioactive Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Heavy Tapper.png\"\n  },\n  {\n    \"id\": \"Lightning Rod\",\n    \"name\": \"Lightning Rod\",\n    \"description\": \"Collects energy during lightning storms and turns it into battery packs.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Foraging Level 6\",\n    \"output\": {\n      \"id\": \"9\",\n      \"name\": \"Lightning Rod\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"338\",\n        \"name\": \"Refined Quartz\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"767\",\n        \"name\": \"Bat Wing\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Lightning Rod.png\"\n  },\n  {\n    \"id\": \"Mushroom Log\",\n    \"name\": \"Mushroom Log\",\n    \"description\": \"Grows mushrooms regularly. Better output when placed near wild trees.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Foraging Level 4\",\n    \"output\": {\n      \"id\": \"MushroomLog\",\n      \"name\": \"Mushroom Log\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"Moss\",\n        \"name\": \"Moss\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Mushroom Log.png\"\n  },\n  {\n    \"id\": \"Ostrich Incubator\",\n    \"name\": \"Ostrich Incubator\",\n    \"description\": \"Hatches ostrich eggs into baby ostriches. Place in a barn.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"254\",\n      \"name\": \"Ostrich Incubator\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"881\",\n        \"name\": \"Bone Fragment\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"848\",\n        \"name\": \"Cinder Shard\",\n        \"quantity\": 20\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Ostrich Incubator.png\"\n  },\n  {\n    \"id\": \"Recycling Machine\",\n    \"name\": \"Recycling Machine\",\n    \"description\": \"Turns fishing trash into resources.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Fishing Level 4\",\n    \"output\": {\n      \"id\": \"20\",\n      \"name\": \"Recycling Machine\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 25\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 25\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Recycling Machine.png\"\n  },\n  {\n    \"id\": \"Seed Maker\",\n    \"name\": \"Seed Maker\",\n    \"description\": \"Produces seeds from crops. Core crops have a chance to give 1-3 seeds.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Farming Level 9\",\n    \"output\": {\n      \"id\": \"25\",\n      \"name\": \"Seed Maker\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 25\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Seed Maker.png\"\n  },\n  {\n    \"id\": \"Slime Egg-Press\",\n    \"name\": \"Slime Egg-Press\",\n    \"description\": \"Compresses 100 slimes into a slime egg.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Combat Level 6\",\n    \"output\": {\n      \"id\": \"158\",\n      \"name\": \"Slime Egg-Press\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 25\n      },\n      {\n        \"id\": \"82\",\n        \"name\": \"Fire Quartz\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"787\",\n        \"name\": \"Battery Pack\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Slime Egg-Press.png\"\n  },\n  {\n    \"id\": \"Slime Incubator\",\n    \"name\": \"Slime Incubator\",\n    \"description\": \"Hatches slime eggs into slimes. You can raise them in a slime hutch.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Combat Level 8\",\n    \"output\": {\n      \"id\": \"156\",\n      \"name\": \"Slime Incubator\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"337\",\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"766\",\n        \"name\": \"Slime\",\n        \"quantity\": 100\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Slime Incubator.png\"\n  },\n  {\n    \"id\": \"Tapper\",\n    \"name\": \"Tapper\",\n    \"description\": \"Place on a tree and wait for the reservoir to fill with product.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Foraging Level 4\",\n    \"output\": {\n      \"id\": \"105\",\n      \"name\": \"Tapper\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 40\n      },\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Tapper.png\"\n  },\n  {\n    \"id\": \"Worm Bin\",\n    \"name\": \"Worm Bin\",\n    \"description\": \"Produces bait regularly. Worms are self-sufficient.\",\n    \"category\": \"Refining Equipment\",\n    \"source\": \"Fishing Level 4\",\n    \"output\": {\n      \"id\": \"154\",\n      \"name\": \"Worm Bin\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 15\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 50\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Worm Bin.png\"\n  },\n  {\n    \"id\": \"Iridium Sprinkler\",\n    \"name\": \"Iridium Sprinkler\",\n    \"description\": \"Waters the 24 adjacent tiles every morning.\",\n    \"category\": \"Sprinklers\",\n    \"source\": \"Farming Level 9\",\n    \"output\": {\n      \"id\": \"645\",\n      \"name\": \"Iridium Sprinkler\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"337\",\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"787\",\n        \"name\": \"Battery Pack\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/sprinklers/Iridium Sprinkler.png\"\n  },\n  {\n    \"id\": \"Quality Sprinkler\",\n    \"name\": \"Quality Sprinkler\",\n    \"description\": \"Waters the 8 adjacent tiles every morning.\",\n    \"category\": \"Sprinklers\",\n    \"source\": \"Farming Level 6\",\n    \"output\": {\n      \"id\": \"621\",\n      \"name\": \"Quality Sprinkler\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"338\",\n        \"name\": \"Refined Quartz\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/sprinklers/Quality Sprinkler.png\"\n  },\n  {\n    \"id\": \"Sprinkler\",\n    \"name\": \"Sprinkler\",\n    \"description\": \"Waters the 4 adjacent tiles every morning.\",\n    \"category\": \"Sprinklers\",\n    \"source\": \"Farming Level 2\",\n    \"output\": {\n      \"id\": \"599\",\n      \"name\": \"Sprinkler\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/sprinklers/Sprinkler.png\"\n  },\n  {\n    \"id\": \"Barrel Brazier\",\n    \"name\": \"Barrel Brazier\",\n    \"description\": \"Provides a moderate amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"150\",\n      \"name\": \"Barrel Brazier\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"768\",\n        \"name\": \"Solar Essence\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Barrel Brazier.png\"\n  },\n  {\n    \"id\": \"Campfire\",\n    \"name\": \"Campfire\",\n    \"description\": \"Provides a moderate amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"146\",\n      \"name\": \"Campfire\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Campfire.png\"\n  },\n  {\n    \"id\": \"Carved Brazier\",\n    \"name\": \"Carved Brazier\",\n    \"description\": \"Provides a moderate amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"148\",\n      \"name\": \"Carved Brazier\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Carved Brazier.png\"\n  },\n  {\n    \"id\": \"Gold Brazier\",\n    \"name\": \"Gold Brazier\",\n    \"description\": \"Provides a moderate amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"145\",\n      \"name\": \"Gold Brazier\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Gold Brazier.png\"\n  },\n  {\n    \"id\": \"Iron Lamp-post\",\n    \"name\": \"Iron Lamp-post\",\n    \"description\": \"Provides a good amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"153\",\n      \"name\": \"Iron Lamp-post\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"787\",\n        \"name\": \"Battery Pack\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Iron Lamp-post.png\"\n  },\n  {\n    \"id\": \"Jack-O-Lantern\",\n    \"name\": \"Jack-O-Lantern\",\n    \"description\": \"A whimsical fall decoration.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"746\",\n      \"name\": \"Jack-O-Lantern\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"276\",\n        \"name\": \"Pumpkin\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"93\",\n        \"name\": \"Torch\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Jack-O-Lantern.png\"\n  },\n  {\n    \"id\": \"Marble Brazier\",\n    \"name\": \"Marble Brazier\",\n    \"description\": \"Provides a moderate amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"151\",\n      \"name\": \"Marble Brazier\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"567\",\n        \"name\": \"Marble\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"62\",\n        \"name\": \"Aquamarine\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 100\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Marble Brazier.png\"\n  },\n  {\n    \"id\": \"Skull Brazier\",\n    \"name\": \"Skull Brazier\",\n    \"description\": \"Provides a moderate amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"149\",\n      \"name\": \"Skull Brazier\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"881\",\n        \"name\": \"Bone Fragment\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Skull Brazier.png\"\n  },\n  {\n    \"id\": \"Stone Brazier\",\n    \"name\": \"Stone Brazier\",\n    \"description\": \"Provides a moderate amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"144\",\n      \"name\": \"Stone Brazier\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Stone Brazier.png\"\n  },\n  {\n    \"id\": \"Stump Brazier\",\n    \"name\": \"Stump Brazier\",\n    \"description\": \"Provides a moderate amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"147\",\n      \"name\": \"Stump Brazier\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Stump Brazier.png\"\n  },\n  {\n    \"id\": \"Torch\",\n    \"name\": \"Torch\",\n    \"description\": \"Provides a little bit of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"93\",\n      \"name\": \"Torch\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Torch.png\"\n  },\n  {\n    \"id\": \"Wood Lamp-post\",\n    \"name\": \"Wood Lamp-post\",\n    \"description\": \"Provides a good amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"152\",\n      \"name\": \"Wood Lamp-post\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"787\",\n        \"name\": \"Battery Pack\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Wood Lamp-post.png\"\n  },\n  {\n    \"id\": \"Wooden Brazier\",\n    \"name\": \"Wooden Brazier\",\n    \"description\": \"Provides a moderate amount of light.\",\n    \"category\": \"Lighting\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"143\",\n      \"name\": \"Wooden Brazier\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/lighting/Wooden Brazier.png\"\n  },\n  {\n    \"id\": \"Deluxe Scarecrow\",\n    \"name\": \"Deluxe Scarecrow\",\n    \"description\": \"Prevents crows from attacking your crops. Has a large radius (about 16 \\\"tiles\\\").\",\n    \"category\": \"Farming\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"167\",\n      \"name\": \"Deluxe Scarecrow\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"386\",\n        \"name\": \"Iridium Ore\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 40\n      }\n    ],\n    \"image\": \"images/scarecrows/Deluxe Scarecrow.png\"\n  },\n  {\n    \"id\": \"Garden Pot\",\n    \"name\": \"Garden Pot\",\n    \"description\": \"You can grow crops from any season in this. Place it indoors or outdoors.\",\n    \"category\": \"Farming\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"62\",\n      \"name\": \"Garden Pot\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"330\",\n        \"name\": \"Clay\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"338\",\n        \"name\": \"Refined Quartz\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/misc/Garden Pot.png\"\n  },\n  {\n    \"id\": \"Hopper\",\n    \"name\": \"Hopper\",\n    \"description\": \"Items placed inside will automatically be loaded into the machine in front of it.\",\n    \"category\": \"Farming\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"275\",\n      \"name\": \"Hopper\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"337\",\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"910\",\n        \"name\": \"Radioactive Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/misc/Hopper.png\"\n  },\n  {\n    \"id\": \"Scarecrow\",\n    \"name\": \"Scarecrow\",\n    \"description\": \"Prevents crows from attacking your crops. Has a limited radius (about 8 \\\"tiles\\\").\",\n    \"category\": \"Farming\",\n    \"source\": \"Farming Level 1\",\n    \"output\": {\n      \"id\": \"8\",\n      \"name\": \"Scarecrow\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 20\n      }\n    ],\n    \"image\": \"images/scarecrows/Scarecrow.png\"\n  },\n  {\n    \"id\": \"Tub o' Flowers\",\n    \"name\": \"Tub o' Flowers\",\n    \"description\": \"Plant it outside in spring or summer for a beautiful bouquet of flowers.\",\n    \"category\": \"Decor\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"108\",\n      \"name\": \"Tub o' Flowers\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 15\n      },\n      {\n        \"id\": \"427\",\n        \"name\": \"Tulip Bulb\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"429\",\n        \"name\": \"Jazz Seeds\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"453\",\n        \"name\": \"Poppy Seeds\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"455\",\n        \"name\": \"Spangle Seeds\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/furniture/Tub o' Flowers.png\"\n  },\n  {\n    \"id\": \"Wicked Statue\",\n    \"name\": \"Wicked Statue\",\n    \"description\": \"The statue smiles at you.\",\n    \"category\": \"Decor\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"83\",\n      \"name\": \"Wicked Statue\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 25\n      }\n    ],\n    \"image\": \"images/craftable/furniture/Wicked Statue.png\"\n  },\n  {\n    \"id\": \"Drum Block\",\n    \"name\": \"Drum Block\",\n    \"description\": \"Plays a drum note when you walk past.\",\n    \"category\": \"Instruments\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"463\",\n      \"name\": \"Drum Block\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"378\",\n        \"name\": \"Copper Ore\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 20\n      }\n    ],\n    \"image\": \"images/craftable/furniture/Drum Block.png\"\n  },\n  {\n    \"id\": \"Flute Block\",\n    \"name\": \"Flute Block\",\n    \"description\": \"Plays a flute note when you walk past.\",\n    \"category\": \"Instruments\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"464\",\n      \"name\": \"Flute Block\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"378\",\n        \"name\": \"Copper Ore\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 20\n      }\n    ],\n    \"image\": \"images/craftable/furniture/Flute Block.png\"\n  },\n  {\n    \"id\": \"Glowstone Ring\",\n    \"name\": \"Glowstone Ring\",\n    \"description\": \"Emits a constant light and increases your radius for collecting items.\",\n    \"category\": \"Rings\",\n    \"source\": \"Mining Level 4\",\n    \"output\": {\n      \"id\": \"888\",\n      \"name\": \"Glowstone Ring\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"768\",\n        \"name\": \"Solar Essence\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/rings/Glowstone Ring.png\"\n  },\n  {\n    \"id\": \"Iridium Band\",\n    \"name\": \"Iridium Band\",\n    \"description\": \"Glows, attracts items, and increases damage by 10%.\",\n    \"category\": \"Rings\",\n    \"source\": \"Combat Level 9\",\n    \"output\": {\n      \"id\": \"527\",\n      \"name\": \"Iridium Band\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"337\",\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"768\",\n        \"name\": \"Solar Essence\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"769\",\n        \"name\": \"Void Essence\",\n        \"quantity\": 50\n      }\n    ],\n    \"image\": \"images/rings/Iridium Band.png\"\n  },\n  {\n    \"id\": \"Ring of Yoba\",\n    \"name\": \"Ring of Yoba\",\n    \"description\": \"Occasionally shields the wearer from damage.\",\n    \"category\": \"Rings\",\n    \"source\": \"Combat Level 7\",\n    \"output\": {\n      \"id\": \"524\",\n      \"name\": \"Ring of Yoba\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"72\",\n        \"name\": \"Diamond\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/rings/Ring of Yoba.png\"\n  },\n  {\n    \"id\": \"Sturdy Ring\",\n    \"name\": \"Sturdy Ring\",\n    \"description\": \"Cuts the duration of negative status effects in half.\",\n    \"category\": \"Rings\",\n    \"source\": \"Combat Level 1\",\n    \"output\": {\n      \"id\": \"525\",\n      \"name\": \"Sturdy Ring\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"684\",\n        \"name\": \"Bug Meat\",\n        \"quantity\": 25\n      },\n      {\n        \"id\": \"766\",\n        \"name\": \"Slime\",\n        \"quantity\": 25\n      }\n    ],\n    \"image\": \"images/rings/Sturdy Ring.png\"\n  },\n  {\n    \"id\": \"Thorns Ring\",\n    \"name\": \"Thorns Ring\",\n    \"description\": \"When an enemy injures you, they will take 1/3 of the damage they caused.\",\n    \"category\": \"Rings\",\n    \"source\": \"Combat Level 7\",\n    \"output\": {\n      \"id\": \"839\",\n      \"name\": \"Thorns Ring\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"881\",\n        \"name\": \"Bone Fragment\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/rings/Thorns Ring.png\"\n  },\n  {\n    \"id\": \"Warrior Ring\",\n    \"name\": \"Warrior Ring\",\n    \"description\": \"Occasionally infuses the wearer with \\\"warrior energy\\\" after slaying a monster.\",\n    \"category\": \"Rings\",\n    \"source\": \"Combat Level 4\",\n    \"output\": {\n      \"id\": \"521\",\n      \"name\": \"Warrior Ring\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 25\n      },\n      {\n        \"id\": \"84\",\n        \"name\": \"Frozen Tear\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/rings/Warrior Ring.png\"\n  },\n  {\n    \"id\": \"Wedding Ring\",\n    \"name\": \"Wedding Ring\",\n    \"description\": \"Give this to another player to propose marriage.\",\n    \"category\": \"Rings\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"801\",\n      \"name\": \"Wedding Ring\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"337\",\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"74\",\n        \"name\": \"Prismatic Shard\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/rings/Wedding Ring.png\"\n  },\n  {\n    \"id\": \"Bait\",\n    \"name\": \"Bait\",\n    \"description\": \"Causes fish to bite faster. Must be attached to a fishing rod. (+5)\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 2\",\n    \"output\": {\n      \"id\": \"685\",\n      \"name\": \"Bait\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"684\",\n        \"name\": \"Bug Meat\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/fish/bait/Bait.png\"\n  },\n  {\n    \"id\": \"Barbed Hook\",\n    \"name\": \"Barbed Hook\",\n    \"description\": \"Makes your catch more secure, causing the \\\"fishing bar\\\" to cling to your fish. Works best on slow, weak fish.\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 8\",\n    \"output\": {\n      \"id\": \"691\",\n      \"name\": \"Barbed Hook\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/fish/tackle/Barbed Hook.png\"\n  },\n  {\n    \"id\": \"Challenge Bait\",\n    \"name\": \"Challenge Bait\",\n    \"description\": \"A perfect catch triples the fish caught, but any escape removes one. (+5)\",\n    \"category\": \"Fishing\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"ChallengeBait\",\n      \"name\": \"Challenge Bait\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"881\",\n        \"name\": \"Bone Fragment\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"Moss\",\n        \"name\": \"Moss\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/fish/bait/Challenge Bait.png\"\n  },\n  {\n    \"id\": \"Cork Bobber\",\n    \"name\": \"Cork Bobber\",\n    \"description\": \"Slightly increases the size of your \\\"fishing bar\\\".\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 7\",\n    \"output\": {\n      \"id\": \"695\",\n      \"name\": \"Cork Bobber\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"766\",\n        \"name\": \"Slime\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/fish/tackle/Cork Bobber.png\"\n  },\n  {\n    \"id\": \"Crab Pot\",\n    \"name\": \"Crab Pot\",\n    \"description\": \"Place it in the water, load it with bait, and check the next day.\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 3\",\n    \"output\": {\n      \"id\": \"710\",\n      \"name\": \"Crab Pot\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 40\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 3\n      }\n    ],\n    \"image\": \"images/craftable/fishing/Crab Pot.png\"\n  },\n  {\n    \"id\": \"Deluxe Bait\",\n    \"name\": \"Deluxe Bait\",\n    \"description\": \"Fish bite faster and you'll rarely miss a catch. Also slightly increases the size of the fishing bar. (+5)\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 4\",\n    \"output\": {\n      \"id\": \"DeluxeBait\",\n      \"name\": \"Deluxe Bait\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"685\",\n        \"name\": \"Bait\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"Moss\",\n        \"name\": \"Moss\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/fish/bait/Deluxe Bait.png\"\n  },\n  {\n    \"id\": \"Dressed Spinner\",\n    \"name\": \"Dressed Spinner\",\n    \"description\": \"The attractive lure creates a lot of vibration and movement. Increases the bite-rate when fishing.\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 8\",\n    \"output\": {\n      \"id\": \"687\",\n      \"name\": \"Dressed Spinner\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"428\",\n        \"name\": \"Cloth\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/fish/tackle/Dressed Spinner.png\"\n  },\n  {\n    \"id\": \"Magic Bait\",\n    \"name\": \"Magic Bait\",\n    \"description\": \"Allows you to catch fish from any location, season, or weather. (+5)\",\n    \"category\": \"Fishing\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"908\",\n      \"name\": \"Magic Bait\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"909\",\n        \"name\": \"Radioactive Ore\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"684\",\n        \"name\": \"Bug Meat\",\n        \"quantity\": 3\n      }\n    ],\n    \"image\": \"images/fish/bait/Magic Bait.png\"\n  },\n  {\n    \"id\": \"Magnet\",\n    \"name\": \"Magnet\",\n    \"description\": \"Increases the chance of finding treasure while fishing, but fish aren't as attracted to it. (+3)\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 9\",\n    \"output\": {\n      \"id\": \"703\",\n      \"name\": \"Magnet\",\n      \"quantity\": 3,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/fish/bait/Magnet.png\"\n  },\n  {\n    \"id\": \"Quality Bobber\",\n    \"name\": \"Quality Bobber\",\n    \"description\": \"Increases the quality of caught fish.\",\n    \"category\": \"Fishing\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"877\",\n      \"name\": \"Quality Bobber\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\",\n        \"quantity\": 20\n      },\n      {\n        \"id\": \"768\",\n        \"name\": \"Solar Essence\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/fish/tackle/Quality Bobber.png\"\n  },\n  {\n    \"id\": \"Sonar Bobber\",\n    \"name\": \"Sonar Bobber\",\n    \"description\": \"Allows you to see which fish is biting before you catch it.\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 6\",\n    \"output\": {\n      \"id\": \"SonarBobber\",\n      \"name\": \"Sonar Bobber\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"338\",\n        \"name\": \"Refined Quartz\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/fish/tackle/Sonar Bobber.png\"\n  },\n  {\n    \"id\": \"Spinner\",\n    \"name\": \"Spinner\",\n    \"description\": \"The rotating lure creates a lot of vibration and movement. Slightly increases bite-rate when fishing.\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 6\",\n    \"output\": {\n      \"id\": \"686\",\n      \"name\": \"Spinner\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/fish/tackle/Spinner.png\"\n  },\n  {\n    \"id\": \"Trap Bobber\",\n    \"name\": \"Trap Bobber\",\n    \"description\": \"Causes fish to escape slower when you aren't reeling them in.\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 6\",\n    \"output\": {\n      \"id\": \"694\",\n      \"name\": \"Trap Bobber\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/fish/tackle/Trap Bobber.png\"\n  },\n  {\n    \"id\": \"Treasure Hunter\",\n    \"name\": \"Treasure Hunter\",\n    \"description\": \"Fish don't escape while you're collecting treasure.\",\n    \"category\": \"Fishing\",\n    \"source\": \"Fishing Level 7\",\n    \"output\": {\n      \"id\": \"693\",\n      \"name\": \"Treasure Hunter\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/fish/tackle/Treasure Hunter.png\"\n  },\n  {\n    \"id\": \"Wild Bait\",\n    \"name\": \"Wild Bait\",\n    \"description\": \"A special bait that appeals to all fish. With this bait, you have a chance of catching 2 fish at once. (+5)\",\n    \"category\": \"Fishing\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"774\",\n      \"name\": \"Wild Bait\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"684\",\n        \"name\": \"Bug Meat\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"766\",\n        \"name\": \"Slime\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/fish/bait/Wild Bait.png\"\n  },\n  {\n    \"id\": \"Brick Floor\",\n    \"name\": \"Brick Floor\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Flooring\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"293\",\n      \"name\": \"Brick Floor\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"330\",\n        \"name\": \"Clay\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/decor/Brick Floor.png\"\n  },\n  {\n    \"id\": \"Crystal Floor\",\n    \"name\": \"Crystal Floor\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Flooring\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"333\",\n      \"name\": \"Crystal Floor\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"338\",\n        \"name\": \"Refined Quartz\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Crystal Floor.png\"\n  },\n  {\n    \"id\": \"Rustic Plank Floor\",\n    \"name\": \"Rustic Plank Floor\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Flooring\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"840\",\n      \"name\": \"Rustic Plank Floor\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Rustic Plank Floor.png\"\n  },\n  {\n    \"id\": \"Stone Floor\",\n    \"name\": \"Stone Floor\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Flooring\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"329\",\n      \"name\": \"Stone Floor\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Stone Floor.png\"\n  },\n  {\n    \"id\": \"Stone Walkway Floor\",\n    \"name\": \"Stone Walkway Floor\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Flooring\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"841\",\n      \"name\": \"Stone Walkway Floor\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Stone Walkway Floor.png\"\n  },\n  {\n    \"id\": \"Straw Floor\",\n    \"name\": \"Straw Floor\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Flooring\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"401\",\n      \"name\": \"Straw Floor\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Straw Floor.png\"\n  },\n  {\n    \"id\": \"Weathered Floor\",\n    \"name\": \"Weathered Floor\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Flooring\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"331\",\n      \"name\": \"Weathered Floor\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Weathered Floor.png\"\n  },\n  {\n    \"id\": \"Wood Floor\",\n    \"name\": \"Wood Floor\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Flooring\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"328\",\n      \"name\": \"Wood Floor\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Wood Floor.png\"\n  },\n  {\n    \"id\": \"Cobblestone Path\",\n    \"name\": \"Cobblestone Path\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Paths\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"411\",\n      \"name\": \"Cobblestone Path\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Cobblestone Path.png\"\n  },\n  {\n    \"id\": \"Crystal Path\",\n    \"name\": \"Crystal Path\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Paths\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"409\",\n      \"name\": \"Crystal Path\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"338\",\n        \"name\": \"Refined Quartz\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Crystal Path.png\"\n  },\n  {\n    \"id\": \"Gravel Path\",\n    \"name\": \"Gravel Path\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Paths\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"407\",\n      \"name\": \"Gravel Path\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Gravel Path.png\"\n  },\n  {\n    \"id\": \"Stepping Stone Path\",\n    \"name\": \"Stepping Stone Path\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Paths\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"415\",\n      \"name\": \"Stepping Stone Path\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Stepping Stone Path.png\"\n  },\n  {\n    \"id\": \"Wood Path\",\n    \"name\": \"Wood Path\",\n    \"description\": \"Use this to make a path or to decorate your floors.\",\n    \"category\": \"Paths\",\n    \"source\": \"Starter\",\n    \"output\": {\n      \"id\": \"405\",\n      \"name\": \"Wood Path\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/decor/Wood Path.png\"\n  },\n  {\n    \"id\": \"Ancient Seeds\",\n    \"name\": \"Ancient Seeds\",\n    \"description\": \"Plant these in Spring, Summer, or Fall. Takes 28 days to mature, and produces fruit every 7 days.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"499\",\n      \"name\": \"Ancient Seeds\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"114\",\n        \"name\": \"Ancient Seed\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/seeds/Ancient Seeds.png\"\n  },\n  {\n    \"id\": \"Basic Fertilizer\",\n    \"name\": \"Basic Fertilizer\",\n    \"description\": \"Improves soil quality, increasing your chance of producing quality crops. Mix into tilled soil.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Farming Level 1\",\n    \"output\": {\n      \"id\": \"368\",\n      \"name\": \"Basic Fertilizer\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Basic Fertilizer.png\"\n  },\n  {\n    \"id\": \"Basic Retaining Soil\",\n    \"name\": \"Basic Retaining Soil\",\n    \"description\": \"This soil has a chance of staying watered overnight. Mix into tilled soil.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Farming Level 4\",\n    \"output\": {\n      \"id\": \"370\",\n      \"name\": \"Basic Retaining Soil\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Basic Retaining Soil.png\"\n  },\n  {\n    \"id\": \"Blue Grass Starter\",\n    \"name\": \"Blue Grass Starter\",\n    \"description\": \"Grows into a patch of blue grass when placed on the farm.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"BlueGrassStarter\",\n      \"name\": \"Blue Grass Starter\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 25\n      },\n      {\n        \"id\": \"Moss\",\n        \"name\": \"Moss\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"MysticSyrup\",\n        \"name\": \"Mystic Syrup\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/seeds/Blue Grass Starter.png\"\n  },\n  {\n    \"id\": \"Deluxe Fertilizer\",\n    \"name\": \"Deluxe Fertilizer\",\n    \"description\": \"Greatly improves soil quality. Mix into tilled soil.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"919\",\n      \"name\": \"Deluxe Fertilizer\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"337\",\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\",\n        \"quantity\": 40\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Deluxe Fertilizer.png\"\n  },\n  {\n    \"id\": \"Deluxe Retaining Soil\",\n    \"name\": \"Deluxe Retaining Soil\",\n    \"description\": \"This soil will stay watered overnight. Mix into tilled soil.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"920\",\n      \"name\": \"Deluxe Retaining Soil\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 3\n      },\n      {\n        \"id\": \"330\",\n        \"name\": \"Clay\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Deluxe Retaining Soil.png\"\n  },\n  {\n    \"id\": \"Deluxe Speed-Gro\",\n    \"name\": \"Deluxe Speed-Gro\",\n    \"description\": \"Stimulates leaf production. Guaranteed to increase growth rate by at least 25%. Mix into tilled soil before planting.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Farming Level 8\",\n    \"output\": {\n      \"id\": \"466\",\n      \"name\": \"Deluxe Speed-Gro\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"725\",\n        \"name\": \"Oak Resin\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"881\",\n        \"name\": \"Bone Fragment\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Deluxe Speed-Gro.png\"\n  },\n  {\n    \"id\": \"Fiber Seeds\",\n    \"name\": \"Fiber Seeds\",\n    \"description\": \"Plant these in any season. They don't need water.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"885\",\n      \"name\": \"Fiber Seeds\",\n      \"quantity\": 4,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"770\",\n        \"name\": \"Mixed Seeds\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"330\",\n        \"name\": \"Clay\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/seeds/Fiber Seeds.png\"\n  },\n  {\n    \"id\": \"Grass Starter\",\n    \"name\": \"Grass Starter\",\n    \"description\": \"Grows into a patch of grass when placed on the farm.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"297\",\n      \"name\": \"Grass Starter\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/craftable/seeds/Grass Starter.png\"\n  },\n  {\n    \"id\": \"Hyper Speed-Gro\",\n    \"name\": \"Hyper Speed-Gro\",\n    \"description\": \"Stimulates leaf production. Guaranteed to increase growth rate by at least 33%. Mix into tilled soil before planting.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"918\",\n      \"name\": \"Hyper Speed-Gro\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"909\",\n        \"name\": \"Radioactive Ore\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"881\",\n        \"name\": \"Bone Fragment\",\n        \"quantity\": 3\n      },\n      {\n        \"id\": \"768\",\n        \"name\": \"Solar Essence\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Hyper Speed-Gro.png\"\n  },\n  {\n    \"id\": \"Mystic Tree Seed\",\n    \"name\": \"Mystic Tree Seed\",\n    \"description\": \"Plant this to grow a mystic tree.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"MysticTreeSeed\",\n      \"name\": \"Mystic Tree Seed\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"309\",\n        \"name\": \"Acorn\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"310\",\n        \"name\": \"Maple Seed\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"311\",\n        \"name\": \"Pine Cone\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"292\",\n        \"name\": \"Mahogany Seed\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/seeds/Mystic Tree Seed.png\"\n  },\n  {\n    \"id\": \"Quality Fertilizer\",\n    \"name\": \"Quality Fertilizer\",\n    \"description\": \"Improves soil quality greatly, increasing your chance of producing quality crops. Mix into tilled soil.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Farming Level 9\",\n    \"output\": {\n      \"id\": \"369\",\n      \"name\": \"Quality Fertilizer\",\n      \"quantity\": 2,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\",\n        \"quantity\": 4\n      },\n      {\n        \"id\": \"-4\",\n        \"name\": \"Any Fish\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Quality Fertilizer.png\"\n  },\n  {\n    \"id\": \"Quality Retaining Soil\",\n    \"name\": \"Quality Retaining Soil\",\n    \"description\": \"This soil has a good chance of staying watered overnight. Mix into tilled soil.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Farming Level 7\",\n    \"output\": {\n      \"id\": \"371\",\n      \"name\": \"Quality Retaining Soil\",\n      \"quantity\": 2,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 3\n      },\n      {\n        \"id\": \"330\",\n        \"name\": \"Clay\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Quality Retaining Soil.png\"\n  },\n  {\n    \"id\": \"Speed-Gro\",\n    \"name\": \"Speed-Gro\",\n    \"description\": \"Stimulates leaf production. Guaranteed to increase growth rate by at least 10%. Mix into tilled soil before planting.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Farming Level 3\",\n    \"output\": {\n      \"id\": \"465\",\n      \"name\": \"Speed-Gro\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"726\",\n        \"name\": \"Pine Tar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"Moss\",\n        \"name\": \"Moss\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Speed-Gro.png\"\n  },\n  {\n    \"id\": \"Tea Sapling\",\n    \"name\": \"Tea Sapling\",\n    \"description\": \"Takes 20 days to mature, after which it produces tea leaves during the last week of each season (except winter).\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"251\",\n      \"name\": \"Tea Sapling\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"-777\",\n        \"name\": \"Mixed Seeds\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/crops/tea-leaves/seed.png\"\n  },\n  {\n    \"id\": \"Tree Fertilizer\",\n    \"name\": \"Tree Fertilizer\",\n    \"description\": \"Speeds up the growth of wild trees. Spread on a young tree.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Foraging Level 7\",\n    \"output\": {\n      \"id\": \"805\",\n      \"name\": \"Tree Fertilizer\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/fertilizer/Tree Fertilizer.png\"\n  },\n  {\n    \"id\": \"Wild Seeds (Fa)\",\n    \"name\": \"Wild Seeds (Fa)\",\n    \"description\": \"An assortment of wild Fall seeds. Plant these in Fall.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Foraging Level 6\",\n    \"output\": {\n      \"id\": \"497\",\n      \"name\": \"Fall Seeds\",\n      \"quantity\": 10,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"404\",\n        \"name\": \"Common Mushroom\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"406\",\n        \"name\": \"Wild Plum\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"408\",\n        \"name\": \"Hazelnut\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"410\",\n        \"name\": \"Blackberry\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/seeds/Fall Seeds.png\"\n  },\n  {\n    \"id\": \"Wild Seeds (Sp)\",\n    \"name\": \"Wild Seeds (Sp)\",\n    \"description\": \"An assortment of wild Spring seeds. Plant these in Spring.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Foraging Level 1\",\n    \"output\": {\n      \"id\": \"495\",\n      \"name\": \"Spring Seeds\",\n      \"quantity\": 10,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"16\",\n        \"name\": \"Wild Horseradish\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"18\",\n        \"name\": \"Daffodil\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"20\",\n        \"name\": \"Leek\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"22\",\n        \"name\": \"Dandelion\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/seeds/Spring Seeds.png\"\n  },\n  {\n    \"id\": \"Wild Seeds (Su)\",\n    \"name\": \"Wild Seeds (Su)\",\n    \"description\": \"An assortment of wild Summer seeds. Plant these in Summer.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Foraging Level 4\",\n    \"output\": {\n      \"id\": \"496\",\n      \"name\": \"Summer Seeds\",\n      \"quantity\": 10,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"396\",\n        \"name\": \"Spice Berry\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"398\",\n        \"name\": \"Grape\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"402\",\n        \"name\": \"Sweet Pea\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/seeds/Summer Seeds.png\"\n  },\n  {\n    \"id\": \"Wild Seeds (Wi)\",\n    \"name\": \"Wild Seeds (Wi)\",\n    \"description\": \"An assortment of wild Winter seeds. Plant these in Winter.\",\n    \"category\": \"Seeds & Fertilizer\",\n    \"source\": \"Foraging Level 7\",\n    \"output\": {\n      \"id\": \"498\",\n      \"name\": \"Winter Seeds\",\n      \"quantity\": 10,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"412\",\n        \"name\": \"Winter Root\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"414\",\n        \"name\": \"Crystal Fruit\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"416\",\n        \"name\": \"Snow Yam\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"418\",\n        \"name\": \"Crocus\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/seeds/Winter Seeds.png\"\n  },\n  {\n    \"id\": \"Cookout Kit\",\n    \"name\": \"Cookout Kit\",\n    \"description\": \"Use this to create a cooking campfire, allowing you to cook on-the-go!\",\n    \"category\": \"Totems\",\n    \"source\": \"Foraging Level 3\",\n    \"output\": {\n      \"id\": \"926\",\n      \"name\": \"Cookout Kit\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\",\n        \"quantity\": 15\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 3\n      }\n    ],\n    \"image\": \"images/craftable/misc/Cookout Kit.png\"\n  },\n  {\n    \"id\": \"Rain Totem\",\n    \"name\": \"Rain Totem\",\n    \"description\": \"Activate to greatly increase the chance of rain tomorrow. Consumed on use.\",\n    \"category\": \"Totems\",\n    \"source\": \"Foraging Level 9\",\n    \"output\": {\n      \"id\": \"681\",\n      \"name\": \"Rain Totem\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"432\",\n        \"name\": \"Truffle Oil\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"726\",\n        \"name\": \"Pine Tar\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/consumables/Rain Totem.png\"\n  },\n  {\n    \"id\": \"Tent Kit\",\n    \"name\": \"Tent Kit\",\n    \"description\": \"Use this to deploy a one-time-use tent for sleeping. Can only be used outdoors.\",\n    \"category\": \"Totems\",\n    \"source\": \"Foraging Level 8\",\n    \"output\": {\n      \"id\": \"TentKit\",\n      \"name\": \"Tent Kit\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 25\n      },\n      {\n        \"id\": \"428\",\n        \"name\": \"Cloth\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/misc/Tent Kit.png\"\n  },\n  {\n    \"id\": \"Treasure Totem\",\n    \"name\": \"Treasure Totem\",\n    \"description\": \"Use on diggable terrain to summon a ring of treasure spots.\",\n    \"category\": \"Totems\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"TreasureTotem\",\n      \"name\": \"Treasure Totem\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"MysticSyrup\",\n        \"name\": \"Mystic Syrup\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"Moss\",\n        \"name\": \"Moss\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/craftable/consumables/Treasure Totem.png\"\n  },\n  {\n    \"id\": \"Warp Totem: Beach\",\n    \"name\": \"Warp Totem: Beach\",\n    \"description\": \"Warp directly to the beach. Consumed on use.\",\n    \"category\": \"Totems\",\n    \"source\": \"Foraging Level 6\",\n    \"output\": {\n      \"id\": \"690\",\n      \"name\": \"Warp Totem: Beach\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"393\",\n        \"name\": \"Coral\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/craftable/consumables/Warp Totem Beach.png\"\n  },\n  {\n    \"id\": \"Warp Totem: Desert\",\n    \"name\": \"Warp Totem: Desert\",\n    \"description\": \"Warp directly to the Calico Desert. Consumed on use.\",\n    \"category\": \"Totems\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"261\",\n      \"name\": \"Warp Totem: Desert\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"88\",\n        \"name\": \"Coconut\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"386\",\n        \"name\": \"Iridium Ore\",\n        \"quantity\": 4\n      }\n    ],\n    \"image\": \"images/craftable/consumables/Warp Totem Desert.png\"\n  },\n  {\n    \"id\": \"Warp Totem: Farm\",\n    \"name\": \"Warp Totem: Farm\",\n    \"description\": \"Warp directly to your house. Consumed on use.\",\n    \"category\": \"Totems\",\n    \"source\": \"Foraging Level 8\",\n    \"output\": {\n      \"id\": \"688\",\n      \"name\": \"Warp Totem: Farm\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"340\",\n        \"name\": \"Honey\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 20\n      }\n    ],\n    \"image\": \"images/craftable/consumables/Warp Totem Farm.png\"\n  },\n  {\n    \"id\": \"Warp Totem: Island\",\n    \"name\": \"Warp Totem: Island\",\n    \"description\": \"Warp directly to Ginger Island. Consumed on use.\",\n    \"category\": \"Totems\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"886\",\n      \"name\": \"Warp Totem: Island\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"852\",\n        \"name\": \"Dragon Tooth\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"829\",\n        \"name\": \"Ginger\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/consumables/Warp Totem Island.png\"\n  },\n  {\n    \"id\": \"Warp Totem: Mountains\",\n    \"name\": \"Warp Totem: Mountains\",\n    \"description\": \"Warp directly to the mountains. Consumed on use.\",\n    \"category\": \"Totems\",\n    \"source\": \"Foraging Level 7\",\n    \"output\": {\n      \"id\": \"689\",\n      \"name\": \"Warp Totem: Mountains\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 25\n      }\n    ],\n    \"image\": \"images/craftable/consumables/Warp Totem Mountains.png\"\n  },\n  {\n    \"id\": \"Field Snack\",\n    \"name\": \"Field Snack\",\n    \"description\": \"A quick snack to fuel the hungry forager.\",\n    \"category\": \"Food\",\n    \"source\": \"Foraging Level 1\",\n    \"output\": {\n      \"id\": \"403\",\n      \"name\": \"Field Snack\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"309\",\n        \"name\": \"Acorn\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"310\",\n        \"name\": \"Maple Seed\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"311\",\n        \"name\": \"Pine Cone\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/edible-items/Field Snack.png\"\n  },\n  {\n    \"id\": \"Bug Steak\",\n    \"name\": \"Bug Steak\",\n    \"description\": \"The last resort of a hungry cave diver.\",\n    \"category\": \"Combat\",\n    \"source\": \"Combat Level 1\",\n    \"output\": {\n      \"id\": \"874\",\n      \"name\": \"Bug Steak\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"684\",\n        \"name\": \"Bug Meat\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/craftable/edible-items/Bug Steak.png\"\n  },\n  {\n    \"id\": \"Explosive Ammo\",\n    \"name\": \"Explosive Ammo\",\n    \"description\": \"Load into a slingshot and fire at enemies. (+5)\",\n    \"category\": \"Combat\",\n    \"source\": \"Combat Level 8\",\n    \"output\": {\n      \"id\": \"441\",\n      \"name\": \"Explosive Ammo\",\n      \"quantity\": 5,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"382\",\n        \"name\": \"Coal\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/craftable/misc/Explosive Ammo.png\"\n  },\n  {\n    \"id\": \"Fairy Dust\",\n    \"name\": \"Fairy Dust\",\n    \"description\": \"Sprinkle on kegs, furnaces, and other processing equipment to instantly receive product.\",\n    \"category\": \"Combat\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"872\",\n      \"name\": \"Fairy Dust\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"72\",\n        \"name\": \"Diamond\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"595\",\n        \"name\": \"Fairy Rose\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/consumables/Fairy Dust.png\"\n  },\n  {\n    \"id\": \"Life Elixir\",\n    \"name\": \"Life Elixir\",\n    \"description\": \"Restores health to full.\",\n    \"category\": \"Combat\",\n    \"source\": \"Combat Level 2\",\n    \"output\": {\n      \"id\": \"773\",\n      \"name\": \"Life Elixir\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"420\",\n        \"name\": \"Red Mushroom\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"422\",\n        \"name\": \"Purple Mushroom\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"257\",\n        \"name\": \"Morel\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"281\",\n        \"name\": \"Chanterelle\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/edible-items/Life Elixir.png\"\n  },\n  {\n    \"id\": \"Monster Musk\",\n    \"name\": \"Monster Musk\",\n    \"description\": \"Spray this on yourself to bring out more monsters.\",\n    \"category\": \"Combat\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"879\",\n      \"name\": \"Monster Musk\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"767\",\n        \"name\": \"Bat Wing\",\n        \"quantity\": 30\n      },\n      {\n        \"id\": \"766\",\n        \"name\": \"Slime\",\n        \"quantity\": 30\n      }\n    ],\n    \"image\": \"images/craftable/consumables/Monster Musk.png\"\n  },\n  {\n    \"id\": \"Oil Of Garlic\",\n    \"name\": \"Oil Of Garlic\",\n    \"description\": \"Drink this and weaker monsters will be too afraid to approach you.\",\n    \"category\": \"Combat\",\n    \"source\": \"Combat Level 6\",\n    \"output\": {\n      \"id\": \"772\",\n      \"name\": \"Oil of Garlic\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"248\",\n        \"name\": \"Garlic\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"247\",\n        \"name\": \"Oil\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/edible-items/Oil of Garlic.png\"\n  },\n  {\n    \"id\": \"Anvil\",\n    \"name\": \"Anvil\",\n    \"description\": \"Allows you to re-forge trinkets, randomizing their stats. Costs 3 iridium bars per use.\",\n    \"category\": \"Misc\",\n    \"source\": \"Mining Level 2\",\n    \"output\": {\n      \"id\": \"Anvil\",\n      \"name\": \"Anvil\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 50\n      }\n    ],\n    \"image\": \"images/craftable/misc/Anvil.png\"\n  },\n  {\n    \"id\": \"Farm Computer\",\n    \"name\": \"Farm Computer\",\n    \"description\": \"Scans the farm and displays useful information.\",\n    \"category\": \"Misc\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"239\",\n      \"name\": \"Farm Computer\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"122\",\n        \"name\": \"Dwarf Gadget\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"787\",\n        \"name\": \"Battery Pack\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"338\",\n        \"name\": \"Refined Quartz\",\n        \"quantity\": 10\n      }\n    ],\n    \"image\": \"images/craftable/misc/Farm Computer.png\"\n  },\n  {\n    \"id\": \"Mini-Forge\",\n    \"name\": \"Mini-Forge\",\n    \"description\": \"Now, you can use a dwarvish forge from the convenience of your home.\",\n    \"category\": \"Misc\",\n    \"source\": \"Mining Level 2\",\n    \"output\": {\n      \"id\": \"MiniForge\",\n      \"name\": \"Mini-Forge\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"852\",\n        \"name\": \"Dragon Tooth\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"337\",\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/misc/Mini-Forge.png\"\n  },\n  {\n    \"id\": \"Mini-Jukebox\",\n    \"name\": \"Mini-Jukebox\",\n    \"description\": \"Play your favorite songs.\",\n    \"category\": \"Misc\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"209\",\n      \"name\": \"Mini-Jukebox\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"787\",\n        \"name\": \"Battery Pack\",\n        \"quantity\": 1\n      }\n    ],\n    \"image\": \"images/craftable/misc/Mini-Jukebox.png\"\n  },\n  {\n    \"id\": \"Mini-Obelisk\",\n    \"name\": \"Mini-Obelisk\",\n    \"description\": \"Place two on the farm to warp between them.\",\n    \"category\": \"Misc\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"238\",\n      \"name\": \"Mini-Obelisk\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\",\n        \"quantity\": 30\n      },\n      {\n        \"id\": \"768\",\n        \"name\": \"Solar Essence\",\n        \"quantity\": 20\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 3\n      }\n    ],\n    \"image\": \"images/craftable/misc/Mini-Obelisk.png\"\n  },\n  {\n    \"id\": \"Solar Panel\",\n    \"name\": \"Solar Panel\",\n    \"description\": \"Slowly generates battery packs when left in the sun.\",\n    \"category\": \"Misc\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"231\",\n      \"name\": \"Solar Panel\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"338\",\n        \"name\": \"Refined Quartz\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"336\",\n        \"name\": \"Gold Bar\",\n        \"quantity\": 5\n      }\n    ],\n    \"image\": \"images/craftable/refining-equipment/Solar Panel.png\"\n  },\n  {\n    \"id\": \"Staircase\",\n    \"name\": \"Staircase\",\n    \"description\": \"Use this to reach the next level of the mine.\",\n    \"category\": \"Misc\",\n    \"source\": \"Mining Level 2\",\n    \"output\": {\n      \"id\": \"71\",\n      \"name\": \"Staircase\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 99\n      }\n    ],\n    \"image\": \"images/craftable/misc/Staircase.png\"\n  },\n  {\n    \"id\": \"Statue Of Blessings\",\n    \"name\": \"Statue Of Blessings\",\n    \"description\": \"Touching the statue gives a unique blessing every day.\",\n    \"category\": \"Misc\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"StatueOfBlessings\",\n      \"name\": \"Statue Of Blessings\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"390\",\n        \"name\": \"Stone\",\n        \"quantity\": 999\n      },\n      {\n        \"id\": \"771\",\n        \"name\": \"Fiber\",\n        \"quantity\": 999\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\",\n        \"quantity\": 999\n      },\n      {\n        \"id\": \"Moss\",\n        \"name\": \"Moss\",\n        \"quantity\": 333\n      }\n    ],\n    \"image\": \"images/craftable/misc/Statue Of Blessings.png\"\n  },\n  {\n    \"id\": \"Statue Of The Dwarf King\",\n    \"name\": \"Statue Of The Dwarf King\",\n    \"description\": \"Choose from two mining-related powers each day.\",\n    \"category\": \"Misc\",\n    \"source\": \"Special\",\n    \"output\": {\n      \"id\": \"StatueOfTheDwarfKing\",\n      \"name\": \"Statue Of The Dwarf King\",\n      \"quantity\": 1,\n      \"isBigCraftable\": true\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"337\",\n        \"name\": \"Iridium Bar\",\n        \"quantity\": 20\n      }\n    ],\n    \"image\": \"images/craftable/misc/Statue Of The Dwarf King.png\"\n  },\n  {\n    \"id\": \"Transmute (Au)\",\n    \"name\": \"Transmute (Au)\",\n    \"description\": \"Turns iron bars into gold bars.\",\n    \"category\": \"Misc\",\n    \"source\": \"Mining Level 7\",\n    \"output\": {\n      \"id\": \"336\",\n      \"name\": \"Gold Bar\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"335\",\n        \"name\": \"Iron Bar\",\n        \"quantity\": 2\n      }\n    ],\n    \"image\": \"images/minerals/bars/Gold Bar.png\"\n  },\n  {\n    \"id\": \"Transmute (Fe)\",\n    \"name\": \"Transmute (Fe)\",\n    \"description\": \"Turns copper bars into iron bars.\",\n    \"category\": \"Misc\",\n    \"source\": \"Mining Level 4\",\n    \"output\": {\n      \"id\": \"335\",\n      \"name\": \"Iron Bar\",\n      \"quantity\": 1,\n      \"isBigCraftable\": false\n    },\n    \"ingredients\": [\n      {\n        \"id\": \"334\",\n        \"name\": \"Copper Bar\",\n        \"quantity\": 3\n      }\n    ],\n    \"image\": \"images/minerals/bars/Iron Bar.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport craftingData from '@/data/crafting.json';\nimport { CraftingRecipe } from '@/types';\n\nconst allCraftingData: CraftingRecipe[] = craftingData as CraftingRecipe[];\n\n/** Query builder for crafting recipe data. All filter and sort methods return a new CraftingQuery for chaining. */\nexport class CraftingQuery extends QueryBase<CraftingRecipe> {\n  constructor(data: CraftingRecipe[] = allCraftingData) {\n    super(data);\n  }\n\n  /** Filter recipes by category (case-insensitive). */\n  byCategory(category: string): CraftingQuery {\n    const lower = category.toLowerCase();\n    return new CraftingQuery(this.data.filter((r) => r.category.toLowerCase() === lower));\n  }\n\n  /** Filter recipes by source string (partial match, case-insensitive). */\n  bySource(source: string): CraftingQuery {\n    const lower = source.toLowerCase();\n    return new CraftingQuery(this.data.filter((r) => r.source.toLowerCase().includes(lower)));\n  }\n\n  /** Find a recipe by its output item ID. */\n  findByOutputId(id: string): CraftingRecipe | undefined {\n    return this.data.find((r) => r.output.id === id);\n  }\n\n  sortByName(order: 'asc' | 'desc' = 'asc'): CraftingQuery {\n    const sorted = [...this.data].sort((a, b) =>\n      order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n    );\n    return new CraftingQuery(sorted);\n  }\n\n  sortByCategory(order: 'asc' | 'desc' = 'asc'): CraftingQuery {\n    const sorted = [...this.data].sort((a, b) => {\n      const cmp = a.category.localeCompare(b.category);\n      return order === 'asc' ? cmp : -cmp;\n    });\n    return new CraftingQuery(sorted);\n  }\n}\n\n/** Returns a CraftingQuery for all crafting recipe data. Pass `source` to wrap a pre-filtered array. */\nexport function crafting(source: CraftingRecipe[] = allCraftingData): CraftingQuery {\n  return new CraftingQuery(source);\n}\n","[\n  {\n    \"id\": \"128\",\n    \"name\": \"Pufferfish\",\n    \"description\": \"Inflates when threatened.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\"],\n    \"location\": \"Ocean, Ginger Island\",\n    \"weather\": \"sunny\",\n    \"time\": \"12:00 PM – 4:00 PM\",\n    \"difficulty\": 80,\n    \"sellPrice\": 200,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Specialty Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": -100,\n      \"health\": 0,\n      \"poison\": true\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Pufferfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"129\",\n    \"name\": \"Anchovy\",\n    \"description\": \"A small silver fish found in the ocean.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"fall\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 30,\n    \"sellPrice\": 30,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Anchovy.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"130\",\n    \"name\": \"Tuna\",\n    \"description\": \"A large fish that lives in the ocean.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\", \"winter\"],\n    \"location\": \"Ocean, Ginger Island\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 70,\n    \"sellPrice\": 100,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Fish Taco\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Ocean Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Tuna.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"131\",\n    \"name\": \"Sardine\",\n    \"description\": \"A common ocean fish.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 30,\n    \"sellPrice\": 40,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\n      \"Dish O' The Sea\",\n      \"Maki Roll\",\n      \"Quality Fertilizer\",\n      \"Sashimi\",\n      \"Ocean Fish Bundle\"\n    ],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Sardine.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"132\",\n    \"name\": \"Bream\",\n    \"description\": \"A fairly common river fish that becomes active at night.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"River\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 PM – 2:00 AM\",\n    \"difficulty\": 35,\n    \"sellPrice\": 45,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Baked Fish\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Night Fishing Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Bream.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Gold Ore\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Maple Syrup\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Crayfish\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Honey\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Jade\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Periwinkle\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"136\",\n    \"name\": \"Largemouth Bass\",\n    \"description\": \"A popular fish that lives in lakes.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mountain Lake\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 50,\n    \"sellPrice\": 100,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\n      \"Crispy Bass\",\n      \"Maki Roll\",\n      \"Quality Fertilizer\",\n      \"Sashimi\",\n      \"Lake Fish Bundle\",\n      \"Quality Fish Bundle\"\n    ],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Largemouth Bass.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Common Mushroom\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Earth Crystal\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Limestone\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mudstone\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Snail\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Wild Bait\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"137\",\n    \"name\": \"Smallmouth Bass\",\n    \"description\": \"A freshwater fish that is very sensitive to pollution.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"fall\"],\n    \"location\": \"River, Forest Pond\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 28,\n    \"sellPrice\": 50,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Smallmouth Bass.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Gold Ore\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Maple Syrup\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Crayfish\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Honey\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Jade\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Periwinkle\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"138\",\n    \"name\": \"Rainbow Trout\",\n    \"description\": \"A freshwater trout with colorful markings.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\"],\n    \"location\": \"River, Mountain Lake\",\n    \"weather\": \"sunny\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 45,\n    \"sellPrice\": 65,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Trout Soup\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Rainbow Trout.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Rainbow Shell\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Prismatic Shard\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"139\",\n    \"name\": \"Salmon\",\n    \"description\": \"Swims upstream to lay its eggs.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"fall\"],\n    \"location\": \"River\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 50,\n    \"sellPrice\": 75,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Salmon Dinner\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Salmon.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Gold Ore\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Maple Syrup\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Crayfish\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Honey\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Jade\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Periwinkle\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"140\",\n    \"name\": \"Walleye\",\n    \"description\": \"A freshwater fish caught at night.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"fall\", \"winter\"],\n    \"location\": \"River, Mountain Lake, Forest Pond\",\n    \"weather\": \"rainy\",\n    \"time\": \"12:00 PM – 2:00 AM\",\n    \"difficulty\": 45,\n    \"sellPrice\": 105,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\n      \"Maki Roll\",\n      \"Quality Fertilizer\",\n      \"Sashimi\",\n      \"Night Fishing Bundle\",\n      \"Quality Fish Bundle\"\n    ],\n    \"energyHealth\": {\n      \"energy\": 30,\n      \"health\": 13\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Walleye.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Gold Ore\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Maple Syrup\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Crayfish\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Honey\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Jade\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Periwinkle\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"141\",\n    \"name\": \"Perch\",\n    \"description\": \"A freshwater fish of the winter.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"winter\"],\n    \"location\": \"River, Mountain Lake, Forest Pond\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 35,\n    \"sellPrice\": 55,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Perch.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Gold Ore\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Maple Syrup\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Crayfish\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Honey\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Jade\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Periwinkle\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"142\",\n    \"name\": \"Carp\",\n    \"description\": \"A common pond fish.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\"],\n    \"location\": \"Mountain Lake, Secret Woods, Sewers, Mutant Bug Lair\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 15,\n    \"sellPrice\": 30,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Carp Surprise\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Lake Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Carp.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"143\",\n    \"name\": \"Catfish\",\n    \"description\": \"An uncommon fish found in streams.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"fall\", \"winter\"],\n    \"location\": \"River, Secret Woods, Witch's Swamp\",\n    \"weather\": \"rainy\",\n    \"time\": \"6:00 AM – 12:00 AM\",\n    \"difficulty\": 75,\n    \"sellPrice\": 200,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"River Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Catfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"144\",\n    \"name\": \"Pike\",\n    \"description\": \"A freshwater fish that's difficult to catch.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\", \"winter\"],\n    \"location\": \"River, Forest Pond\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 60,\n    \"sellPrice\": 100,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Pike.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Bug Meat\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"145\",\n    \"name\": \"Sunfish\",\n    \"description\": \"A common river fish.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\"],\n    \"location\": \"River\",\n    \"weather\": \"sunny\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 30,\n    \"sellPrice\": 30,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Baked Fish\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"River Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Sunfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Solar Essence\",\n          \"minPopulation\": 10\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"146\",\n    \"name\": \"Red Mullet\",\n    \"description\": \"Long ago these were kept as pets.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\", \"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 55,\n    \"sellPrice\": 75,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Red Mullet.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"147\",\n    \"name\": \"Herring\",\n    \"description\": \"A common ocean fish.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 25,\n    \"sellPrice\": 30,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Herring.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"148\",\n    \"name\": \"Eel\",\n    \"description\": \"A long, slippery little fish.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"fall\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"rainy\",\n    \"time\": \"4:00 PM – 2:00 AM\",\n    \"difficulty\": 70,\n    \"sellPrice\": 85,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\n      \"Fried Eel\",\n      \"Maki Roll\",\n      \"Quality Fertilizer\",\n      \"Sashimi\",\n      \"Spicy Eel\",\n      \"Night Fishing Bundle\"\n    ],\n    \"energyHealth\": {\n      \"energy\": 30,\n      \"health\": 13\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Eel.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"149\",\n    \"name\": \"Octopus\",\n    \"description\": \"A mysterious and intelligent creature.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\"],\n    \"location\": \"Ocean, Ginger Island, Night Market submarine\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 1:00 PM\",\n    \"difficulty\": 95,\n    \"sellPrice\": 150,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Master Fisher's Bundle\"],\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Octopus.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Omni Geode\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"150\",\n    \"name\": \"Red Snapper\",\n    \"description\": \"A popular fish with a nice red color.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"rainy\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 40,\n    \"sellPrice\": 50,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Ocean Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Red Snapper.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"151\",\n    \"name\": \"Squid\",\n    \"description\": \"A deep sea creature that can grow to enormous size.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 PM – 2:00 AM\",\n    \"difficulty\": 75,\n    \"sellPrice\": 80,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Fried Calamari\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Squid.png\",\n    \"canSmoke\": true,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Squid Ink\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"152\",\n    \"name\": \"Seaweed\",\n    \"description\": \"It can be used in cooking.\",\n    \"catchType\": \"rod\",\n    \"category\": \"other\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 5,\n    \"sellPrice\": 20,\n    \"profession\": [],\n    \"fishTank\": false,\n    \"usedIn\": [\"Maki Roll\"],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"maxQuality\": \"base\",\n    \"image\": \"images/fish/Seaweed.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": null\n  },\n  {\n    \"id\": \"153\",\n    \"name\": \"Green Algae\",\n    \"description\": \"It's really slimy.\",\n    \"catchType\": \"rod\",\n    \"category\": \"other\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"River, Mountain Lake\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 5,\n    \"sellPrice\": 15,\n    \"profession\": [],\n    \"fishTank\": false,\n    \"usedIn\": [\"Algae Soup\", \"Trout Soup\"],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"maxQuality\": \"base\",\n    \"image\": \"images/fish/Green Algae.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": null\n  },\n  {\n    \"id\": \"154\",\n    \"name\": \"Sea Cucumber\",\n    \"description\": \"A slippery, slimy creature found on the ocean floor.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"fall\", \"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 40,\n    \"sellPrice\": 75,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Lucky Lunch\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": -25,\n      \"health\": 0,\n      \"poison\": true\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Sea Cucumber.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"155\",\n    \"name\": \"Super Cucumber\",\n    \"description\": \"A rare, purple variety of sea cucumber.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\", \"winter\"],\n    \"location\": \"Ocean, Ginger Island\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 PM – 2:00 AM\",\n    \"difficulty\": 80,\n    \"sellPrice\": 250,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 125,\n      \"health\": 56\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Super Cucumber.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Iridium Ore\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Amethyst\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"156\",\n    \"name\": \"Ghostfish\",\n    \"description\": \"A pale, blind fish found in underground lakes.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mines (Floors 20 & 60)\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 50,\n    \"sellPrice\": 45,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Specialty Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Ghostfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Quartz\",\n          \"minPopulation\": 3\n        },\n        {\n          \"product\": \"White Algae\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Refined Quartz\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Pale Broth\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"157\",\n    \"name\": \"White Algae\",\n    \"description\": \"It's super slimy.\",\n    \"catchType\": \"rod\",\n    \"category\": \"other\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mines\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 5,\n    \"sellPrice\": 25,\n    \"profession\": [],\n    \"fishTank\": false,\n    \"usedIn\": [\"Pale Broth\", \"Wild Medicine Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 20,\n      \"health\": 9\n    },\n    \"maxQuality\": \"base\",\n    \"image\": \"images/fish/White Algae.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": null\n  },\n  {\n    \"id\": \"158\",\n    \"name\": \"Stonefish\",\n    \"description\": \"A bizarre fish that's shaped like a brick.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mines (Floor 20)\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 65,\n    \"sellPrice\": 300,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Stonefish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Copper Ore\",\n          \"minPopulation\": 3\n        },\n        {\n          \"product\": \"Geode\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Stone\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Diamond\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"159\",\n    \"name\": \"Crimsonfish\",\n    \"description\": \"Lives deep in the ocean but likes to lay its eggs in the warm summer water.\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary\",\n    \"seasons\": [\"summer\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 8:00 PM\",\n    \"difficulty\": 95,\n    \"sellPrice\": 1500,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Crimsonfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"160\",\n    \"name\": \"Angler\",\n    \"description\": \"Uses a bioluminescent dangler to attract prey.\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary\",\n    \"seasons\": [\"fall\"],\n    \"location\": \"River\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 85,\n    \"sellPrice\": 900,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Angler.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"161\",\n    \"name\": \"Ice Pip\",\n    \"description\": \"A rare fish that thrives in extremely cold conditions.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mines (Floor 60)\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 85,\n    \"sellPrice\": 500,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Ice Pip.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Iron Ore\",\n          \"minPopulation\": 3\n        },\n        {\n          \"product\": \"Frozen Geode\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Frozen Tear\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Diamond\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"162\",\n    \"name\": \"Lava Eel\",\n    \"description\": \"It can somehow survive in pools of red-hot lava.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mines (Floor 100), Volcano Caldera\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 90,\n    \"sellPrice\": 700,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Master Fisher's Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Lava Eel.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Gold Ore\",\n          \"minPopulation\": 3\n        },\n        {\n          \"product\": \"Cave Jelly\",\n          \"minPopulation\": 8\n        },\n        {\n          \"product\": \"Spicy Eel\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Magma Geode\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"163\",\n    \"name\": \"Legend\",\n    \"description\": \"The king of all fish! They said he'd never be caught.\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary\",\n    \"seasons\": [\"spring\"],\n    \"location\": \"Mountain Lake\",\n    \"weather\": \"rainy\",\n    \"time\": \"6:00 AM – 8:00 PM\",\n    \"difficulty\": 110,\n    \"sellPrice\": 5000,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 500,\n      \"health\": 225\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Legend.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"164\",\n    \"name\": \"Sandfish\",\n    \"description\": \"It tries to hide using camouflage.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Desert\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 8:00 PM\",\n    \"difficulty\": 65,\n    \"sellPrice\": 75,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Specialty Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Sandfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Cactus Seeds\",\n          \"minPopulation\": 10\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"165\",\n    \"name\": \"Scorpion Carp\",\n    \"description\": \"It's like a regular carp but with a sharp stinger.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Desert\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 8:00 PM\",\n    \"difficulty\": 90,\n    \"sellPrice\": 150,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Master Fisher's Bundle\"],\n    \"energyHealth\": {\n      \"energy\": -125,\n      \"health\": 0,\n      \"poison\": true\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Scorpion Carp.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Cactus Seeds\",\n          \"minPopulation\": 10\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"267\",\n    \"name\": \"Flounder\",\n    \"description\": \"It lives on the bottom, so both eyes are on top of its head.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\"],\n    \"location\": \"Ocean, Ginger Island\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 8:00 PM\",\n    \"difficulty\": 50,\n    \"sellPrice\": 100,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Seafoam Pudding\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Flounder.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Sea Jelly\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"269\",\n    \"name\": \"Midnight Carp\",\n    \"description\": \"This shy fish only feels comfortable at night.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"fall\", \"winter\"],\n    \"location\": \"Forest Pond, Mountain Lake, Ginger Island\",\n    \"weather\": \"both\",\n    \"time\": \"10:00 PM – 2:00 AM\",\n    \"difficulty\": 55,\n    \"sellPrice\": 150,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Seafoam Pudding\"],\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Midnight Carp.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"River Jelly\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"372\",\n    \"name\": \"Clam\",\n    \"description\": \"There's a chewy little guy in there...\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean (crab pot)\",\n    \"sellPrice\": 50,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Chowder\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Crab Pot Bundle\"],\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Clam.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Seaweed\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Beach\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Nautilus Shell\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"682\",\n    \"name\": \"Mutant Carp\",\n    \"description\": \"The strange waters of the sewer turned this carp into a monstrosity.\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Sewers\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 80,\n    \"sellPrice\": 1000,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Mutant Carp.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"698\",\n    \"name\": \"Sturgeon\",\n    \"description\": \"An ancient bottom-feeder with a dwindling population. Females can live up to 150 years.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\", \"winter\"],\n    \"location\": \"Mountain Lake\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 78,\n    \"sellPrice\": 200,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Lake Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Sturgeon.png\",\n    \"canSmoke\": true,\n    \"roe\": \"caviar\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"699\",\n    \"name\": \"Tiger Trout\",\n    \"description\": \"A rare hybrid trout that cannot bear offspring of its own.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"River\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 60,\n    \"sellPrice\": 150,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"River Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Tiger Trout.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"700\",\n    \"name\": \"Bullhead\",\n    \"description\": \"A relative of the catfish that eats a variety of foods off the lake bottom.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mountain Lake\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 46,\n    \"sellPrice\": 75,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Lake Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Bullhead.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Common Mushroom\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Earth Crystal\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Limestone\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mudstone\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Snail\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Wild Bait\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"701\",\n    \"name\": \"Tilapia\",\n    \"description\": \"A primarily vegetarian fish that prefers warm water.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\", \"fall\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 PM\",\n    \"difficulty\": 50,\n    \"sellPrice\": 75,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Ocean Fish Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Tilapia.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"702\",\n    \"name\": \"Chub\",\n    \"description\": \"A common freshwater fish known for its voracious appetite.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"River, Mountain Lake\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 35,\n    \"sellPrice\": 50,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Field Research Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Chub.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Gold Ore\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Maple Syrup\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Crayfish\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Honey\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Jade\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Periwinkle\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"704\",\n    \"name\": \"Dorado\",\n    \"description\": \"A fierce carnivore with brilliant orange scales.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"summer\"],\n    \"location\": \"River\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 7:00 PM\",\n    \"difficulty\": 78,\n    \"sellPrice\": 100,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Dorado.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Bug Meat\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"705\",\n    \"name\": \"Albacore\",\n    \"description\": \"Prefers temperature 'edges' where cool and warm water meet.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"fall\", \"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 11:00 AM, 6:00 PM – 2:00 AM\",\n    \"difficulty\": 60,\n    \"sellPrice\": 75,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Albacore.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"706\",\n    \"name\": \"Shad\",\n    \"description\": \"Lives in a school at sea, but returns to the rivers to spawn.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\"],\n    \"location\": \"River\",\n    \"weather\": \"rainy\",\n    \"time\": \"9:00 AM – 2:00 AM\",\n    \"difficulty\": 45,\n    \"sellPrice\": 60,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\n      \"Maki Roll\",\n      \"Quality Fertilizer\",\n      \"Sashimi\",\n      \"River Fish Bundle\",\n      \"Quality Fish Bundle\"\n    ],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Shad.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Gold Ore\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Maple Syrup\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Crayfish\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Honey\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Jade\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Periwinkle\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"707\",\n    \"name\": \"Lingcod\",\n    \"description\": \"A fearsome predator that will eat almost anything it can cram into its mouth.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"winter\"],\n    \"location\": \"River, Mountain Lake\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 85,\n    \"sellPrice\": 120,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Lingcod.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Bug Meat\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"708\",\n    \"name\": \"Halibut\",\n    \"description\": \"A flat fish that lives on the ocean floor.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 11:00 AM, 7:00 PM – 2:00 AM\",\n    \"difficulty\": 50,\n    \"sellPrice\": 80,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Halibut.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Clam\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Aquamarine\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Mussel\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"715\",\n    \"name\": \"Lobster\",\n    \"description\": \"A large ocean-dwelling crustacean with a strong tail.\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean (crab pot)\",\n    \"sellPrice\": 120,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Lobster Bisque\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Crab Pot Bundle\"],\n    \"maxQuality\": \"silver\",\n    \"image\": \"images/fish/Lobster.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Seaweed\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Beach\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Nautilus Shell\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"716\",\n    \"name\": \"Crayfish\",\n    \"description\": \"A small freshwater relative of the lobster.\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Freshwater (crab pot)\",\n    \"sellPrice\": 75,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Fish Stew\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Crab Pot Bundle\"],\n    \"maxQuality\": \"silver\",\n    \"image\": \"images/fish/Crayfish.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Green Algae\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Mountains\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"717\",\n    \"name\": \"Crab\",\n    \"description\": \"A marine crustacean with two powerful pincers.\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean (crab pot)\",\n    \"sellPrice\": 100,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Crab Cakes\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Crab Pot Bundle\"],\n    \"maxQuality\": \"gold\",\n    \"image\": \"images/fish/Crab.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Seaweed\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Beach\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Nautilus Shell\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"718\",\n    \"name\": \"Cockle\",\n    \"description\": \"A common saltwater clam.\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean (crab pot)\",\n    \"sellPrice\": 50,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Crab Pot Bundle\"],\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Cockle.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Seaweed\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Beach\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Nautilus Shell\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"719\",\n    \"name\": \"Mussel\",\n    \"description\": \"A common bivalve that often lives in clusters.\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean (crab pot)\",\n    \"sellPrice\": 30,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Fish Stew\", \"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Crab Pot Bundle\"],\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Mussel.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Seaweed\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Beach\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Nautilus Shell\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"720\",\n    \"name\": \"Shrimp\",\n    \"description\": \"A scavenger that feeds off the ocean floor. Widely prized for its meat.\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean (crab pot)\",\n    \"sellPrice\": 60,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\n      \"Maki Roll\",\n      \"Quality Fertilizer\",\n      \"Sashimi\",\n      \"Shrimp Cocktail\",\n      \"Tom Kha Soup\",\n      \"Crab Pot Bundle\"\n    ],\n    \"maxQuality\": \"silver\",\n    \"image\": \"images/fish/Shrimp.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Seaweed\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Beach\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Nautilus Shell\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"721\",\n    \"name\": \"Snail\",\n    \"description\": \"A wide-ranging mollusc that lives in a spiral shell.\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Freshwater (crab pot)\",\n    \"sellPrice\": 65,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Crab Pot Bundle\"],\n    \"maxQuality\": \"gold\",\n    \"image\": \"images/fish/Snail.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Green Algae\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Mountains\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"722\",\n    \"name\": \"Periwinkle\",\n    \"description\": \"A tiny freshwater snail that lives in a blue shell.\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Freshwater (crab pot)\",\n    \"sellPrice\": 20,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\n      \"Fish Stew\",\n      \"Maki Roll\",\n      \"Quality Fertilizer\",\n      \"Sashimi\",\n      \"Strange Bun\",\n      \"Crab Pot Bundle\"\n    ],\n    \"maxQuality\": \"silver\",\n    \"image\": \"images/fish/Periwinkle.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Green Algae\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Mountains\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"723\",\n    \"name\": \"Oyster\",\n    \"description\": \"Constantly filters water to find food. In the process, it removes dangerous toxins from the environment.\",\n    \"catchType\": \"crab-pot\",\n    \"category\": \"crab-pot\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ocean (crab pot)\",\n    \"sellPrice\": 40,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Crab Pot Bundle\"],\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Oyster.png\",\n    \"canSmoke\": false,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Seaweed\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Trash\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Driftwood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken Glasses\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Broken CD\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Soggy Newspaper\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Coral\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Sea Urchin\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Warp Totem: Beach\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Nautilus Shell\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"734\",\n    \"name\": \"Woodskip\",\n    \"description\": \"A very sensitive fish that can only live in pools deep in the forest.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Secret Woods\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 50,\n    \"sellPrice\": 75,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\n      \"Maki Roll\",\n      \"Quality Fertilizer\",\n      \"Sashimi\",\n      \"Lake Fish Bundle\",\n      \"Specialty Fish Bundle\"\n    ],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Woodskip.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Wood\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Hardwood\",\n          \"minPopulation\": 6\n        },\n        {\n          \"product\": \"Acorn\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Maple Seed\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Pine Cone\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"775\",\n    \"name\": \"Glacierfish\",\n    \"description\": \"Builds a nest on the underside of glaciers.\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary\",\n    \"seasons\": [\"winter\"],\n    \"location\": \"Forest (Arrowhead Island)\",\n    \"weather\": \"sunny\",\n    \"time\": \"6:00 AM – 8:00 PM\",\n    \"difficulty\": 100,\n    \"sellPrice\": 1000,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Glacierfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"795\",\n    \"name\": \"Void Salmon\",\n    \"description\": \"A salmon, twisted by void energy. The fresh meat is jet black, but rapidly turns pink when exposed to air.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Witch's Swamp\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 80,\n    \"sellPrice\": 150,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"The Missing Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 63,\n      \"health\": 28\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Void Salmon.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Void Essence\",\n          \"minPopulation\": 8\n        },\n        {\n          \"product\": \"Void Egg\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"796\",\n    \"name\": \"Slimejack\",\n    \"description\": \"He's coated in a very thick layer of slime. He keeps slipping out of your hands!\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mutant Bug Lair\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 55,\n    \"sellPrice\": 100,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Slimejack.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Green Algae\",\n          \"minPopulation\": 3\n        },\n        {\n          \"product\": \"Slime\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Green Slime Egg\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"798\",\n    \"name\": \"Midnight Squid\",\n    \"description\": \"A strange and mysterious denizen of the ocean's twilight depths.\",\n    \"catchType\": \"rod\",\n    \"category\": \"night-market\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Night Market submarine\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 55,\n    \"sellPrice\": 100,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Midnight Squid.png\",\n    \"canSmoke\": true,\n    \"roe\": null,\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Squid Ink\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"799\",\n    \"name\": \"Spook Fish\",\n    \"description\": \"The huge eyes can detect the faint silhouettes of prey.\",\n    \"catchType\": \"rod\",\n    \"category\": \"night-market\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Night Market submarine\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 60,\n    \"sellPrice\": 220,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Spook Fish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Treasure Chest\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"800\",\n    \"name\": \"Blobfish\",\n    \"description\": \"This odd creature floats above the ocean floor, consuming any edible material in its path.\",\n    \"catchType\": \"rod\",\n    \"category\": \"night-market\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Night Market submarine\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 75,\n    \"sellPrice\": 500,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\", \"Master Fisher's Bundle\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Blobfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Pearl\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Warp Totem: Farm\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"836\",\n    \"name\": \"Stingray\",\n    \"description\": \"Despite having a toxic stinger, these fish are shy and prefer to avoid humans.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ginger Island (Pirate Cove)\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 80,\n    \"sellPrice\": 180,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Stingray.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Magma Cap\",\n          \"minPopulation\": 4\n        },\n        {\n          \"product\": \"Cinder Shard\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Dragon Tooth\",\n          \"minPopulation\": 9\n        },\n        {\n          \"product\": \"Battery Pack\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"837\",\n    \"name\": \"Lionfish\",\n    \"description\": \"An aggressive, predatory fish with venomous spines.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ginger Island\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 50,\n    \"sellPrice\": 100,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Lionfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Taro Tuber\",\n          \"minPopulation\": 4\n        },\n        {\n          \"product\": \"Tiger Slime Egg\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"838\",\n    \"name\": \"Blue Discus\",\n    \"description\": \"A brightly colored tropical fish that is popular in aquariums.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Ginger Island (freshwater)\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 60,\n    \"sellPrice\": 120,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Blue Discus.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Banana\",\n          \"minPopulation\": 4\n        },\n        {\n          \"product\": \"Golden Coconut\",\n          \"minPopulation\": 9\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"898\",\n    \"name\": \"Son of Crimsonfish\",\n    \"description\": \"He hatched in the warm summer water, and followed in the footsteps of his father.\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary-2\",\n    \"seasons\": [\"winter\"],\n    \"location\": \"Ocean\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 8:00 PM\",\n    \"difficulty\": 95,\n    \"sellPrice\": 1500,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Son of Crimsonfish.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"899\",\n    \"name\": \"Ms. Angler\",\n    \"description\": \"Uses a bioluminescent dangler to attract prey.\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary-2\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"River\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 85,\n    \"sellPrice\": 900,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Ms. Angler.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"900\",\n    \"name\": \"Legend II\",\n    \"description\": \"The successor to the original Legend.\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary-2\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mountain Lake\",\n    \"weather\": \"rainy\",\n    \"time\": \"6:00 AM – 8:00 PM\",\n    \"difficulty\": 110,\n    \"sellPrice\": 5000,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 500,\n      \"health\": 225\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Legend II.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"901\",\n    \"name\": \"Radioactive Carp\",\n    \"description\": \"A carp that spent one too many years in toxic sludge.\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary-2\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Sewers\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"difficulty\": 80,\n    \"sellPrice\": 1000,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Radioactive Carp.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"902\",\n    \"name\": \"Glacierfish Jr.\",\n    \"description\": \"The original Glacierfish had a son...\",\n    \"catchType\": \"rod\",\n    \"category\": \"legendary-2\",\n    \"seasons\": [\"winter\"],\n    \"location\": \"Forest (Arrowhead Island)\",\n    \"weather\": \"sunny\",\n    \"time\": \"6:00 AM – 8:00 PM\",\n    \"difficulty\": 100,\n    \"sellPrice\": 1000,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Glacierfish Jr.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"Goby\",\n    \"name\": \"Goby\",\n    \"description\": \"Some types of Gobies can climb up waterfalls.\",\n    \"catchType\": \"rod\",\n    \"category\": \"regular\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\"],\n    \"location\": \"Forest (waterfalls)\",\n    \"weather\": \"both\",\n    \"time\": \"8:00 AM – 6:00 PM\",\n    \"difficulty\": 55,\n    \"sellPrice\": 150,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"fishTank\": true,\n    \"usedIn\": [\"Maki Roll\", \"Quality Fertilizer\", \"Sashimi\"],\n    \"energyHealth\": {\n      \"energy\": -62,\n      \"health\": 0,\n      \"poison\": true\n    },\n    \"maxQuality\": \"iridium\",\n    \"image\": \"images/fish/Goby.png\",\n    \"canSmoke\": true,\n    \"roe\": \"roe\",\n    \"fishPond\": {\n      \"produce\": [\n        {\n          \"product\": \"Roe\",\n          \"minPopulation\": 1\n        },\n        {\n          \"product\": \"Gold Ore\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Maple Syrup\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Mixed Seeds\",\n          \"minPopulation\": 5\n        },\n        {\n          \"product\": \"Crayfish\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Honey\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Jade\",\n          \"minPopulation\": 7\n        },\n        {\n          \"product\": \"Periwinkle\",\n          \"minPopulation\": 7\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"SeaJelly\",\n    \"name\": \"Sea Jelly\",\n    \"description\": \"A rare jelly found in the ocean.\",\n    \"catchType\": \"rod\",\n    \"category\": \"other\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Saltwater locations\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"sellPrice\": 200,\n    \"profession\": [],\n    \"fishTank\": false,\n    \"usedIn\": [],\n    \"energyHealth\": {\n      \"energy\": 88,\n      \"health\": 39\n    },\n    \"maxQuality\": \"base\",\n    \"image\": \"images/fish/jelly/Sea Jelly.png\",\n    \"canSmoke\": true,\n    \"roe\": null,\n    \"fishPond\": null\n  },\n  {\n    \"id\": \"RiverJelly\",\n    \"name\": \"River Jelly\",\n    \"description\": \"A rare jelly found in freshwater.\",\n    \"catchType\": \"rod\",\n    \"category\": \"other\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Freshwater locations\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"sellPrice\": 125,\n    \"profession\": [],\n    \"fishTank\": false,\n    \"usedIn\": [],\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"maxQuality\": \"base\",\n    \"image\": \"images/fish/jelly/River Jelly.png\",\n    \"canSmoke\": true,\n    \"roe\": null,\n    \"fishPond\": null\n  },\n  {\n    \"id\": \"CaveJelly\",\n    \"name\": \"Cave Jelly\",\n    \"description\": \"A rare jelly found in underground lakes.\",\n    \"catchType\": \"rod\",\n    \"category\": \"other\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"location\": \"Mines (levels 20, 60, and 100)\",\n    \"weather\": \"both\",\n    \"time\": \"6:00 AM – 2:00 AM\",\n    \"sellPrice\": 180,\n    \"profession\": [],\n    \"fishTank\": false,\n    \"usedIn\": [],\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"maxQuality\": \"base\",\n    \"image\": \"images/fish/jelly/Cave Jelly.png\",\n    \"canSmoke\": true,\n    \"roe\": null,\n    \"fishPond\": null\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/fish.json';\nimport { Fish, FishCatchType, FishCategory, FishRoe, Season } from '@/types';\n\nconst fishData: Fish[] = data as Fish[];\n\n/** Query builder for fish data. All filter and sort methods return a new FishQuery for chaining. */\nexport class FishQuery extends QueryBase<Fish> {\n  constructor(data: Fish[] = fishData) {\n    super(data);\n  }\n\n  /** Filter to fish available in the given season. */\n  bySeason(season: Season): FishQuery {\n    return new FishQuery(this.data.filter((f) => f.seasons.includes(season)));\n  }\n\n  /** Filter by category (`'regular'`, `'crab-pot'`, `'night-market'`, `'legendary'`, `'legendary-2'`, or `'other'`). */\n  byCategory(category: FishCategory): FishQuery {\n    return new FishQuery(this.data.filter((f) => f.category === category));\n  }\n\n  /** Filter by catch type (`'rod'` or `'crab-pot'`). */\n  byCatchType(type: FishCatchType): FishQuery {\n    return new FishQuery(this.data.filter((f) => f.catchType === type));\n  }\n\n  /** Filter by weather condition (`'sunny'`, `'rainy'`, or `'both'`). */\n  byWeather(weather: 'sunny' | 'rainy' | 'both'): FishQuery {\n    return new FishQuery(this.data.filter((f) => f.weather === weather));\n  }\n\n  /** Filter by location name (case-insensitive substring match). */\n  byLocation(location: string): FishQuery {\n    const q = location.toLowerCase();\n    return new FishQuery(this.data.filter((f) => f.location.toLowerCase().includes(q)));\n  }\n\n  /** Filter to fish that can be smoked in a Fish Smoker. */\n  smokeable(): FishQuery {\n    return new FishQuery(this.data.filter((f) => f.canSmoke));\n  }\n\n  /** Filter by roe type. Use `'roe'` for standard roe producers, `'caviar'` for Sturgeon. */\n  byRoe(type: FishRoe): FishQuery {\n    return new FishQuery(this.data.filter((f) => f.roe === type));\n  }\n\n  /** Filter to fish that can be placed in a Fish Pond (excludes algae and jellies). */\n  pondEligible(): FishQuery {\n    return new FishQuery(this.data.filter((f) => f.fishPond !== null));\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): FishQuery {\n    return new FishQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /** Sort by sell price. Default: `'desc'` (most valuable first). */\n  sortBySellPrice(order: 'asc' | 'desc' = 'desc'): FishQuery {\n    return new FishQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.sellPrice - b.sellPrice : b.sellPrice - a.sellPrice,\n      ),\n    );\n  }\n\n  /**\n   * Sort by fishing difficulty (0–100). Crab-pot fish have no difficulty and sort as 0.\n   * Default: `'desc'` (hardest first).\n   */\n  sortByDifficulty(order: 'asc' | 'desc' = 'desc'): FishQuery {\n    return new FishQuery(\n      [...this.data].sort((a, b) => {\n        const da = a.difficulty ?? 0;\n        const db = b.difficulty ?? 0;\n        return order === 'asc' ? da - db : db - da;\n      }),\n    );\n  }\n}\n\n/** Returns a FishQuery for all fish data. Pass `source` to wrap a pre-filtered array. */\nexport function fish(source: Fish[] = fishData): FishQuery {\n  return new FishQuery(source);\n}\n","[\n  {\n    \"id\": \"504\",\n    \"name\": \"Sneakers\",\n    \"description\": \"A little flimsy... but fashionable!\",\n    \"defense\": 1,\n    \"immunity\": 0,\n    \"obtain\": \"Purchased from Adventurer's Guild after Initiation quest; Special Item drops Floors 1-39 of The Mines; Fishing Treasure Chests\",\n    \"sellPrice\": 50,\n    \"image\": \"images/footwear/Sneakers.png\"\n  },\n  {\n    \"id\": \"505\",\n    \"name\": \"Rubber Boots\",\n    \"description\": \"Protection from the elements.\",\n    \"defense\": 0,\n    \"immunity\": 1,\n    \"obtain\": \"Special Item drops Floors 1-39 of The Mines; Fishing Treasure Chests\",\n    \"sellPrice\": 50,\n    \"image\": \"images/footwear/Rubber Boots.png\"\n  },\n  {\n    \"id\": \"506\",\n    \"name\": \"Leather Boots\",\n    \"description\": \"The leather is very supple.\",\n    \"defense\": 1,\n    \"immunity\": 1,\n    \"obtain\": \"Reward from Chest Floor 10 of The Mines; Purchased from Adventurer's Guild after Floor 10; Fishing Treasure Chests\",\n    \"sellPrice\": 100,\n    \"image\": \"images/footwear/Leather Boots.png\"\n  },\n  {\n    \"id\": \"507\",\n    \"name\": \"Work Boots\",\n    \"description\": \"Steel-toed for extra protection.\",\n    \"defense\": 2,\n    \"immunity\": 0,\n    \"obtain\": \"Purchased from Adventurer's Guild after Floor 10; Possible Remixed Reward Floor 10; Fishing Treasure Chests\",\n    \"sellPrice\": 100,\n    \"image\": \"images/footwear/Work Boots.png\"\n  },\n  {\n    \"id\": \"508\",\n    \"name\": \"Combat Boots\",\n    \"description\": \"Reinforced with iron mesh.\",\n    \"defense\": 3,\n    \"immunity\": 0,\n    \"obtain\": \"Purchased from Adventurer's Guild after Floor 40; Possible Remixed Reward Floor 50; Special Item drops Floors 61-79; Fishing Treasure Chests\",\n    \"sellPrice\": 150,\n    \"image\": \"images/footwear/Combat Boots.png\"\n  },\n  {\n    \"id\": \"509\",\n    \"name\": \"Tundra Boots\",\n    \"description\": \"The fuzzy lining keeps your ankles so warm.\",\n    \"defense\": 2,\n    \"immunity\": 1,\n    \"obtain\": \"Reward from Chest Floor 50 of The Mines; Purchased from Adventurer's Guild after Floor 50; Fishing Treasure Chests\",\n    \"sellPrice\": 150,\n    \"image\": \"images/footwear/Tundra Boots.png\"\n  },\n  {\n    \"id\": \"806\",\n    \"name\": \"Leprechaun Shoes\",\n    \"description\": \"The buckle's made of solid gold.\",\n    \"defense\": 2,\n    \"immunity\": 1,\n    \"obtain\": \"Found on Trains\",\n    \"sellPrice\": 150,\n    \"image\": \"images/footwear/Leprechaun Shoes.png\"\n  },\n  {\n    \"id\": \"510\",\n    \"name\": \"Thermal Boots\",\n    \"description\": \"Designed with extreme weather in mind.\",\n    \"defense\": 1,\n    \"immunity\": 2,\n    \"obtain\": \"Possible Remixed Reward Floor 50; Special Item drops Floors 41-79; Fishing Treasure Chests\",\n    \"sellPrice\": 150,\n    \"image\": \"images/footwear/Thermal Boots.png\"\n  },\n  {\n    \"id\": \"515\",\n    \"name\": \"Cowboy Boots\",\n    \"description\": \"It's the height of country fashion.\",\n    \"defense\": 2,\n    \"immunity\": 2,\n    \"obtain\": \"Unobtainable\",\n    \"sellPrice\": 200,\n    \"image\": \"images/footwear/Cowboy Boots.png\"\n  },\n  {\n    \"id\": \"511\",\n    \"name\": \"Dark Boots\",\n    \"description\": \"Made from thick black leather.\",\n    \"defense\": 4,\n    \"immunity\": 2,\n    \"obtain\": \"Purchased from Adventurer's Guild after Floor 80; Possible Remixed Reward Floor 80; Special Item drops Floors 81-119, Skull Cavern, Quarry Mine; Fishing Treasure Chests\",\n    \"sellPrice\": 300,\n    \"image\": \"images/footwear/Dark Boots.png\"\n  },\n  {\n    \"id\": \"512\",\n    \"name\": \"Firewalker Boots\",\n    \"description\": \"It's said these can withstand the hottest magma.\",\n    \"defense\": 3,\n    \"immunity\": 3,\n    \"obtain\": \"Reward from Chest Floor 80 of The Mines; Purchased from Adventurer's Guild after Floor 80; Fishing Treasure Chests\",\n    \"sellPrice\": 300,\n    \"image\": \"images/footwear/Firewalker Boots.png\"\n  },\n  {\n    \"id\": \"513\",\n    \"name\": \"Genie Shoes\",\n    \"description\": \"A curious energy permeates the fabric.\",\n    \"defense\": 1,\n    \"immunity\": 6,\n    \"obtain\": \"Special Item drops Floors 81-119, Skull Cavern, Quarry Mine; Fishing Treasure Chests\",\n    \"sellPrice\": 350,\n    \"image\": \"images/footwear/Genie Shoes.png\"\n  },\n  {\n    \"id\": \"514\",\n    \"name\": \"Space Boots\",\n    \"description\": \"An iridium weave gives them a purple sheen.\",\n    \"defense\": 4,\n    \"immunity\": 4,\n    \"obtain\": \"Reward from Chest Floor 110 of The Mines; Purchased from Adventurer's Guild after Floor 110\",\n    \"sellPrice\": 400,\n    \"image\": \"images/footwear/Space Boots.png\"\n  },\n  {\n    \"id\": \"878\",\n    \"name\": \"Crystal Shoes\",\n    \"description\": \"These sparkling shoes will keep your feet very safe.\",\n    \"defense\": 3,\n    \"immunity\": 5,\n    \"obtain\": \"Possible Remixed Reward Floor 110; Special Item drops in Skull Cavern and Quarry Mine\",\n    \"sellPrice\": 400,\n    \"image\": \"images/footwear/Crystal Shoes.png\"\n  },\n  {\n    \"id\": \"804\",\n    \"name\": \"Emily's Magic Boots\",\n    \"description\": \"Made with love by Emily. 100% compostable!\",\n    \"defense\": 4,\n    \"immunity\": 4,\n    \"obtain\": \"Received during Emily's 14-heart event\",\n    \"sellPrice\": 400,\n    \"image\": \"images/footwear/Emily's Magic Boots.png\"\n  },\n  {\n    \"id\": \"853\",\n    \"name\": \"Cinderclown Shoes\",\n    \"description\": \"These magic shoes belonged to a famous Dwarvish jester.\",\n    \"defense\": 6,\n    \"immunity\": 5,\n    \"obtain\": \"Volcano Dungeon Shop (100 Cinder Shards)\",\n    \"sellPrice\": 550,\n    \"image\": \"images/footwear/Cinderclown Shoes.png\"\n  },\n  {\n    \"id\": \"854\",\n    \"name\": \"Mermaid Boots\",\n    \"description\": \"Mermaid scales give these boots a protective aura.\",\n    \"defense\": 5,\n    \"immunity\": 8,\n    \"obtain\": \"From a Rare Chest in the Volcano Dungeon\",\n    \"sellPrice\": 650,\n    \"image\": \"images/footwear/Mermaid Boots.png\"\n  },\n  {\n    \"id\": \"855\",\n    \"name\": \"Dragonscale Boots\",\n    \"description\": \"These shimmering boots are extremely tough.\",\n    \"defense\": 7,\n    \"immunity\": 0,\n    \"obtain\": \"From a Rare Chest in the Volcano Dungeon\",\n    \"sellPrice\": 350,\n    \"image\": \"images/footwear/Dragonscale Boots.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/footwear.json';\nimport { Footwear } from '@/types';\n\nconst footwearData: Footwear[] = data as Footwear[];\n\n/** Query builder for footwear data. All sort methods return a new FootwearQuery for chaining. */\nexport class FootwearQuery extends QueryBase<Footwear> {\n  constructor(data: Footwear[] = footwearData) {\n    super(data);\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): FootwearQuery {\n    return new FootwearQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /** Sort by defense value. Default: `'desc'` (highest first). */\n  sortByDefense(order: 'asc' | 'desc' = 'desc'): FootwearQuery {\n    return new FootwearQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.defense - b.defense : b.defense - a.defense,\n      ),\n    );\n  }\n\n  /** Sort by immunity value. Default: `'desc'` (highest first). */\n  sortByImmunity(order: 'asc' | 'desc' = 'desc'): FootwearQuery {\n    return new FootwearQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.immunity - b.immunity : b.immunity - a.immunity,\n      ),\n    );\n  }\n}\n\n/** Returns a FootwearQuery for all footwear data. Pass `source` to wrap a pre-filtered array. */\nexport function footwear(source: Footwear[] = footwearData): FootwearQuery {\n  return new FootwearQuery(source);\n}\n","[\n  {\n    \"id\": \"410\",\n    \"name\": \"Blackberry\",\n    \"description\": \"A sharp, tangy flavor with a powerful kick.\",\n    \"seasons\": [\"fall\"],\n    \"locations\": \"Cindersap Forest, Pelican Town, Railroad; Berry bushes during Fall 8-11\",\n    \"sellPrice\": 20,\n    \"profession\": [\"tiller\"],\n    \"knowledge\": [\"bears-knowledge\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"image\": \"images/forageables/Blackberry.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"78\",\n    \"name\": \"Cave Carrot\",\n    \"description\": \"A starchy snack found in caves. It helps miners work longer.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"The Mines\",\n    \"sellPrice\": 25,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 30,\n      \"health\": 13\n    },\n    \"image\": \"images/forageables/Cave Carrot.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"281\",\n    \"name\": \"Chanterelle\",\n    \"description\": \"A tasty mushroom with a fruity smell and a mild flavor.\",\n    \"seasons\": [\"fall\"],\n    \"locations\": \"Secret Woods, Forest Farm, Farm Cave (mushroom option)\",\n    \"sellPrice\": 160,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"image\": \"images/forageables/Chanterelle.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": true,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"88\",\n    \"name\": \"Coconut\",\n    \"description\": \"A sweet and nutritious tropical fruit.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Calico Desert (palm trees), Ginger Island\",\n    \"sellPrice\": 100,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Coconut.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"404\",\n    \"name\": \"Common Mushroom\",\n    \"description\": \"A little slimy, but still good.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\"],\n    \"locations\": \"Secret Woods, Forest Farm, Farm Cave (mushroom option)\",\n    \"sellPrice\": 40,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"image\": \"images/forageables/Common Mushroom.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": true,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"718\",\n    \"name\": \"Cockle\",\n    \"description\": \"A common saltwater clam.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"The Beach\",\n    \"sellPrice\": 50,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"knowledge\": [],\n    \"image\": \"images/fish/Cockle.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"372\",\n    \"name\": \"Clam\",\n    \"description\": \"There's a chewy little guy in there...\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"The Beach\",\n    \"sellPrice\": 50,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"knowledge\": [],\n    \"image\": \"images/fish/Clam.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"393\",\n    \"name\": \"Coral\",\n    \"description\": \"A rare find in the ocean.\",\n    \"seasons\": [\"summer\"],\n    \"locations\": \"The Beach\",\n    \"sellPrice\": 80,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Coral.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"418\",\n    \"name\": \"Crocus\",\n    \"description\": \"A flower that can bloom even in the snow.\",\n    \"seasons\": [\"winter\"],\n    \"locations\": \"Pelican Town, Railroad, Bus Stop, Mountain, Cindersap Forest, Backwoods\",\n    \"sellPrice\": 60,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 0,\n      \"health\": 0\n    },\n    \"image\": \"images/forageables/Crocus.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"414\",\n    \"name\": \"Crystal Fruit\",\n    \"description\": \"In the harsh conditions of winter, this rare fruit grows from nutrient-rich sap.\",\n    \"seasons\": [\"winter\"],\n    \"locations\": \"Railroad, Cindersap Forest, Mountain, Bus Stop, Backwoods, Pelican Town\",\n    \"sellPrice\": 150,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 63,\n      \"health\": 28\n    },\n    \"image\": \"images/forageables/Crystal Fruit.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"18\",\n    \"name\": \"Daffodil\",\n    \"description\": \"A yellow flower that blooms in the spring.\",\n    \"seasons\": [\"spring\"],\n    \"locations\": \"Pelican Town, Bus Stop, Railroad\",\n    \"sellPrice\": 30,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 0,\n      \"health\": 0\n    },\n    \"image\": \"images/forageables/Daffodil.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"22\",\n    \"name\": \"Dandelion\",\n    \"description\": \"Not the prettiest flower, but the leaves make a good salad.\",\n    \"seasons\": [\"spring\"],\n    \"locations\": \"Cindersap Forest, Bus Stop, Railroad, Forest Farm\",\n    \"sellPrice\": 40,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"image\": \"images/forageables/Dandelion.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"259\",\n    \"name\": \"Fiddlehead Fern\",\n    \"description\": \"The young curled frond of a fern. Very popular in gourmet cooking.\",\n    \"seasons\": [\"summer\"],\n    \"locations\": \"Secret Woods\",\n    \"sellPrice\": 90,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"image\": \"images/forageables/Fiddlehead Fern.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"153\",\n    \"name\": \"Green Algae\",\n    \"description\": \"It's really slimy.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Everywhere but the Farm Pond of the Standard Farm\",\n    \"sellPrice\": 15,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"image\": \"images/fish/Green Algae.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"829\",\n    \"name\": \"Ginger\",\n    \"description\": \"This pungent root is used in many cooking recipes.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Ginger Island West\",\n    \"sellPrice\": 60,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"image\": \"images/forageables/Ginger.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"398\",\n    \"name\": \"Grape\",\n    \"description\": \"A sweet cluster of grapes.\",\n    \"seasons\": [\"summer\"],\n    \"locations\": \"Backwoods, Mountain, Bus Stop, Railroad, Forest Farm\",\n    \"sellPrice\": 80,\n    \"profession\": [\"tiller\"],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 38,\n      \"health\": 17\n    },\n    \"image\": \"images/crops/grape/crop.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"408\",\n    \"name\": \"Hazelnut\",\n    \"description\": \"This hazelnut is of the common variety used for making chocolate.\",\n    \"seasons\": [\"fall\"],\n    \"locations\": \"Backwoods, Mountain, Bus Stop, Railroad\",\n    \"sellPrice\": 90,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 30,\n      \"health\": 13\n    },\n    \"image\": \"images/forageables/Hazelnut.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"283\",\n    \"name\": \"Holly\",\n    \"description\": \"The leaves and bright red berries make a popular winter decoration.\",\n    \"seasons\": [\"winter\"],\n    \"locations\": \"Secret Woods, Backwoods, Pelican Town, Bus Stop, Cindersap Forest, Mountain\",\n    \"sellPrice\": 80,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": -37,\n      \"health\": 0,\n      \"poison\": true\n    },\n    \"image\": \"images/forageables/Holly.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"20\",\n    \"name\": \"Leek\",\n    \"description\": \"A pungent relative of the onion. Not many people grow it.\",\n    \"seasons\": [\"spring\"],\n    \"locations\": \"Backwoods, Mountain, Forest Farm, Bus Stop, Railroad\",\n    \"sellPrice\": 60,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 40,\n      \"health\": 18\n    },\n    \"image\": \"images/forageables/Leek.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"851\",\n    \"name\": \"Magma Cap\",\n    \"description\": \"A very rare mushroom that lives next to pools of lava.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Volcano Dungeon\",\n    \"sellPrice\": 400,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 175,\n      \"health\": 78\n    },\n    \"image\": \"images/forageables/Magma Cap.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": true,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"719\",\n    \"name\": \"Mussel\",\n    \"description\": \"A common bivalve that often lives in clusters.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"The Beach\",\n    \"sellPrice\": 30,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"knowledge\": [],\n    \"image\": \"images/fish/Mussel.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"257\",\n    \"name\": \"Morel\",\n    \"description\": \"This rare mushroom has a pleasant nutty flavor.\",\n    \"seasons\": [\"spring\"],\n    \"locations\": \"Secret Woods, Forest Farm, Farm Cave (mushroom option)\",\n    \"sellPrice\": 150,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 20,\n      \"health\": 9\n    },\n    \"image\": \"images/forageables/Morel.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": true,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"392\",\n    \"name\": \"Nautilus Shell\",\n    \"description\": \"This is a rare find, as these creatures prefer deep water.\",\n    \"seasons\": [\"winter\"],\n    \"locations\": \"The Beach\",\n    \"sellPrice\": 120,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Nautilus Shell.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"422\",\n    \"name\": \"Purple Mushroom\",\n    \"description\": \"A very rare mushroom found deep in the cave.\",\n    \"seasons\": [\"fall\"],\n    \"locations\": \"The Mines, Forest Farm, Farm Cave (mushroom option)\",\n    \"sellPrice\": 250,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 125,\n      \"health\": 56\n    },\n    \"image\": \"images/forageables/Purple Mushroom.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": true,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"723\",\n    \"name\": \"Oyster\",\n    \"description\": \"Constantly filters water to find food. In the process, it removes dangerous toxins from the environment.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"The Beach\",\n    \"sellPrice\": 40,\n    \"profession\": [\"fisher\", \"angler\"],\n    \"knowledge\": [],\n    \"image\": \"images/fish/Oyster.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"394\",\n    \"name\": \"Rainbow Shell\",\n    \"description\": \"A rare find in the summer ocean.\",\n    \"seasons\": [\"summer\"],\n    \"locations\": \"The Beach\",\n    \"sellPrice\": 300,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Rainbow Shell.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"420\",\n    \"name\": \"Red Mushroom\",\n    \"description\": \"A popular culinary mushroom that can be difficult to find.\",\n    \"seasons\": [\"summer\", \"fall\"],\n    \"locations\": \"Secret Woods, Farm Cave (mushroom option)\",\n    \"sellPrice\": 75,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": -50,\n      \"health\": 0,\n      \"poison\": true\n    },\n    \"image\": \"images/forageables/Red Mushroom.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"296\",\n    \"name\": \"Salmonberry\",\n    \"description\": \"A spring-time berry with the flavor of the forest.\",\n    \"seasons\": [\"spring\"],\n    \"locations\": \"Bushes during Salmonberry Season (Spring 15-18)\",\n    \"sellPrice\": 5,\n    \"profession\": [\"tiller\"],\n    \"knowledge\": [\"bears-knowledge\"],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"image\": \"images/forageables/Salmonberry.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"92\",\n    \"name\": \"Sap\",\n    \"description\": \"A fluid obtained from trees.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"From chopping trees\",\n    \"sellPrice\": 2,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": -2,\n      \"health\": 0,\n      \"poison\": true\n    },\n    \"image\": \"images/forageables/Sap.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"397\",\n    \"name\": \"Sea Urchin\",\n    \"description\": \"A type of echinoderm.\",\n    \"seasons\": [\"summer\"],\n    \"locations\": \"The Beach\",\n    \"sellPrice\": 160,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Sea Urchin.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"152\",\n    \"name\": \"Seaweed\",\n    \"description\": \"It can be used in cooking.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"The Beach\",\n    \"sellPrice\": 20,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"image\": \"images/fish/Seaweed.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"416\",\n    \"name\": \"Snow Yam\",\n    \"description\": \"This little yam was hiding beneath the snow.\",\n    \"seasons\": [\"winter\"],\n    \"locations\": \"Underground artifact spots and tillable soil\",\n    \"sellPrice\": 100,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 30,\n      \"health\": 13\n    },\n    \"image\": \"images/forageables/Snow Yam.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"396\",\n    \"name\": \"Spice Berry\",\n    \"description\": \"The leaves and berries are both edible. Very spicy!\",\n    \"seasons\": [\"summer\"],\n    \"locations\": \"Cindersap Forest, Backwoods, Mountain, Bus Stop, Railroad, Forest Farm\",\n    \"sellPrice\": 80,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"image\": \"images/forageables/Spice Berry.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"399\",\n    \"name\": \"Spring Onion\",\n    \"description\": \"These grow naturally in the wild, usually in groups.\",\n    \"seasons\": [\"spring\"],\n    \"locations\": \"Cindersap Forest\",\n    \"sellPrice\": 8,\n    \"profession\": [],\n    \"knowledge\": [\"spring-onion-mastery\"],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"image\": \"images/forageables/Spring Onion.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"402\",\n    \"name\": \"Sweet Pea\",\n    \"description\": \"A fragrant summer flower.\",\n    \"seasons\": [\"summer\"],\n    \"locations\": \"Pelican Town, Cindersap Forest, Bus Stop, Railroad, Forest Farm\",\n    \"sellPrice\": 50,\n    \"profession\": [\"tiller\"],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 0,\n      \"health\": 0\n    },\n    \"image\": \"images/forageables/Sweet Pea.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"16\",\n    \"name\": \"Wild Horseradish\",\n    \"description\": \"A spicy root found in the spring.\",\n    \"seasons\": [\"spring\"],\n    \"locations\": \"Cindersap Forest, Backwoods, Mountain, Forest Farm\",\n    \"sellPrice\": 50,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 13,\n      \"health\": 5\n    },\n    \"image\": \"images/forageables/Wild Horseradish.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"406\",\n    \"name\": \"Wild Plum\",\n    \"description\": \"Tart and juicy with a beautiful purple color.\",\n    \"seasons\": [\"fall\"],\n    \"locations\": \"Bus Stop, Railroad, Backwoods, Mountain\",\n    \"sellPrice\": 80,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"image\": \"images/forageables/Wild Plum.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"157\",\n    \"name\": \"White Algae\",\n    \"description\": \"It's super slimy.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Mines, Sewers, Mutant Bug Lair, Witch's Swamp\",\n    \"sellPrice\": 25,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 20,\n      \"health\": 9\n    },\n    \"image\": \"images/fish/White Algae.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"412\",\n    \"name\": \"Winter Root\",\n    \"description\": \"A starchy winter tuber.\",\n    \"seasons\": [\"winter\"],\n    \"locations\": \"Underground artifact spots and tillable soil\",\n    \"sellPrice\": 70,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 25,\n      \"health\": 11\n    },\n    \"image\": \"images/forageables/Winter Root.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"388\",\n    \"name\": \"Wood\",\n    \"description\": \"A sturdy, yet flexible plant material with a wide variety of uses.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Felling trees and branches with an axe; Recycling Machine (from Driftwood)\",\n    \"sellPrice\": 2,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Wood.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"330\",\n    \"name\": \"Clay\",\n    \"description\": \"Used in crafting and construction.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Tilling dirt, sand, or Artifact Spots; Ginger Island Dig Site; Geodes\",\n    \"sellPrice\": 20,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Clay.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": true,\n      \"pickles\": true,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"709\",\n    \"name\": \"Hardwood\",\n    \"description\": \"A special kind of wood with superior strength and beauty.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Chopping Mahogany Trees or Large Stumps; Secret Woods (6 stumps daily); Ginger Island\",\n    \"sellPrice\": 15,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Hardwood.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"787\",\n    \"name\": \"Battery Pack\",\n    \"description\": \"It's fully charged with precious energy.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Lightning Rod during thunderstorms; Solar Panel after 7 sunny days; Iridium Bat drop (5%)\",\n    \"sellPrice\": 500,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Battery Pack.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"812\",\n    \"name\": \"Roe\",\n    \"description\": \"Fresh fish eggs. These can be aged in a preserves jar to bring out more flavor.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Fish Ponds; Fishing Treasure Chests (with Jewels of the Sea book)\",\n    \"sellPrice\": 30,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"image\": \"images/forageables/Roe.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"812S\",\n    \"name\": \"Sturgeon Roe\",\n    \"description\": \"Fresh sturgeon eggs. These can be made into caviar in a preserves jar.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Fish Ponds (Sturgeon)\",\n    \"sellPrice\": 130,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 50,\n      \"health\": 22\n    },\n    \"image\": \"images/forageables/Sturgeon Roe.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"814\",\n    \"name\": \"Squid Ink\",\n    \"description\": \"Squid use this ink to confuse would-be predators.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Squid Kids in The Mines; Blue Squids in Dangerous Mines; Squid or Midnight Squid Fish Pond\",\n    \"sellPrice\": 110,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Squid Ink.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"390\",\n    \"name\": \"Stone\",\n    \"description\": \"A common type of stone.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Mining rocks throughout the world\",\n    \"sellPrice\": 2,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Stone.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  },\n  {\n    \"id\": \"90\",\n    \"name\": \"Cactus Fruit\",\n    \"description\": \"The sweet fruit of a cactus. Grows year-round indoors or on Ginger Island.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"locations\": \"Calico Desert (ground spawn), Ginger Island\",\n    \"sellPrice\": 75,\n    \"profession\": [\"tiller\"],\n    \"knowledge\": [],\n    \"energyHealth\": {\n      \"energy\": 75,\n      \"health\": 33\n    },\n    \"image\": \"images/crops/cactus-fruit/crop.png\",\n    \"maxQuality\": \"iridium\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": true,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": true,\n      \"driedMushrooms\": false,\n      \"driedFruit\": true\n    }\n  },\n  {\n    \"id\": \"Moss\",\n    \"name\": \"Moss\",\n    \"description\": \"Grows on the shaded side of trees. Has a pleasant, earthy scent.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\"],\n    \"locations\": \"Foraging from trees with moss growing on them; Green Rain events\",\n    \"sellPrice\": 5,\n    \"profession\": [],\n    \"knowledge\": [],\n    \"image\": \"images/forageables/Moss.png\",\n    \"maxQuality\": \"base\",\n    \"artisanUses\": {\n      \"honey\": false,\n      \"wine\": false,\n      \"juice\": false,\n      \"pickles\": false,\n      \"jelly\": false,\n      \"driedMushrooms\": false,\n      \"driedFruit\": false\n    }\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/forageables.json';\nimport { ArtisanUses, Forageable, Season } from '@/types';\n\nconst forageableData: Forageable[] = data as Forageable[];\n\n/** Query builder for forageable item data. All filter and sort methods return a new ForageableQuery for chaining. */\nexport class ForageableQuery extends QueryBase<Forageable> {\n  constructor(data: Forageable[] = forageableData) {\n    super(data);\n  }\n\n  /** Filter to forageables available in the given season. */\n  bySeason(season: Season): ForageableQuery {\n    return new ForageableQuery(this.data.filter((f) => f.seasons.includes(season)));\n  }\n\n  /** Filter to forageables that can be used to produce the given artisan good (e.g. `'wine'`, `'driedMushrooms'`). */\n  byArtisanUse(use: keyof ArtisanUses): ForageableQuery {\n    return new ForageableQuery(this.data.filter((f) => f.artisanUses[use]));\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): ForageableQuery {\n    return new ForageableQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /** Sort by sell price. Default: `'desc'` (most valuable first). */\n  sortBySellPrice(order: 'asc' | 'desc' = 'desc'): ForageableQuery {\n    return new ForageableQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.sellPrice - b.sellPrice : b.sellPrice - a.sellPrice,\n      ),\n    );\n  }\n}\n\n/** Returns a ForageableQuery for all forageable data. Pass `source` to wrap a pre-filtered array. */\nexport function forageables(source: Forageable[] = forageableData): ForageableQuery {\n  return new ForageableQuery(source);\n}\n","[\n  {\n    \"id\": \"AbigailsBow\",\n    \"name\": \"Abigail's Bow\",\n    \"description\": \"It's just like Abby's.\",\n    \"obtain\": \"Purchase for 60 Calico Eggs from Abigail's shop at Desert Festival\",\n    \"image\": \"images/hats/Abigail's Bow.png\"\n  },\n  {\n    \"id\": \"60\",\n    \"name\": \"Arcane Hat\",\n    \"description\": \"The type of cowboy hat worn by a wizard.\",\n    \"obtain\": \"Defeat 100 Mummies (Monster Eradication Goal)\",\n    \"image\": \"images/hats/Arcane Hat.png\"\n  },\n  {\n    \"id\": \"35\",\n    \"name\": \"Archer's Cap\",\n    \"description\": \"Fashionable whether you're an archer or not.\",\n    \"obtain\": \"Cook every recipe (Gourmet Chef achievement)\",\n    \"image\": \"images/hats/Archer's Cap.png\",\n    \"price\": 4000\n  },\n  {\n    \"id\": \"53\",\n    \"name\": \"Beanie\",\n    \"description\": \"A warm hat with a pretty tight fit.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Beanie.png\"\n  },\n  {\n    \"id\": \"56\",\n    \"name\": \"Blobfish Mask\",\n    \"description\": \"Just as spongy as the real thing!\",\n    \"obtain\": \"Tailoring\",\n    \"image\": \"images/hats/Blobfish Mask.png\"\n  },\n  {\n    \"id\": \"6\",\n    \"name\": \"Blue Bonnet\",\n    \"description\": \"Harken back to simpler times with this prairie bonnet.\",\n    \"obtain\": \"Donate 40 items to Museum (Treasure Trove achievement)\",\n    \"image\": \"images/hats/Blue Bonnet.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"BlueBow\",\n    \"name\": \"Blue Bow\",\n    \"description\": \"This huge bow makes quite a statement!\",\n    \"obtain\": \"Purchase for 50 Calico Eggs from Calico Egg Merchant at Desert Festival\",\n    \"image\": \"images/hats/Blue Bow.png\"\n  },\n  {\n    \"id\": \"37\",\n    \"name\": \"Blue Cowboy Hat\",\n    \"description\": \"A denim cowboy hat in cool blue.\",\n    \"obtain\": \"Skull Cavern treasure chests\",\n    \"image\": \"images/hats/Blue Cowboy Hat.png\"\n  },\n  {\n    \"id\": \"BlueRibbon\",\n    \"name\": \"Blue Ribbon\",\n    \"description\": \"A lovely ribbon that sits behind the head.\",\n    \"obtain\": \"Get 1st place at Stardew Valley Fair competition\",\n    \"image\": \"images/hats/Blue Ribbon.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"80\",\n    \"name\": \"Bluebird Mask\",\n    \"description\": \"Wear this to look just like your favorite island trader.\",\n    \"obtain\": \"Island Trader on Wednesdays for 30 Taro Roots\",\n    \"image\": \"images/hats/Bluebird Mask.png\"\n  },\n  {\n    \"id\": \"1\",\n    \"name\": \"Bowler Hat\",\n    \"description\": \"Made from smooth felt.\",\n    \"obtain\": \"Earn 1,000,000g (Millionaire achievement)\",\n    \"image\": \"images/hats/Bowler Hat.png\",\n    \"price\": 10000\n  },\n  {\n    \"id\": \"69\",\n    \"name\": \"Bridal Veil\",\n    \"description\": \"The traditional headwear for a bride.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Bridal Veil.png\"\n  },\n  {\n    \"id\": \"BucketHat\",\n    \"name\": \"Bucket Hat\",\n    \"description\": \"A simple hat with a short brim.\",\n    \"obtain\": \"Reward from Trout Derby\",\n    \"image\": \"images/hats/Bucket Hat.png\"\n  },\n  {\n    \"id\": \"14\",\n    \"name\": \"Butterfly Bow\",\n    \"description\": \"This one is very soft.\",\n    \"obtain\": \"Reach 5-heart friendship level with someone (A New Friend achievement)\",\n    \"image\": \"images/hats/Butterfly Bow.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"32\",\n    \"name\": \"Cat Ears\",\n    \"description\": \"Whiskers included.\",\n    \"obtain\": \"Reach 10-heart friendship with 8 people (The Beloved Farmer achievement)\",\n    \"image\": \"images/hats/Cat Ears.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"61\",\n    \"name\": \"Chef Hat\",\n    \"description\": \"The traditional hat worn by a head chef.\",\n    \"obtain\": \"Cook every recipe (Gourmet Chef achievement)\",\n    \"image\": \"images/hats/Chef Hat.png\",\n    \"price\": 10000\n  },\n  {\n    \"id\": \"10\",\n    \"name\": \"Chicken Mask\",\n    \"description\": \"You'll be sure to get them grinning with this one.\",\n    \"obtain\": \"Complete 40 Help Wanted requests (A Big Help achievement)\",\n    \"image\": \"images/hats/Chicken Mask.png\",\n    \"price\": 2000\n  },\n  {\n    \"id\": \"concerned-ape-hat\",\n    \"name\": \"ConcernedApe Hat\",\n    \"description\": \"A hat that depicts ConcernedApe's profile picture.\",\n    \"obtain\": \"Interact with monkey in Volcano Caldera after 100% Perfection\",\n    \"image\": \"images/hats/ConcernedApe Hat.png\"\n  },\n  {\n    \"id\": \"39\",\n    \"name\": \"Cone Hat\",\n    \"description\": \"A curiosity from a distant land.\",\n    \"obtain\": \"Purchase from Magic Shop Boat at Night Market\",\n    \"image\": \"images/hats/Cone Hat.png\"\n  },\n  {\n    \"id\": \"20\",\n    \"name\": \"Cool Cap\",\n    \"description\": \"It looks really faded, but it used to be a vibrant blue.\",\n    \"obtain\": \"Earn 250,000g (Homesteader achievement)\",\n    \"image\": \"images/hats/Cool Cap.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"copper-pan-hat\",\n    \"name\": \"Copper Pan (hat)\",\n    \"description\": \"You place the copper pan on your head...\",\n    \"obtain\": \"Place Copper Pan in hat slot in inventory\",\n    \"image\": \"images/hats/Copper Pan (hat).png\"\n  },\n  {\n    \"id\": \"0\",\n    \"name\": \"Cowboy Hat\",\n    \"description\": \"The leather is old and cracked, but surprisingly supple. It smells musty.\",\n    \"obtain\": \"Complete museum collection (A Complete Collection achievement)\",\n    \"image\": \"images/hats/Cowboy Hat.png\",\n    \"price\": 10000\n  },\n  {\n    \"id\": \"33\",\n    \"name\": \"Cowgal Hat\",\n    \"description\": \"The band is studded with fake diamonds.\",\n    \"obtain\": \"Ship 300 of one crop (Monoculture achievement)\",\n    \"image\": \"images/hats/Cowgal Hat.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"34\",\n    \"name\": \"Cowpoke Hat\",\n    \"description\": \"For dairy experts.\",\n    \"obtain\": \"Ship 15 of each crop (Polyculture achievement)\",\n    \"image\": \"images/hats/Cowpoke Hat.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"29\",\n    \"name\": \"Daisy\",\n    \"description\": \"A fresh spring daisy to put in your hair.\",\n    \"obtain\": \"Craft 15 different items (D.I.Y. achievement)\",\n    \"image\": \"images/hats/Daisy.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"DarkBallcap\",\n    \"name\": \"Dark Ballcap\",\n    \"description\": \"It fits perfectly on your head.\",\n    \"obtain\": \"Random from Emily's outfit services at Desert Festival\",\n    \"image\": \"images/hats/Dark Ballcap.png\"\n  },\n  {\n    \"id\": \"83\",\n    \"name\": \"Dark Cowboy Hat\",\n    \"description\": \"A cowboy hat in fashionable black.\",\n    \"obtain\": \"Skull Cavern treasure chests\",\n    \"image\": \"images/hats/Dark Cowboy Hat.png\"\n  },\n  {\n    \"id\": \"DarkVelvetBow\",\n    \"name\": \"Dark Velvet Bow\",\n    \"description\": \"A big, floppy bow made of dark velvet.\",\n    \"obtain\": \"Purchase for 75 Calico Eggs from Calico Egg Merchant at Desert Festival\",\n    \"image\": \"images/hats/Dark Velvet Bow.png\"\n  },\n  {\n    \"id\": \"12\",\n    \"name\": \"Delicate Bow\",\n    \"description\": \"Little pink jewels glisten as you examine it.\",\n    \"obtain\": \"Cook 10 different recipes (Cook achievement)\",\n    \"image\": \"images/hats/Delicate Bow.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"81\",\n    \"name\": \"Deluxe Cowboy Hat\",\n    \"description\": \"A cowboy hat with a more extreme shape.\",\n    \"obtain\": \"Island Trader on Fridays for 30 Taro Roots\",\n    \"image\": \"images/hats/Deluxe Cowboy Hat.png\"\n  },\n  {\n    \"id\": \"76\",\n    \"name\": \"Deluxe Pirate Hat\",\n    \"description\": \"Only the most infamous pirate could pull off this look.\",\n    \"obtain\": \"Volcano Dungeon rare chests\",\n    \"image\": \"images/hats/Deluxe Pirate Hat.png\"\n  },\n  {\n    \"id\": \"43\",\n    \"name\": \"Dinosaur Hat\",\n    \"description\": \"A hat fashioned to look like a small dinosaur.\",\n    \"obtain\": \"Tailoring\",\n    \"image\": \"images/hats/Dinosaur Hat.png\"\n  },\n  {\n    \"id\": \"11\",\n    \"name\": \"Earmuffs\",\n    \"description\": \"Keep your ears toasty. Lined with artisanal velvet from Castle Village.\",\n    \"obtain\": \"Reach 5-heart friendship with 20 people (Popular achievement)\",\n    \"image\": \"images/hats/Earmuffs.png\",\n    \"price\": 4000\n  },\n  {\n    \"id\": \"64\",\n    \"name\": \"Elegant Turban\",\n    \"description\": \"A fine black silk turban with gold trim.\",\n    \"obtain\": \"Earn all other achievements\",\n    \"image\": \"images/hats/Elegant Turban.png\",\n    \"price\": 50000\n  },\n  {\n    \"id\": \"41\",\n    \"name\": \"Emily's Magic Hat\",\n    \"description\": \"Made with love by Emily. It's 100% organic!\",\n    \"obtain\": \"Obtained in Emily's 14-heart cutscene\",\n    \"image\": \"images/hats/Emily's Magic Hat.png\"\n  },\n  {\n    \"id\": \"24\",\n    \"name\": \"Eye Patch\",\n    \"description\": \"You can't tell if it's real or just from a costume shop.\",\n    \"obtain\": \"Catch every fish (Master Angler achievement)\",\n    \"image\": \"images/hats/Eye Patch.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"47\",\n    \"name\": \"Fashion Hat\",\n    \"description\": \"A fashionable hat with a feather in the brim.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Fashion Hat.png\"\n  },\n  {\n    \"id\": \"19\",\n    \"name\": \"Fedora\",\n    \"description\": \"A city-slicker's standard.\",\n    \"obtain\": \"Purchase for 500 tokens at Stardew Valley Fair\",\n    \"image\": \"images/hats/Fedora.png\"\n  },\n  {\n    \"id\": \"55\",\n    \"name\": \"Fishing Hat\",\n    \"description\": \"The wide brim keeps you shaded when fishing on the riverbank.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Fishing Hat.png\"\n  },\n  {\n    \"id\": \"63\",\n    \"name\": \"Flat Topped Hat\",\n    \"description\": \"An old style of hat once considered very fashionable.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Flat Topped Hat.png\"\n  },\n  {\n    \"id\": \"54\",\n    \"name\": \"Floppy Beanie\",\n    \"description\": \"A warm hat with a looser fit.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Floppy Beanie.png\"\n  },\n  {\n    \"id\": \"90\",\n    \"name\": \"Forager's Hat\",\n    \"description\": \"It's a forager's delight.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Forager's Hat.png\"\n  },\n  {\n    \"id\": \"78\",\n    \"name\": \"Frog Hat\",\n    \"description\": \"A slimy friend that lives on your dome.\",\n    \"obtain\": \"Fish in Gourmand Frog's cave on Ginger Island\",\n    \"image\": \"images/hats/Frog Hat.png\"\n  },\n  {\n    \"id\": \"66\",\n    \"name\": \"Garbage Hat\",\n    \"description\": \"It's a garbage can lid 'upcycled' into a hat...\",\n    \"obtain\": \"0.2% chance from garbage cans after checking 20 cans\",\n    \"image\": \"images/hats/Garbage Hat.png\"\n  },\n  {\n    \"id\": \"GilsHat\",\n    \"name\": \"Gil's Hat\",\n    \"description\": \"It's the same hat that Gil wears.\",\n    \"obtain\": \"Reward for egg rating of 25-54 to Gil at Desert Festival\",\n    \"image\": \"images/hats/Gil's Hat.png\"\n  },\n  {\n    \"id\": \"23\",\n    \"name\": \"Gnome's Cap\",\n    \"description\": \"This gnome had a very large head.\",\n    \"obtain\": \"Craft every item (Craft Master achievement)\",\n    \"image\": \"images/hats/Gnome's Cap.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"9\",\n    \"name\": \"Goblin Mask\",\n    \"description\": \"Freak out the neighborhood with this creepy mask. Rubber ear joints for effect.\",\n    \"obtain\": \"Ship every item (Full Shipment achievement)\",\n    \"image\": \"images/hats/Goblin Mask.png\",\n    \"price\": 10000\n  },\n  {\n    \"id\": \"89\",\n    \"name\": \"Goggles\",\n    \"description\": \"These will make you look very safe.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Goggles.png\"\n  },\n  {\n    \"id\": \"gold-pan-hat\",\n    \"name\": \"Gold Pan (hat)\",\n    \"description\": \"You place the gold pan on your head...\",\n    \"obtain\": \"Place Gold Pan in hat slot in inventory\",\n    \"image\": \"images/hats/Gold Pan (hat).png\"\n  },\n  {\n    \"id\": \"75\",\n    \"name\": \"Golden Helmet\",\n    \"description\": \"It's half of a golden coconut.\",\n    \"obtain\": \"5% chance from opening Golden Coconuts\",\n    \"image\": \"images/hats/Golden Helmet.png\"\n  },\n  {\n    \"id\": \"67\",\n    \"name\": \"Golden Mask\",\n    \"description\": \"A faithful recreation of the Calico Desert relic!\",\n    \"obtain\": \"Tailoring\",\n    \"image\": \"images/hats/Golden Mask (hat).png\"\n  },\n  {\n    \"id\": \"18\",\n    \"name\": \"Good Ol' Cap\",\n    \"description\": \"A floppy old topper with a creased bill. Looks like it's been through a lot.\",\n    \"obtain\": \"Earn 15,000g (Greenhorn achievement)\",\n    \"image\": \"images/hats/Good Ol' Cap.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"GovernorsHat\",\n    \"name\": \"Governor's Hat\",\n    \"description\": \"A replica of the Governor's iconic hat.\",\n    \"obtain\": \"Delight the Governor at Luau (An Unforgettable Soup achievement)\",\n    \"image\": \"images/hats/Governor's Hat.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"72\",\n    \"name\": \"Green Turban\",\n    \"description\": \"A green silk turban with a gold ornament on the front.\",\n    \"obtain\": \"Desert Trader for 50 Omni Geodes\",\n    \"image\": \"images/hats/Green Turban.png\"\n  },\n  {\n    \"id\": \"49\",\n    \"name\": \"Hair Bone\",\n    \"description\": \"A prehistoric version of the hair bow.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Hair Bone.png\"\n  },\n  {\n    \"id\": \"27\",\n    \"name\": \"Hard Hat\",\n    \"description\": \"Keep your dome in one piece.\",\n    \"obtain\": \"Defeat 30 Duggies (Monster Eradication Goal)\",\n    \"image\": \"images/hats/Hard Hat.png\"\n  },\n  {\n    \"id\": \"15\",\n    \"name\": \"Hunter's Cap\",\n    \"description\": \"The wool lining should stay warm deep into the forest.\",\n    \"obtain\": \"Upgrade house to maximum size (Living Large achievement)\",\n    \"image\": \"images/hats/Hunter's Cap.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"InfinityCrown\",\n    \"name\": \"Infinity Crown\",\n    \"description\": \"It's made from an exotic metal you've never seen before.\",\n    \"obtain\": \"Obtain most powerful weapon (Infinite Power achievement)\",\n    \"image\": \"images/hats/Infinity Crown.png\",\n    \"price\": 20000\n  },\n  {\n    \"id\": \"iridium-pan-hat\",\n    \"name\": \"Iridium Pan (hat)\",\n    \"description\": \"You place the iridium pan on your head...\",\n    \"obtain\": \"Place Iridium Pan in hat slot in inventory\",\n    \"image\": \"images/hats/Iridium Pan (hat).png\"\n  },\n  {\n    \"id\": \"JesterHat\",\n    \"name\": \"Jester Hat\",\n    \"description\": \"Put your inner clown on display.\",\n    \"obtain\": \"See a movie (Two Thumbs Up achievement)\",\n    \"image\": \"images/hats/Jester Hat.png\",\n    \"price\": 25000\n  },\n  {\n    \"id\": \"JojaCap\",\n    \"name\": \"Joja Cap\",\n    \"description\": \"An official Joja Cap. Made from 100% polyester.\",\n    \"obtain\": \"Random from Emily's outfit services at Desert Festival\",\n    \"image\": \"images/hats/Joja Cap.png\"\n  },\n  {\n    \"id\": \"JunimoHat\",\n    \"name\": \"Junimo Hat\",\n    \"description\": \"To honor our little buddies...\",\n    \"obtain\": \"Reach Perfection and visit the Summit\",\n    \"image\": \"images/hats/Junimo Hat.png\",\n    \"price\": 25000\n  },\n  {\n    \"id\": \"50\",\n    \"name\": \"Knight's Helmet\",\n    \"description\": \"It looks just like the real thing!\",\n    \"obtain\": \"Defeat 50 Pepper Rex (Monster Eradication Goal)\",\n    \"image\": \"images/hats/Knight's Helmet.png\"\n  },\n  {\n    \"id\": \"LaurelWreathCrown\",\n    \"name\": \"Laurel Wreath Crown\",\n    \"description\": \"A garland of leaves shaped into a lovely crown.\",\n    \"obtain\": \"Random from Emily's outfit services at Desert Festival\",\n    \"image\": \"images/hats/Laurel Wreath Crown.png\"\n  },\n  {\n    \"id\": \"LeprechuanHat\",\n    \"name\": \"Leprechaun Hat\",\n    \"description\": \"The previous owner must've had a big head for a Leprechaun.\",\n    \"obtain\": \"Pot of gold by rainbow next to Abandoned House on Spring 17th\",\n    \"image\": \"images/hats/Leprechaun Hat.png\"\n  },\n  {\n    \"id\": \"40\",\n    \"name\": \"Living Hat\",\n    \"description\": \"It absorbs moisture from your scalp. No watering needed!\",\n    \"obtain\": \"0.001% chance finding while cutting weeds; 0.01% chance from Wilderness Golems\",\n    \"image\": \"images/hats/Living Hat.png\"\n  },\n  {\n    \"id\": \"45\",\n    \"name\": \"Logo Cap\",\n    \"description\": \"A pink cap with a sleek profile.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Logo Cap.png\"\n  },\n  {\n    \"id\": \"21\",\n    \"name\": \"Lucky Bow\",\n    \"description\": \"The middle is made of solid gold.\",\n    \"obtain\": \"Earn 50,000g (Cowpoke achievement)\",\n    \"image\": \"images/hats/Lucky Bow.png\",\n    \"price\": 2000\n  },\n  {\n    \"id\": \"73\",\n    \"name\": \"Magic Cowboy Hat\",\n    \"description\": \"It's shimmering with prismatic energy.\",\n    \"obtain\": \"Desert Trader for 333 Omni Geodes on odd days\",\n    \"image\": \"images/hats/Magic Cowboy Hat.png\"\n  },\n  {\n    \"id\": \"74\",\n    \"name\": \"Magic Turban\",\n    \"description\": \"It's shimmering with prismatic energy.\",\n    \"obtain\": \"Desert Trader for 333 Omni Geodes on even days\",\n    \"image\": \"images/hats/Magic Turban.png\"\n  },\n  {\n    \"id\": \"31\",\n    \"name\": \"Mouse Ears\",\n    \"description\": \"Made from synthetic fibers.\",\n    \"obtain\": \"Reach 10-heart friendship with someone (Best Friends achievement)\",\n    \"image\": \"images/hats/Mouse Ears.png\",\n    \"price\": 2000\n  },\n  {\n    \"id\": \"82\",\n    \"name\": \"Mr. Qi's Hat\",\n    \"description\": \"A replica of Mr. Qi's iconic hat.\",\n    \"obtain\": \"Purchase for 5 Qi Gems in Qi's Walnut Room\",\n    \"image\": \"images/hats/Mr. Qi's Hat.png\"\n  },\n  {\n    \"id\": \"MummyMask\",\n    \"name\": \"Mummy Mask\",\n    \"description\": \"A large mummy mask... frightening!\",\n    \"obtain\": \"Purchase for 120 Calico Eggs from Calico Egg Merchant at Desert Festival\",\n    \"image\": \"images/hats/Mummy Mask.png\"\n  },\n  {\n    \"id\": \"42\",\n    \"name\": \"Mushroom Cap\",\n    \"description\": \"It smells earthy.\",\n    \"obtain\": \"1% chance when chopping down Mushroom Tree\",\n    \"image\": \"images/hats/Mushroom Cap.png\"\n  },\n  {\n    \"id\": \"MysteryHat\",\n    \"name\": \"Mystery Hat\",\n    \"description\": \"Made from the leftovers of a Mystery Box.\",\n    \"obtain\": \"From Mystery Boxes or Golden Mystery Boxes\",\n    \"image\": \"images/hats/Mystery Hat.png\"\n  },\n  {\n    \"id\": \"5\",\n    \"name\": \"Official Cap\",\n    \"description\": \"Looks like it belonged to a postman or policeman. Either way, it's still very soft and smells okay.\",\n    \"obtain\": \"Catch 24 different fish (Ol' Mariner achievement)\",\n    \"image\": \"images/hats/Official Cap.png\",\n    \"price\": 2000\n  },\n  {\n    \"id\": \"PageboyCap\",\n    \"name\": \"Pageboy Cap\",\n    \"description\": \"For some reason, it makes you want to sell newspapers.\",\n    \"obtain\": \"Read every book (Well-Read achievement)\",\n    \"image\": \"images/hats/Pageboy Cap.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"36\",\n    \"name\": \"Panda Hat\",\n    \"description\": \"A lovely panda hat.\",\n    \"obtain\": \"WeGame exclusive content; unobtainable otherwise\",\n    \"image\": \"images/hats/Panda Hat.png\"\n  },\n  {\n    \"id\": \"PaperHat\",\n    \"name\": \"Paper Hat\",\n    \"description\": \"It's made out of special paper that won't disintegrate in the rain.\",\n    \"obtain\": \"Reach Ginger Island (A Distant Shore achievement)\",\n    \"image\": \"images/hats/Paper Hat.png\",\n    \"price\": 10000\n  },\n  {\n    \"id\": \"party-hat-blue\",\n    \"name\": \"Party Hat (blue)\",\n    \"description\": \"A goofy blue hat that makes any celebration more fun.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Party Hat (blue).png\"\n  },\n  {\n    \"id\": \"party-hat-green\",\n    \"name\": \"Party Hat (green)\",\n    \"description\": \"A goofy green hat that makes any celebration more fun.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Party Hat (green).png\"\n  },\n  {\n    \"id\": \"party-hat-red\",\n    \"name\": \"Party Hat (red)\",\n    \"description\": \"A goofy red hat that makes any celebration more fun.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Party Hat (red).png\"\n  },\n  {\n    \"id\": \"77\",\n    \"name\": \"Pink Bow\",\n    \"description\": \"This huge bow makes quite a statement!\",\n    \"obtain\": \"Purchase for 10,000g from Dwarf Shop in Volcano Dungeon (25% chance)\",\n    \"image\": \"images/hats/Pink Bow.png\"\n  },\n  {\n    \"id\": \"62\",\n    \"name\": \"Pirate Hat\",\n    \"description\": \"A captain's hat with a horrible skull on the front.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Pirate Hat.png\"\n  },\n  {\n    \"id\": \"7\",\n    \"name\": \"Plum Chapeau\",\n    \"description\": \"Looks alright.\",\n    \"obtain\": \"Cook 25 different recipes (Sous Chef achievement)\",\n    \"image\": \"images/hats/Plum Chapeau.png\",\n    \"price\": 2000\n  },\n  {\n    \"id\": \"22\",\n    \"name\": \"Polka Bow\",\n    \"description\": \"This one's sure to turn heads.\",\n    \"obtain\": \"Complete 10 Help Wanted requests (Gofer achievement)\",\n    \"image\": \"images/hats/Polka Bow.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"68\",\n    \"name\": \"Propeller Hat\",\n    \"description\": \"A goofy hat with a propeller on top.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Propeller Hat.png\"\n  },\n  {\n    \"id\": \"48\",\n    \"name\": \"Pumpkin Mask\",\n    \"description\": \"This must have been a pretty big pumpkin once...\",\n    \"obtain\": \"Tailoring\",\n    \"image\": \"images/hats/Pumpkin Mask.png\"\n  },\n  {\n    \"id\": \"86\",\n    \"name\": \"Qi Mask\",\n    \"description\": \"???\",\n    \"obtain\": \"Tailoring\",\n    \"image\": \"images/hats/Qi Mask.png\"\n  },\n  {\n    \"id\": \"RaccoonHat\",\n    \"name\": \"Raccoon Hat\",\n    \"description\": \"A classic hat from the old frontier days.\",\n    \"obtain\": \"Fulfill third request from Raccoon at Giant Stump\",\n    \"image\": \"images/hats/Raccoon Hat.png\"\n  },\n  {\n    \"id\": \"84\",\n    \"name\": \"Radioactive Goggles\",\n    \"description\": \"Doesn't actually provide any protection from radiation.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Radioactive Goggles.png\"\n  },\n  {\n    \"id\": \"38\",\n    \"name\": \"Red Cowboy Hat\",\n    \"description\": \"An eye-catching cowboy hat in red suede.\",\n    \"obtain\": \"Skull Cavern treasure chests\",\n    \"image\": \"images/hats/Red Cowboy Hat.png\"\n  },\n  {\n    \"id\": \"RedFez\",\n    \"name\": \"Red Fez\",\n    \"description\": \"A unique hat made popular by the famous merchant pig.\",\n    \"obtain\": \"Purchase for 8,000g from Traveling Cart (10% chance)\",\n    \"image\": \"images/hats/Red Fez.png\"\n  },\n  {\n    \"id\": \"17\",\n    \"name\": \"Sailor's Cap\",\n    \"description\": \"It's fresh and starchy.\",\n    \"obtain\": \"Win fishing competition at Festival of Ice\",\n    \"image\": \"images/hats/Sailor's Cap.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"25\",\n    \"name\": \"Santa Hat\",\n    \"description\": \"Celebrate the magical season.\",\n    \"obtain\": \"Reach 5-heart friendship with 10 people (Networking achievement)\",\n    \"image\": \"images/hats/Santa Hat.png\",\n    \"price\": 2000\n  },\n  {\n    \"id\": \"8\",\n    \"name\": \"Skeleton Mask\",\n    \"description\": \"The red eyes are glowing mysteriously.\",\n    \"obtain\": \"Defeat 50 Skeletons (Monster Eradication Goal)\",\n    \"image\": \"images/hats/Skeleton Mask.png\"\n  },\n  {\n    \"id\": \"79\",\n    \"name\": \"Small Cap\",\n    \"description\": \"It's a more aerodynamic style of cap.\",\n    \"obtain\": \"Island Trader on Mondays for 30 Taro Roots\",\n    \"image\": \"images/hats/Small Cap.png\"\n  },\n  {\n    \"id\": \"3\",\n    \"name\": \"Sombrero\",\n    \"description\": \"A festively decorated hat made from woven straw.\",\n    \"obtain\": \"Earn 10,000,000g (Legend achievement)\",\n    \"image\": \"images/hats/Sombrero.png\",\n    \"price\": 25000\n  },\n  {\n    \"id\": \"28\",\n    \"name\": \"Sou'wester\",\n    \"description\": \"The shape helps to keep sailors dry during storms.\",\n    \"obtain\": \"Catch 10 different fish (Fisherman achievement)\",\n    \"image\": \"images/hats/Sou'wester.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"SpaceHelmet\",\n    \"name\": \"Space Helmet\",\n    \"description\": \"Warning: This helmet has not actually been tested in outer space.\",\n    \"obtain\": \"Reach bottom of dangerous mines (Danger In The Deep achievement)\",\n    \"image\": \"images/hats/Space Helmet.png\",\n    \"price\": 20000\n  },\n  {\n    \"id\": \"SportsCap\",\n    \"name\": \"Sports Cap\",\n    \"description\": \"The cap has a vintage team logo on it.\",\n    \"obtain\": \"Prize Machine at Mayor's Manor\",\n    \"image\": \"images/hats/Sports Cap.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"52\",\n    \"name\": \"Spotted Headscarf\",\n    \"description\": \"A red polka-dot scarf tied around the head.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Spotted Headscarf.png\"\n  },\n  {\n    \"id\": \"SquidHat\",\n    \"name\": \"Squid Hat\",\n    \"description\": \"It's your chance to wear a squid on the head.\",\n    \"obtain\": \"Reward from SquidFest\",\n    \"image\": \"images/hats/Squid Hat.png\"\n  },\n  {\n    \"id\": \"51\",\n    \"name\": \"Squire's Helmet\",\n    \"description\": \"The face is exposed to increase air flow.\",\n    \"obtain\": \"Monster drop from Metal Heads\",\n    \"image\": \"images/hats/Squire's Helmet.png\"\n  },\n  {\n    \"id\": \"87\",\n    \"name\": \"Star Helmet\",\n    \"description\": \"A red hat with stars on it.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Star Helmet.png\"\n  },\n  {\n    \"id\": \"steel-pan-hat\",\n    \"name\": \"Steel Pan (hat)\",\n    \"description\": \"You place the steel pan on your head...\",\n    \"obtain\": \"Place Steel Pan in hat slot in inventory\",\n    \"image\": \"images/hats/Steel Pan (hat).png\"\n  },\n  {\n    \"id\": \"4\",\n    \"name\": \"Straw Hat\",\n    \"description\": \"Light and cool, it's a farmer's delight.\",\n    \"obtain\": \"Win egg hunt at Egg Festival\",\n    \"image\": \"images/hats/Straw Hat.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"88\",\n    \"name\": \"Sunglasses\",\n    \"description\": \"These give you a relaxed look.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Sunglasses.png\"\n  },\n  {\n    \"id\": \"85\",\n    \"name\": \"Swashbuckler Hat\",\n    \"description\": \"The classic swashbuckler look.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Swashbuckler Hat.png\"\n  },\n  {\n    \"id\": \"26\",\n    \"name\": \"Tiara\",\n    \"description\": \"This one has a big amethyst encircled by gold.\",\n    \"obtain\": \"Reach 5-heart friendship with 4 people (Cliques achievement)\",\n    \"image\": \"images/hats/Tiara.png\",\n    \"price\": 2000\n  },\n  {\n    \"id\": \"91\",\n    \"name\": \"Tiger Hat\",\n    \"description\": \"Makes you look like a beautiful tiger.\",\n    \"obtain\": \"0.1% chance from Tiger Slimes\",\n    \"image\": \"images/hats/Tiger Hat.png\"\n  },\n  {\n    \"id\": \"2\",\n    \"name\": \"Top Hat\",\n    \"description\": \"A gentleman's classic.\",\n    \"obtain\": \"Purchase for 8,000 Qi Coins at Casino\",\n    \"image\": \"images/hats/Top Hat.png\"\n  },\n  {\n    \"id\": \"44\",\n    \"name\": \"Totem Mask\",\n    \"description\": \"Don't worry, it won't warp your face...\",\n    \"obtain\": \"Tailoring\",\n    \"image\": \"images/hats/Totem Mask.png\"\n  },\n  {\n    \"id\": \"TricornHat\",\n    \"name\": \"Tricorn Hat\",\n    \"description\": \"It's a traditional hat for naval officers.\",\n    \"obtain\": \"Purchase for 100 Calico Eggs from Elliott's shop at Desert Festival\",\n    \"image\": \"images/hats/Tricorn Hat.png\"\n  },\n  {\n    \"id\": \"13\",\n    \"name\": \"Tropiclip\",\n    \"description\": \"It's shaped like a little palm tree.\",\n    \"obtain\": \"Upgrade your house (Moving Up achievement)\",\n    \"image\": \"images/hats/Tropiclip.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"16\",\n    \"name\": \"Trucker Hat\",\n    \"description\": \"Mesh in the back to keep your head cool.\",\n    \"obtain\": \"Craft 30 different items (Artisan achievement)\",\n    \"image\": \"images/hats/Trucker Hat.png\",\n    \"price\": 2000\n  },\n  {\n    \"id\": \"93\",\n    \"name\": \"Warrior Helmet\",\n    \"description\": \"An Ostrich eggshell repurposed into a helmet.\",\n    \"obtain\": \"Tailoring\",\n    \"image\": \"images/hats/Warrior Helmet.png\"\n  },\n  {\n    \"id\": \"30\",\n    \"name\": \"Watermelon Band\",\n    \"description\": \"The color scheme was inspired by the beloved summer melon.\",\n    \"obtain\": \"Catch 100 fish (Mother Catch achievement)\",\n    \"image\": \"images/hats/Watermelon Band.png\",\n    \"price\": 1000\n  },\n  {\n    \"id\": \"46\",\n    \"name\": \"Wearable Dwarf Helm\",\n    \"description\": \"A slightly larger, human sized version of helmets worn by dwarves.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Wearable Dwarf Helm.png\"\n  },\n  {\n    \"id\": \"WhiteBow\",\n    \"name\": \"White Bow\",\n    \"description\": \"A bow as white as snow.\",\n    \"obtain\": \"Help forest neighbors grow family (Good Neighbors achievement)\",\n    \"image\": \"images/hats/White Bow.png\",\n    \"price\": 5000\n  },\n  {\n    \"id\": \"65\",\n    \"name\": \"White Turban\",\n    \"description\": \"A fine white silk turban with blue trim.\",\n    \"obtain\": \"Tailoring; Skull Cavern treasure chests\",\n    \"image\": \"images/hats/White Turban.png\"\n  },\n  {\n    \"id\": \"70\",\n    \"name\": \"Witch Hat\",\n    \"description\": \"A pointy hat popular with witches.\",\n    \"obtain\": \"Tailoring; random drop during various player actions\",\n    \"image\": \"images/hats/Witch Hat.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport hatData from '@/data/hats.json';\nimport { Hat } from '@/types';\n\nconst hatsData: Hat[] = hatData as Hat[];\n\n/** Query builder for hat data. All sort methods return a new HatQuery for chaining. */\nexport class HatQuery extends QueryBase<Hat> {\n  constructor(data: Hat[] = hatsData) {\n    super(data);\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): HatQuery {\n    return new HatQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n}\n\n/** Returns a HatQuery for all hat data. Pass `source` to wrap a pre-filtered array. */\nexport function hats(source: Hat[] = hatsData): HatQuery {\n  return new HatQuery(source);\n}\n","[\n  {\n    \"id\": \"80\",\n    \"name\": \"Quartz\",\n    \"kind\": \"mineral\",\n    \"description\": \"A clear crystal commonly found in caves and mines.\",\n    \"sellPrice\": 25,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 32,\n    \"locations\": [\"The Mines (Floors 1-120)\", \"Garbage Can\", \"Stone Golem (10%)\"],\n    \"image\": \"images/minerals/foraged-minerals/Quartz.png\"\n  },\n  {\n    \"id\": \"86\",\n    \"name\": \"Earth Crystal\",\n    \"kind\": \"mineral\",\n    \"description\": \"A resinous substance found near the surface.\",\n    \"sellPrice\": 50,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 65,\n    \"locations\": [\"The Mines (Floors 1-39)\", \"Duggy (10%)\", \"Geode\", \"Omni Geode\", \"Panning\"],\n    \"image\": \"images/minerals/foraged-minerals/Earth Crystal.png\"\n  },\n  {\n    \"id\": \"84\",\n    \"name\": \"Frozen Tear\",\n    \"kind\": \"mineral\",\n    \"description\": \"A crystal fabled to be the frozen tears of a yeti.\",\n    \"sellPrice\": 75,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 97,\n    \"locations\": [\"The Mines (Floors 40-79)\", \"Frozen Geode\", \"Omni Geode\", \"Panning\"],\n    \"image\": \"images/minerals/foraged-minerals/Frozen Tear.png\"\n  },\n  {\n    \"id\": \"82\",\n    \"name\": \"Fire Quartz\",\n    \"kind\": \"mineral\",\n    \"description\": \"A glowing red crystal commonly found near hot lava.\",\n    \"sellPrice\": 100,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 130,\n    \"locations\": [\"The Mines (Floors 80-120)\", \"Magma Geode\", \"Omni Geode\", \"Panning\"],\n    \"image\": \"images/minerals/foraged-minerals/Fire Quartz.png\"\n  },\n  {\n    \"id\": \"60\",\n    \"name\": \"Emerald\",\n    \"kind\": \"mineral\",\n    \"description\": \"A precious stone with a brilliant green color.\",\n    \"sellPrice\": 250,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 325,\n    \"locations\": [\n      \"Emerald Node\",\n      \"Gem Node\",\n      \"Dwarvish Sentry\",\n      \"Panning\",\n      \"Fishing Treasure Chest\"\n    ],\n    \"image\": \"images/minerals/gems/Emerald.png\"\n  },\n  {\n    \"id\": \"62\",\n    \"name\": \"Aquamarine\",\n    \"kind\": \"mineral\",\n    \"description\": \"A shimmery blue-green gem.\",\n    \"sellPrice\": 180,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 234,\n    \"locations\": [\n      \"Aquamarine Node\",\n      \"Gem Node\",\n      \"Dwarvish Sentry\",\n      \"Panning\",\n      \"Fishing Treasure Chest\"\n    ],\n    \"image\": \"images/minerals/gems/Aquamarine.png\"\n  },\n  {\n    \"id\": \"64\",\n    \"name\": \"Ruby\",\n    \"kind\": \"mineral\",\n    \"description\": \"A precious stone sought after for its rich color and beautiful luster.\",\n    \"sellPrice\": 250,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 325,\n    \"locations\": [\"Ruby Node\", \"Gem Node\", \"Dwarvish Sentry\", \"Panning\", \"Fishing Treasure Chest\"],\n    \"image\": \"images/minerals/gems/Ruby.png\"\n  },\n  {\n    \"id\": \"66\",\n    \"name\": \"Amethyst\",\n    \"kind\": \"mineral\",\n    \"description\": \"A purple variant of quartz.\",\n    \"sellPrice\": 100,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 130,\n    \"locations\": [\"Amethyst Node\", \"Gem Node\", \"Green Slimes\", \"Dwarvish Sentry\", \"Panning\"],\n    \"image\": \"images/minerals/gems/Amethyst.png\"\n  },\n  {\n    \"id\": \"68\",\n    \"name\": \"Topaz\",\n    \"kind\": \"mineral\",\n    \"description\": \"Fairly common but still prized for its beauty.\",\n    \"sellPrice\": 80,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 104,\n    \"locations\": [\"Topaz Node\", \"Gem Node\", \"Dwarvish Sentry\", \"Panning\", \"Fishing Treasure Chest\"],\n    \"image\": \"images/minerals/gems/Topaz.png\"\n  },\n  {\n    \"id\": \"70\",\n    \"name\": \"Jade\",\n    \"kind\": \"mineral\",\n    \"description\": \"A pale green ornamental stone.\",\n    \"sellPrice\": 200,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 260,\n    \"locations\": [\n      \"Jade Node\",\n      \"Gem Node\",\n      \"Blue Slimes\",\n      \"Dwarvish Sentry\",\n      \"Fishing Treasure Chest\"\n    ],\n    \"image\": \"images/minerals/gems/Jade.png\"\n  },\n  {\n    \"id\": \"72\",\n    \"name\": \"Diamond\",\n    \"kind\": \"mineral\",\n    \"description\": \"A rare and valuable gem.\",\n    \"sellPrice\": 750,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 974,\n    \"locations\": [\n      \"Diamond Node\",\n      \"Gem Node\",\n      \"Dwarvish Sentry\",\n      \"Panning\",\n      \"Monster drops (0.05%)\"\n    ],\n    \"image\": \"images/minerals/gems/Diamond.png\"\n  },\n  {\n    \"id\": \"74\",\n    \"name\": \"Prismatic Shard\",\n    \"kind\": \"mineral\",\n    \"description\": \"A very rare and powerful substance with unknown origins.\",\n    \"sellPrice\": 2000,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 2600,\n    \"locations\": [\n      \"Iridium Node (4%)\",\n      \"Mystic Stone (25%)\",\n      \"Omni Geode (0.4%)\",\n      \"Shadow creatures\",\n      \"Fishing Treasure Chest\"\n    ],\n    \"image\": \"images/minerals/gems/Prismatic Shard.png\"\n  },\n  {\n    \"id\": \"562\",\n    \"name\": \"Tigerseye\",\n    \"kind\": \"mineral\",\n    \"description\": \"A stripe of shimmering gold gives this gem a warm luster.\",\n    \"sellPrice\": 275,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 357,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Tigerseye.png\"\n  },\n  {\n    \"id\": \"564\",\n    \"name\": \"Opal\",\n    \"kind\": \"mineral\",\n    \"description\": \"Its internal structure causes it to reflect a rainbow of light.\",\n    \"sellPrice\": 150,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 195,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Opal.png\"\n  },\n  {\n    \"id\": \"565\",\n    \"name\": \"Fire Opal\",\n    \"kind\": \"mineral\",\n    \"description\": \"A rare variety of opal, named for its red spots.\",\n    \"sellPrice\": 350,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 455,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Fire Opal.png\"\n  },\n  {\n    \"id\": \"538\",\n    \"name\": \"Alamite\",\n    \"kind\": \"mineral\",\n    \"description\": \"Its distinctive fluorescence makes it a favorite among rock collectors.\",\n    \"sellPrice\": 150,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 195,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Alamite.png\"\n  },\n  {\n    \"id\": \"539\",\n    \"name\": \"Bixite\",\n    \"kind\": \"mineral\",\n    \"description\": \"A dark metallic Mineral sought after for its cubic structure.\",\n    \"sellPrice\": 300,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 390,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\", \"Black Slime\"],\n    \"image\": \"images/minerals/geode-minerals/Bixite.png\"\n  },\n  {\n    \"id\": \"540\",\n    \"name\": \"Baryte\",\n    \"kind\": \"mineral\",\n    \"description\": \"The best specimens resemble a desert rose.\",\n    \"sellPrice\": 50,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 65,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Baryte.png\"\n  },\n  {\n    \"id\": \"541\",\n    \"name\": \"Aerinite\",\n    \"kind\": \"mineral\",\n    \"description\": \"These crystals are curiously light.\",\n    \"sellPrice\": 125,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 162,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Aerinite.png\"\n  },\n  {\n    \"id\": \"542\",\n    \"name\": \"Calcite\",\n    \"kind\": \"mineral\",\n    \"description\": \"This yellow crystal is speckled with shimmering nodules.\",\n    \"sellPrice\": 75,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 97,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Calcite.png\"\n  },\n  {\n    \"id\": \"543\",\n    \"name\": \"Dolomite\",\n    \"kind\": \"mineral\",\n    \"description\": \"It can occur in coral reefs, often near an underwater volcano.\",\n    \"sellPrice\": 300,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 390,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Dolomite.png\"\n  },\n  {\n    \"id\": \"544\",\n    \"name\": \"Esperite\",\n    \"kind\": \"mineral\",\n    \"description\": \"The crystals glow bright green when stimulated.\",\n    \"sellPrice\": 100,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 130,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Esperite.png\"\n  },\n  {\n    \"id\": \"545\",\n    \"name\": \"Fluorapatite\",\n    \"kind\": \"mineral\",\n    \"description\": \"Small amounts are found in human teeth.\",\n    \"sellPrice\": 200,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 260,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Fluorapatite.png\"\n  },\n  {\n    \"id\": \"546\",\n    \"name\": \"Geminite\",\n    \"kind\": \"mineral\",\n    \"description\": \"Occurs in brilliant clusters.\",\n    \"sellPrice\": 150,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 195,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Geminite.png\"\n  },\n  {\n    \"id\": \"547\",\n    \"name\": \"Helvite\",\n    \"kind\": \"mineral\",\n    \"description\": \"It grows in a triangular column.\",\n    \"sellPrice\": 450,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 585,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Helvite.png\"\n  },\n  {\n    \"id\": \"548\",\n    \"name\": \"Jamborite\",\n    \"kind\": \"mineral\",\n    \"description\": \"The crystals are so tightly packed it almost looks fuzzy.\",\n    \"sellPrice\": 150,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 195,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Jamborite.png\"\n  },\n  {\n    \"id\": \"549\",\n    \"name\": \"Jagoite\",\n    \"kind\": \"mineral\",\n    \"description\": \"A high volume of tiny crystals makes it very glittery.\",\n    \"sellPrice\": 115,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 149,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Jagoite.png\"\n  },\n  {\n    \"id\": \"550\",\n    \"name\": \"Kyanite\",\n    \"kind\": \"mineral\",\n    \"description\": \"The geometric faces are as smooth as glass.\",\n    \"sellPrice\": 250,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 325,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Kyanite.png\"\n  },\n  {\n    \"id\": \"551\",\n    \"name\": \"Lunarite\",\n    \"kind\": \"mineral\",\n    \"description\": \"The cratered white orbs form a tight cluster.\",\n    \"sellPrice\": 200,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 260,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Lunarite.png\"\n  },\n  {\n    \"id\": \"552\",\n    \"name\": \"Malachite\",\n    \"kind\": \"mineral\",\n    \"description\": \"A popular ornamental stone, used in sculpture and to make green paint.\",\n    \"sellPrice\": 100,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 130,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Malachite.png\"\n  },\n  {\n    \"id\": \"553\",\n    \"name\": \"Neptunite\",\n    \"kind\": \"mineral\",\n    \"description\": \"A jet-black crystal that is unusually reflective.\",\n    \"sellPrice\": 400,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 520,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\", \"Black Slime\"],\n    \"image\": \"images/minerals/geode-minerals/Neptunite.png\"\n  },\n  {\n    \"id\": \"554\",\n    \"name\": \"Lemon Stone\",\n    \"kind\": \"mineral\",\n    \"description\": \"Some claim the powdered crystal is a dwarvish delicacy.\",\n    \"sellPrice\": 200,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 260,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Lemon Stone.png\"\n  },\n  {\n    \"id\": \"555\",\n    \"name\": \"Nekoite\",\n    \"kind\": \"mineral\",\n    \"description\": \"The delicate shards form a tiny pink meadow.\",\n    \"sellPrice\": 80,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 104,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Nekoite.png\"\n  },\n  {\n    \"id\": \"556\",\n    \"name\": \"Orpiment\",\n    \"kind\": \"mineral\",\n    \"description\": \"Despite its high toxicity, used widely in manufacturing and folk medicine.\",\n    \"sellPrice\": 80,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 104,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Orpiment.png\"\n  },\n  {\n    \"id\": \"557\",\n    \"name\": \"Petrified Slime\",\n    \"kind\": \"mineral\",\n    \"description\": \"This little guy may be 100,000 years old.\",\n    \"sellPrice\": 120,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 156,\n    \"locations\": [\"Geode\", \"Omni Geode\", \"Slime Ball\"],\n    \"image\": \"images/minerals/geode-minerals/Petrified Slime.png\"\n  },\n  {\n    \"id\": \"558\",\n    \"name\": \"Thunder Egg\",\n    \"kind\": \"mineral\",\n    \"description\": \"According to legend, angry thunder spirits would throw these stones.\",\n    \"sellPrice\": 100,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 130,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Thunder Egg.png\"\n  },\n  {\n    \"id\": \"559\",\n    \"name\": \"Pyrite\",\n    \"kind\": \"mineral\",\n    \"description\": \"Commonly known as \\\"Fool's Gold\\\".\",\n    \"sellPrice\": 120,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 156,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Pyrite.png\"\n  },\n  {\n    \"id\": \"560\",\n    \"name\": \"Ocean Stone\",\n    \"kind\": \"mineral\",\n    \"description\": \"An old legend claims these stones are the mosaics of ancient mermaids.\",\n    \"sellPrice\": 220,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 286,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Ocean Stone.png\"\n  },\n  {\n    \"id\": \"561\",\n    \"name\": \"Ghost Crystal\",\n    \"kind\": \"mineral\",\n    \"description\": \"There is an aura of coldness around this crystal.\",\n    \"sellPrice\": 200,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 260,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Ghost Crystal.png\"\n  },\n  {\n    \"id\": \"563\",\n    \"name\": \"Jasper\",\n    \"kind\": \"mineral\",\n    \"description\": \"When polished, becomes attractively luminous. Prized by ancient peoples.\",\n    \"sellPrice\": 150,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 195,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Jasper.png\"\n  },\n  {\n    \"id\": \"566\",\n    \"name\": \"Celestine\",\n    \"kind\": \"mineral\",\n    \"description\": \"Some early life forms had bones made from this.\",\n    \"sellPrice\": 125,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 162,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Celestine.png\"\n  },\n  {\n    \"id\": \"567\",\n    \"name\": \"Marble\",\n    \"kind\": \"mineral\",\n    \"description\": \"A very popular material for sculptures and construction.\",\n    \"sellPrice\": 110,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 143,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Marble.png\"\n  },\n  {\n    \"id\": \"568\",\n    \"name\": \"Sandstone\",\n    \"kind\": \"mineral\",\n    \"description\": \"A common type of stone with red and brown striations.\",\n    \"sellPrice\": 60,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 78,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Sandstone.png\"\n  },\n  {\n    \"id\": \"569\",\n    \"name\": \"Granite\",\n    \"kind\": \"mineral\",\n    \"description\": \"A speckled Mineral that is commonly used in construction.\",\n    \"sellPrice\": 75,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 97,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Granite.png\"\n  },\n  {\n    \"id\": \"570\",\n    \"name\": \"Basalt\",\n    \"kind\": \"mineral\",\n    \"description\": \"Forms near searing hot magma.\",\n    \"sellPrice\": 175,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 227,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Basalt.png\"\n  },\n  {\n    \"id\": \"571\",\n    \"name\": \"Limestone\",\n    \"kind\": \"mineral\",\n    \"description\": \"A very common type of stone. It's not worth very much.\",\n    \"sellPrice\": 15,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 19,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Limestone.png\"\n  },\n  {\n    \"id\": \"572\",\n    \"name\": \"Soapstone\",\n    \"kind\": \"mineral\",\n    \"description\": \"Because of its soft consistency, very popular for carving.\",\n    \"sellPrice\": 120,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 156,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Soapstone.png\"\n  },\n  {\n    \"id\": \"573\",\n    \"name\": \"Hematite\",\n    \"kind\": \"mineral\",\n    \"description\": \"An iron-based Mineral with interesting magnetic properties.\",\n    \"sellPrice\": 150,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 195,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Hematite.png\"\n  },\n  {\n    \"id\": \"574\",\n    \"name\": \"Mudstone\",\n    \"kind\": \"mineral\",\n    \"description\": \"A fine-grained rock made from ancient clay or mud.\",\n    \"sellPrice\": 25,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 32,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Mudstone.png\"\n  },\n  {\n    \"id\": \"575\",\n    \"name\": \"Obsidian\",\n    \"kind\": \"mineral\",\n    \"description\": \"A volcanic glass that forms when lava cools rapidly.\",\n    \"sellPrice\": 200,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 260,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Obsidian.png\"\n  },\n  {\n    \"id\": \"576\",\n    \"name\": \"Slate\",\n    \"kind\": \"mineral\",\n    \"description\": \"It's extremely resistant to water, making it a good roofing material.\",\n    \"sellPrice\": 85,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 110,\n    \"locations\": [\"Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Slate.png\"\n  },\n  {\n    \"id\": \"577\",\n    \"name\": \"Fairy Stone\",\n    \"kind\": \"mineral\",\n    \"description\": \"An old miner's song suggests these are made from ancient fairy bones.\",\n    \"sellPrice\": 250,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 325,\n    \"locations\": [\"Frozen Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Fairy Stone.png\"\n  },\n  {\n    \"id\": \"578\",\n    \"name\": \"Star Shards\",\n    \"kind\": \"mineral\",\n    \"description\": \"No one knows how these form. Microscopic structure displays unnatural regularity.\",\n    \"sellPrice\": 500,\n    \"profession\": [\"gemologist\"],\n    \"gemologistPrice\": 650,\n    \"locations\": [\"Magma Geode\", \"Omni Geode\"],\n    \"image\": \"images/minerals/geode-minerals/Star Shards.png\"\n  },\n  {\n    \"id\": \"535\",\n    \"name\": \"Geode\",\n    \"kind\": \"geode\",\n    \"description\": \"A blacksmith can break this open for you.\",\n    \"sellPrice\": 50,\n    \"profession\": [],\n    \"locations\": [\"The Mines (Floors 1-39)\", \"Duggy (25%)\", \"Tilling\", \"Fishing Treasure Chest\"],\n    \"image\": \"images/minerals/geodes/Geode.png\"\n  },\n  {\n    \"id\": \"536\",\n    \"name\": \"Frozen Geode\",\n    \"kind\": \"geode\",\n    \"description\": \"A blacksmith can break this open for you.\",\n    \"sellPrice\": 100,\n    \"profession\": [],\n    \"locations\": [\"The Mines (Floors 41-79)\", \"Fishing Treasure Chest\", \"Winter Tilling\"],\n    \"image\": \"images/minerals/geodes/Frozen Geode.png\"\n  },\n  {\n    \"id\": \"537\",\n    \"name\": \"Magma Geode\",\n    \"kind\": \"geode\",\n    \"description\": \"A blacksmith can break this open for you.\",\n    \"sellPrice\": 150,\n    \"profession\": [],\n    \"locations\": [\"The Mines (Floors 81-120)\", \"Skull Cavern\", \"Fishing Treasure Chest\"],\n    \"image\": \"images/minerals/geodes/Magma Geode.png\"\n  },\n  {\n    \"id\": \"749\",\n    \"name\": \"Omni Geode\",\n    \"kind\": \"geode\",\n    \"description\": \"A blacksmith can break this open for you. Contains a wide variety of minerals.\",\n    \"sellPrice\": 0,\n    \"profession\": [],\n    \"locations\": [\"The Mines\", \"Skull Cavern\", \"Carbon Ghost\", \"Panning\", \"Oasis\", \"Krobus\"],\n    \"image\": \"images/minerals/geodes/Omni Geode.png\"\n  },\n  {\n    \"id\": \"378\",\n    \"name\": \"Copper Ore\",\n    \"kind\": \"ore\",\n    \"description\": \"A common ore that can be smelted into bars.\",\n    \"sellPrice\": 5,\n    \"profession\": [],\n    \"locations\": [\"The Mines (Floors 2-39)\", \"Quarry\", \"Skull Cavern\", \"Volcano Dungeon\"],\n    \"image\": \"images/minerals/ore/Copper Ore.png\"\n  },\n  {\n    \"id\": \"380\",\n    \"name\": \"Iron Ore\",\n    \"kind\": \"ore\",\n    \"description\": \"A fairly common ore that can be smelted into bars.\",\n    \"sellPrice\": 10,\n    \"profession\": [],\n    \"locations\": [\"The Mines (Floors 41-79)\", \"Quarry\", \"Skull Cavern\", \"Volcano Dungeon\"],\n    \"image\": \"images/minerals/ore/Iron Ore.png\"\n  },\n  {\n    \"id\": \"384\",\n    \"name\": \"Gold Ore\",\n    \"kind\": \"ore\",\n    \"description\": \"A precious ore that can be smelted into bars.\",\n    \"sellPrice\": 25,\n    \"profession\": [],\n    \"locations\": [\"The Mines (Floors 80+)\", \"Skull Cavern\", \"Quarry\", \"Volcano Dungeon\"],\n    \"image\": \"images/minerals/ore/Gold Ore.png\"\n  },\n  {\n    \"id\": \"386\",\n    \"name\": \"Iridium Ore\",\n    \"kind\": \"ore\",\n    \"description\": \"An exotic ore with many curious properties. Can be smelted into bars.\",\n    \"sellPrice\": 100,\n    \"profession\": [],\n    \"locations\": [\"Skull Cavern\", \"Quarry\", \"Volcano Dungeon\", \"Mystic Stone (Mines Floor 100+)\"],\n    \"image\": \"images/minerals/ore/Iridium Ore.png\"\n  },\n  {\n    \"id\": \"909\",\n    \"name\": \"Radioactive Ore\",\n    \"kind\": \"ore\",\n    \"description\": \"It's glowing with dangerous energy... Can be smelted into bars.\",\n    \"sellPrice\": 300,\n    \"profession\": [],\n    \"locations\": [\"Dangerous Mines\", \"Dangerous Skull Cavern\"],\n    \"image\": \"images/minerals/ore/Radioactive Ore.png\"\n  },\n  {\n    \"id\": \"334\",\n    \"name\": \"Copper Bar\",\n    \"kind\": \"bar\",\n    \"description\": \"A bar of pure copper.\",\n    \"sellPrice\": 60,\n    \"profession\": [\"blacksmith\"],\n    \"smeltRecipes\": [\n      {\n        \"ore\": \"378\",\n        \"oreQty\": 5,\n        \"coalQty\": 1,\n        \"timeMinutes\": 30\n      }\n    ],\n    \"image\": \"images/minerals/bars/Copper Bar.png\"\n  },\n  {\n    \"id\": \"335\",\n    \"name\": \"Iron Bar\",\n    \"kind\": \"bar\",\n    \"description\": \"A bar of pure iron.\",\n    \"sellPrice\": 120,\n    \"profession\": [\"blacksmith\"],\n    \"smeltRecipes\": [\n      {\n        \"ore\": \"380\",\n        \"oreQty\": 5,\n        \"coalQty\": 1,\n        \"timeMinutes\": 120\n      }\n    ],\n    \"image\": \"images/minerals/bars/Iron Bar.png\"\n  },\n  {\n    \"id\": \"336\",\n    \"name\": \"Gold Bar\",\n    \"kind\": \"bar\",\n    \"description\": \"A bar of pure gold.\",\n    \"sellPrice\": 250,\n    \"profession\": [\"blacksmith\"],\n    \"smeltRecipes\": [\n      {\n        \"ore\": \"384\",\n        \"oreQty\": 5,\n        \"coalQty\": 1,\n        \"timeMinutes\": 300\n      }\n    ],\n    \"image\": \"images/minerals/bars/Gold Bar.png\"\n  },\n  {\n    \"id\": \"337\",\n    \"name\": \"Iridium Bar\",\n    \"kind\": \"bar\",\n    \"description\": \"A bar of pure iridium.\",\n    \"sellPrice\": 1000,\n    \"profession\": [\"blacksmith\"],\n    \"smeltRecipes\": [\n      {\n        \"ore\": \"386\",\n        \"oreQty\": 5,\n        \"coalQty\": 1,\n        \"timeMinutes\": 480\n      }\n    ],\n    \"image\": \"images/minerals/bars/Iridium Bar.png\"\n  },\n  {\n    \"id\": \"910\",\n    \"name\": \"Radioactive Bar\",\n    \"kind\": \"bar\",\n    \"description\": \"Known by the Zuzu City Safety Commission to cause irreversible bodily harm.\",\n    \"sellPrice\": 3000,\n    \"profession\": [\"blacksmith\"],\n    \"smeltRecipes\": [\n      {\n        \"ore\": \"909\",\n        \"oreQty\": 5,\n        \"coalQty\": 1,\n        \"timeMinutes\": 560\n      }\n    ],\n    \"image\": \"images/minerals/bars/Radioactive Bar.png\"\n  },\n  {\n    \"id\": \"338\",\n    \"name\": \"Refined Quartz\",\n    \"kind\": \"bar\",\n    \"description\": \"A more pure form of quartz.\",\n    \"sellPrice\": 50,\n    \"profession\": [],\n    \"smeltRecipes\": [\n      {\n        \"ore\": \"80\",\n        \"oreQty\": 1,\n        \"coalQty\": 1,\n        \"timeMinutes\": 90\n      },\n      {\n        \"ore\": \"82\",\n        \"oreQty\": 1,\n        \"coalQty\": 1,\n        \"timeMinutes\": 90,\n        \"outputQty\": 3\n      }\n    ],\n    \"image\": \"images/minerals/bars/Refined Quartz.png\"\n  },\n  {\n    \"id\": \"382\",\n    \"name\": \"Coal\",\n    \"kind\": \"resource\",\n    \"description\": \"A combustible rock that is useful for crafting and smelting.\",\n    \"sellPrice\": 15,\n    \"profession\": [],\n    \"locations\": [\n      \"Breaking rocks in The Mines\",\n      \"Dust Sprites (50% drop, Floors 41-79)\",\n      \"Coal Nodes (Quarry, Quarry Mine, Volcano Dungeon)\",\n      \"Charcoal Kiln (10 Wood → 1 Coal)\",\n      \"Recycling Machine (Trash or Driftwood)\",\n      \"Crates and barrels in Mines/Skull Cavern/Volcano Dungeon\",\n      \"Geodes (all types)\",\n      \"Fishing Treasure Chests\",\n      \"Panning\",\n      \"Blacksmith shop\"\n    ],\n    \"image\": \"images/minerals/ore/Coal.png\"\n  },\n  {\n    \"id\": \"copper-node\",\n    \"name\": \"Copper Node\",\n    \"kind\": \"node\",\n    \"description\": \"Ore-bearing stone containing copper.\",\n    \"drops\": [\n      {\n        \"item\": \"Copper Ore\",\n        \"quantity\": \"1-3\"\n      }\n    ],\n    \"miningXP\": 5,\n    \"locations\": [\n      \"The Mines (any floor)\",\n      \"Skull Cavern\",\n      \"Quarry\",\n      \"Quarry Mine\",\n      \"Hill-top / Four Corners farm\",\n      \"Volcano Dungeon\"\n    ],\n    \"image\": \"images/minerals/nodes/Copper Node.png\"\n  },\n  {\n    \"id\": \"iron-node\",\n    \"name\": \"Iron Node\",\n    \"kind\": \"node\",\n    \"description\": \"Ore-bearing stone containing iron.\",\n    \"drops\": [\n      {\n        \"item\": \"Iron Ore\",\n        \"quantity\": \"1-3\"\n      }\n    ],\n    \"miningXP\": 12,\n    \"locations\": [\n      \"The Mines (Floors 40-79)\",\n      \"Quarry\",\n      \"Skull Cavern\",\n      \"Quarry Mine\",\n      \"Hill-top / Four Corners farm (Mining Level 4+)\",\n      \"Volcano Dungeon\"\n    ],\n    \"image\": \"images/minerals/nodes/Iron Node.png\"\n  },\n  {\n    \"id\": \"gold-node\",\n    \"name\": \"Gold Node\",\n    \"kind\": \"node\",\n    \"description\": \"Ore-bearing stone containing gold.\",\n    \"drops\": [\n      {\n        \"item\": \"Gold Ore\",\n        \"quantity\": \"1-3\"\n      }\n    ],\n    \"miningXP\": 18,\n    \"locations\": [\n      \"The Mines (Floor 80+)\",\n      \"Skull Cavern\",\n      \"Quarry\",\n      \"Hill-top / Four Corners farm (Mining Level 7+)\",\n      \"Volcano Dungeon\"\n    ],\n    \"image\": \"images/minerals/nodes/Gold Node.png\"\n  },\n  {\n    \"id\": \"iridium-node\",\n    \"name\": \"Iridium Node\",\n    \"kind\": \"node\",\n    \"description\": \"A rare ore deposit containing iridium.\",\n    \"drops\": [\n      {\n        \"item\": \"Iridium Ore\",\n        \"quantity\": \"1-3\"\n      },\n      {\n        \"item\": \"Prismatic Shard\",\n        \"quantity\": \"1\",\n        \"chance\": \"3.5%\"\n      }\n    ],\n    \"miningXP\": 50,\n    \"locations\": [\n      \"Skull Cavern\",\n      \"Quarry\",\n      \"Hill-top / Four Corners farm (Mining Level 10)\",\n      \"Volcano Dungeon\"\n    ],\n    \"image\": \"images/minerals/nodes/Iridium Node.png\"\n  },\n  {\n    \"id\": \"radioactive-node\",\n    \"name\": \"Radioactive Node\",\n    \"kind\": \"node\",\n    \"description\": \"A glowing, dangerous ore deposit.\",\n    \"drops\": [\n      {\n        \"item\": \"Radioactive Ore\",\n        \"quantity\": \"1+\"\n      }\n    ],\n    \"miningXP\": 18,\n    \"locations\": [\"Dangerous Mines\", \"Dangerous Skull Cavern\"],\n    \"image\": \"images/minerals/nodes/Radioactive Node.png\"\n  },\n  {\n    \"id\": \"amethyst-node\",\n    \"name\": \"Amethyst Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Amethyst\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 16,\n    \"locations\": [\"The Mines (any floor)\", \"Skull Cavern\", \"Quarry\"],\n    \"image\": \"images/minerals/nodes/Amethyst Node.png\"\n  },\n  {\n    \"id\": \"aquamarine-node\",\n    \"name\": \"Aquamarine Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Aquamarine\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 40,\n    \"locations\": [\"The Mines (Floor 40+)\", \"Skull Cavern\", \"Quarry\"],\n    \"image\": \"images/minerals/nodes/Aquamarine Node.png\"\n  },\n  {\n    \"id\": \"topaz-node\",\n    \"name\": \"Topaz Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Topaz\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 16,\n    \"locations\": [\"The Mines (any floor)\", \"Skull Cavern\", \"Quarry\"],\n    \"image\": \"images/minerals/nodes/Topaz Node.png\"\n  },\n  {\n    \"id\": \"jade-node\",\n    \"name\": \"Jade Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Jade\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 40,\n    \"locations\": [\"The Mines (Floor 40+)\", \"Skull Cavern\", \"Quarry\"],\n    \"image\": \"images/minerals/nodes/Jade Node.png\"\n  },\n  {\n    \"id\": \"emerald-node\",\n    \"name\": \"Emerald Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Emerald\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 80,\n    \"locations\": [\"The Mines (Floor 80+)\", \"Skull Cavern\", \"Quarry\"],\n    \"image\": \"images/minerals/nodes/Emerald Node.png\"\n  },\n  {\n    \"id\": \"ruby-node\",\n    \"name\": \"Ruby Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Ruby\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 80,\n    \"locations\": [\"The Mines (Floor 80+)\", \"Skull Cavern\", \"Quarry\", \"Volcano Dungeon\"],\n    \"image\": \"images/minerals/nodes/Ruby Node.png\"\n  },\n  {\n    \"id\": \"diamond-node\",\n    \"name\": \"Diamond Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Diamond\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 150,\n    \"locations\": [\"The Mines (Floor 50+)\", \"Skull Cavern\", \"Quarry\", \"Volcano Dungeon\"],\n    \"image\": \"images/minerals/nodes/Diamond Node.png\"\n  },\n  {\n    \"id\": \"gem-node\",\n    \"name\": \"Gem Node\",\n    \"kind\": \"node\",\n    \"description\": \"Contains a random gem.\",\n    \"drops\": [\n      {\n        \"item\": \"Random gem (Amethyst, Aquamarine, Diamond, Emerald, Jade, Ruby, or Topaz)\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 0,\n    \"locations\": [\"The Mines (any floor)\", \"Skull Cavern\", \"Quarry\", \"Volcano Dungeon\"],\n    \"image\": \"images/minerals/nodes/Gem Node.png\"\n  },\n  {\n    \"id\": \"mystic-stone\",\n    \"name\": \"Mystic Stone\",\n    \"kind\": \"node\",\n    \"description\": \"A rare and valuable deposit.\",\n    \"drops\": [\n      {\n        \"item\": \"Iridium Ore\",\n        \"quantity\": \"1-3\"\n      },\n      {\n        \"item\": \"Gold Ore\",\n        \"quantity\": \"1-4\"\n      },\n      {\n        \"item\": \"Prismatic Shard\",\n        \"quantity\": \"1\",\n        \"chance\": \"25%\"\n      }\n    ],\n    \"miningXP\": 150,\n    \"locations\": [\"The Mines (Floor 100+)\", \"Skull Cavern\", \"Quarry\", \"Volcano Dungeon\"],\n    \"image\": \"images/minerals/nodes/Mystic Stone.png\"\n  },\n  {\n    \"id\": \"geode-node\",\n    \"name\": \"Geode Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Geode\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 8,\n    \"locations\": [\"Hill-top / Four Corners farm\"],\n    \"image\": \"images/minerals/nodes/Geode Node.png\"\n  },\n  {\n    \"id\": \"frozen-geode-node\",\n    \"name\": \"Frozen Geode Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Frozen Geode\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 16,\n    \"locations\": [\"Hill-top / Four Corners farm (Mining Level 5+)\"],\n    \"image\": \"images/minerals/nodes/Frozen Geode Node.png\"\n  },\n  {\n    \"id\": \"magma-geode-node\",\n    \"name\": \"Magma Geode Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Magma Geode\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 32,\n    \"locations\": [\"Hill-top / Four Corners farm (Mining Level 8+)\"],\n    \"image\": \"images/minerals/nodes/Magma Geode Node.png\"\n  },\n  {\n    \"id\": \"omni-geode-node\",\n    \"name\": \"Omni Geode Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Omni Geode\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 64,\n    \"locations\": [\"Volcano Dungeon\"],\n    \"image\": \"images/minerals/nodes/Omni Geode Node.png\"\n  },\n  {\n    \"id\": \"coal-node\",\n    \"name\": \"Coal Node\",\n    \"kind\": \"node\",\n    \"description\": \"A deposit of coal fuel.\",\n    \"drops\": [\n      {\n        \"item\": \"Coal\",\n        \"quantity\": \"1+\"\n      }\n    ],\n    \"miningXP\": 10,\n    \"locations\": [\"Quarry\", \"Quarry Mine\", \"Volcano Dungeon\"],\n    \"image\": \"images/minerals/nodes/Coal Node 1.png\"\n  },\n  {\n    \"id\": \"cinder-shard-node\",\n    \"name\": \"Cinder Shard Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Cinder Shard\",\n        \"quantity\": \"1+\"\n      }\n    ],\n    \"miningXP\": 12,\n    \"locations\": [\"Volcano Dungeon\"],\n    \"image\": \"images/minerals/nodes/Cinder Shard Node 1.png\"\n  },\n  {\n    \"id\": \"clay-node\",\n    \"name\": \"Clay Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Clay\",\n        \"quantity\": \"1\"\n      }\n    ],\n    \"miningXP\": 6,\n    \"locations\": [\"Ginger Island Dig Site\"],\n    \"image\": \"images/minerals/nodes/Clay Node.png\"\n  },\n  {\n    \"id\": \"bone-node\",\n    \"name\": \"Bone Node\",\n    \"kind\": \"node\",\n    \"description\": \"Contains bone fragments and fossil artifacts.\",\n    \"drops\": [\n      {\n        \"item\": \"Bone Fragment\",\n        \"quantity\": \"1+\"\n      },\n      {\n        \"item\": \"Fossil artifact\",\n        \"quantity\": \"1\",\n        \"chance\": \"varies\"\n      }\n    ],\n    \"miningXP\": 6,\n    \"locations\": [\"Ginger Island Dig Site\"],\n    \"image\": \"images/minerals/nodes/Bone Node 1.png\"\n  },\n  {\n    \"id\": \"mussel-node\",\n    \"name\": \"Mussel Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Mussel\",\n        \"quantity\": \"1+\"\n      }\n    ],\n    \"miningXP\": 5,\n    \"locations\": [\"Ginger Island West (beach)\"],\n    \"image\": \"images/minerals/nodes/Mussel Node.png\"\n  },\n  {\n    \"id\": \"calico-egg-node\",\n    \"name\": \"Calico Egg Node\",\n    \"kind\": \"node\",\n    \"description\": null,\n    \"drops\": [\n      {\n        \"item\": \"Calico Egg\",\n        \"quantity\": \"1+\"\n      }\n    ],\n    \"miningXP\": 50,\n    \"locations\": [\"Skull Cavern (Desert Festival only)\"],\n    \"image\": \"images/minerals/nodes/Calico Egg Node 1.png\"\n  },\n  {\n    \"id\": \"rock\",\n    \"name\": \"Rock\",\n    \"kind\": \"node\",\n    \"description\": \"A standard breakable rock found outdoors.\",\n    \"drops\": [\n      {\n        \"item\": \"Stone\",\n        \"quantity\": \"1+\"\n      },\n      {\n        \"item\": \"Coal\",\n        \"quantity\": \"1\",\n        \"chance\": \"~5%\"\n      }\n    ],\n    \"miningXP\": 1,\n    \"locations\": [\"The Farm\", \"Various outdoor areas\"],\n    \"image\": \"images/minerals/nodes/Rock 1.png\"\n  },\n  {\n    \"id\": \"stone-node\",\n    \"name\": \"Stone Node\",\n    \"kind\": \"node\",\n    \"description\": \"A standard breakable rock inside the mines.\",\n    \"drops\": [\n      {\n        \"item\": \"Stone\",\n        \"quantity\": \"1+\"\n      },\n      {\n        \"item\": \"Coal\",\n        \"quantity\": \"1\",\n        \"chance\": \"small\"\n      }\n    ],\n    \"miningXP\": 0,\n    \"locations\": [\"The Mines (any floor)\", \"Volcano Dungeon\"],\n    \"image\": \"images/minerals/nodes/Stone 1.png\"\n  },\n  {\n    \"id\": \"848\",\n    \"name\": \"Cinder Shard\",\n    \"kind\": \"resource\",\n    \"description\": \"You can feel a warm glow from within this stone.\",\n    \"sellPrice\": 50,\n    \"profession\": [],\n    \"locations\": [\n      \"Volcano Dungeon (Cinder Shard Nodes)\",\n      \"Magma Sprite, Magma Sparker, Magma Duggy, False Magma Cap drops\",\n      \"Stingray Fish Pond (population 7+)\",\n      \"Skull Cavern treasure rooms\"\n    ],\n    \"image\": \"images/minerals/foraged-minerals/Cinder Shard.png\"\n  },\n  {\n    \"id\": \"881\",\n    \"name\": \"Bone Fragment\",\n    \"kind\": \"resource\",\n    \"description\": \"A small piece of bone.\",\n    \"sellPrice\": 12,\n    \"profession\": [],\n    \"locations\": [\n      \"Skeleton and Lava Lurk drops\",\n      \"Bone Nodes on Ginger Island\",\n      \"Skull Cavern (crates and barrels)\",\n      \"Panning\",\n      \"Artifact Spots\"\n    ],\n    \"image\": \"images/minerals/resources/Bone Fragment.png\"\n  },\n  {\n    \"id\": \"275\",\n    \"name\": \"Artifact Trove\",\n    \"kind\": \"geode\",\n    \"description\": \"A blacksmith can break this open for you. Contains a random artifact.\",\n    \"sellPrice\": 0,\n    \"profession\": [],\n    \"locations\": [\"Desert Trader (3 Omni Geodes)\", \"Skeleton Drops\", \"Fishing Treasure Chest\"],\n    \"image\": \"images/minerals/geodes/Artifact Trove.png\",\n    \"contents\": [\n      {\n        \"name\": \"Anchor\",\n        \"image\": \"images/artifacts/Anchor.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Ancient Doll\",\n        \"image\": \"images/artifacts/Ancient Doll.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Ancient Drum\",\n        \"image\": \"images/artifacts/Ancient Drum.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Ancient Seed\",\n        \"image\": \"images/artifacts/Ancient Seed.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Ancient Sword\",\n        \"image\": \"images/artifacts/Ancient Sword.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Arrowhead\",\n        \"image\": \"images/artifacts/Arrowhead.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Bone Flute\",\n        \"image\": \"images/artifacts/Bone Flute.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Chewing Stick\",\n        \"image\": \"images/artifacts/Chewing Stick.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Chicken Statue\",\n        \"image\": \"images/artifacts/Chicken Statue.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Chipped Amphora\",\n        \"image\": \"images/artifacts/Chipped Amphora.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Dried Starfish\",\n        \"image\": \"images/artifacts/Dried Starfish.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Dwarf Gadget\",\n        \"image\": \"images/artifacts/Dwarf Gadget.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Dwarvish Helm\",\n        \"image\": \"images/artifacts/Dwarvish Helm.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Elvish Jewelry\",\n        \"image\": \"images/artifacts/Elvish Jewelry.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Glass Shards\",\n        \"image\": \"images/artifacts/Glass Shards.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Golden Mask\",\n        \"image\": \"images/artifacts/Golden Mask.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Golden Pumpkin\",\n        \"chance\": \"~3.6%\",\n        \"image\": \"images/misc/Golden Pumpkin.png\"\n      },\n      {\n        \"name\": \"Golden Relic\",\n        \"image\": \"images/artifacts/Golden Relic.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Ornamental Fan\",\n        \"image\": \"images/artifacts/Ornamental Fan.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Pearl\",\n        \"image\": \"images/minerals/Pearl.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Prehistoric Handaxe\",\n        \"image\": \"images/artifacts/Prehistoric Handaxe.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Prehistoric Tool\",\n        \"image\": \"images/artifacts/Prehistoric Tool.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Rare Disc\",\n        \"image\": \"images/artifacts/Rare Disc.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Rusty Cog\",\n        \"image\": \"images/artifacts/Rusty Cog.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Rusty Spoon\",\n        \"image\": \"images/artifacts/Rusty Spoon.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Rusty Spur\",\n        \"image\": \"images/artifacts/Rusty Spur.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Treasure Appraisal Guide\",\n        \"image\": \"images/special-items/Treasure Appraisal Guide.png\",\n        \"chance\": \"~3.6%\"\n      },\n      {\n        \"name\": \"Treasure Chest\",\n        \"chance\": \"~3.6%\",\n        \"image\": \"images/misc/Treasure Chest.png\"\n      }\n    ]\n  },\n  {\n    \"id\": \"791\",\n    \"name\": \"Golden Coconut\",\n    \"kind\": \"geode\",\n    \"description\": \"A blacksmith can crack this open. The first one always yields a Golden Walnut.\",\n    \"sellPrice\": 0,\n    \"profession\": [],\n    \"locations\": [\"Ginger Island (dropped by enemies)\", \"Ginger Island (foraged)\"],\n    \"image\": \"images/minerals/geodes/Golden Coconut.png\",\n    \"contents\": [\n      {\n        \"name\": \"Golden Walnut\",\n        \"image\": \"images/misc/Golden Walnut.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"100% (first only)\"\n      },\n      {\n        \"name\": \"Banana Sapling\",\n        \"image\": \"images/trees/banana/seed.png\",\n        \"quantity\": \"1\"\n      },\n      {\n        \"name\": \"Mango Sapling\",\n        \"image\": \"images/trees/mango/seed.png\",\n        \"quantity\": \"1\"\n      },\n      {\n        \"name\": \"Pineapple Seeds\",\n        \"image\": \"images/crops/pineapple/seed.png\",\n        \"quantity\": \"5\"\n      },\n      {\n        \"name\": \"Taro Tuber\",\n        \"image\": \"images/crops/taro-root/seed.png\",\n        \"quantity\": \"5\"\n      },\n      {\n        \"name\": \"Mahogany Seed\",\n        \"image\": \"images/trees/mahogany/seed.png\",\n        \"quantity\": \"1\"\n      },\n      {\n        \"name\": \"Fossilized Skull\",\n        \"image\": \"images/artifacts/field-office/Fossilized Skull.png\",\n        \"quantity\": \"1\"\n      },\n      {\n        \"name\": \"Iridium Ore\",\n        \"image\": \"images/minerals/ore/Iridium Ore.png\",\n        \"quantity\": \"5\"\n      },\n      {\n        \"name\": \"Golden Helmet\",\n        \"image\": \"images/hats/Golden Helmet.png\",\n        \"quantity\": \"1\"\n      }\n    ]\n  },\n  {\n    \"id\": \"MysteryBox\",\n    \"name\": \"Mystery Box\",\n    \"kind\": \"geode\",\n    \"description\": \"Open to reveal a random item. Rare drops unlock after opening 10 or more boxes.\",\n    \"sellPrice\": 0,\n    \"profession\": [],\n    \"locations\": [\"Fishing\", \"Monster Drops\", \"Various Events\"],\n    \"image\": \"images/minerals/geodes/Mystery Box.png\",\n    \"contents\": [\n      {\n        \"name\": \"Magic Rock Candy\",\n        \"image\": \"images/shop/Magic Rock Candy.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.2%\"\n      },\n      {\n        \"name\": \"Prismatic Shard\",\n        \"image\": \"images/minerals/gems/Prismatic Shard.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.4%\"\n      },\n      {\n        \"name\": \"Treasure Chest\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.8%\",\n        \"image\": \"images/misc/Treasure Chest.png\"\n      },\n      {\n        \"name\": \"Book of Stars\",\n        \"image\": \"images/special-items/Book Of Stars.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.49%\"\n      },\n      {\n        \"name\": \"Book of Mysteries\",\n        \"image\": \"images/special-items/Book of Mysteries.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.49%\"\n      },\n      {\n        \"name\": \"Pearl\",\n        \"image\": \"images/minerals/Pearl.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.49%\"\n      },\n      {\n        \"name\": \"Golden Pumpkin\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.49%\",\n        \"image\": \"images/misc/Golden Pumpkin.png\"\n      },\n      {\n        \"name\": \"Mystery Hat\",\n        \"image\": \"images/hats/Mystery Hat.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.97%\"\n      },\n      {\n        \"name\": \"Mystery Shirt\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.96%\"\n      },\n      {\n        \"name\": \"Wallpaper\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.95%\"\n      },\n      {\n        \"name\": \"Mega Bomb\",\n        \"image\": \"images/craftable/bombs/Mega Bomb.png\",\n        \"quantity\": \"5\",\n        \"chance\": \"0.63%\"\n      },\n      {\n        \"name\": \"Triple Shot Espresso\",\n        \"image\": \"images/cooking/Triple Shot Espresso.png\",\n        \"quantity\": \"3\",\n        \"chance\": \"0.63%\"\n      },\n      {\n        \"name\": \"Dressed Spinner\",\n        \"image\": \"images/fish/tackle/Dressed Spinner.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0-0.16%\"\n      },\n      {\n        \"name\": \"Cork Bobber\",\n        \"image\": \"images/fish/tackle/Cork Bobber.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0-0.16%\"\n      },\n      {\n        \"name\": \"Dish O' The Sea\",\n        \"image\": \"images/cooking/Dish O' The Sea.png\",\n        \"quantity\": \"2\",\n        \"chance\": \"0.31-0.63%\"\n      },\n      {\n        \"name\": \"Lucky Lunch\",\n        \"image\": \"images/cooking/Lucky Lunch.png\",\n        \"quantity\": \"1-2\",\n        \"chance\": \"0.13-0.63%\"\n      },\n      {\n        \"name\": \"Quality Fertilizer\",\n        \"image\": \"images/craftable/fertilizer/Quality Fertilizer.png\",\n        \"quantity\": \"10-20\",\n        \"chance\": \"0.63-6.03%\"\n      },\n      {\n        \"name\": \"Deluxe Speed-Gro\",\n        \"image\": \"images/craftable/fertilizer/Deluxe Speed-Gro.png\",\n        \"quantity\": \"10-20\",\n        \"chance\": \"0.63-6.03%\"\n      },\n      {\n        \"name\": \"Life Elixir\",\n        \"image\": \"images/craftable/edible-items/Life Elixir.png\",\n        \"quantity\": \"2\",\n        \"chance\": \"0.63%\"\n      },\n      {\n        \"name\": \"Warp Totem: Farm\",\n        \"image\": \"images/craftable/consumables/Warp Totem Farm.png\",\n        \"quantity\": \"1-3\",\n        \"chance\": \"0.63-6.03%\"\n      },\n      {\n        \"name\": \"Cherry Sapling\",\n        \"image\": \"images/trees/cherry/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.1%\"\n      },\n      {\n        \"name\": \"Apricot Sapling\",\n        \"image\": \"images/trees/apricot/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.1%\"\n      },\n      {\n        \"name\": \"Orange Sapling\",\n        \"image\": \"images/trees/orange/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.1%\"\n      },\n      {\n        \"name\": \"Peach Sapling\",\n        \"image\": \"images/trees/peach/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.1%\"\n      },\n      {\n        \"name\": \"Pomegranate Sapling\",\n        \"image\": \"images/trees/pomegranate/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.1%\"\n      },\n      {\n        \"name\": \"Apple Sapling\",\n        \"image\": \"images/trees/apple/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.1%\"\n      },\n      {\n        \"name\": \"Parsnip Seeds\",\n        \"image\": \"images/crops/parsnip/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.5-1.51%\"\n      },\n      {\n        \"name\": \"Green Bean Seeds\",\n        \"image\": \"images/crops/green-bean/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.5-1.51%\"\n      },\n      {\n        \"name\": \"Cauliflower Seeds\",\n        \"image\": \"images/crops/cauliflower/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.5-1.51%\"\n      },\n      {\n        \"name\": \"Potato Seeds\",\n        \"image\": \"images/crops/potato/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.5-1.51%\"\n      },\n      {\n        \"name\": \"Corn Seeds\",\n        \"image\": \"images/crops/corn/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.1-1.51%\"\n      },\n      {\n        \"name\": \"Wheat Seeds\",\n        \"image\": \"images/crops/wheat/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.05-1.51%\"\n      },\n      {\n        \"name\": \"Hot Pepper Seeds\",\n        \"image\": \"images/crops/hot-pepper/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.05-1.51%\"\n      },\n      {\n        \"name\": \"Radish Seeds\",\n        \"image\": \"images/crops/radish/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.05-1.51%\"\n      },\n      {\n        \"name\": \"Eggplant Seeds\",\n        \"image\": \"images/crops/eggplant/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.05-1.51%\"\n      },\n      {\n        \"name\": \"Artichoke Seeds\",\n        \"image\": \"images/crops/artichoke/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.05-1.51%\"\n      },\n      {\n        \"name\": \"Pumpkin Seeds\",\n        \"image\": \"images/crops/pumpkin/seed.png\",\n        \"quantity\": \"8-20\",\n        \"chance\": \"0.05-1.51%\"\n      },\n      {\n        \"name\": \"Carrot Seeds\",\n        \"image\": \"images/crops/carrot/seed.png\",\n        \"quantity\": \"8\",\n        \"chance\": \"0.63%\"\n      },\n      {\n        \"name\": \"Summer Squash Seeds\",\n        \"image\": \"images/crops/summer-squash/seed.png\",\n        \"quantity\": \"8\",\n        \"chance\": \"0.63%\"\n      },\n      {\n        \"name\": \"Broccoli Seeds\",\n        \"image\": \"images/crops/broccoli/seed.png\",\n        \"quantity\": \"8\",\n        \"chance\": \"0.63%\"\n      },\n      {\n        \"name\": \"Powdermelon Seeds\",\n        \"image\": \"images/crops/powdermelon/seed.png\",\n        \"quantity\": \"8\",\n        \"chance\": \"0.63%\"\n      },\n      {\n        \"name\": \"Ossified Blade\",\n        \"image\": \"images/weapons/swords/Ossified Blade.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.31%\"\n      },\n      {\n        \"name\": \"Emerald Ring\",\n        \"image\": \"images/rings/Emerald Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.16%\"\n      },\n      {\n        \"name\": \"Ruby Ring\",\n        \"image\": \"images/rings/Ruby Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.16%\"\n      },\n      {\n        \"name\": \"Quality Sprinkler\",\n        \"image\": \"images/craftable/sprinklers/Quality Sprinkler.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.63%\"\n      },\n      {\n        \"name\": \"Mystery Box\",\n        \"image\": \"images/minerals/geodes/Mystery Box.png\",\n        \"quantity\": \"2-4\",\n        \"chance\": \"0.63-3.62%\"\n      },\n      {\n        \"name\": \"Stardew Valley Almanac\",\n        \"image\": \"images/special-items/Stardew Valley Almanac.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.13%\"\n      },\n      {\n        \"name\": \"Bait And Bobber\",\n        \"image\": \"images/special-items/Bait And Bobber.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.13%\"\n      },\n      {\n        \"name\": \"Woodcutter's Weekly\",\n        \"image\": \"images/special-items/Woodcutter's Weekly.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.13%\"\n      },\n      {\n        \"name\": \"Mining Monthly\",\n        \"image\": \"images/special-items/Mining Monthly.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.13%\"\n      },\n      {\n        \"name\": \"Combat Quarterly\",\n        \"image\": \"images/special-items/Combat Quarterly.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.13%\"\n      },\n      {\n        \"name\": \"Coffee\",\n        \"image\": \"images/artisan-goods/Coffee.png\",\n        \"quantity\": \"3\",\n        \"chance\": \"6.03%\"\n      },\n      {\n        \"name\": \"Bomb\",\n        \"image\": \"images/craftable/bombs/Bomb.png\",\n        \"quantity\": \"5\",\n        \"chance\": \"6.03%\"\n      },\n      {\n        \"name\": \"Hardwood\",\n        \"image\": \"images/forageables/Hardwood.png\",\n        \"quantity\": \"10\",\n        \"chance\": \"6.03%\"\n      },\n      {\n        \"name\": \"Warp Totem: Mountains\",\n        \"image\": \"images/craftable/consumables/Warp Totem Mountains.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"6.03%\"\n      },\n      {\n        \"name\": \"Warp Totem: Beach\",\n        \"image\": \"images/craftable/consumables/Warp Totem Beach.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"6.03%\"\n      },\n      {\n        \"name\": \"Mixed Seeds\",\n        \"image\": \"images/mixed-seeds/mixed-seeds.png\",\n        \"quantity\": \"10\",\n        \"chance\": \"6.03%\"\n      },\n      {\n        \"name\": \"Mixed Flower Seeds\",\n        \"image\": \"images/mixed-seeds/mixed-flower-seeds.png\",\n        \"quantity\": \"10\",\n        \"chance\": \"6.03%\"\n      },\n      {\n        \"name\": \"Sturdy Ring\",\n        \"image\": \"images/rings/Sturdy Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.3-0.6%\"\n      },\n      {\n        \"name\": \"Amethyst Ring\",\n        \"image\": \"images/rings/Amethyst Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.3-0.6%\"\n      },\n      {\n        \"name\": \"Glowstone Ring\",\n        \"image\": \"images/rings/Glowstone Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.3-0.6%\"\n      },\n      {\n        \"name\": \"Aquamarine Ring\",\n        \"image\": \"images/rings/Aquamarine Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.3%\"\n      },\n      {\n        \"name\": \"Jade Ring\",\n        \"image\": \"images/rings/Jade Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.3%\"\n      }\n    ]\n  },\n  {\n    \"id\": \"GoldenMysteryBox\",\n    \"name\": \"Golden Mystery Box\",\n    \"kind\": \"geode\",\n    \"description\": \"Open to reveal a random item. Better odds than a Mystery Box, with two exclusive items.\",\n    \"sellPrice\": 0,\n    \"profession\": [],\n    \"locations\": [\"Various Events\", \"Special Rewards\"],\n    \"image\": \"images/minerals/geodes/Golden Mystery Box.png\",\n    \"contents\": [\n      {\n        \"name\": \"Golden Animal Cracker\",\n        \"image\": \"images/misc/Golden Animal Cracker.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.5%\"\n      },\n      {\n        \"name\": \"Auto-Petter\",\n        \"image\": \"images/tools/Auto-Petter.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.5%\"\n      },\n      {\n        \"name\": \"Magic Rock Candy\",\n        \"image\": \"images/shop/Magic Rock Candy.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.4%\"\n      },\n      {\n        \"name\": \"Prismatic Shard\",\n        \"image\": \"images/minerals/gems/Prismatic Shard.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.79%\"\n      },\n      {\n        \"name\": \"Treasure Chest\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.57%\",\n        \"image\": \"images/misc/Treasure Chest.png\"\n      },\n      {\n        \"name\": \"Book of Stars\",\n        \"image\": \"images/special-items/Book Of Stars.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.96%\"\n      },\n      {\n        \"name\": \"Book of Mysteries\",\n        \"image\": \"images/special-items/Book of Mysteries.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.96%\"\n      },\n      {\n        \"name\": \"Pearl\",\n        \"image\": \"images/minerals/Pearl.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.94%\"\n      },\n      {\n        \"name\": \"Golden Pumpkin\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.94%\",\n        \"image\": \"images/misc/Golden Pumpkin.png\"\n      },\n      {\n        \"name\": \"Mystery Hat\",\n        \"image\": \"images/hats/Mystery Hat.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.85%\"\n      },\n      {\n        \"name\": \"Mystery Shirt\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.81%\"\n      },\n      {\n        \"name\": \"Wallpaper\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.78%\"\n      },\n      {\n        \"name\": \"Mega Bomb\",\n        \"image\": \"images/craftable/bombs/Mega Bomb.png\",\n        \"quantity\": \"5\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Triple Shot Espresso\",\n        \"image\": \"images/cooking/Triple Shot Espresso.png\",\n        \"quantity\": \"3\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Dressed Spinner\",\n        \"image\": \"images/fish/tackle/Dressed Spinner.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0-1.45%\"\n      },\n      {\n        \"name\": \"Cork Bobber\",\n        \"image\": \"images/fish/tackle/Cork Bobber.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0-1.45%\"\n      },\n      {\n        \"name\": \"Dish O' The Sea\",\n        \"image\": \"images/cooking/Dish O' The Sea.png\",\n        \"quantity\": \"2\",\n        \"chance\": \"2.9-5.8%\"\n      },\n      {\n        \"name\": \"Lucky Lunch\",\n        \"image\": \"images/cooking/Lucky Lunch.png\",\n        \"quantity\": \"2\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Quality Fertilizer\",\n        \"image\": \"images/craftable/fertilizer/Quality Fertilizer.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Deluxe Speed-Gro\",\n        \"image\": \"images/craftable/fertilizer/Deluxe Speed-Gro.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Life Elixir\",\n        \"image\": \"images/craftable/edible-items/Life Elixir.png\",\n        \"quantity\": \"2\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Warp Totem: Farm\",\n        \"image\": \"images/craftable/consumables/Warp Totem Farm.png\",\n        \"quantity\": \"3\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Cherry Sapling\",\n        \"image\": \"images/trees/cherry/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.97%\"\n      },\n      {\n        \"name\": \"Apricot Sapling\",\n        \"image\": \"images/trees/apricot/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.97%\"\n      },\n      {\n        \"name\": \"Orange Sapling\",\n        \"image\": \"images/trees/orange/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.97%\"\n      },\n      {\n        \"name\": \"Peach Sapling\",\n        \"image\": \"images/trees/peach/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.97%\"\n      },\n      {\n        \"name\": \"Pomegranate Sapling\",\n        \"image\": \"images/trees/pomegranate/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.97%\"\n      },\n      {\n        \"name\": \"Apple Sapling\",\n        \"image\": \"images/trees/apple/seed.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"0.97%\"\n      },\n      {\n        \"name\": \"Parsnip Seeds\",\n        \"image\": \"images/crops/parsnip/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Green Bean Seeds\",\n        \"image\": \"images/crops/green-bean/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Cauliflower Seeds\",\n        \"image\": \"images/crops/cauliflower/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Potato Seeds\",\n        \"image\": \"images/crops/potato/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Corn Seeds\",\n        \"image\": \"images/crops/corn/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Wheat Seeds\",\n        \"image\": \"images/crops/wheat/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Hot Pepper Seeds\",\n        \"image\": \"images/crops/hot-pepper/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Radish Seeds\",\n        \"image\": \"images/crops/radish/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Eggplant Seeds\",\n        \"image\": \"images/crops/eggplant/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Artichoke Seeds\",\n        \"image\": \"images/crops/artichoke/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Pumpkin Seeds\",\n        \"image\": \"images/crops/pumpkin/seed.png\",\n        \"quantity\": \"20\",\n        \"chance\": \"0.48-1.45%\"\n      },\n      {\n        \"name\": \"Carrot Seeds\",\n        \"image\": \"images/crops/carrot/seed.png\",\n        \"quantity\": \"8\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Summer Squash Seeds\",\n        \"image\": \"images/crops/summer-squash/seed.png\",\n        \"quantity\": \"8\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Broccoli Seeds\",\n        \"image\": \"images/crops/broccoli/seed.png\",\n        \"quantity\": \"8\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Powdermelon Seeds\",\n        \"image\": \"images/crops/powdermelon/seed.png\",\n        \"quantity\": \"8\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Ossified Blade\",\n        \"image\": \"images/weapons/swords/Ossified Blade.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"2.9%\"\n      },\n      {\n        \"name\": \"Emerald Ring\",\n        \"image\": \"images/rings/Emerald Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.45%\"\n      },\n      {\n        \"name\": \"Ruby Ring\",\n        \"image\": \"images/rings/Ruby Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.45%\"\n      },\n      {\n        \"name\": \"Quality Sprinkler\",\n        \"image\": \"images/craftable/sprinklers/Quality Sprinkler.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Mystery Box\",\n        \"image\": \"images/minerals/geodes/Mystery Box.png\",\n        \"quantity\": \"3-4\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Stardew Valley Almanac\",\n        \"image\": \"images/special-items/Stardew Valley Almanac.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.16%\"\n      },\n      {\n        \"name\": \"Bait And Bobber\",\n        \"image\": \"images/special-items/Bait And Bobber.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.16%\"\n      },\n      {\n        \"name\": \"Woodcutter's Weekly\",\n        \"image\": \"images/special-items/Woodcutter's Weekly.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.16%\"\n      },\n      {\n        \"name\": \"Mining Monthly\",\n        \"image\": \"images/special-items/Mining Monthly.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.16%\"\n      },\n      {\n        \"name\": \"Combat Quarterly\",\n        \"image\": \"images/special-items/Combat Quarterly.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"1.16%\"\n      },\n      {\n        \"name\": \"Coffee\",\n        \"image\": \"images/artisan-goods/Coffee.png\",\n        \"quantity\": \"3\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Bomb\",\n        \"image\": \"images/craftable/bombs/Bomb.png\",\n        \"quantity\": \"5\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Hardwood\",\n        \"image\": \"images/forageables/Hardwood.png\",\n        \"quantity\": \"10\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Warp Totem: Mountains\",\n        \"image\": \"images/craftable/consumables/Warp Totem Mountains.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Warp Totem: Beach\",\n        \"image\": \"images/craftable/consumables/Warp Totem Beach.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Mixed Seeds\",\n        \"image\": \"images/mixed-seeds/mixed-seeds.png\",\n        \"quantity\": \"10\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Mixed Flower Seeds\",\n        \"image\": \"images/mixed-seeds/mixed-flower-seeds.png\",\n        \"quantity\": \"10\",\n        \"chance\": \"5.8%\"\n      },\n      {\n        \"name\": \"Sturdy Ring\",\n        \"image\": \"images/rings/Sturdy Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"2.9%\"\n      },\n      {\n        \"name\": \"Amethyst Ring\",\n        \"image\": \"images/rings/Amethyst Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"2.9%\"\n      },\n      {\n        \"name\": \"Glowstone Ring\",\n        \"image\": \"images/rings/Glowstone Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"2.9%\"\n      },\n      {\n        \"name\": \"Aquamarine Ring\",\n        \"image\": \"images/rings/Aquamarine Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"2.9%\"\n      },\n      {\n        \"name\": \"Jade Ring\",\n        \"image\": \"images/rings/Jade Ring.png\",\n        \"quantity\": \"1\",\n        \"chance\": \"2.9%\"\n      }\n    ]\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport mineralData from '@/data/minerals.json';\nimport {\n  BarItem,\n  GeodeContainer,\n  Mineral,\n  MineralItem,\n  NodeItem,\n  OreItem,\n  ResourceItem,\n} from '@/types';\n\nconst allMineralData: Mineral[] = mineralData as Mineral[];\n\n/**\n * Query builder for mineral data (gems, geode minerals, foraged crystals, and geode containers).\n * Use mineralItems() / geodes() to narrow to specific variants.\n * All filter and sort methods return a new MineralQuery for chaining.\n */\nexport class MineralQuery extends QueryBase<Mineral> {\n  constructor(data: Mineral[] = allMineralData) {\n    super(data);\n  }\n\n  /** Filter to donatable minerals only (excludes geode containers). */\n  mineralItems(): MineralQuery {\n    return new MineralQuery(this.data.filter((m): m is MineralItem => m.kind === 'mineral'));\n  }\n\n  /** Filter to geode containers only (Geode, Frozen Geode, Magma Geode, Omni Geode). */\n  geodes(): MineralQuery {\n    return new MineralQuery(this.data.filter((m): m is GeodeContainer => m.kind === 'geode'));\n  }\n\n  /** Filter to ore items only (Copper Ore, Iron Ore, Gold Ore, Iridium Ore, Radioactive Ore). */\n  ores(): MineralQuery {\n    return new MineralQuery(this.data.filter((m): m is OreItem => m.kind === 'ore'));\n  }\n\n  /** Filter to smelted bar items only (Copper Bar, Iron Bar, Gold Bar, Iridium Bar, Radioactive Bar, Refined Quartz). */\n  bars(): MineralQuery {\n    return new MineralQuery(this.data.filter((m): m is BarItem => m.kind === 'bar'));\n  }\n\n  /** Filter to mining node entries only. */\n  nodes(): MineralQuery {\n    return new MineralQuery(this.data.filter((m): m is NodeItem => m.kind === 'node'));\n  }\n\n  /** Filter to resource items (Coal and similar raw materials). */\n  resources(): MineralQuery {\n    return new MineralQuery(this.data.filter((m): m is ResourceItem => m.kind === 'resource'));\n  }\n\n  /** Filter to minerals found in a specific geode type (e.g. 'Frozen Geode'). */\n  fromGeode(geodeType: string): MineralQuery {\n    return new MineralQuery(\n      this.data.filter(\n        (m): m is MineralItem | GeodeContainer | OreItem | NodeItem | ResourceItem =>\n          m.kind !== 'bar' &&\n          m.locations.some((l) => l.toLowerCase().includes(geodeType.toLowerCase())),\n      ),\n    );\n  }\n\n  /** Sort alphabetically by name. Default: 'asc'. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): MineralQuery {\n    return new MineralQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /** Sort by sell price. Default: 'desc' (highest first). Items without a sell price (nodes) sort as 0. */\n  sortBySellPrice(order: 'asc' | 'desc' = 'desc'): MineralQuery {\n    return new MineralQuery(\n      [...this.data].sort((a, b) => {\n        const aPrice = 'sellPrice' in a ? a.sellPrice : 0;\n        const bPrice = 'sellPrice' in b ? b.sellPrice : 0;\n        return order === 'asc' ? aPrice - bPrice : bPrice - aPrice;\n      }),\n    );\n  }\n}\n\n/** Returns a MineralQuery for all mineral data. Pass `source` to wrap a pre-filtered array. */\nexport function minerals(source: Mineral[] = allMineralData): MineralQuery {\n  return new MineralQuery(source);\n}\n","[\n  {\n    \"id\": \"110\",\n    \"number\": 1,\n    \"name\": \"Rarecrow 1\",\n    \"image\": \"images/scarecrows/Rarecrow 1.png\",\n    \"obtain\": \"Purchase at the Stardew Valley Fair for 800 Tokens.\"\n  },\n  {\n    \"id\": \"113\",\n    \"number\": 2,\n    \"name\": \"Rarecrow 2\",\n    \"image\": \"images/scarecrows/Rarecrow 2.png\",\n    \"obtain\": \"Purchase at the Spirit's Eve festival for 5,000g.\"\n  },\n  {\n    \"id\": \"126\",\n    \"number\": 3,\n    \"name\": \"Rarecrow 3\",\n    \"image\": \"images/scarecrows/Rarecrow 3.png\",\n    \"obtain\": \"Purchase at the Casino for 10,000 Qi Coins.\"\n  },\n  {\n    \"id\": \"136\",\n    \"number\": 4,\n    \"name\": \"Rarecrow 4\",\n    \"image\": \"images/scarecrows/Rarecrow 4.png\",\n    \"obtain\": \"Purchase at the Traveling Cart randomly during fall or winter for 4,000g, or purchase at the Festival of Ice for 5,000g.\"\n  },\n  {\n    \"id\": \"137\",\n    \"number\": 5,\n    \"name\": \"Rarecrow 5\",\n    \"image\": \"images/scarecrows/Rarecrow 5.png\",\n    \"obtain\": \"Purchase at the Flower Dance for 2,500g.\"\n  },\n  {\n    \"id\": \"138\",\n    \"number\": 6,\n    \"name\": \"Rarecrow 6\",\n    \"image\": \"images/scarecrows/Rarecrow 6.png\",\n    \"obtain\": \"Purchase from the Dwarf for 2,500g.\"\n  },\n  {\n    \"id\": \"139\",\n    \"number\": 7,\n    \"name\": \"Rarecrow 7\",\n    \"image\": \"images/scarecrows/Rarecrow 7.png\",\n    \"obtain\": \"Donate 20 Artifacts (not counting Minerals) to the Museum. Can be purchased from the Night Market once the first one is earned.\"\n  },\n  {\n    \"id\": \"140\",\n    \"number\": 8,\n    \"name\": \"Rarecrow 8\",\n    \"image\": \"images/scarecrows/Rarecrow 8.png\",\n    \"obtain\": \"Donate 40 items to the Museum. Can be purchased from the Night Market once the first one is earned.\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport rarecrowData from '@/data/rarecrows.json';\nimport { Rarecrow } from '@/types';\n\nconst rarecrewsData: Rarecrow[] = rarecrowData as Rarecrow[];\n\n/** Query builder for rarecrow data. All sort methods return a new RarecrowQuery for chaining. */\nexport class RarecrowQuery extends QueryBase<Rarecrow> {\n  constructor(data: Rarecrow[] = rarecrewsData) {\n    super(data);\n  }\n\n  /** Sort by rarecrow number. Default: `'asc'`. */\n  sortByNumber(order: 'asc' | 'desc' = 'asc'): RarecrowQuery {\n    return new RarecrowQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.number - b.number : b.number - a.number)),\n    );\n  }\n}\n\n/** Returns a RarecrowQuery for all rarecrow data. Pass `source` to wrap a pre-filtered array. */\nexport function rarecrows(source: Rarecrow[] = rarecrewsData): RarecrowQuery {\n  return new RarecrowQuery(source);\n}\n","[\n  {\n    \"id\": \"516\",\n    \"name\": \"Small Glow Ring\",\n    \"description\": \"Emits 5 radius circle of light.\",\n    \"sellPrice\": 50,\n    \"image\": \"images/rings/Small Glow Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Fishing treasure chests\", \"Slime drops (Mines floors 1-39)\"]\n  },\n  {\n    \"id\": \"517\",\n    \"name\": \"Glow Ring\",\n    \"description\": \"Emits 10 radius circle of light.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Glow Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\n      \"Night Fishing Bundle reward\",\n      \"Slime drops (Mines floors 40+)\",\n      \"Skeleton drops (Mines floors 70-79)\",\n      \"Mine barrels and crates\"\n    ]\n  },\n  {\n    \"id\": \"518\",\n    \"name\": \"Small Magnet Ring\",\n    \"description\": \"Increases Magnetism by one tile.\",\n    \"sellPrice\": 50,\n    \"image\": \"images/rings/Small Magnet Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Adventurer's Bundle reward\", \"Fishing treasure chests\", \"Mine barrels and crates\"]\n  },\n  {\n    \"id\": \"519\",\n    \"name\": \"Magnet Ring\",\n    \"description\": \"Increases Magnetism by two tiles.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Magnet Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Enemy drops (Mines floors 40-79)\", \"Mine barrels and crates\"]\n  },\n  {\n    \"id\": \"520\",\n    \"name\": \"Slime Charmer Ring\",\n    \"description\": \"Prevents damage from Slimes and prevents the Slimed Buff.\",\n    \"sellPrice\": 350,\n    \"image\": \"images/rings/Slime Charmer Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 25000,\n    \"sources\": [\"Adventurer's Guild (kill 1,000 Slimes)\"]\n  },\n  {\n    \"id\": \"521\",\n    \"name\": \"Warrior Ring\",\n    \"description\": \"Has a chance of giving the Warrior Energy buff after slaying a monster.\",\n    \"sellPrice\": 750,\n    \"image\": \"images/rings/Warrior Ring.png\",\n    \"craftingLevel\": 4,\n    \"craftingSkill\": \"combat\",\n    \"ingredients\": [\n      { \"name\": \"Iron Bar\", \"id\": \"335\", \"quantity\": 10 },\n      { \"name\": \"Coal\", \"id\": \"382\", \"quantity\": 25 },\n      { \"name\": \"Frozen Tear\", \"id\": \"84\", \"quantity\": 10 }\n    ],\n    \"purchasePrice\": null,\n    \"sources\": []\n  },\n  {\n    \"id\": \"522\",\n    \"name\": \"Vampire Ring\",\n    \"description\": \"Restores 2 health after slaying a monster.\",\n    \"sellPrice\": 750,\n    \"image\": \"images/rings/Vampire Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 15000,\n    \"sources\": [\"Adventurer's Guild (kill 200 Bats)\"]\n  },\n  {\n    \"id\": \"523\",\n    \"name\": \"Savage Ring\",\n    \"description\": \"Gives a 3-second Speed (+2) buff after slaying a monster.\",\n    \"sellPrice\": 750,\n    \"image\": \"images/rings/Savage Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 25000,\n    \"sources\": [\"Adventurer's Guild (kill 150 Void Spirits)\"]\n  },\n  {\n    \"id\": \"524\",\n    \"name\": \"Ring of Yoba\",\n    \"description\": \"Has a chance of giving Yoba's Blessing buff after taking damage.\",\n    \"sellPrice\": 750,\n    \"image\": \"images/rings/Ring of Yoba.png\",\n    \"craftingLevel\": 7,\n    \"craftingSkill\": \"combat\",\n    \"ingredients\": [\n      { \"name\": \"Gold Bar\", \"id\": \"336\", \"quantity\": 5 },\n      { \"name\": \"Iron Bar\", \"id\": \"335\", \"quantity\": 5 },\n      { \"name\": \"Diamond\", \"id\": \"72\", \"quantity\": 1 }\n    ],\n    \"purchasePrice\": null,\n    \"sources\": []\n  },\n  {\n    \"id\": \"525\",\n    \"name\": \"Sturdy Ring\",\n    \"description\": \"The duration of negative buffs are cut in half.\",\n    \"sellPrice\": 750,\n    \"image\": \"images/rings/Sturdy Ring.png\",\n    \"craftingLevel\": 1,\n    \"craftingSkill\": \"combat\",\n    \"ingredients\": [\n      { \"name\": \"Copper Bar\", \"id\": \"334\", \"quantity\": 2 },\n      { \"name\": \"Bug Meat\", \"id\": \"684\", \"quantity\": 25 },\n      { \"name\": \"Slime\", \"id\": \"766\", \"quantity\": 25 }\n    ],\n    \"purchasePrice\": null,\n    \"sources\": []\n  },\n  {\n    \"id\": \"526\",\n    \"name\": \"Burglar's Ring\",\n    \"description\": \"Monsters drop items more often. The game rolls twice on the monster's drop table.\",\n    \"sellPrice\": 750,\n    \"image\": \"images/rings/Burglar's Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 20000,\n    \"sources\": [\"Adventurer's Guild (kill 500 Dust Sprites)\"]\n  },\n  {\n    \"id\": \"527\",\n    \"name\": \"Iridium Band\",\n    \"description\": \"Combines the effects of the Glow Ring, Magnet Ring, and Ruby Ring.\",\n    \"sellPrice\": 1000,\n    \"image\": \"images/rings/Iridium Band.png\",\n    \"craftingLevel\": 9,\n    \"craftingSkill\": \"combat\",\n    \"ingredients\": [\n      { \"name\": \"Iridium Bar\", \"id\": \"337\", \"quantity\": 5 },\n      { \"name\": \"Solar Essence\", \"id\": \"768\", \"quantity\": 50 },\n      { \"name\": \"Void Essence\", \"id\": \"769\", \"quantity\": 50 }\n    ],\n    \"purchasePrice\": null,\n    \"sources\": [\"Fishing treasure chests\"]\n  },\n  {\n    \"id\": \"528\",\n    \"name\": \"Jukebox Ring\",\n    \"description\": \"Plays a random assortment of music you've heard.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Jukebox Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Unobtainable\"]\n  },\n  {\n    \"id\": \"529\",\n    \"name\": \"Amethyst Ring\",\n    \"description\": \"Increases knockback by 10%.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Amethyst Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 1000,\n    \"sources\": [\"Adventurer's Guild\", \"Fishing treasure chests\"]\n  },\n  {\n    \"id\": \"530\",\n    \"name\": \"Topaz Ring\",\n    \"description\": \"Increases Defense by +1.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Topaz Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 1000,\n    \"sources\": [\"Adventurer's Guild\", \"Fishing treasure chests\"]\n  },\n  {\n    \"id\": \"531\",\n    \"name\": \"Aquamarine Ring\",\n    \"description\": \"Increases critical strike chance by 10%.\",\n    \"sellPrice\": 200,\n    \"image\": \"images/rings/Aquamarine Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 2500,\n    \"sources\": [\"Adventurer's Guild (Mines floor 40+)\", \"Fishing treasure chests\"]\n  },\n  {\n    \"id\": \"532\",\n    \"name\": \"Jade Ring\",\n    \"description\": \"Increases Critical Strike Power by 10%.\",\n    \"sellPrice\": 200,\n    \"image\": \"images/rings/Jade Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 2500,\n    \"sources\": [\"Adventurer's Guild (Mines floor 40+)\", \"Fishing treasure chests\"]\n  },\n  {\n    \"id\": \"533\",\n    \"name\": \"Emerald Ring\",\n    \"description\": \"Increases Weapon Speed by 10%.\",\n    \"sellPrice\": 300,\n    \"image\": \"images/rings/Emerald Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 5000,\n    \"sources\": [\"Adventurer's Guild (Mines floor 80+)\", \"Fishing treasure chests\"]\n  },\n  {\n    \"id\": \"534\",\n    \"name\": \"Ruby Ring\",\n    \"description\": \"Increases Attack by 10%.\",\n    \"sellPrice\": 300,\n    \"image\": \"images/rings/Ruby Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 5000,\n    \"sources\": [\n      \"Adventurer's Guild (Mines floor 80+)\",\n      \"Fishing treasure chests\",\n      \"Haunted Skull drops\"\n    ]\n  },\n  {\n    \"id\": \"801\",\n    \"name\": \"Wedding Ring\",\n    \"description\": \"Allows you to propose marriage to another player in multiplayer.\",\n    \"sellPrice\": 1000,\n    \"image\": \"images/rings/Wedding Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [\n      { \"name\": \"Iridium Bar\", \"id\": \"337\", \"quantity\": 5 },\n      { \"name\": \"Prismatic Shard\", \"id\": \"74\", \"quantity\": 1 }\n    ],\n    \"purchasePrice\": null,\n    \"sources\": [\"Recipe from Traveling Cart (500g)\"]\n  },\n  {\n    \"id\": \"810\",\n    \"name\": \"Crabshell Ring\",\n    \"description\": \"Increases Defense by +5.\",\n    \"sellPrice\": 1000,\n    \"image\": \"images/rings/Crabshell Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 15000,\n    \"sources\": [\"Adventurer's Guild (kill 60 Rock Crabs)\"]\n  },\n  {\n    \"id\": \"811\",\n    \"name\": \"Napalm Ring\",\n    \"description\": \"Slain monsters will explode, damaging nearby enemies.\",\n    \"sellPrice\": 1000,\n    \"image\": \"images/rings/Napalm Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": 30000,\n    \"sources\": [\"Adventurer's Guild (kill 250 Serpents)\"]\n  },\n  {\n    \"id\": \"839\",\n    \"name\": \"Thorns Ring\",\n    \"description\": \"Monsters take damage equal to the unmitigated damage done to the player.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Thorns Ring.png\",\n    \"craftingLevel\": 7,\n    \"craftingSkill\": \"combat\",\n    \"ingredients\": [\n      { \"name\": \"Bone Fragment\", \"id\": \"881\", \"quantity\": 50 },\n      { \"name\": \"Stone\", \"id\": \"390\", \"quantity\": 50 },\n      { \"name\": \"Gold Bar\", \"id\": \"336\", \"quantity\": 1 }\n    ],\n    \"purchasePrice\": null,\n    \"sources\": []\n  },\n  {\n    \"id\": \"859\",\n    \"name\": \"Lucky Ring\",\n    \"description\": \"Increases Luck by +1.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Lucky Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Skull Cavern special item drop\", \"Panning (rare)\"]\n  },\n  {\n    \"id\": \"860\",\n    \"name\": \"Hot Java Ring\",\n    \"description\": \"Increases the chance to find Coffee when slaying monsters.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Hot Java Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Volcano Dungeon chests\"]\n  },\n  {\n    \"id\": \"861\",\n    \"name\": \"Protection Ring\",\n    \"description\": \"Increases invincibility time after taking damage by 0.4 seconds.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Protection Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Volcano Dungeon chests\"]\n  },\n  {\n    \"id\": \"862\",\n    \"name\": \"Soul Sapper Ring\",\n    \"description\": \"Gain 4 Energy after slaying a monster.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Soul Sapper Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Volcano Dungeon chests\"]\n  },\n  {\n    \"id\": \"863\",\n    \"name\": \"Phoenix Ring\",\n    \"description\": \"Once a day, be restored to 50% health after being knocked out.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Phoenix Ring.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Volcano Dungeon chests\"]\n  },\n  {\n    \"id\": \"887\",\n    \"name\": \"Immunity Band\",\n    \"description\": \"Increases Immunity by +4.\",\n    \"sellPrice\": 250,\n    \"image\": \"images/rings/Immunity Band.png\",\n    \"craftingLevel\": null,\n    \"craftingSkill\": null,\n    \"ingredients\": [],\n    \"purchasePrice\": null,\n    \"sources\": [\"Skull Cavern special item drop\", \"Mines floor 100+ special item drop\"]\n  },\n  {\n    \"id\": \"888\",\n    \"name\": \"Glowstone Ring\",\n    \"description\": \"Emits 10 radius circle of light and increases Magnetism by two tiles.\",\n    \"sellPrice\": 100,\n    \"image\": \"images/rings/Glowstone Ring.png\",\n    \"craftingLevel\": 4,\n    \"craftingSkill\": \"mining\",\n    \"ingredients\": [\n      { \"name\": \"Solar Essence\", \"id\": \"768\", \"quantity\": 5 },\n      { \"name\": \"Iron Bar\", \"id\": \"335\", \"quantity\": 5 }\n    ],\n    \"purchasePrice\": null,\n    \"sources\": []\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport ringData from '@/data/rings.json';\nimport { Ring } from '@/types';\n\nconst ringsData: Ring[] = ringData as Ring[];\n\n/** Query builder for ring data. All filter and sort methods return a new RingQuery for chaining. */\nexport class RingQuery extends QueryBase<Ring> {\n  constructor(data: Ring[] = ringsData) {\n    super(data);\n  }\n\n  /** Filter to rings that have crafting ingredients (craftable at the Forge or crafting table). */\n  craftable(): RingQuery {\n    return new RingQuery(this.data.filter((r) => r.ingredients.length > 0));\n  }\n\n  /** Filter to rings available for purchase (have a `purchasePrice`). */\n  purchasable(): RingQuery {\n    return new RingQuery(this.data.filter((r) => r.purchasePrice !== null));\n  }\n\n  /** Sort by sell price. Default: `'desc'` (most valuable first). */\n  sortBySellPrice(order: 'asc' | 'desc' = 'desc'): RingQuery {\n    return new RingQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.sellPrice - b.sellPrice : b.sellPrice - a.sellPrice,\n      ),\n    );\n  }\n}\n\n/** Returns a RingQuery for all ring data. Pass `source` to wrap a pre-filtered array. */\nexport function rings(source: Ring[] = ringsData): RingQuery {\n  return new RingQuery(source);\n}\n","[\n  {\n    \"id\": \"691\",\n    \"name\": \"Barbed Hook\",\n    \"description\": \"Makes your catch more secure, causing the 'fishing bar' to cling to your catch. Works best on slow, weak fish.\",\n    \"sellPrice\": 500,\n    \"image\": \"images/fish/tackle/Barbed Hook.png\"\n  },\n  {\n    \"id\": \"695\",\n    \"name\": \"Cork Bobber\",\n    \"description\": \"Slightly increases the size of your 'fishing bar'.\",\n    \"sellPrice\": 250,\n    \"image\": \"images/fish/tackle/Cork Bobber.png\"\n  },\n  {\n    \"id\": \"856\",\n    \"name\": \"Curiosity Lure\",\n    \"description\": \"Increases your chance to catch rare fish.\",\n    \"sellPrice\": 500,\n    \"image\": \"images/fish/tackle/Curiosity Lure.png\"\n  },\n  {\n    \"id\": \"687\",\n    \"name\": \"Dressed Spinner\",\n    \"description\": \"The metal tab and colorful streamers create an enticing spectacle for fish. Increases the bite-rate when fishing.\",\n    \"sellPrice\": 500,\n    \"image\": \"images/fish/tackle/Dressed Spinner.png\"\n  },\n  {\n    \"id\": \"692\",\n    \"name\": \"Lead Bobber\",\n    \"description\": \"Adds weight to your 'fishing bar', preventing it from bouncing along the bottom.\",\n    \"sellPrice\": 150,\n    \"image\": \"images/fish/tackle/Lead Bobber.png\"\n  },\n  {\n    \"id\": \"877\",\n    \"name\": \"Quality Bobber\",\n    \"description\": \"Boosts the quality of fish that you catch.\",\n    \"sellPrice\": 300,\n    \"image\": \"images/fish/tackle/Quality Bobber.png\"\n  },\n  {\n    \"id\": \"SonarBobber\",\n    \"name\": \"Sonar Bobber\",\n    \"description\": \"Shows what fish is on the line before it's caught.\",\n    \"sellPrice\": 250,\n    \"image\": \"images/fish/tackle/Sonar Bobber.png\"\n  },\n  {\n    \"id\": \"686\",\n    \"name\": \"Spinner\",\n    \"description\": \"The shape makes it spin around in the water. Slightly increases the bite-rate when fishing.\",\n    \"sellPrice\": 250,\n    \"image\": \"images/fish/tackle/Spinner.png\"\n  },\n  {\n    \"id\": \"694\",\n    \"name\": \"Trap Bobber\",\n    \"description\": \"Causes fish to escape slower when you aren't reeling them in.\",\n    \"sellPrice\": 200,\n    \"image\": \"images/fish/tackle/Trap Bobber.png\"\n  },\n  {\n    \"id\": \"693\",\n    \"name\": \"Treasure Hunter\",\n    \"description\": \"Fish don't escape while collecting treasures. Also slightly increases the chance to find treasures.\",\n    \"sellPrice\": 250,\n    \"image\": \"images/fish/tackle/Treasure Hunter.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/tackle.json';\nimport { Tackle } from '@/types';\n\nconst tackleData: Tackle[] = data as Tackle[];\n\n/** Query builder for fishing tackle data. All sort methods return a new TackleQuery for chaining. */\nexport class TackleQuery extends QueryBase<Tackle> {\n  constructor(data: Tackle[] = tackleData) {\n    super(data);\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): TackleQuery {\n    return new TackleQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /** Sort by sell price. Default: `'desc'` (most valuable first). */\n  sortBySellPrice(order: 'asc' | 'desc' = 'desc'): TackleQuery {\n    return new TackleQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.sellPrice - b.sellPrice : b.sellPrice - a.sellPrice,\n      ),\n    );\n  }\n}\n\n/** Returns a TackleQuery for all tackle data. Pass `source` to wrap a pre-filtered array. */\nexport function tackle(source: Tackle[] = tackleData): TackleQuery {\n  return new TackleQuery(source);\n}\n","[\n  {\n    \"id\": \"hoe\",\n    \"type\": \"upgradeable\",\n    \"name\": \"Hoe\",\n    \"description\": \"Till soil for planting and dig up artifact spots. Higher upgrades allow charging to till multiple tiles at once.\",\n    \"canEnchant\": true,\n    \"levels\": [\n      {\n        \"level\": \"basic\",\n        \"image\": \"images/tools/hoe/Hoe.png\",\n        \"upgradeCost\": null,\n        \"materialName\": null,\n        \"materialQuantity\": null,\n        \"description\": \"Tills 1 tile of soil.\"\n      },\n      {\n        \"level\": \"copper\",\n        \"image\": \"images/tools/hoe/Copper Hoe.png\",\n        \"upgradeCost\": 2000,\n        \"materialName\": \"Copper Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Tills 3 tiles in a straight line when charged.\"\n      },\n      {\n        \"level\": \"steel\",\n        \"image\": \"images/tools/hoe/Steel Hoe.png\",\n        \"upgradeCost\": 5000,\n        \"materialName\": \"Iron Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Tills 5 tiles in a straight line when charged.\"\n      },\n      {\n        \"level\": \"gold\",\n        \"image\": \"images/tools/hoe/Gold Hoe.png\",\n        \"upgradeCost\": 10000,\n        \"materialName\": \"Gold Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Tills a 3×3 area when charged.\"\n      },\n      {\n        \"level\": \"iridium\",\n        \"image\": \"images/tools/hoe/Iridium Hoe.png\",\n        \"upgradeCost\": 25000,\n        \"materialName\": \"Iridium Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Tills a 6×3 area when charged.\"\n      }\n    ]\n  },\n  {\n    \"id\": \"pickaxe\",\n    \"type\": \"upgradeable\",\n    \"name\": \"Pickaxe\",\n    \"description\": \"Break rocks and mine ore. Higher upgrades break tougher rocks and allow picking up placed items.\",\n    \"canEnchant\": true,\n    \"levels\": [\n      {\n        \"level\": \"basic\",\n        \"image\": \"images/tools/pickaxe/Pickaxe.png\",\n        \"upgradeCost\": null,\n        \"materialName\": null,\n        \"materialQuantity\": null,\n        \"description\": \"Breaks small rocks. Effective in mine floors 1–39.\"\n      },\n      {\n        \"level\": \"copper\",\n        \"image\": \"images/tools/pickaxe/Copper Pickaxe.png\",\n        \"upgradeCost\": 2000,\n        \"materialName\": \"Copper Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Breaks all rocks in mine floors 1–39 in one hit.\"\n      },\n      {\n        \"level\": \"steel\",\n        \"image\": \"images/tools/pickaxe/Steel Pickaxe.png\",\n        \"upgradeCost\": 5000,\n        \"materialName\": \"Iron Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Breaks farm boulders. Effective in mine floors 40–79.\"\n      },\n      {\n        \"level\": \"gold\",\n        \"image\": \"images/tools/pickaxe/Gold Pickaxe.png\",\n        \"upgradeCost\": 10000,\n        \"materialName\": \"Gold Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Breaks meteorites. Effective in mine floors 80–120.\"\n      },\n      {\n        \"level\": \"iridium\",\n        \"image\": \"images/tools/pickaxe/Iridium Pickaxe.png\",\n        \"upgradeCost\": 25000,\n        \"materialName\": \"Iridium Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Breaks Quarry and Skull Cavern rocks in one hit.\"\n      }\n    ]\n  },\n  {\n    \"id\": \"axe\",\n    \"type\": \"upgradeable\",\n    \"name\": \"Axe\",\n    \"description\": \"Chop trees for wood and sap. Higher upgrades reduce hits required and unlock chopping hardwood stumps and logs.\",\n    \"canEnchant\": true,\n    \"levels\": [\n      {\n        \"level\": \"basic\",\n        \"image\": \"images/tools/axe/Axe.png\",\n        \"upgradeCost\": null,\n        \"materialName\": null,\n        \"materialQuantity\": null,\n        \"description\": \"10 hits to fell a tree, 5 hits to chop a stump.\"\n      },\n      {\n        \"level\": \"copper\",\n        \"image\": \"images/tools/axe/Copper Axe.png\",\n        \"upgradeCost\": 2000,\n        \"materialName\": \"Copper Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"8 hits to fell a tree, 4 hits to chop a stump.\"\n      },\n      {\n        \"level\": \"steel\",\n        \"image\": \"images/tools/axe/Steel Axe.png\",\n        \"upgradeCost\": 5000,\n        \"materialName\": \"Iron Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"6 hits to fell a tree, 3 hits to chop a stump. Can chop large stumps for hardwood.\"\n      },\n      {\n        \"level\": \"gold\",\n        \"image\": \"images/tools/axe/Gold Axe.png\",\n        \"upgradeCost\": 10000,\n        \"materialName\": \"Gold Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"4 hits to fell a tree, 2 hits to chop a stump.\"\n      },\n      {\n        \"level\": \"iridium\",\n        \"image\": \"images/tools/axe/Iridium Axe.png\",\n        \"upgradeCost\": 25000,\n        \"materialName\": \"Iridium Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"2 hits to fell a tree, 1 hit to chop a stump.\"\n      }\n    ]\n  },\n  {\n    \"id\": \"watering-can\",\n    \"type\": \"upgradeable\",\n    \"name\": \"Watering Can\",\n    \"description\": \"Water crops each day. Higher upgrades increase water capacity and allow watering multiple tiles at once when charged.\",\n    \"canEnchant\": true,\n    \"levels\": [\n      {\n        \"level\": \"basic\",\n        \"image\": \"images/tools/watering-can/Watering Can.png\",\n        \"upgradeCost\": null,\n        \"materialName\": null,\n        \"materialQuantity\": null,\n        \"description\": \"40 water charges. Waters 1 tile.\"\n      },\n      {\n        \"level\": \"copper\",\n        \"image\": \"images/tools/watering-can/Copper Watering Can.png\",\n        \"upgradeCost\": 2000,\n        \"materialName\": \"Copper Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"55 water charges. Waters 3 tiles in a line when charged.\"\n      },\n      {\n        \"level\": \"steel\",\n        \"image\": \"images/tools/watering-can/Steel Watering Can.png\",\n        \"upgradeCost\": 5000,\n        \"materialName\": \"Iron Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"70 water charges. Waters 5 tiles in a line when charged.\"\n      },\n      {\n        \"level\": \"gold\",\n        \"image\": \"images/tools/watering-can/Gold Watering Can.png\",\n        \"upgradeCost\": 10000,\n        \"materialName\": \"Gold Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"85 water charges. Waters a 3×3 area when charged.\"\n      },\n      {\n        \"level\": \"iridium\",\n        \"image\": \"images/tools/watering-can/Iridium Watering Can.png\",\n        \"upgradeCost\": 25000,\n        \"materialName\": \"Iridium Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"100 water charges. Waters a 6×3 area when charged.\"\n      }\n    ]\n  },\n  {\n    \"id\": \"trash-can\",\n    \"type\": \"upgradeable\",\n    \"name\": \"Trash Can\",\n    \"description\": \"Discard items from your inventory. Higher upgrades refund a percentage of the item's sell value.\",\n    \"canEnchant\": false,\n    \"levels\": [\n      {\n        \"level\": \"basic\",\n        \"image\": null,\n        \"upgradeCost\": null,\n        \"materialName\": null,\n        \"materialQuantity\": null,\n        \"description\": \"Discards items. No sell value refunded.\"\n      },\n      {\n        \"level\": \"copper\",\n        \"image\": \"images/tools/trash-can/Copper Trash Can.png\",\n        \"upgradeCost\": 1000,\n        \"materialName\": \"Copper Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Refunds 15% of an item's sell value when trashed.\"\n      },\n      {\n        \"level\": \"steel\",\n        \"image\": \"images/tools/trash-can/Steel Trash Can.png\",\n        \"upgradeCost\": 2500,\n        \"materialName\": \"Iron Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Refunds 30% of an item's sell value when trashed.\"\n      },\n      {\n        \"level\": \"gold\",\n        \"image\": \"images/tools/trash-can/Gold Trash Can.png\",\n        \"upgradeCost\": 5000,\n        \"materialName\": \"Gold Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Refunds 45% of an item's sell value when trashed.\"\n      },\n      {\n        \"level\": \"iridium\",\n        \"image\": \"images/tools/trash-can/Iridium Trash Can.png\",\n        \"upgradeCost\": 12500,\n        \"materialName\": \"Iridium Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Refunds 60% of an item's sell value when trashed.\"\n      }\n    ]\n  },\n  {\n    \"id\": \"pan\",\n    \"type\": \"upgradeable\",\n    \"name\": \"Pan\",\n    \"description\": \"Gather ore, gems, and other items from shimmering spots in water. Higher upgrades increase yield and chance for special items.\",\n    \"canEnchant\": true,\n    \"levels\": [\n      {\n        \"level\": \"copper\",\n        \"image\": \"images/tools/pan/Copper Pan.png\",\n        \"upgradeCost\": null,\n        \"materialName\": null,\n        \"materialQuantity\": null,\n        \"description\": \"Yields 3–9 ore from shimmering water spots.\"\n      },\n      {\n        \"level\": \"steel\",\n        \"image\": \"images/tools/pan/Steel Pan.png\",\n        \"upgradeCost\": 5000,\n        \"materialName\": \"Iron Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Yields 4–10 ore. Up to 2 special items per use.\"\n      },\n      {\n        \"level\": \"gold\",\n        \"image\": \"images/tools/pan/Gold Pan.png\",\n        \"upgradeCost\": 10000,\n        \"materialName\": \"Gold Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Yields 5–11 ore. Up to 3 special items per use.\"\n      },\n      {\n        \"level\": \"iridium\",\n        \"image\": \"images/tools/pan/Iridium Pan.png\",\n        \"upgradeCost\": 25000,\n        \"materialName\": \"Iridium Bar\",\n        \"materialQuantity\": 5,\n        \"description\": \"Yields 6–12 ore. Up to 4 special items per use.\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fishing-rod\",\n    \"type\": \"fishing-rod\",\n    \"name\": \"Fishing Rod\",\n    \"description\": \"Fishing rods for catching fish. Higher tiers unlock bait and tackle support.\",\n    \"canEnchant\": true,\n    \"levels\": [\n      {\n        \"name\": \"Training Rod\",\n        \"image\": \"images/tools/fishing-rod/Training Rod.png\",\n        \"cost\": 25,\n        \"fishingLevelRequired\": null,\n        \"bait\": false,\n        \"tackleSlots\": 0,\n        \"canEnchant\": false,\n        \"obtain\": \"Purchased from Willy's Fish Shop.\",\n        \"description\": \"Simplifies the fishing minigame and only catches common fish. Good for beginners.\"\n      },\n      {\n        \"name\": \"Bamboo Pole\",\n        \"image\": \"images/tools/fishing-rod/Bamboo Pole.png\",\n        \"cost\": 500,\n        \"fishingLevelRequired\": null,\n        \"bait\": false,\n        \"tackleSlots\": 0,\n        \"canEnchant\": false,\n        \"obtain\": \"Purchased from Willy's Fish Shop.\",\n        \"description\": \"A basic fishing rod. Cannot use bait or tackle.\"\n      },\n      {\n        \"name\": \"Fiberglass Rod\",\n        \"image\": \"images/tools/fishing-rod/Fiberglass Rod.png\",\n        \"cost\": 1800,\n        \"fishingLevelRequired\": 2,\n        \"bait\": true,\n        \"tackleSlots\": 0,\n        \"canEnchant\": false,\n        \"obtain\": \"Purchased from Willy's Fish Shop.\",\n        \"description\": \"Supports bait to reduce time between bites. Requires Fishing level 2.\"\n      },\n      {\n        \"name\": \"Iridium Rod\",\n        \"image\": \"images/tools/fishing-rod/Iridium Rod.png\",\n        \"cost\": 7500,\n        \"fishingLevelRequired\": 6,\n        \"bait\": true,\n        \"tackleSlots\": 1,\n        \"canEnchant\": true,\n        \"obtain\": \"Purchased from Willy's Fish Shop.\",\n        \"description\": \"Supports bait and one tackle attachment. Can be enchanted at the Forge. Requires Fishing level 6.\"\n      },\n      {\n        \"name\": \"Advanced Iridium Rod\",\n        \"image\": \"images/tools/fishing-rod/Advanced Iridium Rod.png\",\n        \"cost\": null,\n        \"fishingLevelRequired\": null,\n        \"bait\": true,\n        \"tackleSlots\": 2,\n        \"canEnchant\": true,\n        \"obtain\": \"Reward for achieving Fishing Mastery.\",\n        \"description\": \"The ultimate fishing rod. Supports bait and two tackle attachments simultaneously. Can be enchanted at the Forge.\"\n      }\n    ]\n  },\n  {\n    \"id\": \"scythe\",\n    \"type\": \"simple\",\n    \"name\": \"Scythe\",\n    \"description\": \"Cuts grass into hay when a Silo is present. Harvests some crops.\",\n    \"image\": \"images/tools/Scythe.png\",\n    \"cost\": null,\n    \"obtain\": \"Starter tool given at the beginning of the game.\"\n  },\n  {\n    \"id\": \"golden-scythe\",\n    \"type\": \"simple\",\n    \"name\": \"Golden Scythe\",\n    \"description\": \"More powerful scythe that collects more hay per swing and harvests a wider range of crops.\",\n    \"image\": \"images/tools/Golden Scythe.png\",\n    \"cost\": null,\n    \"obtain\": \"Found in the chest at level 120 of the Quarry Mine.\"\n  },\n  {\n    \"id\": \"iridium-scythe\",\n    \"type\": \"simple\",\n    \"name\": \"Iridium Scythe\",\n    \"description\": \"Automatically harvests any mature crop in its path.\",\n    \"image\": \"images/tools/Iridium Scythe.png\",\n    \"cost\": null,\n    \"obtain\": \"Reward for achieving Farming Mastery.\"\n  },\n  {\n    \"id\": \"milk-pail\",\n    \"type\": \"simple\",\n    \"name\": \"Milk Pail\",\n    \"description\": \"Collect milk from cows and goats.\",\n    \"image\": \"images/tools/Milk Pail.png\",\n    \"cost\": 1000,\n    \"obtain\": \"Purchased from Marnie's Ranch.\"\n  },\n  {\n    \"id\": \"shears\",\n    \"type\": \"simple\",\n    \"name\": \"Shears\",\n    \"description\": \"Collect wool from sheep and rabbits.\",\n    \"image\": \"images/tools/Shears.png\",\n    \"cost\": 1000,\n    \"obtain\": \"Purchased from Marnie's Ranch.\"\n  },\n  {\n    \"id\": \"heater\",\n    \"type\": \"simple\",\n    \"name\": \"Heater\",\n    \"description\": \"Keeps animals warm in winter, maintaining their mood without needing a pet.\",\n    \"image\": \"images/tools/Heater.png\",\n    \"cost\": 2000,\n    \"obtain\": \"Purchased from Marnie's Ranch.\"\n  },\n  {\n    \"id\": \"auto-grabber\",\n    \"type\": \"simple\",\n    \"name\": \"Auto-Grabber\",\n    \"description\": \"Automatically collects animal products in a coop or barn each morning.\",\n    \"image\": \"images/tools/Auto-Grabber.png\",\n    \"cost\": 25000,\n    \"obtain\": \"Purchased from Marnie's Ranch.\"\n  },\n  {\n    \"id\": \"auto-petter\",\n    \"type\": \"simple\",\n    \"name\": \"Auto-Petter\",\n    \"description\": \"Keeps animals content by automatically petting them each day when placed in a coop or barn.\",\n    \"image\": \"images/tools/Auto-Petter.png\",\n    \"cost\": 50000,\n    \"obtain\": \"Purchased from Marnie's Ranch, or found in Skull Cavern.\"\n  },\n  {\n    \"id\": \"large-pack\",\n    \"type\": \"backpack\",\n    \"name\": \"Large Pack\",\n    \"description\": \"Expands your inventory to 24 slots.\",\n    \"image\": \"images/tools/backpack/Large Pack.png\",\n    \"cost\": 2000,\n    \"slots\": 24\n  },\n  {\n    \"id\": \"deluxe-pack\",\n    \"type\": \"backpack\",\n    \"name\": \"Deluxe Pack\",\n    \"description\": \"Expands your inventory to 36 slots.\",\n    \"image\": \"images/tools/backpack/Deluxe Pack.png\",\n    \"cost\": 10000,\n    \"slots\": 36\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport toolData from '@/data/tools.json';\nimport { Backpack, FishingRod, SimpleTool, Tool, ToolType, UpgradeableTool } from '@/types';\n\nconst toolsData: Tool[] = toolData as Tool[];\n\n/**\n * Query builder for tool data (upgradeable tools, fishing rods, simple tools, backpacks).\n * All filter and sort methods return a new ToolQuery for chaining.\n */\nexport class ToolQuery extends QueryBase<Tool> {\n  constructor(data: Tool[] = toolsData) {\n    super(data);\n  }\n\n  /** Filter by tool type string. Use the convenience methods below for type-narrowed results. */\n  byType(type: ToolType): ToolQuery {\n    return new ToolQuery(this.data.filter((t) => t.type === type));\n  }\n\n  /** Filter to upgradeable tools (Hoe, Watering Can, Pickaxe, Axe, Trash Can). */\n  upgradeable(): ToolQuery {\n    return new ToolQuery(this.data.filter((t): t is UpgradeableTool => t.type === 'upgradeable'));\n  }\n\n  /** Filter to fishing rods. */\n  fishingRods(): ToolQuery {\n    return new ToolQuery(this.data.filter((t): t is FishingRod => t.type === 'fishing-rod'));\n  }\n\n  /** Filter to simple tools (no upgrades). */\n  simple(): ToolQuery {\n    return new ToolQuery(this.data.filter((t): t is SimpleTool => t.type === 'simple'));\n  }\n\n  /** Filter to backpacks. */\n  backpacks(): ToolQuery {\n    return new ToolQuery(this.data.filter((t): t is Backpack => t.type === 'backpack'));\n  }\n\n  /** Filter to tools that can be enchanted at the Forge. */\n  canEnchant(): ToolQuery {\n    return new ToolQuery(\n      this.data.filter(\n        (t): t is UpgradeableTool | FishingRod =>\n          t.type !== 'simple' && t.type !== 'backpack' && t.canEnchant,\n      ),\n    );\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): ToolQuery {\n    return new ToolQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n}\n\n/** Returns a ToolQuery for all tool data. Pass `source` to wrap a pre-filtered array. */\nexport function tools(source: Tool[] = toolsData): ToolQuery {\n  return new ToolQuery(source);\n}\n","[\n  {\n    \"type\": \"fruit-tree\",\n    \"id\": \"629\",\n    \"name\": \"Apricot Tree\",\n    \"saplingId\": \"629\",\n    \"saplingName\": \"Apricot Sapling\",\n    \"saplingBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 2000\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 2500\n      }\n    ],\n    \"saplingSellPrice\": 500,\n    \"seasons\": [\"spring\"],\n    \"daysToMature\": 28,\n    \"description\": \"A sweet, fleshy fruit with a delicate flavor. One of the first fruits of spring.\",\n    \"image\": \"images/trees/apricot/harvest.png\",\n    \"saplingImage\": \"images/trees/apricot/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/apricot/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/apricot/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/apricot/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/apricot/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/apricot/stage-5.png\"\n      }\n    ],\n    \"produce\": {\n      \"id\": \"634\",\n      \"name\": \"Apricot\",\n      \"sellPrice\": 50,\n      \"profession\": [\"tiller\"],\n      \"image\": \"images/trees/apricot/crop.png\",\n      \"energyHealth\": {\n        \"energy\": 38,\n        \"health\": 17\n      },\n      \"artisanUses\": {\n        \"honey\": false,\n        \"wine\": true,\n        \"juice\": false,\n        \"pickles\": false,\n        \"jelly\": true,\n        \"driedMushrooms\": false,\n        \"driedFruit\": true\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"629\",\n        \"name\": \"Apricot Sapling\"\n      }\n    ]\n  },\n  {\n    \"type\": \"fruit-tree\",\n    \"id\": \"628\",\n    \"name\": \"Cherry Tree\",\n    \"saplingId\": \"628\",\n    \"saplingName\": \"Cherry Sapling\",\n    \"saplingBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 3400\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 4250\n      }\n    ],\n    \"saplingSellPrice\": 850,\n    \"seasons\": [\"spring\"],\n    \"daysToMature\": 28,\n    \"description\": \"This sweet, bright red fruit makes a wonderful preserve.\",\n    \"image\": \"images/trees/cherry/harvest.png\",\n    \"saplingImage\": \"images/trees/cherry/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/cherry/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/cherry/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/cherry/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/cherry/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/cherry/stage-5.png\"\n      }\n    ],\n    \"produce\": {\n      \"id\": \"638\",\n      \"name\": \"Cherry\",\n      \"sellPrice\": 80,\n      \"profession\": [\"tiller\"],\n      \"image\": \"images/trees/cherry/crop.png\",\n      \"energyHealth\": {\n        \"energy\": 38,\n        \"health\": 17\n      },\n      \"artisanUses\": {\n        \"honey\": false,\n        \"wine\": true,\n        \"juice\": false,\n        \"pickles\": false,\n        \"jelly\": true,\n        \"driedMushrooms\": false,\n        \"driedFruit\": true\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"628\",\n        \"name\": \"Cherry Sapling\"\n      }\n    ]\n  },\n  {\n    \"type\": \"fruit-tree\",\n    \"id\": \"630\",\n    \"name\": \"Orange Tree\",\n    \"saplingId\": \"630\",\n    \"saplingName\": \"Orange Sapling\",\n    \"saplingBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 4000\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 5000\n      }\n    ],\n    \"saplingSellPrice\": 1000,\n    \"seasons\": [\"summer\"],\n    \"daysToMature\": 28,\n    \"description\": \"A fragrant, tangy citrus fruit.\",\n    \"image\": \"images/trees/orange/harvest.png\",\n    \"saplingImage\": \"images/trees/orange/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/orange/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/orange/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/orange/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/orange/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/orange/stage-5.png\"\n      }\n    ],\n    \"produce\": {\n      \"id\": \"635\",\n      \"name\": \"Orange\",\n      \"sellPrice\": 100,\n      \"profession\": [\"tiller\"],\n      \"image\": \"images/trees/orange/crop.png\",\n      \"energyHealth\": {\n        \"energy\": 38,\n        \"health\": 17\n      },\n      \"artisanUses\": {\n        \"honey\": false,\n        \"wine\": true,\n        \"juice\": false,\n        \"pickles\": false,\n        \"jelly\": true,\n        \"driedMushrooms\": false,\n        \"driedFruit\": true\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"630\",\n        \"name\": \"Orange Sapling\"\n      }\n    ]\n  },\n  {\n    \"type\": \"fruit-tree\",\n    \"id\": \"631\",\n    \"name\": \"Peach Tree\",\n    \"saplingId\": \"631\",\n    \"saplingName\": \"Peach Sapling\",\n    \"saplingBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 6000\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 7500\n      }\n    ],\n    \"saplingSellPrice\": 1500,\n    \"seasons\": [\"summer\"],\n    \"daysToMature\": 28,\n    \"description\": \"A fuzzy fruit of exceptional sweetness.\",\n    \"image\": \"images/trees/peach/harvest.png\",\n    \"saplingImage\": \"images/trees/peach/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/peach/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/peach/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/peach/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/peach/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/peach/stage-5.png\"\n      }\n    ],\n    \"produce\": {\n      \"id\": \"636\",\n      \"name\": \"Peach\",\n      \"sellPrice\": 140,\n      \"profession\": [\"tiller\"],\n      \"image\": \"images/trees/peach/crop.png\",\n      \"energyHealth\": {\n        \"energy\": 38,\n        \"health\": 17\n      },\n      \"artisanUses\": {\n        \"honey\": false,\n        \"wine\": true,\n        \"juice\": false,\n        \"pickles\": false,\n        \"jelly\": true,\n        \"driedMushrooms\": false,\n        \"driedFruit\": true\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"631\",\n        \"name\": \"Peach Sapling\"\n      }\n    ]\n  },\n  {\n    \"type\": \"fruit-tree\",\n    \"id\": \"69\",\n    \"name\": \"Banana Tree\",\n    \"saplingId\": \"69\",\n    \"saplingName\": \"Banana Sapling\",\n    \"saplingBuyPrices\": [],\n    \"saplingSellPrice\": 850,\n    \"seasons\": [\"summer\"],\n    \"daysToMature\": 28,\n    \"description\": \"This delicious tropical fruit smells wonderful, too.\",\n    \"image\": \"images/trees/banana/harvest.png\",\n    \"saplingImage\": \"images/trees/banana/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/banana/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/banana/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/banana/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/banana/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/banana/stage-5.png\"\n      }\n    ],\n    \"produce\": {\n      \"id\": \"91\",\n      \"name\": \"Banana\",\n      \"sellPrice\": 150,\n      \"profession\": [\"tiller\"],\n      \"image\": \"images/trees/banana/crop.png\",\n      \"energyHealth\": {\n        \"energy\": 75,\n        \"health\": 33\n      },\n      \"artisanUses\": {\n        \"honey\": false,\n        \"wine\": true,\n        \"juice\": false,\n        \"pickles\": false,\n        \"jelly\": true,\n        \"driedMushrooms\": false,\n        \"driedFruit\": true\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"69\",\n        \"name\": \"Banana Sapling\"\n      }\n    ]\n  },\n  {\n    \"type\": \"fruit-tree\",\n    \"id\": \"835\",\n    \"name\": \"Mango Tree\",\n    \"saplingId\": \"835\",\n    \"saplingName\": \"Mango Sapling\",\n    \"saplingBuyPrices\": [],\n    \"saplingSellPrice\": 850,\n    \"seasons\": [\"summer\"],\n    \"daysToMature\": 28,\n    \"description\": \"A sweet and tangy tropical fruit.\",\n    \"image\": \"images/trees/mango/harvest.png\",\n    \"saplingImage\": \"images/trees/mango/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/mango/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/mango/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/mango/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/mango/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/mango/stage-5.png\"\n      }\n    ],\n    \"produce\": {\n      \"id\": \"834\",\n      \"name\": \"Mango\",\n      \"sellPrice\": 130,\n      \"profession\": [\"tiller\"],\n      \"image\": \"images/trees/mango/crop.png\",\n      \"energyHealth\": {\n        \"energy\": 100,\n        \"health\": 45\n      },\n      \"artisanUses\": {\n        \"honey\": false,\n        \"wine\": true,\n        \"juice\": false,\n        \"pickles\": false,\n        \"jelly\": true,\n        \"driedMushrooms\": false,\n        \"driedFruit\": true\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"835\",\n        \"name\": \"Mango Sapling\"\n      }\n    ]\n  },\n  {\n    \"type\": \"fruit-tree\",\n    \"id\": \"633\",\n    \"name\": \"Apple Tree\",\n    \"saplingId\": \"633\",\n    \"saplingName\": \"Apple Sapling\",\n    \"saplingBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 4000\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 5000\n      }\n    ],\n    \"saplingSellPrice\": 1000,\n    \"seasons\": [\"fall\"],\n    \"daysToMature\": 28,\n    \"description\": \"A crisp fruit that pairs nicely with autumn flavors.\",\n    \"image\": \"images/trees/apple/harvest.png\",\n    \"saplingImage\": \"images/trees/apple/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/apple/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/apple/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/apple/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/apple/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/apple/stage-5.png\"\n      }\n    ],\n    \"produce\": {\n      \"id\": \"613\",\n      \"name\": \"Apple\",\n      \"sellPrice\": 100,\n      \"profession\": [\"tiller\"],\n      \"image\": \"images/trees/apple/crop.png\",\n      \"energyHealth\": {\n        \"energy\": 38,\n        \"health\": 17\n      },\n      \"artisanUses\": {\n        \"honey\": false,\n        \"wine\": true,\n        \"juice\": false,\n        \"pickles\": false,\n        \"jelly\": true,\n        \"driedMushrooms\": false,\n        \"driedFruit\": true\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"633\",\n        \"name\": \"Apple Sapling\"\n      }\n    ]\n  },\n  {\n    \"type\": \"fruit-tree\",\n    \"id\": \"632\",\n    \"name\": \"Pomegranate Tree\",\n    \"saplingId\": \"632\",\n    \"saplingName\": \"Pomegranate Sapling\",\n    \"saplingBuyPrices\": [\n      {\n        \"place\": \"Pierre's\",\n        \"price\": 6000\n      },\n      {\n        \"place\": \"JojaMart\",\n        \"price\": 7500\n      }\n    ],\n    \"saplingSellPrice\": 1500,\n    \"seasons\": [\"fall\"],\n    \"daysToMature\": 28,\n    \"description\": \"This fruit has ancient roots. It's bursting with seeds.\",\n    \"image\": \"images/trees/pomegranate/harvest.png\",\n    \"saplingImage\": \"images/trees/pomegranate/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/pomegranate/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/pomegranate/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/pomegranate/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/pomegranate/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/pomegranate/stage-5.png\"\n      }\n    ],\n    \"produce\": {\n      \"id\": \"637\",\n      \"name\": \"Pomegranate\",\n      \"sellPrice\": 140,\n      \"profession\": [\"tiller\"],\n      \"image\": \"images/trees/pomegranate/crop.png\",\n      \"energyHealth\": {\n        \"energy\": 38,\n        \"health\": 17\n      },\n      \"artisanUses\": {\n        \"honey\": false,\n        \"wine\": true,\n        \"juice\": false,\n        \"pickles\": false,\n        \"jelly\": true,\n        \"driedMushrooms\": false,\n        \"driedFruit\": true\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"632\",\n        \"name\": \"Pomegranate Sapling\"\n      }\n    ]\n  },\n  {\n    \"type\": \"wild-tree\",\n    \"id\": \"1\",\n    \"name\": \"Oak Tree\",\n    \"seedId\": \"309\",\n    \"seedName\": \"Acorn\",\n    \"description\": \"A sturdy deciduous tree common throughout the valley. Can be tapped for Oak Resin.\",\n    \"image\": \"images/trees/oak/portrait.png\",\n    \"seedImage\": \"images/trees/oak/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/oak/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/oak/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/oak/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/oak/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/oak/stage-5.png\"\n      }\n    ],\n    \"tapper\": {\n      \"id\": \"725\",\n      \"name\": \"Oak Resin\",\n      \"sellPrice\": 150,\n      \"profession\": [\"tapper\"],\n      \"image\": \"images/forageables/Oak Resin.png\"\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\"\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\"\n      },\n      {\n        \"id\": \"309\",\n        \"name\": \"Acorn\"\n      }\n    ]\n  },\n  {\n    \"type\": \"wild-tree\",\n    \"id\": \"2\",\n    \"name\": \"Maple Tree\",\n    \"seedId\": \"310\",\n    \"seedName\": \"Maple Seed\",\n    \"description\": \"A beautiful tree with vibrant fall colors. Produces a sweet, valuable syrup.\",\n    \"image\": \"images/trees/maple/portrait.png\",\n    \"seedImage\": \"images/trees/maple/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/maple/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/maple/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/maple/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/maple/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/maple/stage-5.png\"\n      }\n    ],\n    \"tapper\": {\n      \"id\": \"724\",\n      \"name\": \"Maple Syrup\",\n      \"sellPrice\": 200,\n      \"profession\": [\"tapper\"],\n      \"image\": \"images/forageables/Maple Syrup.png\",\n      \"energyHealth\": {\n        \"energy\": 50,\n        \"health\": 22\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\"\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\"\n      },\n      {\n        \"id\": \"310\",\n        \"name\": \"Maple Seed\"\n      }\n    ]\n  },\n  {\n    \"type\": \"wild-tree\",\n    \"id\": \"3\",\n    \"name\": \"Pine Tree\",\n    \"seedId\": \"311\",\n    \"seedName\": \"Pine Cone\",\n    \"description\": \"A resilient evergreen that stays green throughout the year.\",\n    \"image\": \"images/trees/pine/portrait.png\",\n    \"seedImage\": \"images/trees/pine/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/pine/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/pine/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/pine/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/pine/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/pine/stage-5.png\"\n      }\n    ],\n    \"tapper\": {\n      \"id\": \"726\",\n      \"name\": \"Pine Tar\",\n      \"sellPrice\": 100,\n      \"profession\": [\"tapper\"],\n      \"image\": \"images/forageables/Pine Tar.png\"\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\"\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\"\n      },\n      {\n        \"id\": \"311\",\n        \"name\": \"Pine Cone\"\n      }\n    ]\n  },\n  {\n    \"type\": \"wild-tree\",\n    \"id\": \"8\",\n    \"name\": \"Mahogany Tree\",\n    \"seedId\": \"292\",\n    \"seedName\": \"Mahogany Seed\",\n    \"description\": \"A rare hardwood tree. When tapped, it produces sap every day.\",\n    \"image\": \"images/trees/mahogany/portrait.png\",\n    \"seedImage\": \"images/trees/mahogany/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/mahogany/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/mahogany/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/mahogany/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/mahogany/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/mahogany/stage-5.png\"\n      }\n    ],\n    \"tapper\": {\n      \"id\": \"92\",\n      \"name\": \"Sap\",\n      \"sellPrice\": 2,\n      \"profession\": [],\n      \"image\": \"images/forageables/Sap.png\",\n      \"energyHealth\": {\n        \"energy\": -2,\n        \"health\": -1\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"292\",\n        \"name\": \"Mahogany Seed\"\n      },\n      {\n        \"id\": \"709\",\n        \"name\": \"Hardwood\"\n      }\n    ]\n  },\n  {\n    \"type\": \"wild-tree\",\n    \"id\": \"7\",\n    \"name\": \"Mushroom Tree\",\n    \"seedId\": \"891\",\n    \"seedName\": \"Mushroom Tree Seed\",\n    \"description\": \"A peculiar tree covered in fungi. Produces mushrooms when tapped.\",\n    \"image\": \"images/trees/mushroom/portrait.png\",\n    \"seedImage\": \"images/trees/mushroom/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/mushroom/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/mushroom/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/mushroom/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/mushroom/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/mushroom/stage-5.png\"\n      }\n    ],\n    \"tapper\": {\n      \"id\": \"404\",\n      \"name\": \"Common Mushroom\",\n      \"sellPrice\": 40,\n      \"profession\": [\"tapper\"],\n      \"image\": \"images/forageables/Common Mushroom.png\",\n      \"energyHealth\": {\n        \"energy\": 38,\n        \"health\": 17\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\"\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\"\n      },\n      {\n        \"id\": \"891\",\n        \"name\": \"Mushroom Tree Seed\"\n      }\n    ]\n  },\n  {\n    \"type\": \"wild-tree\",\n    \"id\": \"13\",\n    \"name\": \"Mystic Tree\",\n    \"seedId\": \"MysticTreeSeed\",\n    \"seedName\": \"Mystic Tree Seed\",\n    \"description\": \"Not native to the valley. This otherworldly tree produces a powerful mystic syrup.\",\n    \"image\": \"images/trees/mystic/portrait.png\",\n    \"seedImage\": \"images/trees/mystic/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/mystic/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/mystic/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/mystic/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/mystic/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/mystic/stage-5.png\"\n      }\n    ],\n    \"tapper\": {\n      \"id\": \"MysticSyrup\",\n      \"name\": \"Mystic Syrup\",\n      \"sellPrice\": 1000,\n      \"profession\": [\"tapper\"],\n      \"image\": \"images/forageables/Mystic Syrup.png\",\n      \"energyHealth\": {\n        \"energy\": 500,\n        \"health\": 225\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\"\n      },\n      {\n        \"id\": \"92\",\n        \"name\": \"Sap\"\n      },\n      {\n        \"id\": \"MysticTreeSeed\",\n        \"name\": \"Mystic Tree Seed\"\n      }\n    ]\n  },\n  {\n    \"type\": \"wild-tree\",\n    \"id\": \"12\",\n    \"name\": \"Fiddlehead Stalk\",\n    \"seedId\": \"MossySeed\",\n    \"seedName\": \"Mossy Seed\",\n    \"description\": \"A peculiar tree that grows from Mossy Seeds. Yields Fiddlehead Ferns instead of wood when chopped. Becomes a stump during winter.\",\n    \"image\": \"images/trees/fiddlehead/portrait.png\",\n    \"seedImage\": \"images/trees/fiddlehead/seed.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/fiddlehead/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/fiddlehead/stage-2.png\"\n      },\n      {\n        \"name\": \"stage 3\",\n        \"image\": \"images/trees/fiddlehead/stage-3.png\"\n      },\n      {\n        \"name\": \"stage 4\",\n        \"image\": \"images/trees/fiddlehead/stage-4.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/fiddlehead/stage-5.png\"\n      }\n    ],\n    \"tapper\": {\n      \"id\": \"259\",\n      \"name\": \"Fiddlehead Fern\",\n      \"sellPrice\": 90,\n      \"profession\": [\"tiller\"],\n      \"image\": \"images/forageables/Fiddlehead Fern.png\",\n      \"energyHealth\": {\n        \"energy\": 25,\n        \"health\": 11\n      }\n    },\n    \"choppedProduce\": [\n      {\n        \"id\": \"259\",\n        \"name\": \"Fiddlehead Fern\"\n      },\n      {\n        \"id\": \"MossySeed\",\n        \"name\": \"Mossy Seed\"\n      }\n    ]\n  },\n  {\n    \"type\": \"wild-tree\",\n    \"id\": \"6\",\n    \"name\": \"Palm Tree\",\n    \"description\": \"A tall tree found in the Calico Desert and on Ginger Island. Cannot be cultivated by players. Shaking or chopping it may yield a Coconut.\",\n    \"image\": \"images/trees/palm/portrait.png\",\n    \"stages\": [\n      {\n        \"name\": \"stage 1\",\n        \"image\": \"images/trees/palm/stage-1.png\"\n      },\n      {\n        \"name\": \"stage 2\",\n        \"image\": \"images/trees/palm/stage-2.png\"\n      },\n      {\n        \"name\": \"mature\",\n        \"image\": \"images/trees/palm/stage-3.png\"\n      }\n    ],\n    \"choppedProduce\": [\n      {\n        \"id\": \"388\",\n        \"name\": \"Wood\"\n      },\n      {\n        \"id\": \"88\",\n        \"name\": \"Coconut\"\n      },\n      {\n        \"id\": \"791\",\n        \"name\": \"Golden Coconut\",\n        \"image\": \"images/minerals/geodes/Golden Coconut.png\"\n      }\n    ]\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/trees.json';\nimport { ArtisanUses, FruitTree, Season, Tree, WildTree } from '@/types';\n\nconst treeData: Tree[] = data as Tree[];\n\n/**\n * Query builder for tree data (fruit trees and wild trees).\n * All filter and sort methods return a new TreeQuery for chaining.\n * Use `.fruitTrees()` or `.wildTrees()` to narrow to a specific subtype.\n */\nexport class TreeQuery extends QueryBase<Tree> {\n  constructor(data: Tree[] = treeData) {\n    super(data);\n  }\n\n  /** Filter to fruit trees only (`type === 'fruit-tree'`). */\n  fruitTrees(): TreeQuery {\n    return new TreeQuery(this.data.filter((t): t is FruitTree => t.type === 'fruit-tree'));\n  }\n\n  /** Filter to wild trees only (`type === 'wild-tree'`). */\n  wildTrees(): TreeQuery {\n    return new TreeQuery(this.data.filter((t): t is WildTree => t.type === 'wild-tree'));\n  }\n\n  /** Filter fruit trees by season they produce in. Wild trees are excluded. */\n  bySeason(season: Season): TreeQuery {\n    return new TreeQuery(\n      this.data.filter((t) => t.type === 'fruit-tree' && (t as FruitTree).seasons.includes(season)),\n    );\n  }\n\n  /** Filter to fruit trees whose produce can be used for the given artisan good. Wild trees always return false for all uses. */\n  byArtisanUse(use: keyof ArtisanUses): TreeQuery {\n    return new TreeQuery(\n      this.data.filter((t) => t.type === 'fruit-tree' && (t as FruitTree).produce.artisanUses[use]),\n    );\n  }\n\n  /** Filter to wild trees that can be tapped (have a `tapper` product). */\n  tappable(): TreeQuery {\n    return new TreeQuery(\n      this.data.filter((t) => t.type === 'wild-tree' && (t as WildTree).tapper !== undefined),\n    );\n  }\n\n  /**\n   * Sort by produce sell price. For fruit trees uses `produce.sellPrice`;\n   * for wild trees uses `tapper.sellPrice` (or 0 if untappable). Default: `'desc'`.\n   */\n  sortByProduceSellPrice(order: 'asc' | 'desc' = 'desc'): TreeQuery {\n    return new TreeQuery(\n      [...this.data].sort((a, b) => {\n        const aPrice = a.type === 'fruit-tree' ? a.produce.sellPrice : (a.tapper?.sellPrice ?? 0);\n        const bPrice = b.type === 'fruit-tree' ? b.produce.sellPrice : (b.tapper?.sellPrice ?? 0);\n        return order === 'desc' ? bPrice - aPrice : aPrice - bPrice;\n      }),\n    );\n  }\n}\n\n/** Returns a TreeQuery for all tree data (fruit + wild). Pass `source` to wrap a pre-filtered array. */\nexport function trees(source: Tree[] = treeData): TreeQuery {\n  return new TreeQuery(source);\n}\n","[\n  {\n    \"id\": \"0\",\n    \"type\": \"sword\",\n    \"name\": \"Rusty Sword\",\n    \"image\": \"images/weapons/swords/Rusty Sword.png\",\n    \"damageMin\": 2,\n    \"damageMax\": 5,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 1,\n    \"obtain\": \"Given at The Mines entrance.\",\n    \"sellPrice\": 50,\n    \"canEnchant\": false\n  },\n  {\n    \"id\": \"12\",\n    \"type\": \"sword\",\n    \"name\": \"Wooden Blade\",\n    \"image\": \"images/weapons/swords/Wooden Blade.png\",\n    \"damageMin\": 3,\n    \"damageMax\": 7,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 1,\n    \"obtain\": \"The Mines floor 10 chest, or purchased from the Adventurer's Guild.\",\n    \"sellPrice\": 50,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"11\",\n    \"type\": \"sword\",\n    \"name\": \"Steel Smallsword\",\n    \"image\": \"images/weapons/swords/Steel Smallsword.png\",\n    \"damageMin\": 4,\n    \"damageMax\": 8,\n    \"speed\": 2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 1,\n    \"obtain\": \"The Mines floor 20 chest, or purchased from the Adventurer's Guild for 750g.\",\n    \"sellPrice\": 50,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"43\",\n    \"type\": \"sword\",\n    \"name\": \"Pirate's Sword\",\n    \"image\": \"images/weapons/swords/Pirate's Sword.png\",\n    \"damageMin\": 8,\n    \"damageMax\": 14,\n    \"speed\": 2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 2,\n    \"obtain\": \"The Mines floor 50 chest, or purchased from the Adventurer's Guild for 850g.\",\n    \"sellPrice\": 100,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"1\",\n    \"type\": \"sword\",\n    \"name\": \"Silver Saber\",\n    \"image\": \"images/weapons/swords/Silver Saber.png\",\n    \"damageMin\": 8,\n    \"damageMax\": 15,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 1,\n    \"knockback\": 0,\n    \"level\": 2,\n    \"obtain\": \"The Mines, or purchased from the Adventurer's Guild.\",\n    \"sellPrice\": 100,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"44\",\n    \"type\": \"sword\",\n    \"name\": \"Cutlass\",\n    \"image\": \"images/weapons/swords/Cutlass.png\",\n    \"damageMin\": 9,\n    \"damageMax\": 17,\n    \"speed\": 2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 3,\n    \"obtain\": \"The Mines, or purchased from the Adventurer's Guild.\",\n    \"sellPrice\": 150,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"15\",\n    \"type\": \"sword\",\n    \"name\": \"Forest Sword\",\n    \"image\": \"images/weapons/swords/Forest Sword.png\",\n    \"damageMin\": 8,\n    \"damageMax\": 18,\n    \"speed\": 2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 1,\n    \"knockback\": 0,\n    \"level\": 3,\n    \"obtain\": \"The Mines floors 20–60.\",\n    \"sellPrice\": 150,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"6\",\n    \"type\": \"sword\",\n    \"name\": \"Iron Edge\",\n    \"image\": \"images/weapons/swords/Iron Edge.png\",\n    \"damageMin\": 12,\n    \"damageMax\": 25,\n    \"speed\": -2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 1,\n    \"knockback\": 3,\n    \"level\": 3,\n    \"obtain\": \"The Mines floors 41–59.\",\n    \"sellPrice\": 150,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"65\",\n    \"type\": \"sword\",\n    \"name\": \"Meowmere\",\n    \"image\": \"images/weapons/swords/Meowmere.png\",\n    \"damageMin\": 20,\n    \"damageMax\": 20,\n    \"speed\": 4,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 2,\n    \"level\": 4,\n    \"obtain\": \"Wizard's Tower basement.\",\n    \"sellPrice\": 200,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"5\",\n    \"type\": \"sword\",\n    \"name\": \"Bone Sword\",\n    \"image\": \"images/weapons/swords/Bone Sword.png\",\n    \"damageMin\": 20,\n    \"damageMax\": 30,\n    \"speed\": 4,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 2,\n    \"level\": 5,\n    \"obtain\": \"The Mines floors 75+, or dropped by Skeletons.\",\n    \"sellPrice\": 250,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"10\",\n    \"type\": \"sword\",\n    \"name\": \"Claymore\",\n    \"image\": \"images/weapons/swords/Claymore.png\",\n    \"damageMin\": 20,\n    \"damageMax\": 32,\n    \"speed\": -4,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 2,\n    \"knockback\": 3,\n    \"level\": 5,\n    \"obtain\": \"The Mines, or purchased from the Adventurer's Guild.\",\n    \"sellPrice\": 250,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"14\",\n    \"type\": \"sword\",\n    \"name\": \"Neptune's Glaive\",\n    \"image\": \"images/weapons/swords/Neptune's Glaive.png\",\n    \"damageMin\": 18,\n    \"damageMax\": 35,\n    \"speed\": -1,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 2,\n    \"knockback\": 4,\n    \"level\": 5,\n    \"obtain\": \"Fishing Treasure Chests.\",\n    \"sellPrice\": 250,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"7\",\n    \"type\": \"sword\",\n    \"name\": \"Templar's Blade\",\n    \"image\": \"images/weapons/swords/Templar's Blade.png\",\n    \"damageMin\": 22,\n    \"damageMax\": 29,\n    \"speed\": 0,\n    \"critChance\": 0,\n    \"critPower\": 0,\n    \"defense\": 1,\n    \"knockback\": 0,\n    \"level\": 5,\n    \"obtain\": \"The Mines, or purchased from the Adventurer's Guild.\",\n    \"sellPrice\": 250,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"13\",\n    \"type\": \"sword\",\n    \"name\": \"Insect Head\",\n    \"image\": \"images/weapons/swords/Insect Head.png\",\n    \"damageMin\": 20,\n    \"damageMax\": 30,\n    \"speed\": 2,\n    \"critChance\": 0.04,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 6,\n    \"obtain\": \"Adventurer's Guild reward for killing 80 bug-type monsters.\",\n    \"sellPrice\": 200,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"8\",\n    \"type\": \"sword\",\n    \"name\": \"Obsidian Edge\",\n    \"image\": \"images/weapons/swords/Obsidian Edge.png\",\n    \"damageMin\": 30,\n    \"damageMax\": 45,\n    \"speed\": -1,\n    \"critChance\": 0.02,\n    \"critPower\": 10,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 6,\n    \"obtain\": \"The Mines floor 90 chest.\",\n    \"sellPrice\": 300,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"60\",\n    \"type\": \"sword\",\n    \"name\": \"Ossified Blade\",\n    \"image\": \"images/weapons/swords/Ossified Blade.png\",\n    \"damageMin\": 26,\n    \"damageMax\": 42,\n    \"speed\": -2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 1,\n    \"knockback\": 2,\n    \"level\": 6,\n    \"obtain\": \"The Mines floor 90, or from a Mystery Box.\",\n    \"sellPrice\": 300,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"42\",\n    \"type\": \"sword\",\n    \"name\": \"Haley's Iron\",\n    \"image\": \"images/weapons/swords/Haley's Iron.png\",\n    \"damageMin\": 30,\n    \"damageMax\": 45,\n    \"speed\": -1,\n    \"critChance\": 0.02,\n    \"critPower\": 10,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 6,\n    \"obtain\": \"Haley's stall at the Desert Festival.\",\n    \"sellPrice\": 300,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"39\",\n    \"type\": \"sword\",\n    \"name\": \"Leah's Whittler\",\n    \"image\": \"images/weapons/swords/Leah's Whittler.png\",\n    \"damageMin\": 30,\n    \"damageMax\": 45,\n    \"speed\": -1,\n    \"critChance\": 0.02,\n    \"critPower\": 10,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 6,\n    \"obtain\": \"Leah's stall at the Desert Festival.\",\n    \"sellPrice\": 300,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"3\",\n    \"type\": \"sword\",\n    \"name\": \"Holy Blade\",\n    \"image\": \"images/weapons/swords/Holy Blade.png\",\n    \"damageMin\": 20,\n    \"damageMax\": 27,\n    \"speed\": 4,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 2,\n    \"knockback\": 0,\n    \"level\": 7,\n    \"obtain\": \"The Mines after floor 80.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"52\",\n    \"type\": \"sword\",\n    \"name\": \"Tempered Broadsword\",\n    \"image\": \"images/weapons/swords/Tempered Broadsword.png\",\n    \"damageMin\": 29,\n    \"damageMax\": 44,\n    \"speed\": -3,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 3,\n    \"knockback\": 3,\n    \"level\": 7,\n    \"obtain\": \"The Mines, or Skull Cavern.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"48\",\n    \"type\": \"sword\",\n    \"name\": \"Yeti Tooth\",\n    \"image\": \"images/weapons/swords/Yeti Tooth.png\",\n    \"damageMin\": 26,\n    \"damageMax\": 42,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 10,\n    \"defense\": 4,\n    \"knockback\": 0,\n    \"level\": 7,\n    \"obtain\": \"The Mines floors 81–99.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"50\",\n    \"type\": \"sword\",\n    \"name\": \"Steel Falchion\",\n    \"image\": \"images/weapons/swords/Steel Falchion.png\",\n    \"damageMin\": 28,\n    \"damageMax\": 46,\n    \"speed\": 4,\n    \"critChance\": 0.02,\n    \"critPower\": 20,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 8,\n    \"obtain\": \"The Mines, or Skull Cavern.\",\n    \"sellPrice\": 400,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"2\",\n    \"type\": \"sword\",\n    \"name\": \"Dark Sword\",\n    \"image\": \"images/weapons/swords/Dark Sword.png\",\n    \"damageMin\": 30,\n    \"damageMax\": 45,\n    \"speed\": -5,\n    \"critChance\": 0.04,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 5,\n    \"level\": 9,\n    \"obtain\": \"Dropped by Haunted Skulls.\",\n    \"sellPrice\": 450,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"9\",\n    \"type\": \"sword\",\n    \"name\": \"Lava Katana\",\n    \"image\": \"images/weapons/swords/Lava Katana.png\",\n    \"damageMin\": 55,\n    \"damageMax\": 64,\n    \"speed\": 0,\n    \"critChance\": 0.015,\n    \"critPower\": 25,\n    \"defense\": 3,\n    \"knockback\": 3,\n    \"level\": 10,\n    \"obtain\": \"Purchased from the Adventurer's Guild for 25,000g after reaching The Mines floor 120.\",\n    \"sellPrice\": 500,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"57\",\n    \"type\": \"sword\",\n    \"name\": \"Dragontooth Cutlass\",\n    \"image\": \"images/weapons/swords/Dragontooth Cutlass.png\",\n    \"damageMin\": 75,\n    \"damageMax\": 90,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 50,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 13,\n    \"obtain\": \"Volcano Dungeon chest.\",\n    \"sellPrice\": 650,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"54\",\n    \"type\": \"sword\",\n    \"name\": \"Dwarf Sword\",\n    \"image\": \"images/weapons/swords/Dwarf Sword.png\",\n    \"damageMin\": 65,\n    \"damageMax\": 75,\n    \"speed\": 2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 4,\n    \"knockback\": 0,\n    \"level\": 13,\n    \"obtain\": \"Volcano Dungeon chest.\",\n    \"sellPrice\": 650,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"4\",\n    \"type\": \"sword\",\n    \"name\": \"Galaxy Sword\",\n    \"image\": \"images/weapons/swords/Galaxy Sword.png\",\n    \"damageMin\": 60,\n    \"damageMax\": 80,\n    \"speed\": 4,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 13,\n    \"obtain\": \"Bring a Prismatic Shard to the Three Pillars in the Calico Desert.\",\n    \"sellPrice\": 650,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"62\",\n    \"type\": \"sword\",\n    \"name\": \"Infinity Blade\",\n    \"image\": \"images/weapons/swords/Infinity Blade.png\",\n    \"damageMin\": 80,\n    \"damageMax\": 100,\n    \"speed\": 4,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 2,\n    \"knockback\": 0,\n    \"level\": 17,\n    \"obtain\": \"Forge the Galaxy Sword with 3 Galaxy Souls and 60 Cinder Shards.\",\n    \"sellPrice\": 850,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"16\",\n    \"type\": \"dagger\",\n    \"name\": \"Carving Knife\",\n    \"image\": \"images/weapons/daggers/Carving Knife.png\",\n    \"damageMin\": 1,\n    \"damageMax\": 3,\n    \"speed\": 0,\n    \"critChance\": 0.04,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 1,\n    \"obtain\": \"The Mines floors 1–19.\",\n    \"sellPrice\": 50,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"17\",\n    \"type\": \"dagger\",\n    \"name\": \"Iron Dirk\",\n    \"image\": \"images/weapons/daggers/Iron Dirk.png\",\n    \"damageMin\": 2,\n    \"damageMax\": 4,\n    \"speed\": 0,\n    \"critChance\": 0.03,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 1,\n    \"obtain\": \"The Mines, or purchased from the Adventurer's Guild.\",\n    \"sellPrice\": 50,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"22\",\n    \"type\": \"dagger\",\n    \"name\": \"Wind Spire\",\n    \"image\": \"images/weapons/daggers/Wind Spire.png\",\n    \"damageMin\": 1,\n    \"damageMax\": 5,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 10,\n    \"defense\": 0,\n    \"knockback\": 5,\n    \"level\": 1,\n    \"obtain\": \"The Mines floors 21–39.\",\n    \"sellPrice\": 50,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"20\",\n    \"type\": \"dagger\",\n    \"name\": \"Elf Blade\",\n    \"image\": \"images/weapons/daggers/Elf Blade.png\",\n    \"damageMin\": 3,\n    \"damageMax\": 5,\n    \"speed\": 0,\n    \"critChance\": 0.04,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 2,\n    \"obtain\": \"The Mines, or purchased from the Adventurer's Guild.\",\n    \"sellPrice\": 100,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"18\",\n    \"type\": \"dagger\",\n    \"name\": \"Burglar's Shank\",\n    \"image\": \"images/weapons/daggers/Burglar's Shank.png\",\n    \"damageMin\": 7,\n    \"damageMax\": 12,\n    \"speed\": 0,\n    \"critChance\": 0.04,\n    \"critPower\": 25,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 4,\n    \"obtain\": \"The Mines, or Skull Cavern.\",\n    \"sellPrice\": 200,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"21\",\n    \"type\": \"dagger\",\n    \"name\": \"Crystal Dagger\",\n    \"image\": \"images/weapons/daggers/Crystal Dagger.png\",\n    \"damageMin\": 4,\n    \"damageMax\": 10,\n    \"speed\": 0,\n    \"critChance\": 0.03,\n    \"critPower\": 50,\n    \"defense\": 0,\n    \"knockback\": 5,\n    \"level\": 4,\n    \"obtain\": \"The Mines floor 60.\",\n    \"sellPrice\": 200,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"19\",\n    \"type\": \"dagger\",\n    \"name\": \"Shadow Dagger\",\n    \"image\": \"images/weapons/daggers/Shadow Dagger.png\",\n    \"damageMin\": 10,\n    \"damageMax\": 20,\n    \"speed\": 0,\n    \"critChance\": 0.04,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 4,\n    \"obtain\": \"The Mines floors 61–79 and 101–119.\",\n    \"sellPrice\": 200,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"51\",\n    \"type\": \"dagger\",\n    \"name\": \"Broken Trident\",\n    \"image\": \"images/weapons/daggers/Broken Trident.png\",\n    \"damageMin\": 15,\n    \"damageMax\": 26,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 5,\n    \"obtain\": \"Fishing Treasure Chests.\",\n    \"sellPrice\": 250,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"45\",\n    \"type\": \"dagger\",\n    \"name\": \"Wicked Kris\",\n    \"image\": \"images/weapons/daggers/Wicked Kris.png\",\n    \"damageMin\": 24,\n    \"damageMax\": 30,\n    \"speed\": 0,\n    \"critChance\": 0.06,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 8,\n    \"obtain\": \"The Mines, or Skull Cavern.\",\n    \"sellPrice\": 400,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"40\",\n    \"type\": \"dagger\",\n    \"name\": \"Abby's Planchette\",\n    \"image\": \"images/weapons/daggers/Abby's Planchette.png\",\n    \"damageMin\": 24,\n    \"damageMax\": 30,\n    \"speed\": 0,\n    \"critChance\": 0.06,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 8,\n    \"obtain\": \"Abigail's stall at the Desert Festival.\",\n    \"sellPrice\": 200,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"35\",\n    \"type\": \"dagger\",\n    \"name\": \"Elliott's Pencil\",\n    \"image\": \"images/weapons/daggers/Elliott's Pencil.png\",\n    \"damageMin\": 24,\n    \"damageMax\": 30,\n    \"speed\": 0,\n    \"critChance\": 0.06,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 8,\n    \"obtain\": \"Elliott's stall at the Desert Festival.\",\n    \"sellPrice\": 200,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"23\",\n    \"type\": \"dagger\",\n    \"name\": \"Galaxy Dagger\",\n    \"image\": \"images/weapons/daggers/Galaxy Dagger.png\",\n    \"damageMin\": 30,\n    \"damageMax\": 40,\n    \"speed\": 1,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 5,\n    \"level\": 8,\n    \"obtain\": \"Purchased from the Adventurer's Guild for 35,000g after obtaining the Galaxy Sword.\",\n    \"sellPrice\": 400,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"56\",\n    \"type\": \"dagger\",\n    \"name\": \"Dwarf Dagger\",\n    \"image\": \"images/weapons/daggers/Dwarf Dagger.png\",\n    \"damageMin\": 32,\n    \"damageMax\": 38,\n    \"speed\": 1,\n    \"critChance\": 0.03,\n    \"critPower\": 0,\n    \"defense\": 6,\n    \"knockback\": 5,\n    \"level\": 11,\n    \"obtain\": \"Volcano Dungeon chest.\",\n    \"sellPrice\": 550,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"59\",\n    \"type\": \"dagger\",\n    \"name\": \"Dragontooth Shiv\",\n    \"image\": \"images/weapons/daggers/Dragontooth Shiv.png\",\n    \"damageMin\": 40,\n    \"damageMax\": 50,\n    \"speed\": 0,\n    \"critChance\": 0.05,\n    \"critPower\": 100,\n    \"defense\": 0,\n    \"knockback\": 5,\n    \"level\": 12,\n    \"obtain\": \"Volcano Dungeon chest.\",\n    \"sellPrice\": 600,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"61\",\n    \"type\": \"dagger\",\n    \"name\": \"Iridium Needle\",\n    \"image\": \"images/weapons/daggers/Iridium Needle.png\",\n    \"damageMin\": 20,\n    \"damageMax\": 35,\n    \"speed\": 0,\n    \"critChance\": 0.1,\n    \"critPower\": 200,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 12,\n    \"obtain\": \"14% chance drop from special slimes when the Shrine of Challenge is active.\",\n    \"sellPrice\": 600,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"64\",\n    \"type\": \"dagger\",\n    \"name\": \"Infinity Dagger\",\n    \"image\": \"images/weapons/daggers/Infinity Dagger.png\",\n    \"damageMin\": 50,\n    \"damageMax\": 70,\n    \"speed\": 1,\n    \"critChance\": 0.06,\n    \"critPower\": 0,\n    \"defense\": 3,\n    \"knockback\": 5,\n    \"level\": 16,\n    \"obtain\": \"Forge the Galaxy Dagger with 3 Galaxy Souls and 60 Cinder Shards.\",\n    \"sellPrice\": 800,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"31\",\n    \"type\": \"club\",\n    \"name\": \"Femur\",\n    \"image\": \"images/weapons/clubs/Femur.png\",\n    \"damageMin\": 6,\n    \"damageMax\": 11,\n    \"speed\": 2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 2,\n    \"obtain\": \"The Mines, or purchased from the Adventurer's Guild.\",\n    \"sellPrice\": 100,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"24\",\n    \"type\": \"club\",\n    \"name\": \"Wood Club\",\n    \"image\": \"images/weapons/clubs/Wood Club.png\",\n    \"damageMin\": 9,\n    \"damageMax\": 16,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 2,\n    \"obtain\": \"The Mines floors 1–39.\",\n    \"sellPrice\": 100,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"27\",\n    \"type\": \"club\",\n    \"name\": \"Wood Mallet\",\n    \"image\": \"images/weapons/clubs/Wood Mallet.png\",\n    \"damageMin\": 15,\n    \"damageMax\": 24,\n    \"speed\": 2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 2,\n    \"level\": 3,\n    \"obtain\": \"The Mines, or purchased from the Adventurer's Guild.\",\n    \"sellPrice\": 150,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"26\",\n    \"type\": \"club\",\n    \"name\": \"Lead Rod\",\n    \"image\": \"images/weapons/clubs/Lead Rod.png\",\n    \"damageMin\": 18,\n    \"damageMax\": 27,\n    \"speed\": -4,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 4,\n    \"obtain\": \"The Mines floors 41–79.\",\n    \"sellPrice\": 200,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"46\",\n    \"type\": \"club\",\n    \"name\": \"Kudgel\",\n    \"image\": \"images/weapons/clubs/Kudgel.png\",\n    \"damageMin\": 27,\n    \"damageMax\": 40,\n    \"speed\": -1,\n    \"critChance\": 0.02,\n    \"critPower\": 50,\n    \"defense\": 0,\n    \"knockback\": 2,\n    \"level\": 5,\n    \"obtain\": \"The Mines floors 101+.\",\n    \"sellPrice\": 250,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"25\",\n    \"type\": \"club\",\n    \"name\": \"Alex's Bat\",\n    \"image\": \"images/weapons/clubs/Alex's Bat.png\",\n    \"damageMin\": 40,\n    \"damageMax\": 55,\n    \"speed\": -2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 7,\n    \"obtain\": \"Alex's stall at the Desert Festival.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"37\",\n    \"type\": \"club\",\n    \"name\": \"Harvey's Mallet\",\n    \"image\": \"images/weapons/clubs/Harvey's Mallet.png\",\n    \"damageMin\": 40,\n    \"damageMax\": 55,\n    \"speed\": -2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 7,\n    \"obtain\": \"Harvey's stall at the Desert Festival.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"36\",\n    \"type\": \"club\",\n    \"name\": \"Maru's Wrench\",\n    \"image\": \"images/weapons/clubs/Maru's Wrench.png\",\n    \"damageMin\": 40,\n    \"damageMax\": 55,\n    \"speed\": -2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 7,\n    \"obtain\": \"Maru's stall at the Desert Festival.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"38\",\n    \"type\": \"club\",\n    \"name\": \"Penny's Fryer\",\n    \"image\": \"images/weapons/clubs/Penny's Fryer.png\",\n    \"damageMin\": 40,\n    \"damageMax\": 55,\n    \"speed\": -2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 7,\n    \"obtain\": \"Penny's stall at the Desert Festival.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"30\",\n    \"type\": \"club\",\n    \"name\": \"Sam's Old Guitar\",\n    \"image\": \"images/weapons/clubs/Sam's Old Guitar.png\",\n    \"damageMin\": 40,\n    \"damageMax\": 55,\n    \"speed\": -2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 7,\n    \"obtain\": \"Sam's stall at the Desert Festival.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"41\",\n    \"type\": \"club\",\n    \"name\": \"Seb's Lost Mace\",\n    \"image\": \"images/weapons/clubs/Seb's Lost Mace.png\",\n    \"damageMin\": 40,\n    \"damageMax\": 55,\n    \"speed\": -2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 7,\n    \"obtain\": \"Sebastian's stall at the Desert Festival.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"28\",\n    \"type\": \"club\",\n    \"name\": \"The Slammer\",\n    \"image\": \"images/weapons/clubs/The Slammer.png\",\n    \"damageMin\": 40,\n    \"damageMax\": 55,\n    \"speed\": -2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 0,\n    \"level\": 7,\n    \"obtain\": \"The Mines floors 81–99, or Skull Cavern.\",\n    \"sellPrice\": 350,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"29\",\n    \"type\": \"club\",\n    \"name\": \"Galaxy Hammer\",\n    \"image\": \"images/weapons/clubs/Galaxy Hammer.png\",\n    \"damageMin\": 70,\n    \"damageMax\": 90,\n    \"speed\": 2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 0,\n    \"knockback\": 5,\n    \"level\": 12,\n    \"obtain\": \"Purchased from the Adventurer's Guild for 75,000g after obtaining the Galaxy Sword.\",\n    \"sellPrice\": 600,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"55\",\n    \"type\": \"club\",\n    \"name\": \"Dwarf Hammer\",\n    \"image\": \"images/weapons/clubs/Dwarf Hammer.png\",\n    \"damageMin\": 75,\n    \"damageMax\": 85,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 2,\n    \"knockback\": 5,\n    \"level\": 13,\n    \"obtain\": \"Volcano Dungeon chest.\",\n    \"sellPrice\": 650,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"58\",\n    \"type\": \"club\",\n    \"name\": \"Dragontooth Club\",\n    \"image\": \"images/weapons/clubs/Dragontooth Club.png\",\n    \"damageMin\": 80,\n    \"damageMax\": 100,\n    \"speed\": 0,\n    \"critChance\": 0.02,\n    \"critPower\": 50,\n    \"defense\": 0,\n    \"knockback\": 3,\n    \"level\": 14,\n    \"obtain\": \"Volcano Dungeon chest.\",\n    \"sellPrice\": 700,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"63\",\n    \"type\": \"club\",\n    \"name\": \"Infinity Gavel\",\n    \"image\": \"images/weapons/clubs/Infinity Gavel.png\",\n    \"damageMin\": 100,\n    \"damageMax\": 120,\n    \"speed\": 2,\n    \"critChance\": 0.02,\n    \"critPower\": 0,\n    \"defense\": 1,\n    \"knockback\": 5,\n    \"level\": 17,\n    \"obtain\": \"Forge the Galaxy Hammer with 3 Galaxy Souls and 60 Cinder Shards.\",\n    \"sellPrice\": 850,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"32\",\n    \"type\": \"slingshot\",\n    \"name\": \"Slingshot\",\n    \"image\": \"images/weapons/slingshots/Slingshot.png\",\n    \"obtain\": \"The Mines floor 40 chest.\",\n    \"sellPrice\": 50,\n    \"canEnchant\": true\n  },\n  {\n    \"id\": \"33\",\n    \"type\": \"slingshot\",\n    \"name\": \"Master Slingshot\",\n    \"image\": \"images/weapons/slingshots/Master Slingshot.png\",\n    \"obtain\": \"The Mines floor 70 chest.\",\n    \"sellPrice\": 50,\n    \"canEnchant\": true\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport weaponData from '@/data/weapons.json';\nimport { MeleeWeapon, Slingshot, Weapon, WeaponType } from '@/types';\n\nconst weaponsData: Weapon[] = weaponData as Weapon[];\n\n/**\n * Query builder for weapon data (swords, daggers, clubs, slingshots).\n * All filter and sort methods return a new WeaponQuery for chaining.\n */\nexport class WeaponQuery extends QueryBase<Weapon> {\n  constructor(data: Weapon[] = weaponsData) {\n    super(data);\n  }\n\n  /** Filter by weapon type string. Use the convenience methods below for type-narrowed results. */\n  byType(type: WeaponType): WeaponQuery {\n    return new WeaponQuery(this.data.filter((w) => w.type === type));\n  }\n\n  /** Filter to swords only. */\n  swords(): WeaponQuery {\n    return new WeaponQuery(this.data.filter((w): w is MeleeWeapon => w.type === 'sword'));\n  }\n\n  /** Filter to daggers only. */\n  daggers(): WeaponQuery {\n    return new WeaponQuery(this.data.filter((w): w is MeleeWeapon => w.type === 'dagger'));\n  }\n\n  /** Filter to clubs only. */\n  clubs(): WeaponQuery {\n    return new WeaponQuery(this.data.filter((w): w is MeleeWeapon => w.type === 'club'));\n  }\n\n  /** Filter to slingshots only. */\n  slingshots(): WeaponQuery {\n    return new WeaponQuery(this.data.filter((w): w is Slingshot => w.type === 'slingshot'));\n  }\n\n  /** Filter to all melee weapons (swords, daggers, clubs). */\n  melee(): WeaponQuery {\n    return new WeaponQuery(\n      this.data.filter(\n        (w): w is MeleeWeapon => w.type === 'sword' || w.type === 'dagger' || w.type === 'club',\n      ),\n    );\n  }\n\n  /** Filter to weapons that can be enchanted at the Forge. */\n  canEnchant(): WeaponQuery {\n    return new WeaponQuery(this.data.filter((w) => w.canEnchant));\n  }\n\n  /**\n   * Filter to melee weapons at or above the given level threshold.\n   * Slingshots are excluded as they have no level.\n   */\n  byMinLevel(level: number): WeaponQuery {\n    return new WeaponQuery(\n      this.data.filter((w): w is MeleeWeapon => w.type !== 'slingshot' && w.level >= level),\n    );\n  }\n\n  /**\n   * Filter to melee weapons at or below the given level threshold.\n   * Slingshots are excluded as they have no level.\n   */\n  byMaxLevel(level: number): WeaponQuery {\n    return new WeaponQuery(\n      this.data.filter((w): w is MeleeWeapon => w.type !== 'slingshot' && w.level <= level),\n    );\n  }\n\n  /**\n   * Sort by max damage. Slingshots sort as 0 since they have no `damageMax`.\n   * Default: `'desc'` (highest damage first).\n   */\n  sortByDamage(order: 'asc' | 'desc' = 'desc'): WeaponQuery {\n    return new WeaponQuery(\n      [...this.data].sort((a, b) => {\n        const aMax = 'damageMax' in a ? a.damageMax : 0;\n        const bMax = 'damageMax' in b ? b.damageMax : 0;\n        return order === 'asc' ? aMax - bMax : bMax - aMax;\n      }),\n    );\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): WeaponQuery {\n    return new WeaponQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /**\n   * Sort by level. Slingshots sort as 0 since they have no level.\n   * Default: `'asc'` (lowest level first).\n   */\n  sortByLevel(order: 'asc' | 'desc' = 'asc'): WeaponQuery {\n    return new WeaponQuery(\n      [...this.data].sort((a, b) => {\n        const aLevel = 'level' in a ? a.level : 0;\n        const bLevel = 'level' in b ? b.level : 0;\n        return order === 'asc' ? aLevel - bLevel : bLevel - aLevel;\n      }),\n    );\n  }\n}\n\n/** Returns a WeaponQuery for all weapon data. Pass `source` to wrap a pre-filtered array. */\nexport function weapons(source: Weapon[] = weaponsData): WeaponQuery {\n  return new WeaponQuery(source);\n}\n","import { SearchResult, SearchResultKind } from '@/types';\nimport { animals, isFarmAnimal } from '../animals';\nimport { artifacts } from '../artifacts';\nimport { artisanGoods } from '../artisan-goods';\nimport { bait } from '../bait';\nimport { cooking } from '../cooking';\nimport { crafting } from '../crafting';\nimport { crops } from '../crops';\nimport { fish } from '../fish';\nimport { footwear } from '../footwear';\nimport { forageables } from '../forageables';\nimport { hats } from '../hats';\nimport { minerals } from '../minerals';\nimport { monsterLoot, monsters } from '../monsters';\nimport { rarecrows } from '../rarecrows';\nimport { rings } from '../rings';\nimport { tackle } from '../tackle';\nimport { tools } from '../tools';\nimport { trees } from '../trees';\nimport { weapons } from '../weapons';\n\n/** Returns true if the query matches the item by exact ID or name substring (case-insensitive). */\nfunction matches(query: string, id: string, name: string): boolean {\n  const q = query.toLowerCase();\n  return id.toLowerCase() === q || name.toLowerCase().includes(q);\n}\n\ntype RawResult = Omit<SearchResult, 'parents'> & { parent?: { id: string; name: string } };\n\n/**\n * Deduplicates raw results by `kind:id`. When the same item appears from multiple\n * parents (e.g. Egg from White Chicken and Blue Chicken), the parents are merged\n * into a single `parents` array on the deduplicated result.\n */\nfunction dedupe(raw: RawResult[]): SearchResult[] {\n  const seen = new Map<string, SearchResult>();\n  for (const { parent, ...rest } of raw) {\n    const key = `${rest.kind}:${rest.id}`;\n    if (seen.has(key)) {\n      if (parent) seen.get(key)!.parents!.push(parent);\n    } else {\n      seen.set(key, { ...rest, parents: parent ? [parent] : undefined });\n    }\n  }\n  return Array.from(seen.values());\n}\n\n/**\n * Search for any item across all data modules by name (substring) or ID (exact match).\n * Includes nested items: crop seeds, fruit tree produce, wild tree tappers,\n * animal produce, and deluxe animal produce.\n *\n * Results are deduplicated by kind + ID. Nested items shared across multiple\n * parents (e.g. Egg from White Chicken and Blue Chicken) are merged into one\n * result with a `parents` array listing all sources.\n *\n * @param query - Name substring or exact ID to search for (case-insensitive)\n * @param kinds - Optional filter to restrict results to specific kinds\n */\nexport function search(query: string, kinds?: SearchResultKind[]): SearchResult[] {\n  const raw: RawResult[] = [];\n\n  function add(result: RawResult): void {\n    if (!kinds || kinds.includes(result.kind)) {\n      raw.push(result);\n    }\n  }\n\n  // Crops\n  for (const crop of crops().get()) {\n    if (matches(query, crop.id, crop.name)) {\n      add({\n        kind: 'crop',\n        id: crop.id,\n        name: crop.name,\n        image: crop.image,\n        sellPrice: crop.cropSellPrice,\n      });\n    }\n    if (matches(query, crop.seedId, crop.seedName)) {\n      add({\n        kind: 'crop-seed',\n        id: crop.seedId,\n        name: crop.seedName,\n        image: crop.seedImage,\n        sellPrice: crop.seedSellPrice,\n      });\n    }\n  }\n\n  // Trees\n  for (const tree of trees().get()) {\n    if (tree.type === 'fruit-tree') {\n      if (matches(query, tree.id, tree.name)) {\n        add({\n          kind: 'fruit-tree',\n          id: tree.id,\n          name: tree.name,\n          image: tree.image,\n          sellPrice: null,\n        });\n      }\n      if (matches(query, tree.produce.id, tree.produce.name)) {\n        add({\n          kind: 'fruit-tree-produce',\n          id: tree.produce.id,\n          name: tree.produce.name,\n          image: tree.produce.image,\n          sellPrice: tree.produce.sellPrice,\n          parent: { id: tree.id, name: tree.name },\n        });\n      }\n    } else {\n      if (matches(query, tree.id, tree.name)) {\n        add({\n          kind: 'wild-tree',\n          id: tree.id,\n          name: tree.name,\n          image: tree.image,\n          sellPrice: null,\n        });\n      }\n      if (tree.seedId && tree.seedName && matches(query, tree.seedId, tree.seedName)) {\n        add({\n          kind: 'wild-tree-seed',\n          id: tree.seedId,\n          name: tree.seedName,\n          image: tree.seedImage ?? '',\n          sellPrice: null,\n        });\n      }\n      if (tree.tapper && matches(query, tree.tapper.id, tree.tapper.name)) {\n        add({\n          kind: 'wild-tree-tapper',\n          id: tree.tapper.id,\n          name: tree.tapper.name,\n          image: tree.tapper.image,\n          sellPrice: tree.tapper.sellPrice,\n          parent: { id: tree.id, name: tree.name },\n        });\n      }\n    }\n  }\n\n  // Animals\n  for (const animal of animals().get()) {\n    if (matches(query, animal.id, animal.name)) {\n      add({\n        kind: 'animal',\n        id: animal.id,\n        name: animal.name,\n        image: animal.image,\n        sellPrice: null,\n      });\n    }\n    if (isFarmAnimal(animal)) {\n      if (matches(query, animal.produce.id, animal.produce.name)) {\n        add({\n          kind: 'animal-produce',\n          id: animal.produce.id,\n          name: animal.produce.name,\n          image: animal.produce.image,\n          sellPrice: animal.produce.sellPrice,\n          parent: { id: animal.id, name: animal.name },\n        });\n      }\n      if (\n        animal.deluxeProduce &&\n        matches(query, animal.deluxeProduce.id, animal.deluxeProduce.name)\n      ) {\n        add({\n          kind: 'animal-produce',\n          id: animal.deluxeProduce.id,\n          name: animal.deluxeProduce.name,\n          image: animal.deluxeProduce.image,\n          sellPrice: animal.deluxeProduce.sellPrice,\n          parent: { id: animal.id, name: animal.name },\n        });\n      }\n    }\n  }\n\n  // Monsters\n  for (const monster of monsters().get()) {\n    if (matches(query, monster.id, monster.name)) {\n      add({\n        kind: 'monster',\n        id: monster.id,\n        name: monster.name,\n        image: monster.image,\n        sellPrice: null,\n      });\n    }\n  }\n\n  // Monster loot\n  for (const loot of monsterLoot().get()) {\n    if (matches(query, loot.id, loot.name)) {\n      for (const monsterId of loot.droppedBy) {\n        const monster = monsters().find(monsterId);\n        add({\n          kind: 'monster-loot',\n          id: loot.id,\n          name: loot.name,\n          image: loot.image,\n          sellPrice: loot.sellPrice,\n          parent: monster ? { id: monster.id, name: monster.name } : undefined,\n        });\n      }\n    }\n  }\n\n  // Rings\n  for (const ring of rings().get()) {\n    if (matches(query, ring.id, ring.name)) {\n      add({\n        kind: 'ring',\n        id: ring.id,\n        name: ring.name,\n        image: ring.image,\n        sellPrice: ring.sellPrice,\n      });\n    }\n  }\n\n  // Tools\n  for (const tool of tools().get()) {\n    if (tool.type === 'upgradeable') {\n      if (matches(query, tool.id, tool.name)) {\n        const image = tool.levels.find((l) => l.image !== null)?.image;\n        if (image) {\n          add({ kind: 'tool', id: tool.id, name: tool.name, image, sellPrice: null });\n        }\n      }\n    } else if (tool.type === 'fishing-rod') {\n      for (const level of tool.levels) {\n        if (matches(query, level.name, level.name)) {\n          add({ kind: 'tool', id: tool.id, name: level.name, image: level.image, sellPrice: null });\n        }\n      }\n    } else {\n      if (matches(query, tool.id, tool.name)) {\n        add({ kind: 'tool', id: tool.id, name: tool.name, image: tool.image, sellPrice: null });\n      }\n    }\n  }\n\n  // Weapons\n  for (const weapon of weapons().get()) {\n    if (matches(query, weapon.id, weapon.name)) {\n      add({\n        kind: 'weapon',\n        id: weapon.id,\n        name: weapon.name,\n        image: weapon.image,\n        sellPrice: weapon.sellPrice,\n      });\n    }\n  }\n\n  // Artisan goods\n  for (const good of artisanGoods().get()) {\n    if (matches(query, good.id, good.name)) {\n      add({\n        kind: 'artisan-good',\n        id: good.id,\n        name: good.name,\n        image: good.image,\n        sellPrice: good.sellPrice,\n      });\n    }\n  }\n\n  // Hats\n  for (const hat of hats().get()) {\n    if (matches(query, hat.id, hat.name)) {\n      add({ kind: 'hat', id: hat.id, name: hat.name, image: hat.image, sellPrice: null });\n    }\n  }\n\n  // Footwear\n  for (const item of footwear().get()) {\n    if (matches(query, item.id, item.name)) {\n      add({ kind: 'footwear', id: item.id, name: item.name, image: item.image, sellPrice: null });\n    }\n  }\n\n  // Forageables\n  for (const item of forageables().get()) {\n    if (matches(query, item.id, item.name)) {\n      add({\n        kind: 'forageable',\n        id: item.id,\n        name: item.name,\n        image: item.image,\n        sellPrice: item.sellPrice,\n      });\n    }\n  }\n\n  // Fish\n  for (const item of fish().get()) {\n    if (matches(query, item.id, item.name)) {\n      add({\n        kind: 'fish',\n        id: item.id,\n        name: item.name,\n        image: item.image,\n        sellPrice: item.sellPrice,\n      });\n    }\n  }\n\n  // Bait\n  for (const item of bait().get()) {\n    if (matches(query, item.id, item.name)) {\n      add({\n        kind: 'bait',\n        id: item.id,\n        name: item.name,\n        image: item.image,\n        sellPrice: item.sellPrice,\n      });\n    }\n  }\n\n  // Tackle\n  for (const item of tackle().get()) {\n    if (matches(query, item.id, item.name)) {\n      add({\n        kind: 'tackle',\n        id: item.id,\n        name: item.name,\n        image: item.image,\n        sellPrice: item.sellPrice,\n      });\n    }\n  }\n\n  // Cooked dishes\n  for (const dish of cooking().get()) {\n    if (matches(query, dish.id, dish.name)) {\n      add({\n        kind: 'cooked-dish',\n        id: dish.id,\n        name: dish.name,\n        image: dish.image,\n        sellPrice: dish.sellPrice,\n      });\n    }\n  }\n\n  // Artifacts\n  for (const artifact of artifacts().get()) {\n    if (matches(query, artifact.id, artifact.name)) {\n      add({\n        kind: 'artifact',\n        id: artifact.id,\n        name: artifact.name,\n        image: artifact.image,\n        sellPrice: artifact.sellPrice,\n      });\n    }\n  }\n\n  // Crafting recipes\n  for (const recipe of crafting().get()) {\n    if (matches(query, recipe.id, recipe.name)) {\n      add({\n        kind: 'crafting-recipe',\n        id: recipe.id,\n        name: recipe.name,\n        image: recipe.image,\n        sellPrice: null,\n      });\n    }\n  }\n\n  // Minerals, geodes, ores, bars, nodes, and resources\n  for (const mineral of minerals().get()) {\n    if (matches(query, mineral.id, mineral.name)) {\n      if (mineral.kind === 'geode') {\n        add({\n          kind: 'geode',\n          id: mineral.id,\n          name: mineral.name,\n          image: mineral.image,\n          sellPrice: mineral.sellPrice,\n        });\n      } else if (mineral.kind === 'node') {\n        add({\n          kind: 'mining-node',\n          id: mineral.id,\n          name: mineral.name,\n          image: mineral.image,\n          sellPrice: null,\n        });\n      } else if (mineral.kind === 'resource') {\n        add({\n          kind: 'mineral-resource',\n          id: mineral.id,\n          name: mineral.name,\n          image: mineral.image,\n          sellPrice: mineral.sellPrice,\n        });\n      } else {\n        add({\n          kind: 'mineral',\n          id: mineral.id,\n          name: mineral.name,\n          image: mineral.image,\n          sellPrice: mineral.sellPrice,\n        });\n      }\n    }\n  }\n\n  // Rarecrows\n  for (const crow of rarecrows().get()) {\n    if (matches(query, crow.id, crow.name)) {\n      add({ kind: 'rarecrow', id: crow.id, name: crow.name, image: crow.image, sellPrice: null });\n    }\n  }\n\n  return dedupe(raw);\n}\n","[\n  {\n    \"id\": \"farming\",\n    \"name\": \"Farming\",\n    \"description\": \"Gained by harvesting crops and caring for animals.\",\n    \"toolBonus\": \"Each level grants +1 hoe and watering can proficiency\",\n    \"image\": \"images/skills/Farming.png\",\n    \"levels\": [\n      {\n        \"level\": 1,\n        \"xpRequired\": 100,\n        \"totalXp\": 100,\n        \"recipes\": {\n          \"crafting\": [\"Scarecrow\", \"Basic Fertilizer\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 2,\n        \"xpRequired\": 280,\n        \"totalXp\": 380,\n        \"recipes\": {\n          \"crafting\": [\"Mayonnaise Machine\", \"Stone Fence\", \"Sprinkler\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 3,\n        \"xpRequired\": 390,\n        \"totalXp\": 770,\n        \"recipes\": {\n          \"crafting\": [\"Bee House\", \"Speed-Gro\"],\n          \"cooking\": [\"Farmer's Lunch\"],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 4,\n        \"xpRequired\": 530,\n        \"totalXp\": 1300,\n        \"recipes\": {\n          \"crafting\": [\"Preserves Jar\", \"Basic Retaining Soil\", \"Iron Fence\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 5,\n        \"xpRequired\": 850,\n        \"totalXp\": 2150,\n        \"recipes\": {\n          \"crafting\": [],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 6,\n        \"xpRequired\": 1150,\n        \"totalXp\": 3300,\n        \"recipes\": {\n          \"crafting\": [\"Cheese Press\", \"Hardwood Fence\", \"Quality Sprinkler\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 7,\n        \"xpRequired\": 1500,\n        \"totalXp\": 4800,\n        \"recipes\": {\n          \"crafting\": [\"Loom\", \"Quality Retaining Soil\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 8,\n        \"xpRequired\": 2100,\n        \"totalXp\": 6900,\n        \"recipes\": {\n          \"crafting\": [\"Oil Maker\", \"Keg\", \"Deluxe Speed-Gro\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 9,\n        \"xpRequired\": 3100,\n        \"totalXp\": 10000,\n        \"recipes\": {\n          \"crafting\": [\"Seed Maker\", \"Iridium Sprinkler\", \"Quality Fertilizer\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 10,\n        \"xpRequired\": 5000,\n        \"totalXp\": 15000,\n        \"recipes\": { \"crafting\": [], \"cooking\": [], \"additional\": [] }\n      }\n    ],\n    \"mastery\": {\n      \"unlocks\": [\n        {\n          \"name\": \"Iridium Scythe\",\n          \"description\": \"Can harvest any crops and is excellent at gathering hay\"\n        },\n        {\n          \"name\": \"Statue of Blessings\",\n          \"description\": \"Recipe unlocked — provides a unique blessing daily\"\n        },\n        {\n          \"name\": \"Golden Animal Crackers\",\n          \"description\": \"Permanently doubles farm animal produce (except pigs)\"\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"mining\",\n    \"name\": \"Mining\",\n    \"description\": \"Increased by breaking rocks.\",\n    \"toolBonus\": \"Each level adds +1 to pickaxe proficiency\",\n    \"image\": \"images/skills/Mining.png\",\n    \"levels\": [\n      {\n        \"level\": 1,\n        \"xpRequired\": 100,\n        \"totalXp\": 100,\n        \"recipes\": { \"crafting\": [\"Cherry Bomb\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 2,\n        \"xpRequired\": 280,\n        \"totalXp\": 380,\n        \"recipes\": { \"crafting\": [\"Staircase\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 3,\n        \"xpRequired\": 390,\n        \"totalXp\": 770,\n        \"recipes\": {\n          \"crafting\": [],\n          \"cooking\": [\"Miner's Treat\"],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 4,\n        \"xpRequired\": 530,\n        \"totalXp\": 1300,\n        \"recipes\": {\n          \"crafting\": [\"Glowstone Ring\", \"Transmute (Fe)\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 5,\n        \"xpRequired\": 850,\n        \"totalXp\": 2150,\n        \"recipes\": { \"crafting\": [], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 6,\n        \"xpRequired\": 1150,\n        \"totalXp\": 3300,\n        \"recipes\": { \"crafting\": [\"Bomb\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 7,\n        \"xpRequired\": 1500,\n        \"totalXp\": 4800,\n        \"recipes\": { \"crafting\": [\"Transmute (Au)\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 8,\n        \"xpRequired\": 2100,\n        \"totalXp\": 6900,\n        \"recipes\": { \"crafting\": [\"Mega Bomb\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 9,\n        \"xpRequired\": 3100,\n        \"totalXp\": 10000,\n        \"recipes\": { \"crafting\": [\"Crystalarium\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 10,\n        \"xpRequired\": 5000,\n        \"totalXp\": 15000,\n        \"recipes\": { \"crafting\": [], \"cooking\": [], \"additional\": [] }\n      }\n    ],\n    \"mastery\": {\n      \"unlocks\": [\n        {\n          \"name\": \"Statue of The Dwarf King\",\n          \"description\": \"Recipe unlocked — choose from two mining powers daily\"\n        },\n        {\n          \"name\": \"Heavy Furnace\",\n          \"description\": \"Recipe unlocked — more efficient smelting (25 ore + 3 coal per batch)\"\n        },\n        { \"name\": \"Doubled Gem Yield\", \"description\": \"Gem-bearing rocks now grant twice the gems\" }\n      ]\n    }\n  },\n  {\n    \"id\": \"foraging\",\n    \"name\": \"Foraging\",\n    \"description\": \"Increased by gathering forage items and chopping trees with an axe.\",\n    \"toolBonus\": \"Each level adds +1 axe proficiency\",\n    \"image\": \"images/skills/Foraging.png\",\n    \"levels\": [\n      {\n        \"level\": 1,\n        \"xpRequired\": 100,\n        \"totalXp\": 100,\n        \"recipes\": {\n          \"crafting\": [\"Wild Seeds (Sp)\", \"Field Snack\"],\n          \"cooking\": [],\n          \"additional\": [\"Trees sometimes drop seeds.\"]\n        }\n      },\n      {\n        \"level\": 2,\n        \"xpRequired\": 280,\n        \"totalXp\": 380,\n        \"recipes\": { \"crafting\": [\"Charcoal Kiln\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 3,\n        \"xpRequired\": 390,\n        \"totalXp\": 770,\n        \"recipes\": { \"crafting\": [\"Cookout Kit\"], \"cooking\": [\"Moss Soup\"], \"additional\": [] }\n      },\n      {\n        \"level\": 4,\n        \"xpRequired\": 530,\n        \"totalXp\": 1300,\n        \"recipes\": {\n          \"crafting\": [\"Wild Seeds (Su)\", \"Tapper\", \"Mushroom Log\"],\n          \"cooking\": [],\n          \"additional\": [\"+1 Wild Berry harvesting\"]\n        }\n      },\n      {\n        \"level\": 5,\n        \"xpRequired\": 850,\n        \"totalXp\": 2150,\n        \"recipes\": { \"crafting\": [], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 6,\n        \"xpRequired\": 1150,\n        \"totalXp\": 3300,\n        \"recipes\": {\n          \"crafting\": [\"Lightning Rod\", \"Wild Seeds (Fa)\", \"Warp Totem: Beach\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 7,\n        \"xpRequired\": 1500,\n        \"totalXp\": 4800,\n        \"recipes\": {\n          \"crafting\": [\"Wild Seeds (Wi)\", \"Warp Totem: Mountains\", \"Tree Fertilizer\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 8,\n        \"xpRequired\": 2100,\n        \"totalXp\": 6900,\n        \"recipes\": {\n          \"crafting\": [\"Warp Totem: Farm\", \"Tent Kit\"],\n          \"cooking\": [\"Survival Burger\"],\n          \"additional\": [\"+1 Wild Berry harvesting\"]\n        }\n      },\n      {\n        \"level\": 9,\n        \"xpRequired\": 3100,\n        \"totalXp\": 10000,\n        \"recipes\": {\n          \"crafting\": [\"Rain Totem\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 10,\n        \"xpRequired\": 5000,\n        \"totalXp\": 15000,\n        \"recipes\": { \"crafting\": [], \"cooking\": [], \"additional\": [] }\n      }\n    ],\n    \"mastery\": {\n      \"unlocks\": [\n        { \"name\": \"Mystic Tree Seed\", \"description\": \"Recipe unlocked — grows a special tree\" },\n        {\n          \"name\": \"Treasure Totem\",\n          \"description\": \"Recipe unlocked — summons a ring of treasure spots\"\n        },\n        {\n          \"name\": \"Golden Mystery Box\",\n          \"description\": \"Superior mystery boxes added to the loot table\"\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"fishing\",\n    \"name\": \"Fishing\",\n    \"description\": \"Increased by catching fish and using crab pots.\",\n    \"toolBonus\": \"Each level grants +1 fishing rod proficiency, increases minimum fish size and bobber bar height, and decreases max time before fish bite\",\n    \"image\": \"images/skills/Fishing.png\",\n    \"levels\": [\n      {\n        \"level\": 1,\n        \"xpRequired\": 100,\n        \"totalXp\": 100,\n        \"recipes\": {\n          \"crafting\": [],\n          \"cooking\": [],\n          \"additional\": [\"Casting distance increased by one tile\"]\n        }\n      },\n      {\n        \"level\": 2,\n        \"xpRequired\": 280,\n        \"totalXp\": 380,\n        \"recipes\": {\n          \"crafting\": [\"Bait\"],\n          \"cooking\": [],\n          \"additional\": [\"Fiberglass Rod & Bait unlocked in Willy's Fish Shop\"]\n        }\n      },\n      {\n        \"level\": 3,\n        \"xpRequired\": 390,\n        \"totalXp\": 770,\n        \"recipes\": {\n          \"crafting\": [\"Crab Pot\"],\n          \"cooking\": [\"Dish O' The Sea\"],\n          \"additional\": [\"Crab Pot unlocked in Willy's Fish Shop\"]\n        }\n      },\n      {\n        \"level\": 4,\n        \"xpRequired\": 530,\n        \"totalXp\": 1300,\n        \"recipes\": {\n          \"crafting\": [\"Deluxe Bait\", \"Worm Bin\", \"Recycling Machine\"],\n          \"cooking\": [],\n          \"additional\": [\n            \"Deluxe Bait unlocked in Willy's Fish Shop\",\n            \"Casting distance increased by one tile\"\n          ]\n        }\n      },\n      {\n        \"level\": 5,\n        \"xpRequired\": 850,\n        \"totalXp\": 2150,\n        \"recipes\": { \"crafting\": [], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 6,\n        \"xpRequired\": 1150,\n        \"totalXp\": 3300,\n        \"recipes\": {\n          \"crafting\": [\"Bait Maker\", \"Spinner\", \"Trap Bobber\", \"Sonar Bobber\"],\n          \"cooking\": [],\n          \"additional\": [\n            \"Iridium Rod, Sonar Bobber, Lead Bobber, Spinner, Trap Bobber unlocked in Willy's Fish Shop\"\n          ]\n        }\n      },\n      {\n        \"level\": 7,\n        \"xpRequired\": 1500,\n        \"totalXp\": 4800,\n        \"recipes\": {\n          \"crafting\": [\"Cork Bobber\", \"Treasure Hunter\"],\n          \"cooking\": [],\n          \"additional\": [\"Cork Bobber & Treasure Hunter unlocked in Willy's Fish Shop\"]\n        }\n      },\n      {\n        \"level\": 8,\n        \"xpRequired\": 2100,\n        \"totalXp\": 6900,\n        \"recipes\": {\n          \"crafting\": [\"Deluxe Worm Bin\", \"Barbed Hook\", \"Dressed Spinner\"],\n          \"cooking\": [],\n          \"additional\": [\n            \"Barbed Hook & Dressed Spinner unlocked in Willy's Fish Shop\",\n            \"Casting distance increased by one tile\"\n          ]\n        }\n      },\n      {\n        \"level\": 9,\n        \"xpRequired\": 3100,\n        \"totalXp\": 10000,\n        \"recipes\": {\n          \"crafting\": [\"Magnet\"],\n          \"cooking\": [\"Seafoam Pudding\"],\n          \"additional\": [\"Magnet unlocked in Willy's Fish Shop\"]\n        }\n      },\n      {\n        \"level\": 10,\n        \"xpRequired\": 5000,\n        \"totalXp\": 15000,\n        \"recipes\": { \"crafting\": [], \"cooking\": [], \"additional\": [] }\n      }\n    ],\n    \"mastery\": {\n      \"unlocks\": [\n        {\n          \"name\": \"Advanced Iridium Rod\",\n          \"description\": \"Accepts up to two bobbers simultaneously\"\n        },\n        {\n          \"name\": \"Challenge Bait\",\n          \"description\": \"Recipe unlocked — perfect catch yields triple fish, but reduced catch per escape\"\n        },\n        {\n          \"name\": \"Golden Fishing Treasure Chest\",\n          \"description\": \"Superior fishing treasure chests added to the loot table\"\n        }\n      ]\n    }\n  },\n  {\n    \"id\": \"combat\",\n    \"name\": \"Combat\",\n    \"description\": \"Increased by fighting monsters. Some levels increase total HP.\",\n    \"toolBonus\": \"Some levels increase max HP\",\n    \"image\": \"images/skills/Combat.png\",\n    \"levels\": [\n      {\n        \"level\": 1,\n        \"xpRequired\": 100,\n        \"totalXp\": 100,\n        \"recipes\": { \"crafting\": [\"Sturdy Ring\", \"Bug Steak\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 2,\n        \"xpRequired\": 280,\n        \"totalXp\": 380,\n        \"recipes\": { \"crafting\": [\"Life Elixir\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 3,\n        \"xpRequired\": 390,\n        \"totalXp\": 770,\n        \"recipes\": { \"crafting\": [], \"cooking\": [\"Roots Platter\"], \"additional\": [] }\n      },\n      {\n        \"level\": 4,\n        \"xpRequired\": 530,\n        \"totalXp\": 1300,\n        \"recipes\": { \"crafting\": [\"Warrior Ring\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 5,\n        \"xpRequired\": 850,\n        \"totalXp\": 2150,\n        \"recipes\": { \"crafting\": [], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 6,\n        \"xpRequired\": 1150,\n        \"totalXp\": 3300,\n        \"recipes\": {\n          \"crafting\": [\"Slime Egg-Press\", \"Oil of Garlic\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 7,\n        \"xpRequired\": 1500,\n        \"totalXp\": 4800,\n        \"recipes\": { \"crafting\": [\"Ring of Yoba\", \"Thorns Ring\"], \"cooking\": [], \"additional\": [] }\n      },\n      {\n        \"level\": 8,\n        \"xpRequired\": 2100,\n        \"totalXp\": 6900,\n        \"recipes\": {\n          \"crafting\": [\"Slime Incubator\", \"Explosive Ammo\"],\n          \"cooking\": [],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 9,\n        \"xpRequired\": 3100,\n        \"totalXp\": 10000,\n        \"recipes\": {\n          \"crafting\": [\"Iridium Band\"],\n          \"cooking\": [\"Squid Ink Ravioli\"],\n          \"additional\": []\n        }\n      },\n      {\n        \"level\": 10,\n        \"xpRequired\": 5000,\n        \"totalXp\": 15000,\n        \"recipes\": { \"crafting\": [], \"cooking\": [], \"additional\": [] }\n      }\n    ],\n    \"mastery\": {\n      \"unlocks\": [\n        {\n          \"name\": \"Anvil\",\n          \"description\": \"Recipe unlocked — re-forge trinkets with randomized stats (costs 3 iridium bars)\"\n        },\n        {\n          \"name\": \"Mini-Forge\",\n          \"description\": \"Recipe unlocked — home furnace access without visiting the blacksmith\"\n        },\n        {\n          \"name\": \"Trinket Slot\",\n          \"description\": \"New equipment slot unlocked — trinkets grant special combat powers\"\n        }\n      ]\n    }\n  }\n]\n","[\n  {\n    \"id\": \"0\",\n    \"name\": \"Rancher\",\n    \"skill\": \"Farming\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"Animal products worth 20% more.\"\n  },\n  {\n    \"id\": \"1\",\n    \"name\": \"Tiller\",\n    \"skill\": \"Farming\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"Crops worth 10% more.\"\n  },\n  {\n    \"id\": \"2\",\n    \"name\": \"Coopmaster\",\n    \"skill\": \"Farming\",\n    \"level\": 10,\n    \"parentProfession\": \"0\",\n    \"description\": \"Befriend coop animals quicker. Incubation time cut in half.\"\n  },\n  {\n    \"id\": \"3\",\n    \"name\": \"Shepherd\",\n    \"skill\": \"Farming\",\n    \"level\": 10,\n    \"parentProfession\": \"0\",\n    \"description\": \"Befriend barn animals quicker. Sheep produce wool faster.\"\n  },\n  {\n    \"id\": \"4\",\n    \"name\": \"Artisan\",\n    \"skill\": \"Farming\",\n    \"level\": 10,\n    \"parentProfession\": \"1\",\n    \"description\": \"Artisan goods worth 40% more.\"\n  },\n  {\n    \"id\": \"5\",\n    \"name\": \"Agriculturist\",\n    \"skill\": \"Farming\",\n    \"level\": 10,\n    \"parentProfession\": \"1\",\n    \"description\": \"All crops grow 10% faster.\"\n  },\n  {\n    \"id\": \"6\",\n    \"name\": \"Fisher\",\n    \"skill\": \"Fishing\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"Fish worth 25% more.\"\n  },\n  {\n    \"id\": \"7\",\n    \"name\": \"Trapper\",\n    \"skill\": \"Fishing\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"Resources required to craft crab pots reduced.\"\n  },\n  {\n    \"id\": \"8\",\n    \"name\": \"Angler\",\n    \"skill\": \"Fishing\",\n    \"level\": 10,\n    \"parentProfession\": \"6\",\n    \"description\": \"Fish worth 50% more.\"\n  },\n  {\n    \"id\": \"9\",\n    \"name\": \"Pirate\",\n    \"skill\": \"Fishing\",\n    \"level\": 10,\n    \"parentProfession\": \"6\",\n    \"description\": \"Chance to find treasure doubled.\"\n  },\n  {\n    \"id\": \"10\",\n    \"name\": \"Mariner\",\n    \"skill\": \"Fishing\",\n    \"level\": 10,\n    \"parentProfession\": \"7\",\n    \"description\": \"Crab pots no longer produce junk items.\"\n  },\n  {\n    \"id\": \"11\",\n    \"name\": \"Luremaster\",\n    \"skill\": \"Fishing\",\n    \"level\": 10,\n    \"parentProfession\": \"7\",\n    \"description\": \"Crab pots no longer require bait.\"\n  },\n  {\n    \"id\": \"12\",\n    \"name\": \"Forester\",\n    \"skill\": \"Foraging\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"Gain 25% more wood when chopping.\"\n  },\n  {\n    \"id\": \"13\",\n    \"name\": \"Gatherer\",\n    \"skill\": \"Foraging\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"Chance for double harvest of foraged items.\"\n  },\n  {\n    \"id\": \"14\",\n    \"name\": \"Lumberjack\",\n    \"skill\": \"Foraging\",\n    \"level\": 10,\n    \"parentProfession\": \"12\",\n    \"description\": \"All trees have a chance to drop hardwood.\"\n  },\n  {\n    \"id\": \"15\",\n    \"name\": \"Tapper\",\n    \"skill\": \"Foraging\",\n    \"level\": 10,\n    \"parentProfession\": \"12\",\n    \"description\": \"Syrups worth 25% more.\"\n  },\n  {\n    \"id\": \"16\",\n    \"name\": \"Botanist\",\n    \"skill\": \"Foraging\",\n    \"level\": 10,\n    \"parentProfession\": \"13\",\n    \"description\": \"Foraged items are always highest quality.\"\n  },\n  {\n    \"id\": \"17\",\n    \"name\": \"Tracker\",\n    \"skill\": \"Foraging\",\n    \"level\": 10,\n    \"parentProfession\": \"13\",\n    \"description\": \"Location of forageable items revealed.\"\n  },\n  {\n    \"id\": \"18\",\n    \"name\": \"Miner\",\n    \"skill\": \"Mining\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"+1 ore per vein.\"\n  },\n  {\n    \"id\": \"19\",\n    \"name\": \"Geologist\",\n    \"skill\": \"Mining\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"Chance for gems to appear in pairs.\"\n  },\n  {\n    \"id\": \"20\",\n    \"name\": \"Blacksmith\",\n    \"skill\": \"Mining\",\n    \"level\": 10,\n    \"parentProfession\": \"18\",\n    \"description\": \"Metal bars worth 50% more.\"\n  },\n  {\n    \"id\": \"21\",\n    \"name\": \"Prospector\",\n    \"skill\": \"Mining\",\n    \"level\": 10,\n    \"parentProfession\": \"18\",\n    \"description\": \"Chance to find coal doubled.\"\n  },\n  {\n    \"id\": \"22\",\n    \"name\": \"Excavator\",\n    \"skill\": \"Mining\",\n    \"level\": 10,\n    \"parentProfession\": \"19\",\n    \"description\": \"Chance to find geodes doubled.\"\n  },\n  {\n    \"id\": \"23\",\n    \"name\": \"Gemologist\",\n    \"skill\": \"Mining\",\n    \"level\": 10,\n    \"parentProfession\": \"19\",\n    \"description\": \"Gems worth 30% more.\"\n  },\n  {\n    \"id\": \"24\",\n    \"name\": \"Fighter\",\n    \"skill\": \"Combat\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"All attacks deal 10% more damage. +15 HP.\"\n  },\n  {\n    \"id\": \"25\",\n    \"name\": \"Scout\",\n    \"skill\": \"Combat\",\n    \"level\": 5,\n    \"parentProfession\": null,\n    \"description\": \"Critical strike chance increased by 50%.\"\n  },\n  {\n    \"id\": \"26\",\n    \"name\": \"Brute\",\n    \"skill\": \"Combat\",\n    \"level\": 10,\n    \"parentProfession\": \"24\",\n    \"description\": \"Deal 15% more damage.\"\n  },\n  {\n    \"id\": \"27\",\n    \"name\": \"Defender\",\n    \"skill\": \"Combat\",\n    \"level\": 10,\n    \"parentProfession\": \"24\",\n    \"description\": \"+25 HP.\"\n  },\n  {\n    \"id\": \"28\",\n    \"name\": \"Acrobat\",\n    \"skill\": \"Combat\",\n    \"level\": 10,\n    \"parentProfession\": \"25\",\n    \"description\": \"Cooldown on special moves cut in half.\"\n  },\n  {\n    \"id\": \"29\",\n    \"name\": \"Desperado\",\n    \"skill\": \"Combat\",\n    \"level\": 10,\n    \"parentProfession\": \"25\",\n    \"description\": \"Critical strikes are deadlier.\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport professionData from '@/data/professions.json';\nimport { ProfessionData, ProfessionSkill } from '@/types';\n\nconst allProfessions: ProfessionData[] = professionData as ProfessionData[];\n\n/** Query builder for Profession data. All filter and sort methods return a new ProfessionQuery for chaining. */\nexport class ProfessionQuery extends QueryBase<ProfessionData> {\n  constructor(data: ProfessionData[] = allProfessions) {\n    super(data);\n  }\n\n  /** Filter by skill name. */\n  bySkill(skill: ProfessionSkill): ProfessionQuery {\n    return new ProfessionQuery(this.data.filter((p) => p.skill === skill));\n  }\n\n  /** Filter by level (5 or 10). */\n  byLevel(level: 5 | 10): ProfessionQuery {\n    return new ProfessionQuery(this.data.filter((p) => p.level === level));\n  }\n\n  /** Filter to professions that branch from a given parent profession ID. */\n  byParent(parentId: string): ProfessionQuery {\n    return new ProfessionQuery(this.data.filter((p) => p.parentProfession === parentId));\n  }\n\n  /** Sort alphabetically by name. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): ProfessionQuery {\n    const sorted = [...this.data].sort((a, b) => a.name.localeCompare(b.name));\n    return new ProfessionQuery(order === 'desc' ? sorted.reverse() : sorted);\n  }\n}\n\n/** Returns a ProfessionQuery for all Profession data. Pass `source` to wrap a pre-filtered array. */\nexport function professions(source: ProfessionData[] = allProfessions): ProfessionQuery {\n  return new ProfessionQuery(source);\n}\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/skills.json';\nimport { MasteryLevel, ProfessionData, ProfessionSkill, Skill, TitleThreshold } from '@/types';\nimport { professions } from '../professions';\n\nconst skillData: Skill[] = data as Skill[];\n\n// Title is calculated from (farming + fishing + foraging + combat + mining) / 2\n// Luck is unimplemented so max achievable score is 25 (5 skills × 10 / 2)\nexport const SKILL_TITLES: TitleThreshold[] = [\n  { minScore: 30, title: 'Farm King' },\n  { minScore: 29, title: 'Cropmaster' },\n  { minScore: 27, title: 'Agriculturist' },\n  { minScore: 25, title: 'Farmer' },\n  { minScore: 23, title: 'Rancher' },\n  { minScore: 21, title: 'Planter' },\n  { minScore: 19, title: 'Granger' },\n  { minScore: 17, title: 'Farmgirl / Farmboy' },\n  { minScore: 15, title: 'Sodbuster' },\n  { minScore: 13, title: 'Smallholder' },\n  { minScore: 11, title: 'Tiller' },\n  { minScore: 9, title: 'Farmhand' },\n  { minScore: 7, title: 'Cowpoke' },\n  { minScore: 5, title: 'Bumpkin' },\n  { minScore: 3, title: 'Greenhorn' },\n  { minScore: 0, title: 'Newcomer' },\n];\n\nexport const MASTERY_LEVELS: MasteryLevel[] = [\n  { level: 1, xpRequired: 10000, totalXp: 10000 },\n  { level: 2, xpRequired: 15000, totalXp: 25000 },\n  { level: 3, xpRequired: 20000, totalXp: 45000 },\n  { level: 4, xpRequired: 25000, totalXp: 70000 },\n  { level: 5, xpRequired: 30000, totalXp: 100000 },\n];\n\n/**\n * Calculate the player's title score.\n * Formula: floor((farming + fishing + foraging + mining + combat) / 2)\n */\nexport function getTitleScore(\n  farming: number,\n  fishing: number,\n  foraging: number,\n  mining: number,\n  combat: number,\n): number {\n  return Math.floor((farming + fishing + foraging + mining + combat) / 2);\n}\n\n/**\n * Get the player's title based on their combined skill levels.\n * Uses the same formula as the game: floor(sum of all skills / 2)\n */\nexport function getTitle(\n  farming: number,\n  fishing: number,\n  foraging: number,\n  mining: number,\n  combat: number,\n): string {\n  const score = getTitleScore(farming, fishing, foraging, mining, combat);\n  const match = SKILL_TITLES.find((t) => score >= t.minScore);\n  return match?.title ?? 'Newcomer';\n}\n\n/**\n * Get the current mastery level for a given total mastery XP amount.\n * Returns 0 if the player has not reached mastery level 1.\n */\nexport function getMasteryLevel(masteryXp: number): number {\n  let level = 0;\n  for (const ml of MASTERY_LEVELS) {\n    if (masteryXp >= ml.totalXp) level = ml.level;\n  }\n  return level;\n}\n\n/** Query builder for skill data. Terminal methods only — use utility functions for calculations. */\nexport class SkillQuery extends QueryBase<Skill> {\n  constructor(data: Skill[] = skillData) {\n    super(data);\n  }\n}\n\n/** Returns a SkillQuery for all skill data. Pass `source` to wrap a pre-filtered array. */\nexport function skills(source: Skill[] = skillData): SkillQuery {\n  return new SkillQuery(source);\n}\n\n/**\n * Get the level 10 profession options available for a given skill and level 5 profession choice.\n * Uses the professions module to look up data. Returns an empty array if not found.\n */\nexport function getProfessionOptions(\n  skillName: string,\n  level5Profession: string,\n): ProfessionData[] {\n  const skillProfs = professions().bySkill(skillName as ProfessionSkill);\n  const level5 = skillProfs\n    .byLevel(5)\n    .get()\n    .find((p) => p.name.toLowerCase() === level5Profession.toLowerCase());\n  if (!level5) return [];\n  return skillProfs.byParent(level5.id).get();\n}\n","[\n  {\n    \"id\": \"770\",\n    \"name\": \"Mixed Seeds\",\n    \"sellPrice\": 0,\n    \"description\": \"There's a little bit of everything here. Plant them and see what grows!\",\n    \"image\": \"images/mixed-seeds/mixed-seeds.png\",\n    \"buyPrices\": [{ \"place\": \"Krobus\", \"price\": 30 }],\n    \"produces\": {\n      \"spring\": [\"24\", \"190\", \"192\"],\n      \"summer\": [\"270\", \"260\", \"264\", \"262\"],\n      \"fall\": [\"274\", \"270\", \"272\", \"276\"],\n      \"winter\": [\"24\", \"190\", \"192\", \"270\", \"260\", \"264\", \"262\", \"274\", \"272\", \"276\"],\n      \"island\": [\"258\", \"254\", \"832\", \"252\"]\n    }\n  },\n  {\n    \"id\": \"MixedFlowerSeeds\",\n    \"name\": \"Mixed Flower Seeds\",\n    \"sellPrice\": 0,\n    \"description\": \"An assortment of flower seeds. Plant them and see what grows!\",\n    \"image\": \"images/mixed-seeds/mixed-flower-seeds.png\",\n    \"buyPrices\": [],\n    \"produces\": {\n      \"spring\": [\"591\", \"597\"],\n      \"summer\": [\"421\", \"593\", \"376\"],\n      \"fall\": [\"421\", \"595\"],\n      \"winter\": [\"591\", \"597\", \"421\", \"593\", \"376\", \"595\"],\n      \"island\": [\"421\", \"593\", \"376\"]\n    }\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/mixed-seeds.json';\nimport { MixedSeed, Season } from '@/types';\n\nconst mixedSeedData: MixedSeed[] = data as MixedSeed[];\n\n/** Query builder for mixed seed data. All filter methods return a new MixedSeedQuery for chaining. */\nexport class MixedSeedQuery extends QueryBase<MixedSeed> {\n  constructor(data: MixedSeed[] = mixedSeedData) {\n    super(data);\n  }\n\n  /** Filter to mixed seeds that can produce crops in the given season. */\n  byProduces(season: Season): MixedSeedQuery {\n    return new MixedSeedQuery(this.data.filter((s) => s.produces[season] !== undefined));\n  }\n\n  /** Filter to mixed seeds that have at least one purchase price listed. */\n  withBuyPrices(): MixedSeedQuery {\n    return new MixedSeedQuery(this.data.filter((s) => s.buyPrices.length > 0));\n  }\n}\n\n/** Returns a MixedSeedQuery for all mixed seed data. Pass `source` to wrap a pre-filtered array. */\nexport function mixedSeeds(source: MixedSeed[] = mixedSeedData): MixedSeedQuery {\n  return new MixedSeedQuery(source);\n}\n","[\n  {\n    \"id\": \"spring\",\n    \"name\": \"Spring\",\n    \"totalDays\": 28,\n    \"image\": \"images/seasons/Spring.png\",\n    \"festivals\": [\n      {\n        \"name\": \"Egg Festival\",\n        \"startDay\": 13,\n        \"endDay\": 13,\n        \"image\": \"images/seasons/festivals/Egg Festival.png\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Festival Flag.gif\"\n      },\n      {\n        \"name\": \"Desert Festival\",\n        \"startDay\": 15,\n        \"endDay\": 17,\n        \"image\": \"images/seasons/festivals/Desert Festival.png\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Special Event.png\"\n      },\n      {\n        \"name\": \"Flower Dance\",\n        \"startDay\": 24,\n        \"endDay\": 24,\n        \"image\": \"images/seasons/festivals/Flower Dance.jpg\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Festival Flag.gif\"\n      }\n    ],\n    \"bookseller\": [11, 12, 21, 22, 25]\n  },\n  {\n    \"id\": \"summer\",\n    \"name\": \"Summer\",\n    \"totalDays\": 28,\n    \"image\": \"images/seasons/Summer.png\",\n    \"festivals\": [\n      {\n        \"name\": \"Luau\",\n        \"startDay\": 11,\n        \"endDay\": 11,\n        \"image\": \"images/seasons/festivals/Luau.png\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Festival Flag.gif\"\n      },\n      {\n        \"name\": \"Trout Derby\",\n        \"startDay\": 20,\n        \"endDay\": 21,\n        \"image\": \"images/seasons/festivals/Trout Derby.png\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Fishing Event.png\"\n      },\n      {\n        \"name\": \"Dance of the Moonlight Jellies\",\n        \"startDay\": 28,\n        \"endDay\": 28,\n        \"image\": \"images/seasons/festivals/Dance of the Moonlight Jellies.jpg\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Festival Flag.gif\"\n      }\n    ],\n    \"bookseller\": [9, 12, 18, 25, 27]\n  },\n  {\n    \"id\": \"fall\",\n    \"name\": \"Fall\",\n    \"totalDays\": 28,\n    \"image\": \"images/seasons/Fall.png\",\n    \"festivals\": [\n      {\n        \"name\": \"Stardew Valley Fair\",\n        \"startDay\": 16,\n        \"endDay\": 16,\n        \"image\": \"images/seasons/festivals/Stardew Valley Fair.png\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Festival Flag.gif\"\n      },\n      {\n        \"name\": \"Spirit's Eve\",\n        \"startDay\": 27,\n        \"endDay\": 27,\n        \"image\": \"images/seasons/festivals/Spirit's Eve.png\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Festival Flag.gif\"\n      }\n    ],\n    \"bookseller\": [4, 7, 8, 9, 12, 19, 22, 25]\n  },\n  {\n    \"id\": \"winter\",\n    \"name\": \"Winter\",\n    \"totalDays\": 28,\n    \"image\": \"images/seasons/Winter.png\",\n    \"festivals\": [\n      {\n        \"name\": \"Festival of Ice\",\n        \"startDay\": 8,\n        \"endDay\": 8,\n        \"image\": \"images/seasons/festivals/Festival of Ice.jpg\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Festival Flag.gif\"\n      },\n      {\n        \"name\": \"SquidFest\",\n        \"startDay\": 12,\n        \"endDay\": 13,\n        \"image\": \"images/seasons/festivals/SquidFest.png\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Fishing Event.png\"\n      },\n      {\n        \"name\": \"Night Market\",\n        \"startDay\": 15,\n        \"endDay\": 17,\n        \"image\": \"images/seasons/festivals/Night Market.jpg\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Special Event.png\"\n      },\n      {\n        \"name\": \"Feast of the Winter Star\",\n        \"startDay\": 25,\n        \"endDay\": 25,\n        \"image\": \"images/seasons/festivals/Feast of the Winter Star.png\",\n        \"calendarIcon\": \"images/seasons/calendar-icons/Festival Flag.gif\"\n      }\n    ],\n    \"bookseller\": [5, 11, 12, 19, 22, 24]\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/seasons.json';\nimport { Festival, SeasonData } from '@/types';\n\nconst seasonData: SeasonData[] = data as SeasonData[];\n\n/** Query builder for season data. Filter methods return a new SeasonQuery for chaining. */\nexport class SeasonQuery extends QueryBase<SeasonData> {\n  constructor(data: SeasonData[] = seasonData) {\n    super(data);\n  }\n\n  /** Filter to seasons that have at least one festival. */\n  withFestivals(): SeasonQuery {\n    return new SeasonQuery(this.data.filter((s) => s.festivals.length > 0));\n  }\n}\n\n/**\n * Find a festival by name across all seasons (case-insensitive substring match).\n * Returns an array of matching festivals with their season.\n */\nexport function findFestival(name: string): { season: SeasonData; festival: Festival }[] {\n  const q = name.toLowerCase();\n  const results: { season: SeasonData; festival: Festival }[] = [];\n  for (const season of seasonData) {\n    for (const festival of season.festivals) {\n      if (festival.name.toLowerCase().includes(q)) {\n        results.push({ season, festival });\n      }\n    }\n  }\n  return results;\n}\n\n/** Returns a SeasonQuery for all season data. Pass `source` to wrap a pre-filtered array. */\nexport function seasons(source: SeasonData[] = seasonData): SeasonQuery {\n  return new SeasonQuery(source);\n}\n","{\n  \"loves\": [\n    \"Golden Pumpkin\",\n    \"Magic Rock Candy\",\n    \"Pearl\",\n    \"Prismatic Shard\",\n    \"Rabbit's Foot\",\n    \"Stardrop Tea\"\n  ],\n  \"likes\": [\n    \"All Artisan Goods (except Oil and Void Mayonnaise)\",\n    \"All Cooking (except Bread, Fried Egg, Seafoam Pudding, Strange Bun)\",\n    \"All Flowers (except Poppy)\",\n    \"All Foraged Minerals (except Quartz)\",\n    \"All Fruit Tree Fruits (except Banana & Mango)\",\n    \"All Gems (except Prismatic Shard)\",\n    \"All Vegetables (except Hops, Tea Leaves, Unmilled Rice, Wheat)\",\n    \"Life Elixir\",\n    \"Maple Syrup\",\n    \"Piña Colada\",\n    \"Rainbow Shell\",\n    \"Treasure Chest\"\n  ],\n  \"neutrals\": [\n    \"All Books (except Price Catalogue)\",\n    \"Bread\",\n    \"Coral\",\n    \"Duck Feather\",\n    \"Fried Egg\",\n    \"Hops\",\n    \"Mystic Syrup\",\n    \"Nautilus Shell\",\n    \"Roe\",\n    \"Squid Ink\",\n    \"Sweet Gem Berry\",\n    \"Tea Leaves\",\n    \"Truffle\",\n    \"Wheat\",\n    \"Wool\"\n  ],\n  \"dislikes\": [\n    \"All Artifacts\",\n    \"All Bombs\",\n    \"All Building Materials\",\n    \"All Crafted Floors & Paths\",\n    \"All Fences\",\n    \"All Fertilizer\",\n    \"All Fish (except Carp & Snail)\",\n    \"All Geode Minerals\",\n    \"All Geodes\",\n    \"All Seeds\",\n    \"All Sprinklers\",\n    \"All Tackle\",\n    \"All Trinkets\",\n    \"Cave Carrot\",\n    \"Driftwood\",\n    \"Field Snack\",\n    \"Fireworks\",\n    \"Jack-O-Lantern\",\n    \"Oak Resin\",\n    \"Oil\",\n    \"Pine Tar\",\n    \"Price Catalogue\",\n    \"Qi Fruit\",\n    \"Solar Essence\",\n    \"Spring Onion\",\n    \"Tea Set\",\n    \"Unmilled Rice\",\n    \"Vinegar\",\n    \"Void Egg\",\n    \"Void Essence\",\n    \"Wheat Flour\"\n  ],\n  \"hates\": [\n    \"All Bait\",\n    \"All Fossils\",\n    \"All Monster Loot\",\n    \"All Trash\",\n    \"Carp\",\n    \"Copper Ore\",\n    \"Dragon Tooth\",\n    \"Green Algae\",\n    \"Hay\",\n    \"Iron Ore\",\n    \"Monster Musk\",\n    \"Poppy\",\n    \"Radioactive Bar\",\n    \"Radioactive Ore\",\n    \"Red Mushroom\",\n    \"Sap\",\n    \"Sea Urchin\",\n    \"Seafoam Pudding\",\n    \"Seaweed\",\n    \"Snail\",\n    \"Strange Bun\",\n    \"Sugar\",\n    \"Void Mayonnaise\",\n    \"White Algae\"\n  ]\n}\n","import universalGiftsData from '@/data/universal-gifts.json';\nimport { UniversalGifts } from '@/types';\n\n/**\n * Returns the universal gift preferences shared across all villagers:\n * loved, liked, neutral, disliked, and hated item lists.\n */\nexport function universalGifts(): UniversalGifts {\n  return universalGiftsData as UniversalGifts;\n}\n","[\n  {\n    \"id\": \"9\",\n    \"name\": \"Introductions\",\n    \"text\": \"It would be a nice gesture to introduce yourself around town.\",\n    \"providedBy\": \"Introductory quest\",\n    \"requirements\": \"Greet 28 people\",\n    \"rewards\": \"100 Friendship points with every known NPC\"\n  },\n  {\n    \"id\": \"25\",\n    \"name\": \"How to Win Friends\",\n    \"text\": \"Giving gifts is a great way to build friendships.\",\n    \"providedBy\": \"Complete \\\"Introductions\\\"\",\n    \"requirements\": \"Give anyone a gift\",\n    \"rewards\": \"100g\"\n  },\n  {\n    \"id\": \"132\",\n    \"name\": \"Getting Started\",\n    \"text\": \"If you want to become a farmer, you have to start with the basics.\",\n    \"providedBy\": \"Package in room at start\",\n    \"requirements\": \"Cultivate and harvest a Parsnip\",\n    \"rewards\": \"100g\"\n  },\n  {\n    \"id\": \"132\",\n    \"name\": \"Getting Started (Animals)\",\n    \"text\": \"Feed your chickens each day by letting them eat grass outside.\",\n    \"providedBy\": \"Package in room at start (Meadowlands Farm)\",\n    \"requirements\": \"Harvest an egg from chickens\",\n    \"rewards\": \"None\"\n  },\n  {\n    \"id\": \"13\",\n    \"name\": \"To The Beach\",\n    \"text\": \"Someone named Willy invited you to visit the beach south of town.\",\n    \"providedBy\": \"Mail, Spring 2\",\n    \"requirements\": \"Visit the beach before 5:00pm\",\n    \"rewards\": \"Bamboo Pole\"\n  },\n  {\n    \"id\": \"7\",\n    \"name\": \"Raising Animals\",\n    \"text\": \"Robin, the local carpenter, lives north of town.\",\n    \"providedBy\": \"Complete \\\"Getting Started\\\"\",\n    \"requirements\": \"Build a Coop\",\n    \"rewards\": \"100g\"\n  },\n  {\n    \"id\": \"133\",\n    \"name\": \"Feeding Animals\",\n    \"text\": \"Robin, the local carpenter, lives north of town.\",\n    \"providedBy\": \"Complete \\\"Getting Started\\\" (Meadowlands Farm)\",\n    \"requirements\": \"Build a Silo\",\n    \"rewards\": \"100g\"\n  },\n  {\n    \"id\": \"8\",\n    \"name\": \"Advancement\",\n    \"text\": \"As you gain experience you'll discover new crafting recipes.\",\n    \"providedBy\": \"Complete \\\"Getting Started\\\"\",\n    \"requirements\": \"Reach Farming level 1 and craft a Scarecrow\",\n    \"rewards\": \"100g\"\n  },\n  {\n    \"id\": \"14\",\n    \"name\": \"Explore The Mine\",\n    \"text\": \"There's an old mine shaft in the mountains north of town.\",\n    \"providedBy\": \"Triggered by entering the mines\",\n    \"requirements\": \"Reach level 5 in the mines\",\n    \"rewards\": \"Unlocks \\\"Deeper In The Mine\\\"\"\n  },\n  {\n    \"id\": \"17\",\n    \"name\": \"Deeper In The Mine\",\n    \"text\": \"It seems that the mine elevator is still functional.\",\n    \"providedBy\": \"Complete \\\"Explore The Mine\\\"\",\n    \"requirements\": \"Reach level 40 in the mines\",\n    \"rewards\": \"Unlocks \\\"To The Bottom?\\\"\"\n  },\n  {\n    \"id\": \"18\",\n    \"name\": \"To The Bottom?\",\n    \"text\": \"So far, there's no sign of the bottom.\",\n    \"providedBy\": \"Complete \\\"Deeper In The Mine\\\"\",\n    \"requirements\": \"Reach the bottom of the mine (floor 120)\",\n    \"rewards\": \"Unlocks the Skull Key quest\"\n  },\n  {\n    \"id\": \"24\",\n    \"name\": \"Archaeology\",\n    \"text\": \"Gunther asked if you'd consider donating any new artifacts you find to the Museum.\",\n    \"providedBy\": \"Enter the Museum with a mineral or artifact\",\n    \"requirements\": \"Donate an item to the Museum\",\n    \"rewards\": \"250g\"\n  },\n  {\n    \"id\": \"26\",\n    \"name\": \"Rat Problem\",\n    \"text\": \"There's something odd going on in the Community Center.\",\n    \"providedBy\": \"Trigger initial Community Center cutscene\",\n    \"requirements\": \"Enter Community Center and examine the Golden Scroll\",\n    \"rewards\": \"Letter from the Wizard triggering \\\"Meet The Wizard\\\"\"\n  },\n  {\n    \"id\": \"1\",\n    \"name\": \"Meet The Wizard\",\n    \"text\": \"You received a letter from the local wizard.\",\n    \"providedBy\": \"Morning after examining first golden scroll\",\n    \"requirements\": \"Enter the wizard's tower\",\n    \"rewards\": \"Potion allowing you to read Junimo language\"\n  },\n  {\n    \"id\": \"11\",\n    \"name\": \"Forging Ahead\",\n    \"text\": \"If you're going to keep mining you should build a furnace.\",\n    \"providedBy\": \"Morning after collecting Copper Ore\",\n    \"requirements\": \"Craft a Furnace\",\n    \"rewards\": \"Unlocks \\\"Smelting\\\"\"\n  },\n  {\n    \"id\": \"12\",\n    \"name\": \"Smelting\",\n    \"text\": \"Now that you've built a furnace, you can smelt some metal.\",\n    \"providedBy\": \"Complete \\\"Forging Ahead\\\"\",\n    \"requirements\": \"Use furnace to smelt a Copper Bar\",\n    \"rewards\": \"None\"\n  },\n  {\n    \"id\": \"16\",\n    \"name\": \"Initiation\",\n    \"text\": \"If you can slay 10 slimes, you'll have earned your place in the Adventurer's Guild.\",\n    \"providedBy\": \"Mailbox, morning after reaching floor 5 in the Mines\",\n    \"requirements\": \"Slay 10 Slimes\",\n    \"rewards\": \"Access to Adventurer's Guild\"\n  },\n  {\n    \"id\": \"100\",\n    \"name\": \"Robin's Lost Axe\",\n    \"text\": \"Robin lost her favorite axe.\",\n    \"providedBy\": \"Mail, Spring 11\",\n    \"requirements\": \"Find Robin's axe in Cindersap Forest\",\n    \"rewards\": \"250g, 1 Friendship heart with Robin\"\n  },\n  {\n    \"id\": \"101\",\n    \"name\": \"Jodi's Request\",\n    \"text\": \"Jodi needs a fresh cauliflower for a recipe she's making.\",\n    \"providedBy\": \"Mail, Spring 19\",\n    \"requirements\": \"Bring Jodi a Cauliflower\",\n    \"rewards\": \"350g, 1 Friendship heart with Jodi\"\n  },\n  {\n    \"id\": \"102\",\n    \"name\": \"Mayor's \\\"Shorts\\\"\",\n    \"text\": \"Mayor Lewis has lost his purple shorts.\",\n    \"providedBy\": \"Mail, Summer 3\",\n    \"requirements\": \"Find and return Mayor Lewis' purple shorts\",\n    \"rewards\": \"750g, 1 Friendship heart with Mayor Lewis\"\n  },\n  {\n    \"id\": \"107\",\n    \"name\": \"Blackberry Basket\",\n    \"text\": \"It's blackberry season, but Linus can't find his basket!\",\n    \"providedBy\": \"Mail, Fall 8\",\n    \"requirements\": \"Find Linus' basket in the Backwoods\",\n    \"rewards\": \"1 Friendship heart with Linus\"\n  },\n  {\n    \"id\": \"21\",\n    \"name\": \"Marnie's Request\",\n    \"text\": \"Marnie came by the farm and asked if you'd bring her a cave carrot.\",\n    \"providedBy\": \"She visits farm after 3 Friendship hearts\",\n    \"requirements\": \"Bring a Cave Carrot into Marnie's shop\",\n    \"rewards\": \"100 Friendship points with Marnie\"\n  },\n  {\n    \"id\": \"103\",\n    \"name\": \"Pam Is Thirsty\",\n    \"text\": \"Pam is hankerin' for a pale ale.\",\n    \"providedBy\": \"Mail, Summer 14\",\n    \"requirements\": \"Bring Pam a Pale Ale\",\n    \"rewards\": \"350g, 1 Friendship heart with Pam\"\n  },\n  {\n    \"id\": \"111\",\n    \"name\": \"A Dark Reagent\",\n    \"text\": \"The wizard wants you to descend into the mines and fetch him a Void Essence.\",\n    \"providedBy\": \"Mail, Winter 12\",\n    \"requirements\": \"Bring the Wizard a Void Essence\",\n    \"rewards\": \"1,000g, 1 Friendship heart with the Wizard\"\n  },\n  {\n    \"id\": \"106\",\n    \"name\": \"Cow's Delight\",\n    \"text\": \"Marnie wants to give her cows a special treat.\",\n    \"providedBy\": \"Mail, Fall 3\",\n    \"requirements\": \"Bring Marnie one bunch of Amaranth\",\n    \"rewards\": \"500g, 1 Friendship heart with Marnie\"\n  },\n  {\n    \"id\": \"19\",\n    \"name\": \"The Skull Key\",\n    \"text\": \"You found a strange looking key in the bottom of the mines.\",\n    \"providedBy\": \"Reach the bottom floor of the Mines\",\n    \"requirements\": \"Discover the purpose of the Skull Key\",\n    \"rewards\": \"Access to Skull Cavern\"\n  },\n  {\n    \"id\": \"104\",\n    \"name\": \"Crop Research\",\n    \"text\": \"Demetrius needs a fresh melon for his research.\",\n    \"providedBy\": \"Mail, Summer 20\",\n    \"requirements\": \"Bring Demetrius a Melon\",\n    \"rewards\": \"550g, 1 Friendship heart with Demetrius\"\n  },\n  {\n    \"id\": \"105\",\n    \"name\": \"Knee Therapy\",\n    \"text\": \"George needs a hot pepper to soothe his aching knee.\",\n    \"providedBy\": \"Mail, Summer 25\",\n    \"requirements\": \"Bring George a Hot Pepper\",\n    \"rewards\": \"200g, 1 Friendship heart with George\"\n  },\n  {\n    \"id\": \"113\",\n    \"name\": \"Robin's Request\",\n    \"text\": \"Robin needs 10 pieces of Hardwood.\",\n    \"providedBy\": \"Mail, Winter 21\",\n    \"requirements\": \"Bring Robin 10 Hardwood\",\n    \"rewards\": \"500g, 1 Friendship heart with Robin\"\n  },\n  {\n    \"id\": \"20\",\n    \"name\": \"Qi's Challenge\",\n    \"text\": \"You've been challenged to reach level 25 in the Skull Cavern.\",\n    \"providedBy\": \"Mail, day after entering Skull Cavern\",\n    \"requirements\": \"Reach level 25 in the Skull Cavern\",\n    \"rewards\": \"10,000g (by mail next day)\"\n  },\n  {\n    \"id\": \"2\",\n    \"name\": \"The Mysterious Qi (Part 1)\",\n    \"text\": \"Within a secret lock-box, you found a note with peculiar instructions.\",\n    \"providedBy\": \"Put Battery Pack in lock-box by bus stop\",\n    \"requirements\": \"Leave a Rainbow Shell in the box at the train platform\",\n    \"rewards\": \"Continues to Part 2\"\n  },\n  {\n    \"id\": \"3\",\n    \"name\": \"The Mysterious Qi (Part 2)\",\n    \"text\": \"You found another note with a strange request.\",\n    \"providedBy\": \"Complete \\\"The Mysterious Qi (Part 1)\\\"\",\n    \"requirements\": \"Place 10 Beets in Mayor Lewis' fridge\",\n    \"rewards\": \"Continues to Part 3\"\n  },\n  {\n    \"id\": \"4\",\n    \"name\": \"The Mysterious Qi (Part 3)\",\n    \"text\": \"Another cryptic note has appeared.\",\n    \"providedBy\": \"Complete \\\"The Mysterious Qi (Part 2)\\\"\",\n    \"requirements\": \"Put Solar Essence in the sand dragon's mouth on the beach\",\n    \"rewards\": \"Continues to Part 4\"\n  },\n  {\n    \"id\": \"5\",\n    \"name\": \"The Mysterious Qi (Part 4)\",\n    \"text\": \"You found another note in the sand dragon's eye.\",\n    \"providedBy\": \"Complete \\\"The Mysterious Qi (Part 3)\\\"\",\n    \"requirements\": \"Inspect the lumber pile beside the Farmhouse\",\n    \"rewards\": \"Club Card (Casino access)\"\n  },\n  {\n    \"id\": \"108\",\n    \"name\": \"Carving Pumpkins\",\n    \"text\": \"Caroline wants to carve a pumpkin with her daughter.\",\n    \"providedBy\": \"Mail, Fall 19\",\n    \"requirements\": \"Bring Caroline a Pumpkin\",\n    \"rewards\": \"500g, 1 Friendship heart with Caroline\"\n  },\n  {\n    \"id\": \"31\",\n    \"name\": \"A Winter Mystery\",\n    \"text\": \"You encountered a suspicious looking figure by the bus stop.\",\n    \"providedBy\": \"Enter Bus Stop during Winter between 6am and 4pm\",\n    \"requirements\": \"Interact with the bush to the right of the playground\",\n    \"rewards\": \"Magnifying Glass\"\n  },\n  {\n    \"id\": \"29\",\n    \"name\": \"Strange Note\",\n    \"text\": \"You found a note, barely legible, asking you to bring may-pal serrup to the woods.\",\n    \"providedBy\": \"After reading Secret Note #23\",\n    \"requirements\": \"Enter Secret Woods between 6am and 7pm with Maple Syrup\",\n    \"rewards\": \"Bear's Knowledge\"\n  },\n  {\n    \"id\": \"30\",\n    \"name\": \"Cryptic Note\",\n    \"text\": \"You found a note that reads, someone is waiting for you on level 100 of the Skull Cavern.\",\n    \"providedBy\": \"After reading Secret Note #10\",\n    \"requirements\": \"Reach level 100 in the Skull Cavern\",\n    \"rewards\": \"Iridium Snake Milk (+25 max health)\"\n  },\n  {\n    \"id\": \"115\",\n    \"name\": \"Fresh Fruit\",\n    \"text\": \"Emily wants a taste of spring. She's asking for a fresh apricot.\",\n    \"providedBy\": \"Mail, Spring 6, Year 2\",\n    \"requirements\": \"Bring Emily an Apricot\",\n    \"rewards\": \"600g, 1 Friendship heart with Emily\"\n  },\n  {\n    \"id\": \"118\",\n    \"name\": \"Aquatic Research\",\n    \"text\": \"Demetrius is studying the toxin levels of the local pufferfish.\",\n    \"providedBy\": \"Mail, Summer 6, Year 2\",\n    \"requirements\": \"Bring Demetrius a Pufferfish\",\n    \"rewards\": \"1,000g, 1 Friendship heart with Demetrius\"\n  },\n  {\n    \"id\": \"119\",\n    \"name\": \"A Soldier's Star\",\n    \"text\": \"Kent wants to give his wife a starfruit for their anniversary.\",\n    \"providedBy\": \"Mail, Summer 15, Year 2\",\n    \"requirements\": \"Bring Kent a Starfruit\",\n    \"rewards\": \"500g, 1 Friendship heart with Kent\"\n  },\n  {\n    \"id\": \"120\",\n    \"name\": \"Mayor's Need\",\n    \"text\": \"Mayor Lewis wants truffle oil.\",\n    \"providedBy\": \"Mail, Summer 21, Year 2\",\n    \"requirements\": \"Bring Lewis a bottle of Truffle Oil\",\n    \"rewards\": \"750g, 1 Friendship heart with Mayor Lewis\"\n  },\n  {\n    \"id\": \"121\",\n    \"name\": \"Wanted: Lobster\",\n    \"text\": \"Gus put out a notice requesting a fresh lobster.\",\n    \"providedBy\": \"Mail, Fall 6, Year 2\",\n    \"requirements\": \"Bring Gus a Lobster\",\n    \"rewards\": \"500g, 1 Friendship heart with Gus\"\n  },\n  {\n    \"id\": \"122\",\n    \"name\": \"Pam Needs Juice\",\n    \"text\": \"Pam's TV remote is dead.\",\n    \"providedBy\": \"Mail, Fall 19, Year 2\",\n    \"requirements\": \"Bring Pam a Battery Pack\",\n    \"rewards\": \"400g, 1 Friendship heart with Pam\"\n  },\n  {\n    \"id\": \"22\",\n    \"name\": \"Fish Casserole\",\n    \"text\": \"Jodi swung by the farm to ask you to dinner at 7:00 PM.\",\n    \"providedBy\": \"Jodi at 4 Hearts; exit Farmhouse Monday 6am–9:30am\",\n    \"requirements\": \"Enter Jodi's house with a Largemouth Bass at 7pm\",\n    \"rewards\": \"Event scene\"\n  },\n  {\n    \"id\": \"109\",\n    \"name\": \"Catch a Squid\",\n    \"text\": \"Willy is challenging you to catch a squid.\",\n    \"providedBy\": \"Mail, Winter 2\",\n    \"requirements\": \"Bring Willy a Squid\",\n    \"rewards\": \"800g, 1 Friendship heart with Willy\"\n  },\n  {\n    \"id\": \"114\",\n    \"name\": \"Fish Stew\",\n    \"text\": \"Gus wants to make fish stew, but he needs an albacore.\",\n    \"providedBy\": \"Mail, Winter 26\",\n    \"requirements\": \"Bring Gus an Albacore\",\n    \"rewards\": \"400g, 1 Friendship heart with Gus\"\n  },\n  {\n    \"id\": \"117\",\n    \"name\": \"Pierre's Notice\",\n    \"text\": \"Pierre will pay top coin to whoever brings him a plate of sashimi.\",\n    \"providedBy\": \"Mail, Spring 21, Year 2\",\n    \"requirements\": \"Bring Pierre some Sashimi\",\n    \"rewards\": \"1,000g, 1 Friendship heart with Pierre\"\n  },\n  {\n    \"id\": \"110\",\n    \"name\": \"Clint's Attempt\",\n    \"text\": \"Clint wants you to give Emily an amethyst.\",\n    \"providedBy\": \"Mail, Winter 6\",\n    \"requirements\": \"Bring Emily an Amethyst\",\n    \"rewards\": \"1 Friendship heart with Emily\"\n  },\n  {\n    \"id\": \"112\",\n    \"name\": \"A Favor For Clint\",\n    \"text\": \"Clint got a new hammer and he wants to test it out.\",\n    \"providedBy\": \"Mail, Winter 17\",\n    \"requirements\": \"Bring Clint an Iron Bar\",\n    \"rewards\": \"500g, 1 Friendship heart with Clint\"\n  },\n  {\n    \"id\": \"123\",\n    \"name\": \"Staff of Power\",\n    \"text\": \"The Wizard is creating a staff of phenomenal power.\",\n    \"providedBy\": \"Mail, Winter 5, Year 2\",\n    \"requirements\": \"Bring the Wizard an Iridium Bar\",\n    \"rewards\": \"5,000g, 1 Friendship heart with the Wizard\"\n  },\n  {\n    \"id\": \"116\",\n    \"name\": \"Granny's Gift\",\n    \"text\": \"Evelyn wants to surprise her husband with a gift.\",\n    \"providedBy\": \"Mail, Spring 15, Year 2\",\n    \"requirements\": \"Bring Evelyn a Leek\",\n    \"rewards\": \"500g, 1 Friendship heart with Evelyn\"\n  },\n  {\n    \"id\": \"125\",\n    \"name\": \"Exotic Spirits\",\n    \"text\": \"Gus wants to make a Coco-no-no, but he's missing the main ingredient.\",\n    \"providedBy\": \"Mail, Winter 19, Year 2\",\n    \"requirements\": \"Bring Gus a Coconut\",\n    \"rewards\": \"600g, 1 Friendship heart with Gus\"\n  },\n  {\n    \"id\": \"124\",\n    \"name\": \"Catch a Lingcod\",\n    \"text\": \"Willy is challenging you to catch a Lingcod.\",\n    \"providedBy\": \"Mail, Winter 13, Year 2\",\n    \"requirements\": \"Bring Willy a Lingcod\",\n    \"rewards\": \"550g, 1 Friendship heart with Willy\"\n  },\n  {\n    \"id\": \"28\",\n    \"name\": \"Dark Talisman\",\n    \"text\": \"The Wizard asked me to retrieve the magic ink from his ex-wife's house.\",\n    \"providedBy\": \"Railroad cutscene after completing Community Center or Joja Warehouse\",\n    \"requirements\": \"Speak to Krobus and retrieve dark talisman from Mutant Bug Lair\",\n    \"rewards\": \"Access to Witch's Swamp\"\n  },\n  {\n    \"id\": \"27\",\n    \"name\": \"Goblin Problem\",\n    \"text\": \"There's a goblin blocking the path to the Witch's Hut.\",\n    \"providedBy\": \"Through cave by Railroad after Dark Talisman quest\",\n    \"requirements\": \"Give Henchman Void Mayonnaise and retrieve Magic Ink from Witch's Hut\",\n    \"rewards\": \"Wizard buildings unlocked; dark shrines accessible\"\n  },\n  {\n    \"id\": \"130\",\n    \"name\": \"The Pirate's Wife\",\n    \"text\": \"An old lady living on Ginger Island is asking you to find a keepsake belonging to her late husband.\",\n    \"providedBy\": \"Speak to Birdie on Ginger Island\",\n    \"requirements\": \"Distribute 7 keepsake items to various villagers\",\n    \"rewards\": \"Fairy Dust recipe, 5 Golden Walnuts\"\n  },\n  {\n    \"id\": \"134\",\n    \"name\": \"The Giant Stump\",\n    \"text\": \"The big tree to the south of my farm blew down.\",\n    \"providedBy\": \"Giant Stump in Cindersap Forest after wind storm cutscene\",\n    \"requirements\": \"Fix giant stump with 100 Hardwood\",\n    \"rewards\": \"Access to Raccoon quests\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport questData from '@/data/quests.json';\nimport { Quest } from '@/types';\n\nconst questsData: Quest[] = questData as Quest[];\n\n/** Query builder for quest data. All filter and sort methods return a new QuestQuery for chaining. */\nexport class QuestQuery extends QueryBase<Quest> {\n  constructor(data: Quest[] = questsData) {\n    super(data);\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): QuestQuery {\n    return new QuestQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n}\n\n/** Returns a QuestQuery for all quest data. Pass `source` to wrap a pre-filtered array. */\nexport function quests(source: Quest[] = questsData): QuestQuery {\n  return new QuestQuery(source);\n}\n","[\n  {\n    \"id\": \"abigail\",\n    \"name\": \"Abigail\",\n    \"birthday\": {\n      \"day\": 13,\n      \"season\": \"fall\"\n    },\n    \"address\": \"Pierre's General Store\",\n    \"occupation\": \"Adventurer\",\n    \"description\": \"Abigail is a villager who lives at Pierre's General Store in Pelican Town. She is one of the twelve characters available to marry.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 1,\n        \"description\": \"The player helps Abigail play Journey of the Prairie King together on her console.\",\n        \"details\": \"Enter Pierre's General Store when Abigail is there, any day except Saturday. You enter Abigail's room and watch her get angry about a videogame. She asks for your help, and you play the console version of Journey of the Prairie King together. When you finish the level, she thanks you and the cutscene ends. If you fail, she will still thank you for trying.\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 2,\n        \"description\": \"Abigail plays her flute on a rainy day and invites the player to stand under a tree, where they perform a duet.\",\n        \"details\": \"Visit the mountain between noon and 7pm on a rainy day, any season except Winter. You see Abigail playing her flute. She asks what you're doing out in the rain. Regardless of your response, she invites you to stand under the tree with her. You pull out a lyre and play a duet as the camera pans out over the lake.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 4,\n        \"description\": \"The player encounters Abigail practicing swordplay in the graveyard at night.\",\n        \"details\": \"Between 9pm and midnight on a day when it is not raining, enter Pelican Town from any direction. Abigail is in the graveyard practicing with her sword because she wants to go on adventures. Pierre arrives and interrupts, telling her to help cook dinner. She gets angry about gender expectations, walks off calling you to follow. You both hide in bushes and talk. She asks you to help untangle her hair from a bush before the cutscene ends.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 3,\n        \"description\": \"Abigail invites the player to her room where she shows them her spirit board, revealing developing romantic feelings.\",\n        \"details\": \"After receiving a letter from Abigail, enter Pierre's General Store between 8pm and 10pm when she's there. Abigail invites you to her room via letter. She shows you her spirit board, which reveals a message indicating she's developing feelings for you. She gets embarrassed and rushes you out. The next day she visits and apologizes.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 901756,\n        \"description\": \"Abigail becomes frightened by bats in the mines and confesses she likes the player as more than a friend.\",\n        \"details\": \"Enter the mines or Quarry Mine between 5pm and midnight. Abigail is preparing to enter the mine when a bat startles her. Hundreds more bats fly up; she's terrified and cowers. You comfort her. She then confesses she likes you as more than a friend and asks you to stay with her, hugging you.\"\n      },\n      {\n        \"heart\": 14,\n        \"id\": 6963327,\n        \"description\": \"A monster attacks the player in the Backwoods and Abigail saves them.\",\n        \"details\": \"Enter the Backwoods between 6:10am and 5pm. While foraging, a monster attacks you and you collapse. Abigail appears, kills the monster, and asks if you're okay, saying \\\"I've never taken a life before.\\\" She warns you to be more careful and buries the monster, marking the grave with Yoba's symbol.\"\n      }\n    ],\n    \"image\": \"images/villagers/Abigail.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Abigail.png\",\n    \"loves\": [\n      \"Amethyst\",\n      \"Banana Pudding\",\n      \"Blackberry Cobbler\",\n      \"Chocolate Cake\",\n      \"Monster Compendium\",\n      \"Pufferfish\",\n      \"Pumpkin\",\n      \"Spicy Eel\"\n    ],\n    \"likes\": [\"Ancient Sword\", \"Basilisk Paw\", \"Bone Flute\", \"Combat Quarterly\", \"Quartz\"],\n    \"neutrals\": [\n      \"All Milk\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\n      \"All Eggs\",\n      \"All Fruits (except Fruit Tree Fruit)\",\n      \"All Vegetables (except Hops, Pumpkin, Tea Leaves, Wheat)\",\n      \"Sugar\",\n      \"Wild Horseradish\"\n    ],\n    \"hates\": [\"Clay\", \"Holly\"]\n  },\n  {\n    \"id\": \"alex\",\n    \"name\": \"Alex\",\n    \"birthday\": {\n      \"day\": 13,\n      \"season\": \"summer\"\n    },\n    \"address\": \"1 River Road\",\n    \"occupation\": \"Aspiring gridball player\",\n    \"description\": \"Alex is a villager who lives in the house southeast of Pierre's General Store. He is one of the twelve characters available to marry.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 20,\n        \"description\": \"Alex attempts to toss his gridball to the player at the beach and discusses his aspirations.\",\n        \"details\": \"Visit the Beach on a sunny Summer day when Alex is there. Alex greets you with his gridball and tries to toss it to you. After you fail to catch it, he laughs and discusses his professional gridball aspirations. You choose between encouraging him or calling him arrogant.\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 2481135,\n        \"description\": \"Alex reveals that his father was abusive and his mother passed away.\",\n        \"details\": \"Enter town between 9am and 4pm. Alex talks to his dog Dusty near the dog pen, expressing feeling misunderstood. He reveals his father was an alcoholic who verbally abused him and called him worthless. His father left, then his mother became ill and died. Alex declines sympathy and offers to show you what Dusty will do for barbecued steak.\"\n      },\n      {\n        \"heart\": 5,\n        \"id\": 21,\n        \"description\": \"Alex expresses worry about his future while staring at his bookcase.\",\n        \"details\": \"Enter Alex's house when he's there. Alex laments not reading books from his shelf, worrying he won't succeed without knowledge and feels worthless. You can respond with dialogue options affecting friendship or suggesting dinner discussions about philosophy.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 2119820,\n        \"description\": \"Alex apologizes for his previous rudeness and thanks the player for their support.\",\n        \"details\": \"Enter Alex's house when he's there. Alex expresses doubt about going professional. He apologizes for previous arrogance and thanks you for supporting him. You provide encouragement, and he returns to his workout with renewed vigor.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 288847,\n        \"description\": \"On the anniversary of his mother's death, Alex sits on the beach and shares her music box with the player.\",\n        \"details\": \"Visit the Beach on a sunny day when Alex is there. Alex sits crying on the beach — the anniversary of his mother's death 12 years ago. He regrets not thanking her for childhood care. He plays his mother's music box, revealing a vision of her with baby Alex. He asks you not to tell others he cried.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 911526,\n        \"description\": \"Alex invites the player to a private dinner at the Saloon where he confesses his romantic feelings.\",\n        \"details\": \"Alex sends a letter requesting you meet him at the Saloon after dark. Enter between 7pm-10pm. Alex reserves a private room. Gus plays violin; Emily serves food. Alex confesses romantic feelings — that he's had a crush since meeting. You can accept or decline these feelings.\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 3917587,\n        \"description\": \"Alex requests 5,000g from the player for a secret project.\",\n        \"details\": \"Exit the Farmhouse in Year 2+ between 6am-8:20am on non-Sunday days with 5,000g available. Alex requests 5,000g for a secret project ready Sunday.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 3917589,\n        \"description\": \"Alex's secret project is revealed to be a gridball-themed room at the Saloon.\",\n        \"details\": \"Enter the Saloon on Sunday. Alex, Kent, Shane, George, and Gus watch gridball on a TV in a decorated backroom. Alex explains this small way of realizing his gridball dream.\"\n      },\n      {\n        \"heart\": 14.3,\n        \"id\": 3917590,\n        \"description\": \"Alex shows the player the completed gridball room.\",\n        \"details\": \"Alex thanks the player for funding the room and celebrates the completed gridball viewing setup at the Saloon.\"\n      }\n    ],\n    \"image\": \"images/villagers/Alex.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Alex.png\",\n    \"loves\": [\"Complete Breakfast\", \"Jack Be Nimble Jack Be Thick\", \"Salmon Dinner\"],\n    \"likes\": [\"Dinosaur Egg\", \"Field Snack\", \"Parrot Egg\"],\n    \"neutrals\": [\n      \"All Fruits (except Fruit Tree Fruit & Salmonberry)\",\n      \"All Milk\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Frog Egg\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\n      \"All Books (except Jack Be Nimble, Jack Be Thick)\",\n      \"Salmonberry\",\n      \"Void Egg\",\n      \"Wild Horseradish\"\n    ],\n    \"hates\": [\"Holly\", \"Quartz\"]\n  },\n  {\n    \"id\": \"caroline\",\n    \"name\": \"Caroline\",\n    \"birthday\": {\n      \"day\": 7,\n      \"season\": \"winter\"\n    },\n    \"address\": \"Pierre's General Store\",\n    \"occupation\": \"Homemaker\",\n    \"description\": \"Caroline is a villager who lives in Pelican Town. She is married to Pierre and is the mother of Abigail.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 719926,\n        \"description\": \"Caroline shows the player her private sunroom and offers green tea.\",\n        \"details\": \"Enter the sunroom via Caroline's kitchen between 9am-5pm on a non-rainy day. Caroline shows you her private sunroom sanctuary. She offers homemade Green Tea, then a surrealistic cutscene plays. She invites you back anytime. The next day, she mails you a Tea Sapling recipe.\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Caroline sends a Parsnip Soup recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Caroline mails you the Parsnip Soup recipe with a note: \\\"Nothing is more satisfying than cooking with fresh vegetables from your own garden!\\\"\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 17,\n        \"description\": \"The player overhears Caroline and Abigail arguing about personal freedom and appreciation.\",\n        \"details\": \"Enter Pierre's General Store when Caroline and Abigail are present. You overhear them arguing about Abigail's independence and appearance. Abigail confronts you afterward, swearing the house is haunted. The conflict ends with Caroline apologizing.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Caroline sends a Vegetable Medley recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Caroline mails you a recipe labeled Vegetable Stew (which creates Vegetable Medley when cooked) with a similar note praising homegrown vegetables.\"\n      }\n    ],\n    \"image\": \"images/villagers/Caroline.png\",\n    \"loves\": [\"Fish Taco\", \"Green Tea\", \"Summer Spangle\", \"Tropical Curry\"],\n    \"likes\": [\"Daffodil\", \"Tea Leaves\", \"Wild Horseradish\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fruit (except Fruit Tree Fruit & Salmonberry)\",\n      \"All Milk\"\n    ],\n    \"dislikes\": [\n      \"Amaranth\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Dandelion\",\n      \"Duck Mayonnaise\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Mayonnaise\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\"Quartz\", \"Salmonberry\"]\n  },\n  {\n    \"id\": \"clint\",\n    \"name\": \"Clint\",\n    \"birthday\": {\n      \"day\": 26,\n      \"season\": \"winter\"\n    },\n    \"address\": \"The Blacksmith\",\n    \"occupation\": \"Blacksmith\",\n    \"description\": \"Clint is a villager who lives in Pelican Town and owns and runs the local Blacksmith.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": 97,\n        \"description\": \"Clint asks for romantic advice at the saloon, then nervously fails to ask Emily out.\",\n        \"details\": \"Visit the saloon between 7pm-11pm on Monday. Clint asks for dating advice. Emily arrives to take his order; Clint panics and stammers. When attempting to speak with her, he loses his nerve and gives up. Emily chats easily with Shane instead, leaving Clint dejected.\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Clint sends an Algae Soup recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Clint mails you the Algae Soup recipe with a note: \\\"Well, I know a couple of recipes. I thought I'd send you one... maybe it'll help you mine more ore or something. Take care. -Clint\\\"\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 101,\n        \"description\": \"Clint finally asks Emily on a date to the carnival.\",\n        \"details\": \"Enter town from Cindersap Forest between 9am-6:30pm after the Three Hearts event. You discover Clint watching Emily from bushes, planning to ask her out. With your encouragement, he approaches Emily and invites her to the Grampleton Carnival with tickets. She accepts. Clint thanks you, nervous but grateful.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Clint sends a Bean Hotpot recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Clint mails you the Bean Hotpot recipe with a note: \\\"Well, I know a couple of recipes. I thought I'd send you one... maybe it'll help you mine more ore or something. Take care. -Clint\\\"\"\n      }\n    ],\n    \"image\": \"images/villagers/Clint.png\",\n    \"loves\": [\n      \"Amethyst\",\n      \"Aquamarine\",\n      \"Artichoke Dip\",\n      \"Emerald\",\n      \"Fiddlehead Risotto\",\n      \"Gold Bar\",\n      \"Iridium Bar\",\n      \"Jade\",\n      \"Omni Geode\",\n      \"Ruby\",\n      \"Topaz\"\n    ],\n    \"likes\": [\"Copper Bar\", \"Iron Bar\", \"Mining Monthly\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fruit (except Fruit Tree Fruit & Salmonberry)\",\n      \"All Milk\",\n      \"Chanterelle\",\n      \"Coal\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Gold Ore\",\n      \"Hazelnut\",\n      \"Iridium Ore\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Refined Quartz\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"All Flowers (except Poppy)\", \"Quartz\", \"Salmonberry\", \"Wild Horseradish\"],\n    \"hates\": [\"Holly\"]\n  },\n  {\n    \"id\": \"demetrius\",\n    \"name\": \"Demetrius\",\n    \"birthday\": {\n      \"day\": 19,\n      \"season\": \"summer\"\n    },\n    \"address\": \"24 Mountain Road\",\n    \"occupation\": \"Scientist\",\n    \"description\": \"Demetrius is a villager who resides at 24 Mountain Road with his wife Robin, daughter Maru, and step-son Sebastian.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Demetrius sends a Fried Mushroom recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Demetrius mails you the Fried Mushroom recipe with a note: \\\"I wanted to say 'thanks' for taking an interest in my work. Here's a cooking recipe that I like. -Demetrius\\\"\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 25,\n        \"description\": \"The player witnesses Demetrius and Robin arguing about whether tomatoes are fruits or vegetables.\",\n        \"details\": \"Enter Demetrius' house while he and Robin are inside. Robin asked him to retrieve fruit, but he brought tomatoes instead. Robin protests that tomatoes aren't real fruit. Demetrius defends himself, arguing tomatoes are botanically fruits. He asks the player to settle the debate. Choosing \\\"Vegetable\\\" results in -30 friendship, choosing \\\"Fruit\\\" results in +50 friendship.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Demetrius sends an Autumn's Bounty recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Demetrius mails you the Autumn's Bounty recipe with a similar note thanking you for your interest in his work.\"\n      }\n    ],\n    \"image\": \"images/villagers/Demetrius.png\",\n    \"loves\": [\"Bean Hotpot\", \"Ice Cream\", \"Rice Pudding\", \"Strawberry\"],\n    \"likes\": [\"Dinosaur Egg\", \"Purple Mushroom\"],\n    \"neutrals\": [\n      \"All Fish (except Carp & Snail)\",\n      \"All Milk\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"Quartz\"],\n    \"hates\": [\"Holly\"]\n  },\n  {\n    \"id\": \"dwarf\",\n    \"name\": \"Dwarf\",\n    \"birthday\": {\n      \"day\": 22,\n      \"season\": \"summer\"\n    },\n    \"address\": \"The Mines\",\n    \"occupation\": \"Shopkeeper\",\n    \"description\": \"The Dwarf is a valley resident who lives in the Mines. Access is initially blocked by an unbreakable rock which can be broken using a steel pickaxe or bombs.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 0.2,\n        \"id\": 691039,\n        \"description\": \"The Dwarf confronts Krobus in the sewers over past conflicts between their races, but the Wizard brokers a peace agreement.\",\n        \"details\": \"After earning 50 friendship points with the Dwarf, enter the Sewers. A Stardrop must have been purchased from Krobus. The Dwarf encounters Krobus and accuses the Shadow People of killing their family. Krobus responds that violence became necessary after dwarves displaced them from their homeland. The player intervenes. The Wizard suddenly appears and halts the conflict, reminding them the Elemental Wars have long been finished. The Dwarf agrees and promises to avoid the Sewers. The Wizard casts a Seal of Promise to formalize their agreement.\"\n      }\n    ],\n    \"image\": \"images/villagers/Dwarf.png\",\n    \"loves\": [\n      \"Amethyst\",\n      \"Aquamarine\",\n      \"Emerald\",\n      \"Jade\",\n      \"Lava Eel\",\n      \"Lemon Stone\",\n      \"Omni Geode\",\n      \"Ruby\",\n      \"Topaz\"\n    ],\n    \"likes\": [\"Cave Carrot\", \"Quartz\"],\n    \"neutrals\": [\n      \"All Fruit (except Fruit Tree Fruit & Salmonberry)\",\n      \"All Milk\",\n      \"Solar Essence\",\n      \"Void Essence\"\n    ],\n    \"dislikes\": [\n      \"All Eggs\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Salmonberry\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": []\n  },\n  {\n    \"id\": \"elliott\",\n    \"name\": \"Elliott\",\n    \"birthday\": {\n      \"day\": 5,\n      \"season\": \"fall\"\n    },\n    \"address\": \"Elliott's Cabin\",\n    \"occupation\": \"Writer\",\n    \"description\": \"Elliott lives alone in a cabin on the beach. He is a writer who dreams of one day writing a magnificent novel.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 39,\n        \"description\": \"Elliott explains his background as a writer and asks about the player's favorite novel genre.\",\n        \"details\": \"Enter Elliott's cabin when he's there. Elliott explains he came to Pelican Town to become a writer but faced skepticism from his hometown. He asks your preferred novel genre (Mystery/Romance/Sci-Fi), each granting +30 friendship. He then requests you examine his rose, suspecting it may be wilting.\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 40,\n        \"description\": \"The player encounters Elliott at the Saloon where they share a toast together.\",\n        \"details\": \"Enter the Stardrop Saloon between 3pm-10pm when Gus is present. Elliott arrives and proposes a toast. Four options available: \\\"To Pelican Town!\\\" (+25 friendship), \\\"To our friendship!\\\" (+50 friendship), \\\"To my good health!\\\" (-10 friendship), or \\\"To your doom!\\\" (-50 friendship). After drinking, Elliott dances and you're transported outside.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 423502,\n        \"description\": \"Elliott plays piano at his cabin and discusses his struggles finishing his novel.\",\n        \"details\": \"Enter Elliott's home when he's there. Elliott finishes playing piano. You can comment on the performance or ask about his playing duration. He discusses struggles finishing his novel, mentioning desire to become a farmer. You can respond sympathetically or invite him to the farm.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 1848481,\n        \"description\": \"Elliott holds a public reading of his completed book at the museum, dedicating it to the player.\",\n        \"details\": \"Visit the museum between 1pm-7pm after receiving Elliott's letter. Villagers gather for Elliott's novel reading. He reads from his completed book in your chosen genre from the Two-Heart event: the mystery \\\"Blue Tower,\\\" romance \\\"Camellia Station,\\\" or sci-fi \\\"The Rise And Fall Of Planet Yazzo.\\\" He dedicates the work to you and thanks you for your support.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 43,\n        \"description\": \"Elliott invites the player on a rowboat ride where he confesses his feelings.\",\n        \"details\": \"Go to the beach between 7am-1pm on a non-rainy day. Elliott shows you his repaired rowboat and invites you on a maiden voyage. If you accept, he discusses his novel and kisses you unexpectedly. Choosing \\\"I'm happy\\\" grants +50 friendship. Declining or requesting he stop results in -50 friendship.\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 3912125,\n        \"description\": \"Elliott departs on a book tour and sends letters home.\",\n        \"details\": \"Exit farmhouse or enter farm between 6am-3pm when no festivals occur within 8 days. Elliott appears on your front porch. He sends daily letters during his week-long book tour. On day two, Crab Cakes appear in your fridge.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 3912132,\n        \"description\": \"Elliott returns from his book tour and proposes to the player.\",\n        \"details\": \"On day eight of the book tour, Elliott returns and triggers the final event sequence upon waking.\"\n      }\n    ],\n    \"image\": \"images/villagers/Elliott.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Elliott.png\",\n    \"loves\": [\"Crab Cakes\", \"Duck Feather\", \"Lobster\", \"Pomegranate\", \"Squid Ink\", \"Tom Kha Soup\"],\n    \"likes\": [\"Octopus\", \"Squid\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fish (except Carp, Lobster, Octopus, Sea Cucumber, Snail, Squid)\",\n      \"Rainbow Shell\",\n      \"Sea Urchin\"\n    ],\n    \"dislikes\": [\n      \"All Milk\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Pizza\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\"Amaranth\", \"Quartz\", \"Salmonberry\", \"Sea Cucumber\", \"Super Cucumber\"]\n  },\n  {\n    \"id\": \"emily\",\n    \"name\": \"Emily\",\n    \"birthday\": {\n      \"day\": 27,\n      \"season\": \"spring\"\n    },\n    \"address\": \"2 Willow Lane\",\n    \"occupation\": \"Tailor\",\n    \"description\": \"Emily is a villager who lives in Pelican Town and is one of twelve characters available to marry. She works evenings at The Stardrop Saloon and lives at 2 Willow Lane with her sister Haley.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 471942,\n        \"description\": \"The player appears in Emily's dream where she sees them as someone special with an intertwined destiny.\",\n        \"details\": \"Enter Emily's house when she's there. Emily is asleep and you witness her dream. The scene shows abstract shapes, clouds, and palm trees. She floats above a purple structure meditating. You appear, surprising her. Rainbow streaks fly by as she perceives them as omens. You disappear and she wakes, believing your destinies are somehow intertwined.\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Emily sends a Salad recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Emily mails you the Salad recipe with a note: \\\"Flip this letter over for instructions on how to make a super-healthy meal! You'll feel energized. See you soon. -Emily\\\"\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 463391,\n        \"description\": \"An injured parrot crashes into Emily's window and she adopts and cares for it.\",\n        \"details\": \"Enter town on a sunny day, not in winter. Emily leaves her house and waves at three passing parrots, calling them friends. A fourth parrot flies too low and hits her house window, injuring itself. She rushes over, cradles it gently, and promises care. Emily now keeps the injured parrot in her room.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 917409,\n        \"description\": \"Emily performs a private dance for the player in her room.\",\n        \"details\": \"Enter Emily's house when she's there. Emily excitedly shows her secret hobby — dancing. She turns on her stereo and performs for you. Afterward, you choose your response: \\\"That was amazing!\\\" (+25 friendship), \\\"That was embarrassing...\\\" (-50 friendship), or slow clap silently (+25 friendship).\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Emily sends a Red Plate recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Emily mails you the Red Plate recipe with a similar note about healthy meals.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 2123243,\n        \"description\": \"Emily hosts a Clothing Therapy session at the Mayor's house where townspeople express themselves through fashion.\",\n        \"details\": \"Receive a letter inviting you to the Mayor's Manor. Emily hosts Clothing Therapy. Attendees include Lewis, Abigail, Shane, Robin, and Clint. Each person selects an outfit expressing their true self. Shane wears goth clothing; Robin wears a fine dress; Lewis wears fancy accessories; Abigail wears armor; Clint reluctantly wears pink shorts and a beret. Emily shows romantic interest in you afterward, but Clint interrupts.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 2123343,\n        \"description\": \"The player goes camping with Emily in the Secret Woods where a bear interrupts and they share a sleeping bag.\",\n        \"details\": \"Letter invites you to Secret Woods after 10pm (requires steel axe to access). You go camping with Emily. Strange grunting emerges from the forest. She cuddles close for warmth. A bear approaches, and you both dive into the tent. The bear investigates then leaves. She mentions a sleeping bag remains outside but won't retrieve it — you must share one. Screen fades; day ends.\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 3917600,\n        \"description\": \"Emily requests 200 fiber for a project.\",\n        \"details\": \"Exit farmhouse between 6am-8:20am after marriage. Emily appears requesting an errand — bring 200 fiber pieces.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 3917601,\n        \"description\": \"Emily gives the player a magical outfit with hat, boots, shirt, and pants.\",\n        \"details\": \"After completing the fiber request and waiting 3 days, enter the farmhouse between 8pm-midnight. Emily gives you an outfit: Emily's Magic Hat, Boots, Shirt, and matching blue Genie Pants.\"\n      }\n    ],\n    \"image\": \"images/villagers/Emily.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Emily.png\",\n    \"loves\": [\n      \"Amethyst\",\n      \"Aquamarine\",\n      \"Cloth\",\n      \"Emerald\",\n      \"Jade\",\n      \"Parrot Egg\",\n      \"Ruby\",\n      \"Survival Burger\",\n      \"Topaz\",\n      \"Wool\"\n    ],\n    \"likes\": [\"Daffodil\", \"Quartz\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fruit (except Fruit Tree Fruit & Salmonberry)\",\n      \"All Milk\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"Fried Eel\", \"Ice Cream\", \"Rice Pudding\", \"Salmonberry\", \"Spicy Eel\"],\n    \"hates\": [\"Fish Taco\", \"Holly\", \"Maki Roll\", \"Salmon Dinner\", \"Sashimi\"]\n  },\n  {\n    \"id\": \"evelyn\",\n    \"name\": \"Evelyn\",\n    \"birthday\": {\n      \"day\": 20,\n      \"season\": \"winter\"\n    },\n    \"address\": \"1 River Road\",\n    \"occupation\": \"Gardener\",\n    \"description\": \"Evelyn has lived in Pelican Town her entire life. Always hopeful and optimistic, Granny spends her days tending the town gardens, baking her signature cookies, and reminiscing about Stardew Valley's vibrant past.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 4,\n        \"id\": 19,\n        \"description\": \"The player enters Evelyn's home and receives her Cookie recipe after tasting her baked goods.\",\n        \"details\": \"Enter Evelyn's home at 1 River Road while she is inside. You discover Evelyn baking cookies and she offers you some, requesting your opinion. \\\"It's delicious!\\\" awards +100 friendship points. \\\"It was like chewing on a hockey puck\\\" results in -100 friendship points. Regardless of your response, Evelyn provides you with the Cookie recipe.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Evelyn sends a Rice Pudding recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Evelyn mails you the Rice Pudding recipe with a note: \\\"I usually don't give out my recipes... but since you've been such a sweetheart to George and I, I've written this one down for you. -Evelyn\\\"\"\n      }\n    ],\n    \"image\": \"images/villagers/Evelyn.png\",\n    \"loves\": [\"Beet\", \"Chocolate Cake\", \"Diamond\", \"Fairy Rose\", \"Raisins\", \"Stuffing\", \"Tulip\"],\n    \"likes\": [\n      \"Broken Glasses\",\n      \"Clam\",\n      \"Cockle\",\n      \"Coral\",\n      \"Daffodil\",\n      \"Mussel\",\n      \"Nautilus Shell\",\n      \"Oyster\",\n      \"Sea Urchin\"\n    ],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fruits (except Fruit Tree Fruit, Salmonberry & Spice Berry)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"Quartz\", \"Wild Horseradish\"],\n    \"hates\": [\n      \"All Fish (except Clam, Cockle, Mussel & Oyster)\",\n      \"Clay\",\n      \"Fried Eel\",\n      \"Garlic\",\n      \"Holly\",\n      \"Maki Roll\",\n      \"Salmonberry\",\n      \"Sashimi\",\n      \"Spice Berry\",\n      \"Spicy Eel\",\n      \"Trout Soup\"\n    ]\n  },\n  {\n    \"id\": \"george\",\n    \"name\": \"George\",\n    \"birthday\": {\n      \"day\": 24,\n      \"season\": \"fall\"\n    },\n    \"address\": \"1 River Road\",\n    \"occupation\": \"Retired\",\n    \"description\": \"George is a villager who lives in Pelican Town. He is an elderly man who uses a wheelchair and lives with his wife Evelyn and grandson Alex.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"George sends a Fried Eel recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, George mails you the Fried Eel recipe with a note: \\\"Figured I'd give you this recipe I had laying around. Try not to burn it. -George\\\"\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 18,\n        \"description\": \"George struggles to reach something on a bookshelf and the player retrieves it, after which he explains why he uses a wheelchair.\",\n        \"details\": \"Enter George's house when he is home. George struggles to reach something on a bookshelf. The player walks to the shelf and retrieves the item for George. He thanks the player and a few moments of silence ensue. George then tells the player why he is in a wheelchair.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"George sends a Spicy Eel recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, George mails you the Spicy Eel recipe with a note: \\\"Figured I'd give you this recipe I had laying around. Try not to burn it. -George\\\"\"\n      }\n    ],\n    \"image\": \"images/villagers/George.png\",\n    \"loves\": [\"Fried Mushroom\", \"Leek\"],\n    \"likes\": [\"Daffodil\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fruit (except Fruit Tree Fruit & Salmonberry)\",\n      \"All Milk\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"All Flowers (except Poppy)\", \"Salmonberry\", \"Wild Horseradish\"],\n    \"hates\": [\"Clay\", \"Dandelion\", \"Holly\", \"Quartz\"]\n  },\n  {\n    \"id\": \"gus\",\n    \"name\": \"Gus\",\n    \"birthday\": {\n      \"day\": 8,\n      \"season\": \"summer\"\n    },\n    \"address\": \"The Stardrop Saloon\",\n    \"occupation\": \"Saloon owner and chef\",\n    \"description\": \"Gus is a villager who lives and works at The Stardrop Saloon in Pelican Town. He owns the establishment.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Gus sends a Salmon Dinner recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Gus mails you the Salmon Dinner recipe with a note: \\\"Here's a recipe from my saloon. I only share this with my good friends! -Gus\\\"\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 96,\n        \"description\": \"Gus confides about the saloon's financial troubles and asks for help addressing Pam's unpaid tab.\",\n        \"details\": \"Enter the Saloon during open hours when Gus is inside. Only occurs if friendship with Pam is at 2+ hearts. Gus sits dejected at a table. He explains the saloon faces financial hardship and admits Pam hasn't paid her tab. When Pam enters requesting a drink, you choose between: \\\"You need to pay your tab right now!\\\" (-50 friendship with Pam) or \\\"The saloon isn't doing well, financially\\\" (+15 friendship with Pam).\"\n      },\n      {\n        \"heart\": 5,\n        \"id\": 980558,\n        \"description\": \"Gus appears at the player's farmhouse with a cooking analogy and gifts a Mini-Jukebox.\",\n        \"details\": \"Exit farmhouse on non-rainy day between 6am-11:30am. Gus appears with sauce, drawing a cooking analogy to the player's arrival in Stardew Valley. He explains that adding a new ingredient may ruin the sauce or create something new and delicious, and reflects on your friendship. He gifts a Mini-Jukebox found while cleaning the Saloon and provides the recipe to craft more.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Gus sends a Cranberry Sauce recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Gus mails you the Cranberry Sauce recipe with a note: \\\"Here's a recipe from my saloon. I only share this with my good friends! -Gus\\\"\"\n      }\n    ],\n    \"image\": \"images/villagers/Gus.png\",\n    \"loves\": [\"Diamond\", \"Escargot\", \"Fish Taco\", \"Orange\", \"Tropical Curry\"],\n    \"likes\": [\"Daffodil\", \"Truffle\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fruit (except Fruit Tree Fruit & Salmonberry)\",\n      \"All Milk\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"Salmonberry\", \"Wild Horseradish\"],\n    \"hates\": [\"Coleslaw\", \"Holly\", \"Quartz\"]\n  },\n  {\n    \"id\": \"haley\",\n    \"name\": \"Haley\",\n    \"birthday\": {\n      \"day\": 14,\n      \"season\": \"spring\"\n    },\n    \"address\": \"2 Willow Lane\",\n    \"occupation\": \"Photographer\",\n    \"description\": \"Haley is a villager who lives in Pelican Town and is one of twelve characters available to marry.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 11,\n        \"description\": \"Haley and Emily argue about cleaning, and the player is asked to help resolve their conflict.\",\n        \"details\": \"Enter Haley and Emily's house when both are there. Haley and Emily argue about cleaning couch cushions. Player chooses how to resolve conflict, affecting friendship (+30/-50/-30).\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 12,\n        \"description\": \"Haley struggles to open a jar and asks the player for help.\",\n        \"details\": \"Enter Haley's house when she's there. Haley struggles opening a jar and asks if the player is strong enough to help. Responses affect friendship (+30/-30). She mentions finding a tool later.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 13,\n        \"description\": \"The player finds Haley grieving over a lost bracelet at the beach and can choose to help retrieve it.\",\n        \"details\": \"Visit the Beach between 10am-4pm, any season except Winter. Haley grieves losing her great-grandmother's bracelet. Player can offer sympathy (+50) or dismiss concern (-30). The bracelet is found near Elliott's cabin.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 14,\n        \"description\": \"Haley asks the player to take pictures with her at the ranch, where she climbs on a cow and falls off.\",\n        \"details\": \"Enter Cindersap Forest on a sunny day between 10am-4pm, any season except Winter. Haley photographs and asks the player to take pictures. She climbs on a cow, falls, gets dirty, and leaves to shower. She sends a letter the next morning.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 15,\n        \"description\": \"Haley shows the player her dark room for developing photos.\",\n        \"details\": \"Enter Haley's house when she's there. Haley shows her dark room for developing photos. The player responds about room quality, then chooses to help decorate, make an excuse, or kiss her, affecting the outcome.\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 6184643,\n        \"description\": \"Haley begins organizing a charity cakewalk to raise funds for new school books.\",\n        \"details\": \"Enter town on a non-rainy day between 8am-3pm. Haley overhears children discussing damaged books and decides to organize a charity event.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 8675611,\n        \"description\": \"The charity cakewalk event takes place in town.\",\n        \"details\": \"Enter the farmhouse between 6:20am-5pm. Haley requests a chocolate cake for the charity cakewalk she is organizing.\"\n      },\n      {\n        \"heart\": 14.3,\n        \"id\": 6184644,\n        \"description\": \"Haley celebrates the success of the charity cakewalk.\",\n        \"details\": \"Enter the town square on the next sunny day. The cakewalk occurs; Haley reveals the fundraising was for new books for the school.\"\n      }\n    ],\n    \"image\": \"images/villagers/Haley.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Haley.png\",\n    \"loves\": [\"Coconut\", \"Fruit Salad\", \"Pink Cake\", \"Sunflower\"],\n    \"likes\": [\"Daffodil\"],\n    \"neutrals\": [],\n    \"dislikes\": [\n      \"All Eggs\",\n      \"All Fruit (except Coconut)\",\n      \"All Milk\",\n      \"All Vegetables (except Hops, Tea Leaves & Wheat)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Mystic Syrup\",\n      \"Purple Mushroom\",\n      \"Quartz\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\"All Fish\", \"Clay\", \"Prismatic Shard\", \"Wild Horseradish\"]\n  },\n  {\n    \"id\": \"harvey\",\n    \"name\": \"Harvey\",\n    \"birthday\": {\n      \"day\": 14,\n      \"season\": \"winter\"\n    },\n    \"address\": \"Medical Clinic\",\n    \"occupation\": \"Doctor\",\n    \"description\": \"Harvey is a villager who lives in Pelican Town. He runs the town's medical clinic and is one of the twelve characters available to marry.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 56,\n        \"description\": \"Harvey performs a check-up on George and appreciates the player's help getting George to cooperate.\",\n        \"details\": \"Enter George's house while George is there. Harvey is performing a private check-up on George. He tries to explain that George needs to make some lifestyle changes, but George seems irritated with his advice. \\\"George should follow Dr. Harvey's advice\\\" (+40 friendship). \\\"George knows what's best for his own body\\\" (-40 friendship).\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 57,\n        \"description\": \"During an annual check-up at the clinic, Harvey notices the player's elevated pulse and declares them healthy.\",\n        \"details\": \"Enter the clinic when Harvey is there. Harvey says he was just about to write you a letter about your annual check-up. As he's looking you over, he notices your pulse seems high. Options regarding nervousness, farm work, or doubting his credentials affect friendship. Harvey declares you healthy and advises against overwork.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 58,\n        \"description\": \"Harvey is embarrassed when the player catches him attending a dance aerobics class.\",\n        \"details\": \"Enter the general store between 11am and 3pm. You witness a dance aerobics session with some of the ladies and, unexpectedly, Harvey. Harvey seems out of breath as the session ends, heading towards the door but running into you on the way. Harvey seems incredibly embarrassed when he finds out you were watching. \\\"I won't tell\\\" (+20 friendship). \\\"I can't promise that\\\" (-50 friendship).\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 571102,\n        \"description\": \"Harvey excitedly makes radio contact with a pilot and shares his childhood dream of becoming an aviator.\",\n        \"details\": \"Enter the clinic. You head into Harvey's room to find him using his equipment to contact a pilot. He suddenly gets a response, surprising him, but he manages to respond with his coordinates before signing off. Harvey reveals his childhood dream of becoming a pilot, thwarted by poor eyesight and fear of heights. He shows you his model planes collection.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 528052,\n        \"description\": \"Harvey arranges a hot air balloon ride where both ascend together and share a kiss in the sky.\",\n        \"details\": \"Harvey sends a letter asking to meet at the railroad tracks. Go between 9am and 5pm. A man in a hot air balloon, Marcello, lands nearby. Harvey arranged a hot air balloon rental. Despite his fear of heights, he boards with you. During the flight, you share a kiss. You return the balloon at least a half hour late.\"\n      },\n      {\n        \"heart\": 14,\n        \"id\": 3917626,\n        \"description\": \"Harvey cooks angel hair pasta with clams at the player's farmhouse.\",\n        \"details\": \"Enter an upgraded farmhouse (upgraded at least twice) between 8pm and midnight. Harvey is seen cooking and then setting the table for dinner. As you enter, Harvey says you're just in time and tells you he's cooked angel hair pasta with clams. Harvey offers to wash the dishes and expresses happiness.\"\n      }\n    ],\n    \"image\": \"images/villagers/Harvey.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Harvey.png\",\n    \"loves\": [\"Coffee\", \"Pickles\", \"Super Meal\", \"Truffle Oil\", \"Wine\"],\n    \"likes\": [\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Duck Egg\",\n      \"Duck Feather\",\n      \"Goat Milk\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Large Goat Milk\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Quartz\",\n      \"Winter Root\"\n    ],\n    \"neutrals\": [\"Large Milk\", \"Milk\"],\n    \"dislikes\": [\n      \"Blueberry Tart\",\n      \"Bread\",\n      \"Cheese\",\n      \"Chocolate Cake\",\n      \"Cookie\",\n      \"Cranberry Sauce\",\n      \"Fried Mushroom\",\n      \"Glazed Yams\",\n      \"Goat Cheese\",\n      \"Hashbrowns\",\n      \"Ice Cream\",\n      \"Pancakes\",\n      \"Pink Cake\",\n      \"Pizza\",\n      \"Rhubarb Pie\",\n      \"Rice Pudding\"\n    ],\n    \"hates\": [\"Coral\", \"Nautilus Shell\", \"Rainbow Shell\", \"Salmonberry\", \"Spice Berry\"]\n  },\n  {\n    \"id\": \"jas\",\n    \"name\": \"Jas\",\n    \"birthday\": {\n      \"day\": 4,\n      \"season\": \"summer\"\n    },\n    \"address\": \"Marnie's Ranch\",\n    \"occupation\": \"Child\",\n    \"description\": \"Jas is a villager who lives just outside Pelican Town. She is a young girl who can often be found with her best friend Vincent.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 8,\n        \"id\": 3910979,\n        \"description\": \"Jas and Vincent teach the player how to clean Spring Onions, permanently increasing their sell price by 5x.\",\n        \"details\": \"Enter Cindersap Forest during Spring on a sunny day between 6am and 5pm after reaching 8 hearts with both Jas and Vincent. Vincent will explain how to clean Spring Onions by removing insects. Jas insists that the insects not be killed after removing them from the onions. Afterward, the player gains Spring Onion Mastery, which permanently increases the sell price of Spring Onions by 5x.\"\n      }\n    ],\n    \"image\": \"images/villagers/Jas.png\",\n    \"loves\": [\n      \"Ancient Doll\",\n      \"Fairy Box\",\n      \"Fairy Rose\",\n      \"Pink Cake\",\n      \"Plum Pudding\",\n      \"Strange Doll (green)\",\n      \"Strange Doll (yellow)\"\n    ],\n    \"likes\": [\"Coconut\", \"Daffodil\"],\n    \"neutrals\": [],\n    \"dislikes\": [\n      \"All Eggs\",\n      \"All Fruits (except Coconut & Fruit Tree Fruit)\",\n      \"All Vegetables (except Hops & Wheat)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Quartz\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\n      \"All Artisan Goods (except Honey, Jelly & Oil)\",\n      \"Beer\",\n      \"Clay\",\n      \"Coffee\",\n      \"Mead\",\n      \"Pale Ale\",\n      \"Piña Colada\",\n      \"Triple Shot Espresso\",\n      \"Wild Horseradish\",\n      \"Wine\"\n    ]\n  },\n  {\n    \"id\": \"jodi\",\n    \"name\": \"Jodi\",\n    \"birthday\": {\n      \"day\": 11,\n      \"season\": \"fall\"\n    },\n    \"address\": \"1 Willow Lane\",\n    \"occupation\": \"Homemaker\",\n    \"description\": \"Jodi is a villager who lives in Pelican Town at 1 Willow Lane with her husband Kent and two sons, Sam and Vincent.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": null,\n        \"description\": \"The player finds a letter from Kent in Jodi's bedroom drawer.\",\n        \"details\": \"Enter Jodi's house while she is there. The player discovers a letter from Kent in Jodi's bedroom drawer expressing concerns about his return from military service.\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Jodi sends a Fried Calamari recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Jodi mails you the Fried Calamari recipe with a note: \\\"This recipe of mine won 1st place in a cooking competition! I hope you like it. Thanks for being a friend! -Jodi\\\"\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": [94, 95],\n        \"description\": \"Jodi visits the farm to invite the player to dinner, requesting they bring a Largemouth Bass.\",\n        \"details\": \"Leave your farmhouse between 6am-9:30am on a Monday when you've reached 4 hearts with Jodi. Jodi will be waiting outside your farmhouse. She invites you to dinner at her house at 7pm and requests you bring a Largemouth Bass for the casserole she's making, describing it as \\\"one of those big, slimy fish from the lake.\\\" You must bring a Largemouth Bass to her house at 7pm on any day after the invitation. When you enter her home with the fish, a dinner cutscene occurs.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Jodi sends an Ice Cream recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Jodi mails you the Ice Cream recipe with a note: \\\"This recipe of mine won 1st place in a cooking competition! I hope you like it. Thanks for being a friend! -Jodi\\\"\"\n      }\n    ],\n    \"image\": \"images/villagers/Jodi.png\",\n    \"loves\": [\n      \"Chocolate Cake\",\n      \"Crispy Bass\",\n      \"Diamond\",\n      \"Eggplant Parmesan\",\n      \"Fried Eel\",\n      \"Pancakes\",\n      \"Rhubarb Pie\",\n      \"Vegetable Medley\"\n    ],\n    \"likes\": [],\n    \"neutrals\": [],\n    \"dislikes\": [\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Garlic\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Quartz\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\"Daffodil\", \"Dandelion\", \"Spice Berry\"]\n  },\n  {\n    \"id\": \"kent\",\n    \"name\": \"Kent\",\n    \"birthday\": {\n      \"day\": 4,\n      \"season\": \"spring\"\n    },\n    \"address\": \"1 Willow Lane\",\n    \"occupation\": \"Soldier\",\n    \"description\": \"Kent is a villager who lives in Pelican Town. He is away serving in the army throughout the first year and returns to live in the town during spring of year two.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": 100,\n        \"description\": \"Popcorn sounds trigger Kent's PTSD and the player must choose how to respond to his distress.\",\n        \"details\": \"Enter Kent's home while he and Jodi are both there. Jodi says she's making popcorn. Kent screams, recalling how the sound reminds him of the war, and laments losing friends. Jodi responds that popcorn was his favorite before leaving. Kent says things have changed. \\\"Blame Jodi\\\" (-25 friendship). \\\"Support Kent's feelings\\\" (+50 friendship). \\\"Lie and take blame\\\" (-50 friendship, Kent states he hates lies more than anything).\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Kent sends a Crispy Bass recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Kent mails you the Crispy Bass recipe with a note: \\\"Picked up this recipe overseas. Enjoy. Want to say thanks for making me feel welcome. -Kent\\\"\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Kent sends a Super Meal recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Kent mails you the Super Meal recipe with a note expressing gratitude for the player's hospitality.\"\n      }\n    ],\n    \"image\": \"images/villagers/Kent.png\",\n    \"loves\": [\"Fiddlehead Risotto\", \"Roasted Hazelnuts\"],\n    \"likes\": [\"Daffodil\", \"Dwarvish Safety Manual\"],\n    \"neutrals\": [\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"Piña Colada\", \"Quartz\", \"Snow Yam\"],\n    \"hates\": [\"Algae Soup\", \"All Milk\", \"Holly\", \"Sashimi\", \"Tortilla\"]\n  },\n  {\n    \"id\": \"krobus\",\n    \"name\": \"Krobus\",\n    \"birthday\": {\n      \"day\": 1,\n      \"season\": \"winter\"\n    },\n    \"address\": \"The Sewers\",\n    \"occupation\": \"Shadow merchant\",\n    \"description\": \"Krobus is the only friendly monster players will encounter. He is a shadow person who lives in the Sewers.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Krobus sends a Dark Sign crafting recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Krobus mails you the Dark Sign crafting recipe with a note: \\\"I'm not sure how the human message system works, so I asked Wizard to help me write this letter. I hope you are doing okay. I wanted to share this with you... it's notes on how my people build a certain item. -Krobus\\\"\"\n      },\n      {\n        \"heart\": 14,\n        \"id\": 7771191,\n        \"description\": \"A sea monster appears while Krobus watches Moonlight Jellies at the beach, and he enjoys a ride on its tentacles.\",\n        \"details\": \"Enter the Beach between 8pm and 1am on a non-rainy day. Krobus sits on the docks watching Moonlight Jellies swim, when a sea monster appears. The sea monster raises its tentacles, and Krobus hops on for a ride. A heart dialogue bubble appears over Krobus' head, indicating he enjoyed the ride.\"\n      }\n    ],\n    \"image\": \"images/villagers/Krobus.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Krobus.png\",\n    \"loves\": [\n      \"Diamond\",\n      \"Iridium Bar\",\n      \"Monster Compendium\",\n      \"Monster Musk\",\n      \"Pumpkin\",\n      \"Void Egg\",\n      \"Void Mayonnaise\",\n      \"Wild Horseradish\"\n    ],\n    \"likes\": [\"Gold Bar\", \"Quartz\", \"Seafoam Pudding\", \"Strange Bun\"],\n    \"neutrals\": [],\n    \"dislikes\": [\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Life Elixir\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Salmonberry\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"hates\": []\n  },\n  {\n    \"id\": \"leah\",\n    \"name\": \"Leah\",\n    \"birthday\": {\n      \"day\": 23,\n      \"season\": \"winter\"\n    },\n    \"address\": \"Leah's Cottage\",\n    \"occupation\": \"Artist\",\n    \"description\": \"Leah is a villager who lives in a small cottage outside Pelican Town. She is one of the twelve characters available to marry.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 50,\n        \"description\": \"The player visits Leah's cottage while she is sculpting and discusses art.\",\n        \"details\": \"Enter Leah's Cottage when she's there. She's working on a sculpture and discusses how once you get past the outer layers, the true nature starts to show. You choose between responses, with one option permanently blocking her 8-Heart event. She mentions difficulty paying bills as an artist, prompting suggestions about an art show or selling art online.\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 51,\n        \"description\": \"Leah receives a call from her ex-partner asking her to return to the city.\",\n        \"details\": \"Enter Leah's Cottage when she's there. You find her arguing with her ex-partner Kel via phone call about returning to the city. She asks if leaving was selfish. Your response determines whether she thanks you or gets briefly angry. She mentions pursuing either the art show or computer idea from the previous event.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 992253,\n        \"description\": \"Leah gives the player a sculpture she created.\",\n        \"details\": \"Leah appears at your farmhouse door on non-rainy days between 6am and 11:30am. She gives you a sculpture she's been working on titled \\\"How I Feel About [your name].\\\"\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 52,\n        \"description\": \"The player helps Leah reach fruit from a tree by lifting her onto their shoulders.\",\n        \"details\": \"Enter Cindersap Forest when Leah is there, any season except winter. Leah tries reaching fruit from a tree above the forest lake. The player lifts her onto their shoulders. She thanks you, saying if her art ever fails, you'll always be there to catch her.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": [53, 584059],\n        \"description\": \"Leah holds an art show in town or launches an online art shop, depending on earlier choices.\",\n        \"details\": \"If you suggested an art show at Two Hearts, she invites you via farmhouse visit. Enter Pelican Town between 3-5pm. Leah nervously presents her sculptures to gathered villagers, thanking you for suggesting the show. Her ex Kel appears watching from the side. If you suggested selling online, enter her cottage. Leah shows you her new laptop and online art shop. Someone called Mr K keeps buying everything.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 54,\n        \"description\": \"Leah surprises the player with a picnic in the forest, they share a kiss, and her ex appears.\",\n        \"details\": \"Enter Cindersap Forest between 11am and 4pm on sunny days, any season except winter. Leah surprises you with a picnic, thanking you for helping her become a real artist. You kiss. Her ex Kel emerges, revealing they've been secretly buying all her art. You can punch or reason with Kel; either way, Leah handles it. You relocate to a more private spot.\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 3911124,\n        \"description\": \"The player paints alongside Leah, comparing their artistic abilities.\",\n        \"details\": \"Exit farmhouse between 6-8:20am on sunny non-Sunday days, not winter. Leah meets you outside and proposes a painting session. Enter the Forest between 11:30am and 2pm on any sunny day after.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 3091462,\n        \"description\": \"Leah and the player finish their paintings and share the results.\",\n        \"details\": \"You paint a portrait of Marnie together. You choose Leah's portrait style and describe your own attempt. Leah's painting is beautiful; yours is unflattering. Marnie keeps Leah's painting and gives you yours to keep.\"\n      }\n    ],\n    \"image\": \"images/villagers/Leah.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Leah.png\",\n    \"loves\": [\n      \"Goat Cheese\",\n      \"Poppyseed Muffin\",\n      \"Salad\",\n      \"Stir Fry\",\n      \"Truffle\",\n      \"Vegetable Medley\",\n      \"Wine\"\n    ],\n    \"likes\": [\"Chanterelle\", \"Daffodil\", \"Dandelion\", \"Driftwood\"],\n    \"neutrals\": [],\n    \"dislikes\": [\n      \"All Foraged Minerals (except Earth Crystal)\",\n      \"All Gems (except Diamond & Prismatic Shard)\",\n      \"Carp Surprise\",\n      \"Cookie\",\n      \"Ice Cream\",\n      \"Pink Cake\",\n      \"Rice Pudding\",\n      \"Survival Burger\",\n      \"Tortilla\"\n    ],\n    \"hates\": [\"Bread\", \"Hashbrowns\", \"Pancakes\", \"Pizza\", \"Void Egg\"]\n  },\n  {\n    \"id\": \"leo\",\n    \"name\": \"Leo\",\n    \"birthday\": {\n      \"day\": 26,\n      \"season\": \"summer\"\n    },\n    \"address\": \"Ginger Island\",\n    \"occupation\": \"Islander\",\n    \"description\": \"Leo is a boy who initially lives on Ginger Island. His parents were lost at sea, and he considers the parrots who inhabit the island to be his family.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 6497423,\n        \"description\": \"Leo shares his loneliness about not truly belonging anywhere despite living with the parrots.\",\n        \"details\": \"Enter Island West on a sunny day between 6am and 6pm. The player stands by the shore when Leo approaches. He asks what they're doing, then about their home, then if there are kids in Pelican Town. Leo reveals he's not truly a bird and feels lonely not belonging anywhere. He runs off before Willy arrives.\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Leo sends a Poi recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Leo mails you the Poi recipe with a note: \\\"Here's a food from my home, that me and my family enjoy. Hope you like it. -Leo P.S. Willy helped me write this.\\\"\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 6497421,\n        \"description\": \"Leo accidentally squawks at the player and discusses his struggles with communication.\",\n        \"details\": \"Enter Island North on a sunny day between 6am and 6pm, before Leo moves to the Valley. Leo squawks like a parrot, startling the player. He explains difficulty communicating with words and asks if the player finds him weird. He wonders about normal kids and whether he could be normal again. Leo states the parrots are his family regardless, and thanks the player, saying they may be a part of his family too someday.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 6497428,\n        \"description\": \"Linus invites Leo to move to the mainland, and the parrots construct a treehouse for him near Linus's tent.\",\n        \"details\": \"Enter Island South on a sunny day between 6am and 6pm. Linus invites Leo to move to mainland Stardew Valley. Willy mentions other children exist and Leo can visit Ginger Island anytime. Leo decides to move. That night, parrots build him a treehouse west of Linus' tent.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Leo sends a Mango Sticky Rice recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Leo mails you the Mango Sticky Rice recipe with a note: \\\"Here's a food from my home, that me and my family enjoy. Hope you like it. -Leo P.S. Willy helped me write this.\\\"\"\n      },\n      {\n        \"heart\": 9,\n        \"id\": 8959199,\n        \"description\": \"A montage shows Leo settling into Valley life, attending school, fishing with Willy, and developing a crush on Jas.\",\n        \"details\": \"Enter the Mountain on a non-rainy day between 6am and 7pm. Leo adjusts well to Valley life. Scenes show him cooking with Linus, answering questions correctly at school with Penny, Vincent, and Jas, fishing with Willy, and watching Jas at the playground. He arrives home and tells his parrot friend his day was good but misses Ginger Island.\"\n      }\n    ],\n    \"image\": \"images/villagers/Leo.png\",\n    \"loves\": [\"Duck Feather\", \"Mango\", \"Ostrich Egg\", \"Parrot Egg\", \"Poi\"],\n    \"likes\": [\n      \"Dragon Tooth\",\n      \"Mango Sticky Rice\",\n      \"Nautilus Shell\",\n      \"Quartz\",\n      \"Sea Urchin\",\n      \"Spice Berry\"\n    ],\n    \"neutrals\": [\n      \"All Eggs (except Ostrich Egg & Void Egg)\",\n      \"All Fish (except Carp & Snail)\",\n      \"All Fruit (except Fruit Tree Fruit, Mango, Salmonberry & Spice Berry)\",\n      \"Coffee\"\n    ],\n    \"dislikes\": [\n      \"All Cooked Dishes (except Bread, Fried Egg, Mango Sticky Rice, Poi & Triple Shot Espresso)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Life Elixir\",\n      \"Magma Cap\",\n      \"Pickles\",\n      \"Purple Mushroom\",\n      \"Salmonberry\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\n      \"Beer\",\n      \"Holly\",\n      \"Hops\",\n      \"Mead\",\n      \"Morel\",\n      \"Oil\",\n      \"Pale Ale\",\n      \"Piña Colada\",\n      \"Triple Shot Espresso\",\n      \"Unmilled Rice\",\n      \"Wine\"\n    ]\n  },\n  {\n    \"id\": \"lewis\",\n    \"name\": \"Lewis\",\n    \"birthday\": {\n      \"day\": 7,\n      \"season\": \"spring\"\n    },\n    \"address\": \"Mayor's Manor\",\n    \"occupation\": \"Mayor\",\n    \"description\": \"Lewis is the mayor of Pelican Town. He greets the player upon arrival and has served as mayor for over twenty years.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Lewis sends a Spaghetti recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Lewis mails you the Spaghetti recipe with a note: \\\"Remember to eat healthy, or you won't have enough energy to work hard! I'm including one of my favorite recipes. Make sure to use ripe tomatoes!\\\"\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 639373,\n        \"description\": \"The player witnesses Lewis and Marnie discussing their secret romance by the river.\",\n        \"details\": \"On a sunny day, enter the town between 7pm and 11pm. Only happens if Marnie is also at 6 hearts. You appear behind Lewis' house. Lewis and Marnie are talking by the river about making their romance public. Lewis says it would undermine his authority, while Marnie says he's too concerned for his job. You pop up and scare both of them. Lewis asks if you heard anything. \\\"Yes... but I'll keep it a secret\\\" (+50 friendship). \\\"Yes... and I'm going to tell everyone\\\" (-100 friendship, Lewis cries). Marnie then questions why you were behind the house, and your character runs away.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Lewis sends an Eggplant Parmesan recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Lewis mails you the Eggplant Parmesan recipe with a similar note encouraging healthy eating.\"\n      }\n    ],\n    \"image\": \"images/villagers/Lewis.png\",\n    \"loves\": [\"Autumn's Bounty\", \"Glazed Yams\", \"Green Tea\", \"Hot Pepper\", \"Vegetable Medley\"],\n    \"likes\": [\"Blueberry\", \"Cactus Fruit\", \"Coconut\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fruit (except Blueberry, Cactus Fruit, Coconut, Fruit Tree Fruit, Hot Pepper & Salmonberry)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"All Milk\", \"Salmonberry\", \"Wild Horseradish\"],\n    \"hates\": [\"Holly\", \"Quartz\"]\n  },\n  {\n    \"id\": \"linus\",\n    \"name\": \"Linus\",\n    \"birthday\": {\n      \"day\": 3,\n      \"season\": \"winter\"\n    },\n    \"address\": \"Mountain Tent\",\n    \"occupation\": \"Hermit\",\n    \"description\": \"Linus is a villager who lives in a small tent on the Mountains north of Pelican Town. He has chosen a solitary lifestyle in nature.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 0.2,\n        \"id\": 502969,\n        \"description\": \"George mistakes Linus for a raccoon raiding trash cans.\",\n        \"details\": \"After reaching 50 friendship points, enter town between 8pm-12am on a non-rainy day (not before Spring 7, Year 1). George asks you to scare raccoons from trash cans. You find Linus instead, who's embarrassed but explains he prevents food waste. Later, Gus catches Linus at the Saloon's trash and gives him zucchini fritters.\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Linus sends a Sashimi recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Linus mails you the Sashimi recipe with a note about one of his favorite fish recipes.\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 26,\n        \"description\": \"Linus invites the player to his campsite and teaches them to craft Wild Bait.\",\n        \"details\": \"Enter mountain near tent between 8pm-12am on a non-rainy day. Linus invites you over to his camp site. He apologizes for not trusting you when you first met, and thanks you for being a good friend. He invites you into his tent, where he shows you how to craft Wild Bait for use in fishing.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Linus sends a Fish Taco recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Linus mails you the Fish Taco recipe with a note about one of his favorite fish recipes.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 371652,\n        \"description\": \"Robin offers to build Linus a house, but he declines, preferring his independent lifestyle in nature.\",\n        \"details\": \"Exit Robin's house on a non-rainy day between 9am-5pm. Robin, Linus, and the player gather outside Robin's house. Robin offers lunch; Linus declines, mentioning foraging luck. Robin offers to build him a house. The player can encourage this or support Linus' independence. Linus runs off to pick berries.\"\n      }\n    ],\n    \"image\": \"images/villagers/Linus.png\",\n    \"loves\": [\n      \"Blueberry Tart\",\n      \"Cactus Fruit\",\n      \"Coconut\",\n      \"Dish O' The Sea\",\n      \"The Alleyway Buffet\",\n      \"Yam\"\n    ],\n    \"likes\": [],\n    \"neutrals\": [\"All Fish (except Snail)\", \"Wild Bait\"],\n    \"dislikes\": [\"Treasure Chest\"],\n    \"hates\": []\n  },\n  {\n    \"id\": \"marnie\",\n    \"name\": \"Marnie\",\n    \"birthday\": {\n      \"day\": 18,\n      \"season\": \"fall\"\n    },\n    \"address\": \"Marnie's Ranch\",\n    \"occupation\": \"Rancher\",\n    \"description\": \"Marnie is a villager who lives at Marnie's Ranch in Cindersap Forest.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": 91,\n        \"description\": \"Marnie visits the farm asking the player to bring a Cave Carrot to her ranch.\",\n        \"details\": \"Leave your farmhouse between 6am-9:30am. Marnie greets you and explains her goats need Cave Carrots to say hello. She asks you to bring one to her ranch between 9am-5pm. When the player enters during those hours with a Cave Carrot, a cutscene triggers where they give it to Marnie.\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Marnie sends a Pale Broth recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Marnie mails you the Pale Broth recipe with a note: \\\"Dear neighbor, when I'm not taking care of animals I like to experiment in the kitchen...\\\"\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 639373,\n        \"description\": \"The player discovers Lewis and Marnie's secret romance behind his house.\",\n        \"details\": \"On a sunny day, enter the town between 7pm and 11pm. Only happens if Lewis is also at 6 hearts. You appear behind Lewis' house. Lewis and Marnie are talking by the river about making their romance public. Lewis says it would undermine his authority. You pop up and scare both of them. \\\"Yes... but I'll keep it a secret\\\" (+50 friendship with Lewis). \\\"Yes... and I'm going to tell everyone\\\" (-100 friendship with Lewis, Lewis cries). Marnie asks why you were behind the house, and your character runs away.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Marnie sends a Rhubarb Pie recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Marnie mails you the Rhubarb Pie recipe with a similar note about kitchen experiments.\"\n      }\n    ],\n    \"image\": \"images/villagers/Marnie.png\",\n    \"loves\": [\"Diamond\", \"Farmer's Lunch\", \"Pink Cake\", \"Pumpkin Pie\"],\n    \"likes\": [\"Quartz\", \"Stardew Valley Almanac\"],\n    \"neutrals\": [\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"Salmonberry\", \"Seaweed\", \"Wild Horseradish\"],\n    \"hates\": [\"Clay\", \"Holly\"]\n  },\n  {\n    \"id\": \"maru\",\n    \"name\": \"Maru\",\n    \"birthday\": {\n      \"day\": 10,\n      \"season\": \"summer\"\n    },\n    \"address\": \"24 Mountain Road\",\n    \"occupation\": \"Nurse and inventor\",\n    \"description\": \"Maru is a villager who lives in The Mountains north of Pelican Town. She is one of the twelve characters available to marry.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 6,\n        \"description\": \"The player finds Maru testing soil samples with her father, who warns about not interfering with her future.\",\n        \"details\": \"Enter the Carpenter's Shop when Maru is there. You find Maru and Demetrius testing soil samples. Demetrius warns you not to interfere with Maru's future, then Maru returns. You can either stay silent (+10 friendship with Demetrius) or tell her \\\"Actually, your dad was being weird\\\" (-100 friendship with Demetrius).\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 7,\n        \"description\": \"Maru accidentally drops a beaker at the clinic and asks the player how to handle telling Harvey.\",\n        \"details\": \"Enter Harvey's Clinic when Maru is there. Maru drops a glass beaker and asks what to do. Options: suggest she hide it (-50 friendship), tell Harvey it was your fault (-20 friendship), or advise her to tell Harvey it was an accident (+50 friendship).\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 8,\n        \"description\": \"Maru shows the player her telescope on the mountain and shares thoughts about the stars.\",\n        \"details\": \"Enter the mountain on a sunny day between 9pm-11:40pm. Maru shows you her telescope. You can respond about seeing \\\"a beautiful planet\\\" (+30 friendship) or \\\"a cold, dark abyss\\\" (-30 friendship). She reflects on mortality and shows you a binary star system.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 9,\n        \"description\": \"Maru demonstrates a machine component that shocks the player, then apologizes while applying burn cream.\",\n        \"details\": \"Enter the Carpenter's Shop when Maru is there. She demonstrates a machine component but accidentally shocks you. You can say \\\"it doesn't even hurt\\\" (+30 friendship) or complain it hurts (-50 friendship). She apologizes either way.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 10,\n        \"description\": \"Maru reveals her robot creation MarILDA, which ultimately requests freedom and departs into space.\",\n        \"details\": \"Enter the Carpenter's Shop between 9am-4pm. Maru reveals her completed robot, MarILDA. Demetrius initially fears it but accepts it. MarILDA requests freedom to explore space. Multiple dialogue options available with varying friendship impacts.\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 3917666,\n        \"description\": \"Maru invites the player to observe a rare comet together.\",\n        \"details\": \"Enter farmhouse between 6:10am-5pm on a non-Sunday/winter day. Maru invites you to observe a comet on the mountain.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 5183338,\n        \"description\": \"Maru asks the player what they wish for while watching the comet.\",\n        \"details\": \"Enter mountains between 10pm-1am on a sunny day. You watch the comet together. You wish for a new baby, growing old together, or more money. The day ends immediately after.\"\n      }\n    ],\n    \"image\": \"images/villagers/Maru.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Maru.png\",\n    \"loves\": [\n      \"Battery Pack\",\n      \"Cauliflower\",\n      \"Cheese Cauliflower\",\n      \"Diamond\",\n      \"Dwarf Gadget\",\n      \"Gold Bar\",\n      \"Iridium Bar\",\n      \"Miner's Treat\",\n      \"Pepper Poppers\",\n      \"Radioactive Bar\",\n      \"Rhubarb Pie\",\n      \"Strawberry\"\n    ],\n    \"likes\": [\n      \"Chanterelle\",\n      \"Copper Bar\",\n      \"Iron Bar\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Oak Resin\",\n      \"Pine Tar\",\n      \"Purple Mushroom\",\n      \"Quartz\",\n      \"Radioactive Ore\"\n    ],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fruits (except Blackberry, Crystal Fruit, Fruit Tree Fruit, Salmonberry & Strawberry)\",\n      \"All Milk\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"Blackberry\", \"Common Mushroom\", \"Crystal Fruit\", \"Maple Syrup\", \"Salmonberry\"],\n    \"hates\": [\"Holly\", \"Honey\", \"Pickles\", \"Snow Yam\", \"Truffle\"]\n  },\n  {\n    \"id\": \"pam\",\n    \"name\": \"Pam\",\n    \"birthday\": {\n      \"day\": 18,\n      \"season\": \"spring\"\n    },\n    \"address\": \"Trailer\",\n    \"occupation\": \"Bus driver\",\n    \"description\": \"Pam is a villager who lives in the trailer west of the river in Pelican Town. She drives the Pelican Town bus, enabling access to the Calico Desert.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Pam sends a Cheese Cauliflower recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Pam mails you the Cheese Cauliflower recipe with a note: \\\"Here's the recipe for a little treat my pappy used to make. Cook it slow. -Pam\\\"\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Pam sends a Stuffing recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Pam mails you the Stuffing recipe with a note: \\\"Here's the recipe for a little treat my pappy used to make. Cook it slow. -Pam\\\"\"\n      },\n      {\n        \"heart\": 9,\n        \"id\": 503180,\n        \"description\": \"Pam reveals her struggles with drinking despite improved housing conditions after the community upgrade.\",\n        \"details\": \"Purchase the Community Upgrade from the Carpenter's Shop. After earning 9 hearts with Pam, enter Pam's house at least 4 days after the Community Upgrade is completed. You find Pam praying before a Sign of the Vessel statue. She confesses that she loves the new house, but hasn't been able to cut back on her drinking. She says she thought the new house would change everything, but it didn't, so she ordered the statue. \\\"I'm glad you're feeling hopeful\\\" (no effect). \\\"Sorry Pam, but Yoba isn't real...\\\" (-1000 friendship, Pam becomes angry and orders you to leave).\"\n      }\n    ],\n    \"image\": \"images/villagers/Pam.png\",\n    \"loves\": [\n      \"Beer\",\n      \"Cactus Fruit\",\n      \"Glazed Yams\",\n      \"Mead\",\n      \"Pale Ale\",\n      \"Parsnip\",\n      \"Parsnip Soup\",\n      \"Piña Colada\"\n    ],\n    \"likes\": [\"Daffodil\"],\n    \"neutrals\": [\n      \"All Fish (except Carp, Octopus, Snail & Squid)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Joja Cola\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"All Eggs\", \"Quartz\", \"Wild Horseradish\"],\n    \"hates\": [\"Holly\", \"Octopus\", \"Squid\"]\n  },\n  {\n    \"id\": \"penny\",\n    \"name\": \"Penny\",\n    \"birthday\": {\n      \"day\": 2,\n      \"season\": \"fall\"\n    },\n    \"address\": \"Trailer\",\n    \"occupation\": \"Tutor\",\n    \"description\": \"Penny is a villager who lives in Pelican Town and is one of the twelve characters available to marry. She is shy and modest, and likes to cook and read books from the local library.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 34,\n        \"description\": \"George struggles to reach his mailbox, and Penny helps him while the player observes.\",\n        \"details\": \"Enter Pelican Town on a sunny day between 9am and 2pm. George looks in his mailbox and can't reach a letter. Penny helps him get it, but George scolds her for seeing him helpless. The player can respond supportively (+50 friendship), critically (-50 friendship), or neutrally (no effect). George apologizes, and Penny reflects on aging.\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 35,\n        \"description\": \"Penny asks the player to help clean the trailer, but Pam returns home upset about strangers in their space.\",\n        \"details\": \"Enter the trailer when Penny is home. Penny asks the player to help clean the messy trailer. Pam returns and yells at Penny for letting a stranger clean. Pam eventually asks the player to leave, admitting embarrassment. The next day, the player receives an apology letter from Penny.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 36,\n        \"description\": \"Penny invites the player to taste a new recipe and suggests watching a movie together.\",\n        \"details\": \"Enter the trailer when Penny is home. Penny asks the player to try her invented recipe. The player can lie and praise it (+50 friendship), ask to take leftovers (-50 friendship), or comment on its rubbery texture (no effect). Regardless of choice, she invites the player to watch a movie together, and the player gains 165 energy.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 181928,\n        \"description\": \"Penny asks the player to be a guest speaker for Jas and Vincent's field trip, then inquires about their thoughts on parenthood.\",\n        \"details\": \"Enter Cindersap Forest on a sunny day between 9am and 4pm. Penny leads a field trip with Jas and Vincent. She requests the player be a guest speaker about countryside life. The player agrees (+10 friendship), agrees neutrally (no effect), or refuses harshly (-1500 friendship). If agreeing, dialogue options about parenting follow, each affecting friendship differently.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 38,\n        \"description\": \"Penny confesses romantic feelings for the player in the spa pool and shares a kiss.\",\n        \"details\": \"Receive a letter from Penny, then enter the spa pool area between 7pm and midnight. Penny confesses romantic feelings. The player can reciprocate (no friendship effect but triggers a kiss), or reject her (-1500 friendship, she bursts into tears).\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 4325434,\n        \"description\": \"Penny asks about redecorating the bedroom in one of three styles.\",\n        \"details\": \"Enter the farmhouse between 3pm and 7pm when Penny is home. Penny greets the player and offers bedroom redecoration in three styles: Forest and Moon, Strawberry Home, or Pirate Theme.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 4324303,\n        \"description\": \"The bedroom is redecorated in the chosen style with unique furniture.\",\n        \"details\": \"Three days later, the bedroom is redecorated in the chosen style. Each provides unique decorations unavailable elsewhere.\"\n      }\n    ],\n    \"image\": \"images/villagers/Penny.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Penny.png\",\n    \"loves\": [\n      \"Diamond\",\n      \"Emerald\",\n      \"Melon\",\n      \"Poppy\",\n      \"Poppyseed Muffin\",\n      \"Red Plate\",\n      \"Roots Platter\",\n      \"Sandfish\",\n      \"Tom Kha Soup\"\n    ],\n    \"likes\": [\"Dandelion\", \"Leek\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fruits (except Fruit Tree Fruit, Grape, Melon & Salmonberry)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\n      \"Algae Soup\",\n      \"Duck Feather\",\n      \"Pale Broth\",\n      \"Purple Mushroom\",\n      \"Quartz\",\n      \"Red Mushroom\",\n      \"Salmonberry\",\n      \"Wool\"\n    ],\n    \"hates\": [\n      \"Beer\",\n      \"Grape\",\n      \"Holly\",\n      \"Hops\",\n      \"Mead\",\n      \"Pale Ale\",\n      \"Piña Colada\",\n      \"Rabbit's Foot\",\n      \"Wine\"\n    ]\n  },\n  {\n    \"id\": \"pierre\",\n    \"name\": \"Pierre\",\n    \"birthday\": {\n      \"day\": 26,\n      \"season\": \"spring\"\n    },\n    \"address\": \"Pierre's General Store\",\n    \"occupation\": \"General store owner\",\n    \"description\": \"Pierre is a villager who lives in Pelican Town. He owns and runs Pierre's General Store.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Pierre sends a Blueberry Tart recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Pierre mails you the Blueberry Tart recipe with a note: \\\"TOP SECRET: Here's the recipe for my famous blueberry tart. Don't tell anyone! I'm giving it to you because we are such good friends. -Pierre\\\"\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 16,\n        \"description\": \"The player discovers Pierre's secret stash behind his bookshelf and must choose whether to keep his secret.\",\n        \"details\": \"Enter Pierre's General Store to trigger the cutscene. You enter Pierre's bedroom. After looking around, you find Pierre's secret stash behind the bookshelf. Pierre catches you and asks that you tell no one. \\\"Your secret is safe with me\\\" (+70 friendship). \\\"Your wife deserves to know about this\\\" (-500 friendship). Pierre says he has to find a new hiding spot.\"\n      }\n    ],\n    \"image\": \"images/villagers/Pierre.png\",\n    \"loves\": [\"Fried Calamari\", \"Price Catalogue\", \"Stardrop Tea\"],\n    \"likes\": [\"Daffodil\", \"Dandelion\"],\n    \"neutrals\": [\"All Fruits (except Fruit Tree Fruit & Salmonberry)\"],\n    \"dislikes\": [\n      \"All Foraged Minerals\",\n      \"All Gems (except Diamond & Prismatic Shard)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Salmonberry\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\"All Fish\", \"Corn\", \"Garlic\", \"Parsnip Soup\", \"Tortilla\"]\n  },\n  {\n    \"id\": \"robin\",\n    \"name\": \"Robin\",\n    \"birthday\": {\n      \"day\": 21,\n      \"season\": \"fall\"\n    },\n    \"address\": \"24 Mountain Road\",\n    \"occupation\": \"Carpenter\",\n    \"description\": \"Robin is a villager who resides at 24 Mountain Road with her husband Demetrius, daughter Maru, and son Sebastian.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 6,\n        \"id\": 33,\n        \"description\": \"Robin shares carpentry secrets and gives the player the Drum Block and Flute Block blueprints.\",\n        \"details\": \"Enter Robin's house while she is home. You find Robin cleaning the dust off her saw. She asks if you've ever made anything out of wood. She responds: \\\"I think we've become good enough friends that I can trust you with my carpentry secrets!\\\" and gives you two blueprints — the Drum Block and the Flute Block. She mentions it feels good to decorate your house with things you've made yourself.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Robin sends a Pumpkin Soup recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Robin mails you the Pumpkin Soup recipe with a note: \\\"Here is an old recipe that my grandma passed down to me. Enjoy! -Robin\\\"\"\n      }\n    ],\n    \"image\": \"images/villagers/Robin.png\",\n    \"loves\": [\"Goat Cheese\", \"Peach\", \"Spaghetti\", \"Woody's Secret\"],\n    \"likes\": [\"Hardwood\", \"Quartz\", \"Woodcutter's Weekly\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"dislikes\": [\"Wild Horseradish\"],\n    \"hates\": [\"Holly\"]\n  },\n  {\n    \"id\": \"sam\",\n    \"name\": \"Sam\",\n    \"birthday\": {\n      \"day\": 17,\n      \"season\": \"summer\"\n    },\n    \"address\": \"1 Willow Lane\",\n    \"occupation\": \"Musician\",\n    \"description\": \"Sam is a villager who lives in Pelican Town and is one of the twelve characters available to marry.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 44,\n        \"description\": \"Sam and Sebastian jam in his room, and the player is asked what music style the band should play.\",\n        \"details\": \"Enter Sam's house when he's there. Sam and Sebastian jam in Sam's room. Sam asks what music style you prefer from options like cheerful pop, experimental noise rock, hi-energy dance, or honky-tonky country. Regardless of choice, Sam says that's the style he's been considering. Sebastian agrees, and Sam thanks you.\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": 733330,\n        \"description\": \"Sam watches Vincent at the beach while reflecting on his absent father and seeking the player's advice.\",\n        \"details\": \"Visit the Beach on a sunny day between 7am-3pm, any season except winter (Year 1 only). Sam watches Vincent play in the sand. Vincent asks if their father will return. Sam reassures him, but later expresses guilt about giving false hope. You choose between \\\"honesty is best\\\" or \\\"kids need hope.\\\" Sam mentions the band progressing with Abigail as potential drummer.\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 46,\n        \"description\": \"Sam drops an egg in the kitchen and the player must decide what story to tell his mom.\",\n        \"details\": \"Enter Sam's house when he's there. In the kitchen, Sam drops an egg while getting you a snack. His mother Jodi enters upset. You choose: blame Sam (-10 friendship), blame yourself (+50 friendship), or claim Sam did it intentionally (-50 friendship). Sam later apologizes about the incident.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 45,\n        \"description\": \"Mayor Lewis catches Sam skateboarding on Emily and Haley's flower box and asks for the player's judgment.\",\n        \"details\": \"Enter town on a non-rainy day between noon-4pm. Sam grinds on Emily and Haley's flower box while skateboarding. Mayor Lewis confronts him. You can support Sam's skating lack of alternatives, criticize him for disrespecting property, or stay neutral.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 4081148,\n        \"description\": \"Sam invites the player to watch his band perform in Zuzu City.\",\n        \"details\": \"Sam visits your doorstep between 6am-8am (requires seeing Two Hearts event). Sam invites you to see his band perform in Zuzu City. Meet him at the bus stop between 4pm-7pm to watch the concert. He thanks you for inspiring the band's musical direction.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 233104,\n        \"description\": \"Sam confesses his feelings for the player in his bedroom while his mom unknowingly interrupts.\",\n        \"details\": \"After receiving Sam's letter, enter town on a sunny day between 8pm-midnight. Sam sneaks you into his room. He admits falling for you. His mother knocks; you hide in bed. She leaves after Sam claims he was exercising. You choose to get out of bed, move closer for a kiss, head for the window to reject him, or stay put for a kiss in bed.\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 3918600,\n        \"description\": \"Sam struggles with motivation after the band's success.\",\n        \"details\": \"Enter the upgraded farmhouse (2+ upgrades) between 6:10am-5pm when Sam is present. Sam feels lazy and seeks music-related work.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 3918601,\n        \"description\": \"Sam receives a job composing music for a children's TV show.\",\n        \"details\": \"Enter the farmhouse again. Sam receives a job offer creating music for The Happy Junimo Show. You encourage him professionally or sympathetically.\"\n      },\n      {\n        \"heart\": 14.3,\n        \"id\": 3918602,\n        \"description\": \"Sam completes the composing project.\",\n        \"details\": \"Enter the farmhouse again. Sam plays his acoustic composition, feeling optimistic about the work.\"\n      },\n      {\n        \"heart\": 14.4,\n        \"id\": 3918603,\n        \"description\": \"Sam gifts the player his boombox.\",\n        \"details\": \"Enter the farmhouse again. You, Vincent, and Jas watch the finished song on TV. Sam gives you his boombox as thanks for supporting him.\"\n      }\n    ],\n    \"image\": \"images/villagers/Sam.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Sam.png\",\n    \"loves\": [\"Cactus Fruit\", \"Maple Bar\", \"Pizza\", \"Tigerseye\"],\n    \"likes\": [\"Joja Cola\"],\n    \"neutrals\": [\"All Fruits (except Cactus Fruit, Fruit Tree Fruit & Salmonberry)\", \"All Milk\"],\n    \"dislikes\": [\n      \"All Vegetables (except Hops, Tea Leaves & Wheat)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Quartz\",\n      \"Salmonberry\",\n      \"Seaweed\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\n      \"Bone Fragment\",\n      \"Cinder Shard\",\n      \"Coal\",\n      \"Copper Bar\",\n      \"Duck Mayonnaise\",\n      \"Gold Bar\",\n      \"Gold Ore\",\n      \"Iridium Bar\",\n      \"Iridium Ore\",\n      \"Iron Bar\",\n      \"Mayonnaise\",\n      \"Pickles\",\n      \"Refined Quartz\"\n    ]\n  },\n  {\n    \"id\": \"sandy\",\n    \"name\": \"Sandy\",\n    \"birthday\": {\n      \"day\": 15,\n      \"season\": \"fall\"\n    },\n    \"address\": \"The Oasis\",\n    \"occupation\": \"Desert shopkeeper\",\n    \"description\": \"Sandy is a villager who operates the Oasis shop in the Calico Desert.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Sandy sends a Tom Kha Soup recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Sandy mails you the Tom Kha Soup recipe with a note: \\\"I was so bored out here in the desert that I wrote you a letter. There's a recipe for a delicious soup enclosed. Come visit me soon! -Sandy\\\"\"\n      }\n    ],\n    \"image\": \"images/villagers/Sandy.png\",\n    \"loves\": [\"Crocus\", \"Daffodil\", \"Mango Sticky Rice\", \"Sweet Pea\"],\n    \"likes\": [\"Quartz\", \"Wool\"],\n    \"neutrals\": [],\n    \"dislikes\": [],\n    \"hates\": [\"Holly\"]\n  },\n  {\n    \"id\": \"sebastian\",\n    \"name\": \"Sebastian\",\n    \"birthday\": {\n      \"day\": 10,\n      \"season\": \"winter\"\n    },\n    \"address\": \"24 Mountain Road\",\n    \"occupation\": \"Freelance programmer\",\n    \"description\": \"Sebastian is a villager who lives in the basement of 24 Mountain Road. He is one of the twelve characters available to marry.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 2794460,\n        \"description\": \"The player finds Sebastian working on his computer and learns about his freelance programming career.\",\n        \"details\": \"Enter Sebastian's room when he's there. Sebastian is working on his computer and asks you to wait. You can leave or stay put. He finishes and apologizes for the wait. You learn he does freelance programming work and is saving to move to the city. Robin interrupts mentioning Abigail will visit.\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 384883,\n        \"description\": \"Sebastian shows the player his motorcycle and suggests taking a ride together someday.\",\n        \"details\": \"Go to The Mountain between 11am and 5pm. Sebastian is working on his motorcycle in the garage. He explains it's his and he takes long rides alone away from town. He suggests you might ride with him sometime, offering different responses based on your reaction.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 27,\n        \"description\": \"Sebastian invites the player to play Solarion Chronicles: The Game with him and Sam.\",\n        \"details\": \"Enter Sebastian's room when he's there. Sebastian invites you to play Solarion Chronicles with him and Sam. You choose an archetype (Warrior, Healer, or Wizard) and play through a scenario. Correct choices lead to perfect scores, with different endings based on your class selection.\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 29,\n        \"description\": \"Sebastian meets the player at the beach on a rainy day and shares an umbrella, expressing comfort around them.\",\n        \"details\": \"Go to the beach on a rainy day between noon and 11pm. Sebastian is on the boardwalk, surprised to see you in the rain. He admits he's anxious around people but not with you. He pulls out an umbrella and invites you to stand under it together.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 384882,\n        \"description\": \"Sebastian takes the player on a motorcycle ride to his favorite spot and confesses his feelings.\",\n        \"details\": \"Go to The Mountain between 8pm and midnight. Sebastian invites you for a motorcycle ride to his favorite thinking spot overlooking the city. He confesses true feelings, mentioning he doesn't normally bring others there. You embrace under the full moon.\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 9333219,\n        \"description\": \"The player helps Sebastian rescue an injured frog.\",\n        \"details\": \"Go to The Mountain on a rainy day between 6am and 7pm. You help Sebastian rescue an injured frog from the bushes. He takes it home.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 9333220,\n        \"description\": \"Sebastian brings the frog home and creates a terrarium for it in his spouse room.\",\n        \"details\": \"The next day, Sebastian shows you a terrarium he built for the frog's recovery, discussing frog sanctuaries and expressing his newfound hobby.\"\n      }\n    ],\n    \"image\": \"images/villagers/Sebastian.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Sebastian.png\",\n    \"loves\": [\"Frog Egg\", \"Frozen Tear\", \"Obsidian\", \"Pumpkin Soup\", \"Sashimi\", \"Void Egg\"],\n    \"likes\": [\"Combat Quarterly\", \"Flounder\", \"Monster Compendium\", \"Quartz\"],\n    \"neutrals\": [\n      \"All Fish (except Carp, Flounder & Snail)\",\n      \"All Fruit (except Fruit Tree Fruit & Salmonberry)\",\n      \"All Milk\",\n      \"Jack Be Nimble, Jack Be Thick\"\n    ],\n    \"dislikes\": [\n      \"All Flowers (except Poppy)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Salmonberry\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\n      \"All Artisan Goods (except Coffee, Green Tea & Oil)\",\n      \"All Eggs (except Void Egg)\",\n      \"Clay\",\n      \"Complete Breakfast\",\n      \"Farmer's Lunch\",\n      \"Omelet\",\n      \"Piña Colada\"\n    ]\n  },\n  {\n    \"id\": \"shane\",\n    \"name\": \"Shane\",\n    \"birthday\": {\n      \"day\": 20,\n      \"season\": \"spring\"\n    },\n    \"address\": \"Marnie's Ranch\",\n    \"occupation\": \"JojaMart employee\",\n    \"description\": \"Shane is a villager who lives at Marnie's Ranch in Pelican Town. He is one of the twelve characters available to marry.\",\n    \"marriageable\": true,\n    \"hearts\": {\n      \"max\": 8,\n      \"bouquetIncrease\": 2,\n      \"spouseIncrease\": 4\n    },\n    \"events\": [\n      {\n        \"heart\": 2,\n        \"id\": 611944,\n        \"description\": \"Shane shares a beer with the player on a pond dock and discusses his depression.\",\n        \"details\": \"Enter Cindersap Forest between 8pm and midnight. Shane shares a beer with the player on the pond dock, describing his depression. He expresses optimism for the player's future and warns against heavy drinking. The beer heals up to 50 Energy and 22 Health, leaving the player with a Tipsy buff.\"\n      },\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Shane sends a Pepper Poppers recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Shane mails you the Pepper Poppers recipe with a note: \\\"I found this recipe in a magazine and I thought it sounded interesting. Feel free to give me a taste if you make it. hehe. -Shane\\\"\"\n      },\n      {\n        \"heart\": 4,\n        \"id\": 3910674,\n        \"description\": \"The player finds Shane passed out in his room surrounded by beer cans.\",\n        \"details\": \"Enter Marnie's Ranch at any time. Shane is found passed out in his room surrounded by empty beer cans. The player uses a watering can to wake him. Marnie expresses frustration about his drinking. Shane responds pessimistically about his future. Jas overhears and runs away crying; Shane falls to the ground apologizing.\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 3910975,\n        \"description\": \"Shane lies at a cliff's edge contemplating suicide; the player intervenes and he commits to seeking counseling.\",\n        \"details\": \"Enter Cindersap Forest between 9am and 8pm while storming or raining. Shane lies at the cliff's edge surrounded by empty beer cans, asking why he shouldn't jump off. Harvey then treats him medically and recommends counseling in Zuzu City. The next day, Shane visits the farm to announce his intention to seek counseling.\"\n      },\n      {\n        \"heart\": 6.8,\n        \"id\": 3910974,\n        \"description\": \"Shane tells Marnie he has been feeling happier and has switched to sparkling water instead of beer.\",\n        \"details\": \"Enter Marnie's Ranch while Shane is home after triggering the six heart event. Shane tells Marnie he's been feeling happier and has switched to sparkling water instead of beer. He explains he's learned to rely on others without feeling weak. He gives Jas expensive shoes, explaining he afforded them by cutting back on drinking expenses.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": 831125,\n        \"description\": \"Shane directs a Joja Cola advertisement scene starring Emily and Clint sends a Strange Bun recipe in the mail\",\n        \"details\": \"Enter town between 10am and 4pm on a sunny day (requires 2 hearts with both Emily and Clint). Shane films a Joja Cola advertisement scene with Emily and Clint. He explains a contest with a 10,000g prize and asks the player to walk behind the actors to make the scene feel natural. Shane mails you the Strange Bun recipe with a note: \\\"I found this recipe in a magazine and I thought it sounded interesting. Feel free to give me a taste if you make it. hehe. -Shane\\\"\"\n      },\n      {\n        \"heart\": 8,\n        \"id\": 3900074,\n        \"description\": \"Shane shows the player his hidden chicken coop with his prized blue chickens and white chicken named Charlie.\",\n        \"details\": \"Enter Marnie's Ranch while Shane is home. Jas leads the player through a normally-locked kitchen door. Shane is painting a Fresh Eggs sign, surrounded by his blue chickens and white chicken Charlie. He discusses passing chicken knowledge to Jas. Afterward, purchased chickens and hatched eggs have a 25% chance of being blue.\"\n      },\n      {\n        \"heart\": 10,\n        \"id\": 9581348,\n        \"description\": \"Shane takes the player to a gridball game in Zuzu City where he expresses gratitude and shares a kiss.\",\n        \"details\": \"Exit your house before 6:30am, then walk to the Bus Stop between 4pm and 6pm. Shane invites the player to a Zuzu City Tunnelers gridball game. At the stadium, he thanks the player for supporting him through depression and anxiety. After discussing the game, Shane kisses the player.\"\n      },\n      {\n        \"heart\": 14.1,\n        \"id\": 3917584,\n        \"description\": \"The player discovers Shane has replaced drinking beer with playing arcade games.\",\n        \"details\": \"Enter town on a non-Friday between 8am and 5pm. Marnie, Jas, and the player are outside the saloon. Shane exits saying he hasn't had a session like that in a while. Marnie expresses concern.\"\n      },\n      {\n        \"heart\": 14.2,\n        \"id\": 3917585,\n        \"description\": \"Shane continues managing his anxiety through arcade games.\",\n        \"details\": \"Enter town anytime the next day. Shane exits; the player confronts him about drinking. Shane gets upset denying the accusation and runs home.\"\n      },\n      {\n        \"heart\": 14.3,\n        \"id\": 3917586,\n        \"description\": \"Shane reflects on his progress managing anxiety without alcohol.\",\n        \"details\": \"Enter town anytime the following day. Marnie and the player wait outside. Shane enters; they catch him at an arcade machine. He explains the cans are Joja Cola, not beer, and that video games help manage drinking urges.\"\n      }\n    ],\n    \"image\": \"images/villagers/Shane.png\",\n    \"spouseImage\": \"images/villagers/spouse-portraits/Shane.png\",\n    \"loves\": [\"Beer\", \"Hot Pepper\", \"Pepper Poppers\", \"Pizza\"],\n    \"likes\": [],\n    \"neutrals\": [\"All Milk\", \"Strange Bun\"],\n    \"dislikes\": [\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Seaweed\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\"Pickles\", \"Quartz\"]\n  },\n  {\n    \"id\": \"vincent\",\n    \"name\": \"Vincent\",\n    \"birthday\": {\n      \"day\": 10,\n      \"season\": \"spring\"\n    },\n    \"address\": \"1 Willow Lane\",\n    \"occupation\": \"Child\",\n    \"description\": \"Vincent is a young villager who lives in Pelican Town. He can often be found with his best friend Jas.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 8,\n        \"id\": 3910979,\n        \"description\": \"Vincent and Jas teach the player how to clean Spring Onions, permanently increasing their sell price by 5x.\",\n        \"details\": \"Enter Cindersap Forest during Spring on a sunny day between 6am and 5pm after reaching 8 hearts with both Vincent and Jas. Vincent will explain how to clean Spring Onions by removing insects. Jas insists that the insects not be killed after removing them from the onions. Afterward, the player gains Spring Onion Mastery, which permanently increases the sell price of Spring Onions by 5x.\"\n      }\n    ],\n    \"image\": \"images/villagers/Vincent.png\",\n    \"loves\": [\"Cranberry Candy\", \"Frog Egg\", \"Ginger Ale\", \"Grape\", \"Pink Cake\", \"Snail\"],\n    \"likes\": [\"Coconut\", \"Daffodil\"],\n    \"neutrals\": [],\n    \"dislikes\": [\n      \"All Eggs\",\n      \"All Fruit (except Coconut, Grape & Fruit Tree Fruit)\",\n      \"All Vegetables (except Hops, Tea Leaves & Wheat)\",\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Purple Mushroom\",\n      \"Quartz\",\n      \"Snow Yam\",\n      \"Winter Root\"\n    ],\n    \"hates\": [\n      \"All Artisan Goods (except Honey, Jelly & Oil)\",\n      \"Beer\",\n      \"Clay\",\n      \"Coffee\",\n      \"Mead\",\n      \"Pale Ale\",\n      \"Piña Colada\",\n      \"Triple Shot Espresso\",\n      \"Wild Horseradish\",\n      \"Wine\"\n    ]\n  },\n  {\n    \"id\": \"willy\",\n    \"name\": \"Willy\",\n    \"birthday\": {\n      \"day\": 24,\n      \"season\": \"summer\"\n    },\n    \"address\": \"The Beach\",\n    \"occupation\": \"Fisher and shopkeeper\",\n    \"description\": \"Willy is a villager who lives south of Pelican Town on the beach. He operates a fishing supply shop.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 3,\n        \"id\": null,\n        \"description\": \"Willy sends a Chowder recipe in the mail.\",\n        \"details\": \"After reaching 3 hearts, Willy mails you the Chowder recipe with a note: \\\"I'd like to share an ol' cooking recipe my pappy used to make. It's important the fish is FRESH. -Willy\\\"\"\n      },\n      {\n        \"heart\": 5,\n        \"id\": null,\n        \"description\": \"Willy sends an Escargot recipe in the mail.\",\n        \"details\": \"After reaching 5 hearts, Willy mails you the Escargot recipe with a note: \\\"I'd like to share an ol' cooking recipe my pappy used to make. It's important the fish is FRESH. -Willy\\\"\"\n      },\n      {\n        \"heart\": 6,\n        \"id\": 711130,\n        \"description\": \"Willy asks for help when crabs overrun his fish shop, and Gus purchases them all.\",\n        \"details\": \"Enter The Beach between 6am and 5:10pm. Willy greets you outside the Fish Shop and says he needs your help. Once inside, you see crabs run amok, covering the Fish Shop floor. Before you can help, Gus enters and offers to purchase all the crabs, minus a discount for the labor involved. Willy agrees, and Gus gathers the crabs. Gus turns to you and says he's going to run a special on Crab Cakes for the next few days. The cutscene ends with Willy saying goodbye to his sweet ladies as they are taken away. Gus sells unlimited Crab Cakes at the Saloon for 550g each for 3 days after.\"\n      },\n      {\n        \"heart\": 7,\n        \"id\": null,\n        \"description\": \"Willy sends a Fish Stew recipe in the mail.\",\n        \"details\": \"After reaching 7 hearts, Willy mails you the Fish Stew recipe with a note: \\\"I'd like to share an ol' cooking recipe my pappy used to make. It's important the fish is FRESH. -Willy\\\"\"\n      },\n      {\n        \"heart\": 9,\n        \"id\": null,\n        \"description\": \"Willy sends a Lobster Bisque recipe in the mail.\",\n        \"details\": \"After reaching 9 hearts, Willy mails you the Lobster Bisque recipe with a note: \\\"I'd like to share an ol' cooking recipe my pappy used to make. It's important the fish is FRESH. -Willy\\\"\"\n      }\n    ],\n    \"image\": \"images/villagers/Willy.png\",\n    \"loves\": [\n      \"Catfish\",\n      \"Diamond\",\n      \"Gold Bar\",\n      \"Iridium Bar\",\n      \"Jewels of the Sea\",\n      \"Mead\",\n      \"Octopus\",\n      \"Pumpkin\",\n      \"Sea Cucumber\",\n      \"Sturgeon\",\n      \"The Art O' Crabbing\"\n    ],\n    \"likes\": [\"Coffee\", \"Quartz\"],\n    \"neutrals\": [\n      \"All Eggs (except Void Egg)\",\n      \"All Fish (except Carp, Catfish, Lingcod, Octopus, Sea Cucumber, Snail, Sturgeon & Tiger Trout)\",\n      \"All Fruits (except Fruit Tree Fruit & Salmonberry)\",\n      \"All Milk\",\n      \"Dish O' The Sea\",\n      \"Maki Roll\",\n      \"Mutant Carp\",\n      \"Sashimi\"\n    ],\n    \"dislikes\": [\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Life Elixir\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Most Cooked Dishes (except Baked Fish, Bread, Carp Surprise, Chowder, Crab Cakes, Crispy Bass, Dish O' The Sea, Escargot, Fish Stew, Fish Taco, Fried Calamari, Fried Eel, Fried Egg, Lobster Bisque, Maki Roll, Salmon Dinner, Sashimi, Strange Bun & Trout Soup)\",\n      \"Purple Mushroom\",\n      \"Salmonberry\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": []\n  },\n  {\n    \"id\": \"wizard\",\n    \"name\": \"Wizard\",\n    \"birthday\": {\n      \"day\": 17,\n      \"season\": \"winter\"\n    },\n    \"address\": \"Wizard's Tower\",\n    \"occupation\": \"Wizard\",\n    \"description\": \"The Wizard, also known as M. Rasmodius, is a villager who lives in the Wizard's Tower to the far west of Cindersap Forest.\",\n    \"marriageable\": false,\n    \"hearts\": {\n      \"max\": 10,\n      \"bouquetIncrease\": 0,\n      \"spouseIncrease\": 0\n    },\n    \"events\": [\n      {\n        \"heart\": 4,\n        \"id\": null,\n        \"description\": \"The player gains access to the Wizard's Tower basement and the Shrine of Illusions.\",\n        \"details\": \"After reaching 4 hearts with the Wizard, the player gains access to the basement of the Wizard's Tower. The basement contains the Shrine of Illusions, which allows the player to change their character's appearance for 500g.\"\n      }\n    ],\n    \"image\": \"images/villagers/Wizard.png\",\n    \"loves\": [\n      \"Book of Mysteries\",\n      \"Purple Mushroom\",\n      \"Solar Essence\",\n      \"Super Cucumber\",\n      \"Void Essence\"\n    ],\n    \"likes\": [\"Iridium Bar\", \"Quartz\"],\n    \"neutrals\": [\"All Fruits (except Fruit Tree Fruit & Salmonberry)\"],\n    \"dislikes\": [\n      \"Chanterelle\",\n      \"Common Mushroom\",\n      \"Daffodil\",\n      \"Dandelion\",\n      \"Ginger\",\n      \"Hazelnut\",\n      \"Holly\",\n      \"Leek\",\n      \"Magma Cap\",\n      \"Morel\",\n      \"Salmonberry\",\n      \"Slime\",\n      \"Snow Yam\",\n      \"Wild Horseradish\",\n      \"Winter Root\"\n    ],\n    \"hates\": []\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport villagerData from '@/data/villagers.json';\nimport { Season, Villager } from '@/types';\n\nconst villagersData: Villager[] = villagerData as Villager[];\n\n/** Query builder for villager data. All filter and sort methods return a new VillagerQuery for chaining. */\nexport class VillagerQuery extends QueryBase<Villager> {\n  constructor(data: Villager[] = villagersData) {\n    super(data);\n  }\n\n  /** Filter to villagers who can be married or become roommates. */\n  marriageable(): VillagerQuery {\n    return new VillagerQuery(this.data.filter((v) => v.marriageable));\n  }\n\n  /** Filter to villagers with a birthday in the given season. Excludes `'ginger island'`. */\n  byBirthdaySeason(season: Exclude<Season, 'ginger island'>): VillagerQuery {\n    return new VillagerQuery(this.data.filter((v) => v.birthday.season === season));\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): VillagerQuery {\n    return new VillagerQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n\n  /** Sort by birthday in calendar order (spring → winter, day 1 → 28). */\n  sortByBirthday(): VillagerQuery {\n    const seasonOrder: Record<string, number> = { spring: 0, summer: 1, fall: 2, winter: 3 };\n    return new VillagerQuery(\n      [...this.data].sort((a, b) => {\n        const seasonDiff = seasonOrder[a.birthday.season] - seasonOrder[b.birthday.season];\n        return seasonDiff !== 0 ? seasonDiff : a.birthday.day - b.birthday.day;\n      }),\n    );\n  }\n}\n\n/** Returns a VillagerQuery for all villager data. Pass `source` to wrap a pre-filtered array. */\nexport function villagers(source: Villager[] = villagersData): VillagerQuery {\n  return new VillagerQuery(source);\n}\n","[\n  {\n    \"id\": \"sunny\",\n    \"name\": \"Sunny\",\n    \"description\": \"It's going to be clear and sunny all day.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"image\": \"images/weather/Sun.png\",\n    \"watersCrops\": false,\n    \"special\": false\n  },\n  {\n    \"id\": \"rain\",\n    \"name\": \"Rain\",\n    \"description\": \"It's going to rain all day tomorrow.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\"],\n    \"image\": \"images/weather/Rain.png\",\n    \"watersCrops\": true,\n    \"special\": false\n  },\n  {\n    \"id\": \"storm\",\n    \"name\": \"Storm\",\n    \"description\": \"Looks like a storm is approaching. Thunder and lightning is expected.\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\"],\n    \"image\": \"images/weather/Storm.png\",\n    \"watersCrops\": true,\n    \"special\": false\n  },\n  {\n    \"id\": \"snow\",\n    \"name\": \"Snow\",\n    \"description\": \"Expect a few inches of snow tomorrow.\",\n    \"seasons\": [\"winter\"],\n    \"image\": \"images/weather/Snow.png\",\n    \"watersCrops\": false,\n    \"special\": false\n  },\n  {\n    \"id\": \"wind-spring\",\n    \"name\": \"Wind (Spring)\",\n    \"description\": \"Partially cloudy with a light breeze. Expect lots of pollen!\",\n    \"seasons\": [\"spring\"],\n    \"image\": \"images/weather/Wind Spring.png\",\n    \"watersCrops\": false,\n    \"special\": false\n  },\n  {\n    \"id\": \"wind-fall\",\n    \"name\": \"Wind (Fall)\",\n    \"description\": \"It's going to be cloudy, with gusts of wind throughout the day.\",\n    \"seasons\": [\"fall\"],\n    \"image\": \"images/weather/Wind Fall.png\",\n    \"watersCrops\": false,\n    \"special\": false\n  },\n  {\n    \"id\": \"green-rain\",\n    \"name\": \"Green Rain\",\n    \"description\": \"Um... There appears to be some kind of... anomalous reading... I... don't know what this means...\",\n    \"seasons\": [\"summer\"],\n    \"image\": \"images/weather/Green Rain.png\",\n    \"watersCrops\": true,\n    \"special\": true\n  },\n  {\n    \"id\": \"festival\",\n    \"name\": \"Festival\",\n    \"description\": \"It's going to be clear and sunny tomorrow... perfect weather for the Festival!\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"image\": \"images/weather/Festival.png\",\n    \"watersCrops\": false,\n    \"special\": true\n  },\n  {\n    \"id\": \"wedding\",\n    \"name\": \"Wedding\",\n    \"description\": \"It's going to be a beautiful day for a wedding!\",\n    \"seasons\": [\"spring\", \"summer\", \"fall\", \"winter\"],\n    \"image\": \"images/weather/Wedding.png\",\n    \"watersCrops\": false,\n    \"special\": true\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/weather.json';\nimport { Season, Weather } from '@/types';\n\nconst weatherData: Weather[] = data as Weather[];\n\n/** Query builder for weather data. All filter methods return a new WeatherQuery for chaining. */\nexport class WeatherQuery extends QueryBase<Weather> {\n  constructor(data: Weather[] = weatherData) {\n    super(data);\n  }\n\n  /** Filter to weather events that can occur in the given season. */\n  bySeason(season: Season): WeatherQuery {\n    return new WeatherQuery(this.data.filter((w) => w.seasons.includes(season)));\n  }\n\n  /** Filter to weather events that water crops when they occur. */\n  watersCrops(): WeatherQuery {\n    return new WeatherQuery(this.data.filter((w) => w.watersCrops));\n  }\n\n  /** Filter to special weather events (e.g. Green Rain, Storm). */\n  special(): WeatherQuery {\n    return new WeatherQuery(this.data.filter((w) => w.special));\n  }\n}\n\n/** Returns a WeatherQuery for all weather data. Pass `source` to wrap a pre-filtered array. */\nexport function weather(source: Weather[] = weatherData): WeatherQuery {\n  return new WeatherQuery(source);\n}\n","[\n  {\n    \"id\": \"speed\",\n    \"name\": \"Speed\",\n    \"description\": \"Speed is separate from player speed. This speed only influences Attack Frequency. The displayed speed is applied as a modifier to the weapon's base speed, which varies by weapon type.\",\n    \"image\": \"images/weapons/stats/Speed.png\"\n  },\n  {\n    \"id\": \"defense\",\n    \"name\": \"Defense\",\n    \"description\": \"Defense is a statistic that affects how much damage the player takes.\",\n    \"image\": \"images/weapons/stats/Defense.png\"\n  },\n  {\n    \"id\": \"weight\",\n    \"name\": \"Weight\",\n    \"description\": \"The Weight of a weapon affects how far an enemy will be knocked back.\",\n    \"image\": \"images/weapons/stats/Weight.png\"\n  },\n  {\n    \"id\": \"crit-chance\",\n    \"name\": \"Crit. Chance\",\n    \"description\": \"The Crit. Chance of a weapon affects the likelihood to perform a critical strike with increased damage.\",\n    \"image\": \"images/weapons/stats/Crit. Chance.png\"\n  },\n  {\n    \"id\": \"crit-power\",\n    \"name\": \"Crit. Power\",\n    \"description\": \"When you hit a critical strike, this statistic will add additional damage to your enemy.\",\n    \"image\": \"images/weapons/stats/Crit. Power.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport weaponStatData from '@/data/weapon-stats.json';\nimport { WeaponStat } from '@/types';\n\nconst weaponStatsData: WeaponStat[] = weaponStatData as WeaponStat[];\n\n/** Query builder for weapon stat data (Speed, Defense, Weight, Crit. Chance, Crit. Power). All sort methods return a new WeaponStatQuery for chaining. */\nexport class WeaponStatQuery extends QueryBase<WeaponStat> {\n  constructor(data: WeaponStat[] = weaponStatsData) {\n    super(data);\n  }\n\n  /** Sort alphabetically by name. Default: `'asc'`. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): WeaponStatQuery {\n    return new WeaponStatQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name),\n      ),\n    );\n  }\n}\n\n/** Returns a WeaponStatQuery for all weapon stat data. Pass `source` to wrap a pre-filtered array. */\nexport function weaponStats(source: WeaponStat[] = weaponStatsData): WeaponStatQuery {\n  return new WeaponStatQuery(source);\n}\n","{\n  \"itemsShipped\": [\n    \"16\",\n    \"18\",\n    \"20\",\n    \"22\",\n    \"24\",\n    \"78\",\n    \"88\",\n    \"90\",\n    \"91\",\n    \"92\",\n    \"174\",\n    \"176\",\n    \"180\",\n    \"182\",\n    \"184\",\n    \"186\",\n    \"188\",\n    \"190\",\n    \"192\",\n    \"248\",\n    \"250\",\n    \"252\",\n    \"254\",\n    \"256\",\n    \"257\",\n    \"258\",\n    \"259\",\n    \"260\",\n    \"262\",\n    \"264\",\n    \"266\",\n    \"268\",\n    \"270\",\n    \"271\",\n    \"272\",\n    \"274\",\n    \"276\",\n    \"278\",\n    \"280\",\n    \"281\",\n    \"282\",\n    \"283\",\n    \"284\",\n    \"289\",\n    \"296\",\n    \"300\",\n    \"303\",\n    \"304\",\n    \"305\",\n    \"306\",\n    \"307\",\n    \"308\",\n    \"330\",\n    \"334\",\n    \"335\",\n    \"336\",\n    \"337\",\n    \"338\",\n    \"340\",\n    \"342\",\n    \"344\",\n    \"346\",\n    \"348\",\n    \"350\",\n    \"376\",\n    \"378\",\n    \"380\",\n    \"382\",\n    \"384\",\n    \"386\",\n    \"388\",\n    \"390\",\n    \"392\",\n    \"393\",\n    \"394\",\n    \"396\",\n    \"397\",\n    \"398\",\n    \"399\",\n    \"400\",\n    \"402\",\n    \"404\",\n    \"406\",\n    \"408\",\n    \"410\",\n    \"412\",\n    \"414\",\n    \"416\",\n    \"417\",\n    \"418\",\n    \"420\",\n    \"421\",\n    \"422\",\n    \"424\",\n    \"426\",\n    \"428\",\n    \"430\",\n    \"432\",\n    \"433\",\n    \"436\",\n    \"438\",\n    \"440\",\n    \"442\",\n    \"444\",\n    \"445\",\n    \"446\",\n    \"447\",\n    \"454\",\n    \"459\",\n    \"591\",\n    \"593\",\n    \"595\",\n    \"597\",\n    \"613\",\n    \"614\",\n    \"634\",\n    \"635\",\n    \"636\",\n    \"637\",\n    \"638\",\n    \"684\",\n    \"709\",\n    \"724\",\n    \"725\",\n    \"726\",\n    \"766\",\n    \"767\",\n    \"768\",\n    \"769\",\n    \"771\",\n    \"787\",\n    \"807\",\n    \"812\",\n    \"814\",\n    \"815\",\n    \"829\",\n    \"830\",\n    \"832\",\n    \"834\",\n    \"848\",\n    \"851\",\n    \"881\",\n    \"909\",\n    \"910\",\n    \"SmokedFish\",\n    \"Moss\",\n    \"MysticSyrup\",\n    \"Raisins\",\n    \"DriedFruit\",\n    \"DriedMushrooms\",\n    \"Carrot\",\n    \"SummerSquash\",\n    \"Broccoli\",\n    \"Powdermelon\"\n  ],\n  \"fish\": [\n    \"128\",\n    \"129\",\n    \"130\",\n    \"131\",\n    \"132\",\n    \"136\",\n    \"137\",\n    \"138\",\n    \"139\",\n    \"140\",\n    \"141\",\n    \"142\",\n    \"143\",\n    \"144\",\n    \"145\",\n    \"146\",\n    \"147\",\n    \"148\",\n    \"149\",\n    \"150\",\n    \"151\",\n    \"152\",\n    \"153\",\n    \"154\",\n    \"155\",\n    \"156\",\n    \"157\",\n    \"158\",\n    \"159\",\n    \"160\",\n    \"161\",\n    \"162\",\n    \"163\",\n    \"164\",\n    \"165\",\n    \"267\",\n    \"269\",\n    \"372\",\n    \"682\",\n    \"698\",\n    \"699\",\n    \"700\",\n    \"701\",\n    \"702\",\n    \"704\",\n    \"705\",\n    \"706\",\n    \"707\",\n    \"708\",\n    \"715\",\n    \"716\",\n    \"717\",\n    \"718\",\n    \"719\",\n    \"720\",\n    \"721\",\n    \"722\",\n    \"723\",\n    \"734\",\n    \"775\",\n    \"795\",\n    \"796\",\n    \"798\",\n    \"799\",\n    \"800\",\n    \"836\",\n    \"837\",\n    \"838\",\n    \"RiverJelly\",\n    \"CaveJelly\",\n    \"SeaJelly\",\n    \"Goby\"\n  ],\n  \"artifacts\": [\n    \"96\",\n    \"97\",\n    \"98\",\n    \"99\",\n    \"100\",\n    \"101\",\n    \"103\",\n    \"104\",\n    \"105\",\n    \"106\",\n    \"107\",\n    \"108\",\n    \"109\",\n    \"110\",\n    \"111\",\n    \"112\",\n    \"113\",\n    \"114\",\n    \"115\",\n    \"116\",\n    \"117\",\n    \"118\",\n    \"119\",\n    \"120\",\n    \"121\",\n    \"122\",\n    \"123\",\n    \"124\",\n    \"125\",\n    \"126\",\n    \"127\",\n    \"579\",\n    \"580\",\n    \"581\",\n    \"582\",\n    \"583\",\n    \"584\",\n    \"585\",\n    \"586\",\n    \"587\",\n    \"588\",\n    \"589\"\n  ],\n  \"minerals\": [\n    \"60\",\n    \"62\",\n    \"64\",\n    \"66\",\n    \"68\",\n    \"70\",\n    \"72\",\n    \"74\",\n    \"80\",\n    \"82\",\n    \"84\",\n    \"86\",\n    \"538\",\n    \"539\",\n    \"540\",\n    \"541\",\n    \"542\",\n    \"543\",\n    \"544\",\n    \"545\",\n    \"546\",\n    \"547\",\n    \"548\",\n    \"549\",\n    \"550\",\n    \"551\",\n    \"552\",\n    \"553\",\n    \"554\",\n    \"555\",\n    \"556\",\n    \"557\",\n    \"558\",\n    \"559\",\n    \"560\",\n    \"561\",\n    \"562\",\n    \"563\",\n    \"564\",\n    \"565\",\n    \"566\",\n    \"567\",\n    \"568\",\n    \"569\",\n    \"570\",\n    \"571\",\n    \"572\",\n    \"573\",\n    \"574\",\n    \"575\",\n    \"576\",\n    \"577\",\n    \"578\"\n  ],\n  \"cooking\": [\n    \"Fried Egg\",\n    \"Omelet\",\n    \"Salad\",\n    \"Cheese Cauliflower\",\n    \"Baked Fish\",\n    \"Parsnip Soup\",\n    \"Vegetable Medley\",\n    \"Complete Breakfast\",\n    \"Fried Calamari\",\n    \"Strange Bun\",\n    \"Lucky Lunch\",\n    \"Fried Mushroom\",\n    \"Pizza\",\n    \"Bean Hotpot\",\n    \"Glazed Yams\",\n    \"Carp Surprise\",\n    \"Hashbrowns\",\n    \"Pancakes\",\n    \"Salmon Dinner\",\n    \"Fish Taco\",\n    \"Crispy Bass\",\n    \"Pepper Poppers\",\n    \"Bread\",\n    \"Tom Kha Soup\",\n    \"Trout Soup\",\n    \"Chocolate Cake\",\n    \"Pink Cake\",\n    \"Rhubarb Pie\",\n    \"Cookie\",\n    \"Spaghetti\",\n    \"Fried Eel\",\n    \"Spicy Eel\",\n    \"Sashimi\",\n    \"Maki Roll\",\n    \"Tortilla\",\n    \"Red Plate\",\n    \"Eggplant Parmesan\",\n    \"Rice Pudding\",\n    \"Ice Cream\",\n    \"Blueberry Tart\",\n    \"Autumn's Bounty\",\n    \"Pumpkin Soup\",\n    \"Super Meal\",\n    \"Cranberry Sauce\",\n    \"Stuffing\",\n    \"Farmer's Lunch\",\n    \"Survival Burger\",\n    \"Dish O' The Sea\",\n    \"Miner's Treat\",\n    \"Roots Platter\",\n    \"Triple Shot Espresso\",\n    \"Seafoam Pudding\",\n    \"Algae Soup\",\n    \"Pale Broth\",\n    \"Plum Pudding\",\n    \"Artichoke Dip\",\n    \"Stir Fry\",\n    \"Roasted Hazelnuts\",\n    \"Pumpkin Pie\",\n    \"Radish Salad\",\n    \"Fruit Salad\",\n    \"Blackberry Cobbler\",\n    \"Cranberry Candy\",\n    \"Coleslaw\",\n    \"Fiddlehead Risotto\",\n    \"Poppyseed Muffin\",\n    \"Bruschetta\",\n    \"Chowder\",\n    \"Fish Stew\",\n    \"Escargot\",\n    \"Lobster Bisque\",\n    \"Maple Bar\",\n    \"Crab Cakes\",\n    \"Shrimp Cocktail\",\n    \"Ginger Ale\",\n    \"Banana Pudding\",\n    \"Mango Sticky Rice\",\n    \"Poi\",\n    \"Tropical Curry\",\n    \"Squid Ink Ravioli\",\n    \"Moss Soup\"\n  ],\n  \"crafting\": [\n    \"Bomb\",\n    \"Cherry Bomb\",\n    \"Mega Bomb\",\n    \"Gate\",\n    \"Hardwood Fence\",\n    \"Iron Fence\",\n    \"Stone Fence\",\n    \"Wood Fence\",\n    \"Big Chest\",\n    \"Big Stone Chest\",\n    \"Chest\",\n    \"Stone Chest\",\n    \"Dark Sign\",\n    \"Stone Sign\",\n    \"Text Sign\",\n    \"Wood Sign\",\n    \"Bee House\",\n    \"Cask\",\n    \"Cheese Press\",\n    \"Dehydrator\",\n    \"Fish Smoker\",\n    \"Keg\",\n    \"Loom\",\n    \"Mayonnaise Machine\",\n    \"Oil Maker\",\n    \"Preserves Jar\",\n    \"Bait Maker\",\n    \"Bone Mill\",\n    \"Charcoal Kiln\",\n    \"Crystalarium\",\n    \"Deluxe Worm Bin\",\n    \"Furnace\",\n    \"Geode Crusher\",\n    \"Heavy Furnace\",\n    \"Heavy Tapper\",\n    \"Lightning Rod\",\n    \"Mushroom Log\",\n    \"Ostrich Incubator\",\n    \"Recycling Machine\",\n    \"Seed Maker\",\n    \"Slime Egg-Press\",\n    \"Slime Incubator\",\n    \"Tapper\",\n    \"Worm Bin\",\n    \"Iridium Sprinkler\",\n    \"Quality Sprinkler\",\n    \"Sprinkler\",\n    \"Barrel Brazier\",\n    \"Campfire\",\n    \"Carved Brazier\",\n    \"Gold Brazier\",\n    \"Iron Lamp-post\",\n    \"Jack-O-Lantern\",\n    \"Marble Brazier\",\n    \"Skull Brazier\",\n    \"Stone Brazier\",\n    \"Stump Brazier\",\n    \"Torch\",\n    \"Wood Lamp-post\",\n    \"Wooden Brazier\",\n    \"Deluxe Scarecrow\",\n    \"Garden Pot\",\n    \"Hopper\",\n    \"Scarecrow\",\n    \"Tub o' Flowers\",\n    \"Wicked Statue\",\n    \"Drum Block\",\n    \"Flute Block\",\n    \"Glowstone Ring\",\n    \"Iridium Band\",\n    \"Ring of Yoba\",\n    \"Sturdy Ring\",\n    \"Thorns Ring\",\n    \"Warrior Ring\",\n    \"Bait\",\n    \"Barbed Hook\",\n    \"Challenge Bait\",\n    \"Cork Bobber\",\n    \"Crab Pot\",\n    \"Deluxe Bait\",\n    \"Dressed Spinner\",\n    \"Magic Bait\",\n    \"Magnet\",\n    \"Quality Bobber\",\n    \"Sonar Bobber\",\n    \"Spinner\",\n    \"Trap Bobber\",\n    \"Treasure Hunter\",\n    \"Wild Bait\",\n    \"Brick Floor\",\n    \"Crystal Floor\",\n    \"Rustic Plank Floor\",\n    \"Stone Floor\",\n    \"Stone Walkway Floor\",\n    \"Straw Floor\",\n    \"Weathered Floor\",\n    \"Wood Floor\",\n    \"Cobblestone Path\",\n    \"Crystal Path\",\n    \"Gravel Path\",\n    \"Stepping Stone Path\",\n    \"Wood Path\",\n    \"Ancient Seeds\",\n    \"Basic Fertilizer\",\n    \"Basic Retaining Soil\",\n    \"Blue Grass Starter\",\n    \"Deluxe Fertilizer\",\n    \"Deluxe Retaining Soil\",\n    \"Deluxe Speed-Gro\",\n    \"Fiber Seeds\",\n    \"Grass Starter\",\n    \"Hyper Speed-Gro\",\n    \"Mystic Tree Seed\",\n    \"Quality Fertilizer\",\n    \"Quality Retaining Soil\",\n    \"Speed-Gro\",\n    \"Tea Sapling\",\n    \"Tree Fertilizer\",\n    \"Wild Seeds (Fa)\",\n    \"Wild Seeds (Sp)\",\n    \"Wild Seeds (Su)\",\n    \"Wild Seeds (Wi)\",\n    \"Cookout Kit\",\n    \"Rain Totem\",\n    \"Tent Kit\",\n    \"Treasure Totem\",\n    \"Warp Totem: Beach\",\n    \"Warp Totem: Desert\",\n    \"Warp Totem: Farm\",\n    \"Warp Totem: Island\",\n    \"Warp Totem: Mountains\",\n    \"Field Snack\",\n    \"Bug Steak\",\n    \"Explosive Ammo\",\n    \"Fairy Dust\",\n    \"Life Elixir\",\n    \"Monster Musk\",\n    \"Oil Of Garlic\",\n    \"Anvil\",\n    \"Farm Computer\",\n    \"Mini-Forge\",\n    \"Mini-Jukebox\",\n    \"Mini-Obelisk\",\n    \"Solar Panel\",\n    \"Staircase\",\n    \"Statue Of Blessings\",\n    \"Statue Of The Dwarf King\",\n    \"Transmute (Au)\",\n    \"Transmute (Fe)\"\n  ]\n}\n","import { QueryBase } from '@/common/query-base';\nimport animalsData from '@/data/animals.json';\nimport artifactsData from '@/data/artifacts.json';\nimport artisanGoodsData from '@/data/artisan-goods.json';\nimport collectionsData from '@/data/collections.json';\nimport cookingData from '@/data/cooking.json';\nimport craftingData from '@/data/crafting.json';\nimport cropsData from '@/data/crops.json';\nimport fishData from '@/data/fish.json';\nimport forageablesData from '@/data/forageables.json';\nimport mineralsData from '@/data/minerals.json';\nimport monsterLootData from '@/data/monster-loot.json';\nimport treesData from '@/data/trees.json';\nimport { CollectionItem } from '@/types';\n\n// ---------------------------------------------------------------------------\n// Lookup: id → CollectionItem, built from all data modules at load time.\n// Items in collections.json that are not found here will be silently skipped.\n// ---------------------------------------------------------------------------\n\nfunction buildLookup(): Map<string, CollectionItem> {\n  const map = new Map<string, CollectionItem>();\n\n  const add = (item: { id: string; name: string; image: string }) => {\n    if (!map.has(item.id)) map.set(item.id, { id: item.id, name: item.name, image: item.image });\n  };\n\n  for (const item of artifactsData) add(item);\n  for (const item of mineralsData) add(item as { id: string; name: string; image: string });\n  for (const item of fishData as { id: string; name: string; image: string }[]) add(item);\n  for (const item of cookingData) add(item);\n  for (const item of forageablesData as { id: string; name: string; image: string }[]) add(item);\n  for (const item of cropsData as { id: string; name: string; image: string }[]) add(item);\n  for (const item of artisanGoodsData as { id: string; name: string; image: string }[]) add(item);\n  for (const item of monsterLootData as { id: string; name: string; image: string }[]) add(item);\n\n  // Extract produce and deluxeProduce from farm animals\n  for (const animal of animalsData as {\n    type: string;\n    produce?: { id: string; name: string; image: string };\n    deluxeProduce?: { id: string; name: string; image: string };\n  }[]) {\n    if (animal.type !== 'farm-animal') continue;\n    if (animal.produce) add(animal.produce);\n    if (animal.deluxeProduce) add(animal.deluxeProduce);\n  }\n\n  // Extract produce (fruit trees) and tapper (wild trees)\n  for (const tree of treesData as {\n    type: string;\n    produce?: { id: string; name: string; image: string };\n    tapper?: { id: string; name: string; image: string };\n  }[]) {\n    if (tree.produce) add(tree.produce);\n    if (tree.tapper) add(tree.tapper);\n  }\n\n  return map;\n}\n\n// ---------------------------------------------------------------------------\n// Crafting lookup: recipe name → CollectionItem\n// The crafting collection is keyed by recipe name, not output ID, to avoid\n// BigCraftable/Object ID namespace collisions.\n// ---------------------------------------------------------------------------\n\nfunction buildCookingLookup(): Map<string, CollectionItem> {\n  const map = new Map<string, CollectionItem>();\n  for (const recipe of cookingData as { name: string; image: string; id: string }[]) {\n    map.set(recipe.name, { id: recipe.id, name: recipe.name, image: recipe.image });\n  }\n  return map;\n}\n\nfunction buildCraftingLookup(): Map<string, CollectionItem> {\n  const map = new Map<string, CollectionItem>();\n  for (const recipe of craftingData as {\n    name: string;\n    image: string;\n    output: { id: string; isBigCraftable?: boolean };\n  }[]) {\n    const id = recipe.output.isBigCraftable ? `(BC)${recipe.output.id}` : recipe.output.id;\n    map.set(recipe.name, { id, name: recipe.name, image: recipe.image });\n  }\n  return map;\n}\n\nconst lookup = buildLookup();\nconst cookingLookup = buildCookingLookup();\nconst craftingLookup = buildCraftingLookup();\n\n// ---------------------------------------------------------------------------\n// CollectionItemQuery — returned by each collection accessor\n// ---------------------------------------------------------------------------\n\n/**\n * Query result for a single collection type.\n * Inherits get(), first(), find(), findByName(), count() from QueryBase.\n */\nexport class CollectionItemQuery extends QueryBase<CollectionItem> {\n  constructor(data: CollectionItem[]) {\n    super(data);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// CollectionsQuery — the primary query object\n// ---------------------------------------------------------------------------\n\n/**\n * Query builder for in-game Collections.\n * Call a collection accessor to get its items resolved to { id, name, image }.\n * Items whose IDs are not found in any loaded data module are excluded.\n */\nexport class CollectionsQuery {\n  private resolve(ids: string[]): CollectionItemQuery {\n    const items: CollectionItem[] = [];\n    for (const id of ids) {\n      const item = lookup.get(id);\n      if (item) items.push(item);\n    }\n    return new CollectionItemQuery(items);\n  }\n\n  /** Items that appear in the Items Shipped collection tab. */\n  itemsShipped(): CollectionItemQuery {\n    return this.resolve(collectionsData.itemsShipped);\n  }\n\n  /** Items that appear in the Fish collection tab. */\n  fish(): CollectionItemQuery {\n    return this.resolve(collectionsData.fish);\n  }\n\n  /** Items that appear in the Artifacts collection tab (museum donations). */\n  artifacts(): CollectionItemQuery {\n    return this.resolve(collectionsData.artifacts);\n  }\n\n  /** Items that appear in the Minerals collection tab (museum donations). */\n  minerals(): CollectionItemQuery {\n    return this.resolve(collectionsData.minerals);\n  }\n\n  /** Items that appear in the Cooking collection tab. */\n  cooking(): CollectionItemQuery {\n    const items: CollectionItem[] = [];\n    for (const name of collectionsData.cooking) {\n      const item = cookingLookup.get(name);\n      if (item) items.push(item);\n    }\n    return new CollectionItemQuery(items);\n  }\n\n  /** Items that appear in the Crafting collection tab. */\n  crafting(): CollectionItemQuery {\n    const items: CollectionItem[] = [];\n    for (const name of collectionsData.crafting) {\n      const item = craftingLookup.get(name);\n      if (item) items.push(item);\n    }\n    return new CollectionItemQuery(items);\n  }\n}\n\n/** Returns a CollectionsQuery. Use a collection accessor to get resolved items. */\nexport function collections(): CollectionsQuery {\n  return new CollectionsQuery();\n}\n","[\n  {\n    \"id\": \"produce-forage-shipped\",\n    \"name\": \"Produce & Forage Shipped\",\n    \"requirement\": \"Ship one of every item in the Items Shipped (Farm & Forage) tab\",\n    \"count\": 154,\n    \"unit\": \"items\",\n    \"weight\": 15\n  },\n  {\n    \"id\": \"obelisks-on-farm\",\n    \"name\": \"Obelisks on Farm\",\n    \"requirement\": \"Build Earth Obelisk, Water Obelisk, Desert Obelisk, and Island Obelisk on the farm\",\n    \"count\": 4,\n    \"unit\": \"obelisks\",\n    \"weight\": 4\n  },\n  {\n    \"id\": \"golden-clock-on-farm\",\n    \"name\": \"Golden Clock on Farm\",\n    \"requirement\": \"Build the Gold Clock on the farm\",\n    \"count\": 1,\n    \"unit\": \"building\",\n    \"weight\": 10\n  },\n  {\n    \"id\": \"monster-slayer-hero\",\n    \"name\": \"Monster Slayer Hero\",\n    \"requirement\": \"Complete all monster eradication goals for the Adventurer's Guild\",\n    \"count\": 12,\n    \"unit\": \"goals\",\n    \"weight\": 10\n  },\n  {\n    \"id\": \"great-friends\",\n    \"name\": \"Great Friends\",\n    \"requirement\": \"Reach maximum hearts with every villager (including Kent)\",\n    \"count\": 34,\n    \"unit\": \"villagers\",\n    \"weight\": 11\n  },\n  {\n    \"id\": \"farmer-level\",\n    \"name\": \"Farmer Level\",\n    \"requirement\": \"Reach level 10 in every skill\",\n    \"count\": 50,\n    \"unit\": \"skill levels\",\n    \"weight\": 5\n  },\n  {\n    \"id\": \"found-all-stardrops\",\n    \"name\": \"Found All Stardrops\",\n    \"requirement\": \"Find all Stardrops\",\n    \"count\": 7,\n    \"unit\": \"stardrops\",\n    \"weight\": 10\n  },\n  {\n    \"id\": \"cooking-recipes-made\",\n    \"name\": \"Cooking Recipes Made\",\n    \"requirement\": \"Cook every recipe at least once\",\n    \"count\": 81,\n    \"unit\": \"recipes\",\n    \"weight\": 10\n  },\n  {\n    \"id\": \"crafting-recipes-made\",\n    \"name\": \"Crafting Recipes Made\",\n    \"requirement\": \"Craft every item at least once (Wedding Ring not required)\",\n    \"count\": 149,\n    \"unit\": \"items\",\n    \"weight\": 10\n  },\n  {\n    \"id\": \"fish-caught\",\n    \"name\": \"Fish Caught\",\n    \"requirement\": \"Catch every fish species in the Fish tab in the Collections menu\",\n    \"count\": 72,\n    \"unit\": \"species\",\n    \"weight\": 10\n  },\n  {\n    \"id\": \"golden-walnuts-found\",\n    \"name\": \"Golden Walnuts Found\",\n    \"requirement\": \"Find all Golden Walnuts on Ginger Island\",\n    \"count\": 130,\n    \"unit\": \"walnuts\",\n    \"weight\": 5\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport perfectionData from '@/data/perfection.json';\nimport { PerfectionCategory } from '@/types';\n\nconst allPerfectionData: PerfectionCategory[] = perfectionData as PerfectionCategory[];\n\n/** Query builder for Perfection Tracker categories. All filter and sort methods return a new PerfectionQuery for chaining. */\nexport class PerfectionQuery extends QueryBase<PerfectionCategory> {\n  constructor(data: PerfectionCategory[] = allPerfectionData) {\n    super(data);\n  }\n\n  /** Returns the sum of all category weights in the current query. For the full dataset this equals 100. */\n  totalWeight(): number {\n    return this.data.reduce((sum, c) => sum + c.weight, 0);\n  }\n}\n\n/** Returns a PerfectionQuery for all Perfection Tracker categories. Pass `source` to wrap a pre-filtered array. */\nexport function perfection(source: PerfectionCategory[] = allPerfectionData): PerfectionQuery {\n  return new PerfectionQuery(source);\n}\n","[\n  {\n    \"id\": \"256\",\n    \"name\": \"Junimo Chest\",\n    \"cost\": 15,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Through the power of forest magic, every Junimo Chest links to the same stash.\",\n    \"image\": \"images/shop/Junimo Chest.png\",\n    \"isRecipe\": false,\n    \"note\": \"First purchase requires two (30 Qi Gems total).\"\n  },\n  {\n    \"id\": \"911\",\n    \"name\": \"Horse Flute\",\n    \"cost\": 50,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Playing this flute will summon your horse. Only works outdoors.\",\n    \"image\": \"images/shop/Horse Flute.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"897\",\n    \"name\": \"Pierre's Missing Stocklist\",\n    \"cost\": 50,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Pierre might be interested in this.\",\n    \"image\": \"images/shop/Pierre's Missing Stocklist.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"275\",\n    \"name\": \"Hopper\",\n    \"cost\": 10,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Items placed inside will automatically be loaded into the machine in front of it.\",\n    \"image\": \"images/craftable/misc/Hopper.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"913\",\n    \"name\": \"Enricher\",\n    \"cost\": 20,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 4,\n    \"description\": \"Place on a sprinkler and load with fertilizer to automatically apply it when planting seeds nearby.\",\n    \"image\": \"images/shop/Enricher.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"915\",\n    \"name\": \"Pressure Nozzle\",\n    \"cost\": 20,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 4,\n    \"description\": \"Place on a sprinkler to increase its watering range.\",\n    \"image\": \"images/shop/Pressure Nozzle.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"265\",\n    \"name\": \"Deconstructor\",\n    \"cost\": 20,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Destroys crafted items, but salvages their most valuable material.\",\n    \"image\": \"images/shop/Deconstructor.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"SHOP_TOWN_KEY\",\n    \"name\": \"Key To The Town\",\n    \"cost\": 20,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Allows access to all buildings in town, at any time of day.\",\n    \"image\": \"images/special-items/Key To The Town.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"896\",\n    \"name\": \"Galaxy Soul\",\n    \"cost\": 40,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Forge 3 of these into a Galaxy weapon to unleash its final form.\",\n    \"image\": \"images/shop/Galaxy Soul.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"891\",\n    \"name\": \"Mushroom Tree Seed\",\n    \"cost\": 5,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Place this on your farm to plant a mushroom tree.\",\n    \"image\": \"images/shop/Mushroom Tree Seed.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"908\",\n    \"name\": \"Magic Bait\",\n    \"cost\": 5,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 20,\n    \"description\": \"Allows you to catch fish from any season, time, or weather, from whichever type of water you cast into.\",\n    \"image\": \"images/fish/bait/Magic Bait.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"917\",\n    \"name\": \"Qi Seasoning\",\n    \"cost\": 10,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 10,\n    \"description\": \"Just a dash will elevate any dish to extraordinary heights. Automatically applied when cooking.\",\n    \"image\": \"images/shop/Qi Seasoning.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"82\",\n    \"name\": \"Mr. Qi's Hat\",\n    \"cost\": 5,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"A replica of Mr. Qi's iconic hat.\",\n    \"image\": \"images/hats/Mr. Qi's Hat.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"2400\",\n    \"name\": \"Aquatic Sanctuary\",\n    \"cost\": 20,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Can be placed inside your house.\",\n    \"image\": \"images/shop/Aquatic Sanctuary.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"recipe-heavy-tapper\",\n    \"name\": \"Heavy Tapper Recipe\",\n    \"cost\": 20,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Unlocks the crafting recipe for the Heavy Tapper.\",\n    \"image\": \"images/craftable/refining-equipment/Heavy Tapper.png\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"recipe-hyper-speed-gro\",\n    \"name\": \"Hyper Speed-Gro Recipe\",\n    \"cost\": 30,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Unlocks the crafting recipe for Hyper Speed-Gro.\",\n    \"image\": \"images/craftable/fertilizer/Hyper Speed-Gro.png\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"recipe-deluxe-fertilizer\",\n    \"name\": \"Deluxe Fertilizer Recipe\",\n    \"cost\": 20,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Unlocks the crafting recipe for Deluxe Fertilizer.\",\n    \"image\": \"images/craftable/fertilizer/Deluxe Fertilizer.png\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"recipe-hopper\",\n    \"name\": \"Hopper Recipe\",\n    \"cost\": 50,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Unlocks the crafting recipe for the Hopper.\",\n    \"image\": \"images/craftable/misc/Hopper.png\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"recipe-magic-bait\",\n    \"name\": \"Magic Bait Recipe\",\n    \"cost\": 20,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Unlocks the crafting recipe for Magic Bait.\",\n    \"image\": \"images/fish/bait/Magic Bait.png\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"248\",\n    \"name\": \"Mini-Shipping Bin\",\n    \"cost\": 60,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Items placed in it will be included in the nightly shipment.\",\n    \"image\": \"images/shop/Mini-Shipping Bin.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"2514\",\n    \"name\": \"Exotic Double Bed\",\n    \"cost\": 50,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Can be placed inside your house.\",\n    \"image\": \"images/shop/Exotic Double Bed.png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"recipe-blue-grass-starter\",\n    \"name\": \"Blue Grass Starter Recipe\",\n    \"cost\": 40,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"Unlocks the crafting recipe for Blue Grass Starter.\",\n    \"image\": \"images/craftable/seeds/Blue Grass Starter.png\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"893\",\n    \"name\": \"Fireworks (Red)\",\n    \"cost\": 1,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"An old tradition for celebrations and festivities. Handle with care!\",\n    \"image\": \"images/shop/Fireworks (Red).png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"894\",\n    \"name\": \"Fireworks (Purple)\",\n    \"cost\": 1,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"An old tradition for celebrations and festivities. Handle with care!\",\n    \"image\": \"images/shop/Fireworks (Purple).png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"895\",\n    \"name\": \"Fireworks (Green)\",\n    \"cost\": 1,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"An old tradition for celebrations and festivities. Handle with care!\",\n    \"image\": \"images/shop/Fireworks (Green).png\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"858\",\n    \"name\": \"Qi Gem\",\n    \"cost\": 1,\n    \"currency\": \"golden-walnut\",\n    \"quantity\": 2,\n    \"description\": \"Special currency honored by Mr. Qi.\",\n    \"image\": \"images/shop/Qi Gem.png\",\n    \"isRecipe\": false,\n    \"availability\": \"After fully upgrading Ginger Island\"\n  },\n  {\n    \"id\": \"928\",\n    \"name\": \"Golden Egg\",\n    \"cost\": 100,\n    \"currency\": \"qi-gem\",\n    \"quantity\": 1,\n    \"description\": \"A very rare and special egg with a solid gold shell.\",\n    \"image\": \"images/animals/produce/Golden Egg.png\",\n    \"isRecipe\": false,\n    \"availability\": \"After achieving 100% perfection\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport qiStockData from '@/data/qi-shop.json';\nimport { QiCurrency, QiStockItem } from '@/types';\n\nconst allQiStockData: QiStockItem[] = qiStockData as QiStockItem[];\n\n/** Query builder for Qi's Walnut Room shop stock. All filter and sort methods return a new QiStockQuery for chaining. */\nexport class QiStockQuery extends QueryBase<QiStockItem> {\n  constructor(data: QiStockItem[] = allQiStockData) {\n    super(data);\n  }\n\n  /** Filter to items purchased with the given currency. */\n  byCurrency(currency: QiCurrency): QiStockQuery {\n    return new QiStockQuery(this.data.filter((item) => item.currency === currency));\n  }\n\n  /** Filter to recipe unlocks only. */\n  recipes(): QiStockQuery {\n    return new QiStockQuery(this.data.filter((item) => item.isRecipe));\n  }\n\n  /** Filter to non-recipe items only. */\n  items(): QiStockQuery {\n    return new QiStockQuery(this.data.filter((item) => !item.isRecipe));\n  }\n\n  /** Filter to items that are always available (no special availability condition). */\n  alwaysAvailable(): QiStockQuery {\n    return new QiStockQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by cost ascending or descending. */\n  sortByCost(order: 'asc' | 'desc' = 'asc'): QiStockQuery {\n    return new QiStockQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.cost - b.cost : b.cost - a.cost)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): QiStockQuery {\n    return new QiStockQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a QiStockQuery for all items in Qi's Walnut Room shop. Pass `source` to wrap a pre-filtered array. */\nexport function qiStock(source: QiStockItem[] = allQiStockData): QiStockQuery {\n  return new QiStockQuery(source);\n}\n","[\n  {\n    \"id\": \"349\",\n    \"name\": \"Energy Tonic\",\n    \"price\": 1000,\n    \"description\": \"Restores a lot of energy.\",\n    \"energy\": 500,\n    \"health\": 0,\n    \"image\": \"images/medical-supplies/Energy Tonic.png\"\n  },\n  {\n    \"id\": \"351\",\n    \"name\": \"Muscle Remedy\",\n    \"price\": 1000,\n    \"description\": \"When you've pushed your body too hard, drink this to remove 'Exhaustion.'\",\n    \"energy\": 50,\n    \"health\": 22,\n    \"image\": \"images/medical-supplies/Muscle Remedy.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport medicalSuppliesData from '@/data/medical-supplies-shop.json';\nimport { MedicalSupply } from '@/types';\n\nconst allMedicalSuppliesData: MedicalSupply[] = medicalSuppliesData as MedicalSupply[];\n\n/** Query builder for Harvey's Clinic medical supplies. All filter and sort methods return a new MedicalSupplyQuery for chaining. */\nexport class MedicalSupplyQuery extends QueryBase<MedicalSupply> {\n  constructor(data: MedicalSupply[] = allMedicalSuppliesData) {\n    super(data);\n  }\n\n  /** Sort by purchase price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): MedicalSupplyQuery {\n    return new MedicalSupplyQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): MedicalSupplyQuery {\n    return new MedicalSupplyQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a MedicalSupplyQuery for all items sold at Harvey's Clinic. Pass `source` to wrap a pre-filtered array. */\nexport function medicalSupplies(\n  source: MedicalSupply[] = allMedicalSuppliesData,\n): MedicalSupplyQuery {\n  return new MedicalSupplyQuery(source);\n}\n","[\n  {\n    \"id\": \"378\",\n    \"name\": \"Copper Ore\",\n    \"description\": \"A common ore that can be smelted into bars.\",\n    \"priceYear1\": 75,\n    \"priceYear2\": 150,\n    \"image\": \"images/minerals/ore/Copper Ore.png\"\n  },\n  {\n    \"id\": \"380\",\n    \"name\": \"Iron Ore\",\n    \"description\": \"A fairly common ore that can be smelted into bars.\",\n    \"priceYear1\": 150,\n    \"priceYear2\": 250,\n    \"image\": \"images/minerals/ore/Iron Ore.png\"\n  },\n  {\n    \"id\": \"382\",\n    \"name\": \"Coal\",\n    \"description\": \"A combustible rock that is useful for crafting and smelting.\",\n    \"priceYear1\": 150,\n    \"priceYear2\": 250,\n    \"image\": \"images/minerals/ore/Coal.png\"\n  },\n  {\n    \"id\": \"384\",\n    \"name\": \"Gold Ore\",\n    \"description\": \"A precious ore that can be smelted into bars.\",\n    \"priceYear1\": 400,\n    \"priceYear2\": 750,\n    \"image\": \"images/minerals/ore/Gold Ore.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport blacksmithData from '@/data/blacksmith-shop.json';\nimport { BlacksmithItem } from '@/types';\n\nconst allBlacksmithData: BlacksmithItem[] = blacksmithData as BlacksmithItem[];\n\n/** Query builder for items sold at the Blacksmith (Clint's shop). All filter and sort methods return a new BlacksmithQuery for chaining. */\nexport class BlacksmithQuery extends QueryBase<BlacksmithItem> {\n  constructor(data: BlacksmithItem[] = allBlacksmithData) {\n    super(data);\n  }\n\n  /** Sort by price for the given year (1 or 2+) ascending or descending. */\n  sortByPrice(year: 1 | 2 = 1, order: 'asc' | 'desc' = 'asc'): BlacksmithQuery {\n    const key = year === 1 ? 'priceYear1' : 'priceYear2';\n    return new BlacksmithQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a[key] - b[key] : b[key] - a[key])),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): BlacksmithQuery {\n    return new BlacksmithQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a BlacksmithQuery for all items sold at the Blacksmith. Pass `source` to wrap a pre-filtered array. */\nexport function blacksmith(source: BlacksmithItem[] = allBlacksmithData): BlacksmithQuery {\n  return new BlacksmithQuery(source);\n}\n","[\n  {\n    \"id\": \"167\",\n    \"name\": \"Joja Cola\",\n    \"price\": 75,\n    \"description\": \"The flagship product of Joja corporation.\",\n    \"image\": \"images/shop/Joja Cola.png\",\n    \"seasons\": []\n  },\n  {\n    \"id\": \"JojaCatalogue\",\n    \"name\": \"Joja Furniture Catalogue\",\n    \"price\": 25000,\n    \"description\": \"Grants one (1) lifetime subscription to the Official Joja THRIVE Collection, featuring 40 exclusive furniture pieces!\",\n    \"image\": \"images/shop/Joja Furniture Catalogue.png\",\n    \"seasons\": []\n  },\n  {\n    \"id\": \"22\",\n    \"name\": \"Joja Wallpaper\",\n    \"price\": 20,\n    \"description\": \"Decorates the walls of one room.\",\n    \"image\": \"images/shop/Joja Wallpaper.png\",\n    \"seasons\": []\n  },\n  {\n    \"id\": \"1609\",\n    \"name\": \"J. Cola Light\",\n    \"price\": 500,\n    \"description\": \"Can be placed inside your house.\",\n    \"image\": \"images/shop/J. Cola Light.png\",\n    \"seasons\": []\n  },\n  {\n    \"id\": \"297\",\n    \"name\": \"Grass Starter\",\n    \"price\": 125,\n    \"description\": \"Place this on your farm to start a new patch of grass.\",\n    \"image\": \"images/craftable/seeds/Grass Starter.png\",\n    \"seasons\": []\n  },\n  {\n    \"id\": \"245\",\n    \"name\": \"Sugar\",\n    \"price\": 125,\n    \"description\": \"Adds sweetness to pastries and candies. Too much can be unhealthy.\",\n    \"image\": \"images/shop/Sugar.png\",\n    \"seasons\": []\n  },\n  {\n    \"id\": \"246\",\n    \"name\": \"Wheat Flour\",\n    \"price\": 125,\n    \"description\": \"A common cooking ingredient made from crushed wheat seeds.\",\n    \"image\": \"images/shop/Wheat Flour.png\",\n    \"seasons\": []\n  },\n  {\n    \"id\": \"423\",\n    \"name\": \"Rice\",\n    \"price\": 250,\n    \"description\": \"A basic grain often served under vegetables.\",\n    \"image\": \"images/shop/Rice.png\",\n    \"seasons\": []\n  },\n  {\n    \"id\": \"272\",\n    \"name\": \"Auto-Petter\",\n    \"price\": 50000,\n    \"description\": \"Joja Co. patented technology for coops and barns. Keeps your animals content, but can't replace the full benefit of human touch.\",\n    \"image\": \"images/tools/Auto-Petter.png\",\n    \"seasons\": [],\n    \"availability\": \"Joja Warehouse route completed\"\n  },\n  {\n    \"id\": \"472\",\n    \"name\": \"Parsnip Seeds\",\n    \"price\": 25,\n    \"description\": \"Plant these in the spring. Takes 4 days to mature.\",\n    \"image\": \"images/crops/parsnip/seed.png\",\n    \"seasons\": [\"spring\"]\n  },\n  {\n    \"id\": \"473\",\n    \"name\": \"Bean Starter\",\n    \"price\": 75,\n    \"description\": \"Plant these in the spring. Takes 10 days to mature, but keeps producing after that. Grows on a trellis.\",\n    \"image\": \"images/crops/green-bean/seed.png\",\n    \"seasons\": [\"spring\"]\n  },\n  {\n    \"id\": \"474\",\n    \"name\": \"Cauliflower Seeds\",\n    \"price\": 100,\n    \"description\": \"Plant these in the spring. Takes 12 days to produce a large cauliflower.\",\n    \"image\": \"images/crops/cauliflower/seed.png\",\n    \"seasons\": [\"spring\"]\n  },\n  {\n    \"id\": \"475\",\n    \"name\": \"Potato Seeds\",\n    \"price\": 62,\n    \"description\": \"Plant these in the spring. Takes 6 days to mature, and has a chance of yielding multiple potatoes at harvest.\",\n    \"image\": \"images/crops/potato/seed.png\",\n    \"seasons\": [\"spring\"]\n  },\n  {\n    \"id\": \"427\",\n    \"name\": \"Tulip Bulb\",\n    \"price\": 25,\n    \"description\": \"Plant in spring. Takes 6 days to produce a colorful flower. Assorted colors.\",\n    \"image\": \"images/crops/tulip/seed.png\",\n    \"seasons\": [\"spring\"]\n  },\n  {\n    \"id\": \"477\",\n    \"name\": \"Kale Seeds\",\n    \"price\": 87,\n    \"description\": \"Plant these in the spring. Takes 6 days to mature. Harvest with the scythe.\",\n    \"image\": \"images/crops/kale/seed.png\",\n    \"seasons\": [\"spring\"]\n  },\n  {\n    \"id\": \"429\",\n    \"name\": \"Jazz Seeds\",\n    \"price\": 37,\n    \"description\": \"Plant in spring. Takes 7 days to produce a blue puffball flower.\",\n    \"image\": \"images/crops/blue-jazz/seed.png\",\n    \"seasons\": [\"spring\"]\n  },\n  {\n    \"id\": \"480\",\n    \"name\": \"Tomato Seeds\",\n    \"price\": 62,\n    \"description\": \"Plant these in the summer. Takes 11 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/tomato/seed.png\",\n    \"seasons\": [\"summer\"]\n  },\n  {\n    \"id\": \"482\",\n    \"name\": \"Pepper Seeds\",\n    \"price\": 50,\n    \"description\": \"Plant these in the summer. Takes 5 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/hot-pepper/seed.png\",\n    \"seasons\": [\"summer\"]\n  },\n  {\n    \"id\": \"484\",\n    \"name\": \"Radish Seeds\",\n    \"price\": 50,\n    \"description\": \"Plant these in the summer. Takes 6 days to mature.\",\n    \"image\": \"images/crops/radish/seed.png\",\n    \"seasons\": [\"summer\"]\n  },\n  {\n    \"id\": \"479\",\n    \"name\": \"Melon Seeds\",\n    \"price\": 100,\n    \"description\": \"Plant these in the summer. Takes 12 days to mature.\",\n    \"image\": \"images/crops/melon/seed.png\",\n    \"seasons\": [\"summer\"]\n  },\n  {\n    \"id\": \"302\",\n    \"name\": \"Hops Starter\",\n    \"price\": 75,\n    \"description\": \"Plant these in the summer. Takes 11 days to grow, but keeps producing after that. Grows on a trellis.\",\n    \"image\": \"images/crops/hops/seed.png\",\n    \"seasons\": [\"summer\"]\n  },\n  {\n    \"id\": \"453\",\n    \"name\": \"Poppy Seeds\",\n    \"price\": 125,\n    \"description\": \"Plant in summer. Produces a bright red flower in 7 days.\",\n    \"image\": \"images/crops/poppy/seed.png\",\n    \"seasons\": [\"summer\"]\n  },\n  {\n    \"id\": \"455\",\n    \"name\": \"Spangle Seeds\",\n    \"price\": 62,\n    \"description\": \"Plant in summer. Takes 8 days to produce a vibrant tropical flower. Assorted colors.\",\n    \"image\": \"images/crops/summer-spangle/seed.png\",\n    \"seasons\": [\"summer\"]\n  },\n  {\n    \"id\": \"483\",\n    \"name\": \"Wheat Seeds\",\n    \"price\": 12,\n    \"description\": \"Plant these in the summer or fall. Takes 4 days to mature. Harvest with the scythe.\",\n    \"image\": \"images/crops/wheat/seed.png\",\n    \"seasons\": [\"summer\", \"fall\"]\n  },\n  {\n    \"id\": \"431\",\n    \"name\": \"Sunflower Seeds\",\n    \"price\": 125,\n    \"description\": \"Plant in summer or fall. Takes 8 days to produce a large sunflower. Yields more seeds at harvest.\",\n    \"image\": \"images/crops/sunflower/seed.png\",\n    \"seasons\": [\"summer\", \"fall\"]\n  },\n  {\n    \"id\": \"487\",\n    \"name\": \"Corn Seeds\",\n    \"price\": 187,\n    \"description\": \"Plant these in the summer or fall. Takes 14 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/corn/seed.png\",\n    \"seasons\": [\"summer\", \"fall\"]\n  },\n  {\n    \"id\": \"488\",\n    \"name\": \"Eggplant Seeds\",\n    \"price\": 25,\n    \"description\": \"Plant these in the fall. Takes 5 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/eggplant/seed.png\",\n    \"seasons\": [\"fall\"]\n  },\n  {\n    \"id\": \"490\",\n    \"name\": \"Pumpkin Seeds\",\n    \"price\": 125,\n    \"description\": \"Plant these in the fall. Takes 13 days to mature.\",\n    \"image\": \"images/crops/pumpkin/seed.png\",\n    \"seasons\": [\"fall\"]\n  },\n  {\n    \"id\": \"299\",\n    \"name\": \"Amaranth Seeds\",\n    \"price\": 87,\n    \"description\": \"Plant these in the fall. Takes 7 days to grow. Harvest with the scythe.\",\n    \"image\": \"images/crops/amaranth/seed.png\",\n    \"seasons\": [\"fall\"]\n  },\n  {\n    \"id\": \"301\",\n    \"name\": \"Grape Starter\",\n    \"price\": 75,\n    \"description\": \"Plant these in the fall. Takes 10 days to grow, but keeps producing after that. Grows on a trellis.\",\n    \"image\": \"images/crops/grape/seed.png\",\n    \"seasons\": [\"fall\"]\n  },\n  {\n    \"id\": \"492\",\n    \"name\": \"Yam Seeds\",\n    \"price\": 75,\n    \"description\": \"Plant these in the fall. Takes 10 days to mature.\",\n    \"image\": \"images/crops/yam/seed.png\",\n    \"seasons\": [\"fall\"]\n  },\n  {\n    \"id\": \"491\",\n    \"name\": \"Bok Choy Seeds\",\n    \"price\": 62,\n    \"description\": \"Plant these in the fall. Takes 4 days to mature.\",\n    \"image\": \"images/crops/bok-choy/seed.png\",\n    \"seasons\": [\"fall\"]\n  },\n  {\n    \"id\": \"493\",\n    \"name\": \"Cranberry Seeds\",\n    \"price\": 300,\n    \"description\": \"Plant these in the fall. Takes 7 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/cranberries/seed.png\",\n    \"seasons\": [\"fall\"]\n  },\n  {\n    \"id\": \"425\",\n    \"name\": \"Fairy Seeds\",\n    \"price\": 250,\n    \"description\": \"Plant in fall. Takes 12 days to produce a mysterious flower. Assorted colors.\",\n    \"image\": \"images/crops/fairy-rose/seed.png\",\n    \"seasons\": [\"fall\"]\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport jojaData from '@/data/joja-shop.json';\nimport { JojaItem, Season } from '@/types';\n\nconst allJojaData: JojaItem[] = jojaData as JojaItem[];\n\n/** Query builder for JojaMart shop stock. All filter and sort methods return a new JojaQuery for chaining. */\nexport class JojaQuery extends QueryBase<JojaItem> {\n  constructor(data: JojaItem[] = allJojaData) {\n    super(data);\n  }\n\n  /** Filter to items available in the given season (includes permanent and multi-season items). */\n  bySeason(season: Season): JojaQuery {\n    return new JojaQuery(\n      this.data.filter((item) => item.seasons.length === 0 || item.seasons.includes(season)),\n    );\n  }\n\n  /** Filter to year-round permanent stock only (no seasonal seeds). */\n  permanent(): JojaQuery {\n    return new JojaQuery(this.data.filter((item) => item.seasons.length === 0));\n  }\n\n  /** Filter to seasonal seed stock only (items with at least one season). */\n  seeds(): JojaQuery {\n    return new JojaQuery(this.data.filter((item) => item.seasons.length > 0));\n  }\n\n  /** Filter to items that are always available (no special purchase condition). */\n  alwaysAvailable(): JojaQuery {\n    return new JojaQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): JojaQuery {\n    return new JojaQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): JojaQuery {\n    return new JojaQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a JojaQuery for all items sold at JojaMart. Pass `source` to wrap a pre-filtered array. */\nexport function joja(source: JojaItem[] = allJojaData): JojaQuery {\n  return new JojaQuery(source);\n}\n","[\n  {\n    \"id\": \"245\",\n    \"name\": \"Sugar\",\n    \"price\": 100,\n    \"description\": \"Adds sweetness to pastries and candies. Too much can be unhealthy.\",\n    \"image\": \"images/shop/Sugar.png\",\n    \"seasons\": [],\n    \"category\": \"ingredient\"\n  },\n  {\n    \"id\": \"246\",\n    \"name\": \"Wheat Flour\",\n    \"price\": 100,\n    \"description\": \"A common cooking ingredient made from crushed wheat seeds.\",\n    \"image\": \"images/shop/Wheat Flour.png\",\n    \"seasons\": [],\n    \"category\": \"ingredient\"\n  },\n  {\n    \"id\": \"423\",\n    \"name\": \"Rice\",\n    \"price\": 200,\n    \"description\": \"A basic grain often served under vegetables.\",\n    \"image\": \"images/shop/Rice.png\",\n    \"seasons\": [],\n    \"category\": \"ingredient\"\n  },\n  {\n    \"id\": \"247\",\n    \"name\": \"Oil\",\n    \"price\": 200,\n    \"description\": \"All-purpose cooking oil.\",\n    \"image\": \"images/artisan-goods/Oil.png\",\n    \"seasons\": [],\n    \"category\": \"ingredient\"\n  },\n  {\n    \"id\": \"419\",\n    \"name\": \"Vinegar\",\n    \"price\": 200,\n    \"description\": \"A common cooking ingredient.\",\n    \"image\": \"images/artisan-goods/Vinegar.png\",\n    \"seasons\": [],\n    \"category\": \"ingredient\"\n  },\n  {\n    \"id\": \"297\",\n    \"name\": \"Grass Starter\",\n    \"price\": 200,\n    \"description\": \"Place this on your farm to start a new patch of grass.\",\n    \"image\": \"images/craftable/seeds/Grass Starter.png\",\n    \"seasons\": [],\n    \"category\": \"fertilizer\"\n  },\n  {\n    \"id\": \"368\",\n    \"name\": \"Basic Fertilizer\",\n    \"price\": 100,\n    \"description\": \"Improves soil quality a little, increasing your chance to grow quality crops. Mix into tilled soil.\",\n    \"image\": \"images/craftable/fertilizer/Basic Fertilizer.png\",\n    \"seasons\": [],\n    \"category\": \"fertilizer\",\n    \"availability\": \"After Day 15\"\n  },\n  {\n    \"id\": \"370\",\n    \"name\": \"Basic Retaining Soil\",\n    \"price\": 100,\n    \"description\": \"This soil has a chance of staying watered overnight. Mix into tilled soil.\",\n    \"image\": \"images/craftable/fertilizer/Basic Retaining Soil.png\",\n    \"seasons\": [],\n    \"category\": \"fertilizer\",\n    \"availability\": \"After Day 15\"\n  },\n  {\n    \"id\": \"465\",\n    \"name\": \"Speed-Gro\",\n    \"price\": 100,\n    \"description\": \"Stimulates leaf production. Guaranteed to reduce the number of days it takes for a crop to reach maturity by 10%. Mix into tilled soil.\",\n    \"image\": \"images/craftable/fertilizer/Speed-Gro.png\",\n    \"seasons\": [],\n    \"category\": \"fertilizer\",\n    \"availability\": \"After Day 15\"\n  },\n  {\n    \"id\": \"369\",\n    \"name\": \"Quality Fertilizer\",\n    \"price\": 150,\n    \"description\": \"Improves soil quality, increasing your chance to grow quality crops. Mix into tilled soil.\",\n    \"image\": \"images/craftable/fertilizer/Quality Fertilizer.png\",\n    \"seasons\": [],\n    \"category\": \"fertilizer\",\n    \"availability\": \"Year 2+\"\n  },\n  {\n    \"id\": \"371\",\n    \"name\": \"Quality Retaining Soil\",\n    \"price\": 150,\n    \"description\": \"This soil has a good chance of staying watered overnight. Mix into tilled soil.\",\n    \"image\": \"images/craftable/fertilizer/Quality Retaining Soil.png\",\n    \"seasons\": [],\n    \"category\": \"fertilizer\",\n    \"availability\": \"Year 2+\"\n  },\n  {\n    \"id\": \"466\",\n    \"name\": \"Deluxe Speed-Gro\",\n    \"price\": 150,\n    \"description\": \"Stimulates leaf production. Guaranteed to reduce the number of days it takes for a crop to reach maturity by 25%. Mix into tilled soil.\",\n    \"image\": \"images/craftable/fertilizer/Deluxe Speed-Gro.png\",\n    \"seasons\": [],\n    \"category\": \"fertilizer\",\n    \"availability\": \"Year 2+\"\n  },\n  {\n    \"id\": \"1308\",\n    \"name\": \"Catalogue\",\n    \"price\": 30000,\n    \"description\": \"A collection of wallpaper and flooring options for your home.\",\n    \"image\": \"images/shop/Catalogue.png\",\n    \"seasons\": [],\n    \"category\": \"special\"\n  },\n  {\n    \"id\": \"458\",\n    \"name\": \"Bouquet\",\n    \"price\": 200,\n    \"description\": \"A gift to show your affection. Give to a bachelor or bachelorette to start a romantic relationship.\",\n    \"image\": \"images/shop/Bouquet.png\",\n    \"seasons\": [],\n    \"category\": \"special\",\n    \"availability\": \"8+ hearts with a marriage candidate\"\n  },\n  {\n    \"id\": \"large-pack\",\n    \"name\": \"Large Pack\",\n    \"price\": 2000,\n    \"description\": \"Upgrades your backpack to hold 24 items.\",\n    \"image\": \"images/tools/backpack/Large Pack.png\",\n    \"seasons\": [],\n    \"category\": \"special\"\n  },\n  {\n    \"id\": \"deluxe-pack\",\n    \"name\": \"Deluxe Pack\",\n    \"price\": 10000,\n    \"description\": \"Upgrades your backpack to hold 36 items.\",\n    \"image\": \"images/tools/backpack/Deluxe Pack.png\",\n    \"seasons\": [],\n    \"category\": \"special\",\n    \"availability\": \"Requires Large Pack\"\n  },\n  {\n    \"id\": \"recipe-grass-starter\",\n    \"name\": \"Grass Starter Recipe\",\n    \"price\": 2000,\n    \"description\": \"Recipe for crafting Grass Starter.\",\n    \"image\": \"images/craftable/seeds/Grass Starter.png\",\n    \"seasons\": [],\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"recipe-dehydrator\",\n    \"name\": \"Dehydrator Recipe\",\n    \"price\": 10000,\n    \"description\": \"Recipe for crafting a Dehydrator.\",\n    \"image\": \"images/craftable/artisan-equipment/Dehydrator.png\",\n    \"seasons\": [],\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"628\",\n    \"name\": \"Cherry Sapling\",\n    \"price\": 3400,\n    \"description\": \"Plant in fall or spring. Takes 28 days to produce a mature cherry tree.\",\n    \"image\": \"images/trees/cherry/seed.png\",\n    \"seasons\": [],\n    \"category\": \"sapling\"\n  },\n  {\n    \"id\": \"629\",\n    \"name\": \"Apricot Sapling\",\n    \"price\": 2000,\n    \"description\": \"Plant in fall or spring. Takes 28 days to produce a mature apricot tree.\",\n    \"image\": \"images/trees/apricot/seed.png\",\n    \"seasons\": [],\n    \"category\": \"sapling\"\n  },\n  {\n    \"id\": \"630\",\n    \"name\": \"Orange Sapling\",\n    \"price\": 4000,\n    \"description\": \"Plant in fall or spring. Takes 28 days to produce a mature orange tree.\",\n    \"image\": \"images/trees/orange/seed.png\",\n    \"seasons\": [],\n    \"category\": \"sapling\"\n  },\n  {\n    \"id\": \"631\",\n    \"name\": \"Peach Sapling\",\n    \"price\": 6000,\n    \"description\": \"Plant in fall or spring. Takes 28 days to produce a mature peach tree.\",\n    \"image\": \"images/trees/peach/seed.png\",\n    \"seasons\": [],\n    \"category\": \"sapling\"\n  },\n  {\n    \"id\": \"632\",\n    \"name\": \"Pomegranate Sapling\",\n    \"price\": 6000,\n    \"description\": \"Plant in fall or spring. Takes 28 days to produce a mature pomegranate tree.\",\n    \"image\": \"images/trees/pomegranate/seed.png\",\n    \"seasons\": [],\n    \"category\": \"sapling\"\n  },\n  {\n    \"id\": \"633\",\n    \"name\": \"Apple Sapling\",\n    \"price\": 4000,\n    \"description\": \"Plant in fall or spring. Takes 28 days to produce a mature apple tree.\",\n    \"image\": \"images/trees/apple/seed.png\",\n    \"seasons\": [],\n    \"category\": \"sapling\"\n  },\n  {\n    \"id\": \"472\",\n    \"name\": \"Parsnip Seeds\",\n    \"price\": 20,\n    \"description\": \"Plant these in the spring. Takes 4 days to mature.\",\n    \"image\": \"images/crops/parsnip/seed.png\",\n    \"seasons\": [\"spring\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"427\",\n    \"name\": \"Tulip Bulb\",\n    \"price\": 20,\n    \"description\": \"Plant in spring. Takes 6 days to produce a colorful flower. Assorted colors.\",\n    \"image\": \"images/crops/tulip/seed.png\",\n    \"seasons\": [\"spring\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"429\",\n    \"name\": \"Jazz Seeds\",\n    \"price\": 30,\n    \"description\": \"Plant in spring. Takes 7 days to produce a blue puffball flower.\",\n    \"image\": \"images/crops/blue-jazz/seed.png\",\n    \"seasons\": [\"spring\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"473\",\n    \"name\": \"Bean Starter\",\n    \"price\": 60,\n    \"description\": \"Plant these in the spring. Takes 10 days to mature, but keeps producing after that. Grows on a trellis.\",\n    \"image\": \"images/crops/green-bean/seed.png\",\n    \"seasons\": [\"spring\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"475\",\n    \"name\": \"Potato Seeds\",\n    \"price\": 50,\n    \"description\": \"Plant these in the spring. Takes 6 days to mature, and has a chance of yielding multiple potatoes at harvest.\",\n    \"image\": \"images/crops/potato/seed.png\",\n    \"seasons\": [\"spring\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"477\",\n    \"name\": \"Kale Seeds\",\n    \"price\": 70,\n    \"description\": \"Plant these in the spring. Takes 6 days to mature. Harvest with the scythe.\",\n    \"image\": \"images/crops/kale/seed.png\",\n    \"seasons\": [\"spring\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"474\",\n    \"name\": \"Cauliflower Seeds\",\n    \"price\": 80,\n    \"description\": \"Plant these in the spring. Takes 12 days to produce a large cauliflower.\",\n    \"image\": \"images/crops/cauliflower/seed.png\",\n    \"seasons\": [\"spring\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"476\",\n    \"name\": \"Garlic Seeds\",\n    \"price\": 40,\n    \"description\": \"Plant in spring. Takes 4 days to mature.\",\n    \"image\": \"images/crops/garlic/seed.png\",\n    \"seasons\": [\"spring\"],\n    \"category\": \"seed\",\n    \"availability\": \"Year 2+\"\n  },\n  {\n    \"id\": \"273\",\n    \"name\": \"Rice Shoot\",\n    \"price\": 40,\n    \"description\": \"Plant these in the spring. Takes 6 days to mature. Must be planted near water.\",\n    \"image\": \"images/crops/unmilled-rice/seed.png\",\n    \"seasons\": [\"spring\"],\n    \"category\": \"seed\",\n    \"availability\": \"Year 2+\"\n  },\n  {\n    \"id\": \"483\",\n    \"name\": \"Wheat Seeds\",\n    \"price\": 10,\n    \"description\": \"Plant these in the summer or fall. Takes 4 days to mature. Harvest with the scythe.\",\n    \"image\": \"images/crops/wheat/seed.png\",\n    \"seasons\": [\"summer\", \"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"482\",\n    \"name\": \"Pepper Seeds\",\n    \"price\": 40,\n    \"description\": \"Plant these in the summer. Takes 5 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/hot-pepper/seed.png\",\n    \"seasons\": [\"summer\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"484\",\n    \"name\": \"Radish Seeds\",\n    \"price\": 40,\n    \"description\": \"Plant these in the summer. Takes 6 days to mature.\",\n    \"image\": \"images/crops/radish/seed.png\",\n    \"seasons\": [\"summer\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"480\",\n    \"name\": \"Tomato Seeds\",\n    \"price\": 50,\n    \"description\": \"Plant these in the summer. Takes 11 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/tomato/seed.png\",\n    \"seasons\": [\"summer\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"455\",\n    \"name\": \"Spangle Seeds\",\n    \"price\": 50,\n    \"description\": \"Plant in summer. Takes 8 days to produce a vibrant tropical flower. Assorted colors.\",\n    \"image\": \"images/crops/summer-spangle/seed.png\",\n    \"seasons\": [\"summer\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"302\",\n    \"name\": \"Hops Starter\",\n    \"price\": 60,\n    \"description\": \"Plant these in the summer. Takes 11 days to grow, but keeps producing after that. Grows on a trellis.\",\n    \"image\": \"images/crops/hops/seed.png\",\n    \"seasons\": [\"summer\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"481\",\n    \"name\": \"Blueberry Seeds\",\n    \"price\": 80,\n    \"description\": \"Plant these in the summer. Takes 13 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/blueberry/seed.png\",\n    \"seasons\": [\"summer\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"479\",\n    \"name\": \"Melon Seeds\",\n    \"price\": 80,\n    \"description\": \"Plant these in the summer. Takes 12 days to mature.\",\n    \"image\": \"images/crops/melon/seed.png\",\n    \"seasons\": [\"summer\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"453\",\n    \"name\": \"Poppy Seeds\",\n    \"price\": 100,\n    \"description\": \"Plant in summer. Produces a bright red flower in 7 days.\",\n    \"image\": \"images/crops/poppy/seed.png\",\n    \"seasons\": [\"summer\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"487\",\n    \"name\": \"Corn Seeds\",\n    \"price\": 150,\n    \"description\": \"Plant these in the summer or fall. Takes 14 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/corn/seed.png\",\n    \"seasons\": [\"summer\", \"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"431\",\n    \"name\": \"Sunflower Seeds\",\n    \"price\": 200,\n    \"description\": \"Plant in summer or fall. Takes 8 days to produce a large sunflower. Yields more seeds at harvest.\",\n    \"image\": \"images/crops/sunflower/seed.png\",\n    \"seasons\": [\"summer\", \"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"485\",\n    \"name\": \"Red Cabbage Seeds\",\n    \"price\": 100,\n    \"description\": \"Plant these in the summer. Takes 9 days to mature.\",\n    \"image\": \"images/crops/red-cabbage/seed.png\",\n    \"seasons\": [\"summer\"],\n    \"category\": \"seed\",\n    \"availability\": \"Year 2+\"\n  },\n  {\n    \"id\": \"488\",\n    \"name\": \"Eggplant Seeds\",\n    \"price\": 20,\n    \"description\": \"Plant these in the fall. Takes 5 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/eggplant/seed.png\",\n    \"seasons\": [\"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"299\",\n    \"name\": \"Amaranth Seeds\",\n    \"price\": 70,\n    \"description\": \"Plant these in the fall. Takes 7 days to grow. Harvest with the scythe.\",\n    \"image\": \"images/crops/amaranth/seed.png\",\n    \"seasons\": [\"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"301\",\n    \"name\": \"Grape Starter\",\n    \"price\": 60,\n    \"description\": \"Plant these in the fall. Takes 10 days to grow, but keeps producing after that. Grows on a trellis.\",\n    \"image\": \"images/crops/grape/seed.png\",\n    \"seasons\": [\"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"491\",\n    \"name\": \"Bok Choy Seeds\",\n    \"price\": 50,\n    \"description\": \"Plant these in the fall. Takes 4 days to mature.\",\n    \"image\": \"images/crops/bok-choy/seed.png\",\n    \"seasons\": [\"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"492\",\n    \"name\": \"Yam Seeds\",\n    \"price\": 60,\n    \"description\": \"Plant these in the fall. Takes 10 days to mature.\",\n    \"image\": \"images/crops/yam/seed.png\",\n    \"seasons\": [\"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"490\",\n    \"name\": \"Pumpkin Seeds\",\n    \"price\": 100,\n    \"description\": \"Plant these in the fall. Takes 13 days to mature.\",\n    \"image\": \"images/crops/pumpkin/seed.png\",\n    \"seasons\": [\"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"425\",\n    \"name\": \"Fairy Seeds\",\n    \"price\": 200,\n    \"description\": \"Plant in fall. Takes 12 days to produce a mysterious flower. Assorted colors.\",\n    \"image\": \"images/crops/fairy-rose/seed.png\",\n    \"seasons\": [\"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"493\",\n    \"name\": \"Cranberry Seeds\",\n    \"price\": 240,\n    \"description\": \"Plant these in the fall. Takes 7 days to mature, and continues to produce after first harvest.\",\n    \"image\": \"images/crops/cranberries/seed.png\",\n    \"seasons\": [\"fall\"],\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"489\",\n    \"name\": \"Artichoke Seeds\",\n    \"price\": 30,\n    \"description\": \"Plant these in the fall. Takes 8 days to mature.\",\n    \"image\": \"images/crops/artichoke/seed.png\",\n    \"seasons\": [\"fall\"],\n    \"category\": \"seed\",\n    \"availability\": \"Year 2+\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/pierre-shop.json';\nimport { PierreCategory, PierreItem, Season } from '@/types';\n\nconst pierreData: PierreItem[] = data as PierreItem[];\n\n/** Query builder for Pierre's General Store stock. All filter and sort methods return a new PierreQuery for chaining. */\nexport class PierreQuery extends QueryBase<PierreItem> {\n  constructor(data: PierreItem[] = pierreData) {\n    super(data);\n  }\n\n  /** Filter to items available in the given season (includes permanent and multi-season items). */\n  bySeason(season: Season): PierreQuery {\n    return new PierreQuery(\n      this.data.filter((item) => item.seasons.length === 0 || item.seasons.includes(season)),\n    );\n  }\n\n  /** Filter to year-round permanent stock only (no seasonal seeds). */\n  permanent(): PierreQuery {\n    return new PierreQuery(this.data.filter((item) => item.seasons.length === 0));\n  }\n\n  /** Filter to seasonal seed stock only (items with at least one season). */\n  seeds(): PierreQuery {\n    return new PierreQuery(this.data.filter((item) => item.category === 'seed'));\n  }\n\n  /** Filter to fruit tree saplings only. */\n  saplings(): PierreQuery {\n    return new PierreQuery(this.data.filter((item) => item.category === 'sapling'));\n  }\n\n  /** Filter to cooking ingredients only. */\n  ingredients(): PierreQuery {\n    return new PierreQuery(this.data.filter((item) => item.category === 'ingredient'));\n  }\n\n  /** Filter to fertilizers and farming supplies only. */\n  fertilizers(): PierreQuery {\n    return new PierreQuery(this.data.filter((item) => item.category === 'fertilizer'));\n  }\n\n  /** Filter to recipe items only. */\n  recipes(): PierreQuery {\n    return new PierreQuery(this.data.filter((item) => item.category === 'recipe'));\n  }\n\n  /** Filter by category. */\n  byCategory(category: PierreCategory): PierreQuery {\n    return new PierreQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter to items that are always available (no special purchase condition). */\n  alwaysAvailable(): PierreQuery {\n    return new PierreQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): PierreQuery {\n    return new PierreQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): PierreQuery {\n    return new PierreQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a PierreQuery for all items sold at Pierre's General Store. Pass `source` to wrap a pre-filtered array. */\nexport function pierre(source: PierreItem[] = pierreData): PierreQuery {\n  return new PierreQuery(source);\n}\n","[\n  {\n    \"id\": \"346\",\n    \"name\": \"Beer\",\n    \"price\": 400,\n    \"description\": \"Drink in moderation.\",\n    \"image\": \"images/artisan-goods/Beer.png\",\n    \"category\": \"food\"\n  },\n  {\n    \"id\": \"395\",\n    \"name\": \"Coffee\",\n    \"price\": 300,\n    \"description\": \"It smells delicious. This is sure to give you a boost.\",\n    \"image\": \"images/artisan-goods/Coffee.png\",\n    \"category\": \"food\"\n  },\n  {\n    \"id\": \"216\",\n    \"name\": \"Bread\",\n    \"price\": 120,\n    \"description\": \"A crusty baguette.\",\n    \"image\": \"images/cooking/Bread.png\",\n    \"category\": \"food\"\n  },\n  {\n    \"id\": \"196\",\n    \"name\": \"Salad\",\n    \"price\": 220,\n    \"description\": \"A healthy garden salad.\",\n    \"image\": \"images/cooking/Salad.png\",\n    \"category\": \"food\"\n  },\n  {\n    \"id\": \"224\",\n    \"name\": \"Spaghetti\",\n    \"price\": 240,\n    \"description\": \"An old favorite.\",\n    \"image\": \"images/cooking/Spaghetti.png\",\n    \"category\": \"food\"\n  },\n  {\n    \"id\": \"206\",\n    \"name\": \"Pizza\",\n    \"price\": 600,\n    \"description\": \"It's popular for all the right reasons.\",\n    \"image\": \"images/cooking/Pizza.png\",\n    \"category\": \"food\"\n  },\n  {\n    \"id\": \"732\",\n    \"name\": \"Crab Cakes\",\n    \"price\": 550,\n    \"description\": \"Crab, bread crumbs, and egg formed into patties then fried to golden brown.\",\n    \"image\": \"images/cooking/Crab Cakes.png\",\n    \"category\": \"food\",\n    \"availability\": \"After Willy's 6-heart event\"\n  },\n  {\n    \"id\": \"recipe-hashbrowns\",\n    \"name\": \"Hashbrowns Recipe\",\n    \"price\": 50,\n    \"description\": \"Crispy and golden-brown!\",\n    \"image\": \"images/cooking/Hashbrowns.png\",\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"recipe-omelet\",\n    \"name\": \"Omelet Recipe\",\n    \"price\": 100,\n    \"description\": \"It's super fluffy.\",\n    \"image\": \"images/cooking/Omelet.png\",\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"recipe-pancakes\",\n    \"name\": \"Pancakes Recipe\",\n    \"price\": 100,\n    \"description\": \"A double stack of fluffy, soft pancakes.\",\n    \"image\": \"images/cooking/Pancakes.png\",\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"recipe-bread\",\n    \"name\": \"Bread Recipe\",\n    \"price\": 100,\n    \"description\": \"A crusty baguette.\",\n    \"image\": \"images/cooking/Bread.png\",\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"recipe-tortilla\",\n    \"name\": \"Tortilla Recipe\",\n    \"price\": 100,\n    \"description\": \"Can be used as a vessel for food or eaten by itself.\",\n    \"image\": \"images/cooking/Tortilla.png\",\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"recipe-pizza\",\n    \"name\": \"Pizza Recipe\",\n    \"price\": 150,\n    \"description\": \"It's popular for all the right reasons.\",\n    \"image\": \"images/cooking/Pizza.png\",\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"recipe-maki-roll\",\n    \"name\": \"Maki Roll Recipe\",\n    \"price\": 300,\n    \"description\": \"Fish and rice wrapped in seaweed.\",\n    \"image\": \"images/cooking/Maki Roll.png\",\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"recipe-cookie\",\n    \"name\": \"Cookie Recipe\",\n    \"price\": 300,\n    \"description\": \"Very chewy.\",\n    \"image\": \"images/cooking/Cookie.png\",\n    \"category\": \"recipe\",\n    \"availability\": \"After Evelyn's 4-heart event\"\n  },\n  {\n    \"id\": \"recipe-triple-shot-espresso\",\n    \"name\": \"Triple Shot Espresso Recipe\",\n    \"price\": 5000,\n    \"description\": \"It's more potent than regular coffee!\",\n    \"image\": \"images/cooking/Triple Shot Espresso.png\",\n    \"category\": \"recipe\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport saloonData from '@/data/saloon-shop.json';\nimport { SaloonCategory, SaloonItem } from '@/types';\n\nconst allSaloonData: SaloonItem[] = saloonData as SaloonItem[];\n\n/** Query builder for The Stardrop Saloon shop stock. All filter and sort methods return a new SaloonQuery for chaining. */\nexport class SaloonQuery extends QueryBase<SaloonItem> {\n  constructor(data: SaloonItem[] = allSaloonData) {\n    super(data);\n  }\n\n  /** Filter to food and drink items only. */\n  food(): SaloonQuery {\n    return new SaloonQuery(this.data.filter((item) => item.category === 'food'));\n  }\n\n  /** Filter to cooking recipe items only. */\n  recipes(): SaloonQuery {\n    return new SaloonQuery(this.data.filter((item) => item.category === 'recipe'));\n  }\n\n  /** Filter by category. */\n  byCategory(category: SaloonCategory): SaloonQuery {\n    return new SaloonQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter to items that are always available (no special purchase condition). */\n  alwaysAvailable(): SaloonQuery {\n    return new SaloonQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): SaloonQuery {\n    return new SaloonQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): SaloonQuery {\n    return new SaloonQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a SaloonQuery for all items sold at The Stardrop Saloon. Pass `source` to wrap a pre-filtered array. */\nexport function saloon(source: SaloonItem[] = allSaloonData): SaloonQuery {\n  return new SaloonQuery(source);\n}\n","[\n  {\n    \"id\": \"769\",\n    \"name\": \"Void Essence\",\n    \"price\": 100,\n    \"description\": \"A shimmering, purple ball of energy emitted from void spirits.\",\n    \"image\": \"images/monsters/monster-loot/Void Essence.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": 10,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"768\",\n    \"name\": \"Solar Essence\",\n    \"price\": 80,\n    \"description\": \"The glowing face is warm to the touch.\",\n    \"image\": \"images/monsters/monster-loot/Solar Essence.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": 10,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"305\",\n    \"name\": \"Void Egg\",\n    \"price\": 5000,\n    \"description\": \"A jet-black egg with flecks of red. It's warm to the touch.\",\n    \"image\": \"images/animals/produce/Void Egg.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": -1,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"BC34\",\n    \"name\": \"Sign Of The Vessel\",\n    \"price\": 350,\n    \"description\": \"A shadow-people decoration placed in a home to bring fortune and fertility.\",\n    \"image\": \"images/shop/Sign Of The Vessel.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": -1,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"F1800\",\n    \"name\": \"Monster Fireplace\",\n    \"price\": 20000,\n    \"description\": \"A warm and welcoming shadow fireplace.\",\n    \"image\": \"images/shop/Monster Fireplace.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": -1,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"434\",\n    \"name\": \"Stardrop\",\n    \"price\": 20000,\n    \"description\": \"A mysterious fruit that empowers those who eat it. The flavor reminds you of something... but you can't remember what.\",\n    \"image\": \"images/shop/Stardrop.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": 1,\n    \"isRecipe\": false,\n    \"availability\": \"One-time purchase\"\n  },\n  {\n    \"id\": \"recipe-crystal-floor\",\n    \"name\": \"Crystal Floor Recipe\",\n    \"price\": 500,\n    \"description\": \"Tile-like crystal placed on the ground.\",\n    \"image\": \"images/craftable/decor/Crystal Floor.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": -1,\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"recipe-wicked-statue\",\n    \"name\": \"Wicked Statue Recipe\",\n    \"price\": 1000,\n    \"description\": \"It seems to be making a rude gesture.\",\n    \"image\": \"images/craftable/furniture/Wicked Statue.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": -1,\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"ButterflyPowder\",\n    \"name\": \"Butterfly Powder\",\n    \"price\": 20000,\n    \"description\": \"A rare Void ingredient.\",\n    \"image\": \"images/shop/Butterfly Powder.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": -1,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"WizardCatalogue\",\n    \"name\": \"Wizard Catalogue\",\n    \"price\": 150000,\n    \"description\": \"Unlocks the Wizard's complete furniture collection for purchase.\",\n    \"image\": \"images/shop/Wizard Catalogue.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": -1,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"ReturnScepter\",\n    \"name\": \"Return Scepter\",\n    \"price\": 2000000,\n    \"description\": \"Wave the scepter to instantly return to your farm.\",\n    \"image\": \"images/shop/Return Scepter.png\",\n    \"stockType\": \"permanent\",\n    \"stockLimit\": -1,\n    \"isRecipe\": false,\n    \"availability\": \"One-time purchase\"\n  },\n  {\n    \"id\": \"766\",\n    \"name\": \"Slime\",\n    \"price\": 10,\n    \"description\": \"A wad of sticky slime.\",\n    \"image\": \"images/monsters/monster-loot/Slime.png\",\n    \"stockType\": \"daily\",\n    \"day\": \"Monday\",\n    \"stockLimit\": 50,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"749\",\n    \"name\": \"Omni Geode\",\n    \"price\": 300,\n    \"description\": \"A pungent mass that contains a rainbow of crystals. A geologist can crack it open for you.\",\n    \"image\": \"images/minerals/geodes/Omni Geode.png\",\n    \"stockType\": \"daily\",\n    \"day\": \"Tuesday\",\n    \"stockLimit\": 1,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"770\",\n    \"name\": \"Mixed Seeds\",\n    \"price\": 30,\n    \"description\": \"There's a little bit of everything here. Plant them and see what grows!\",\n    \"image\": \"images/mixed-seeds/mixed-seeds.png\",\n    \"stockType\": \"daily\",\n    \"day\": \"Thursday\",\n    \"stockLimit\": 10,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"645\",\n    \"name\": \"Iridium Sprinkler\",\n    \"price\": 10000,\n    \"description\": \"Waters the 24 adjacent tiles every morning.\",\n    \"image\": \"images/craftable/sprinklers/Iridium Sprinkler.png\",\n    \"stockType\": \"daily\",\n    \"day\": \"Friday\",\n    \"stockLimit\": 1,\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"767\",\n    \"name\": \"Bat Wing\",\n    \"price\": 30,\n    \"description\": \"A delicate membrane used for crafting and potion-making.\",\n    \"image\": \"images/monsters/monster-loot/Bat Wing.png\",\n    \"stockType\": \"daily\",\n    \"day\": \"Sunday\",\n    \"stockLimit\": 10,\n    \"isRecipe\": false\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport krobusData from '@/data/krobus-shop.json';\nimport { KrobusDay, KrobusItem } from '@/types';\n\nconst allKrobusData: KrobusItem[] = krobusData as KrobusItem[];\n\n/** Query builder for Krobus's shop stock. All filter and sort methods return a new KrobusQuery for chaining. */\nexport class KrobusQuery extends QueryBase<KrobusItem> {\n  constructor(data: KrobusItem[] = allKrobusData) {\n    super(data);\n  }\n\n  /** Filter to year-round permanent stock only. */\n  permanent(): KrobusQuery {\n    return new KrobusQuery(this.data.filter((item) => item.stockType === 'permanent'));\n  }\n\n  /** Filter to daily rotating items only. */\n  daily(): KrobusQuery {\n    return new KrobusQuery(this.data.filter((item) => item.stockType === 'daily'));\n  }\n\n  /** Filter to items available on the given day of the week. */\n  byDay(day: KrobusDay): KrobusQuery {\n    return new KrobusQuery(\n      this.data.filter((item) => item.stockType === 'permanent' || item.day === day),\n    );\n  }\n\n  /** Filter to crafting or building recipe items only. */\n  recipes(): KrobusQuery {\n    return new KrobusQuery(this.data.filter((item) => item.isRecipe));\n  }\n\n  /** Filter to items that are always available (no special purchase condition). */\n  alwaysAvailable(): KrobusQuery {\n    return new KrobusQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): KrobusQuery {\n    return new KrobusQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): KrobusQuery {\n    return new KrobusQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a KrobusQuery for all items sold by Krobus. Pass `source` to wrap a pre-filtered array. */\nexport function krobus(source: KrobusItem[] = allKrobusData): KrobusQuery {\n  return new KrobusQuery(source);\n}\n","[\n  {\n    \"id\": \"178\",\n    \"name\": \"Hay\",\n    \"price\": 50,\n    \"description\": \"Feed for your animals. Keep a bin stocked or they'll go hungry.\",\n    \"image\": \"images/shop/Hay.png\",\n    \"category\": \"animal-supply\"\n  },\n  {\n    \"id\": \"BC104\",\n    \"name\": \"Heater\",\n    \"price\": 2000,\n    \"description\": \"Warms the barn or coop during winter, keeping animals happy despite the cold.\",\n    \"image\": \"images/tools/Heater.png\",\n    \"category\": \"animal-supply\"\n  },\n  {\n    \"id\": \"TMilkPail\",\n    \"name\": \"Milk Pail\",\n    \"price\": 1000,\n    \"description\": \"Use it on a cow or goat to collect milk.\",\n    \"image\": \"images/tools/Milk Pail.png\",\n    \"category\": \"tool\",\n    \"availability\": \"Unowned only\"\n  },\n  {\n    \"id\": \"TShears\",\n    \"name\": \"Shears\",\n    \"price\": 1000,\n    \"description\": \"Use these to collect wool from sheep.\",\n    \"image\": \"images/tools/Shears.png\",\n    \"category\": \"tool\",\n    \"availability\": \"Unowned only\"\n  },\n  {\n    \"id\": \"BC165\",\n    \"name\": \"Auto-Grabber\",\n    \"price\": 25000,\n    \"description\": \"Automatically collects animal products each morning.\",\n    \"image\": \"images/tools/Auto-Grabber.png\",\n    \"category\": \"animal-supply\",\n    \"availability\": \"Farming level 10+\"\n  },\n  {\n    \"id\": \"BC45\",\n    \"name\": \"Ornamental Hay Bale\",\n    \"price\": 250,\n    \"description\": \"A charming hay bale decoration for your farm.\",\n    \"image\": \"images/shop/Ornamental Hay Bale.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"BookAnimalCatalogue\",\n    \"name\": \"Animal Catalogue\",\n    \"price\": 5000,\n    \"description\": \"Unlocks a wide selection of animal-themed furniture and decor for purchase.\",\n    \"image\": \"images/special-items/Animal Catalogue.png\",\n    \"category\": \"catalogue\",\n    \"availability\": \"Year 2+\"\n  },\n  {\n    \"id\": \"928\",\n    \"name\": \"Golden Egg\",\n    \"price\": 100000,\n    \"description\": \"A very rare egg from a very happy chicken.\",\n    \"image\": \"images/animals/produce/Golden Egg.png\",\n    \"category\": \"special\",\n    \"availability\": \"Secret Note #44\"\n  },\n  {\n    \"id\": \"FCowDecal\",\n    \"name\": \"Cow Decal\",\n    \"price\": 10000,\n    \"description\": \"A decorative cow painting for your home.\",\n    \"image\": \"images/shop/Cow Decal.png\",\n    \"category\": \"furniture\",\n    \"availability\": \"17+ ticket prizes claimed\"\n  },\n  {\n    \"id\": \"FDoghouse\",\n    \"name\": \"Doghouse\",\n    \"price\": 10000,\n    \"description\": \"A cozy home for your dog.\",\n    \"image\": \"images/shop/Doghouse.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"FDarkDoghouse\",\n    \"name\": \"Dark Doghouse\",\n    \"price\": 10000,\n    \"description\": \"A darkly elegant house for your dog.\",\n    \"image\": \"images/shop/Dark Doghouse.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"FCatTree\",\n    \"name\": \"Cat Tree\",\n    \"price\": 10000,\n    \"description\": \"A scratching post and perch your cat will love.\",\n    \"image\": \"images/shop/Cat Tree.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"FDarkCatTree\",\n    \"name\": \"Dark Cat Tree\",\n    \"price\": 10000,\n    \"description\": \"A dark-themed cat tree for feline elegance.\",\n    \"image\": \"images/shop/Dark Cat Tree.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"FBirdHouse\",\n    \"name\": \"Bird House\",\n    \"price\": 5000,\n    \"description\": \"Invites wild birds to nest on your farm.\",\n    \"image\": \"images/shop/Bird House.png\",\n    \"category\": \"furniture\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport marnieData from '@/data/marnie-shop.json';\nimport { MarnieCategory, MarnieItem } from '@/types';\n\nconst allMarnieData: MarnieItem[] = marnieData as MarnieItem[];\n\n/** Query builder for Marnie's Ranch shop stock. All filter and sort methods return a new MarnieQuery for chaining. */\nexport class MarnieQuery extends QueryBase<MarnieItem> {\n  constructor(data: MarnieItem[] = allMarnieData) {\n    super(data);\n  }\n\n  /** Filter to items in the given category. */\n  byCategory(category: MarnieCategory): MarnieQuery {\n    return new MarnieQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter to animal supply items (Hay, Heater, Auto-Grabber). */\n  animalSupplies(): MarnieQuery {\n    return new MarnieQuery(this.data.filter((item) => item.category === 'animal-supply'));\n  }\n\n  /** Filter to tools (Milk Pail, Shears). */\n  tools(): MarnieQuery {\n    return new MarnieQuery(this.data.filter((item) => item.category === 'tool'));\n  }\n\n  /** Filter to furniture and decor items. */\n  furniture(): MarnieQuery {\n    return new MarnieQuery(this.data.filter((item) => item.category === 'furniture'));\n  }\n\n  /** Filter to items with no special purchase condition. */\n  alwaysAvailable(): MarnieQuery {\n    return new MarnieQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): MarnieQuery {\n    return new MarnieQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): MarnieQuery {\n    return new MarnieQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a MarnieQuery for all items sold at Marnie's Ranch. Pass `source` to wrap a pre-filtered array. */\nexport function marnie(source: MarnieItem[] = allMarnieData): MarnieQuery {\n  return new MarnieQuery(source);\n}\n","[\n  {\n    \"id\": \"earth-obelisk\",\n    \"name\": \"Earth Obelisk\",\n    \"buildCost\": 500000,\n    \"materials\": [\n      {\n        \"itemId\": \"337\",\n        \"itemName\": \"Iridium Bar\",\n        \"amount\": 10,\n        \"image\": \"images/minerals/bars/Iridium Bar.png\"\n      },\n      {\n        \"itemId\": \"86\",\n        \"itemName\": \"Earth Crystal\",\n        \"amount\": 10,\n        \"image\": \"images/minerals/foraged-minerals/Earth Crystal.png\"\n      }\n    ],\n    \"description\": \"Instantly teleports you to the mountain near the mines.\",\n    \"image\": \"images/buildings/obelisks/Earth Obelisk.png\"\n  },\n  {\n    \"id\": \"water-obelisk\",\n    \"name\": \"Water Obelisk\",\n    \"buildCost\": 500000,\n    \"materials\": [\n      {\n        \"itemId\": \"337\",\n        \"itemName\": \"Iridium Bar\",\n        \"amount\": 5,\n        \"image\": \"images/minerals/bars/Iridium Bar.png\"\n      },\n      { \"itemId\": \"372\", \"itemName\": \"Clam\", \"amount\": 10, \"image\": \"images/fish/Clam.png\" },\n      {\n        \"itemId\": \"393\",\n        \"itemName\": \"Coral\",\n        \"amount\": 10,\n        \"image\": \"images/forageables/Coral.png\"\n      }\n    ],\n    \"description\": \"Instantly teleports you to the beach.\",\n    \"image\": \"images/buildings/obelisks/Water Obelisk.png\"\n  },\n  {\n    \"id\": \"desert-obelisk\",\n    \"name\": \"Desert Obelisk\",\n    \"buildCost\": 1000000,\n    \"materials\": [\n      {\n        \"itemId\": \"337\",\n        \"itemName\": \"Iridium Bar\",\n        \"amount\": 20,\n        \"image\": \"images/minerals/bars/Iridium Bar.png\"\n      },\n      {\n        \"itemId\": \"88\",\n        \"itemName\": \"Coconut\",\n        \"amount\": 10,\n        \"image\": \"images/forageables/Coconut.png\"\n      },\n      {\n        \"itemId\": \"90\",\n        \"itemName\": \"Cactus Fruit\",\n        \"amount\": 10,\n        \"image\": \"images/crops/cactus-fruit/crop.png\"\n      }\n    ],\n    \"description\": \"Instantly teleports you to the Calico Desert.\",\n    \"image\": \"images/buildings/obelisks/Desert Obelisk.png\"\n  },\n  {\n    \"id\": \"island-obelisk\",\n    \"name\": \"Island Obelisk\",\n    \"buildCost\": 1000000,\n    \"materials\": [\n      {\n        \"itemId\": \"337\",\n        \"itemName\": \"Iridium Bar\",\n        \"amount\": 10,\n        \"image\": \"images/minerals/bars/Iridium Bar.png\"\n      },\n      {\n        \"itemId\": \"852\",\n        \"itemName\": \"Dragon Tooth\",\n        \"amount\": 10,\n        \"image\": \"images/monsters/monster-loot/Dragon Tooth.png\"\n      },\n      {\n        \"itemId\": \"91\",\n        \"itemName\": \"Banana\",\n        \"amount\": 10,\n        \"image\": \"images/trees/banana/harvest.png\"\n      }\n    ],\n    \"description\": \"Instantly teleports you to Ginger Island.\",\n    \"image\": \"images/buildings/obelisks/Island Obelisk.png\",\n    \"availability\": \"After visiting Ginger Island\"\n  },\n  {\n    \"id\": \"junimo-hut\",\n    \"name\": \"Junimo Hut\",\n    \"buildCost\": 20000,\n    \"materials\": [\n      {\n        \"itemId\": \"390\",\n        \"itemName\": \"Stone\",\n        \"amount\": 200,\n        \"image\": \"images/forageables/Stone.png\"\n      },\n      {\n        \"itemId\": \"268\",\n        \"itemName\": \"Starfruit\",\n        \"amount\": 9,\n        \"image\": \"images/crops/starfruit/crop.png\"\n      },\n      {\n        \"itemId\": \"771\",\n        \"itemName\": \"Fiber\",\n        \"amount\": 100,\n        \"image\": \"images/crops/fiber/crop.png\"\n      }\n    ],\n    \"description\": \"Junimos live here and harvest any ripe crops within a wide radius each day.\",\n    \"image\": \"images/buildings/Junimo Hut.png\"\n  },\n  {\n    \"id\": \"gold-clock\",\n    \"name\": \"Gold Clock\",\n    \"buildCost\": 10000000,\n    \"materials\": [],\n    \"description\": \"Prevents your farm from accumulating debris and stops fences from decaying.\",\n    \"image\": \"images/buildings/Gold Clock.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport wizardData from '@/data/wizard-shop.json';\nimport { WizardBuilding } from '@/types';\n\nconst allWizardData: WizardBuilding[] = wizardData as WizardBuilding[];\n\n/** Query builder for the Wizard's magical constructions. All sort methods return a new WizardQuery for chaining. */\nexport class WizardQuery extends QueryBase<WizardBuilding> {\n  constructor(data: WizardBuilding[] = allWizardData) {\n    super(data);\n  }\n\n  /** Filter to buildings with no special availability condition. */\n  alwaysAvailable(): WizardQuery {\n    return new WizardQuery(this.data.filter((b) => b.availability === undefined));\n  }\n\n  /** Sort by build cost ascending or descending. */\n  sortByCost(order: 'asc' | 'desc' = 'asc'): WizardQuery {\n    return new WizardQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.buildCost - b.buildCost : b.buildCost - a.buildCost,\n      ),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): WizardQuery {\n    return new WizardQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a WizardQuery for all magical constructions at the Wizard's Tower. Pass `source` to wrap a pre-filtered array. */\nexport function wizard(source: WizardBuilding[] = allWizardData): WizardQuery {\n  return new WizardQuery(source);\n}\n","[\n  {\n    \"id\": \"TBambooPole\",\n    \"name\": \"Bamboo Pole\",\n    \"price\": 0,\n    \"description\": \"The most basic fishing rod. Can only use bait.\",\n    \"image\": \"images/tools/fishing-rod/Bamboo Pole.png\",\n    \"category\": \"rod\"\n  },\n  {\n    \"id\": \"TTrainingRod\",\n    \"name\": \"Training Rod\",\n    \"price\": 25,\n    \"description\": \"Limits the fish you can catch, but makes the catching mini-game easier. Incompatible with tackle and bait.\",\n    \"image\": \"images/tools/fishing-rod/Training Rod.png\",\n    \"category\": \"rod\"\n  },\n  {\n    \"id\": \"219\",\n    \"name\": \"Trout Soup\",\n    \"price\": 250,\n    \"description\": \"It's a little bland.\",\n    \"image\": \"images/cooking/Trout Soup.png\",\n    \"category\": \"equipment\"\n  },\n  {\n    \"id\": \"685\",\n    \"name\": \"Bait\",\n    \"price\": 5,\n    \"description\": \"Causes fish to bite faster. Must first be attached to a fishing rod.\",\n    \"image\": \"images/fish/bait/Bait.png\",\n    \"category\": \"bait\",\n    \"fishingLevelRequired\": 2\n  },\n  {\n    \"id\": \"DeluxeBait\",\n    \"name\": \"Deluxe Bait\",\n    \"price\": 100,\n    \"description\": \"Causes fish to bite even faster and increases the size of the fishing bar.\",\n    \"image\": \"images/fish/bait/Deluxe Bait.png\",\n    \"category\": \"bait\",\n    \"fishingLevelRequired\": 4\n  },\n  {\n    \"id\": \"TFiberglassRod\",\n    \"name\": \"Fiberglass Rod\",\n    \"price\": 1800,\n    \"description\": \"Can use bait. A big upgrade from the bamboo pole.\",\n    \"image\": \"images/tools/fishing-rod/Fiberglass Rod.png\",\n    \"category\": \"rod\",\n    \"fishingLevelRequired\": 2\n  },\n  {\n    \"id\": \"710\",\n    \"name\": \"Crab Pot\",\n    \"price\": 1500,\n    \"description\": \"Place it in the water and check back the next day to see what you've trapped.\",\n    \"image\": \"images/craftable/fishing/Crab Pot.png\",\n    \"category\": \"equipment\",\n    \"fishingLevelRequired\": 3\n  },\n  {\n    \"id\": \"686\",\n    \"name\": \"Spinner\",\n    \"price\": 500,\n    \"description\": \"The shape makes it spin around in the water. Slightly increases the bite-rate when fishing.\",\n    \"image\": \"images/fish/tackle/Spinner.png\",\n    \"category\": \"tackle\",\n    \"fishingLevelRequired\": 6\n  },\n  {\n    \"id\": \"694\",\n    \"name\": \"Trap Bobber\",\n    \"price\": 500,\n    \"description\": \"Causes fish to escape slower when you aren't reeling them in.\",\n    \"image\": \"images/fish/tackle/Trap Bobber.png\",\n    \"category\": \"tackle\",\n    \"fishingLevelRequired\": 6\n  },\n  {\n    \"id\": \"692\",\n    \"name\": \"Lead Bobber\",\n    \"price\": 200,\n    \"description\": \"Adds weight to your 'fishing bar', preventing it from bouncing along the bottom.\",\n    \"image\": \"images/fish/tackle/Lead Bobber.png\",\n    \"category\": \"tackle\",\n    \"fishingLevelRequired\": 6\n  },\n  {\n    \"id\": \"SonarBobber\",\n    \"name\": \"Sonar Bobber\",\n    \"price\": 500,\n    \"description\": \"Shows what fish is on the line before it's caught.\",\n    \"image\": \"images/fish/tackle/Sonar Bobber.png\",\n    \"category\": \"tackle\",\n    \"fishingLevelRequired\": 6\n  },\n  {\n    \"id\": \"TIridiumRod\",\n    \"name\": \"Iridium Rod\",\n    \"price\": 7500,\n    \"description\": \"Can use both bait and tackle.\",\n    \"image\": \"images/tools/fishing-rod/Iridium Rod.png\",\n    \"category\": \"rod\",\n    \"fishingLevelRequired\": 6\n  },\n  {\n    \"id\": \"693\",\n    \"name\": \"Treasure Hunter\",\n    \"price\": 750,\n    \"description\": \"Fish don't escape while collecting treasures. Also slightly increases the chance to find treasures.\",\n    \"image\": \"images/fish/tackle/Treasure Hunter.png\",\n    \"category\": \"tackle\",\n    \"fishingLevelRequired\": 7\n  },\n  {\n    \"id\": \"695\",\n    \"name\": \"Cork Bobber\",\n    \"price\": 750,\n    \"description\": \"Slightly increases the size of your 'fishing bar'.\",\n    \"image\": \"images/fish/tackle/Cork Bobber.png\",\n    \"category\": \"tackle\",\n    \"fishingLevelRequired\": 7\n  },\n  {\n    \"id\": \"691\",\n    \"name\": \"Barbed Hook\",\n    \"price\": 1000,\n    \"description\": \"Makes your catch more secure, causing the 'fishing bar' to cling to your catch. Works best on slow, weak fish.\",\n    \"image\": \"images/fish/tackle/Barbed Hook.png\",\n    \"category\": \"tackle\",\n    \"fishingLevelRequired\": 8\n  },\n  {\n    \"id\": \"687\",\n    \"name\": \"Dressed Spinner\",\n    \"price\": 1000,\n    \"description\": \"The metal tab and colorful streamers create an enticing spectacle for fish. Increases the bite-rate when fishing.\",\n    \"image\": \"images/fish/tackle/Dressed Spinner.png\",\n    \"category\": \"tackle\",\n    \"fishingLevelRequired\": 8\n  },\n  {\n    \"id\": \"703\",\n    \"name\": \"Magnet\",\n    \"price\": 1000,\n    \"description\": \"Increases the chance of finding treasure while fishing.\",\n    \"image\": \"images/fish/bait/Magnet.png\",\n    \"category\": \"bait\",\n    \"fishingLevelRequired\": 9\n  },\n  {\n    \"id\": \"877\",\n    \"name\": \"Quality Bobber\",\n    \"price\": 300,\n    \"description\": \"Boosts the quality of fish that you catch.\",\n    \"image\": \"images/fish/tackle/Quality Bobber.png\",\n    \"category\": \"tackle\",\n    \"fishingLevelRequired\": 6\n  },\n  {\n    \"id\": \"TPan\",\n    \"name\": \"Copper Pan\",\n    \"price\": 2500,\n    \"description\": \"Use it in the water to sift for precious ore.\",\n    \"image\": \"images/tools/pan/Copper Pan.png\",\n    \"category\": \"equipment\",\n    \"availability\": \"After completing the Fish Tank bundle\"\n  },\n  {\n    \"id\": \"BCFishSmoker\",\n    \"name\": \"Fish Smoker\",\n    \"price\": 10000,\n    \"description\": \"Turns fish into smoked fish, which sells for more.\",\n    \"image\": \"images/craftable/artisan-equipment/Fish Smoker.png\",\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"TAdvancedIridiumRod\",\n    \"name\": \"Advanced Iridium Rod\",\n    \"price\": 25000,\n    \"description\": \"The finest fishing rod available. Can use bait and two tackle at once.\",\n    \"image\": \"images/tools/fishing-rod/Advanced Iridium Rod.png\",\n    \"category\": \"rod\",\n    \"availability\": \"Fishing mastery\"\n  },\n  {\n    \"id\": \"F2304\",\n    \"name\": \"Large Fish Tank\",\n    \"price\": 2000,\n    \"description\": \"A spacious aquarium to display your prized catches.\",\n    \"image\": \"images/shop/Large Fish Tank.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"F2322\",\n    \"name\": \"Small Fish Tank\",\n    \"price\": 500,\n    \"description\": \"A compact aquarium for displaying fish.\",\n    \"image\": \"images/shop/Small Fish Tank.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"F2502\",\n    \"name\": \"Fisher Double Bed\",\n    \"price\": 25000,\n    \"description\": \"A nautical-themed double bed with a fish motif.\",\n    \"image\": \"images/shop/Fisher Double Bed.png\",\n    \"category\": \"furniture\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport willyData from '@/data/willy-shop.json';\nimport { WillyCategory, WillyItem } from '@/types';\n\nconst allWillyData: WillyItem[] = willyData as WillyItem[];\n\n/** Query builder for Willy's Fish Shop stock. All filter and sort methods return a new WillyQuery for chaining. */\nexport class WillyQuery extends QueryBase<WillyItem> {\n  constructor(data: WillyItem[] = allWillyData) {\n    super(data);\n  }\n\n  /** Filter to fishing rods only. */\n  rods(): WillyQuery {\n    return new WillyQuery(this.data.filter((item) => item.category === 'rod'));\n  }\n\n  /** Filter to bait items only. */\n  bait(): WillyQuery {\n    return new WillyQuery(this.data.filter((item) => item.category === 'bait'));\n  }\n\n  /** Filter to tackle items only. */\n  tackle(): WillyQuery {\n    return new WillyQuery(this.data.filter((item) => item.category === 'tackle'));\n  }\n\n  /** Filter to items in the given category. */\n  byCategory(category: WillyCategory): WillyQuery {\n    return new WillyQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter to items requiring the given fishing level or lower. */\n  byFishingLevel(level: number): WillyQuery {\n    return new WillyQuery(\n      this.data.filter(\n        (item) => item.fishingLevelRequired === undefined || item.fishingLevelRequired <= level,\n      ),\n    );\n  }\n\n  /** Filter to items with no special purchase condition. */\n  alwaysAvailable(): WillyQuery {\n    return new WillyQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): WillyQuery {\n    return new WillyQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): WillyQuery {\n    return new WillyQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n\n  /** Sort by fishing level required (ascending by default). */\n  sortByFishingLevel(order: 'asc' | 'desc' = 'asc'): WillyQuery {\n    return new WillyQuery(\n      [...this.data].sort((a, b) => {\n        const la = a.fishingLevelRequired ?? 0;\n        const lb = b.fishingLevelRequired ?? 0;\n        return order === 'asc' ? la - lb : lb - la;\n      }),\n    );\n  }\n}\n\n/** Returns a WillyQuery for all items sold at Willy's Fish Shop. Pass `source` to wrap a pre-filtered array. */\nexport function willy(source: WillyItem[] = allWillyData): WillyQuery {\n  return new WillyQuery(source);\n}\n","[\n  {\n    \"id\": \"W0\",\n    \"name\": \"Rusty Sword\",\n    \"price\": 250,\n    \"description\": \"An old, battered sword. It's seen better days.\",\n    \"image\": \"images/weapons/swords/Rusty Sword.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\"\n  },\n  {\n    \"id\": \"W12\",\n    \"name\": \"Wooden Blade\",\n    \"price\": 250,\n    \"description\": \"A training weapon made of hardwood.\",\n    \"image\": \"images/weapons/swords/Wooden Blade.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\"\n  },\n  {\n    \"id\": \"W31\",\n    \"name\": \"Femur\",\n    \"price\": 350,\n    \"description\": \"A large bone that can be used as a club. Not exactly dignified.\",\n    \"image\": \"images/weapons/clubs/Femur.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"club\",\n    \"mineLevel\": 10\n  },\n  {\n    \"id\": \"B507\",\n    \"name\": \"Work Boots\",\n    \"price\": 700,\n    \"description\": \"Steel-toed for extra protection.\",\n    \"image\": \"images/footwear/Work Boots.png\",\n    \"category\": \"boots\",\n    \"mineLevel\": 10\n  },\n  {\n    \"id\": \"W17\",\n    \"name\": \"Iron Dirk\",\n    \"price\": 500,\n    \"description\": \"A small iron dagger. Quick in a fight.\",\n    \"image\": \"images/weapons/daggers/Iron Dirk.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"dagger\",\n    \"mineLevel\": 15\n  },\n  {\n    \"id\": \"W1\",\n    \"name\": \"Silver Saber\",\n    \"price\": 750,\n    \"description\": \"A curved sword with a gleaming silver edge.\",\n    \"image\": \"images/weapons/swords/Silver Saber.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 20\n  },\n  {\n    \"id\": \"W20\",\n    \"name\": \"Elf Blade\",\n    \"price\": 750,\n    \"description\": \"A dainty blade with impressive reach.\",\n    \"image\": \"images/weapons/daggers/Elf Blade.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"dagger\",\n    \"mineLevel\": 20\n  },\n  {\n    \"id\": \"W11\",\n    \"name\": \"Steel Smallsword\",\n    \"price\": 750,\n    \"description\": \"A sturdy steel sword favored by knights.\",\n    \"image\": \"images/weapons/swords/Steel Smallsword.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 20\n  },\n  {\n    \"id\": \"B506\",\n    \"name\": \"Leather Boots\",\n    \"price\": 500,\n    \"description\": \"The leather is very supple.\",\n    \"image\": \"images/footwear/Leather Boots.png\",\n    \"category\": \"boots\",\n    \"mineLevel\": 10\n  },\n  {\n    \"id\": \"W43\",\n    \"name\": \"Pirate's Sword\",\n    \"price\": 850,\n    \"description\": \"A sword favored by ruthless pirates.\",\n    \"image\": \"images/weapons/swords/Pirate's Sword.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 25\n  },\n  {\n    \"id\": \"W44\",\n    \"name\": \"Cutlass\",\n    \"price\": 1500,\n    \"description\": \"A broad, curved blade. Light and fast.\",\n    \"image\": \"images/weapons/swords/Cutlass.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 25\n  },\n  {\n    \"id\": \"529\",\n    \"name\": \"Amethyst Ring\",\n    \"price\": 1000,\n    \"description\": \"Increases knockback by 10%.\",\n    \"image\": \"images/rings/Amethyst Ring.png\",\n    \"category\": \"ring\"\n  },\n  {\n    \"id\": \"530\",\n    \"name\": \"Topaz Ring\",\n    \"price\": 1000,\n    \"description\": \"Increases Defense by +1.\",\n    \"image\": \"images/rings/Topaz Ring.png\",\n    \"category\": \"ring\"\n  },\n  {\n    \"id\": \"W27\",\n    \"name\": \"Wood Mallet\",\n    \"price\": 2000,\n    \"description\": \"A heavy wooden mallet that deals crushing blows.\",\n    \"image\": \"images/weapons/clubs/Wood Mallet.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"club\",\n    \"mineLevel\": 40\n  },\n  {\n    \"id\": \"B508\",\n    \"name\": \"Combat Boots\",\n    \"price\": 1250,\n    \"description\": \"Reinforced with iron mesh.\",\n    \"image\": \"images/footwear/Combat Boots.png\",\n    \"category\": \"boots\",\n    \"mineLevel\": 40\n  },\n  {\n    \"id\": \"531\",\n    \"name\": \"Aquamarine Ring\",\n    \"price\": 2500,\n    \"description\": \"Increases critical strike chance by 10%.\",\n    \"image\": \"images/rings/Aquamarine Ring.png\",\n    \"category\": \"ring\",\n    \"mineLevel\": 40\n  },\n  {\n    \"id\": \"532\",\n    \"name\": \"Jade Ring\",\n    \"price\": 2500,\n    \"description\": \"Increases Critical Strike Power by 10%.\",\n    \"image\": \"images/rings/Jade Ring.png\",\n    \"category\": \"ring\",\n    \"mineLevel\": 40\n  },\n  {\n    \"id\": \"W32\",\n    \"name\": \"Slingshot\",\n    \"price\": 500,\n    \"description\": \"A simple slingshot. Load it with stones or other ammo.\",\n    \"image\": \"images/weapons/slingshots/Slingshot.png\",\n    \"category\": \"slingshot\",\n    \"mineLevel\": 40\n  },\n  {\n    \"id\": \"W10\",\n    \"name\": \"Claymore\",\n    \"price\": 2000,\n    \"description\": \"A large two-handed sword. Slow but powerful.\",\n    \"image\": \"images/weapons/swords/Claymore.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 45\n  },\n  {\n    \"id\": \"B509\",\n    \"name\": \"Tundra Boots\",\n    \"price\": 750,\n    \"description\": \"The fuzzy lining keeps your ankles so warm.\",\n    \"image\": \"images/footwear/Tundra Boots.png\",\n    \"category\": \"boots\",\n    \"mineLevel\": 50\n  },\n  {\n    \"id\": \"W7\",\n    \"name\": \"Templar's Blade\",\n    \"price\": 4000,\n    \"description\": \"A sword blessed by an ancient order.\",\n    \"image\": \"images/weapons/swords/Templar's Blade.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 55\n  },\n  {\n    \"id\": \"W21\",\n    \"name\": \"Crystal Dagger\",\n    \"price\": 4500,\n    \"description\": \"Made from a rare, incredibly sharp crystal.\",\n    \"image\": \"images/weapons/daggers/Crystal Dagger.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"dagger\",\n    \"mineLevel\": 60\n  },\n  {\n    \"id\": \"W33\",\n    \"name\": \"Master Slingshot\",\n    \"price\": 1000,\n    \"description\": \"A reinforced slingshot with superior range and power.\",\n    \"image\": \"images/weapons/slingshots/Master Slingshot.png\",\n    \"category\": \"slingshot\",\n    \"mineLevel\": 70\n  },\n  {\n    \"id\": \"W5\",\n    \"name\": \"Bone Sword\",\n    \"price\": 6000,\n    \"description\": \"Fashioned from the bones of a fearsome creature.\",\n    \"image\": \"images/weapons/swords/Bone Sword.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 75\n  },\n  {\n    \"id\": \"B511\",\n    \"name\": \"Dark Boots\",\n    \"price\": 2500,\n    \"description\": \"Made from thick black leather.\",\n    \"image\": \"images/footwear/Dark Boots.png\",\n    \"category\": \"boots\",\n    \"mineLevel\": 80\n  },\n  {\n    \"id\": \"B512\",\n    \"name\": \"Firewalker Boots\",\n    \"price\": 2000,\n    \"description\": \"It's said these can withstand the hottest magma.\",\n    \"image\": \"images/footwear/Firewalker Boots.png\",\n    \"category\": \"boots\",\n    \"mineLevel\": 80\n  },\n  {\n    \"id\": \"533\",\n    \"name\": \"Emerald Ring\",\n    \"price\": 5000,\n    \"description\": \"Increases Weapon Speed by 10%.\",\n    \"image\": \"images/rings/Emerald Ring.png\",\n    \"category\": \"ring\",\n    \"mineLevel\": 80\n  },\n  {\n    \"id\": \"534\",\n    \"name\": \"Ruby Ring\",\n    \"price\": 5000,\n    \"description\": \"Increases Attack by 10%.\",\n    \"image\": \"images/rings/Ruby Ring.png\",\n    \"category\": \"ring\",\n    \"mineLevel\": 80\n  },\n  {\n    \"id\": \"W50\",\n    \"name\": \"Steel Falchion\",\n    \"price\": 9000,\n    \"description\": \"A fast, curved steel blade.\",\n    \"image\": \"images/weapons/swords/Steel Falchion.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 90\n  },\n  {\n    \"id\": \"W8\",\n    \"name\": \"Obsidian Edge\",\n    \"price\": 9000,\n    \"description\": \"The volcanic glass edge is frighteningly sharp.\",\n    \"image\": \"images/weapons/swords/Obsidian Edge.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 90\n  },\n  {\n    \"id\": \"B514\",\n    \"name\": \"Space Boots\",\n    \"price\": 5000,\n    \"description\": \"An iridium weave gives them a purple sheen.\",\n    \"image\": \"images/footwear/Space Boots.png\",\n    \"category\": \"boots\",\n    \"mineLevel\": 110\n  },\n  {\n    \"id\": \"W9\",\n    \"name\": \"Lava Katana\",\n    \"price\": 25000,\n    \"description\": \"Forged in the deepest reaches of the volcano.\",\n    \"image\": \"images/weapons/swords/Lava Katana.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"mineLevel\": 120\n  },\n  {\n    \"id\": \"441\",\n    \"name\": \"Explosive Ammo\",\n    \"price\": 300,\n    \"description\": \"Fired from a Slingshot. Explodes on impact.\",\n    \"image\": \"images/craftable/misc/Explosive Ammo.png\",\n    \"category\": \"ammo\",\n    \"availability\": \"Explosive Ammo recipe known\"\n  },\n  {\n    \"id\": \"W4\",\n    \"name\": \"Galaxy Sword\",\n    \"price\": 50000,\n    \"description\": \"Crafted from rare extraterrestrial materials.\",\n    \"image\": \"images/weapons/swords/Galaxy Sword.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"sword\",\n    \"availability\": \"After obtaining the Galaxy Sword\"\n  },\n  {\n    \"id\": \"W23\",\n    \"name\": \"Galaxy Dagger\",\n    \"price\": 35000,\n    \"description\": \"A razor-sharp dagger forged from galaxy ore.\",\n    \"image\": \"images/weapons/daggers/Galaxy Dagger.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"dagger\",\n    \"availability\": \"After obtaining the Galaxy Sword\"\n  },\n  {\n    \"id\": \"W29\",\n    \"name\": \"Galaxy Hammer\",\n    \"price\": 75000,\n    \"description\": \"A massive hammer forged from galaxy ore.\",\n    \"image\": \"images/weapons/clubs/Galaxy Hammer.png\",\n    \"category\": \"weapon\",\n    \"weaponType\": \"club\",\n    \"availability\": \"After obtaining the Galaxy Sword\"\n  },\n  {\n    \"id\": \"FWallSword\",\n    \"name\": \"Wall Sword\",\n    \"price\": 2000,\n    \"description\": \"A decorative sword mounted on a wall plaque.\",\n    \"image\": \"images/shop/Wall Sword.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"FDecorativeSword\",\n    \"name\": \"Decorative Sword\",\n    \"price\": 10000,\n    \"description\": \"An ornate sword displayed for its beauty rather than function.\",\n    \"image\": \"images/shop/Decorative Sword.png\",\n    \"category\": \"furniture\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport guildData from '@/data/guild-shop.json';\nimport { GuildCategory, GuildItem, GuildWeaponType } from '@/types';\n\nconst allGuildData: GuildItem[] = guildData as GuildItem[];\n\n/** Query builder for the Adventurer's Guild shop stock. All filter and sort methods return a new GuildQuery for chaining. */\nexport class GuildQuery extends QueryBase<GuildItem> {\n  constructor(data: GuildItem[] = allGuildData) {\n    super(data);\n  }\n\n  /** Filter to weapons only. */\n  weapons(): GuildQuery {\n    return new GuildQuery(this.data.filter((item) => item.category === 'weapon'));\n  }\n\n  /** Filter to boots only. */\n  boots(): GuildQuery {\n    return new GuildQuery(this.data.filter((item) => item.category === 'boots'));\n  }\n\n  /** Filter to rings only. */\n  rings(): GuildQuery {\n    return new GuildQuery(this.data.filter((item) => item.category === 'ring'));\n  }\n\n  /** Filter to slingshots only. */\n  slingshots(): GuildQuery {\n    return new GuildQuery(this.data.filter((item) => item.category === 'slingshot'));\n  }\n\n  /** Filter to items in the given category. */\n  byCategory(category: GuildCategory): GuildQuery {\n    return new GuildQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter weapons by weapon type (sword, dagger, or club). */\n  byWeaponType(type: GuildWeaponType): GuildQuery {\n    return new GuildQuery(this.data.filter((item) => item.weaponType === type));\n  }\n\n  /** Filter to items that unlock at or below the given mine level. */\n  byMineLevel(level: number): GuildQuery {\n    return new GuildQuery(\n      this.data.filter((item) => item.mineLevel === undefined || item.mineLevel <= level),\n    );\n  }\n\n  /** Filter to items with no special purchase condition. */\n  alwaysAvailable(): GuildQuery {\n    return new GuildQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): GuildQuery {\n    return new GuildQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): GuildQuery {\n    return new GuildQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n\n  /** Sort by mine level required (ascending by default). */\n  sortByMineLevel(order: 'asc' | 'desc' = 'asc'): GuildQuery {\n    return new GuildQuery(\n      [...this.data].sort((a, b) => {\n        const la = a.mineLevel ?? 0;\n        const lb = b.mineLevel ?? 0;\n        return order === 'asc' ? la - lb : lb - la;\n      }),\n    );\n  }\n}\n\n/** Returns a GuildQuery for all items sold at the Adventurer's Guild. Pass `source` to wrap a pre-filtered array. */\nexport function guild(source: GuildItem[] = allGuildData): GuildQuery {\n  return new GuildQuery(source);\n}\n","[\n  {\n    \"id\": \"388\",\n    \"name\": \"Wood\",\n    \"price\": 2,\n    \"description\": \"A sturdy, fibrous plant material useful in many crafting recipes.\",\n    \"image\": \"images/forageables/Wood.png\",\n    \"category\": \"material\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"390\",\n    \"name\": \"Stone\",\n    \"price\": 2,\n    \"description\": \"A common resource used for building and crafting.\",\n    \"image\": \"images/forageables/Stone.png\",\n    \"category\": \"material\",\n    \"isRecipe\": false\n  },\n  {\n    \"id\": \"328\",\n    \"name\": \"Wood Floor\",\n    \"price\": 100,\n    \"description\": \"Place on the ground to create a path or flooring.\",\n    \"image\": \"images/craftable/decor/Wood Floor.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"840\",\n    \"name\": \"Rustic Plank Floor\",\n    \"price\": 200,\n    \"description\": \"Worn wooden planks give this floor a rustic charm.\",\n    \"image\": \"images/craftable/decor/Rustic Plank Floor.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"329\",\n    \"name\": \"Stone Floor\",\n    \"price\": 100,\n    \"description\": \"A stone tile floor. Durable and easy to clean.\",\n    \"image\": \"images/craftable/decor/Stone Floor.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"293\",\n    \"name\": \"Brick Floor\",\n    \"price\": 500,\n    \"description\": \"Traditional brick laid in a herringbone pattern.\",\n    \"image\": \"images/craftable/decor/Brick Floor.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"841\",\n    \"name\": \"Stone Walkway Floor\",\n    \"price\": 200,\n    \"description\": \"Flat stones arranged into a neat walkway.\",\n    \"image\": \"images/craftable/decor/Stone Walkway Floor.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"415\",\n    \"name\": \"Stepping Stone Path\",\n    \"price\": 100,\n    \"description\": \"Irregularly-shaped stepping stones for a natural look.\",\n    \"image\": \"images/craftable/decor/Stepping Stone Path.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"401\",\n    \"name\": \"Straw Floor\",\n    \"price\": 200,\n    \"description\": \"A woven straw mat for rustic farm paths.\",\n    \"image\": \"images/craftable/decor/Straw Floor.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"409\",\n    \"name\": \"Crystal Path\",\n    \"price\": 200,\n    \"description\": \"A shimmering crystal path that glows softly at night.\",\n    \"image\": \"images/craftable/decor/Crystal Path.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC152\",\n    \"name\": \"Wood Lamp-post\",\n    \"price\": 50,\n    \"description\": \"Provides light on your farm at night.\",\n    \"image\": \"images/craftable/lighting/Wood Lamp-post.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC153\",\n    \"name\": \"Iron Lamp-post\",\n    \"price\": 100,\n    \"description\": \"An iron lamp-post that provides reliable nighttime lighting.\",\n    \"image\": \"images/craftable/lighting/Iron Lamp-post.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC143\",\n    \"name\": \"Wooden Brazier\",\n    \"price\": 25,\n    \"description\": \"A simple wooden torch stand.\",\n    \"image\": \"images/craftable/lighting/Wooden Brazier.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC144\",\n    \"name\": \"Stone Brazier\",\n    \"price\": 40,\n    \"description\": \"A stone torch stand.\",\n    \"image\": \"images/craftable/lighting/Stone Brazier.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC150\",\n    \"name\": \"Barrel Brazier\",\n    \"price\": 80,\n    \"description\": \"A burning barrel for rustic outdoor lighting.\",\n    \"image\": \"images/craftable/lighting/Barrel Brazier.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC147\",\n    \"name\": \"Stump Brazier\",\n    \"price\": 80,\n    \"description\": \"A glowing stump that lights up the night.\",\n    \"image\": \"images/craftable/lighting/Stump Brazier.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC145\",\n    \"name\": \"Gold Brazier\",\n    \"price\": 100,\n    \"description\": \"A gold-plated torch stand for a touch of luxury.\",\n    \"image\": \"images/craftable/lighting/Gold Brazier.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC148\",\n    \"name\": \"Carved Brazier\",\n    \"price\": 200,\n    \"description\": \"An intricately carved torch stand.\",\n    \"image\": \"images/craftable/lighting/Carved Brazier.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC149\",\n    \"name\": \"Skull Brazier\",\n    \"price\": 300,\n    \"description\": \"A skull-shaped torch holder for the daring decorator.\",\n    \"image\": \"images/craftable/lighting/Skull Brazier.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BC151\",\n    \"name\": \"Marble Brazier\",\n    \"price\": 500,\n    \"description\": \"An elegant marble torch stand.\",\n    \"image\": \"images/craftable/lighting/Marble Brazier.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"BCBigChest\",\n    \"name\": \"Big Chest\",\n    \"price\": 5000,\n    \"description\": \"A large chest with more storage than the regular chest.\",\n    \"image\": \"images/craftable/storage/Big Chest.png\",\n    \"category\": \"recipe\",\n    \"isRecipe\": true\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport carpenterData from '@/data/carpenter-shop.json';\nimport { CarpenterCategory, CarpenterDay, CarpenterItem } from '@/types';\n\nconst allCarpenterData: CarpenterItem[] = carpenterData as CarpenterItem[];\n\n/** Query builder for Robin's Carpenter Shop stock. All filter and sort methods return a new CarpenterQuery for chaining. */\nexport class CarpenterQuery extends QueryBase<CarpenterItem> {\n  constructor(data: CarpenterItem[] = allCarpenterData) {\n    super(data);\n  }\n\n  /** Filter to items in the given category. */\n  byCategory(category: CarpenterCategory): CarpenterQuery {\n    return new CarpenterQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter to crafting recipe items only. */\n  recipes(): CarpenterQuery {\n    return new CarpenterQuery(this.data.filter((item) => item.isRecipe));\n  }\n\n  /** Filter to materials (Wood and Stone). */\n  materials(): CarpenterQuery {\n    return new CarpenterQuery(this.data.filter((item) => item.category === 'material'));\n  }\n\n  /** Filter to items available on the given day of the week. Permanent items (no day set) are always included. */\n  byDay(day: CarpenterDay): CarpenterQuery {\n    return new CarpenterQuery(\n      this.data.filter((item) => item.day === undefined || item.day === day),\n    );\n  }\n\n  /** Filter to items always available (not day-specific). */\n  permanent(): CarpenterQuery {\n    return new CarpenterQuery(this.data.filter((item) => item.day === undefined));\n  }\n\n  /** Filter to items with no special purchase condition. */\n  alwaysAvailable(): CarpenterQuery {\n    return new CarpenterQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): CarpenterQuery {\n    return new CarpenterQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): CarpenterQuery {\n    return new CarpenterQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a CarpenterQuery for all items sold at Robin's Carpenter Shop. Pass `source` to wrap a pre-filtered array. */\nexport function carpenter(source: CarpenterItem[] = allCarpenterData): CarpenterQuery {\n  return new CarpenterQuery(source);\n}\n","[\n  {\n    \"id\": \"H2\",\n    \"name\": \"Top Hat\",\n    \"price\": 8000,\n    \"description\": \"A distinguished top hat. Very classy.\",\n    \"image\": \"images/hats/Top Hat.png\",\n    \"category\": \"hat\"\n  },\n  {\n    \"id\": \"BC126\",\n    \"name\": \"Rarecrow\",\n    \"price\": 10000,\n    \"description\": \"This one's shaped like a rare alien. It works just like a regular scarecrow.\",\n    \"image\": \"images/scarecrows/Rarecrow 7.png\",\n    \"category\": \"scarecrow\"\n  },\n  {\n    \"id\": \"298\",\n    \"name\": \"Hardwood Fence\",\n    \"price\": 100,\n    \"description\": \"Lasts much longer than a regular wood fence.\",\n    \"image\": \"images/craftable/fences/Hardwood Fence.png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"703\",\n    \"name\": \"Magnet\",\n    \"price\": 1000,\n    \"description\": \"Increases the chance of finding treasure while fishing.\",\n    \"image\": \"images/fish/bait/Magnet.png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"688\",\n    \"name\": \"Warp Totem: Farm\",\n    \"price\": 1000,\n    \"description\": \"Warp directly to your farm. Consumed on use.\",\n    \"image\": \"images/craftable/consumables/Warp Totem Farm.png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"893\",\n    \"name\": \"Fireworks (Red)\",\n    \"price\": 200,\n    \"description\": \"A red firework. Launch into the sky for a dazzling display.\",\n    \"image\": \"images/shop/Fireworks (Red).png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"894\",\n    \"name\": \"Fireworks (Purple)\",\n    \"price\": 200,\n    \"description\": \"A purple firework. Launch into the sky for a dazzling display.\",\n    \"image\": \"images/shop/Fireworks (Purple).png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"895\",\n    \"name\": \"Fireworks (Green)\",\n    \"price\": 200,\n    \"description\": \"A green firework. Launch into the sky for a dazzling display.\",\n    \"image\": \"images/shop/Fireworks (Green).png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"F1552\",\n    \"name\": \"Primal Motion\",\n    \"price\": 5000,\n    \"description\": \"A vibrant abstract painting full of raw energy.\",\n    \"image\": \"images/shop/Primal Motion.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"F1545\",\n    \"name\": \"Burnt Offering\",\n    \"price\": 4000,\n    \"description\": \"An evocative painting with warm, fiery tones.\",\n    \"image\": \"images/shop/Burnt Offering.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"F1563\",\n    \"name\": \"Highway 89\",\n    \"price\": 4000,\n    \"description\": \"A painting of an open road stretching into the horizon.\",\n    \"image\": \"images/shop/Highway 89.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"F1561\",\n    \"name\": \"Spires\",\n    \"price\": 3000,\n    \"description\": \"A painting of towering spires reaching into the sky.\",\n    \"image\": \"images/shop/Spires.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"F2192\",\n    \"name\": \"Modern Double Bed\",\n    \"price\": 8000,\n    \"description\": \"A sleek, modern double bed with a minimalist design.\",\n    \"image\": \"images/shop/Modern Double Bed.png\",\n    \"category\": \"furniture\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport casinoData from '@/data/casino-shop.json';\nimport { CasinoCategory, CasinoItem } from '@/types';\n\nconst allCasinoData: CasinoItem[] = casinoData as CasinoItem[];\n\n/** Query builder for the Casino shop stock. All prices are in Qi Coins. All filter and sort methods return a new CasinoQuery for chaining. */\nexport class CasinoQuery extends QueryBase<CasinoItem> {\n  constructor(data: CasinoItem[] = allCasinoData) {\n    super(data);\n  }\n\n  /** Filter to items in the given category. */\n  byCategory(category: CasinoCategory): CasinoQuery {\n    return new CasinoQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter to furniture and decoration items. */\n  furniture(): CasinoQuery {\n    return new CasinoQuery(this.data.filter((item) => item.category === 'furniture'));\n  }\n\n  /** Filter to consumable items (fireworks, magnet, warp totem, hardwood fence). */\n  consumables(): CasinoQuery {\n    return new CasinoQuery(this.data.filter((item) => item.category === 'consumable'));\n  }\n\n  /** Sort by price in Qi Coins ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): CasinoQuery {\n    return new CasinoQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): CasinoQuery {\n    return new CasinoQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a CasinoQuery for all items sold at the Casino. All prices are in Qi Coins. Pass `source` to wrap a pre-filtered array. */\nexport function casino(source: CasinoItem[] = allCasinoData): CasinoQuery {\n  return new CasinoQuery(source);\n}\n","[\n  {\n    \"id\": \"275\",\n    \"name\": \"Artifact Trove\",\n    \"description\": \"The merchant says this came from a distant land... It seems to contain something.\",\n    \"image\": \"images/minerals/geodes/Artifact Trove.png\",\n    \"tradeItemId\": \"749\",\n    \"tradeItemName\": \"Omni Geode\",\n    \"tradeItemImage\": \"images/minerals/geodes/Omni Geode.png\",\n    \"tradeAmount\": 5\n  },\n  {\n    \"id\": \"261\",\n    \"name\": \"Warp Totem: Desert\",\n    \"description\": \"Warp directly to the Calico Desert. Consumed on use.\",\n    \"image\": \"images/craftable/consumables/Warp Totem Desert.png\",\n    \"tradeItemId\": \"749\",\n    \"tradeItemName\": \"Omni Geode\",\n    \"tradeItemImage\": \"images/minerals/geodes/Omni Geode.png\",\n    \"tradeAmount\": 3\n  },\n  {\n    \"id\": \"253\",\n    \"name\": \"Triple Shot Espresso\",\n    \"description\": \"You'll be running all day.\",\n    \"image\": \"images/cooking/Triple Shot Espresso.png\",\n    \"tradeItemId\": \"72\",\n    \"tradeItemName\": \"Diamond\",\n    \"tradeItemImage\": \"images/minerals/gems/Diamond.png\",\n    \"tradeAmount\": 1\n  },\n  {\n    \"id\": \"226\",\n    \"name\": \"Spicy Eel\",\n    \"description\": \"It's really spicy! Be careful.\",\n    \"image\": \"images/cooking/Spicy Eel.png\",\n    \"tradeItemId\": \"64\",\n    \"tradeItemName\": \"Ruby\",\n    \"tradeItemImage\": \"images/minerals/gems/Ruby.png\",\n    \"tradeAmount\": 1\n  },\n  {\n    \"id\": \"288\",\n    \"name\": \"Mega Bomb\",\n    \"description\": \"A powerful bomb with a very large radius.\",\n    \"image\": \"images/craftable/bombs/Mega Bomb.png\",\n    \"tradeItemId\": \"386\",\n    \"tradeItemName\": \"Iridium Ore\",\n    \"tradeItemImage\": \"images/minerals/ore/Iridium Ore.png\",\n    \"tradeAmount\": 5\n  },\n  {\n    \"id\": \"287\",\n    \"name\": \"Bomb\",\n    \"description\": \"Blows up rocks and debris, but watch out.\",\n    \"image\": \"images/craftable/bombs/Bomb.png\",\n    \"tradeItemId\": \"80\",\n    \"tradeItemName\": \"Quartz\",\n    \"tradeItemImage\": \"images/minerals/foraged-minerals/Quartz.png\",\n    \"tradeAmount\": 5\n  },\n  {\n    \"id\": \"recipe-warp-totem-desert\",\n    \"name\": \"Warp Totem: Desert (Recipe)\",\n    \"description\": \"Learn to craft the Warp Totem: Desert.\",\n    \"image\": \"images/craftable/consumables/Warp Totem Desert.png\",\n    \"tradeItemId\": \"337\",\n    \"tradeItemName\": \"Iridium Bar\",\n    \"tradeItemImage\": \"images/minerals/bars/Iridium Bar.png\",\n    \"tradeAmount\": 10,\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"808\",\n    \"name\": \"Void Ghost Pendant\",\n    \"description\": \"A gift for the shadow creature living in your sewer.\",\n    \"image\": \"images/shop/Void Ghost Pendant.png\",\n    \"tradeItemId\": \"769\",\n    \"tradeItemName\": \"Void Essence\",\n    \"tradeItemImage\": \"images/monsters/monster-loot/Void Essence.png\",\n    \"tradeAmount\": 200,\n    \"availability\": \"10+ hearts with Krobus; farmhouse upgraded; unengaged/unmarried\"\n  },\n  {\n    \"id\": \"F1971\",\n    \"name\": \"Butterfly Hutch\",\n    \"description\": \"A magical hutch that attracts colorful butterflies to your home.\",\n    \"image\": \"images/shop/Butterfly Hutch.png\",\n    \"tradeItemId\": \"767\",\n    \"tradeItemName\": \"Bat Wing\",\n    \"tradeItemImage\": \"images/monsters/monster-loot/Bat Wing.png\",\n    \"tradeAmount\": 200\n  },\n  {\n    \"id\": \"H72\",\n    \"name\": \"Green Turban\",\n    \"description\": \"A traditional turban in a deep green color.\",\n    \"image\": \"images/hats/Green Turban.png\",\n    \"tradeItemId\": \"749\",\n    \"tradeItemName\": \"Omni Geode\",\n    \"tradeItemImage\": \"images/minerals/geodes/Omni Geode.png\",\n    \"tradeAmount\": 50\n  },\n  {\n    \"id\": \"H73\",\n    \"name\": \"Magic Cowboy Hat\",\n    \"description\": \"A fanciful cowboy hat with a mystical glow.\",\n    \"image\": \"images/hats/Magic Cowboy Hat.png\",\n    \"tradeItemId\": \"749\",\n    \"tradeItemName\": \"Omni Geode\",\n    \"tradeItemImage\": \"images/minerals/geodes/Omni Geode.png\",\n    \"tradeAmount\": 333,\n    \"availability\": \"Odd days of the month\"\n  },\n  {\n    \"id\": \"H74\",\n    \"name\": \"Magic Turban\",\n    \"description\": \"A turban imbued with ancient magic.\",\n    \"image\": \"images/hats/Magic Turban.png\",\n    \"tradeItemId\": \"749\",\n    \"tradeItemName\": \"Omni Geode\",\n    \"tradeItemImage\": \"images/minerals/geodes/Omni Geode.png\",\n    \"tradeAmount\": 333,\n    \"availability\": \"Even days of the month\"\n  },\n  {\n    \"id\": \"F2508\",\n    \"name\": \"Birch Double Bed\",\n    \"description\": \"A light and airy double bed made from birch wood.\",\n    \"image\": \"images/shop/Birch Double Bed.png\",\n    \"tradeItemId\": \"797\",\n    \"tradeItemName\": \"Pearl\",\n    \"tradeItemImage\": \"images/minerals/Pearl.png\",\n    \"tradeAmount\": 1\n  },\n  {\n    \"id\": \"FMidnightBeachBed\",\n    \"name\": \"Midnight Beach Bed\",\n    \"description\": \"A single bed with a tranquil midnight beach theme.\",\n    \"image\": \"images/shop/Midnight Beach Bed.png\",\n    \"tradeItemId\": \"337\",\n    \"tradeItemName\": \"Iridium Bar\",\n    \"tradeItemImage\": \"images/minerals/bars/Iridium Bar.png\",\n    \"tradeAmount\": 15\n  },\n  {\n    \"id\": \"FMidnightBeachDoubleBed\",\n    \"name\": \"Midnight Beach Double Bed\",\n    \"description\": \"A double bed with a tranquil midnight beach theme.\",\n    \"image\": \"images/shop/Midnight Beach Double Bed.png\",\n    \"tradeItemId\": \"337\",\n    \"tradeItemName\": \"Iridium Bar\",\n    \"tradeItemImage\": \"images/minerals/bars/Iridium Bar.png\",\n    \"tradeAmount\": 30\n  },\n  {\n    \"id\": \"FDarkPiano\",\n    \"name\": \"Dark Piano\",\n    \"description\": \"An elegant piano in matte black. It plays a haunting melody.\",\n    \"image\": \"images/shop/Dark Piano.png\",\n    \"tradeItemId\": \"382\",\n    \"tradeItemName\": \"Coal\",\n    \"tradeItemImage\": \"images/minerals/ore/Coal.png\",\n    \"tradeAmount\": 999\n  },\n  {\n    \"id\": \"178\",\n    \"name\": \"Hay\",\n    \"description\": \"Feed for your animals. Keep a bin stocked or they'll go hungry.\",\n    \"image\": \"images/shop/Hay.png\",\n    \"tradeItemId\": \"749\",\n    \"tradeItemName\": \"Omni Geode\",\n    \"tradeItemImage\": \"images/minerals/geodes/Omni Geode.png\",\n    \"tradeAmount\": 1,\n    \"day\": \"Monday\"\n  },\n  {\n    \"id\": \"771\",\n    \"name\": \"Fiber\",\n    \"description\": \"Raw plant material with a wide variety of uses.\",\n    \"image\": \"images/crops/fiber/crop.png\",\n    \"tradeItemId\": \"390\",\n    \"tradeItemName\": \"Stone\",\n    \"tradeItemImage\": \"images/forageables/Stone.png\",\n    \"tradeAmount\": 5,\n    \"day\": \"Tuesday\"\n  },\n  {\n    \"id\": \"428\",\n    \"name\": \"Cloth\",\n    \"description\": \"A bolt of fine cloth.\",\n    \"image\": \"images/artisan-goods/Cloth.png\",\n    \"tradeItemId\": \"62\",\n    \"tradeItemName\": \"Aquamarine\",\n    \"tradeItemImage\": \"images/minerals/gems/Aquamarine.png\",\n    \"tradeAmount\": 3,\n    \"day\": \"Wednesday\"\n  },\n  {\n    \"id\": \"279\",\n    \"name\": \"Magic Rock Candy\",\n    \"description\": \"Gives a powerful set of buffs for 8 minutes and 24 seconds.\",\n    \"image\": \"images/shop/Magic Rock Candy.png\",\n    \"tradeItemId\": \"74\",\n    \"tradeItemName\": \"Prismatic Shard\",\n    \"tradeItemImage\": \"images/minerals/gems/Prismatic Shard.png\",\n    \"tradeAmount\": 3,\n    \"day\": \"Thursday\"\n  },\n  {\n    \"id\": \"424\",\n    \"name\": \"Cheese\",\n    \"description\": \"It smells great.\",\n    \"image\": \"images/artisan-goods/Cheese.png\",\n    \"tradeItemId\": \"60\",\n    \"tradeItemName\": \"Emerald\",\n    \"tradeItemImage\": \"images/minerals/gems/Emerald.png\",\n    \"tradeAmount\": 1,\n    \"day\": \"Friday\"\n  },\n  {\n    \"id\": \"495\",\n    \"name\": \"Spring Seeds\",\n    \"description\": \"A random assortment of seeds that grow in spring.\",\n    \"image\": \"images/craftable/seeds/Spring Seeds.png\",\n    \"tradeItemId\": \"496\",\n    \"tradeItemName\": \"Summer Seeds\",\n    \"tradeItemImage\": \"images/craftable/seeds/Summer Seeds.png\",\n    \"tradeAmount\": 2,\n    \"day\": \"Saturday\"\n  },\n  {\n    \"id\": \"496\",\n    \"name\": \"Summer Seeds\",\n    \"description\": \"A random assortment of seeds that grow in summer.\",\n    \"image\": \"images/craftable/seeds/Summer Seeds.png\",\n    \"tradeItemId\": \"497\",\n    \"tradeItemName\": \"Fall Seeds\",\n    \"tradeItemImage\": \"images/craftable/seeds/Fall Seeds.png\",\n    \"tradeAmount\": 2,\n    \"day\": \"Saturday\"\n  },\n  {\n    \"id\": \"497\",\n    \"name\": \"Fall Seeds\",\n    \"description\": \"A random assortment of seeds that grow in fall.\",\n    \"image\": \"images/craftable/seeds/Fall Seeds.png\",\n    \"tradeItemId\": \"498\",\n    \"tradeItemName\": \"Winter Seeds\",\n    \"tradeItemImage\": \"images/craftable/seeds/Winter Seeds.png\",\n    \"tradeAmount\": 2,\n    \"day\": \"Saturday\"\n  },\n  {\n    \"id\": \"498\",\n    \"name\": \"Winter Seeds\",\n    \"description\": \"A random assortment of seeds that grow in winter.\",\n    \"image\": \"images/craftable/seeds/Winter Seeds.png\",\n    \"tradeItemId\": \"495\",\n    \"tradeItemName\": \"Spring Seeds\",\n    \"tradeItemImage\": \"images/craftable/seeds/Spring Seeds.png\",\n    \"tradeAmount\": 2,\n    \"day\": \"Saturday\"\n  },\n  {\n    \"id\": \"BC71\",\n    \"name\": \"Staircase\",\n    \"description\": \"Can be placed inside the mines to quickly descend one floor.\",\n    \"image\": \"images/craftable/misc/Staircase.png\",\n    \"tradeItemId\": \"70\",\n    \"tradeItemName\": \"Jade\",\n    \"tradeItemImage\": \"images/minerals/gems/Jade.png\",\n    \"tradeAmount\": 1,\n    \"day\": \"Sunday\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport desertTraderData from '@/data/desert-trader-shop.json';\nimport { DesertTraderDay, DesertTraderItem } from '@/types';\n\nconst allDesertTraderData: DesertTraderItem[] = desertTraderData as DesertTraderItem[];\n\n/** Query builder for the Desert Trader's barter stock. Items are traded for goods rather than gold. All filter and sort methods return a new DesertTraderQuery for chaining. */\nexport class DesertTraderQuery extends QueryBase<DesertTraderItem> {\n  constructor(data: DesertTraderItem[] = allDesertTraderData) {\n    super(data);\n  }\n\n  /** Filter to items always in stock (no day restriction). */\n  permanent(): DesertTraderQuery {\n    return new DesertTraderQuery(this.data.filter((item) => item.day === undefined));\n  }\n\n  /** Filter to day-specific rotating items only. */\n  daily(): DesertTraderQuery {\n    return new DesertTraderQuery(this.data.filter((item) => item.day !== undefined));\n  }\n\n  /** Filter to all items available on the given day (permanent + that day's item). */\n  byDay(day: DesertTraderDay): DesertTraderQuery {\n    return new DesertTraderQuery(\n      this.data.filter((item) => item.day === undefined || item.day === day),\n    );\n  }\n\n  /** Filter to recipe items only. */\n  recipes(): DesertTraderQuery {\n    return new DesertTraderQuery(this.data.filter((item) => item.isRecipe === true));\n  }\n\n  /** Filter to items traded for the specified trade item (by item ID). */\n  byTradeItem(tradeItemId: string): DesertTraderQuery {\n    return new DesertTraderQuery(this.data.filter((item) => item.tradeItemId === tradeItemId));\n  }\n\n  /** Filter to items with no special availability condition. */\n  alwaysAvailable(): DesertTraderQuery {\n    return new DesertTraderQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by trade amount ascending or descending. */\n  sortByTradeAmount(order: 'asc' | 'desc' = 'asc'): DesertTraderQuery {\n    return new DesertTraderQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.tradeAmount - b.tradeAmount : b.tradeAmount - a.tradeAmount,\n      ),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): DesertTraderQuery {\n    return new DesertTraderQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a DesertTraderQuery for all barter trades at the Desert Trader. Pass `source` to wrap a pre-filtered array. */\nexport function desertTrader(source: DesertTraderItem[] = allDesertTraderData): DesertTraderQuery {\n  return new DesertTraderQuery(source);\n}\n","[\n  {\n    \"id\": \"802\",\n    \"name\": \"Cactus Seeds\",\n    \"price\": 150,\n    \"description\": \"Plant these in a pot inside or outside during any season.\",\n    \"image\": \"images/crops/cactus-fruit/seed.png\",\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"478\",\n    \"name\": \"Rhubarb Seeds\",\n    \"price\": 100,\n    \"description\": \"Plant in spring. Takes 13 days to mature.\",\n    \"image\": \"images/crops/rhubarb/seed.png\",\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"486\",\n    \"name\": \"Starfruit Seeds\",\n    \"price\": 400,\n    \"description\": \"Plant in summer. Takes 13 days to mature.\",\n    \"image\": \"images/crops/starfruit/seed.png\",\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"494\",\n    \"name\": \"Beet Seeds\",\n    \"price\": 20,\n    \"description\": \"Plant in fall. Takes 6 days to mature.\",\n    \"image\": \"images/crops/beet/seed.png\",\n    \"category\": \"seed\"\n  },\n  {\n    \"id\": \"FWallCactus\",\n    \"name\": \"Wall Cactus\",\n    \"price\": 700,\n    \"description\": \"A small potted cactus that mounts on the wall.\",\n    \"image\": \"images/shop/Wall Cactus.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"FCoatStand\",\n    \"name\": \"Coat Stand\",\n    \"price\": 2000,\n    \"description\": \"A freestanding coat rack to organize your outerwear.\",\n    \"image\": \"images/shop/Coat Stand.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"FClothesline\",\n    \"name\": \"Clothesline\",\n    \"price\": 5000,\n    \"description\": \"String up some laundry for that homey outdoor feel.\",\n    \"image\": \"images/shop/Clothesline.png\",\n    \"category\": \"furniture\"\n  },\n  {\n    \"id\": \"MMannequinMale\",\n    \"name\": \"Mannequin (Male)\",\n    \"price\": 12000,\n    \"description\": \"Display your clothing on a male-presenting mannequin.\",\n    \"image\": \"images/shop/Mannequin (Male).png\",\n    \"category\": \"special\"\n  },\n  {\n    \"id\": \"P0\",\n    \"name\": \"Farmer Pants\",\n    \"price\": 1000,\n    \"description\": \"Comfortable denim overalls with plenty of pockets.\",\n    \"image\": \"images/clothing/Farmer Pants.png\",\n    \"category\": \"clothing\"\n  },\n  {\n    \"id\": \"88\",\n    \"name\": \"Coconut\",\n    \"price\": 200,\n    \"description\": \"A delicious coconut. Very popular.\",\n    \"image\": \"images/forageables/Coconut.png\",\n    \"category\": \"food\",\n    \"day\": \"Monday\"\n  },\n  {\n    \"id\": \"90\",\n    \"name\": \"Cactus Fruit\",\n    \"price\": 150,\n    \"description\": \"The sweet fruit of a cactus. Eaten by the natives of the Calico Desert.\",\n    \"image\": \"images/crops/cactus-fruit/crop.png\",\n    \"category\": \"food\",\n    \"day\": \"Tuesday\"\n  },\n  {\n    \"id\": \"749\",\n    \"name\": \"Omni Geode\",\n    \"price\": 500,\n    \"description\": \"A pungent mass that contains a rainbow of crystals. A geologist can crack it open for you.\",\n    \"image\": \"images/minerals/geodes/Omni Geode.png\",\n    \"category\": \"special\",\n    \"day\": \"Wednesday\"\n  },\n  {\n    \"id\": \"466\",\n    \"name\": \"Deluxe Speed-Gro\",\n    \"price\": 80,\n    \"description\": \"Stimulates crop growth. 25% faster than regular Speed-Gro.\",\n    \"image\": \"images/craftable/fertilizer/Deluxe Speed-Gro.png\",\n    \"category\": \"special\",\n    \"day\": \"Thursday\"\n  },\n  {\n    \"id\": \"340\",\n    \"name\": \"Honey\",\n    \"price\": 200,\n    \"description\": \"It's a sweet syrup produced by bees.\",\n    \"image\": \"images/artisan-goods/Honey.png\",\n    \"category\": \"food\",\n    \"day\": \"Friday\"\n  },\n  {\n    \"id\": \"371\",\n    \"name\": \"Quality Retaining Soil\",\n    \"price\": 200,\n    \"description\": \"This soil has a good chance of staying watered overnight. Mix into tilled soil.\",\n    \"image\": \"images/craftable/fertilizer/Quality Retaining Soil.png\",\n    \"category\": \"special\",\n    \"day\": \"Saturday\"\n  },\n  {\n    \"id\": \"233\",\n    \"name\": \"Ice Cream\",\n    \"price\": 240,\n    \"description\": \"It's the perfect treat on a hot summer day.\",\n    \"image\": \"images/cooking/Ice Cream.png\",\n    \"category\": \"food\",\n    \"day\": \"Sunday\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport oasisData from '@/data/oasis-shop.json';\nimport { OasisCategory, OasisDay, OasisItem } from '@/types';\n\nconst allOasisData: OasisItem[] = oasisData as OasisItem[];\n\n/** Query builder for Sandy's Oasis shop stock. All filter and sort methods return a new OasisQuery for chaining. */\nexport class OasisQuery extends QueryBase<OasisItem> {\n  constructor(data: OasisItem[] = allOasisData) {\n    super(data);\n  }\n\n  /** Filter to seeds only. */\n  seeds(): OasisQuery {\n    return new OasisQuery(this.data.filter((item) => item.category === 'seed'));\n  }\n\n  /** Filter to food items only. */\n  food(): OasisQuery {\n    return new OasisQuery(this.data.filter((item) => item.category === 'food'));\n  }\n\n  /** Filter to clothing items only. */\n  clothing(): OasisQuery {\n    return new OasisQuery(this.data.filter((item) => item.category === 'clothing'));\n  }\n\n  /** Filter to items in the given category. */\n  byCategory(category: OasisCategory): OasisQuery {\n    return new OasisQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter to items always in stock (no day restriction). */\n  permanent(): OasisQuery {\n    return new OasisQuery(this.data.filter((item) => item.day === undefined));\n  }\n\n  /** Filter to day-specific rotating items only. */\n  daily(): OasisQuery {\n    return new OasisQuery(this.data.filter((item) => item.day !== undefined));\n  }\n\n  /** Filter to all items available on the given day (permanent + that day's item). */\n  byDay(day: OasisDay): OasisQuery {\n    return new OasisQuery(this.data.filter((item) => item.day === undefined || item.day === day));\n  }\n\n  /** Filter to items with no special purchase condition. */\n  alwaysAvailable(): OasisQuery {\n    return new OasisQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): OasisQuery {\n    return new OasisQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): OasisQuery {\n    return new OasisQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns an OasisQuery for all items sold at Sandy's Oasis. Pass `source` to wrap a pre-filtered array. */\nexport function oasis(source: OasisItem[] = allOasisData): OasisQuery {\n  return new OasisQuery(source);\n}\n","[\n  {\n    \"id\": \"B853\",\n    \"name\": \"Cinderclown Shoes\",\n    \"price\": 100,\n    \"currency\": \"cinder-shard\",\n    \"description\": \"These magic shoes belonged to a famous Dwarvish jester.\",\n    \"image\": \"images/footwear/Cinderclown Shoes.png\",\n    \"category\": \"footwear\"\n  },\n  {\n    \"id\": \"Book_Diamonds\",\n    \"name\": \"The Diamond Hunter\",\n    \"price\": 10,\n    \"currency\": \"diamond\",\n    \"description\": \"All stones have a chance to drop a diamond when mined by hand.\",\n    \"image\": \"images/special-items/The Diamond Hunter.png\",\n    \"category\": \"book\",\n    \"availability\": \"Once per save\"\n  },\n  {\n    \"id\": \"286\",\n    \"name\": \"Cherry Bomb\",\n    \"price\": 450,\n    \"currency\": \"gold\",\n    \"description\": \"Generates a small explosion. Stand back!\",\n    \"image\": \"images/craftable/bombs/Cherry Bomb.png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"287\",\n    \"name\": \"Bomb\",\n    \"price\": 1000,\n    \"currency\": \"gold\",\n    \"description\": \"Generates an explosion. Watch out!\",\n    \"image\": \"images/craftable/bombs/Bomb.png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"288\",\n    \"name\": \"Mega Bomb\",\n    \"price\": 1600,\n    \"currency\": \"gold\",\n    \"description\": \"Generates a powerful explosion. Use with extreme caution.\",\n    \"image\": \"images/craftable/bombs/Mega Bomb.png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"244\",\n    \"name\": \"Roots Platter\",\n    \"price\": 1200,\n    \"currency\": \"gold\",\n    \"description\": \"This'll stick to your ribs.\",\n    \"image\": \"images/cooking/Roots Platter.png\",\n    \"category\": \"food\",\n    \"availability\": \"50% daily chance\"\n  },\n  {\n    \"id\": \"237\",\n    \"name\": \"Super Meal\",\n    \"price\": 1200,\n    \"currency\": \"gold\",\n    \"description\": \"The name says it all.\",\n    \"image\": \"images/cooking/Super Meal.png\",\n    \"category\": \"food\",\n    \"availability\": \"50% daily chance\"\n  },\n  {\n    \"id\": \"H77\",\n    \"name\": \"Pink Bow\",\n    \"price\": 10000,\n    \"currency\": \"gold\",\n    \"description\": \"This huge bow makes quite a statement!\",\n    \"image\": \"images/hats/Pink Bow.png\",\n    \"category\": \"hat\"\n  },\n  {\n    \"id\": \"886\",\n    \"name\": \"Warp Totem: Island\",\n    \"price\": 10000,\n    \"currency\": \"gold\",\n    \"description\": \"Warps you to your island farm. Consumed on use.\",\n    \"image\": \"images/craftable/consumables/Warp Totem Island.png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"903\",\n    \"name\": \"Ginger Ale\",\n    \"price\": 1000,\n    \"currency\": \"gold\",\n    \"description\": \"The carbonated ginger creates a unique sensation.\",\n    \"image\": \"images/cooking/Ginger Ale.png\",\n    \"category\": \"food\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport volcanoShopData from '@/data/volcano-shop.json';\nimport { VolcanoShopCategory, VolcanoShopCurrency, VolcanoShopItem } from '@/types';\n\nconst allVolcanoShopData: VolcanoShopItem[] = volcanoShopData as VolcanoShopItem[];\n\n/** Query builder for the Volcano Dungeon Dwarf shop. Uses mixed currencies (gold, Cinder Shards, Diamonds). All filter and sort methods return a new VolcanoShopQuery for chaining. */\nexport class VolcanoShopQuery extends QueryBase<VolcanoShopItem> {\n  constructor(data: VolcanoShopItem[] = allVolcanoShopData) {\n    super(data);\n  }\n\n  /** Filter to items purchased with the specified currency. */\n  byCurrency(currency: VolcanoShopCurrency): VolcanoShopQuery {\n    return new VolcanoShopQuery(this.data.filter((item) => item.currency === currency));\n  }\n\n  /** Filter to items purchased with gold. */\n  goldItems(): VolcanoShopQuery {\n    return new VolcanoShopQuery(this.data.filter((item) => item.currency === 'gold'));\n  }\n\n  /** Filter to items purchased with Cinder Shards. */\n  cinderShardItems(): VolcanoShopQuery {\n    return new VolcanoShopQuery(this.data.filter((item) => item.currency === 'cinder-shard'));\n  }\n\n  /** Filter to items purchased with Diamonds. */\n  diamondItems(): VolcanoShopQuery {\n    return new VolcanoShopQuery(this.data.filter((item) => item.currency === 'diamond'));\n  }\n\n  /** Filter by item category. */\n  byCategory(category: VolcanoShopCategory): VolcanoShopQuery {\n    return new VolcanoShopQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter to consumable items only. */\n  consumables(): VolcanoShopQuery {\n    return new VolcanoShopQuery(this.data.filter((item) => item.category === 'consumable'));\n  }\n\n  /** Filter to food items only. */\n  food(): VolcanoShopQuery {\n    return new VolcanoShopQuery(this.data.filter((item) => item.category === 'food'));\n  }\n\n  /** Filter to items with no special availability condition. */\n  alwaysAvailable(): VolcanoShopQuery {\n    return new VolcanoShopQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): VolcanoShopQuery {\n    return new VolcanoShopQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): VolcanoShopQuery {\n    return new VolcanoShopQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a VolcanoShopQuery for all items at the Volcano Dungeon Dwarf shop. Pass `source` to wrap a pre-filtered array. */\nexport function volcanoShop(source: VolcanoShopItem[] = allVolcanoShopData): VolcanoShopQuery {\n  return new VolcanoShopQuery(source);\n}\n","[\n  {\n    \"id\": \"688\",\n    \"name\": \"Warp Totem: Farm\",\n    \"description\": \"Warps you to your farm. Consumed on use.\",\n    \"image\": \"images/craftable/consumables/Warp Totem Farm.png\",\n    \"tradeItemId\": \"830\",\n    \"tradeItemName\": \"Taro Root\",\n    \"tradeItemImage\": \"images/crops/taro-root/crop.png\",\n    \"tradeAmount\": 5\n  },\n  {\n    \"id\": \"831\",\n    \"name\": \"Taro Tuber\",\n    \"description\": \"Plant in spring, summer, or fall. Takes 10 days to mature.\",\n    \"image\": \"images/crops/taro-root/seed.png\",\n    \"tradeItemId\": \"881\",\n    \"tradeItemName\": \"Bone Fragment\",\n    \"tradeItemImage\": \"images/minerals/resources/Bone Fragment.png\",\n    \"tradeAmount\": 2\n  },\n  {\n    \"id\": \"833\",\n    \"name\": \"Pineapple Seeds\",\n    \"description\": \"Plant in summer. Takes 14 days to mature.\",\n    \"image\": \"images/crops/pineapple/seed.png\",\n    \"tradeItemId\": \"851\",\n    \"tradeItemName\": \"Magma Cap\",\n    \"tradeItemImage\": \"images/forageables/Magma Cap.png\",\n    \"tradeAmount\": 1\n  },\n  {\n    \"id\": \"791\",\n    \"name\": \"Golden Coconut\",\n    \"description\": \"A perfectly round coconut. It may contain something special.\",\n    \"image\": \"images/minerals/geodes/Golden Coconut.png\",\n    \"tradeItemId\": \"88\",\n    \"tradeItemName\": \"Coconut\",\n    \"tradeItemImage\": \"images/forageables/Coconut.png\",\n    \"tradeAmount\": 10,\n    \"availability\": \"After cracking a Golden Coconut\"\n  },\n  {\n    \"id\": \"F2326\",\n    \"name\": \"Tropical TV\",\n    \"description\": \"A television set with a tropical theme.\",\n    \"image\": \"images/shop/Tropical TV.png\",\n    \"tradeItemId\": \"830\",\n    \"tradeItemName\": \"Taro Root\",\n    \"tradeItemImage\": \"images/crops/taro-root/crop.png\",\n    \"tradeAmount\": 30\n  },\n  {\n    \"id\": \"F2331\",\n    \"name\": \"Jungle Torch\",\n    \"description\": \"A torch made from island materials.\",\n    \"image\": \"images/shop/Jungle Torch.png\",\n    \"tradeItemId\": \"848\",\n    \"tradeItemName\": \"Cinder Shard\",\n    \"tradeItemImage\": \"images/minerals/foraged-minerals/Cinder Shard.png\",\n    \"tradeAmount\": 5\n  },\n  {\n    \"id\": \"69\",\n    \"name\": \"Banana Sapling\",\n    \"description\": \"Plant this sapling to grow a Banana Tree. Takes 28 days to mature.\",\n    \"image\": \"images/trees/banana/seed.png\",\n    \"tradeItemId\": \"852\",\n    \"tradeItemName\": \"Dragon Tooth\",\n    \"tradeItemImage\": \"images/monsters/monster-loot/Dragon Tooth.png\",\n    \"tradeAmount\": 5\n  },\n  {\n    \"id\": \"835\",\n    \"name\": \"Mango Sapling\",\n    \"description\": \"Plant this sapling to grow a Mango Tree. Takes 28 days to mature.\",\n    \"image\": \"images/trees/mango/seed.png\",\n    \"tradeItemId\": \"719\",\n    \"tradeItemName\": \"Mussel\",\n    \"tradeItemImage\": \"images/fish/Mussel.png\",\n    \"tradeAmount\": 75\n  },\n  {\n    \"id\": \"F2496\",\n    \"name\": \"Wild Double Bed\",\n    \"description\": \"A rustic double bed crafted from island materials.\",\n    \"image\": \"images/shop/Wild Double Bed.png\",\n    \"tradeItemId\": \"848\",\n    \"tradeItemName\": \"Cinder Shard\",\n    \"tradeItemImage\": \"images/minerals/foraged-minerals/Cinder Shard.png\",\n    \"tradeAmount\": 100\n  },\n  {\n    \"id\": \"F2176\",\n    \"name\": \"Tropical Bed\",\n    \"description\": \"A cozy tropical bed.\",\n    \"image\": \"images/shop/Tropical Bed.png\",\n    \"tradeItemId\": \"829\",\n    \"tradeItemName\": \"Ginger\",\n    \"tradeItemImage\": \"images/forageables/Ginger.png\",\n    \"tradeAmount\": 20\n  },\n  {\n    \"id\": \"292\",\n    \"name\": \"Mahogany Seed\",\n    \"description\": \"Plant this to grow a Mahogany Tree.\",\n    \"image\": \"images/trees/mahogany/seed.png\",\n    \"tradeItemId\": \"836\",\n    \"tradeItemName\": \"Stingray\",\n    \"tradeItemImage\": \"images/fish/Stingray.png\",\n    \"tradeAmount\": 1\n  },\n  {\n    \"id\": \"P7\",\n    \"name\": \"Luau Skirt\",\n    \"description\": \"A colorful skirt perfect for island festivities.\",\n    \"image\": \"images/clothing/Luau Skirt.png\",\n    \"tradeItemId\": \"830\",\n    \"tradeItemName\": \"Taro Root\",\n    \"tradeItemImage\": \"images/crops/taro-root/crop.png\",\n    \"tradeAmount\": 50\n  },\n  {\n    \"id\": \"904\",\n    \"name\": \"Banana Pudding\",\n    \"description\": \"It smells like paradise.\",\n    \"image\": \"images/cooking/Banana Pudding.png\",\n    \"tradeItemId\": \"881\",\n    \"tradeItemName\": \"Bone Fragment\",\n    \"tradeItemImage\": \"images/minerals/resources/Bone Fragment.png\",\n    \"tradeAmount\": 30,\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"920\",\n    \"name\": \"Deluxe Retaining Soil\",\n    \"description\": \"This soil has a good chance of staying watered overnight.\",\n    \"image\": \"images/craftable/fertilizer/Deluxe Retaining Soil.png\",\n    \"tradeItemId\": \"848\",\n    \"tradeItemName\": \"Cinder Shard\",\n    \"tradeItemImage\": \"images/minerals/foraged-minerals/Cinder Shard.png\",\n    \"tradeAmount\": 50,\n    \"isRecipe\": true\n  },\n  {\n    \"id\": \"F134\",\n    \"name\": \"Tropical Chair\",\n    \"description\": \"A comfortable chair with a tropical design.\",\n    \"image\": \"images/shop/Tropical Chair.png\",\n    \"tradeItemId\": \"837\",\n    \"tradeItemName\": \"Lionfish\",\n    \"tradeItemImage\": \"images/fish/Lionfish.png\",\n    \"tradeAmount\": 1,\n    \"availability\": \"Even days of month\"\n  },\n  {\n    \"id\": \"H79\",\n    \"name\": \"Small Cap\",\n    \"description\": \"It's a more aerodynamic style of cap.\",\n    \"image\": \"images/hats/Small Cap.png\",\n    \"tradeItemId\": \"830\",\n    \"tradeItemName\": \"Taro Root\",\n    \"tradeItemImage\": \"images/crops/taro-root/crop.png\",\n    \"tradeAmount\": 30,\n    \"day\": \"Monday\"\n  },\n  {\n    \"id\": \"F2393\",\n    \"name\": \"Palm Wall Ornament\",\n    \"description\": \"A decorative wall piece made from island materials.\",\n    \"image\": \"images/shop/Palm Wall Ornament.png\",\n    \"tradeItemId\": \"832\",\n    \"tradeItemName\": \"Pineapple\",\n    \"tradeItemImage\": \"images/crops/pineapple/crop.png\",\n    \"tradeAmount\": 1,\n    \"day\": \"Tuesday\"\n  },\n  {\n    \"id\": \"H80\",\n    \"name\": \"Bluebird Mask\",\n    \"description\": \"Wear this to look just like your favorite island trader.\",\n    \"image\": \"images/hats/Bluebird Mask.png\",\n    \"tradeItemId\": \"830\",\n    \"tradeItemName\": \"Taro Root\",\n    \"tradeItemImage\": \"images/crops/taro-root/crop.png\",\n    \"tradeAmount\": 30,\n    \"day\": \"Wednesday\"\n  },\n  {\n    \"id\": \"F2329\",\n    \"name\": \"'Volcano' Photo\",\n    \"description\": \"A framed photo of the volcano.\",\n    \"image\": \"images/shop/'Volcano' Photo.png\",\n    \"tradeItemId\": \"834\",\n    \"tradeItemName\": \"Mango\",\n    \"tradeItemImage\": \"images/trees/mango/crop.png\",\n    \"tradeAmount\": 5,\n    \"day\": \"Thursday\"\n  },\n  {\n    \"id\": \"H81\",\n    \"name\": \"Deluxe Cowboy Hat\",\n    \"description\": \"A cowboy hat with a more extreme shape.\",\n    \"image\": \"images/hats/Deluxe Cowboy Hat.png\",\n    \"tradeItemId\": \"830\",\n    \"tradeItemName\": \"Taro Root\",\n    \"tradeItemImage\": \"images/crops/taro-root/crop.png\",\n    \"tradeAmount\": 30,\n    \"day\": \"Friday\"\n  },\n  {\n    \"id\": \"F1228\",\n    \"name\": \"Oceanic Rug\",\n    \"description\": \"A beautiful rug with an ocean pattern.\",\n    \"image\": \"images/shop/Oceanic Rug.png\",\n    \"tradeItemId\": \"838\",\n    \"tradeItemName\": \"Blue Discus\",\n    \"tradeItemImage\": \"images/fish/Blue Discus.png\",\n    \"tradeAmount\": 3,\n    \"day\": \"Saturday\"\n  },\n  {\n    \"id\": \"F2180\",\n    \"name\": \"Tropical Double Bed\",\n    \"description\": \"A cozy tropical double bed.\",\n    \"image\": \"images/shop/Tropical Double Bed.png\",\n    \"tradeItemId\": \"91\",\n    \"tradeItemName\": \"Banana\",\n    \"tradeItemImage\": \"images/trees/banana/crop.png\",\n    \"tradeAmount\": 5,\n    \"day\": \"Sunday\"\n  },\n  {\n    \"id\": \"896\",\n    \"name\": \"Galaxy Soul\",\n    \"description\": \"A shard of the galaxy. Can be used to upgrade weapons.\",\n    \"image\": \"images/shop/Galaxy Soul.png\",\n    \"tradeItemId\": \"910\",\n    \"tradeItemName\": \"Radioactive Bar\",\n    \"tradeItemImage\": \"images/minerals/bars/Radioactive Bar.png\",\n    \"tradeAmount\": 10,\n    \"availability\": \"Last day of season\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport islandTraderData from '@/data/island-trader-shop.json';\nimport { IslandTraderDay, IslandTraderItem } from '@/types';\n\nconst allIslandTraderData: IslandTraderItem[] = islandTraderData as IslandTraderItem[];\n\n/** Query builder for the Island Trader's barter stock. Items are traded for goods rather than gold. All filter and sort methods return a new IslandTraderQuery for chaining. */\nexport class IslandTraderQuery extends QueryBase<IslandTraderItem> {\n  constructor(data: IslandTraderItem[] = allIslandTraderData) {\n    super(data);\n  }\n\n  /** Filter to items always in stock (no day restriction and no special availability). */\n  permanent(): IslandTraderQuery {\n    return new IslandTraderQuery(\n      this.data.filter((item) => item.day === undefined && item.availability === undefined),\n    );\n  }\n\n  /** Filter to day-specific rotating items only. */\n  daily(): IslandTraderQuery {\n    return new IslandTraderQuery(this.data.filter((item) => item.day !== undefined));\n  }\n\n  /** Filter to all items available on the given day (permanent + that day's item). */\n  byDay(day: IslandTraderDay): IslandTraderQuery {\n    return new IslandTraderQuery(\n      this.data.filter((item) => item.day === undefined || item.day === day),\n    );\n  }\n\n  /** Filter to recipe items only. */\n  recipes(): IslandTraderQuery {\n    return new IslandTraderQuery(this.data.filter((item) => item.isRecipe === true));\n  }\n\n  /** Filter to items traded for the specified trade item (by item ID). */\n  byTradeItem(tradeItemId: string): IslandTraderQuery {\n    return new IslandTraderQuery(this.data.filter((item) => item.tradeItemId === tradeItemId));\n  }\n\n  /** Filter to items with no special availability condition. */\n  alwaysAvailable(): IslandTraderQuery {\n    return new IslandTraderQuery(this.data.filter((item) => item.availability === undefined));\n  }\n\n  /** Sort by trade amount ascending or descending. */\n  sortByTradeAmount(order: 'asc' | 'desc' = 'asc'): IslandTraderQuery {\n    return new IslandTraderQuery(\n      [...this.data].sort((a, b) =>\n        order === 'asc' ? a.tradeAmount - b.tradeAmount : b.tradeAmount - a.tradeAmount,\n      ),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): IslandTraderQuery {\n    return new IslandTraderQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns an IslandTraderQuery for all barter trades at the Island Trader. Pass `source` to wrap a pre-filtered array. */\nexport function islandTrader(source: IslandTraderItem[] = allIslandTraderData): IslandTraderQuery {\n  return new IslandTraderQuery(source);\n}\n","[\n  {\n    \"id\": \"large-animal\",\n    \"name\": \"Large Animal\",\n    \"reward\": {\n      \"goldenWalnuts\": 6,\n      \"item\": {\n        \"id\": \"69\",\n        \"name\": \"Banana Sapling\",\n        \"image\": \"images/trees/banana/seed.png\"\n      }\n    },\n    \"donations\": [\n      {\n        \"id\": \"820\",\n        \"name\": \"Fossilized Skull\",\n        \"description\": \"The skull of a large, ancient creature.\",\n        \"image\": \"images/artifacts/field-office/Fossilized Skull.png\",\n        \"collection\": \"large-animal\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"821\",\n        \"name\": \"Fossilized Spine\",\n        \"description\": \"A fossilized spinal segment from a large ancient creature.\",\n        \"image\": \"images/artifacts/field-office/Fossilized Spine.png\",\n        \"collection\": \"large-animal\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"824\",\n        \"name\": \"Fossilized Ribs\",\n        \"description\": \"Large rib bones from an ancient creature.\",\n        \"image\": \"images/artifacts/field-office/Fossilized Ribs.png\",\n        \"collection\": \"large-animal\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"823\",\n        \"name\": \"Fossilized Leg\",\n        \"description\": \"Part of a fossilized leg from a large, ancient creature.\",\n        \"image\": \"images/artifacts/field-office/Fossilized Leg.png\",\n        \"collection\": \"large-animal\",\n        \"quantity\": 2\n      },\n      {\n        \"id\": \"822\",\n        \"name\": \"Fossilized Tail\",\n        \"description\": \"The fossilized tail of a large, ancient creature.\",\n        \"image\": \"images/artifacts/field-office/Fossilized Tail.png\",\n        \"collection\": \"large-animal\",\n        \"quantity\": 1\n      }\n    ]\n  },\n  {\n    \"id\": \"snake\",\n    \"name\": \"Snake\",\n    \"reward\": {\n      \"goldenWalnuts\": 3,\n      \"item\": {\n        \"id\": \"835\",\n        \"name\": \"Mango Sapling\",\n        \"image\": \"images/trees/mango/seed.png\"\n      }\n    },\n    \"donations\": [\n      {\n        \"id\": \"825\",\n        \"name\": \"Snake Skull\",\n        \"description\": \"The skull of a large, ancient snake.\",\n        \"image\": \"images/artifacts/field-office/Snake Skull.png\",\n        \"collection\": \"snake\",\n        \"quantity\": 1\n      },\n      {\n        \"id\": \"826\",\n        \"name\": \"Snake Vertebrae\",\n        \"description\": \"A fossilized vertebra from a large snake.\",\n        \"image\": \"images/artifacts/field-office/Snake Vertebrae.png\",\n        \"collection\": \"snake\",\n        \"quantity\": 2\n      }\n    ]\n  },\n  {\n    \"id\": \"mummified-frog\",\n    \"name\": \"Mummified Frog\",\n    \"reward\": {\n      \"goldenWalnuts\": 1\n    },\n    \"donations\": [\n      {\n        \"id\": \"828\",\n        \"name\": \"Mummified Frog\",\n        \"description\": \"An ancient frog preserved in a mysterious way.\",\n        \"image\": \"images/artifacts/field-office/Mummified Frog.png\",\n        \"collection\": \"mummified-frog\",\n        \"quantity\": 1\n      }\n    ]\n  },\n  {\n    \"id\": \"mummified-bat\",\n    \"name\": \"Mummified Bat\",\n    \"reward\": {\n      \"goldenWalnuts\": 1\n    },\n    \"donations\": [\n      {\n        \"id\": \"827\",\n        \"name\": \"Mummified Bat\",\n        \"description\": \"An ancient bat preserved in a mysterious way.\",\n        \"image\": \"images/artifacts/field-office/Mummified Bat.png\",\n        \"collection\": \"mummified-bat\",\n        \"quantity\": 1\n      }\n    ]\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport fieldOfficeData from '@/data/field-office.json';\nimport { FieldOfficeCollection, FieldOfficeCollectionData, FieldOfficeDonation } from '@/types';\n\nconst allFieldOfficeData: FieldOfficeCollectionData[] =\n  fieldOfficeData as FieldOfficeCollectionData[];\n\nconst allDonations: FieldOfficeDonation[] = allFieldOfficeData.flatMap((c) => c.donations);\n\n/** Query builder for Island Field Office fossil collection data. All filter and sort methods return a new FieldOfficeQuery for chaining. */\nexport class FieldOfficeQuery extends QueryBase<FieldOfficeCollectionData> {\n  constructor(data: FieldOfficeCollectionData[] = allFieldOfficeData) {\n    super(data);\n  }\n\n  /** Filter to a specific collection by ID. */\n  byCollection(id: FieldOfficeCollection): FieldOfficeQuery {\n    return new FieldOfficeQuery(this.data.filter((c) => c.id === id));\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): FieldOfficeQuery {\n    return new FieldOfficeQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Query builder for individual Island Field Office donation items. All filter and sort methods return a new FieldOfficeDonationQuery for chaining. */\nexport class FieldOfficeDonationQuery extends QueryBase<FieldOfficeDonation> {\n  constructor(data: FieldOfficeDonation[] = allDonations) {\n    super(data);\n  }\n\n  /** Filter to donations belonging to the specified collection. */\n  byCollection(id: FieldOfficeCollection): FieldOfficeDonationQuery {\n    return new FieldOfficeDonationQuery(this.data.filter((d) => d.collection === id));\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): FieldOfficeDonationQuery {\n    return new FieldOfficeDonationQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a FieldOfficeQuery for all Island Field Office collections. Pass `source` to wrap a pre-filtered array. */\nexport function fieldOffice(\n  source: FieldOfficeCollectionData[] = allFieldOfficeData,\n): FieldOfficeQuery {\n  return new FieldOfficeQuery(source);\n}\n\n/** Returns a FieldOfficeDonationQuery for all individual fossil donation items. Pass `source` to wrap a pre-filtered array. */\nexport function fieldOfficeDonations(\n  source: FieldOfficeDonation[] = allDonations,\n): FieldOfficeDonationQuery {\n  return new FieldOfficeDonationQuery(source);\n}\n","import { GrandpaCategory, GrandpaInput, GrandpaResult, GrandpaScoreEntry } from '@/types';\n\nconst MAX_SCORE = 21;\n\nconst EARNINGS_TIERS: { threshold: number; points: number }[] = [\n  { threshold: 1_000_000, points: 7 },\n  { threshold: 500_000, points: 5 },\n  { threshold: 300_000, points: 4 },\n  { threshold: 200_000, points: 3 },\n  { threshold: 100_000, points: 2 },\n  { threshold: 50_000, points: 1 },\n];\n\nfunction candlesForScore(score: number): 1 | 2 | 3 | 4 {\n  if (score >= 12) return 4;\n  if (score >= 8) return 3;\n  if (score >= 4) return 2;\n  return 1;\n}\n\nfunction entry(\n  criterion: string,\n  points: number,\n  maxPoints: number,\n  category: GrandpaCategory,\n): GrandpaScoreEntry {\n  return { criterion, points, maxPoints, category };\n}\n\n/** Calculates Grandpa's evaluation score based on end-of-Year-2 progress. */\nexport class GrandpaEvaluator {\n  /**\n   * Calculate the Grandpa evaluation result for the given input.\n   * Returns the total score (0–21), candle count (1–4), and a full breakdown\n   * of points earned per criterion.\n   */\n  evaluate(input: GrandpaInput): GrandpaResult {\n    const breakdown: GrandpaScoreEntry[] = [];\n\n    // Earnings (0–7 pts)\n    const earningsTier = EARNINGS_TIERS.find((t) => input.totalEarnings >= t.threshold);\n    breakdown.push(entry('Total Earnings', earningsTier?.points ?? 0, 7, 'earnings'));\n\n    // Skills (0–2 pts)\n    breakdown.push(\n      entry('Total Skill Levels ≥30', input.totalSkillLevels >= 30 ? 1 : 0, 1, 'skills'),\n    );\n    breakdown.push(\n      entry('Total Skill Levels ≥50', input.totalSkillLevels >= 50 ? 1 : 0, 1, 'skills'),\n    );\n\n    // Achievements (0–3 pts)\n    breakdown.push(\n      entry('A Complete Collection', input.museumCompleted ? 1 : 0, 1, 'achievements'),\n    );\n    breakdown.push(entry('Master Angler', input.masterAngler ? 1 : 0, 1, 'achievements'));\n    breakdown.push(entry('Full Shipment', input.fullShipment ? 1 : 0, 1, 'achievements'));\n\n    // Friendship (0–4 pts)\n    breakdown.push(entry('Married with Kitchen & Nursery', input.married ? 1 : 0, 1, 'friendship'));\n    breakdown.push(\n      entry('5+ Villagers at 8 Hearts', input.villagersAt8Hearts >= 5 ? 1 : 0, 1, 'friendship'),\n    );\n    breakdown.push(\n      entry('10+ Villagers at 8 Hearts', input.villagersAt8Hearts >= 10 ? 1 : 0, 1, 'friendship'),\n    );\n    breakdown.push(entry('Pet at Max Friendship', input.petFriendship ? 1 : 0, 1, 'friendship'));\n\n    // Community Center (0–3 pts)\n    breakdown.push(\n      entry(\n        'Community Center Completed',\n        input.communityCenterCompleted ? 1 : 0,\n        1,\n        'community-center',\n      ),\n    );\n    breakdown.push(\n      entry(\n        'Community Center Ceremony Attended',\n        input.communityCenterCeremonyAttended ? 2 : 0,\n        2,\n        'community-center',\n      ),\n    );\n\n    // Exploration (0–2 pts)\n    breakdown.push(entry('Skull Key Obtained', input.skullKeyObtained ? 1 : 0, 1, 'exploration'));\n    breakdown.push(entry('Rusty Key Obtained', input.rustyKeyObtained ? 1 : 0, 1, 'exploration'));\n\n    const score = breakdown.reduce((sum, e) => sum + e.points, 0);\n\n    return {\n      score,\n      maxScore: MAX_SCORE,\n      candles: candlesForScore(score),\n      breakdown,\n    };\n  }\n}\n\n/** Returns a GrandpaEvaluator for calculating Grandpa's end-of-Year-2 evaluation score. */\nexport function grandpaEvaluator(): GrandpaEvaluator {\n  return new GrandpaEvaluator();\n}\n","[\n  {\n    \"id\": \"286\",\n    \"name\": \"Cherry Bomb\",\n    \"description\": \"Generates a small explosion. Stand back!\",\n    \"price\": 450,\n    \"image\": \"images/craftable/bombs/Cherry Bomb.png\",\n    \"category\": \"explosive\"\n  },\n  {\n    \"id\": \"331\",\n    \"name\": \"Weathered Floor\",\n    \"description\": \"It's a recipe for Weathered Floor.\",\n    \"price\": 500,\n    \"image\": \"images/craftable/decor/Weathered Floor.png\",\n    \"category\": \"recipe\"\n  },\n  {\n    \"id\": \"32\",\n    \"name\": \"Stone Cairn\",\n    \"description\": \"A decorative piece for your farm.\",\n    \"price\": 200,\n    \"image\": \"images/craftable/decor/Stone Cairn.png\",\n    \"category\": \"decoration\"\n  },\n  {\n    \"id\": \"243\",\n    \"name\": \"Miner's Treat\",\n    \"description\": \"This should keep your energy up.\",\n    \"price\": 1000,\n    \"image\": \"images/cooking/Miner's Treat.png\",\n    \"category\": \"food\"\n  },\n  {\n    \"id\": \"287\",\n    \"name\": \"Bomb\",\n    \"description\": \"Generates an explosion. Watch out!\",\n    \"price\": 1000,\n    \"image\": \"images/craftable/bombs/Bomb.png\",\n    \"category\": \"explosive\"\n  },\n  {\n    \"id\": \"288\",\n    \"name\": \"Mega Bomb\",\n    \"description\": \"Generates a powerful explosion. Use with extreme caution.\",\n    \"price\": 1600,\n    \"image\": \"images/craftable/bombs/Mega Bomb.png\",\n    \"category\": \"explosive\"\n  },\n  {\n    \"id\": \"773\",\n    \"name\": \"Life Elixir\",\n    \"description\": \"Restores health to full.\",\n    \"price\": 2000,\n    \"image\": \"images/craftable/edible-items/Life Elixir.png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"138\",\n    \"name\": \"Rarecrow #6\",\n    \"description\": \"Collect 8 rarecrows to get a gift from Mayor Lewis.\",\n    \"price\": 2500,\n    \"image\": \"images/scarecrows/Rarecrow 6.png\",\n    \"category\": \"scarecrow\"\n  },\n  {\n    \"id\": \"772\",\n    \"name\": \"Oil of Garlic\",\n    \"description\": \"Drink this and weaker monsters will avoid you.\",\n    \"price\": 3000,\n    \"image\": \"images/craftable/edible-items/Oil of Garlic.png\",\n    \"category\": \"consumable\"\n  },\n  {\n    \"id\": \"Book_Bombs\",\n    \"name\": \"Dwarvish Safety Manual\",\n    \"description\": \"Bombs deal 25% less damage to you.\",\n    \"price\": 4000,\n    \"image\": \"images/special-items/Dwarvish Safety Manual.png\",\n    \"category\": \"book\"\n  },\n  {\n    \"id\": \"BigStoneChest\",\n    \"name\": \"Big Stone Chest\",\n    \"description\": \"A large stone chest for extra storage space.\",\n    \"price\": 5000,\n    \"image\": \"images/craftable/storage/Big Stone Chest.png\",\n    \"category\": \"recipe\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport dwarfShopData from '@/data/dwarf-shop.json';\nimport { DwarfShopCategory, DwarfShopItem } from '@/types';\n\nconst allDwarfShopData: DwarfShopItem[] = dwarfShopData as DwarfShopItem[];\n\n/** Query builder for items sold at the Dwarf's shop in the Mines. All filter and sort methods return a new DwarfShopQuery for chaining. */\nexport class DwarfShopQuery extends QueryBase<DwarfShopItem> {\n  constructor(data: DwarfShopItem[] = allDwarfShopData) {\n    super(data);\n  }\n\n  /** Filter to items in the given category. */\n  byCategory(category: DwarfShopCategory): DwarfShopQuery {\n    return new DwarfShopQuery(this.data.filter((item) => item.category === category));\n  }\n\n  /** Filter to explosive items (Cherry Bomb, Bomb, Mega Bomb). */\n  explosives(): DwarfShopQuery {\n    return new DwarfShopQuery(this.data.filter((item) => item.category === 'explosive'));\n  }\n\n  /** Filter to consumable items (Life Elixir, Oil of Garlic). */\n  consumables(): DwarfShopQuery {\n    return new DwarfShopQuery(this.data.filter((item) => item.category === 'consumable'));\n  }\n\n  /** Filter to crafting recipe items. */\n  recipes(): DwarfShopQuery {\n    return new DwarfShopQuery(this.data.filter((item) => item.category === 'recipe'));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): DwarfShopQuery {\n    return new DwarfShopQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): DwarfShopQuery {\n    return new DwarfShopQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a DwarfShopQuery for all items sold at the Dwarf's shop. Pass `source` to wrap a pre-filtered array. */\nexport function dwarfShop(source: DwarfShopItem[] = allDwarfShopData): DwarfShopQuery {\n  return new DwarfShopQuery(source);\n}\n","[\n  {\n    \"id\": \"pelican-town\",\n    \"name\": \"Pelican Town\",\n    \"type\": \"location\",\n    \"category\": \"The Valley\",\n    \"image\": \"images/locations/Pelican Town.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": null,\n    \"occupants\": [\n      \"Pierre\",\n      \"Caroline\",\n      \"Abigail\",\n      \"Harvey\",\n      \"Maru\",\n      \"Gus\",\n      \"Emily\",\n      \"Haley\",\n      \"Sam\",\n      \"Alex\",\n      \"Jodi\",\n      \"Clint\",\n      \"Morris\",\n      \"Lewis\",\n      \"Penny\",\n      \"Vincent\",\n      \"Jas\",\n      \"George\",\n      \"Evelyn\"\n    ],\n    \"shop\": null\n  },\n  {\n    \"id\": \"blacksmith\",\n    \"name\": \"Blacksmith\",\n    \"type\": \"building\",\n    \"category\": \"Pelican Town\",\n    \"image\": \"images/locations/Blacksmith.png\",\n    \"openHours\": {\n      \"open\": \"9:00\",\n      \"close\": \"4:00\"\n    },\n    \"closed\": [\"Friday\"],\n    \"address\": \"Southeast Pelican Town\",\n    \"occupants\": [\"Clint\"],\n    \"shop\": \"blacksmith-shop\"\n  },\n  {\n    \"id\": \"community-center\",\n    \"name\": \"Community Center\",\n    \"type\": \"building\",\n    \"category\": \"Pelican Town\",\n    \"image\": \"images/locations/Community Center.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"North Pelican Town\",\n    \"occupants\": [\"Junimos\"],\n    \"shop\": null\n  },\n  {\n    \"id\": \"harveys-clinic\",\n    \"name\": \"Harvey's Clinic\",\n    \"type\": \"building\",\n    \"category\": \"Pelican Town\",\n    \"image\": \"images/locations/Harvey's Clinic.png\",\n    \"openHours\": {\n      \"open\": \"9:00\",\n      \"close\": \"3:00\"\n    },\n    \"closed\": [],\n    \"address\": \"Center Pelican Town\",\n    \"occupants\": [\"Harvey\", \"Maru\"],\n    \"shop\": \"medical-supplies-shop\"\n  },\n  {\n    \"id\": \"bookseller\",\n    \"name\": \"Bookseller\",\n    \"type\": \"building\",\n    \"category\": \"Pelican Town\",\n    \"image\": \"images/locations/Bookseller.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Across the river, above JojaMart\",\n    \"occupants\": [\"Marcello\"],\n    \"shop\": \"bookseller-shop\"\n  },\n  {\n    \"id\": \"jojamart\",\n    \"name\": \"JojaMart\",\n    \"type\": \"building\",\n    \"category\": \"Pelican Town\",\n    \"image\": \"images/locations/JojaMart.png\",\n    \"openHours\": {\n      \"open\": \"9:00\",\n      \"close\": \"11:00\"\n    },\n    \"closed\": [],\n    \"address\": \"Northeast Pelican Town\",\n    \"occupants\": [\"Morris\", \"Shane\", \"Sam\"],\n    \"shop\": \"joja-shop\"\n  },\n  {\n    \"id\": \"museum\",\n    \"name\": \"Museum\",\n    \"type\": \"building\",\n    \"category\": \"Pelican Town\",\n    \"image\": \"images/locations/Museum.png\",\n    \"openHours\": {\n      \"open\": \"8:00\",\n      \"close\": \"6:00\"\n    },\n    \"closed\": [],\n    \"address\": \"East Pelican Town\",\n    \"occupants\": [\"Gunther\"],\n    \"shop\": null\n  },\n  {\n    \"id\": \"pierres-general-store\",\n    \"name\": \"Pierre's General Store\",\n    \"type\": \"building\",\n    \"category\": \"Pelican Town\",\n    \"image\": \"images/locations/Pierre's General Store.png\",\n    \"openHours\": {\n      \"open\": \"9:00\",\n      \"close\": \"5:00\"\n    },\n    \"closed\": [\"Wednesday\"],\n    \"address\": \"North Pelican Town\",\n    \"occupants\": [\"Pierre\", \"Caroline\", \"Abigail\"],\n    \"shop\": \"pierre-shop\"\n  },\n  {\n    \"id\": \"the-stardrop-saloon\",\n    \"name\": \"The Stardrop Saloon\",\n    \"type\": \"building\",\n    \"category\": \"Pelican Town\",\n    \"image\": \"images/locations/The Stardrop Saloon.png\",\n    \"openHours\": {\n      \"open\": \"12:00\",\n      \"close\": \"12:00\"\n    },\n    \"closed\": [],\n    \"address\": \"Center Pelican Town\",\n    \"occupants\": [\"Gus\"],\n    \"shop\": \"saloon-shop\"\n  },\n  {\n    \"id\": \"the-sewers\",\n    \"name\": \"The Sewers\",\n    \"type\": \"building\",\n    \"category\": \"Pelican Town\",\n    \"image\": \"images/locations/The Sewers.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"South Pelican Town (sewer cover) or south Cindersap Forest (grates)\",\n    \"occupants\": [\"Krobus\"],\n    \"shop\": \"krobus-shop\"\n  },\n  {\n    \"id\": \"cindersap-forest\",\n    \"name\": \"Cindersap Forest\",\n    \"type\": \"location\",\n    \"category\": \"The Valley\",\n    \"image\": \"images/locations/Cindersap Forest.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"West of Pelican Town\",\n    \"occupants\": [\"Marnie\", \"Jas\", \"Shane\", \"Leah\", \"Wizard\", \"Hat Mouse\", \"Traveling Merchant\"],\n    \"shop\": null\n  },\n  {\n    \"id\": \"marnies-ranch\",\n    \"name\": \"Marnie's Ranch\",\n    \"type\": \"building\",\n    \"category\": \"Cindersap Forest\",\n    \"image\": \"images/locations/Marnie's Ranch.png\",\n    \"openHours\": {\n      \"open\": \"9:00\",\n      \"close\": \"4:00\"\n    },\n    \"closed\": [\"Monday\", \"Tuesday\"],\n    \"address\": \"Northeast Cindersap Forest\",\n    \"occupants\": [\"Marnie\", \"Jas\", \"Shane\"],\n    \"shop\": \"marnie-shop\"\n  },\n  {\n    \"id\": \"abandoned-house\",\n    \"name\": \"Abandoned House\",\n    \"type\": \"building\",\n    \"category\": \"Cindersap Forest\",\n    \"image\": \"images/locations/Abandoned House.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Cindersap Forest\",\n    \"occupants\": [\"Hat Mouse\"],\n    \"shop\": \"hats\"\n  },\n  {\n    \"id\": \"secret-woods\",\n    \"name\": \"Secret Woods\",\n    \"type\": \"location\",\n    \"category\": \"Cindersap Forest\",\n    \"image\": \"images/locations/Secret Woods.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Northwest Cindersap Forest\",\n    \"occupants\": [],\n    \"shop\": null\n  },\n  {\n    \"id\": \"traveling-cart\",\n    \"name\": \"Traveling Cart\",\n    \"type\": \"building\",\n    \"category\": \"Cindersap Forest\",\n    \"image\": \"images/locations/Traveling Cart.png\",\n    \"openHours\": {\n      \"open\": \"6:00\",\n      \"close\": \"8:00\"\n    },\n    \"closed\": [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Saturday\"],\n    \"address\": \"South Cindersap Forest\",\n    \"occupants\": [\"Traveling Merchant\"],\n    \"shop\": null\n  },\n  {\n    \"id\": \"wizards-tower\",\n    \"name\": \"Wizard's Tower\",\n    \"type\": \"building\",\n    \"category\": \"Cindersap Forest\",\n    \"image\": \"images/locations/Wizard's Tower.png\",\n    \"openHours\": {\n      \"open\": \"6:00\",\n      \"close\": \"11:00\"\n    },\n    \"closed\": [],\n    \"address\": \"West Cindersap Forest\",\n    \"occupants\": [\"Wizard\"],\n    \"shop\": \"wizard-shop\"\n  },\n  {\n    \"id\": \"the-beach\",\n    \"name\": \"The Beach\",\n    \"type\": \"location\",\n    \"category\": \"Beyond the Valley\",\n    \"image\": \"images/locations/The Beach.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"South of Pelican Town\",\n    \"occupants\": [\"Elliott\", \"Willy\", \"Old Mariner\"],\n    \"shop\": null\n  },\n  {\n    \"id\": \"fish-shop\",\n    \"name\": \"Fish Shop\",\n    \"type\": \"building\",\n    \"category\": \"The Beach\",\n    \"image\": \"images/locations/Fish Shop.png\",\n    \"openHours\": {\n      \"open\": \"9:00\",\n      \"close\": \"5:00\"\n    },\n    \"closed\": [\"Saturday\"],\n    \"address\": \"Docks, south of Pelican Town\",\n    \"occupants\": [\"Willy\"],\n    \"shop\": \"willy-shop\"\n  },\n  {\n    \"id\": \"the-mountain\",\n    \"name\": \"The Mountain\",\n    \"type\": \"location\",\n    \"category\": \"Beyond the Valley\",\n    \"image\": \"images/locations/The Mountain.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"North of Pelican Town\",\n    \"occupants\": [\"Robin\", \"Demetrius\", \"Maru\", \"Sebastian\", \"Marlon\", \"Gil\", \"Linus\", \"Leo\"],\n    \"shop\": null\n  },\n  {\n    \"id\": \"adventurers-guild\",\n    \"name\": \"Adventurer's Guild\",\n    \"type\": \"building\",\n    \"category\": \"The Mountain\",\n    \"image\": \"images/locations/Adventurer's Guild.png\",\n    \"openHours\": {\n      \"open\": \"2:00\",\n      \"close\": \"2:00\"\n    },\n    \"closed\": [],\n    \"address\": \"East Mountain\",\n    \"occupants\": [\"Marlon\", \"Gil\"],\n    \"shop\": \"guild-shop\"\n  },\n  {\n    \"id\": \"carpenters-shop\",\n    \"name\": \"Carpenter's Shop\",\n    \"type\": \"building\",\n    \"category\": \"The Mountain\",\n    \"image\": \"images/locations/Carpenter's Shop.png\",\n    \"openHours\": {\n      \"open\": \"9:00\",\n      \"close\": \"5:00\"\n    },\n    \"closed\": [\"Tuesday\"],\n    \"address\": \"24 Mountain Road\",\n    \"occupants\": [\"Robin\", \"Demetrius\", \"Sebastian\", \"Maru\"],\n    \"shop\": \"carpenter-shop\"\n  },\n  {\n    \"id\": \"the-mines\",\n    \"name\": \"The Mines\",\n    \"type\": \"location\",\n    \"category\": \"The Mountain\",\n    \"image\": \"images/locations/The Mines.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Northeast Mountain\",\n    \"occupants\": [\"Dwarf\"],\n    \"shop\": \"dwarf-shop\"\n  },\n  {\n    \"id\": \"railroad\",\n    \"name\": \"Railroad\",\n    \"type\": \"location\",\n    \"category\": \"Beyond the Valley\",\n    \"image\": \"images/locations/Railroad.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"North of The Mountain\",\n    \"occupants\": [],\n    \"shop\": null\n  },\n  {\n    \"id\": \"spa\",\n    \"name\": \"Spa\",\n    \"type\": \"building\",\n    \"category\": \"Railroad\",\n    \"image\": \"images/locations/Spa.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Southwest Railroad\",\n    \"occupants\": [],\n    \"shop\": null\n  },\n  {\n    \"id\": \"quarry\",\n    \"name\": \"Quarry\",\n    \"type\": \"location\",\n    \"category\": \"The Mountain\",\n    \"image\": \"images/locations/Quarry.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"East Mountain\",\n    \"occupants\": [],\n    \"shop\": null\n  },\n  {\n    \"id\": \"quarry-mine\",\n    \"name\": \"Quarry Mine\",\n    \"type\": \"location\",\n    \"category\": \"Quarry\",\n    \"image\": \"images/locations/Quarry Mine.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Inside the Quarry\",\n    \"occupants\": [],\n    \"shop\": null\n  },\n  {\n    \"id\": \"mutant-bug-lair\",\n    \"name\": \"Mutant Bug Lair\",\n    \"type\": \"location\",\n    \"category\": \"The Sewers\",\n    \"image\": \"images/locations/Mutant Bug Lair.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Connected to the Sewers\",\n    \"occupants\": [],\n    \"shop\": null\n  },\n  {\n    \"id\": \"witchs-hut\",\n    \"name\": \"Witch's Hut\",\n    \"type\": \"building\",\n    \"category\": \"Railroad\",\n    \"image\": \"images/locations/Witch's Hut.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Witch's Swamp, north of Railroad\",\n    \"occupants\": [\"Witch\", \"Henchman\"],\n    \"shop\": null\n  },\n  {\n    \"id\": \"the-desert\",\n    \"name\": \"The Desert\",\n    \"type\": \"location\",\n    \"category\": \"Beyond the Valley\",\n    \"image\": \"images/locations/The Desert.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Northwest, accessible by bus from Pelican Town\",\n    \"occupants\": [\"Sandy\", \"Desert Trader\", \"Mr. Qi\"],\n    \"shop\": null\n  },\n  {\n    \"id\": \"casino\",\n    \"name\": \"Casino\",\n    \"type\": \"building\",\n    \"category\": \"The Desert\",\n    \"image\": \"images/locations/Casino.png\",\n    \"openHours\": {\n      \"open\": \"9:00\",\n      \"close\": \"11:50\"\n    },\n    \"closed\": [],\n    \"address\": \"Back of the Oasis, Calico Desert\",\n    \"occupants\": [\"Mr. Qi\"],\n    \"shop\": \"casino-shop\"\n  },\n  {\n    \"id\": \"desert-trader\",\n    \"name\": \"Desert Trader\",\n    \"type\": \"building\",\n    \"category\": \"The Desert\",\n    \"image\": \"images/locations/Desert Trader.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"East Calico Desert\",\n    \"occupants\": [\"Desert Trader\"],\n    \"shop\": \"desert-trader-shop\"\n  },\n  {\n    \"id\": \"oasis\",\n    \"name\": \"Oasis\",\n    \"type\": \"building\",\n    \"category\": \"The Desert\",\n    \"image\": \"images/locations/Oasis.png\",\n    \"openHours\": {\n      \"open\": \"9:00\",\n      \"close\": \"11:50\"\n    },\n    \"closed\": [],\n    \"address\": \"Southwest Calico Desert\",\n    \"occupants\": [\"Sandy\"],\n    \"shop\": \"oasis-shop\"\n  },\n  {\n    \"id\": \"skull-cavern\",\n    \"name\": \"Skull Cavern\",\n    \"type\": \"location\",\n    \"category\": \"The Desert\",\n    \"image\": \"images/locations/Skull Cavern.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Northwest Calico Desert\",\n    \"occupants\": [],\n    \"shop\": null\n  },\n  {\n    \"id\": \"ginger-island\",\n    \"name\": \"Ginger Island\",\n    \"type\": \"location\",\n    \"category\": \"Beyond the Valley\",\n    \"image\": \"images/locations/Ginger Island.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"Accessible via boat from Willy's Fish Shop\",\n    \"occupants\": [\"Leo\", \"Birdie\", \"Professor Snail\", \"Island Trader\", \"Mr. Qi\"],\n    \"shop\": null\n  },\n  {\n    \"id\": \"island-field-office\",\n    \"name\": \"Island Field Office\",\n    \"type\": \"building\",\n    \"category\": \"Ginger Island\",\n    \"image\": \"images/locations/Island Field Office.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"North Ginger Island\",\n    \"occupants\": [\"Professor Snail\"],\n    \"shop\": \"field-office\"\n  },\n  {\n    \"id\": \"island-trader\",\n    \"name\": \"Island Trader\",\n    \"type\": \"building\",\n    \"category\": \"Ginger Island\",\n    \"image\": \"images/locations/Island Trader.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"North Ginger Island\",\n    \"occupants\": [\"Island Trader\"],\n    \"shop\": \"island-trader-shop\"\n  },\n  {\n    \"id\": \"qis-walnut-room\",\n    \"name\": \"Qi's Walnut Room\",\n    \"type\": \"building\",\n    \"category\": \"Ginger Island\",\n    \"image\": \"images/locations/Qi's Walnut Room.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"West Ginger Island (requires 100 Golden Walnuts)\",\n    \"occupants\": [\"Mr. Qi\"],\n    \"shop\": \"qi-shop\"\n  },\n  {\n    \"id\": \"volcano-dungeon\",\n    \"name\": \"Volcano Dungeon\",\n    \"type\": \"location\",\n    \"category\": \"Ginger Island\",\n    \"image\": \"images/locations/Volcano Dungeon.png\",\n    \"openHours\": null,\n    \"closed\": [],\n    \"address\": \"North Ginger Island, inside the volcano\",\n    \"occupants\": [\"Dwarf\", \"Parrot\"],\n    \"shop\": \"volcano-shop\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/locations.json';\nimport { GameLocation, LocationCategory, LocationDay, LocationType } from '@/types';\n\nconst allLocations: GameLocation[] = data as GameLocation[];\n\n/** Query builder for Stardew Valley location data. All filter and sort methods return a new LocationQuery for chaining. */\nexport class LocationQuery extends QueryBase<GameLocation> {\n  constructor(data: GameLocation[] = allLocations) {\n    super(data);\n  }\n\n  /** Filter to entries of the given type (\"location\" or \"building\"). */\n  byType(type: LocationType): LocationQuery {\n    return new LocationQuery(this.data.filter((l) => l.type === type));\n  }\n\n  /** Filter to locations in the given category. */\n  byCategory(category: LocationCategory): LocationQuery {\n    return new LocationQuery(this.data.filter((l) => l.category === category));\n  }\n\n  /** Filter to locations that have a linked shop data file. */\n  withShop(): LocationQuery {\n    return new LocationQuery(this.data.filter((l) => l.shop !== null));\n  }\n\n  /** Filter to locations that are always accessible (no operating hours). */\n  alwaysOpen(): LocationQuery {\n    return new LocationQuery(this.data.filter((l) => l.openHours === null));\n  }\n\n  /** Filter to locations closed on the given day. */\n  closedOn(day: LocationDay): LocationQuery {\n    return new LocationQuery(this.data.filter((l) => l.closed.includes(day)));\n  }\n\n  /** Filter to locations that have the given NPC as an occupant (case-insensitive). */\n  byOccupant(name: string): LocationQuery {\n    const lower = name.toLowerCase();\n    return new LocationQuery(\n      this.data.filter((l) => l.occupants.some((o) => o.toLowerCase() === lower)),\n    );\n  }\n\n  /** Sort locations by name alphabetically. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): LocationQuery {\n    return new LocationQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a LocationQuery for all Stardew Valley location data. Pass `source` to wrap a pre-filtered array. */\nexport function locations(source: GameLocation[] = allLocations): LocationQuery {\n  return new LocationQuery(source);\n}\n","[\n  {\n    \"id\": \"ForestMagic\",\n    \"name\": \"Forest Magic\",\n    \"type\": \"special-item\",\n    \"effect\": \"Unlocks the ability to read the language of the Junimos\",\n    \"obtainedFrom\": \"\\\"Meet The Wizard\\\" quest reward after examining the first golden scroll in the Community Center\",\n    \"image\": \"images/special-items/Forest Magic.png\",\n    \"mailFlags\": [\"canReadJunimoText\"]\n  },\n  {\n    \"id\": \"DwarvishTranslationGuide\",\n    \"name\": \"Dwarvish Translation Guide\",\n    \"type\": \"special-item\",\n    \"effect\": \"Unlocks the ability to speak to the Dwarf in the mines and volcano dungeon\",\n    \"obtainedFrom\": \"Museum donation reward: all 4 Dwarf Scrolls\",\n    \"image\": \"images/special-items/Dwarvish Translation Guide.png\",\n    \"mailFlags\": [\"HasDwarvishTranslationGuide\"]\n  },\n  {\n    \"id\": \"RustyKey\",\n    \"name\": \"Rusty Key\",\n    \"type\": \"special-item\",\n    \"effect\": \"Grants access to The Sewers\",\n    \"obtainedFrom\": \"Reward from Gunther after donating 60 museum items\",\n    \"image\": \"images/special-items/Rusty Key.png\",\n    \"mailFlags\": [\"HasRustyKey\", \"ccBoilerRoom\"]\n  },\n  {\n    \"id\": \"ClubCard\",\n    \"name\": \"Club Card\",\n    \"type\": \"special-item\",\n    \"effect\": \"Enables entry to the Casino\",\n    \"obtainedFrom\": \"\\\"The Mysterious Qi\\\" quest completion\",\n    \"image\": \"images/special-items/Club Card.png\",\n    \"mailFlags\": [\"HasClubCard\"]\n  },\n  {\n    \"id\": \"SpecialCharm\",\n    \"name\": \"Special Charm\",\n    \"type\": \"special-item\",\n    \"effect\": \"Permanently increases daily luck\",\n    \"obtainedFrom\": \"Truck driver near JojaMart/Movie Theater with Secret Note #20 and a Rabbit's Foot\",\n    \"image\": \"images/special-items/Special Charm.png\",\n    \"mailFlags\": [\"HasSpecialCharm\"]\n  },\n  {\n    \"id\": \"SkullKey\",\n    \"name\": \"Skull Key\",\n    \"type\": \"special-item\",\n    \"effect\": \"Unlocks Skull Cavern and enables the Junimo Kart machine\",\n    \"obtainedFrom\": \"Chest on floor 120 of The Mines\",\n    \"image\": \"images/special-items/Skull Key.png\",\n    \"mailFlags\": [\"HasSkullKey\"]\n  },\n  {\n    \"id\": \"MagnifyingGlass\",\n    \"name\": \"Magnifying Glass\",\n    \"type\": \"special-item\",\n    \"effect\": \"Unlocks the ability to find Secret Notes\",\n    \"obtainedFrom\": \"\\\"A Winter Mystery\\\" quest completion\",\n    \"image\": \"images/special-items/Magnifying Glass.png\",\n    \"mailFlags\": [\"HasMagnifyingGlass\"]\n  },\n  {\n    \"id\": \"DarkTalisman\",\n    \"name\": \"Dark Talisman\",\n    \"type\": \"special-item\",\n    \"effect\": \"Quest item used to open the passage to the Witch's Swamp\",\n    \"obtainedFrom\": \"Chest in the Mutant Bug Lair\",\n    \"image\": \"images/special-items/Dark Talisman.png\",\n    \"mailFlags\": [\"HasDarkTalisman\"]\n  },\n  {\n    \"id\": \"MagicInk\",\n    \"name\": \"Magic Ink\",\n    \"type\": \"special-item\",\n    \"effect\": \"Quest item returned to the Wizard to restore his magic\",\n    \"obtainedFrom\": \"Table in the Witch's Hut\",\n    \"image\": \"images/special-items/Magic Ink.png\",\n    \"mailFlags\": [\"HasMagicInk\"]\n  },\n  {\n    \"id\": \"BearPaw\",\n    \"name\": \"Bear's Knowledge\",\n    \"type\": \"special-item\",\n    \"effect\": \"Increases sell price of Blackberries and Salmonberries by 3x\",\n    \"obtainedFrom\": \"Secret Woods — bring Maple Syrup after reading Secret Note #23\",\n    \"image\": \"images/special-items/Bear's Knowledge.png\",\n    \"mailFlags\": [\"bearsKnowledge\"]\n  },\n  {\n    \"id\": \"SpringOnionMastery\",\n    \"name\": \"Spring Onion Mastery\",\n    \"type\": \"special-item\",\n    \"effect\": \"Increases sell price of Spring Onions by 5x\",\n    \"obtainedFrom\": \"Vincent and Jas' 8-heart event\",\n    \"image\": \"images/special-items/Spring Onion Mastery.png\",\n    \"eventFlags\": [\"3910979\"]\n  },\n  {\n    \"id\": \"KeyToTheTown\",\n    \"name\": \"Key To The Town\",\n    \"type\": \"special-item\",\n    \"effect\": \"Allows access to all buildings in town at any time\",\n    \"obtainedFrom\": \"Qi's Walnut Room — 20 Qi Gems\",\n    \"image\": \"images/special-items/Key To The Town.png\",\n    \"mailFlags\": [\"HasTownKey\"]\n  },\n  {\n    \"id\": \"PriceCatalogue\",\n    \"name\": \"Price Catalogue\",\n    \"type\": \"book\",\n    \"effect\": \"You can now see the value of your items\",\n    \"obtainedFrom\": \"Bookseller: 3,000g\",\n    \"image\": \"images/special-items/Price Catalogue.png\"\n  },\n  {\n    \"id\": \"Marlon\",\n    \"name\": \"Mapping Cave Systems\",\n    \"type\": \"book\",\n    \"effect\": \"50% discount on Marlon's item retrieval service\",\n    \"obtainedFrom\": \"Adventurer's Guild (1,000+ monster kills) or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/Mapping Cave Systems.png\"\n  },\n  {\n    \"id\": \"Speed\",\n    \"name\": \"Way Of The Wind pt. 1\",\n    \"type\": \"book\",\n    \"effect\": \"Permanently increases running speed\",\n    \"obtainedFrom\": \"Bookseller: 15,000g\",\n    \"image\": \"images/special-items/Way Of The Wind pt. 1.png\"\n  },\n  {\n    \"id\": \"Speed2\",\n    \"name\": \"Way Of The Wind pt. 2\",\n    \"type\": \"book\",\n    \"effect\": \"Additional running speed boost (requires Way Of The Wind pt. 1)\",\n    \"obtainedFrom\": \"Bookseller: 35,000g (after pt. 1 read)\",\n    \"image\": \"images/special-items/Way Of The Wind pt. 2.png\"\n  },\n  {\n    \"id\": \"Void\",\n    \"name\": \"Monster Compendium\",\n    \"type\": \"book\",\n    \"effect\": \"Monsters have a small chance to drop double loot\",\n    \"obtainedFrom\": \"Drop from slain monsters or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/Monster Compendium.png\"\n  },\n  {\n    \"id\": \"Friendship\",\n    \"name\": \"Friendship 101\",\n    \"type\": \"book\",\n    \"effect\": \"You become friends with people a little faster\",\n    \"obtainedFrom\": \"Lewis' house prize machine or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/Friendship 101.png\"\n  },\n  {\n    \"id\": \"Defense\",\n    \"name\": \"Jack Be Nimble, Jack Be Thick\",\n    \"type\": \"book\",\n    \"effect\": \"Gain +1 Defense\",\n    \"obtainedFrom\": \"Artifact Spots or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/Jack Be Nimble, Jack Be Thick.png\"\n  },\n  {\n    \"id\": \"Woodcutting\",\n    \"name\": \"Woody's Secret\",\n    \"type\": \"book\",\n    \"effect\": \"Felled trees have a 5% chance to yield double wood\",\n    \"obtainedFrom\": \"Chopping trees or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/Woody's Secret.png\"\n  },\n  {\n    \"id\": \"WildSeeds\",\n    \"name\": \"Ways Of The Wild\",\n    \"type\": \"book\",\n    \"effect\": \"Weeds have a greater chance to yield mixed seeds\",\n    \"obtainedFrom\": \"Second raccoon quest reward (Giant Stump); Raccoon Wife's Shop: 999 Fiber; Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/Ways Of The Wild.png\"\n  },\n  {\n    \"id\": \"Roe\",\n    \"name\": \"Jewels Of The Sea\",\n    \"type\": \"book\",\n    \"effect\": \"Fishing treasure chests have a chance to yield roe\",\n    \"obtainedFrom\": \"Fishing Treasure Chest or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/Jewels Of The Sea.png\"\n  },\n  {\n    \"id\": \"Bombs\",\n    \"name\": \"Dwarvish Safety Manual\",\n    \"type\": \"book\",\n    \"effect\": \"Bombs deal 25% less damage to you\",\n    \"obtainedFrom\": \"Dwarf: 4,000g or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/Dwarvish Safety Manual.png\"\n  },\n  {\n    \"id\": \"Crabbing\",\n    \"name\": \"The Art O' Crabbing\",\n    \"type\": \"book\",\n    \"effect\": \"Crab pots have a 25% chance to yield double catch\",\n    \"obtainedFrom\": \"SquidFest Iridium tier reward or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/The Art O' Crabbing.png\"\n  },\n  {\n    \"id\": \"Trash\",\n    \"name\": \"The Alleyway Buffet\",\n    \"type\": \"book\",\n    \"effect\": \"Greater chance to find items in trash cans\",\n    \"obtainedFrom\": \"Gold trash can (Blacksmith/JojaMart area) or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/The Alleyway Buffet.png\"\n  },\n  {\n    \"id\": \"Diamonds\",\n    \"name\": \"The Diamond Hunter\",\n    \"type\": \"book\",\n    \"effect\": \"All stones have a chance to drop a diamond when mined\",\n    \"obtainedFrom\": \"Volcano Dungeon Dwarf: 10 Diamonds\",\n    \"image\": \"images/special-items/The Diamond Hunter.png\"\n  },\n  {\n    \"id\": \"Mystery\",\n    \"name\": \"Book of Mysteries\",\n    \"type\": \"book\",\n    \"effect\": \"Slightly greater chance to find Mystery Boxes\",\n    \"obtainedFrom\": \"Found in Mystery Boxes or Golden Mystery Boxes\",\n    \"image\": \"images/special-items/Book of Mysteries.png\"\n  },\n  {\n    \"id\": \"Horse\",\n    \"name\": \"Horse: The Book\",\n    \"type\": \"book\",\n    \"effect\": \"Gain a little extra speed when riding your horse\",\n    \"obtainedFrom\": \"Bookseller: 25,000g\",\n    \"image\": \"images/special-items/Horse The Book.png\"\n  },\n  {\n    \"id\": \"Artifact\",\n    \"name\": \"Treasure Appraisal Guide\",\n    \"type\": \"book\",\n    \"effect\": \"Fetch a better price when selling artifacts\",\n    \"obtainedFrom\": \"Artifact Troves or Bookseller: 20,000g (Year 3+)\",\n    \"image\": \"images/special-items/Treasure Appraisal Guide.png\"\n  },\n  {\n    \"id\": \"Grass\",\n    \"name\": \"Ol' Slitherlegs\",\n    \"type\": \"book\",\n    \"effect\": \"Run a lot faster through grass and crops\",\n    \"obtainedFrom\": \"Bookseller: 25,000g\",\n    \"image\": \"images/special-items/Ol' Slitherlegs.png\"\n  },\n  {\n    \"id\": \"AnimalCatalogue\",\n    \"name\": \"Animal Catalogue\",\n    \"type\": \"book\",\n    \"effect\": \"Access Marnie's shop when she's not around\",\n    \"obtainedFrom\": \"Marnie: 5,000g (Year 2+)\",\n    \"image\": \"images/special-items/Animal Catalogue.png\"\n  },\n  {\n    \"id\": \"BaitAndBobber\",\n    \"name\": \"Bait And Bobber\",\n    \"type\": \"skill-book\",\n    \"effect\": \"Grants 250 Fishing XP\",\n    \"obtainedFrom\": \"Bookseller; Fishing Treasure Chest; Mystery Box; monster drops; Traveling Cart; Prize Machine\",\n    \"image\": \"images/special-items/Bait And Bobber.png\"\n  },\n  {\n    \"id\": \"CombatQuarterly\",\n    \"name\": \"Combat Quarterly\",\n    \"type\": \"skill-book\",\n    \"effect\": \"Grants 250 Combat XP\",\n    \"obtainedFrom\": \"Bookseller; Fishing Treasure Chest; Mystery Box; monster drops; Traveling Cart; Prize Machine\",\n    \"image\": \"images/special-items/Combat Quarterly.png\"\n  },\n  {\n    \"id\": \"MiningMonthly\",\n    \"name\": \"Mining Monthly\",\n    \"type\": \"skill-book\",\n    \"effect\": \"Grants 250 Mining XP\",\n    \"obtainedFrom\": \"Bookseller; Fishing Treasure Chest; Mystery Box; monster drops; Traveling Cart; Prize Machine\",\n    \"image\": \"images/special-items/Mining Monthly.png\"\n  },\n  {\n    \"id\": \"StardewValleyAlmanac\",\n    \"name\": \"Stardew Valley Almanac\",\n    \"type\": \"skill-book\",\n    \"effect\": \"Grants 250 Farming XP\",\n    \"obtainedFrom\": \"Bookseller; Fishing Treasure Chest; Mystery Box; monster drops; Traveling Cart; Prize Machine\",\n    \"image\": \"images/special-items/Stardew Valley Almanac.png\"\n  },\n  {\n    \"id\": \"WoodcuttersWeekly\",\n    \"name\": \"Woodcutter's Weekly\",\n    \"type\": \"skill-book\",\n    \"effect\": \"Grants 250 Foraging XP\",\n    \"obtainedFrom\": \"Bookseller; 100 Calico Eggs at Desert Festival; Fishing Treasure Chest; Mystery Box; monster drops; Traveling Cart; Prize Machine\",\n    \"image\": \"images/special-items/Woodcutter's Weekly.png\"\n  },\n  {\n    \"id\": \"Mastery_Farming\",\n    \"name\": \"Farming Mastery\",\n    \"type\": \"mastery\",\n    \"skill\": \"farming\",\n    \"effect\": \"Golden Animal Crackers can now be found, which permanently double a farm animal's produce (excludes pigs)\",\n    \"obtainedFrom\": \"Mastery Cave pedestal (reach level 10 in all five skills)\",\n    \"image\": \"images/special-items/Mastery Icon.png\"\n  },\n  {\n    \"id\": \"Mastery_Mining\",\n    \"name\": \"Mining Mastery\",\n    \"type\": \"mastery\",\n    \"skill\": \"mining\",\n    \"effect\": \"Gem-bearing rocks now grant twice the gems\",\n    \"obtainedFrom\": \"Mastery Cave pedestal (reach level 10 in all five skills)\",\n    \"image\": \"images/special-items/Mastery Icon.png\"\n  },\n  {\n    \"id\": \"Mastery_Foraging\",\n    \"name\": \"Foraging Mastery\",\n    \"type\": \"mastery\",\n    \"skill\": \"foraging\",\n    \"effect\": \"Golden Mystery Boxes can now be found, which contain superior items\",\n    \"obtainedFrom\": \"Mastery Cave pedestal (reach level 10 in all five skills)\",\n    \"image\": \"images/special-items/Mastery Icon.png\"\n  },\n  {\n    \"id\": \"Mastery_Fishing\",\n    \"name\": \"Fishing Mastery\",\n    \"type\": \"mastery\",\n    \"skill\": \"fishing\",\n    \"effect\": \"Golden Fishing Treasure Chests can now appear\",\n    \"obtainedFrom\": \"Mastery Cave pedestal (reach level 10 in all five skills)\",\n    \"image\": \"images/special-items/Mastery Icon.png\"\n  },\n  {\n    \"id\": \"Mastery_Combat\",\n    \"name\": \"Combat Mastery\",\n    \"type\": \"mastery\",\n    \"skill\": \"combat\",\n    \"effect\": \"Unlocks a new equipment slot for trinkets with special powers\",\n    \"obtainedFrom\": \"Mastery Cave pedestal (reach level 10 in all five skills)\",\n    \"image\": \"images/special-items/Mastery Icon.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/special-items.json';\nimport { MasterySkill, SpecialItem, SpecialItemType } from '@/types';\n\nconst allSpecialItems: SpecialItem[] = data as SpecialItem[];\n\n/** Query builder for Special Items & Powers data. All filter and sort methods return a new SpecialItemQuery for chaining. */\nexport class SpecialItemQuery extends QueryBase<SpecialItem> {\n  constructor(data: SpecialItem[] = allSpecialItems) {\n    super(data);\n  }\n\n  /** Filter to entries of the given type (\"special-item\", \"book\", \"skill-book\", or \"mastery\"). */\n  byType(type: SpecialItemType): SpecialItemQuery {\n    return new SpecialItemQuery(this.data.filter((s) => s.type === type));\n  }\n\n  /** Filter mastery items by associated skill. */\n  bySkill(skill: MasterySkill): SpecialItemQuery {\n    return new SpecialItemQuery(this.data.filter((s) => s.skill === skill));\n  }\n\n  /** Sort alphabetically by name. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): SpecialItemQuery {\n    return new SpecialItemQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a SpecialItemQuery for all Special Items & Powers data. Pass `source` to wrap a pre-filtered array. */\nexport function specialItems(source: SpecialItem[] = allSpecialItems): SpecialItemQuery {\n  return new SpecialItemQuery(source);\n}\n","{\n  \"items\": [\n    {\n      \"id\": \"price-catalogue\",\n      \"name\": \"Price Catalogue\",\n      \"availability\": \"always\",\n      \"price\": 3000,\n      \"image\": \"images/special-items/Price Catalogue.png\"\n    },\n    {\n      \"id\": \"way-of-the-wind-pt-1\",\n      \"name\": \"Way Of The Wind pt. 1\",\n      \"availability\": \"always\",\n      \"price\": 15000,\n      \"image\": \"images/special-items/Way Of The Wind pt. 1.png\"\n    },\n    {\n      \"id\": \"way-of-the-wind-pt-2\",\n      \"name\": \"Way Of The Wind pt. 2\",\n      \"availability\": \"always\",\n      \"price\": 35000,\n      \"image\": \"images/special-items/Way Of The Wind pt. 2.png\"\n    },\n    {\n      \"id\": \"horse-the-book\",\n      \"name\": \"Horse: The Book\",\n      \"availability\": \"always\",\n      \"price\": 25000,\n      \"image\": \"images/special-items/Horse The Book.png\"\n    },\n    {\n      \"id\": \"ol-slitherlegs\",\n      \"name\": \"Ol' Slitherlegs\",\n      \"availability\": \"always\",\n      \"price\": 25000,\n      \"image\": \"images/special-items/Ol' Slitherlegs.png\"\n    },\n    {\n      \"id\": \"stardew-valley-almanac\",\n      \"name\": \"Stardew Valley Almanac\",\n      \"availability\": \"rotating-skill\",\n      \"price\": 10000,\n      \"priceTiers\": [10000, 8000, 5000],\n      \"image\": \"images/special-items/Stardew Valley Almanac.png\"\n    },\n    {\n      \"id\": \"bait-and-bobber\",\n      \"name\": \"Bait And Bobber\",\n      \"availability\": \"rotating-skill\",\n      \"price\": 10000,\n      \"priceTiers\": [10000, 8000, 5000],\n      \"image\": \"images/special-items/Bait And Bobber.png\"\n    },\n    {\n      \"id\": \"mining-monthly\",\n      \"name\": \"Mining Monthly\",\n      \"availability\": \"rotating-skill\",\n      \"price\": 10000,\n      \"priceTiers\": [10000, 8000, 5000],\n      \"image\": \"images/special-items/Mining Monthly.png\"\n    },\n    {\n      \"id\": \"combat-quarterly\",\n      \"name\": \"Combat Quarterly\",\n      \"availability\": \"rotating-skill\",\n      \"price\": 10000,\n      \"priceTiers\": [10000, 8000, 5000],\n      \"image\": \"images/special-items/Combat Quarterly.png\"\n    },\n    {\n      \"id\": \"woodcutters-weekly\",\n      \"name\": \"Woodcutter's Weekly\",\n      \"availability\": \"rotating-skill\",\n      \"price\": 10000,\n      \"priceTiers\": [10000, 8000, 5000],\n      \"image\": \"images/special-items/Woodcutter's Weekly.png\"\n    },\n    {\n      \"id\": \"book-of-stars\",\n      \"name\": \"Book Of Stars\",\n      \"availability\": \"chance\",\n      \"price\": 15000,\n      \"image\": \"images/special-items/Book Of Stars.png\"\n    },\n    {\n      \"id\": \"the-alleyway-buffet\",\n      \"name\": \"The Alleyway Buffet\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/The Alleyway Buffet.png\"\n    },\n    {\n      \"id\": \"the-art-o-crabbing\",\n      \"name\": \"The Art O' Crabbing\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/The Art O' Crabbing.png\"\n    },\n    {\n      \"id\": \"dwarvish-safety-manual\",\n      \"name\": \"Dwarvish Safety Manual\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/Dwarvish Safety Manual.png\"\n    },\n    {\n      \"id\": \"jewels-of-the-sea\",\n      \"name\": \"Jewels Of The Sea\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/Jewels Of The Sea.png\"\n    },\n    {\n      \"id\": \"ways-of-the-wild\",\n      \"name\": \"Ways Of The Wild\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/Ways Of The Wild.png\"\n    },\n    {\n      \"id\": \"woodys-secret\",\n      \"name\": \"Woody's Secret\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/Woody's Secret.png\"\n    },\n    {\n      \"id\": \"jack-be-nimble-jack-be-thick\",\n      \"name\": \"Jack Be Nimble, Jack Be Thick\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/Jack Be Nimble, Jack Be Thick.png\"\n    },\n    {\n      \"id\": \"friendship-101\",\n      \"name\": \"Friendship 101\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/Friendship 101.png\"\n    },\n    {\n      \"id\": \"monster-compendium\",\n      \"name\": \"Monster Compendium\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/Monster Compendium.png\"\n    },\n    {\n      \"id\": \"mapping-cave-systems\",\n      \"name\": \"Mapping Cave Systems\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/Mapping Cave Systems.png\"\n    },\n    {\n      \"id\": \"treasure-appraisal-guide\",\n      \"name\": \"Treasure Appraisal Guide\",\n      \"availability\": \"rotating-year3\",\n      \"price\": 20000,\n      \"image\": \"images/special-items/Treasure Appraisal Guide.png\"\n    },\n    {\n      \"id\": \"queen-of-sauce-cookbook\",\n      \"name\": \"Queen Of Sauce Cookbook\",\n      \"availability\": \"golden-walnut\",\n      \"price\": 50000,\n      \"image\": \"images/special-items/Queen Of Sauce Cookbook.png\"\n    }\n  ],\n  \"trades\": [\n    {\n      \"bookId\": \"book-of-stars\",\n      \"bookName\": \"Book Of Stars\",\n      \"bookImage\": \"images/special-items/Book Of Stars.png\",\n      \"receiveItems\": [\"Fairy Dust\"],\n      \"receiveQuantity\": 8\n    },\n    {\n      \"bookId\": \"stardew-valley-almanac\",\n      \"bookName\": \"Stardew Valley Almanac\",\n      \"bookImage\": \"images/special-items/Stardew Valley Almanac.png\",\n      \"receiveItems\": [\"Pepper Poppers\"],\n      \"receiveQuantity\": 2\n    },\n    {\n      \"bookId\": \"bait-and-bobber\",\n      \"bookName\": \"Bait And Bobber\",\n      \"bookImage\": \"images/special-items/Bait And Bobber.png\",\n      \"receiveItems\": [\"Deluxe Bait\"],\n      \"receiveQuantity\": 30\n    },\n    {\n      \"bookId\": \"woodcutters-weekly\",\n      \"bookName\": \"Woodcutter's Weekly\",\n      \"bookImage\": \"images/special-items/Woodcutter's Weekly.png\",\n      \"receiveItems\": [\"Wood\"],\n      \"receiveQuantity\": 100\n    },\n    {\n      \"bookId\": \"mining-monthly\",\n      \"bookName\": \"Mining Monthly\",\n      \"bookImage\": \"images/special-items/Mining Monthly.png\",\n      \"receiveItems\": [\"Coal\"],\n      \"receiveQuantity\": 20\n    },\n    {\n      \"bookId\": \"combat-quarterly\",\n      \"bookName\": \"Combat Quarterly\",\n      \"bookImage\": \"images/special-items/Combat Quarterly.png\",\n      \"receiveItems\": [\"Monster Musk\"],\n      \"receiveQuantity\": 1\n    },\n    {\n      \"bookId\": \"jewels-of-the-sea\",\n      \"bookName\": \"Jewels Of The Sea\",\n      \"bookImage\": \"images/special-items/Jewels Of The Sea.png\",\n      \"receiveItems\": [\"Cave Jelly\", \"River Jelly\", \"Sea Jelly\"],\n      \"receiveQuantity\": 3\n    },\n    {\n      \"bookId\": \"woodys-secret\",\n      \"bookName\": \"Woody's Secret\",\n      \"bookImage\": \"images/special-items/Woody's Secret.png\",\n      \"receiveItems\": [\"Hardwood\"],\n      \"receiveQuantity\": 20\n    },\n    {\n      \"bookId\": \"jack-be-nimble-jack-be-thick\",\n      \"bookName\": \"Jack Be Nimble, Jack Be Thick\",\n      \"bookImage\": \"images/special-items/Jack Be Nimble, Jack Be Thick.png\",\n      \"receiveItems\": [\"Stuffing\"],\n      \"receiveQuantity\": 3\n    },\n    {\n      \"bookId\": \"monster-compendium\",\n      \"bookName\": \"Monster Compendium\",\n      \"bookImage\": \"images/special-items/Monster Compendium.png\",\n      \"receiveItems\": [\"Slime Egg-Press\", \"Slime Incubator\"],\n      \"receiveQuantity\": 1\n    },\n    {\n      \"bookId\": \"book-of-mysteries\",\n      \"bookName\": \"Book of Mysteries\",\n      \"bookImage\": \"images/special-items/Book of Mysteries.png\",\n      \"receiveItems\": [\"Mystery Box\"],\n      \"receiveQuantity\": 7\n    },\n    {\n      \"bookId\": \"treasure-appraisal-guide\",\n      \"bookName\": \"Treasure Appraisal Guide\",\n      \"bookImage\": \"images/special-items/Treasure Appraisal Guide.png\",\n      \"receiveItems\": [\"Spicy Eel\", \"Artifact Trove\"],\n      \"receiveQuantity\": 3\n    }\n  ]\n}\n","import { QueryBase } from '@/common/query-base';\nimport data from '@/data/bookseller-shop.json';\nimport { BooksellerAvailability, BooksellerItem, BooksellerTrade } from '@/types';\n\nconst allItems: BooksellerItem[] = data.items as BooksellerItem[];\nconst allTrades: BooksellerTrade[] = data.trades as BooksellerTrade[];\n\n/** Query builder for Bookseller shop item data. All filter and sort methods return a new BooksellerItemQuery for chaining. */\nexport class BooksellerItemQuery extends QueryBase<BooksellerItem> {\n  constructor(data: BooksellerItem[] = allItems) {\n    super(data);\n  }\n\n  /** Filter to items with the given availability. */\n  byAvailability(availability: BooksellerAvailability): BooksellerItemQuery {\n    return new BooksellerItemQuery(this.data.filter((i) => i.availability === availability));\n  }\n\n  /** Filter to items always in stock. */\n  alwaysAvailable(): BooksellerItemQuery {\n    return this.byAvailability('always');\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): BooksellerItemQuery {\n    return new BooksellerItemQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort alphabetically by name. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): BooksellerItemQuery {\n    return new BooksellerItemQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Accessor for Bookseller trade-in data. */\nexport class BooksellerTradeQuery {\n  constructor(private readonly data: BooksellerTrade[] = allTrades) {}\n\n  /** All trade-in offers. */\n  get(): BooksellerTrade[] {\n    return this.data;\n  }\n\n  /** Number of trade-in offers. */\n  count(): number {\n    return this.data.length;\n  }\n\n  /** Find a trade-in offer by the book ID being traded. */\n  findByBookId(bookId: string): BooksellerTrade | undefined {\n    return this.data.find((t) => t.bookId === bookId);\n  }\n}\n\n/** Returns a BooksellerItemQuery for all Bookseller shop items. Pass `source` to wrap a pre-filtered array. */\nexport function booksellerShop(source: BooksellerItem[] = allItems): BooksellerItemQuery {\n  return new BooksellerItemQuery(source);\n}\n\n/** Returns a BooksellerTradeQuery for all Bookseller trade-in offers. Pass `source` to wrap a pre-filtered array. */\nexport function booksellerTrades(source: BooksellerTrade[] = allTrades): BooksellerTradeQuery {\n  return new BooksellerTradeQuery(source);\n}\n","[\n  {\n    \"id\": \"cotton-candy\",\n    \"name\": \"Cotton Candy\",\n    \"price\": 50,\n    \"tags\": [\"sweet\", \"candy\"],\n    \"image\": \"images/concessions/Cotton Candy.png\"\n  },\n  {\n    \"id\": \"jasmine-tea\",\n    \"name\": \"Jasmine Tea\",\n    \"price\": 50,\n    \"tags\": [\"drink\", \"hot\", \"healthy\"],\n    \"image\": \"images/concessions/Jasmine Tea.png\"\n  },\n  {\n    \"id\": \"joja-cola\",\n    \"name\": \"Joja Cola\",\n    \"price\": 40,\n    \"tags\": [\"drink\", \"cold\", \"joja\"],\n    \"image\": \"images/concessions/Joja Cola.png\"\n  },\n  {\n    \"id\": \"sour-slimes\",\n    \"name\": \"Sour Slimes\",\n    \"price\": 80,\n    \"tags\": [\"sour\", \"candy\"],\n    \"image\": \"images/concessions/Sour Slimes.png\"\n  },\n  {\n    \"id\": \"personal-pizza\",\n    \"name\": \"Personal Pizza\",\n    \"price\": 150,\n    \"tags\": [\"hot\", \"fatty\"],\n    \"image\": \"images/concessions/Personal Pizza.png\"\n  },\n  {\n    \"id\": \"nachos\",\n    \"name\": \"Nachos\",\n    \"price\": 100,\n    \"tags\": [\"hot\", \"salty\", \"fatty\"],\n    \"image\": \"images/concessions/Nachos.png\"\n  },\n  {\n    \"id\": \"salmon-burger\",\n    \"name\": \"Salmon Burger\",\n    \"price\": 150,\n    \"tags\": [\"sandwich\", \"burger\"],\n    \"image\": \"images/concessions/Salmon Burger.png\"\n  },\n  {\n    \"id\": \"ice-cream-sandwich\",\n    \"name\": \"Ice Cream Sandwich\",\n    \"price\": 150,\n    \"tags\": [\"sandwich\", \"sweet\", \"cold\"],\n    \"image\": \"images/concessions/Ice Cream Sandwich.png\"\n  },\n  {\n    \"id\": \"popcorn\",\n    \"name\": \"Popcorn\",\n    \"price\": 120,\n    \"tags\": [\"hot\", \"salty\"],\n    \"image\": \"images/concessions/Popcorn.png\"\n  },\n  {\n    \"id\": \"fries\",\n    \"name\": \"Fries\",\n    \"price\": 100,\n    \"tags\": [\"hot\", \"salty\", \"fatty\"],\n    \"image\": \"images/concessions/Fries.png\"\n  },\n  {\n    \"id\": \"chocolate-popcorn\",\n    \"name\": \"Chocolate Popcorn\",\n    \"price\": 130,\n    \"tags\": [\"hot\", \"sweet\"],\n    \"image\": \"images/concessions/Chocolate Popcorn.png\"\n  },\n  {\n    \"id\": \"black-licorice\",\n    \"name\": \"Black Licorice\",\n    \"price\": 25,\n    \"tags\": [],\n    \"image\": \"images/concessions/Black Licorice.png\"\n  },\n  {\n    \"id\": \"star-cookie\",\n    \"name\": \"Star Cookie\",\n    \"price\": 150,\n    \"tags\": [\"sweet\"],\n    \"image\": \"images/concessions/Star Cookie.png\"\n  },\n  {\n    \"id\": \"jawbreaker\",\n    \"name\": \"Jawbreaker\",\n    \"price\": 250,\n    \"tags\": [\"sweet\", \"candy\"],\n    \"image\": \"images/concessions/Jawbreaker.png\"\n  },\n  {\n    \"id\": \"salted-peanuts\",\n    \"name\": \"Salted Peanuts\",\n    \"price\": 120,\n    \"tags\": [\"salty\"],\n    \"image\": \"images/concessions/Salted Peanuts.png\"\n  },\n  {\n    \"id\": \"hummus-snack-pack\",\n    \"name\": \"Hummus Snack Pack\",\n    \"price\": 90,\n    \"tags\": [\"healthy\"],\n    \"image\": \"images/concessions/Hummus Snack Pack.png\"\n  },\n  {\n    \"id\": \"kale-smoothie\",\n    \"name\": \"Kale Smoothie\",\n    \"price\": 120,\n    \"tags\": [\"drink\", \"healthy\"],\n    \"image\": \"images/concessions/Kale Smoothie.png\"\n  },\n  {\n    \"id\": \"apple-slices\",\n    \"name\": \"Apple Slices\",\n    \"price\": 100,\n    \"tags\": [\"sweet\", \"healthy\"],\n    \"image\": \"images/concessions/Apple Slices.png\"\n  },\n  {\n    \"id\": \"panzanella-salad\",\n    \"name\": \"Panzanella Salad\",\n    \"price\": 200,\n    \"tags\": [\"gourmet\", \"healthy\"],\n    \"image\": \"images/concessions/Panzanella Salad.png\"\n  },\n  {\n    \"id\": \"truffle-popcorn\",\n    \"name\": \"Truffle Popcorn\",\n    \"price\": 180,\n    \"tags\": [\"gourmet\", \"salty\"],\n    \"image\": \"images/concessions/Truffle Popcorn.png\"\n  },\n  {\n    \"id\": \"cappuccino-mousse-cake\",\n    \"name\": \"Cappuccino Mousse Cake\",\n    \"price\": 220,\n    \"tags\": [\"sweet\", \"gourmet\"],\n    \"image\": \"images/concessions/Cappuccino Mousse Cake.png\"\n  },\n  {\n    \"id\": \"joja-corn\",\n    \"name\": \"JojaCorn\",\n    \"price\": 10,\n    \"tags\": [\"joja\"],\n    \"image\": \"images/concessions/JojaCorn.png\"\n  },\n  {\n    \"id\": \"stardrop-sorbet\",\n    \"name\": \"Stardrop Sorbet\",\n    \"price\": 1250,\n    \"tags\": [\"sweet\", \"gourmet\"],\n    \"image\": \"images/concessions/Stardrop Sorbet.png\"\n  },\n  {\n    \"id\": \"rock-candy\",\n    \"name\": \"Rock Candy\",\n    \"price\": 90,\n    \"tags\": [\"sweet\", \"candy\"],\n    \"image\": \"images/concessions/Rock Candy.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport concessionsData from '@/data/concessions.json';\nimport { Concession, ConcessionTag } from '@/types';\n\nconst allConcessions: Concession[] = concessionsData as Concession[];\n\n/** Query builder for Movie Theater concession stand data. All filter and sort methods return a new ConcessionQuery for chaining. */\nexport class ConcessionQuery extends QueryBase<Concession> {\n  constructor(data: Concession[] = allConcessions) {\n    super(data);\n  }\n\n  /** Filter to items that include the given tag. */\n  byTag(tag: ConcessionTag): ConcessionQuery {\n    return new ConcessionQuery(this.data.filter((item) => item.tags.includes(tag)));\n  }\n\n  /** Sort by price ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): ConcessionQuery {\n    return new ConcessionQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.price - b.price : b.price - a.price)),\n    );\n  }\n\n  /** Sort alphabetically by name. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): ConcessionQuery {\n    return new ConcessionQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a ConcessionQuery for all Movie Theater concession stand items. Pass `source` to wrap a pre-filtered array. */\nexport function concessions(source: Concession[] = allConcessions): ConcessionQuery {\n  return new ConcessionQuery(source);\n}\n","{\n  \"upgrades\": [\n    {\n      \"id\": \"starting-farmhouse\",\n      \"name\": \"Starting Farmhouse\",\n      \"tier\": 1,\n      \"cost\": 0,\n      \"materials\": [],\n      \"description\": \"The initial farmhouse. One room with a bed. No kitchen.\",\n      \"image\": \"images/buildings/house/House (tier 1).png\",\n      \"prerequisite\": null\n    },\n    {\n      \"id\": \"upgrade-1\",\n      \"name\": \"Farmhouse Upgrade 1\",\n      \"tier\": 2,\n      \"cost\": 10000,\n      \"materials\": [{ \"item\": \"Wood\", \"quantity\": 450 }],\n      \"description\": \"Adds a kitchen with a cooking counter and refrigerator, enabling cooking. The bedroom is separated and the bed is upgraded to a double, enabling marriage.\",\n      \"image\": \"images/buildings/house/House (tier 2).png\",\n      \"prerequisite\": \"starting-farmhouse\"\n    },\n    {\n      \"id\": \"upgrade-2\",\n      \"name\": \"Farmhouse Upgrade 2\",\n      \"tier\": 3,\n      \"cost\": 65000,\n      \"materials\": [{ \"item\": \"Hardwood\", \"quantity\": 100 }],\n      \"description\": \"Adds two new rooms (one empty, one with a crib and child beds) and a larger layout. Unlocks house renovations and house painting from Robin.\",\n      \"image\": \"images/buildings/house/House (tier 3).png\",\n      \"prerequisite\": \"upgrade-1\"\n    },\n    {\n      \"id\": \"cellar\",\n      \"name\": \"Cellar\",\n      \"tier\": 4,\n      \"cost\": 100000,\n      \"materials\": [],\n      \"description\": \"Adds a cellar accessible via the kitchen. Contains casks for aging Cheese and Wine to higher quality.\",\n      \"image\": \"images/buildings/house/indoor-images/Cellar Inside.png\",\n      \"prerequisite\": \"upgrade-2\"\n    }\n  ],\n  \"renovations\": [\n    {\n      \"id\": \"remove-crib\",\n      \"name\": \"Remove Crib\",\n      \"cost\": 0,\n      \"description\": \"Removes the crib from the children's room, preventing any additional children.\",\n      \"image\": \"images/buildings/house/renovations/Removed crib.png\",\n      \"prerequisite\": null\n    },\n    {\n      \"id\": \"open-bedroom\",\n      \"name\": \"Open Bedroom\",\n      \"cost\": 10000,\n      \"description\": \"Opens up the bedroom by removing the wall between it and the main room.\",\n      \"image\": \"images/buildings/house/renovations/Opened bedroom.png\",\n      \"prerequisite\": null\n    },\n    {\n      \"id\": \"add-southern-room\",\n      \"name\": \"Add Southern Room\",\n      \"cost\": 30000,\n      \"description\": \"Adds a new room to the south side of the farmhouse.\",\n      \"image\": \"images/buildings/house/renovations/Add southern room.png\",\n      \"prerequisite\": null\n    },\n    {\n      \"id\": \"add-corner-room\",\n      \"name\": \"Add Corner Room\",\n      \"cost\": 20000,\n      \"description\": \"Adds a corner room addition to the farmhouse.\",\n      \"image\": \"images/buildings/house/renovations/Add corner room.png\",\n      \"prerequisite\": null\n    },\n    {\n      \"id\": \"expand-corner-room\",\n      \"name\": \"Expand Corner Room\",\n      \"cost\": 100000,\n      \"description\": \"Expands the corner room into a larger space.\",\n      \"image\": \"images/buildings/house/renovations/Expand corner room.png\",\n      \"prerequisite\": \"add-corner-room\"\n    },\n    {\n      \"id\": \"add-attic\",\n      \"name\": \"Add Attic\",\n      \"cost\": 60000,\n      \"description\": \"Adds an attic space above the farmhouse.\",\n      \"image\": \"images/buildings/house/renovations/Farmhouse with Attic.png\",\n      \"prerequisite\": null\n    },\n    {\n      \"id\": \"cubby\",\n      \"name\": \"Cubby\",\n      \"cost\": 10000,\n      \"description\": \"Adds a small cubby space to the farmhouse.\",\n      \"image\": \"images/buildings/house/renovations/Farmhouse with Cubby.png\",\n      \"prerequisite\": null\n    },\n    {\n      \"id\": \"dining-room\",\n      \"name\": \"Dining Room\",\n      \"cost\": 150000,\n      \"description\": \"Adds a formal dining room to the farmhouse.\",\n      \"image\": \"images/buildings/house/renovations/Dining room.png\",\n      \"prerequisite\": null\n    },\n    {\n      \"id\": \"open-dining-room\",\n      \"name\": \"Open Dining Room\",\n      \"cost\": 10000,\n      \"description\": \"Opens up the dining room by removing the wall between it and the adjacent area.\",\n      \"image\": \"images/buildings/house/renovations/Open dining room.png\",\n      \"prerequisite\": null\n    }\n  ]\n}\n","import { QueryBase } from '@/common/query-base';\nimport farmhouseData from '@/data/farmhouse.json';\nimport { HouseRenovation, HouseUpgrade } from '@/types';\n\nconst allUpgrades: HouseUpgrade[] = farmhouseData.upgrades as HouseUpgrade[];\nconst allRenovations: HouseRenovation[] = farmhouseData.renovations as HouseRenovation[];\n\n/** Query builder for farmhouse upgrade data. Upgrades are sequential (tier 1–4). All filter and sort methods return a new HouseUpgradeQuery for chaining. */\nexport class HouseUpgradeQuery extends QueryBase<HouseUpgrade> {\n  constructor(data: HouseUpgrade[] = allUpgrades) {\n    super(data);\n  }\n\n  /** Filter to upgrades at the given tier. */\n  byTier(tier: number): HouseUpgradeQuery {\n    return new HouseUpgradeQuery(this.data.filter((u) => u.tier === tier));\n  }\n\n  /** Sort by tier ascending or descending. */\n  sortByTier(order: 'asc' | 'desc' = 'asc'): HouseUpgradeQuery {\n    return new HouseUpgradeQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.tier - b.tier : b.tier - a.tier)),\n    );\n  }\n}\n\n/** Query builder for farmhouse renovation data. Renovations are available after Upgrade 2 and are completed instantly. All filter and sort methods return a new HouseRenovationQuery for chaining. */\nexport class HouseRenovationQuery extends QueryBase<HouseRenovation> {\n  constructor(data: HouseRenovation[] = allRenovations) {\n    super(data);\n  }\n\n  /** Filter to free renovations (cost === 0). */\n  free(): HouseRenovationQuery {\n    return new HouseRenovationQuery(this.data.filter((r) => r.cost === 0));\n  }\n\n  /** Filter to renovations that require another renovation to be completed first. */\n  withPrerequisite(): HouseRenovationQuery {\n    return new HouseRenovationQuery(this.data.filter((r) => r.prerequisite !== null));\n  }\n\n  /** Sort by cost ascending or descending. */\n  sortByPrice(order: 'asc' | 'desc' = 'asc'): HouseRenovationQuery {\n    return new HouseRenovationQuery(\n      [...this.data].sort((a, b) => (order === 'asc' ? a.cost - b.cost : b.cost - a.cost)),\n    );\n  }\n\n  /** Sort alphabetically by name. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): HouseRenovationQuery {\n    return new HouseRenovationQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a HouseUpgradeQuery for all farmhouse upgrade tiers. Pass `source` to wrap a pre-filtered array. */\nexport function houseUpgrades(source: HouseUpgrade[] = allUpgrades): HouseUpgradeQuery {\n  return new HouseUpgradeQuery(source);\n}\n\n/** Returns a HouseRenovationQuery for all farmhouse renovations. Pass `source` to wrap a pre-filtered array. */\nexport function houseRenovations(source: HouseRenovation[] = allRenovations): HouseRenovationQuery {\n  return new HouseRenovationQuery(source);\n}\n","[\n  {\n    \"id\": \"1\",\n    \"name\": \"Secret Note #1\",\n    \"type\": \"secret-note\",\n    \"description\": \"It's a page from Abigail's Diary 'Things I love: the smell of carved pumpkin, keeping an amethyst under my pillow, chocolate cake, the thrill of spicy eel, and the comfort of Mom's blackberry cobbler (I like to eat!)'\"\n  },\n  {\n    \"id\": \"2\",\n    \"name\": \"Secret Note #2\",\n    \"type\": \"secret-note\",\n    \"description\": \"It's Sam's holiday shopping list Everyone's favorites Sebastian: Frozen Tear, Sashimi Penny: Emerald, Poppy Vincent: Grape, Cranberry Candy Mom: Crispy Bass, Pancakes Dad: Risotto, Roasted Hazelnuts Me: Cactus, Maple Bar, Pizza\"\n  },\n  {\n    \"id\": \"3\",\n    \"name\": \"Secret Note #3\",\n    \"type\": \"secret-note\",\n    \"description\": \"It's written in Leah's handwriting My idea of a perfect dinner would be salad, goat cheese, truffle, and wine. For dessert I'd need a poppyseed muffin. Yum! If someone gave me one of those things, I'd melt.\"\n  },\n  {\n    \"id\": \"4\",\n    \"name\": \"Secret Note #4\",\n    \"type\": \"secret-note\",\n    \"description\": \"It's a note of Maru's Parts still needed for my greatest invention yet! *Gold Bar *Iridium Bar *Battery Pack *Diamond *Strawberries\"\n  },\n  {\n    \"id\": \"5\",\n    \"name\": \"Secret Note #5\",\n    \"type\": \"secret-note\",\n    \"description\": \"It's Penny's handwriting: I want to get everyone something they love! Mom: Parsnip, Glazed Yams, NO BEER! Jas: Fairy Rose, Plum Pudding Vincent: Pink Cake, Grape Mr. Mullner: Leek, Fried Mushroom Granny Mullner: Beet, Tulip\"\n  },\n  {\n    \"id\": \"6\",\n    \"name\": \"Secret Note #6\",\n    \"type\": \"secret-note\",\n    \"description\": \"Stardrop Saloon Special Orders Mayor Lewis: Autumn's Bounty (Double order of high-fiber bread on the side) Marnie: Pumpkin Pie (extra whipped cream!) Demetrius: Bean Hotpot (Make it spicy) Caroline: Fish Taco (she wants triple the sauce! Better throw in a few extra napkins...)\"\n  },\n  {\n    \"id\": \"7\",\n    \"name\": \"Secret Note #7\",\n    \"type\": \"secret-note\",\n    \"description\": \"It's a page from someone's diary... ...There are only a few 'older' bachelors in town, and none of them are perfect! Harvey is really anxious and weak, but I know he would make a loyal and devoted husband. He likes coffee and pickles. Elliott is a bit foppish and melodramatic, but he does have a nice chin. He likes crab cakes and pomegranates. Shane is messy and anti-social. But I think his gruff exterior is a defense mechanism, insulating his softness from the world. He likes Beer, Pizza, and Pepper Poppers.\"\n  },\n  {\n    \"id\": \"8\",\n    \"name\": \"Secret Note #8\",\n    \"type\": \"secret-note\",\n    \"description\": \"To Haley and Emily Hope you two are doing well! We've sent you your favorite gifts: Pink Cake and Sunflowers for Haley, Gemstones and Wool for Emily! -Love Mom and Dad\"\n  },\n  {\n    \"id\": \"9\",\n    \"name\": \"Secret Note #9\",\n    \"type\": \"secret-note\",\n    \"description\": \"Alex's Strength Training Diet: *Complete Breakfast *Salmon Dinner (I've learned to love this food... I can feel the protein!!)\"\n  },\n  {\n    \"id\": \"10\",\n    \"name\": \"Secret Note #10\",\n    \"type\": \"secret-note\",\n    \"description\": \"Someone is waiting for you on level 100 in the skull cavern...\"\n  },\n  {\n    \"id\": \"11\",\n    \"name\": \"Secret Note #11\",\n    \"type\": \"secret-note\",\n    \"description\": \"An image-only note depicting a crow standing on a doormat in front of a house.\"\n  },\n  {\n    \"id\": \"12\",\n    \"name\": \"Secret Note #12\",\n    \"type\": \"secret-note\",\n    \"description\": \"I've found some good things by looking in the garbage cans, on lucky days. Sometimes you'll find the 'dish of the day' behind the saloon... usually fresh! For dessert, I'll check the Mullners' can for cookies. For treasures, check the cans by the blacksmith and museum.\"\n  },\n  {\n    \"id\": \"13\",\n    \"name\": \"Secret Note #13\",\n    \"type\": \"secret-note\",\n    \"description\": \"12 o'clock noon SHARP. Last day of the season. Check the bush above the playground.\"\n  },\n  {\n    \"id\": \"14\",\n    \"name\": \"Secret Note #14\",\n    \"type\": \"secret-note\",\n    \"description\": \"I hid something behind the community center.\"\n  },\n  {\n    \"id\": \"15\",\n    \"name\": \"Secret Note #15\",\n    \"type\": \"secret-note\",\n    \"description\": \"Mermaid Show: 1-5-4-2-3\"\n  },\n  {\n    \"id\": \"16\",\n    \"name\": \"Secret Note #16\",\n    \"type\": \"secret-note\",\n    \"description\": \"An image-only note showing a series of fishing illustrations.\"\n  },\n  {\n    \"id\": \"17\",\n    \"name\": \"Secret Note #17\",\n    \"type\": \"secret-note\",\n    \"description\": \"An image-only note showing crop growth stages.\"\n  },\n  {\n    \"id\": \"18\",\n    \"name\": \"Secret Note #18\",\n    \"type\": \"secret-note\",\n    \"description\": \"An image-only note showing a mining sequence.\"\n  },\n  {\n    \"id\": \"19\",\n    \"name\": \"Secret Note #19\",\n    \"type\": \"secret-note\",\n    \"description\": \"An image-only note depicting a puzzle scene.\"\n  },\n  {\n    \"id\": \"20\",\n    \"name\": \"Secret Note #20\",\n    \"type\": \"secret-note\",\n    \"description\": \"An image-only note depicting a puzzle scene.\"\n  },\n  {\n    \"id\": \"21\",\n    \"name\": \"Secret Note #21\",\n    \"type\": \"secret-note\",\n    \"description\": \"An image-only note depicting a puzzle scene.\"\n  },\n  {\n    \"id\": \"22\",\n    \"name\": \"Secret Note #22\",\n    \"type\": \"secret-note\",\n    \"description\": \"Greetings, farmer... Have you found my 'secret' in the dark tunnel? I look forward to meeting you! -Qi\"\n  },\n  {\n    \"id\": \"23\",\n    \"name\": \"Secret Note #23\",\n    \"type\": \"secret-note\",\n    \"description\": \"If yoo can reed dis... come to seecrit wuds. Pleez bring may-pal serrup.\"\n  },\n  {\n    \"id\": \"24\",\n    \"name\": \"Secret Note #24\",\n    \"type\": \"secret-note\",\n    \"description\": \"It's a page from M. Jasper's book: ...the creatures, known by some as \\\"Forest Spirits\\\" or \\\"Junimos\\\", are said to appear in abandoned buildings after they've \\\"gone to seed\\\". As a general rule... when humans leave, and nature begins to reclaim her territory, the Junimos will undoubtedly appear. Folk wisdom holds that the Junimos display some kind of resonant affinity with gemstones that are placed inside their little huts... Also, it's said that raisins are their favorite food, but they are too shy to take them directly from the hand. Of course, all these claims come from dubious, unverified sources... As far as I know, even the mere existence of these creatures has never been proven!\"\n  },\n  {\n    \"id\": \"25\",\n    \"name\": \"Secret Note #25\",\n    \"type\": \"secret-note\",\n    \"description\": \"I 'borrowed' a necklace from Mom, but lost it somewhere near the bath house... She's going to freak out if she notices it's missing!\"\n  },\n  {\n    \"id\": \"26\",\n    \"name\": \"Secret Note #26\",\n    \"type\": \"secret-note\",\n    \"description\": \"Ancient Farming Secrets, line 37: There's no better helper than a raisin-fed Junimo...\"\n  },\n  {\n    \"id\": \"27\",\n    \"name\": \"Secret Note #27\",\n    \"type\": \"secret-note\",\n    \"description\": \"My dear grandchild, By the time you find this note, I expect you'll have been living in the valley for quite some time. I hope things are going well! I'm honored that you're continuing the family tradition of farming, and through that noble endeavor, bringing greater life and abundance to all of Stardew Valley... a place very dear to my heart. Keep up the good work! -Grandpa P.S. ...I've hidden a very special secret for you somewhere in the valley. You might think of it as a compendium of my greatest discoveries. Someday, when you're ready, you'll find it.\"\n  },\n  {\n    \"id\": \"1001\",\n    \"name\": \"Journal Scrap #1\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"Day 1 ...My ship is lost... Shattered by a tempest in the unforgiving sea. I find myself stranded now, on these strange shores. My crew has perished, but I still live. Perhaps lady luck has blessed these wicked bones of mine... Or has her own designs for my fate... At any rate, I've no choice but to make a life for myself here. There's fresh water in abundance, food to forage, and fertile soil to work. First I'll build a shelter... (There are some pages missing)\"\n  },\n  {\n    \"id\": \"1002\",\n    \"name\": \"Journal Scrap #2\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"Day 6 I won't go hungry here... the waters are full of edible (nay, delicious!) fish. I even caught a stingray in the caves by the southeast shore. I haven't a clue what to do with it, though! The other day, I even fished up a couple of golden walnuts. They seem to be all over the island. The local parrots go crazy for them!\"\n  },\n  {\n    \"id\": \"1003\",\n    \"name\": \"Journal Scrap #3\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"Day 14 After half a month on this island, I've learned a thing or two about finding these golden nuts. One must keep their eyes peeled for subtle clues. If something looks unusual, there may be a hidden nut nearby. I've noticed signs in the sand... and signs in the leaves... I even saw a nut up in a tree near the volcano. If only I had a way of shooting it down... Whenever I've spotted a nut plant, I've always found a way to reach it.\"\n  },\n  {\n    \"id\": \"1004\",\n    \"name\": \"Journal Scrap #4\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"An image-only journal scrap showing a map of the island.\"\n  },\n  {\n    \"id\": \"1005\",\n    \"name\": \"Journal Scrap #5\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"Day 23 The local volcano holds many secrets. I've seen little men with glowing eyes, skittering about in the dark... like cats in the night. (Could these be the fabled dwarf-men, mentioned by M. Jasper in his 'Famous Journeys'?) Strange machines, too. Uncanny... not like anything known to man. At the top, I found a passage to the caldera of the volcano. And, half submerged in the bubbling lava, a peculiar machine... a kind of \\\"forge\\\". I'll investigate further tomorrow.\"\n  },\n  {\n    \"id\": \"1006\",\n    \"name\": \"Journal Scrap #6\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"An image-only journal scrap showing a map of the island.\"\n  },\n  {\n    \"id\": \"1007\",\n    \"name\": \"Journal Scrap #7\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"--Forging Table-- Topaz -- Defense Emerald -- Speed Jade -- Critical Strike Power Aquamarine -- Critical Strike Chance Amethyst -- Knockback Ruby -- Damage Prismatic Shard -- Enchantment Note: Weapons can be forged up to 3 times with gems, and can also be enchanted once with a prismatic shard. Note 2: 'Innate Enchantments', (meaning those powers that sometimes appear on weapons when you first acquire them), can also be added or re-discovered using a Dragon Tooth. It's theorized that this cannot be done to weapons above a certain caliber. Tools can only be enchanted, not forged.\"\n  },\n  {\n    \"id\": \"1008\",\n    \"name\": \"Journal Scrap #8\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"--Weapon Enchantments-- Artful: Allows you to do \\\"special moves\\\" more rapidly Bug Killer: Do more damage to bugs. Vampiric: Occasionally siphon health from a monster. Crusader: Do more damage to \\\"unholy\\\" monsters. Haymaker: When cutting weeds, you get more fiber, and also a chance to collect hay. --Tool Enchantments-- Powerful: Do more tool damage to stones, trees, and the like. Reaching: Increases your charge-up capacity, for a greater area of effect. Shaving: Chance to peel off additional wood when chopping. Bottomless: Watering can will never run dry. Generous: Dig up more from beneath the earth. Archaeologist: Greater chance to find artifacts and bones. Efficient: Takes no energy to use. Swift: Swing the tool faster. Master: Increases fishing level. Auto-Hook: Automatically hooks fish when they bite. Preserving: Bait and tackle have a 50% chance to not be consumed.\"\n  },\n  {\n    \"id\": \"1009\",\n    \"name\": \"Journal Scrap #9\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"'Twas a rain drenched day, and upon a lonely rock a beautiful maiden saw I Tales I'd heard of sea-born maidens singing siren's songs, Yet nary a note could she muster... The next morning I spied an arrangement of stone upon the foamy bank... ----------------- Aye... stones as big as 'ones' and stones as big as 'fives' were they... ----------------- If but this harried sea dog a tune could howl, perhaps to Blackgull's treasure would she lead...\"\n  },\n  {\n    \"id\": \"1010\",\n    \"name\": \"Journal Scrap #10\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"An image-only journal scrap showing a stone arrangement puzzle.\"\n  },\n  {\n    \"id\": \"1011\",\n    \"name\": \"Journal Scrap #11\",\n    \"type\": \"journal-scrap\",\n    \"description\": \"Day 37 When I was a boy of ten years old, my father gave me a glow ring and a magnet ring. They've never left my fingers since. However, when I was standing on top of the volcano... a strange idea came over me. I took my two rings, and cast them into the forge. Lo and behold! They combined into one! Now I've got one glowing magnet ring... I hope old pappy doesn't mind, rest his soul...\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport secretNotesData from '@/data/secret-notes.json';\nimport { SecretNote, SecretNoteType } from '@/types';\n\nconst allSecretNotes: SecretNote[] = secretNotesData as SecretNote[];\n\n/** Query builder for secret note and journal scrap data. All filter and sort methods return a new SecretNoteQuery for chaining. */\nexport class SecretNoteQuery extends QueryBase<SecretNote> {\n  constructor(data: SecretNote[] = allSecretNotes) {\n    super(data);\n  }\n\n  /** Filter to notes of the given type. */\n  byType(type: SecretNoteType): SecretNoteQuery {\n    return new SecretNoteQuery(this.data.filter((n) => n.type === type));\n  }\n\n  /** Filter to Secret Notes only (found in The Valley). */\n  notes(): SecretNoteQuery {\n    return this.byType('secret-note');\n  }\n\n  /** Filter to Journal Scraps only (found on Ginger Island). */\n  journalScraps(): SecretNoteQuery {\n    return this.byType('journal-scrap');\n  }\n}\n\n/** Returns a SecretNoteQuery for all secret notes and journal scraps. Pass `source` to wrap a pre-filtered array. */\nexport function secretNotes(source: SecretNote[] = allSecretNotes): SecretNoteQuery {\n  return new SecretNoteQuery(source);\n}\n","[\n  {\n    \"id\": \"basilisk-paw\",\n    \"name\": \"Basilisk Paw\",\n    \"effect\": \"You are immune to debuffs.\",\n    \"source\": \"combat-drop\",\n    \"forgeable\": false,\n    \"sellPrice\": 1000,\n    \"image\": \"images/trinkets/Basilisk Paw.png\"\n  },\n  {\n    \"id\": \"fairy-box\",\n    \"name\": \"Fairy Box\",\n    \"effect\": \"Summons a fairy companion that heals you in combat situations. Can be re-forged to change the fairy's level (1–5), which affects healing interval and power.\",\n    \"source\": \"combat-drop\",\n    \"forgeable\": true,\n    \"sellPrice\": 1000,\n    \"image\": \"images/trinkets/Fairy Box.png\"\n  },\n  {\n    \"id\": \"frog-egg\",\n    \"name\": \"Frog Egg\",\n    \"effect\": \"Summons a hungry frog companion that eats nearby enemies. Can be re-forged to change the frog's color (8 variants).\",\n    \"source\": \"combat-drop\",\n    \"forgeable\": true,\n    \"sellPrice\": 1000,\n    \"image\": \"images/trinkets/Frog Egg.png\"\n  },\n  {\n    \"id\": \"golden-spur\",\n    \"name\": \"Golden Spur\",\n    \"effect\": \"Critical strikes give you a speed boost. Can be re-forged to change the duration (5–10 seconds).\",\n    \"source\": \"combat-drop\",\n    \"forgeable\": true,\n    \"sellPrice\": 1000,\n    \"image\": \"images/trinkets/Golden Spur.png\"\n  },\n  {\n    \"id\": \"ice-rod\",\n    \"name\": \"Ice Rod\",\n    \"effect\": \"Shoots an orb of ice that freezes any enemies in its path. Deals no damage. Can be re-forged to change the fire rate and freeze duration.\",\n    \"source\": \"combat-drop\",\n    \"forgeable\": true,\n    \"sellPrice\": 1000,\n    \"image\": \"images/trinkets/Ice Rod.png\"\n  },\n  {\n    \"id\": \"magic-hair-gel\",\n    \"name\": \"Magic Hair Gel\",\n    \"effect\": \"Your hair shimmers with all the colors of a prismatic shard. Cosmetic only.\",\n    \"source\": \"desert-festival\",\n    \"forgeable\": false,\n    \"sellPrice\": 1000,\n    \"image\": \"images/trinkets/Magic Hair Gel.png\"\n  },\n  {\n    \"id\": \"magic-quiver\",\n    \"name\": \"Magic Quiver\",\n    \"effect\": \"Shoots a magic arrow at nearby enemies automatically. Can be re-forged to change the arrow type (Standard, Perfect, Rapid, or Heavy).\",\n    \"source\": \"combat-drop\",\n    \"forgeable\": true,\n    \"sellPrice\": 1000,\n    \"image\": \"images/trinkets/Magic Quiver.png\"\n  },\n  {\n    \"id\": \"parrot-egg\",\n    \"name\": \"Parrot Egg\",\n    \"effect\": \"Summons a parrot companion that grants a chance to find gold coins when slaying monsters. Can be re-forged to change the parrot's level (1–4), which affects the coin drop chance.\",\n    \"source\": \"combat-drop\",\n    \"forgeable\": true,\n    \"sellPrice\": 1000,\n    \"image\": \"images/trinkets/Parrot Egg.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport trinketData from '@/data/trinkets.json';\nimport { Trinket, TrinketSource } from '@/types';\n\nconst allTrinkets: Trinket[] = trinketData as Trinket[];\n\n/** Query builder for trinket data. All filter and sort methods return a new TrinketQuery for chaining. */\nexport class TrinketQuery extends QueryBase<Trinket> {\n  constructor(data: Trinket[] = allTrinkets) {\n    super(data);\n  }\n\n  /** Filter to trinkets from the given source. */\n  bySource(source: TrinketSource): TrinketQuery {\n    return new TrinketQuery(this.data.filter((t) => t.source === source));\n  }\n\n  /** Filter to trinkets that can be re-forged at the Forge. */\n  forgeable(): TrinketQuery {\n    return new TrinketQuery(this.data.filter((t) => t.forgeable));\n  }\n\n  /** Sort alphabetically by name. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): TrinketQuery {\n    return new TrinketQuery(\n      [...this.data].sort((a, b) => {\n        const cmp = a.name.localeCompare(b.name);\n        return order === 'asc' ? cmp : -cmp;\n      }),\n    );\n  }\n}\n\n/** Returns a TrinketQuery for all trinkets. Pass `source` to wrap a pre-filtered array. */\nexport function trinkets(source: Trinket[] = allTrinkets): TrinketQuery {\n  return new TrinketQuery(source);\n}\n","[\n  {\n    \"id\": \"1\",\n    \"name\": \"Tips on Farming\",\n    \"description\": \"Use fertilizer to improve quality, reduce workload, or hasten crop growth. Fruit trees take a whole season to grow, but they require very little maintenance. Keep the area directly around your new sapling clear, or else it may not grow properly. Crops will die as soon as the season ends, unless they grow in multiple seasons (e.g., Corn). Some crops, such as kale and wheat, need to be harvested with the scythe. ...This is a book by Marnie.\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"2\",\n    \"name\": \"Animals\",\n    \"description\": \"Animals are very sensitive. They like to be pet every day, and prefer to eat grass outdoors than dry hay. They don't like being outside in the rain, though. Happy animals produce higher quality products!\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"3\",\n    \"name\": \"On Foraging\",\n    \"description\": \"The local woods and mountains are great places to find wild produce! A good forager will clear out any weeds, stumps, or stones from these areas, so the wild produce has plenty of space to grow! Expert foragers know the secret to cultivating wild food so that it can be grown on the farm. Isn't that amazing?\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"4\",\n    \"name\": \"The Fisherman, Act I\",\n    \"description\": \"Tex: Gordy, how do you catch so many fish? For me, it takes forever! Gordy: You must take the choice to become a true fisherman... and over time your fishing speed will increase! Tex: So you're saying that improving my fishing skill will make me fish faster? Gordy: Correct. One day you may even learn the secret to creating your very own bobbers, improving your mastery even more. Now, begone!\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"5\",\n    \"name\": \"How Deep Do The Mines Go?\",\n    \"description\": \"This question has been pondered by many Stardew Valley explorers over the years... The truth is, no one really knows. Or at least, they aren't telling anyone. Unfortunately, many of those who venture deep into the mines never return... However, there have been a few bold adventurers who have traveled deep into the mines, and have resurfaced with interesting reports. Apparently, there are three distinct areas in the mine, each with unique monsters and treasures. Some adventurers speak of gigantic underground lakes and strange creatures... But none of these claims have been proven.\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"6\",\n    \"name\": \"An Old Farmer's Journal\",\n    \"description\": \"I've been here for a year now, and I've started to make friends with the local townspeople. It sure feels great! And they're sending me gifts and secret family recipes in the mail, too! That's really helpful.\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"7\",\n    \"name\": \"Scarecrows\",\n    \"description\": \"Once you start growing a lot of crops on your farm, you can expect to be visited by crows. In the morning, you might discover that a crow has made breakfast out of your hard work! One way to prevent those bothersome crows from eating your crops is to set up scarecrows near your crops. Be aware that scarecrows have limited range, so you'll need multiple if your farm is large. Scarecrows keep track of how many crows they've diverted. You can use that to tell they're in a useful spot. 'Collectible Scarecrows' aren't just for looks! They work just the same as the regular model.\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"8\",\n    \"name\": \"The Secret of the Stardrop\",\n    \"description\": \"For thousands of years, people have been intrigued by the mysterious powers from the stardrop... but no one knows where they come from! Professor R. J. Kutler, a leading researcher on strange fruit, says this: \\\"We've discovered traces of genetic material on meteorites that closely resemble the Stardrop, but it's not a proven match\\\". Regardless of where they come from, the peculiar fruit is said to be uncommonly delicious... and some even claim they grant special power to those who eat them.\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"9\",\n    \"name\": \"Journey of the Prairie King\",\n    \"description\": \"-- The Smash Hit Video Game! Did you know? Anyone who beats 'Journey of the Prairie King' is automatically entered into a drawing for a special prize? Did you know? The developer has stated that the protagonist is based on a real-life character... A true cowboy hero from the prairie-island in the Gem Sea!\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"10\",\n    \"name\": \"A Study on Diamond Yields\",\n    \"description\": \"After years of research in the mines, I believe I've learned something about diamond frequency. My research involved only the stones that are scattered about the mines... The ones that are broken with a pickaxe. Mineral yields from other sources require more research. Diamonds seem to only form at mine level 50 or greater. At level 50, approximately 1 in 500 stones will be diamond-rich. After level 50, the frequency of diamond formation seems to increase by about .000016 per level. Quite a rare gem! -M. Jasper\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"11\",\n    \"name\": \"Brewmaster's Guide\",\n    \"description\": \"Ah... to brew! The rich smell of yeast wafting through a cedar loft... The floral overtones of freshly cut hops on a winter's eve... but I digress. You are probably more interested in the practical side of brewing... To brew, you will need a keg. I'll leave it up to you to devise blueprints for a keg. Kegs can be used to make several kinds of product. If vegetables are placed inside, the keg will produce juice. Juice takes the least amount of time to brew. If wheat is placed in the keg, it will produce beer. Beer takes a while to brew, but it is quite profitable. Placing hops in a keg will produced the beloved 'Pale Ale'. Place fruit in the keg to make wine. Wine takes the longest of all to make, but a wine made from the finest fruit is worth quite a bit! Be patient with your keg... you'll know it's finished when it's perfectly still. And only drink in moderation, or you'll surely regret it!\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"12\",\n    \"name\": \"Mysteries of the Dwarves\",\n    \"description\": \"The Dwarves call themselves 'Smoluanu'... which translates to 'sky people'. An odd name for a group that lives deep underground, isn't it? Another mystery of the dwarves is the advanced technology they supposedly possess. Evidence such as this had led me, despite the ridicule of my colleagues, to propose a new theory: I believe the dwarves are the remnants of a once advanced civilization whos interplanetary vehicle crashed on this planet long ago. I propose that this dwarvish spaceship bore down, deep underground... and over time, the dwarves became adapted to their new underground environment. My colleagues ask, 'Why didn't they come above ground and live on the surface?' ...Perhaps their old planet had a thicker atmosphere that protected them from stellar radiation, and they simply could not survive in our sunlight. That would explain why they only surface at night to take what they need from our houses... -M. Jasper\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"13\",\n    \"name\": \"Highlights From The Book of Yoba\",\n    \"description\": \"Before time there was only the endless golden light. The light called out to itself...'Yoba'. Yoba wanted more. Yoba swirled the golden light into a vortex. Yoba swirled and swirled until a hole formed in the eye of the vortex. From this hole sprung a seed. Yoba smoothed the golden light. Yoba smoothed and smoothed, and the light became soil. Into this soil, Yoba planted the seed. The seed sprouted, and behold! A vine sprung skyward, twisting and probing, casting a writhing shadow onto the golden void. After 11 days, the vine bore fruit. Yoba, with knowing wisdom, peeled the tough skin off the fruit and saw that the world was inside. And so that is how the world came to be.\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"14\",\n    \"name\": \"Marriage Guide for Farmers\",\n    \"description\": \"Before you ask someone to marry you, you'll have to date them for a while first (Ask someone to date you with a bouquet from Pierre's). When you're ready to pop the big question, you'll need to give them a 'Mermaid's Pendant'. Everyone knows what it means when you present them with one of those. It's rumored that on stormy days, the ghost of an old mariner appears in Stardew Valley, clutching just such a pendant. After the wedding ceremony, your partner will move in with you. Remember to treat your spouse well... They still like gifts even after marriage! (Paid for by Pierre)\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"15\",\n    \"name\": \"The Fisherman, Act II\",\n    \"description\": \"Tex: Gordy, tell me your best fisherman's story. Gordy: -deep sigh-... I've caught a lot of big fish in my time... And some that are very rare and difficult... But there was one that I struggled to catch for three days and three nights. Gordy: I call this fish... 'The Legend'. He was a huge beast... And the harder I tugged on the line, the harder he tugged back. I let my guard down for a moment and he snapped my boat in two. I've never fished since. Tex: Do you think anyone will ever catch him? Gordy: Hmm... If this person were a master at fishing, and caught all other rare fish first, and made sure they ate the correct kind of food... then maybe. Above all you've got to have respect for the water, son. Tex: ...son? Do you mean... you're... f...father? Gordy: Yes, my boy. --Dramatic Music as the curtains fall--\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"16\",\n    \"name\": \"Technology Report!\",\n    \"description\": \"The blueprints for an advanced piece of machinery called a 'Crystalarium' have recently been published. This machine can grow crystals from almost nothing, providing their owners with endless supplies of valuable gems! Here's how it works: Place a gem of your choice inside the crystalarium... now be patient, it can take up to several days... but eventually the crystalarium will grow a copy of whatever you placed inside! You'll know it's ready when it stops wiggling. Once you remove your gem the crystalarium will start working on yet another clone... You'll never need to restock it unless you want to change the kind of gem it produces! Unfortunately, the crystalarium doesn't work with the extremely rare gemstone known as 'Prismatic Shard'... For some reason, the EMF from the shard interacts negatively with the crystalarium.\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"17\",\n    \"name\": \"Secrets of the Legendary Fish\",\n    \"description\": \"Fisherman speak of five rare and unique fish that can only be caught by skilled anglers. Once caught, they will never appear again. The Crimsonfish lives in the warm ocean waters of summer. It's been sighted on the far eastern side of the beach. The Glacierfish, which only appears in winter, can be caught off the southern tip of arrowhead island in Cindersap Forest... near where the river meets the ocean. The Anglerfish has been spotted in fall, north of town where the river flows down from the mountains. There's rumor of a strange, twisted fish that lives in the sewer. The final fish, of a species never before caught, is known simply as 'Legend'. It is rumored that he lives in a log submerged in the mountain lake, and only ventures out on rainy spring days to nibble at the frog's eggs. Only the most skilled fisherman can hope to catch this one. Train at fishing and be persistent, and eventually you will catch these elusive fish. Make sure to respect the water and don't remove too many fish from the ecosystem.\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"18\",\n    \"name\": \"Gunther's Tunnel Note\",\n    \"description\": \"...Saw something weird in the tunnel leading out from Pelican Town. There's a little door hidden in the dark. Couldn't get it open, though. -Gunther\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"19\",\n    \"name\": \"Note From Gunther\",\n    \"description\": \"Wow, this library has really become great, thanks to your help! Thanks a bunch!\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"20\",\n    \"name\": \"Goblins\",\n    \"description\": \"The species commonly known as \\\"Goblin\\\" seems to have originated in the forests of the far northeast, beyond the Bluemire Hills. Characterized by their green skin, bright red eyes, and foul smell, initial encounters with Goblins can be frightening for unexperienced travellers. Despite their unsettling appearance, Goblins possess an intellectual and emotional capacity akin to humans, and have no trouble learning our customs and languages. The goblins I've met have been rather friendly and amiable, once I've shown that I mean no harm. Unfortunately, centuries of distrust and ill-treatment from humans has led many Goblins to pursue careers in the employment of witches, warlocks, necromancers, and other unsavory types. A traditional Goblin diet consists of grub meat, typically from the large and juicy grub varieties native to the Goblin home-forest. On special occasions, Goblins will indulge in an item called 'void mayonnaise'... considered perhaps the finest delicacy in all Goblin cuisine. -M. Jasper\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  },\n  {\n    \"id\": \"21\",\n    \"name\": \"The Secret Book\",\n    \"description\": \"Solok Ulan Paa Eno Ra Coto Ulan Coto Ulan Mabo Bel Eno Ra Teba Omi Walo Nemo Dop Ulan Coto Kui Mabo Awa Yoba Omi Solok Awa Lon Omi Omi Nemo Solok Teba Ra Awa Nemo Gawa Eno Bel Ulan Nemo Teba Omi Yoba Bel Omi Xi\",\n    \"image\": \"images/lost-books/Lost Book.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport lostBooksData from '@/data/lost-books.json';\nimport { LostBook } from '@/types';\n\nconst allLostBooks: LostBook[] = lostBooksData as LostBook[];\n\n/** Query builder for Lost Books found in Stardew Valley. All filter and sort methods return a new LostBookQuery for chaining. */\nexport class LostBookQuery extends QueryBase<LostBook> {\n  constructor(data: LostBook[] = allLostBooks) {\n    super(data);\n  }\n}\n\n/** Returns a LostBookQuery for all Lost Books. Pass `source` to wrap a pre-filtered array. */\nexport function lostBooks(source: LostBook[] = allLostBooks): LostBookQuery {\n  return new LostBookQuery(source);\n}\n","[\n  {\n    \"id\": \"CF_Fair\",\n    \"name\": \"Fair Stardrop\",\n    \"description\": \"Purchased at the Stardew Valley Fair for 2,000 star tokens.\",\n    \"source\": \"purchase\",\n    \"image\": \"images/stardrops/Stardrop.png\"\n  },\n  {\n    \"id\": \"CF_Mines\",\n    \"name\": \"Mines Stardrop\",\n    \"description\": \"Found in the treasure chest on floor 100 of the Mines.\",\n    \"source\": \"exploration\",\n    \"image\": \"images/stardrops/Stardrop.png\"\n  },\n  {\n    \"id\": \"CF_Spouse\",\n    \"name\": \"Spouse Stardrop\",\n    \"description\": \"Given by the player's spouse or roommate when friendship reaches 12.5 hearts.\",\n    \"source\": \"friendship\",\n    \"image\": \"images/stardrops/Stardrop.png\"\n  },\n  {\n    \"id\": \"CF_Sewer\",\n    \"name\": \"Sewers Stardrop\",\n    \"description\": \"Purchased from Krobus in the Sewers for 20,000g.\",\n    \"source\": \"purchase\",\n    \"image\": \"images/stardrops/Stardrop.png\"\n  },\n  {\n    \"id\": \"CF_Statue\",\n    \"name\": \"Secret Woods Stardrop\",\n    \"description\": \"Received from Old Master Cannoli in the Secret Woods after giving him a Sweet Gem Berry.\",\n    \"source\": \"exploration\",\n    \"image\": \"images/stardrops/Stardrop.png\"\n  },\n  {\n    \"id\": \"CF_Fish\",\n    \"name\": \"Master Angler Stardrop\",\n    \"description\": \"Mailed by Willy after earning the Master Angler Achievement.\",\n    \"source\": \"achievement\",\n    \"image\": \"images/stardrops/Stardrop.png\"\n  },\n  {\n    \"id\": \"museumComplete\",\n    \"name\": \"Museum Stardrop\",\n    \"description\": \"Reward for donating all 95 items to the Museum.\",\n    \"source\": \"collection\",\n    \"image\": \"images/stardrops/Stardrop.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport starDropsData from '@/data/stardrops.json';\nimport { StarDrop, StarDropSource } from '@/types';\n\nconst allStarDrops: StarDrop[] = starDropsData as StarDrop[];\n\n/** Query builder for StarDrop data. All filter and sort methods return a new StarDropQuery for chaining. */\nexport class StarDropQuery extends QueryBase<StarDrop> {\n  constructor(data: StarDrop[] = allStarDrops) {\n    super(data);\n  }\n\n  /** Filter by acquisition source category. */\n  bySource(source: StarDropSource): StarDropQuery {\n    return new StarDropQuery(this.data.filter((s) => s.source === source));\n  }\n\n  /** Sort alphabetically by name. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): StarDropQuery {\n    const sorted = [...this.data].sort((a, b) => a.name.localeCompare(b.name));\n    return new StarDropQuery(order === 'desc' ? sorted.reverse() : sorted);\n  }\n}\n\n/** Returns a StarDropQuery for all StarDrops. Pass `source` to wrap a pre-filtered array. */\nexport function starDrops(source: StarDrop[] = allStarDrops): StarDropQuery {\n  return new StarDropQuery(source);\n}\n","[\n  {\n    \"id\": \"Bush_IslandEast_17_37\",\n    \"name\": \"Island Jungle Bush\",\n    \"amount\": 1,\n    \"location\": \"Island East\",\n    \"hint\": \"In open center area (17,37)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandShrine_23_34\",\n    \"name\": \"Island Jungle Shrine Bush\",\n    \"amount\": 1,\n    \"location\": \"Island East\",\n    \"hint\": \"Along Southern edge (23,34)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandSouth_31_5\",\n    \"name\": \"Island South Bush\",\n    \"amount\": 1,\n    \"location\": \"Island South\",\n    \"hint\": \"Accessed from hidden path East of stairs on Island North map (31,5)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandNorth_9_84\",\n    \"name\": \"Island North Bush\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Hidden clearing in trees West of stairs from dock area (9,84)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandNorth_20_26\",\n    \"name\": \"Island North Bush\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Hidden clearing in trees on West side in front of Volcano (20,26)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandNorth_56_27\",\n    \"name\": \"Island North Bush\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Behind coconut tree on East side in front of Volcano (56,27)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandNorth_4_42\",\n    \"name\": \"Island North Bush\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Grassy area above Dig Site (4,42)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandNorth_45_38\",\n    \"name\": \"Island North Bush\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Grassy area above Field Office (45,38)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandNorth_47_40\",\n    \"name\": \"Island North Bush\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Grassy area above Field Office (47,40)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandNorth_13_33\",\n    \"name\": \"Island North Bush\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Along river accessed via secret passage from Volcano entrance (13,33)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandNorth_5_30\",\n    \"name\": \"Island North Bush\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Along river accessed via secret passage from Volcano entrance (5,39)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_Caldera_28_36\",\n    \"name\": \"Volcano Caldera Bush\",\n    \"amount\": 1,\n    \"location\": \"Caldera\",\n    \"hint\": \"Along Southern edge (28,36)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_Caldera_9_34\",\n    \"name\": \"Volcano Caldera Bush\",\n    \"amount\": 1,\n    \"location\": \"Caldera\",\n    \"hint\": \"Along Southern edge (9,34)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_CaptainRoom_2_4\",\n    \"name\": \"Island West Shipwreck Bush\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Shipwreck is enterable from left side (2,4)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"TreeNut\",\n    \"name\": \"Tree in Leo's Hut\",\n    \"amount\": 1,\n    \"location\": \"Island East\",\n    \"hint\": \"Hit the tree with an axe\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandNorth_19_39\",\n    \"name\": \"Island North Buried\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"At top of stairs from Dig Site, marked by a circle of small rocks (19,39)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandNorth_19_13\",\n    \"name\": \"Island North Buried\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Cliff edge West of Volcano, marked by a circle of small rocks (19,13)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandNorth_57_79\",\n    \"name\": \"Island North Buried\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Sand patch within grass patch in SE corner, marked by a circle of small rocks (57,79)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandNorth_54_21\",\n    \"name\": \"Island North Buried\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Along Eastern edge of Volcano, between rocks and plants (54,21)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandNorth_42_77\",\n    \"name\": \"Island North Buried\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Dark grassy area just NE of stairs from dock, between tufts of long grass (42,77)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandNorth_62_54\",\n    \"name\": \"Island North Buried\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"NE corner of path between docks and Field Office, marked by slightly raised sand (62,54)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandNorth_26_81\",\n    \"name\": \"Island North Buried\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Beneath curved tree West of stairs from dock, marked by a circle of small rocks (26,81)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandLeftPlantRestored\",\n    \"name\": \"Field Office Plant Survey Reward\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Correct count is 22 plants\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandRightPlantRestored\",\n    \"name\": \"Field Office Starfish Survey Reward\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Correct count is 18 starfish\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandBatRestored\",\n    \"name\": \"Field Office Mummified Bat Reward\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Found by breaking non-ore rocks in the Volcano\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandFrogRestored\",\n    \"name\": \"Field Office Mummified Frog Reward\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Found by cutting weeds in Jungle\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandCenterSkeletonRestored\",\n    \"name\": \"Field Office Mammal Skeleton Reward\",\n    \"amount\": 6,\n    \"location\": \"Island North\",\n    \"hint\": \"Skull from Golden Coconuts; Spine from fishing Island North; Legs from fossil stones (high chance); Ribs from fossil stones (low chance); Tail from panning Island North\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandSnakeRestored\",\n    \"name\": \"Field Office Snake Skeleton Reward\",\n    \"amount\": 3,\n    \"location\": \"Island North\",\n    \"hint\": \"Skull from digging artifact spots Island North/West and fishing Island West; Vertebra from digging artifact spots Island West\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandWest_104_3\",\n    \"name\": \"Island West Bush\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"End of hidden path through dense trees in NE part of map (104,3)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandWest_31_24\",\n    \"name\": \"Island West Bush\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Behind Mahogany tree in Tiger Slime area (31,24)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandWest_38_56\",\n    \"name\": \"Island West Bush\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Behind palm tree near pond West of Birdie's hut (38,56)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandWest_75_29\",\n    \"name\": \"Island West Bush\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"In front of the trees above farmhouse (75,29)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandWest_64_30\",\n    \"name\": \"Island West Bush\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Elevated area on West side of river; follow path counter-clockwise from Tiger Slimes (64,30)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandWest_54_18\",\n    \"name\": \"Island West Bush\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Obscured by dense trees along path between Tiger Slimes and suspension bridge (54,18)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandWest_25_30\",\n    \"name\": \"Island West Bush\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Along wall SE of walnut door (25,30)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Bush_IslandWest_15_3\",\n    \"name\": \"Island West Bush\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Follow coastline N past walnut door (15,3)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandWest_21_81\",\n    \"name\": \"Island West Buried\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"In dark sand on SW coast, between circular indentations (21,81)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandWest_62_76\",\n    \"name\": \"Island West Buried\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Among debris pile S of farm, between blue starfish (62,76)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandWest_39_24\",\n    \"name\": \"Island West Buried\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"In Tiger Slime area, between tufts of long grass (39,24)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandWest_88_14\",\n    \"name\": \"Island West Buried\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"In grass in NE corner, between animated tiles (88,14)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandWest_43_74\",\n    \"name\": \"Island West Buried\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Near tidal pools between blue and yellow starfish, initially blocked by boulder (43,74)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandWest_30_75\",\n    \"name\": \"Island West Buried\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Between tidal pools, marked by X (30,75)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandWestCavePuzzle\",\n    \"name\": \"Island West Cave Puzzle\",\n    \"amount\": 3,\n    \"location\": \"Island West\",\n    \"hint\": \"Simon Says musical crystals in hidden cave N of suspension bridge\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"SandDuggy\",\n    \"name\": \"Island West Sand Duggy\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Can place items to block other holes\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"TreeNutShot\",\n    \"name\": \"Island North Palm Tree\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"Can use slingshot to knock walnut from tree\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Mermaid\",\n    \"name\": \"Island Cove Mermaid Puzzle\",\n    \"amount\": 5,\n    \"location\": \"Island Southeast\",\n    \"hint\": \"Use flute blocks to play Mermaid's song; stones provide tuning clues\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandSouthEastCave_36_26\",\n    \"name\": \"Island Cove Cave Buried\",\n    \"amount\": 1,\n    \"location\": \"Island Southeast\",\n    \"hint\": \"Among the barrels across from the dock (36,26)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"Buried_IslandSouthEast_25_17\",\n    \"name\": \"Island Cove Buried\",\n    \"amount\": 1,\n    \"location\": \"Island Southeast\",\n    \"hint\": \"NE of star pool, between yellow starfish (25,17)\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"StardropPool\",\n    \"name\": \"Island Cove Star Pool\",\n    \"amount\": 1,\n    \"location\": \"Island Southeast\",\n    \"hint\": \"Fish a walnut out of the pool\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"BananaShrine\",\n    \"name\": \"Island Jungle Banana Shrine Reward\",\n    \"amount\": 3,\n    \"location\": \"Island East\",\n    \"hint\": \"Place a banana on the shrine\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandGourmand1\",\n    \"name\": \"Island Farm Cave Gourmand Reward #1\",\n    \"amount\": 5,\n    \"location\": \"Island West\",\n    \"hint\": \"Grow some melons for the Gourmand\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandGourmand2\",\n    \"name\": \"Island Farm Cave Gourmand Reward #2\",\n    \"amount\": 5,\n    \"location\": \"Island West\",\n    \"hint\": \"Grow some wheat for the Gourmand\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandGourmand3\",\n    \"name\": \"Island Farm Cave Gourmand Reward #3\",\n    \"amount\": 5,\n    \"location\": \"Island West\",\n    \"hint\": \"Grow some garlic for the Gourmand\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"IslandShrinePuzzle\",\n    \"name\": \"Island Jungle Gem Shrine Reward\",\n    \"amount\": 5,\n    \"location\": \"Island East\",\n    \"hint\": \"Place gems (amethyst, aquamarine, emerald, ruby, topaz) dropped by birds on appropriate pedestals\",\n    \"trackingType\": \"all-at-once\"\n  },\n  {\n    \"id\": \"GoldenCoconut\",\n    \"name\": \"Break a Golden Coconut\",\n    \"amount\": 1,\n    \"location\": \"Ginger Island\",\n    \"hint\": \"Break open a Golden Coconut at Clint's\",\n    \"trackingType\": \"extra\"\n  },\n  {\n    \"id\": \"Birdie\",\n    \"name\": \"Birdie's Quest Reward\",\n    \"amount\": 5,\n    \"location\": \"Island West\",\n    \"hint\": \"Complete Birdie's quest chain\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"Darts\",\n    \"name\": \"Winning Darts Minigame\",\n    \"amount\": 3,\n    \"location\": \"Island Southeast\",\n    \"hint\": \"Win the Darts minigame in the pirate cove\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"TigerSlimeNut\",\n    \"name\": \"Killing Island West Tiger Slimes\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Dropped by Tiger Slimes\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"VolcanoNormalChest\",\n    \"name\": \"Looting Volcano Common Chests\",\n    \"amount\": 1,\n    \"location\": \"Volcano\",\n    \"hint\": \"Open common chests in the Volcano Dungeon\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"VolcanoRareChest\",\n    \"name\": \"Looting Volcano Rare Chests\",\n    \"amount\": 1,\n    \"location\": \"Volcano\",\n    \"hint\": \"Open rare chests in the Volcano Dungeon\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"VolcanoBarrel\",\n    \"name\": \"Breaking Volcano Barrels\",\n    \"amount\": 5,\n    \"location\": \"Volcano\",\n    \"hint\": \"Break barrels in the Volcano Dungeon\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"VolcanoMining\",\n    \"name\": \"Mining Stones in Volcano\",\n    \"amount\": 5,\n    \"location\": \"Volcano\",\n    \"hint\": \"Break rocks in the Volcano Dungeon\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"VolcanoMonsterDrop\",\n    \"name\": \"Killing Monsters in Volcano\",\n    \"amount\": 5,\n    \"location\": \"Volcano\",\n    \"hint\": \"Kill monsters in the Volcano Dungeon\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"IslandFarming\",\n    \"name\": \"Harvesting Crops on Island Farm\",\n    \"amount\": 5,\n    \"location\": \"Island West\",\n    \"hint\": \"Harvest crops grown on the Island Farm\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"MusselStone\",\n    \"name\": \"Breaking Shell Stones on Island Farm Beach\",\n    \"amount\": 5,\n    \"location\": \"Island West\",\n    \"hint\": \"Break mussel nodes on the beach South of the Island Farm\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"IslandFishing\",\n    \"name\": \"Fishing on the Island\",\n    \"amount\": 5,\n    \"location\": \"Ginger Island\",\n    \"hint\": \"Fish anywhere on Ginger Island\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"Island_N_BuriedTreasureNut\",\n    \"name\": \"Journal Scrap #10 Buried Treasure\",\n    \"amount\": 1,\n    \"location\": \"Island North\",\n    \"hint\": \"By curved tree just SW of Volcano entrance (27,28); must have read journal scrap\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"Island_W_BuriedTreasureNut\",\n    \"name\": \"Journal Scrap #4 Buried Treasure\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Between the bush clumps on beach N of Birdie's hut (18,42); must have read journal scrap\",\n    \"trackingType\": \"limited\"\n  },\n  {\n    \"id\": \"Island_W_BuriedTreasureNut2\",\n    \"name\": \"Journal Scrap #6 Buried Treasure\",\n    \"amount\": 1,\n    \"location\": \"Island West\",\n    \"hint\": \"Against wall on beach in SE corner of farm (104,74); must have read journal scrap\",\n    \"trackingType\": \"limited\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport goldenWalnutData from '@/data/golden-walnuts.json';\nimport { GoldenWalnut, GoldenWalnutTrackingType } from '@/types';\n\nconst allGoldenWalnuts: GoldenWalnut[] = goldenWalnutData as GoldenWalnut[];\n\n/** Query builder for Golden Walnut data. All filter and sort methods return a new GoldenWalnutQuery for chaining. */\nexport class GoldenWalnutQuery extends QueryBase<GoldenWalnut> {\n  constructor(data: GoldenWalnut[] = allGoldenWalnuts) {\n    super(data);\n  }\n\n  /** Filter by location (case-insensitive substring match). */\n  byLocation(location: string): GoldenWalnutQuery {\n    const q = location.toLowerCase();\n    return new GoldenWalnutQuery(this.data.filter((w) => w.location.toLowerCase().includes(q)));\n  }\n\n  /** Filter by tracking type. */\n  byTrackingType(type: GoldenWalnutTrackingType): GoldenWalnutQuery {\n    return new GoldenWalnutQuery(this.data.filter((w) => w.trackingType === type));\n  }\n\n  /** Sort alphabetically by location. */\n  sortByLocation(order: 'asc' | 'desc' = 'asc'): GoldenWalnutQuery {\n    const sorted = [...this.data].sort((a, b) => a.location.localeCompare(b.location));\n    return new GoldenWalnutQuery(order === 'desc' ? sorted.reverse() : sorted);\n  }\n\n  /** Sort by walnut amount. */\n  sortByAmount(order: 'asc' | 'desc' = 'desc'): GoldenWalnutQuery {\n    const sorted = [...this.data].sort((a, b) => a.amount - b.amount);\n    return new GoldenWalnutQuery(order === 'desc' ? sorted.reverse() : sorted);\n  }\n\n  /** Total number of walnuts across all entries in the current query. */\n  totalAmount(): number {\n    return this.data.reduce((sum, w) => sum + w.amount, 0);\n  }\n}\n\n/** Returns a GoldenWalnutQuery for all Golden Walnut data. Pass `source` to wrap a pre-filtered array. */\nexport function goldenWalnuts(source: GoldenWalnut[] = allGoldenWalnuts): GoldenWalnutQuery {\n  return new GoldenWalnutQuery(source);\n}\n","[\n  {\n    \"id\": \"Robin\",\n    \"name\": \"Robin's Project\",\n    \"requester\": \"Robin\",\n    \"type\": \"town\",\n    \"text\": \"I have an idea for a new style of bed. I just need some extra hardwood.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Collect 80 Hardwood\",\n    \"rewards\": \"2,000g; 250 Friendship points with Robin; cutscene at Robin's house; Deluxe Red Double Bed available\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Robin2\",\n    \"name\": \"Robin's Resource Rush\",\n    \"requester\": \"Robin\",\n    \"type\": \"town\",\n    \"text\": \"I'm putting on a little promotion, just for fun. Whoever brings me the most resources wins a prize.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Collect 1,000 of: Wood or Stone\",\n    \"rewards\": \"2,500g, Stone Chest recipe\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"Demetrius\",\n    \"name\": \"Aquatic Overpopulation\",\n    \"requester\": \"Demetrius\",\n    \"type\": \"town\",\n    \"text\": \"For unknown reasons, the local population of fish has grown to an unsustainable level. Can you help restore balance?\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Catch 10 seasonal fish\",\n    \"rewards\": \"Gold (fish sell value), Farm Computer recipe\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"Demetrius2\",\n    \"name\": \"Biome Balance\",\n    \"requester\": \"Demetrius\",\n    \"type\": \"town\",\n    \"text\": \"For unknown reasons, the local population of fish has grown to an unsustainable level. A broader variety is needed.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Catch 20 of: River Fish, Ocean Fish, or Lake Fish\",\n    \"rewards\": \"1,500g, Farm Computer recipe\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"Linus\",\n    \"name\": \"Community Cleanup\",\n    \"requester\": \"Linus\",\n    \"type\": \"town\",\n    \"text\": \"I have an idea. There's a lot of trash in the water around town. Want to help clean it up?\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Gather 20 trash items and dump them in the bin at the train platform\",\n    \"rewards\": \"500g; 250 Friendship points with Linus; Fiber Seeds recipe; cutscene at Mountain Lake\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Emily\",\n    \"name\": \"Rock Rejuvenation\",\n    \"requester\": \"Emily\",\n    \"type\": \"town\",\n    \"text\": \"I'm going to invite some friends over to do a rock rejuvenation ceremony. I need some special gems.\",\n    \"prerequisites\": \"Access to Sewing Machine in Emily's house\",\n    \"timeframe\": 7,\n    \"requirements\": \"Deliver 1 each of: Ruby, Topaz, Emerald, Jade, Amethyst\",\n    \"rewards\": \"1,000g; 250 Friendship points with Emily; Sewing Machine; ceremony cutscene\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Gunther\",\n    \"name\": \"Fragments of the Past\",\n    \"requester\": \"Gunther\",\n    \"type\": \"town\",\n    \"text\": \"Calling all amateur paleontologists! Bring any bone-related artifacts or items to the Museum.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Collect 100 bone items and deposit them in the Museum box\",\n    \"rewards\": \"3,500g, Bone Mill recipe\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Pam\",\n    \"name\": \"Pam Needs Juice\",\n    \"requester\": \"Pam\",\n    \"type\": \"town\",\n    \"text\": \"Heard there's a spirit made out of potatoes. Think you could bring me some potato juice?\",\n    \"prerequisites\": \"Spring season\",\n    \"timeframe\": 14,\n    \"requirements\": \"Place 12 Potato Juice in Pam's kitchen\",\n    \"rewards\": \"3,000g; 250 Friendship points with Pam; Potato Juice cutscene; F.I.B.S. TV channel\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Gus\",\n    \"name\": \"Gus' Famous Omelet\",\n    \"requester\": \"Gus\",\n    \"type\": \"town\",\n    \"text\": \"I've got the urge to make my famous giant omelet. I'll need a lot of eggs.\",\n    \"prerequisites\": null,\n    \"timeframe\": 14,\n    \"requirements\": \"Place 24 Eggs into Stardrop Saloon fridge\",\n    \"rewards\": \"3,000g; Mini-Fridge (first time); Giant Omelet cutscene (first time)\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"Pierre\",\n    \"name\": \"Pierre's Prime Produce\",\n    \"requester\": \"Pierre\",\n    \"type\": \"town\",\n    \"text\": \"For an upcoming promotion, I'm thinking of offering some high-quality vegetables.\",\n    \"prerequisites\": null,\n    \"timeframe\": 28,\n    \"requirements\": \"Dump 25 Gold-quality vegetables in the bin at General Store\",\n    \"rewards\": \"2,500g, cutscene at General Store, Mini-Shipping Bin by mail\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Lewis\",\n    \"name\": \"Crop Order\",\n    \"requester\": \"Lewis\",\n    \"type\": \"town\",\n    \"text\": \"Crops are in high demand this year. Ship a large batch of a seasonal crop.\",\n    \"prerequisites\": \"Not Winter season\",\n    \"timeframe\": 28,\n    \"requirements\": \"Ship 100 of a seasonal crop\",\n    \"rewards\": \"Gold (50% base quality crop price); Mini-Shipping Bin by mail (first time)\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"Willy\",\n    \"name\": \"Juicy Bugs Wanted!\",\n    \"requester\": \"Willy\",\n    \"type\": \"town\",\n    \"text\": \"I'm looking for a big wad o' bug guts to use as fishing bait.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Gather 100 Bug Meat and dump it in the bin next to the fish shop\",\n    \"rewards\": \"3,000g, Quality Bobber recipe, cutscene at The Beach\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Willy2\",\n    \"name\": \"Tropical Fish\",\n    \"requester\": \"Willy\",\n    \"type\": \"town\",\n    \"text\": \"There's nothin' like tropical fishing. I'd love some fresh catches from Ginger Island.\",\n    \"prerequisites\": \"Ginger Island unlocked; Island Resort built\",\n    \"timeframe\": 7,\n    \"requirements\": \"Catch 5 each of: Stingray, Blue Discus, Lionfish\",\n    \"rewards\": \"2,500g, Deluxe Fish Tank\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Wizard\",\n    \"name\": \"A Curious Substance\",\n    \"requester\": \"Wizard\",\n    \"type\": \"town\",\n    \"text\": \"I seek an extremely rare and powerful goop, known as ectoplasm. Bring it to me.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Collect 1 Ectoplasm\",\n    \"rewards\": \"2,500g, Mini-Obelisk recipe\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Wizard2\",\n    \"name\": \"Prismatic Jelly\",\n    \"requester\": \"Wizard\",\n    \"type\": \"town\",\n    \"text\": \"I require assistance in tracking down the rare and dangerous prismatic slime.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Collect 1 Prismatic Jelly\",\n    \"rewards\": \"5,000g, Monster Musk recipe\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"Caroline\",\n    \"name\": \"Island Ingredients\",\n    \"requester\": \"Caroline\",\n    \"type\": \"town\",\n    \"text\": \"I want to experiment with tropical cooking. Could you ship me some ingredients from Ginger Island?\",\n    \"prerequisites\": \"Ginger Island unlocked\",\n    \"timeframe\": 28,\n    \"requirements\": \"Ship 100 of: Taro Root, Ginger, or Pineapple\",\n    \"rewards\": \"Gold (50% base crop price), Solar Panel recipe\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"Clint\",\n    \"name\": \"Cave Patrol\",\n    \"requester\": \"Clint\",\n    \"type\": \"town\",\n    \"text\": \"The number of monsters in the local caves have made mining dangerous. Would you help thin out their numbers?\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Slay 50 of: Bats, Dust Sprites, Skeletons, or Grubs\",\n    \"rewards\": \"6,000g; Geode Crusher recipe (first time); Explosives and food by letter (subsequent times)\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"Evelyn\",\n    \"name\": \"Gifts for George\",\n    \"requester\": \"Evelyn\",\n    \"type\": \"town\",\n    \"text\": \"George thinks no one in town cares about him. Let's show him that isn't true.\",\n    \"prerequisites\": \"Spring season\",\n    \"timeframe\": 28,\n    \"requirements\": \"Collect and place 12 Leeks onto Evelyn's stove\",\n    \"rewards\": \"2,000g, Coffee Maker, cutscene at George's house\",\n    \"repeatable\": false\n  },\n  {\n    \"id\": \"QiChallenge2\",\n    \"name\": \"Qi's Crop\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"I've hidden Qi Beans throughout the world. Find them, grow them, propagate them, and ship the results.\",\n    \"prerequisites\": null,\n    \"timeframe\": 28,\n    \"requirements\": \"Ship 500 Qi Fruit using the Shipping Bin\",\n    \"rewards\": \"100 Qi Gems\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"QiChallenge3\",\n    \"name\": \"Let's Play A Game\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"Think you can score 50,000 points in Junimo Kart endless mode? Impress me.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Score 50,000 points in Junimo Kart endless mode\",\n    \"rewards\": \"20 Qi Gems\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"QiChallenge4\",\n    \"name\": \"Four Precious Stones\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"Find 4 prismatic shards. Place them in my collection box.\",\n    \"prerequisites\": null,\n    \"timeframe\": 28,\n    \"requirements\": \"Collect 4 Prismatic Shards (must be collected while quest is active)\",\n    \"rewards\": \"40 Qi Gems\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"QiChallenge5\",\n    \"name\": \"Skull Cavern Invasion\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"The Skull Cavern has been invaded by powerful monsters. Make it to floor 100.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Make it to floor 100 of the Skull Cavern (Staircases allowed)\",\n    \"rewards\": \"40 Qi Gems\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"QiChallenge6\",\n    \"name\": \"The Strong Stuff\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"Ship quality items worth a total of at least 100,000g.\",\n    \"prerequisites\": null,\n    \"timeframe\": 14,\n    \"requirements\": \"Ship items with quality stars worth a total of at least 100,000g\",\n    \"rewards\": \"25 Qi Gems\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"QiChallenge7\",\n    \"name\": \"Qi's Kindness\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"Give 50 loved gifts in one week.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Give 50 loved gifts to villagers within one week\",\n    \"rewards\": \"40 Qi Gems\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"QiChallenge8\",\n    \"name\": \"Extended Family\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"Family members of the legendary fish have returned to the valley. Catch them all.\",\n    \"prerequisites\": null,\n    \"timeframe\": 3,\n    \"requirements\": \"Catch Ms. Angler, Glacierfish Jr., Son of Crimsonfish, Radioactive Carp, and Legend II\",\n    \"rewards\": \"20 Qi Gems\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"QiChallenge9\",\n    \"name\": \"Danger In The Deep\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"The mine elevator system has been reset, and new dangers have emerged. Reach the bottom again.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Reach the bottom of the Mines (Staircases allowed); resets unlocked Adventurer's Guild gear\",\n    \"rewards\": \"50 Qi Gems\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"QiChallenge10\",\n    \"name\": \"Qi's Hungry Challenge\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"Your task is to make it to level 100 in the Skull Cavern without consuming any food or drink.\",\n    \"prerequisites\": null,\n    \"timeframe\": 7,\n    \"requirements\": \"Reach floor 100 of Skull Cavern without consuming food or drink (Staircases allowed)\",\n    \"rewards\": \"25 Qi Gems\",\n    \"repeatable\": true\n  },\n  {\n    \"id\": \"QiChallenge12\",\n    \"name\": \"Qi's Prismatic Grange\",\n    \"requester\": \"Qi\",\n    \"type\": \"qi\",\n    \"text\": \"Find 100 each of red, orange, yellow, green, blue, and purple items and place them in my collection box.\",\n    \"prerequisites\": null,\n    \"timeframe\": 14,\n    \"requirements\": \"Place 100 each of red, orange, yellow, green, blue, and purple items in Qi's collection box (600 items total)\",\n    \"rewards\": \"35 Qi Gems\",\n    \"repeatable\": true\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport specialOrderData from '@/data/special-orders.json';\nimport { SpecialOrderCategory, SpecialOrderData } from '@/types';\n\nconst allSpecialOrders: SpecialOrderData[] = specialOrderData as SpecialOrderData[];\n\n/** Query builder for Special Order data. All filter and sort methods return a new SpecialOrderQuery for chaining. */\nexport class SpecialOrderQuery extends QueryBase<SpecialOrderData> {\n  constructor(data: SpecialOrderData[] = allSpecialOrders) {\n    super(data);\n  }\n\n  /** Filter by order type (town or qi). */\n  byType(type: SpecialOrderCategory): SpecialOrderQuery {\n    return new SpecialOrderQuery(this.data.filter((o) => o.type === type));\n  }\n\n  /** Filter by requester NPC name (case-insensitive exact match). */\n  byRequester(requester: string): SpecialOrderQuery {\n    const q = requester.toLowerCase();\n    return new SpecialOrderQuery(this.data.filter((o) => o.requester.toLowerCase() === q));\n  }\n\n  /** Filter to repeatable special orders. */\n  repeatable(): SpecialOrderQuery {\n    return new SpecialOrderQuery(this.data.filter((o) => o.repeatable));\n  }\n\n  /** Sort alphabetically by name. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): SpecialOrderQuery {\n    const sorted = [...this.data].sort((a, b) => a.name.localeCompare(b.name));\n    return new SpecialOrderQuery(order === 'desc' ? sorted.reverse() : sorted);\n  }\n}\n\n/** Returns a SpecialOrderQuery for all Special Order data. Pass `source` to wrap a pre-filtered array. */\nexport function specialOrders(source: SpecialOrderData[] = allSpecialOrders): SpecialOrderQuery {\n  return new SpecialOrderQuery(source);\n}\n","[\n  { \"id\": \"20\", \"villager\": \"Alex\", \"hearts\": 2, \"description\": \"Alex on the beach.\" },\n  { \"id\": \"2481135\", \"villager\": \"Alex\", \"hearts\": 4, \"description\": \"Alex playing with Dusty.\" },\n  { \"id\": \"21\", \"villager\": \"Alex\", \"hearts\": 5, \"description\": \"Alex talks about his dreams.\" },\n  {\n    \"id\": \"2119820\",\n    \"villager\": \"Alex\",\n    \"hearts\": 6,\n    \"description\": \"Alex working out shirtless.\"\n  },\n  { \"id\": \"288847\", \"villager\": \"Alex\", \"hearts\": 8, \"description\": \"Alex crying on the beach.\" },\n  {\n    \"id\": \"911526\",\n    \"villager\": \"Alex\",\n    \"hearts\": 10,\n    \"description\": \"Dinner at the saloon with Alex.\"\n  },\n  {\n    \"id\": \"3917587\",\n    \"villager\": \"Alex\",\n    \"hearts\": 14,\n    \"description\": \"Alex asks for 5,000g for a secret project.\"\n  },\n\n  {\n    \"id\": \"1\",\n    \"villager\": \"Abigail\",\n    \"hearts\": 2,\n    \"description\": \"Prairie King co-op game in her room.\"\n  },\n  {\n    \"id\": \"2\",\n    \"villager\": \"Abigail\",\n    \"hearts\": 4,\n    \"description\": \"Abigail playing flute on the bridge in the rain.\"\n  },\n  {\n    \"id\": \"4\",\n    \"villager\": \"Abigail\",\n    \"hearts\": 6,\n    \"description\": \"Abigail in the graveyard at night.\"\n  },\n  {\n    \"id\": \"3\",\n    \"villager\": \"Abigail\",\n    \"hearts\": 8,\n    \"description\": \"Spirit board session with Abigail.\"\n  },\n  {\n    \"id\": \"901756\",\n    \"villager\": \"Abigail\",\n    \"hearts\": 10,\n    \"description\": \"Find Abigail crying in the mines.\"\n  },\n  {\n    \"id\": \"6963327\",\n    \"villager\": \"Abigail\",\n    \"hearts\": 14,\n    \"description\": \"Abigail's 14-heart event.\"\n  },\n\n  { \"id\": \"39\", \"villager\": \"Elliott\", \"hearts\": 2, \"description\": \"Visit Elliott's cabin.\" },\n  { \"id\": \"40\", \"villager\": \"Elliott\", \"hearts\": 4, \"description\": \"Elliott at the saloon.\" },\n  {\n    \"id\": \"423502\",\n    \"villager\": \"Elliott\",\n    \"hearts\": 6,\n    \"description\": \"Catch Elliott playing piano.\"\n  },\n  {\n    \"id\": \"1848481\",\n    \"villager\": \"Elliott\",\n    \"hearts\": 8,\n    \"description\": \"Elliott's book reading at the library.\"\n  },\n  {\n    \"id\": \"43\",\n    \"villager\": \"Elliott\",\n    \"hearts\": 10,\n    \"description\": \"Elliott on the beach, boat ride.\"\n  },\n  {\n    \"id\": \"3912125\",\n    \"villager\": \"Elliott\",\n    \"hearts\": 14,\n    \"description\": \"Elliott receives exciting news.\"\n  },\n\n  {\n    \"id\": \"471942\",\n    \"villager\": \"Emily\",\n    \"hearts\": 2,\n    \"description\": \"Emily asks why you're visiting.\"\n  },\n  {\n    \"id\": \"463391\",\n    \"villager\": \"Emily\",\n    \"hearts\": 4,\n    \"description\": \"Emily enjoying a beautiful day.\"\n  },\n  {\n    \"id\": \"917409\",\n    \"villager\": \"Emily\",\n    \"hearts\": 6,\n    \"description\": \"Emily's gem meditation dream.\"\n  },\n  {\n    \"id\": \"2123243\",\n    \"villager\": \"Emily\",\n    \"hearts\": 8,\n    \"description\": \"Emily's clothing therapy event.\"\n  },\n  {\n    \"id\": \"2123343\",\n    \"villager\": \"Emily\",\n    \"hearts\": 10,\n    \"description\": \"Camping under the stars with Emily.\"\n  },\n  {\n    \"id\": \"3917600\",\n    \"villager\": \"Emily\",\n    \"hearts\": 14,\n    \"description\": \"Emily working on something special.\"\n  },\n\n  {\n    \"id\": \"11\",\n    \"villager\": \"Haley\",\n    \"hearts\": 2,\n    \"description\": \"Haley and Emily arguing about cleaning.\"\n  },\n  { \"id\": \"12\", \"villager\": \"Haley\", \"hearts\": 4, \"description\": \"Haley can't open a jar.\" },\n  {\n    \"id\": \"13\",\n    \"villager\": \"Haley\",\n    \"hearts\": 6,\n    \"description\": \"Haley at the beach, lost bracelet.\"\n  },\n  {\n    \"id\": \"14\",\n    \"villager\": \"Haley\",\n    \"hearts\": 8,\n    \"description\": \"Haley surprised to see you in the forest.\"\n  },\n  {\n    \"id\": \"15\",\n    \"villager\": \"Haley\",\n    \"hearts\": 10,\n    \"description\": \"Haley's dark room photography.\"\n  },\n  { \"id\": \"6184643\", \"villager\": \"Haley\", \"hearts\": 14, \"description\": \"Haley's 14-heart event.\" },\n\n  { \"id\": \"56\", \"villager\": \"Harvey\", \"hearts\": 2, \"description\": \"Harvey examining George.\" },\n  {\n    \"id\": \"57\",\n    \"villager\": \"Harvey\",\n    \"hearts\": 4,\n    \"description\": \"Harvey about to write you a letter.\"\n  },\n  { \"id\": \"58\", \"villager\": \"Harvey\", \"hearts\": 6, \"description\": \"Harvey at aerobics class.\" },\n  {\n    \"id\": \"571102\",\n    \"villager\": \"Harvey\",\n    \"hearts\": 8,\n    \"description\": \"Harvey calling for help on the radio.\"\n  },\n  {\n    \"id\": \"528052\",\n    \"villager\": \"Harvey\",\n    \"hearts\": 10,\n    \"description\": \"Harvey's hot air balloon ride.\"\n  },\n  {\n    \"id\": \"3917626\",\n    \"villager\": \"Harvey\",\n    \"hearts\": 14,\n    \"description\": \"Harvey setting the table for dinner.\"\n  },\n\n  {\n    \"id\": \"50\",\n    \"villager\": \"Leah\",\n    \"hearts\": 2,\n    \"description\": \"Visit Leah's cottage, see her art.\"\n  },\n  { \"id\": \"51\", \"villager\": \"Leah\", \"hearts\": 4, \"description\": \"Leah on phone with ex.\" },\n  { \"id\": \"52\", \"villager\": \"Leah\", \"hearts\": 6, \"description\": \"Leah foraging, startled by you.\" },\n  { \"id\": \"55\", \"villager\": \"Leah\", \"hearts\": 8, \"description\": \"Leah's art show announcement.\" },\n  { \"id\": \"54\", \"villager\": \"Leah\", \"hearts\": 10, \"description\": \"Leah's surprise in the forest.\" },\n  {\n    \"id\": \"3911124\",\n    \"villager\": \"Leah\",\n    \"hearts\": 14,\n    \"description\": \"Leah invites you to paint.\"\n  },\n\n  { \"id\": \"6\", \"villager\": \"Maru\", \"hearts\": 2, \"description\": \"Meet Maru in Robin's house.\" },\n  { \"id\": \"7\", \"villager\": \"Maru\", \"hearts\": 4, \"description\": \"Maru sick of preparing samples.\" },\n  { \"id\": \"8\", \"villager\": \"Maru\", \"hearts\": 6, \"description\": \"Maru stargazing late at night.\" },\n  {\n    \"id\": \"9\",\n    \"villager\": \"Maru\",\n    \"hearts\": 8,\n    \"description\": \"Maru invites you in for robot project.\"\n  },\n  { \"id\": \"10\", \"villager\": \"Maru\", \"hearts\": 10, \"description\": \"Maru's big project reveal.\" },\n  {\n    \"id\": \"3917666\",\n    \"villager\": \"Maru\",\n    \"hearts\": 14,\n    \"description\": \"Maru's comet watching event.\"\n  },\n\n  {\n    \"id\": \"34\",\n    \"villager\": \"Penny\",\n    \"hearts\": 2,\n    \"description\": \"George struggling with a letter, Penny helps.\"\n  },\n  {\n    \"id\": \"35\",\n    \"villager\": \"Penny\",\n    \"hearts\": 4,\n    \"description\": \"Penny upset about dirty trailer.\"\n  },\n  { \"id\": \"36\", \"villager\": \"Penny\", \"hearts\": 6, \"description\": \"Penny cooking a new recipe.\" },\n  {\n    \"id\": \"181928\",\n    \"villager\": \"Penny\",\n    \"hearts\": 8,\n    \"description\": \"Penny teaching the kids in the forest.\"\n  },\n  { \"id\": \"38\", \"villager\": \"Penny\", \"hearts\": 10, \"description\": \"Penny at the spa.\" },\n  { \"id\": \"4325434\", \"villager\": \"Penny\", \"hearts\": 14, \"description\": \"Penny welcomes you home.\" },\n\n  { \"id\": \"44\", \"villager\": \"Sam\", \"hearts\": 2, \"description\": \"Sam and Sebastian jam session.\" },\n  { \"id\": \"733330\", \"villager\": \"Sam\", \"hearts\": 3, \"description\": \"Sam at the beach.\" },\n  { \"id\": \"46\", \"villager\": \"Sam\", \"hearts\": 4, \"description\": \"Sam about to have a snack.\" },\n  {\n    \"id\": \"45\",\n    \"villager\": \"Sam\",\n    \"hearts\": 6,\n    \"description\": \"Sam skateboarding, Lewis scolds him.\"\n  },\n  { \"id\": \"47\", \"villager\": \"Sam\", \"hearts\": 8, \"description\": \"Sam's band playing in Zuzu City.\" },\n  {\n    \"id\": \"233104\",\n    \"villager\": \"Sam\",\n    \"hearts\": 10,\n    \"description\": \"Sam wants to talk in private.\"\n  },\n  { \"id\": \"3918600\", \"villager\": \"Sam\", \"hearts\": 14, \"description\": \"Sam greets you after work.\" },\n\n  {\n    \"id\": \"2794460\",\n    \"villager\": \"Sebastian\",\n    \"hearts\": 2,\n    \"description\": \"Sebastian programming.\"\n  },\n  {\n    \"id\": \"384883\",\n    \"villager\": \"Sebastian\",\n    \"hearts\": 4,\n    \"description\": \"Sebastian on the mountain.\"\n  },\n  { \"id\": \"27\", \"villager\": \"Sebastian\", \"hearts\": 6, \"description\": \"Sebastian in his room.\" },\n  {\n    \"id\": \"29\",\n    \"villager\": \"Sebastian\",\n    \"hearts\": 8,\n    \"description\": \"Sebastian at the beach at night.\"\n  },\n  {\n    \"id\": \"384882\",\n    \"villager\": \"Sebastian\",\n    \"hearts\": 10,\n    \"description\": \"Sebastian motorcycle ride.\"\n  },\n  {\n    \"id\": \"9333219\",\n    \"villager\": \"Sebastian\",\n    \"hearts\": 14,\n    \"description\": \"Sebastian's 14-heart event.\"\n  },\n\n  {\n    \"id\": \"611944\",\n    \"villager\": \"Shane\",\n    \"hearts\": 2,\n    \"description\": \"Shane drinking alone late at night.\"\n  },\n  { \"id\": \"3910674\", \"villager\": \"Shane\", \"hearts\": 4, \"description\": \"Marnie checks on Shane.\" },\n  {\n    \"id\": \"3910975\",\n    \"villager\": \"Shane\",\n    \"hearts\": 6,\n    \"description\": \"Shane at the cliffs, emotional breakdown.\"\n  },\n  {\n    \"id\": \"3900074\",\n    \"villager\": \"Shane\",\n    \"hearts\": 8,\n    \"description\": \"Shane shows you blue chickens in the barn.\"\n  },\n  { \"id\": \"2128292\", \"villager\": \"Shane\", \"hearts\": 10, \"description\": \"Shane visits the farm.\" },\n  {\n    \"id\": \"3917584\",\n    \"villager\": \"Shane\",\n    \"hearts\": 14,\n    \"description\": \"Shane's 14-heart spouse event.\"\n  },\n\n  {\n    \"id\": \"7771191\",\n    \"villager\": \"Krobus\",\n    \"hearts\": 14,\n    \"description\": \"Krobus 14-heart event at the beach.\"\n  },\n\n  {\n    \"id\": \"17\",\n    \"villager\": \"Caroline\",\n    \"hearts\": 6,\n    \"description\": \"Abigail and Caroline arguing about lifestyle.\"\n  },\n  {\n    \"id\": \"97\",\n    \"villager\": \"Clint\",\n    \"hearts\": 3,\n    \"description\": \"Clint asks you to join him at the saloon.\"\n  },\n  {\n    \"id\": \"101\",\n    \"villager\": \"Clint\",\n    \"hearts\": 6,\n    \"description\": \"Catch Clint outside Emily's house.\"\n  },\n  {\n    \"id\": \"25\",\n    \"villager\": \"Demetrius\",\n    \"hearts\": 6,\n    \"description\": \"Robin and Demetrius argue about tomatoes.\"\n  },\n  { \"id\": \"19\", \"villager\": \"Evelyn\", \"hearts\": 4, \"description\": \"Evelyn baking cookies.\" },\n  {\n    \"id\": \"18\",\n    \"villager\": \"George\",\n    \"hearts\": 6,\n    \"description\": \"George can't reach something from wheelchair.\"\n  },\n  { \"id\": \"96\", \"villager\": \"Gus\", \"hearts\": 4, \"description\": \"Gus greeting you at the saloon.\" },\n  { \"id\": \"980558\", \"villager\": \"Gus\", \"hearts\": 5, \"description\": \"Gus visits your farm.\" },\n  {\n    \"id\": \"3910979\",\n    \"villager\": \"Jas\",\n    \"hearts\": 8,\n    \"description\": \"Vincent and Jas playing together.\"\n  },\n  { \"id\": \"93\", \"villager\": \"Jodi\", \"hearts\": 4, \"description\": \"Jodi visits the farm.\" },\n  {\n    \"id\": \"100\",\n    \"villager\": \"Kent\",\n    \"hearts\": 3,\n    \"description\": \"Kent flashback while Jodi makes popcorn.\"\n  },\n  {\n    \"id\": \"6497423\",\n    \"villager\": \"Leo\",\n    \"hearts\": 2,\n    \"description\": \"Leo curious about what you're doing.\"\n  },\n  { \"id\": \"6497421\", \"villager\": \"Leo\", \"hearts\": 4, \"description\": \"Leo apologizes.\" },\n  { \"id\": \"6497428\", \"villager\": \"Leo\", \"hearts\": 6, \"description\": \"Linus meets Leo.\" },\n  {\n    \"id\": \"8959199\",\n    \"villager\": \"Leo\",\n    \"hearts\": 9,\n    \"description\": \"Leo reminiscing about a great day.\"\n  },\n  {\n    \"id\": \"639373\",\n    \"villager\": \"Lewis\",\n    \"hearts\": 6,\n    \"description\": \"Lewis and Marnie's secret relationship.\"\n  },\n  {\n    \"id\": \"502969\",\n    \"villager\": \"Linus\",\n    \"hearts\": 0,\n    \"description\": \"George complains about raccoons.\"\n  },\n  { \"id\": \"26\", \"villager\": \"Linus\", \"hearts\": 4, \"description\": \"Linus by the firepit.\" },\n  { \"id\": \"371652\", \"villager\": \"Linus\", \"hearts\": 8, \"description\": \"Robin encounters Linus.\" },\n  {\n    \"id\": \"91\",\n    \"villager\": \"Marnie\",\n    \"hearts\": 3,\n    \"description\": \"Marnie asks about training goats.\"\n  },\n  { \"id\": \"503180\", \"villager\": \"Pam\", \"hearts\": 9, \"description\": \"Pam heart-to-heart.\" },\n  { \"id\": \"16\", \"villager\": \"Pierre\", \"hearts\": 6, \"description\": \"Find Pierre's secret stash.\" },\n  { \"id\": \"33\", \"villager\": \"Robin\", \"hearts\": 6, \"description\": \"Robin cleaning her saw.\" },\n  {\n    \"id\": \"3910979\",\n    \"villager\": \"Vincent\",\n    \"hearts\": 8,\n    \"description\": \"Vincent and Jas playing together.\"\n  },\n  {\n    \"id\": \"711130\",\n    \"villager\": \"Willy\",\n    \"hearts\": 6,\n    \"description\": \"Willy needs help with something.\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport eventData from '@/data/events.json';\nimport { GameEvent } from '@/types';\n\nconst allEvents: GameEvent[] = eventData.map((e) => ({\n  ...e,\n  name: `${e.villager} ${e.hearts}-Heart`,\n}));\n\n/**\n * Query builder for heart event data. All filter and sort methods return a new EventQuery for chaining.\n * Each event has a generated `name` field in the format \"Villager N-Heart\" for QueryBase compatibility.\n */\nexport class EventQuery extends QueryBase<GameEvent> {\n  constructor(data: GameEvent[] = allEvents) {\n    super(data);\n  }\n\n  /** Filter by villager name (case-insensitive exact match). */\n  byVillager(villager: string): EventQuery {\n    const q = villager.toLowerCase();\n    return new EventQuery(this.data.filter((e) => e.villager.toLowerCase() === q));\n  }\n\n  /** Filter by heart level. */\n  byHearts(hearts: number): EventQuery {\n    return new EventQuery(this.data.filter((e) => e.hearts === hearts));\n  }\n\n  /** Filter to only marriage candidate events (hearts 2, 4, 6, 8, 10, 14). */\n  marriageEvents(): EventQuery {\n    const marriageHearts = [2, 4, 6, 8, 10, 14];\n    return new EventQuery(this.data.filter((e) => marriageHearts.includes(e.hearts)));\n  }\n\n  /** Sort by heart level. */\n  sortByHearts(order: 'asc' | 'desc' = 'asc'): EventQuery {\n    const sorted = [...this.data].sort((a, b) => a.hearts - b.hearts);\n    return new EventQuery(order === 'desc' ? sorted.reverse() : sorted);\n  }\n\n  /** Sort alphabetically by villager name. */\n  sortByVillager(order: 'asc' | 'desc' = 'asc'): EventQuery {\n    const sorted = [...this.data].sort((a, b) => a.villager.localeCompare(b.villager));\n    return new EventQuery(order === 'desc' ? sorted.reverse() : sorted);\n  }\n}\n\n/** Returns an EventQuery for all heart event data. Pass `source` to wrap a pre-filtered array. */\nexport function events(source?: GameEvent[]): EventQuery {\n  return new EventQuery(source ?? allEvents);\n}\n","[\n  {\n    \"id\": \"coop\",\n    \"name\": \"Coop\",\n    \"description\": \"A small building that houses chickens. Feed them with hay from a silo.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 4000,\n    \"buildDays\": 3,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 300\n      },\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 100\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"animalCapacity\": 4,\n    \"image\": \"images/buildings/coop/Coop.png\"\n  },\n  {\n    \"id\": \"big-coop\",\n    \"name\": \"Big Coop\",\n    \"description\": \"An upgraded coop with more space. Houses up to 8 animals including ducks and dinosaurs. Includes an incubator.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 10000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 400\n      },\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 150\n      }\n    ],\n    \"upgradeFrom\": \"coop\",\n    \"magical\": false,\n    \"animalCapacity\": 8,\n    \"image\": \"images/buildings/coop/Big Coop.png\"\n  },\n  {\n    \"id\": \"deluxe-coop\",\n    \"name\": \"Deluxe Coop\",\n    \"description\": \"The best coop. Houses up to 12 animals including rabbits. Has an auto-feed system.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 20000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 500\n      },\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 200\n      }\n    ],\n    \"upgradeFrom\": \"big-coop\",\n    \"magical\": false,\n    \"animalCapacity\": 12,\n    \"image\": \"images/buildings/coop/Deluxe Coop.png\"\n  },\n  {\n    \"id\": \"barn\",\n    \"name\": \"Barn\",\n    \"description\": \"A building that houses cows and goats. Feed them with hay from a silo.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 6000,\n    \"buildDays\": 3,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 350\n      },\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 150\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"animalCapacity\": 4,\n    \"image\": \"images/buildings/barn/Barn.png\"\n  },\n  {\n    \"id\": \"big-barn\",\n    \"name\": \"Big Barn\",\n    \"description\": \"An upgraded barn with more space. Houses up to 8 animals including sheep and pigs.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 12000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 450\n      },\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 200\n      }\n    ],\n    \"upgradeFrom\": \"barn\",\n    \"magical\": false,\n    \"animalCapacity\": 8,\n    \"image\": \"images/buildings/barn/Big Barn.png\"\n  },\n  {\n    \"id\": \"deluxe-barn\",\n    \"name\": \"Deluxe Barn\",\n    \"description\": \"The best barn. Houses up to 12 animals including ostriches. Has an auto-feed system.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 25000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 550\n      },\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 300\n      }\n    ],\n    \"upgradeFrom\": \"big-barn\",\n    \"magical\": false,\n    \"animalCapacity\": 12,\n    \"image\": \"images/buildings/barn/Deluxe Barn.png\"\n  },\n  {\n    \"id\": \"well\",\n    \"name\": \"Well\",\n    \"description\": \"Place a well to refill your watering can without having to travel to a pond or river.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 1000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 75\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/Well.png\"\n  },\n  {\n    \"id\": \"silo\",\n    \"name\": \"Silo\",\n    \"description\": \"Stores hay from cut grass. Capacity: 240 hay per silo.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 100,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 100\n      },\n      {\n        \"id\": \"330\",\n        \"item\": \"Clay\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"334\",\n        \"item\": \"Copper Bar\",\n        \"quantity\": 5\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/Silo.png\"\n  },\n  {\n    \"id\": \"mill\",\n    \"name\": \"Mill\",\n    \"description\": \"Place crops inside to make Flour, Sugar, Rice, and Wheat Flour.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 2500,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 150\n      },\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 50\n      },\n      {\n        \"id\": \"428\",\n        \"item\": \"Cloth\",\n        \"quantity\": 4\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/Mill.png\"\n  },\n  {\n    \"id\": \"shed\",\n    \"name\": \"Shed\",\n    \"description\": \"An empty building where you can place crafting machines, kegs, preserves jars, etc.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 15000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 300\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/shed/Shed.png\"\n  },\n  {\n    \"id\": \"big-shed\",\n    \"name\": \"Big Shed\",\n    \"description\": \"An upgraded shed with more interior space for machines and storage.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 20000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 550\n      },\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 300\n      }\n    ],\n    \"upgradeFrom\": \"shed\",\n    \"magical\": false,\n    \"image\": \"images/buildings/shed/Big Shed.png\"\n  },\n  {\n    \"id\": \"fish-pond\",\n    \"name\": \"Fish Pond\",\n    \"description\": \"Place fish in a pond to raise them. Produces roe and other items.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 5000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 200\n      },\n      {\n        \"id\": \"152\",\n        \"item\": \"Seaweed\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"153\",\n        \"item\": \"Green Algae\",\n        \"quantity\": 5\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/Fish Pond.png\"\n  },\n  {\n    \"id\": \"stable\",\n    \"name\": \"Stable\",\n    \"description\": \"Allows you to keep and ride a horse. The horse can be used to travel around the map faster.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 10000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"709\",\n        \"item\": \"Hardwood\",\n        \"quantity\": 100\n      },\n      {\n        \"id\": \"335\",\n        \"item\": \"Iron Bar\",\n        \"quantity\": 5\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/Horse Stable.png\"\n  },\n  {\n    \"id\": \"slime-hutch\",\n    \"name\": \"Slime Hutch\",\n    \"description\": \"Raise slimes in this building. Fill the water troughs and collect slime balls.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 10000,\n    \"buildDays\": 2,\n    \"materials\": [\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 500\n      },\n      {\n        \"id\": \"338\",\n        \"item\": \"Refined Quartz\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"337\",\n        \"item\": \"Iridium Bar\",\n        \"quantity\": 1\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"animalCapacity\": 20,\n    \"image\": \"images/buildings/Slime Hutch.png\"\n  },\n  {\n    \"id\": \"cabin\",\n    \"name\": \"Cabin\",\n    \"description\": \"A small cabin for multiplayer. Another player can use this as their home.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 100,\n    \"buildDays\": 0,\n    \"materials\": [],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/cabin/log/Log Cabin Stage 1.png\"\n  },\n  {\n    \"id\": \"pet-bowl\",\n    \"name\": \"Pet Bowl\",\n    \"description\": \"A bowl for your pet. Fill it with water daily to keep your pet happy.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 5000,\n    \"buildDays\": 0,\n    \"materials\": [\n      {\n        \"id\": \"709\",\n        \"item\": \"Hardwood\",\n        \"quantity\": 25\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/pet_bowl/Pet Bowl Wood.png\"\n  },\n  {\n    \"id\": \"shipping-bin\",\n    \"name\": \"Shipping Bin\",\n    \"description\": \"An additional shipping bin for selling items. Place items inside and they'll be collected overnight.\",\n    \"builder\": \"Robin\",\n    \"buildCost\": 250,\n    \"buildDays\": 0,\n    \"materials\": [\n      {\n        \"id\": \"388\",\n        \"item\": \"Wood\",\n        \"quantity\": 150\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/ShippingBox.png\"\n  },\n  {\n    \"id\": \"junimo-hut\",\n    \"name\": \"Junimo Hut\",\n    \"description\": \"Junimos will harvest crops within a certain radius of the hut. Place it near your crops.\",\n    \"builder\": \"Wizard\",\n    \"buildCost\": 20000,\n    \"buildDays\": 0,\n    \"materials\": [\n      {\n        \"id\": \"2\",\n        \"item\": \"Stone\",\n        \"quantity\": 200\n      },\n      {\n        \"id\": \"268\",\n        \"item\": \"Starfruit\",\n        \"quantity\": 9\n      },\n      {\n        \"id\": \"771\",\n        \"item\": \"Fiber\",\n        \"quantity\": 100\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": true,\n    \"image\": \"images/buildings/Junimo Hut.png\"\n  },\n  {\n    \"id\": \"earth-obelisk\",\n    \"name\": \"Earth Obelisk\",\n    \"description\": \"Warp to the mountains. Interact to teleport instantly.\",\n    \"builder\": \"Wizard\",\n    \"buildCost\": 500000,\n    \"buildDays\": 0,\n    \"materials\": [\n      {\n        \"id\": \"337\",\n        \"item\": \"Iridium Bar\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"86\",\n        \"item\": \"Earth Crystal\",\n        \"quantity\": 10\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": true,\n    \"image\": \"images/buildings/obelisks/Earth Obelisk.png\"\n  },\n  {\n    \"id\": \"water-obelisk\",\n    \"name\": \"Water Obelisk\",\n    \"description\": \"Warp to the beach. Interact to teleport instantly.\",\n    \"builder\": \"Wizard\",\n    \"buildCost\": 500000,\n    \"buildDays\": 0,\n    \"materials\": [\n      {\n        \"id\": \"337\",\n        \"item\": \"Iridium Bar\",\n        \"quantity\": 5\n      },\n      {\n        \"id\": \"372\",\n        \"item\": \"Clam\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"393\",\n        \"item\": \"Coral\",\n        \"quantity\": 10\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": true,\n    \"image\": \"images/buildings/obelisks/Water Obelisk.png\"\n  },\n  {\n    \"id\": \"desert-obelisk\",\n    \"name\": \"Desert Obelisk\",\n    \"description\": \"Warp to the desert. Interact to teleport instantly.\",\n    \"builder\": \"Wizard\",\n    \"buildCost\": 1000000,\n    \"buildDays\": 0,\n    \"materials\": [\n      {\n        \"id\": \"337\",\n        \"item\": \"Iridium Bar\",\n        \"quantity\": 20\n      },\n      {\n        \"id\": \"88\",\n        \"item\": \"Coconut\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"90\",\n        \"item\": \"Cactus Fruit\",\n        \"quantity\": 10\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": true,\n    \"image\": \"images/buildings/obelisks/Desert Obelisk.png\"\n  },\n  {\n    \"id\": \"island-obelisk\",\n    \"name\": \"Island Obelisk\",\n    \"description\": \"Warp to Ginger Island. Interact to teleport instantly.\",\n    \"builder\": \"Wizard\",\n    \"buildCost\": 1000000,\n    \"buildDays\": 0,\n    \"materials\": [\n      {\n        \"id\": \"337\",\n        \"item\": \"Iridium Bar\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"852\",\n        \"item\": \"Dragon Tooth\",\n        \"quantity\": 10\n      },\n      {\n        \"id\": \"91\",\n        \"item\": \"Banana\",\n        \"quantity\": 10\n      }\n    ],\n    \"upgradeFrom\": null,\n    \"magical\": true,\n    \"image\": \"images/buildings/obelisks/Island Obelisk.png\"\n  },\n  {\n    \"id\": \"gold-clock\",\n    \"name\": \"Gold Clock\",\n    \"description\": \"Prevents debris from appearing on the farm. Fences never decay.\",\n    \"builder\": \"Wizard\",\n    \"buildCost\": 10000000,\n    \"buildDays\": 0,\n    \"materials\": [],\n    \"upgradeFrom\": null,\n    \"magical\": true,\n    \"image\": \"images/buildings/Gold Clock.png\"\n  },\n  {\n    \"id\": \"greenhouse\",\n    \"name\": \"Greenhouse\",\n    \"description\": \"A climate-controlled building where crops can be grown in any season. Unlocked by completing the Pantry bundles or purchasing the Joja Greenhouse.\",\n    \"builder\": \"Community Center\",\n    \"buildCost\": 0,\n    \"buildDays\": 0,\n    \"materials\": [],\n    \"upgradeFrom\": null,\n    \"magical\": false,\n    \"image\": \"images/buildings/Greenhouse.png\"\n  }\n]\n","import { QueryBase } from '@/common/query-base';\nimport buildingData from '@/data/buildings.json';\nimport { Building, BuildingBuilder } from '@/types';\n\nconst allBuildings: Building[] = buildingData as Building[];\n\n/**\n * Query builder for building data. All filter and sort methods return a new BuildingQuery for chaining.\n * Farmhouse upgrades/renovations are in the separate `farmhouse` module.\n */\nexport class BuildingQuery extends QueryBase<Building> {\n  constructor(data: Building[] = allBuildings) {\n    super(data);\n  }\n\n  /** Filter by builder (Robin or Wizard). */\n  byBuilder(builder: BuildingBuilder): BuildingQuery {\n    return new BuildingQuery(this.data.filter((b) => b.builder === builder));\n  }\n\n  /** Filter to magical buildings only (Wizard buildings constructed instantly). */\n  magical(): BuildingQuery {\n    return new BuildingQuery(this.data.filter((b) => b.magical));\n  }\n\n  /** Filter to buildings that are upgrades of another building. */\n  upgrades(): BuildingQuery {\n    return new BuildingQuery(this.data.filter((b) => b.upgradeFrom !== null));\n  }\n\n  /** Filter to base buildings (not upgrades). */\n  base(): BuildingQuery {\n    return new BuildingQuery(this.data.filter((b) => b.upgradeFrom === null));\n  }\n\n  /** Sort by build cost. Default: `'asc'`. */\n  sortByCost(order: 'asc' | 'desc' = 'asc'): BuildingQuery {\n    const sorted = [...this.data].sort((a, b) => a.buildCost - b.buildCost);\n    return new BuildingQuery(order === 'desc' ? sorted.reverse() : sorted);\n  }\n\n  /** Sort alphabetically by name. */\n  sortByName(order: 'asc' | 'desc' = 'asc'): BuildingQuery {\n    const sorted = [...this.data].sort((a, b) => a.name.localeCompare(b.name));\n    return new BuildingQuery(order === 'desc' ? sorted.reverse() : sorted);\n  }\n}\n\n/** Returns a BuildingQuery for all building data. Pass `source` to wrap a pre-filtered array. */\nexport function buildings(source: Building[] = allBuildings): BuildingQuery {\n  return new BuildingQuery(source);\n}\n","import { XMLParser } from 'fast-xml-parser';\nimport type { ParseContext } from './parser-registry';\nimport { getParserSet } from './parser-registry';\nimport { parseEventsSeen } from './parsers/v1/events';\nimport { parseMail } from './parsers/v1/mail';\nimport type { SaveData } from './types';\nimport { resolveApiVersion } from './versions';\n\nexport { resolveApiVersion, LATEST_API_VERSION } from './versions';\nexport type { VersionRange } from './versions';\n\nexport type {\n  SaveAnimal,\n  SaveBuilding,\n  SaveBundleData,\n  SaveBundleItem,\n  SaveBundleReward,\n  SaveBundleRoom,\n  SaveBundleStatus,\n  SaveChild,\n  SaveCollectionEntry,\n  SaveData,\n  SaveDate,\n  SaveFarm,\n  SaveFishEntry,\n  SaveFriendship,\n  SaveIslandUpgrades,\n  SaveItem,\n  SaveMastery,\n  SaveMasteryPerk,\n  SaveMineProgress,\n  SaveMonsterKillEntry,\n  SaveMuseum,\n  SavePerfection,\n  SavePet,\n  SavePlayer,\n  SavePowerEntry,\n  SavePowers,\n  SaveProfession,\n  SaveQuest,\n  SaveRaccoons,\n  SaveRarecrows,\n  SaveRecipeEntry,\n  SaveSecretNotes,\n  SaveShippedEntry,\n  SaveSkillLevel,\n  SaveSkills,\n  SaveSpecialOrders,\n  SaveStardropEntry,\n  SaveStats,\n  SaveWalnuts,\n} from './types';\n\nconst ARRAY_TAG_NAMES = [\n  'item',\n  'Item',\n  'int',\n  'Quest',\n  'Building',\n  'FarmAnimal',\n  'GameLocation',\n  'SpecialOrder',\n  'NPC',\n];\n\nfunction isArrayTag(name: string): boolean {\n  return ARRAY_TAG_NAMES.includes(name);\n}\n\nconst parserOptions = {\n  ignoreAttributes: false,\n  attributeNamePrefix: '@_',\n  isArray: isArrayTag,\n};\n\n/**\n * Parse a Stardew Valley XML save file and return structured game data.\n * The API version is resolved from the game version in the save file,\n * and the appropriate versioned parser set is used.\n */\nexport function parseSaveFile(xml: string): SaveData {\n  const parser = new XMLParser(parserOptions);\n  const doc = parser.parse(xml);\n  const root = doc.SaveGame;\n  const player = root.player;\n\n  // Pre-compute mail and events as Sets for efficient lookups across parsers\n  const mailArray = parseMail(player.mailReceived);\n  const mailSet = new Set(mailArray);\n  const eventsSeen = parseEventsSeen(player);\n  const eventsSet = new Set(eventsSeen);\n\n  const gameVersion = String(root.gameVersion ?? '');\n  const apiVersion = resolveApiVersion(gameVersion);\n\n  const ctx: ParseContext = { root, player, mailArray, mailSet, eventsSeen, eventsSet };\n  const parserSet = getParserSet(apiVersion);\n\n  return {\n    apiVersion,\n    ...parserSet(ctx),\n  };\n}\n","/** Strip item type prefix: \"(O)129\" → \"129\", \"(BC)10\" → \"10\", plain \"773\" → \"773\" */\nexport function normalizeItemId(raw: string): string {\n  return String(raw).replace(/^\\([A-Z]+\\)/, '');\n}\n\n/** Safely read a numeric value from a parsed XML node, defaulting to 0. */\nexport function num(value: unknown): number {\n  if (value === undefined || value === null) return 0;\n  const n = Number(value);\n  return isNaN(n) ? 0 : n;\n}\n\n/** Safely read a string value from a parsed XML node. */\nexport function str(value: unknown, fallback = ''): string {\n  if (value === undefined || value === null) return fallback;\n  return String(value);\n}\n\n/** Ensure a value is always an array, even if the parser returned a single object. */\nexport function ensureArray<T>(value: T | T[] | undefined | null): T[] {\n  if (value === undefined || value === null) return [];\n  return Array.isArray(value) ? value : [value];\n}\n\n/**\n * Extract key-value items from a parsed XML dictionary structure.\n * Handles the `{ item: [{ key: ..., value: ... }] }` pattern used throughout save files.\n */\nexport function extractDictItems(dict: unknown): Array<{ key: unknown; value: unknown }> {\n  if (!dict || typeof dict !== 'object') return [];\n  const d = dict as Record<string, unknown>;\n  return ensureArray(d.item as Array<{ key: unknown; value: unknown }>);\n}\n","import { ensureArray, num } from '../util';\n\n/** Extract the list of unlocked achievement IDs from the player node. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseAchievements(achievements: any): number[] {\n  return ensureArray(achievements?.int).map(num);\n}\n","import type { SaveAnimal, SaveFishPond } from '../../types';\nimport { ensureArray, num, str } from '../util';\n\n/** Parse farm animal data from all building interiors in the save file root. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseAnimals(root: any): SaveAnimal[] {\n  const result: SaveAnimal[] = [];\n  const locations = ensureArray(root.locations?.GameLocation);\n\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    if (str(l.name) !== 'Farm') continue;\n\n    const buildings = ensureArray((l.buildings as Record<string, unknown>)?.Building);\n\n    for (const building of buildings) {\n      const b = building as Record<string, unknown>;\n      const indoors = b.indoors as Record<string, unknown> | undefined;\n      if (!indoors) continue;\n\n      const animals = ensureArray((indoors.animals as Record<string, unknown>)?.item);\n\n      for (const animalItem of animals) {\n        const ai = animalItem as Record<string, unknown>;\n        const a = ai.value as Record<string, unknown>;\n        const faRaw = a?.FarmAnimal;\n        const fa = (Array.isArray(faRaw) ? faRaw[0] : faRaw) as Record<string, unknown>;\n        if (!fa) continue;\n\n        result.push({\n          id: str(fa.myID),\n          name: str(fa.name),\n          type: str(fa.type),\n          buildingId: str(b.id),\n          buildingType: str(fa.buildingTypeILiveIn),\n          friendship: num(fa.friendshipTowardFarmer),\n          happiness: num(fa.happiness),\n          age: num(fa.age),\n          hasAnimalCracker:\n            fa.hasEatenAnimalCracker === true || fa.hasEatenAnimalCracker === 'true',\n        });\n      }\n    }\n    break;\n  }\n  return result;\n}\n\n/** Parse fish pond data from FishPond buildings on the farm. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseFishPonds(root: any): SaveFishPond[] {\n  const result: SaveFishPond[] = [];\n  const locations = ensureArray(root.locations?.GameLocation);\n\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    if (str(l.name) !== 'Farm') continue;\n\n    const buildings = ensureArray((l.buildings as Record<string, unknown>)?.Building);\n\n    for (const building of buildings) {\n      const b = building as Record<string, unknown>;\n      const xsiType = str(\n        (b as Record<string, string>)['@_xsi:type'] ?? (b as Record<string, string>)['@_type'],\n      );\n      if (xsiType !== 'FishPond') continue;\n\n      const fishTypeRaw = b.fishType as Record<string, unknown> | undefined;\n      const fishType = num(fishTypeRaw?.int);\n      if (fishType === 0) continue;\n\n      result.push({\n        buildingId: str(b.id),\n        fishType,\n        currentOccupants: num(b.currentOccupants),\n        maxOccupants: num(b.maxOccupants),\n      });\n    }\n    break;\n  }\n  return result;\n}\n","import type { SaveBuilding } from '../../types';\nimport { ensureArray, num, str } from '../util';\n\n/** Parse all farm buildings and their positions from the save file root. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseBuildings(root: any): SaveBuilding[] {\n  const result: SaveBuilding[] = [];\n  const locations = ensureArray(root.locations?.GameLocation);\n\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    if (str(l.name) !== 'Farm') continue;\n\n    const buildings = ensureArray((l.buildings as Record<string, unknown>)?.Building);\n\n    for (const building of buildings) {\n      const b = building as Record<string, unknown>;\n      result.push({\n        id: str(b.id),\n        type: str(b.buildingType),\n        animalCount: num(b.currentOccupants),\n      });\n    }\n    break;\n  }\n  return result;\n}\n","import animalsData from '@/data/animals.json';\nimport artisanGoodsData from '@/data/artisan-goods.json';\nimport baitData from '@/data/bait.json';\nimport cookingData from '@/data/cooking.json';\nimport craftingData from '@/data/crafting.json';\nimport cropsData from '@/data/crops.json';\nimport fishData from '@/data/fish.json';\nimport forageablesData from '@/data/forageables.json';\nimport mineralsData from '@/data/minerals.json';\nimport ringsData from '@/data/rings.json';\nimport tackleData from '@/data/tackle.json';\nimport treesData from '@/data/trees.json';\n\n/**\n * Build an item ID → name lookup map from all data modules.\n * Covers regular objects, animal produce, tree produce, crafting outputs, and ingredients.\n */\nfunction buildItemNameMap(): Map<string, string> {\n  const map = new Map<string, string>();\n\n  const add = (id: string, name: string) => {\n    if (id && name && !map.has(id)) map.set(id, name);\n  };\n\n  // Simple flat arrays: { id, name }\n  for (const item of cropsData as Array<{ id: string; name: string }>) add(item.id, item.name);\n  for (const item of fishData as Array<{ id: string; name: string }>) add(item.id, item.name);\n  for (const item of forageablesData as Array<{ id: string; name: string }>)\n    add(item.id, item.name);\n  for (const item of artisanGoodsData as Array<{ id: string; name: string }>)\n    add(item.id, item.name);\n  for (const item of mineralsData as Array<{ id: string; name: string }>) add(item.id, item.name);\n  for (const item of cookingData as Array<{ id: string; name: string }>) add(item.id, item.name);\n  for (const item of ringsData as Array<{ id: string; name: string }>) add(item.id, item.name);\n  for (const item of baitData as Array<{ id: string; name: string }>) add(item.id, item.name);\n  for (const item of tackleData as Array<{ id: string; name: string }>) add(item.id, item.name);\n\n  // Crops: also index seedId → seedName\n  for (const item of cropsData as Array<{ seedId?: string; seedName?: string }>) {\n    if (item.seedId && item.seedName) add(item.seedId, item.seedName);\n  }\n\n  // Trees: produce items\n  for (const tree of treesData as Array<{ produce?: { id: string; name: string } }>) {\n    if (tree.produce) add(tree.produce.id, tree.produce.name);\n  }\n\n  // Animals: produce and deluxe produce\n  for (const animal of animalsData as Array<{\n    produce?: { id: string; name: string };\n    deluxeProduce?: { id: string; name: string };\n  }>) {\n    if (animal.produce) add(animal.produce.id, animal.produce.name);\n    if (animal.deluxeProduce) add(animal.deluxeProduce.id, animal.deluxeProduce.name);\n  }\n\n  // Crafting: output items and ingredients\n  for (const recipe of craftingData as Array<{\n    output: { id: string; name: string; isBigCraftable: boolean };\n    ingredients: Array<{ id: string; name: string }>;\n  }>) {\n    if (!recipe.output.isBigCraftable) add(recipe.output.id, recipe.output.name);\n    for (const ing of recipe.ingredients) add(ing.id, ing.name);\n  }\n\n  return map;\n}\n\n/**\n * Build a BigCraftable ID → name lookup from crafting recipe outputs.\n * These use a separate ID namespace from regular objects.\n */\nfunction buildBigCraftableNameMap(): Map<string, string> {\n  const map = new Map<string, string>();\n  for (const recipe of craftingData as Array<{\n    output: { id: string; name: string; isBigCraftable: boolean };\n  }>) {\n    if (recipe.output.isBigCraftable && !map.has(recipe.output.id)) {\n      map.set(recipe.output.id, recipe.output.name);\n    }\n  }\n  return map;\n}\n\n/** Lazily-initialized item name map (regular objects). */\nlet itemNames: Map<string, string> | null = null;\n\n/** Lazily-initialized BigCraftable name map. */\nlet bigCraftableNames: Map<string, string> | null = null;\n\n/** Resolve a regular object item ID to its display name. */\nexport function resolveItemName(itemId: string): string {\n  if (!itemNames) itemNames = buildItemNameMap();\n  return itemNames.get(itemId) ?? `Item ${itemId}`;\n}\n\n/** Resolve a BigCraftable item ID to its display name. */\nexport function resolveBigCraftableName(itemId: string): string {\n  if (!bigCraftableNames) bigCraftableNames = buildBigCraftableNameMap();\n  return bigCraftableNames.get(itemId) ?? `BigCraftable ${itemId}`;\n}\n\n/** Resolve a reward item name based on its type prefix and ID. */\nexport function resolveRewardName(type: string, itemId: string): string {\n  if (type === 'BO') return resolveBigCraftableName(itemId);\n  return resolveItemName(itemId);\n}\n","import type {\n  SaveBundleData,\n  SaveBundleItem,\n  SaveBundleReward,\n  SaveBundleRoom,\n  SaveBundleStatus,\n} from '../../types';\nimport { resolveItemName, resolveRewardName } from '../item-names';\nimport { ensureArray, extractDictItems, num } from '../util';\n\nconst JOJA_MAIL_FLAGS = [\n  'jojaBoilerRoom',\n  'jojaCraftsRoom',\n  'jojaFishTank',\n  'jojaPantry',\n  'jojaVault',\n];\n\n/** Area index → room name, matching the game's internal area IDs. */\nconst AREA_NAMES: Record<number, string> = {\n  0: 'Pantry',\n  1: 'Crafts Room',\n  2: 'Fish Tank',\n  3: 'Boiler Room',\n  4: 'Vault',\n  5: 'Bulletin Board',\n  6: 'Abandoned Joja Mart',\n};\n\n/** Room key string (from bundleData keys) → area index. */\nconst ROOM_KEY_TO_AREA: Record<string, number> = {\n  Pantry: 0,\n  'Crafts Room': 1,\n  'Fish Tank': 2,\n  'Boiler Room': 3,\n  Vault: 4,\n  'Bulletin Board': 5,\n  'Abandoned Joja Mart': 6,\n};\n\n/** Quality number → display name. */\nconst QUALITY_NAMES: Record<number, string> = {\n  0: 'Normal',\n  1: 'Silver',\n  2: 'Gold',\n  4: 'Iridium',\n};\n\n/** Reward type prefix → human-readable type. */\nconst REWARD_TYPES: Record<string, string> = {\n  O: 'Object',\n  BO: 'Big Craftable',\n  F: 'Furniture',\n  H: 'Hat',\n  C: 'Clothing',\n  R: 'Ring',\n};\n\ninterface ParsedBundleDef {\n  bundleIndex: number;\n  room: string;\n  areaIndex: number;\n  name: string;\n  items: Array<{ itemId: string; quantity: number; quality: number }>;\n  itemsRequired: number;\n  reward: SaveBundleReward | null;\n}\n\n/**\n * Parse a bundle definition string from the save file's bundleData.\n * Format: \"name/reward/items/colorIndex/itemsRequired/textureOverride/displayName\"\n */\nfunction parseBundleDef(key: string, value: string): ParsedBundleDef {\n  const [roomKey, indexStr] = key.split('/');\n  const bundleIndex = parseInt(indexStr, 10);\n  const areaIndex = ROOM_KEY_TO_AREA[roomKey] ?? -1;\n  const room = AREA_NAMES[areaIndex] ?? roomKey;\n\n  const parts = value.split('/');\n  const internalName = parts[0];\n  const displayName = parts[6] || internalName;\n\n  // Parse reward: \"type itemId quantity\" e.g. \"O 465 20\", \"BO 10 1\", \"R 517 1\"\n  let reward: SaveBundleReward | null = null;\n  const rewardStr = parts[1]?.trim();\n  if (rewardStr) {\n    const rewardParts = rewardStr.split(' ');\n    if (rewardParts.length >= 3) {\n      const type = rewardParts[0];\n      const itemId = rewardParts[1];\n      const quantity = parseInt(rewardParts[2], 10);\n      reward = {\n        type: REWARD_TYPES[type] ?? type,\n        itemId,\n        name: resolveRewardName(type, itemId),\n        quantity,\n      };\n    }\n  }\n\n  // Parse required items: space-separated triplets \"itemId quantity quality\"\n  const itemsStr = parts[2]?.trim() ?? '';\n  const itemTokens = itemsStr.split(' ');\n  const items: Array<{ itemId: string; quantity: number; quality: number }> = [];\n  for (let i = 0; i + 2 < itemTokens.length; i += 3) {\n    const itemId = itemTokens[i];\n    const quantity = parseInt(itemTokens[i + 1], 10);\n    const quality = parseInt(itemTokens[i + 2], 10);\n    items.push({ itemId, quantity, quality });\n  }\n\n  // Items required (field index 4) — how many of the listed items must be donated\n  const itemsRequiredStr = parts[4]?.trim();\n  const itemsRequired = itemsRequiredStr ? parseInt(itemsRequiredStr, 10) : items.length;\n\n  return {\n    bundleIndex,\n    room,\n    areaIndex,\n    name: displayName,\n    items,\n    itemsRequired: itemsRequired || items.length,\n    reward,\n  };\n}\n\n/** Parse Community Center bundle definitions, completion status, and room summaries from the save file root and pre-computed mail flags. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseBundles(root: any, mail: Set<string>): SaveBundleData {\n  // Step 1: Parse bundle definitions from bundleData (root-level)\n  const bundleDefs = new Map<number, ParsedBundleDef>();\n  const bundleDataItems = extractDictItems(root.bundleData);\n  for (const item of bundleDataItems) {\n    const key = item.key as Record<string, unknown>;\n    const val = item.value as Record<string, unknown>;\n    const keyStr = String(key?.string ?? '');\n    const valStr = String(val?.string ?? '');\n    if (keyStr && valStr) {\n      const def = parseBundleDef(keyStr, valStr);\n      bundleDefs.set(def.bundleIndex, def);\n    }\n  }\n\n  // Step 2: Parse completion slots from CommunityCenter location\n  const slotMap = new Map<number, boolean[]>();\n  let areasComplete: boolean[] = [];\n\n  const locations = ensureArray(root.locations?.GameLocation);\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    if ((l.name as string) !== 'CommunityCenter') continue;\n\n    const bundleItems = extractDictItems(l.bundles);\n    for (const item of bundleItems) {\n      const key = item.key as Record<string, unknown>;\n      const val = item.value as Record<string, unknown>;\n      const booleans = ensureArray((val?.ArrayOfBoolean as Record<string, unknown>)?.boolean);\n      const slots = booleans.map((b) => b === true || b === 'true');\n      slotMap.set(num(key?.int), slots);\n    }\n\n    const areasBooleans = ensureArray((l.areasComplete as Record<string, unknown>)?.boolean);\n    areasComplete = areasBooleans.map((b) => b === true || b === 'true');\n    break;\n  }\n\n  // Step 3: Merge definitions with completion data\n  const bundles: SaveBundleStatus[] = [];\n  for (const [index, def] of bundleDefs) {\n    const slots = slotMap.get(index) ?? [];\n\n    const items: SaveBundleItem[] = def.items.map((reqItem, i) => {\n      const isGold = reqItem.itemId === '-1';\n      return {\n        itemId: reqItem.itemId,\n        name: isGold ? `${reqItem.quantity.toLocaleString()}g` : resolveItemName(reqItem.itemId),\n        quantity: reqItem.quantity,\n        quality: reqItem.quality,\n        qualityName: QUALITY_NAMES[reqItem.quality] ?? `Quality ${reqItem.quality}`,\n        completed: slots[i] === true,\n      };\n    });\n\n    const itemsCompleted = items.filter((it) => it.completed).length;\n\n    bundles.push({\n      id: `${def.room}/${index}`,\n      bundleIndex: index,\n      name: def.name,\n      items,\n      itemsRequired: def.itemsRequired,\n      itemsCompleted,\n      complete: itemsCompleted >= def.itemsRequired,\n      reward: def.reward,\n    });\n  }\n\n  // Sort bundles by index for consistent output\n  bundles.sort((a, b) => a.bundleIndex - b.bundleIndex);\n\n  // Step 4: Build room summaries\n  const roomMap = new Map<number, SaveBundleStatus[]>();\n  for (const bundle of bundles) {\n    const def = bundleDefs.get(bundle.bundleIndex)!;\n    const existing = roomMap.get(def.areaIndex) ?? [];\n    existing.push(bundle);\n    roomMap.set(def.areaIndex, existing);\n  }\n\n  const rooms: SaveBundleRoom[] = [];\n  for (const [areaIndex, roomBundles] of roomMap) {\n    rooms.push({\n      name: AREA_NAMES[areaIndex] ?? `Area ${areaIndex}`,\n      areaIndex,\n      complete: areasComplete[areaIndex] === true,\n      bundles: roomBundles,\n    });\n  }\n  rooms.sort((a, b) => a.areaIndex - b.areaIndex);\n\n  const isJojaRoute = JOJA_MAIL_FLAGS.some((f) => mail.has(f));\n  const isCCComplete = mail.has('ccIsComplete');\n\n  return { rooms, isJojaRoute, isCCComplete };\n}\n","import type { SaveCommunityCenter } from '../../types';\n\n/** Parse Community Center status using pre-computed mail flags and events. */\nexport function parseCommunityCenter(mail: Set<string>, events: Set<string>): SaveCommunityCenter {\n  return {\n    unlocked: mail.has('ccDoorUnlock'),\n    bundlesActive: mail.has('wizardJunimoNote'),\n    completed: mail.has('ccIsComplete'),\n    ceremonyAttended: events.has('191393'),\n    jojaAbandoned: mail.has('abandonedJojaMartAccessible'),\n    rooms: {\n      boilerRoom: mail.has('ccBoilerRoom'),\n      craftsRoom: mail.has('ccCraftsRoom'),\n      pantry: mail.has('ccPantry'),\n      fishTank: mail.has('ccFishTank'),\n      vault: mail.has('ccVault'),\n      bulletin: mail.has('ccBulletin'),\n    },\n  };\n}\n","import type { Season } from '@/types';\nimport type { SaveDate } from '../../types';\nimport { num, str } from '../util';\n\nfunction getStatDaysPlayed(player: Record<string, unknown>): number {\n  const stats = player.stats as Record<string, unknown> | undefined;\n  if (!stats) return 0;\n  const values = stats.Values as Record<string, unknown> | undefined;\n  if (!values) return 0;\n  const items = Array.isArray(values.item) ? values.item : [values.item];\n  for (const item of items) {\n    const i = item as Record<string, unknown>;\n    const key = (i.key as Record<string, unknown>)?.string;\n    if (key === 'daysPlayed') {\n      return num((i.value as Record<string, unknown>)?.unsignedInt);\n    }\n  }\n  return 0;\n}\n\n/** Extract the current in-game date (year, season, day, total days played) from the player node and save file root. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseDate(player: any, root: any): SaveDate {\n  return {\n    year: num(root.year),\n    season: str(root.currentSeason) as Season,\n    day: num(root.dayOfMonth),\n    totalDaysPlayed: getStatDaysPlayed(player),\n  };\n}\n","import type { SaveChild, SaveHorse, SavePet } from '../../types';\nimport { ensureArray, num, str } from '../util';\n\n/** Parse child NPC data from the FarmHouse location in the save file root. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseChildren(root: any): SaveChild[] {\n  const result: SaveChild[] = [];\n  const locations = ensureArray(root.locations?.GameLocation);\n\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    const name = str(l.name);\n    if (name !== 'FarmHouse') continue;\n\n    const characters = ensureArray((l.characters as Record<string, unknown>)?.NPC);\n\n    for (const npc of characters) {\n      const n = npc as Record<string, string>;\n      const xsiType = n['@_xsi:type'] ?? n['@_type'] ?? '';\n      if (xsiType !== 'Child') continue;\n\n      result.push({\n        name: str(n.name),\n        age: num(n.daysOld),\n        gender: str(n.Gender, 'Unknown'),\n      });\n    }\n    break;\n  }\n  return result;\n}\n\n/** Find and parse all pets from Farm or FarmHouse locations.\n *  The pet matching the player's `whichPetType` and `whichPetBreed` is tagged `starter: true`. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parsePets(root: any, player: any): SavePet[] {\n  const results: SavePet[] = [];\n  const starterType = str(player?.whichPetType);\n  const starterBreed = num(player?.whichPetBreed);\n  const locations = ensureArray(root.locations?.GameLocation);\n\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    const name = str(l.name);\n    if (name !== 'Farm' && name !== 'FarmHouse') continue;\n\n    const characters = ensureArray((l.characters as Record<string, unknown>)?.NPC);\n\n    for (const npc of characters) {\n      const n = npc as Record<string, unknown>;\n      const xsiType = str(\n        (n as Record<string, string>)['@_xsi:type'] ?? (n as Record<string, string>)['@_type'],\n      );\n      if (xsiType !== 'Pet' && xsiType !== 'Cat' && xsiType !== 'Dog') continue;\n\n      const type = str(n.petType, xsiType);\n      const breed = num(n.whichBreed);\n      results.push({\n        name: str(n.name),\n        type,\n        breed,\n        friendship: num(n.friendshipTowardFarmer),\n        starter: type === starterType && breed === starterBreed,\n      });\n    }\n  }\n  return results;\n}\n\n/** Find and parse the player's horse from Farm location in the save file root. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseHorse(root: any): SaveHorse | null {\n  const locations = ensureArray(root.locations?.GameLocation);\n\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    const name = str(l.name);\n    if (name !== 'Farm') continue;\n\n    const characters = ensureArray((l.characters as Record<string, unknown>)?.NPC);\n\n    for (const npc of characters) {\n      const n = npc as Record<string, unknown>;\n      const xsiType = str(\n        (n as Record<string, string>)['@_xsi:type'] ?? (n as Record<string, string>)['@_type'],\n      );\n      if (xsiType !== 'Horse') continue;\n\n      return {\n        name: str(n.name),\n        type: 'horse',\n        id: str(n.HorseId),\n      };\n    }\n  }\n  return null;\n}\n","import type { SaveFishEntry } from '../../types';\nimport { ensureArray, extractDictItems, normalizeItemId, num, str } from '../util';\n\n/** Parse the fish-caught dictionary from the player node into catch counts and largest sizes. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseFishCaught(fishCaught: any): SaveFishEntry[] {\n  const result: SaveFishEntry[] = [];\n  for (const item of extractDictItems(fishCaught)) {\n    const key = item.key as Record<string, unknown>;\n    const val = item.value as Record<string, unknown>;\n    const id = normalizeItemId(str(key?.string));\n    if (!id) continue;\n\n    const ints = ensureArray((val?.ArrayOfInt as Record<string, unknown>)?.int).map(num);\n\n    result.push({\n      id,\n      timesCaught: ints[0] ?? 0,\n      largestSize: ints[1] ?? -1,\n    });\n  }\n  return result;\n}\n","import type { SaveFriendship } from '../../types';\nimport { extractDictItems, num, str } from '../util';\n\n/** Parse the friendship dictionary from the player node into sorted friendship entries with hearts. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseFriendships(friendshipData: any): SaveFriendship[] {\n  const result: SaveFriendship[] = [];\n  for (const item of extractDictItems(friendshipData)) {\n    const key = item.key as Record<string, unknown>;\n    const val = item.value as Record<string, unknown>;\n    const name = str(key?.string);\n    if (!name) continue;\n\n    const friendship = val?.Friendship as Record<string, unknown>;\n    const points = num(friendship?.Points);\n\n    result.push({\n      name,\n      points,\n      hearts: Math.floor(points / 250),\n      status: str(friendship?.Status, 'Friendly'),\n      giftsThisWeek: num(friendship?.GiftsThisWeek),\n    });\n  }\n  return result.sort((a, b) => b.points - a.points);\n}\n","import type { SaveItem } from '../../types';\nimport { ensureArray, normalizeItemId, num, str } from '../util';\n\n/** Parse the player's inventory items from the player node, including stack size and quality. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseInventory(items: any): SaveItem[] {\n  const result: SaveItem[] = [];\n  for (const item of ensureArray(items?.Item)) {\n    const i = item as Record<string, unknown>;\n    const name = str(i.name);\n    if (!name) continue;\n\n    const xsiType = str(\n      (i as Record<string, string>)['@_xsi:type'] ?? (i as Record<string, string>)['@_type'],\n    );\n\n    result.push({\n      id: normalizeItemId(str(i.itemId)),\n      name,\n      type: xsiType,\n      stack: num(i.stack) || 1,\n      quality: num(i.quality),\n    });\n  }\n  return result;\n}\n","[\n  {\n    \"id\": \"Island_FirstParrot\",\n    \"name\": \"Ginger Island North\",\n    \"description\": \"Feed Leo's parrot friend to unlock access to the north side of the island.\",\n    \"cost\": 1,\n    \"location\": \"Leo's Hut\"\n  },\n  {\n    \"id\": \"Island_Turtle\",\n    \"name\": \"Ginger Island West\",\n    \"description\": \"A turtle ferries the player to the western island region.\",\n    \"cost\": 10,\n    \"location\": \"Leo's Hut area\"\n  },\n  {\n    \"id\": \"Island_UpgradeHouse\",\n    \"name\": \"Island Farmhouse\",\n    \"description\": \"Provides sleeping quarters on the west side of the island so the player can stay overnight.\",\n    \"cost\": 20,\n    \"location\": \"Ginger Island West\"\n  },\n  {\n    \"id\": \"Island_Resort\",\n    \"name\": \"Island Resort\",\n    \"description\": \"Unlocks the beach resort on the south side of the island. Villagers can visit.\",\n    \"cost\": 20,\n    \"location\": \"Island South\"\n  },\n  {\n    \"id\": \"Island_UpgradeTrader\",\n    \"name\": \"Island Trader\",\n    \"description\": \"Unlocks the Island Trader shop on the north side of the island.\",\n    \"cost\": 10,\n    \"location\": \"Island North\"\n  },\n  {\n    \"id\": \"Island_UpgradeBridge\",\n    \"name\": \"Dig Site Bridge\",\n    \"description\": \"Repairs the bridge to access the island dig site.\",\n    \"cost\": 10,\n    \"location\": \"Island North\"\n  },\n  {\n    \"id\": \"Island_UpgradeParrotPlatform\",\n    \"name\": \"Parrot Express\",\n    \"description\": \"Enables the fast-travel parrot platform system around the island.\",\n    \"cost\": 10,\n    \"location\": \"Ginger Island (multiple stops)\"\n  },\n  {\n    \"id\": \"Island_UpgradeHouse_Mailbox\",\n    \"name\": \"Farmhouse Mailbox\",\n    \"description\": \"Adds a mailbox to the island farmhouse so the player can receive mail.\",\n    \"cost\": 5,\n    \"location\": \"Island Farmhouse\"\n  },\n  {\n    \"id\": \"Island_W_Obelisk\",\n    \"name\": \"Farm Obelisk\",\n    \"description\": \"Builds an obelisk near the island farmhouse that teleports the player back to the farm.\",\n    \"cost\": 20,\n    \"location\": \"Island Farmhouse\"\n  },\n  {\n    \"id\": \"Island_VolcanoBridge\",\n    \"name\": \"Volcano Bridge\",\n    \"description\": \"Builds a permanent bridge at the volcano dungeon entrance.\",\n    \"cost\": 5,\n    \"location\": \"Volcano Dungeon entrance\"\n  },\n  {\n    \"id\": \"Island_VolcanoShortcutOut\",\n    \"name\": \"Volcano Exit Shortcut\",\n    \"description\": \"Creates a shortcut exit passage on volcano dungeon level 5.\",\n    \"cost\": 5,\n    \"location\": \"Volcano Dungeon level 5\"\n  }\n]\n","import upgradeData from '@/data/island-upgrades.json';\nimport type { SaveIslandUpgrades } from '../../types';\n\nconst UPGRADE_IDS = upgradeData.map((u: { id: string }) => u.id);\n\n/** Parse Ginger Island upgrade status using pre-computed mail flags. */\nexport function parseIslandUpgrades(mail: Set<string>): SaveIslandUpgrades {\n  return UPGRADE_IDS.map((id) => ({\n    id,\n    unlocked: mail.has(id),\n  }));\n}\n","[\n  {\n    \"id\": \"jojaPantry\",\n    \"name\": \"Greenhouse\",\n    \"description\": \"Repairs the old ruins on the farm, turning it into a greenhouse.\",\n    \"cost\": 35000,\n    \"ccEquivalent\": \"ccPantry\",\n    \"order\": 0\n  },\n  {\n    \"id\": \"jojaCraftsRoom\",\n    \"name\": \"Bridge\",\n    \"description\": \"Repairs the broken bridge east of the Mines, enabling access to the Quarry.\",\n    \"cost\": 25000,\n    \"ccEquivalent\": \"ccCraftsRoom\",\n    \"order\": 1\n  },\n  {\n    \"id\": \"jojaFishTank\",\n    \"name\": \"Panning\",\n    \"description\": \"Removes the glimmering boulder near the mine entrance, enabling copper panning.\",\n    \"cost\": 20000,\n    \"ccEquivalent\": \"ccFishTank\",\n    \"order\": 2\n  },\n  {\n    \"id\": \"jojaBoilerRoom\",\n    \"name\": \"Minecarts\",\n    \"description\": \"Repairs the minecart system between the Bus Stop, the Mountains, and Pelican Town.\",\n    \"cost\": 15000,\n    \"ccEquivalent\": \"ccBoilerRoom\",\n    \"order\": 3\n  },\n  {\n    \"id\": \"jojaVault\",\n    \"name\": \"Bus\",\n    \"description\": \"Repairs the bus that runs to the Calico Desert.\",\n    \"cost\": 40000,\n    \"ccEquivalent\": \"ccVault\",\n    \"order\": 4\n  }\n]\n","import developmentData from '@/data/joja-development.json';\nimport type { SaveJoja } from '../../types';\n\nconst DEVELOPMENT_IDS = developmentData.map((d: { id: string }) => d.id);\n\n/** Parse Joja membership, development project completion, and route status. */\nexport function parseJoja(mail: Set<string>, events: Set<string>): SaveJoja {\n  return {\n    isMember: mail.has('JojaMember'),\n    completed: events.has('502261'),\n    developments: DEVELOPMENT_IDS.map((id) => ({\n      id,\n      purchased: mail.has(id),\n    })),\n  };\n}\n","import specialOrdersData from '@/data/special-orders.json';\nimport type { SaveSpecialOrders } from '../../types';\nimport { ensureArray, str } from '../util';\n\nconst QI_ORDER_IDS = new Set(\n  (specialOrdersData as Array<{ id: string; type: string }>)\n    .filter((o) => o.type === 'qi')\n    .map((o) => o.id),\n);\n\n/** Parse the list of received mail flags from the player's mailReceived node. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseMail(mailReceived: any): string[] {\n  return ensureArray(mailReceived?.string)\n    .map((m) => str(m))\n    .filter(Boolean);\n}\n\n/** Parse completed special orders from the save file root, split into town and Qi categories. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseSpecialOrders(root: any): SaveSpecialOrders {\n  const completed = ensureArray(root.completedSpecialOrders?.string)\n    .map((m) => str(m))\n    .filter(Boolean);\n\n  const qiCompleted = completed.filter((id) => QI_ORDER_IDS.has(id));\n\n  return { completed, qiCompleted };\n}\n\n/** Extract the list of books read from the player node's stats. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseBooksRead(player: any): string[] {\n  const books: string[] = [];\n  const items = ensureArray(player.stats?.Values?.item) as Array<Record<string, unknown>>;\n  for (const item of items) {\n    const key = String((item.key as Record<string, unknown>)?.string ?? '');\n    if (key.startsWith('Book_')) {\n      books.push(key.replace('Book_', ''));\n    }\n  }\n  return books;\n}\n","import type { SaveMineProgress } from '../../types';\nimport { num } from '../util';\n\n/** Parse mine and Skull Cavern progress from the player node, save file root, and mail flags. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseMineProgress(player: any, root: any, mail: Set<string>): SaveMineProgress {\n  const deepest = num(player.deepestMineLevel);\n  return {\n    deepestMineLevel: Math.min(deepest, 120),\n    deepestSkullCavernLevel: deepest > 120 ? deepest - 120 : 0,\n    hasRustyKey:\n      mail.has('HasRustyKey') ||\n      mail.has('ccBoilerRoom') ||\n      num(root.mine_lowestLevelReached) >= 120,\n    hasSkullKey: mail.has('HasSkullKey') || deepest >= 120,\n  };\n}\n","import type { SaveMonsterKillEntry } from '../../types';\nimport { extractDictItems, num, str } from '../util';\n\n/** Parse per-monster kill counts from the player node's stats, sorted by count descending. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseMonstersKilled(player: any): SaveMonsterKillEntry[] {\n  const result: SaveMonsterKillEntry[] = [];\n  const items = extractDictItems(player.stats?.specificMonstersKilled);\n\n  for (const item of items) {\n    const key = item.key as Record<string, unknown>;\n    const val = item.value as Record<string, unknown>;\n    const name = str(key?.string);\n    if (!name) continue;\n\n    result.push({\n      name,\n      count: num(val?.int),\n    });\n  }\n  return result.sort((a, b) => b.count - a.count);\n}\n","import type { SaveCollectionEntry, SaveMuseum } from '../../types';\nimport { ensureArray, extractDictItems, num, str } from '../util';\n\nfunction parseDonations(root: Record<string, unknown>): string[] {\n  const locations = ensureArray((root.locations as Record<string, unknown>)?.GameLocation);\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    if (str(l.name) !== 'ArchaeologyHouse') continue;\n\n    const pieces = ensureArray((l.museumPieces as Record<string, unknown>)?.item);\n    return pieces\n      .map((p) => {\n        const item = p as Record<string, unknown>;\n        const val = item.value as Record<string, unknown>;\n        return str(val?.string);\n      })\n      .filter(Boolean);\n  }\n  return [];\n}\n\nfunction parseFoundItems(data: unknown): SaveCollectionEntry[] {\n  const result: SaveCollectionEntry[] = [];\n  for (const item of extractDictItems(data)) {\n    const key = item.key as Record<string, unknown>;\n    const val = item.value as Record<string, unknown>;\n    const id = str(key?.string);\n    if (!id) continue;\n\n    // archaeologyFound has ArrayOfInt [timesFound, timesDonated]\n    // mineralsFound has just int count\n    let count: number;\n    const arr = val?.ArrayOfInt as Record<string, unknown> | undefined;\n    if (arr) {\n      const ints = ensureArray(arr.int).map(num);\n      count = ints[0] ?? 0;\n    } else {\n      count = num(val?.int);\n    }\n\n    result.push({ id, count });\n  }\n  return result;\n}\n\n/** Parse museum donations, artifacts found, and minerals found from the save file root and player node. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseMuseum(root: any, player: any): SaveMuseum {\n  return {\n    donations: parseDonations(root),\n    artifactsFound: parseFoundItems(player.archaeologyFound),\n    mineralsFound: parseFoundItems(player.mineralsFound),\n  };\n}\n","import type { SavePerfection } from '../../types';\nimport { ensureArray, num, str } from '../util';\n\nconst OBELISK_TYPES = ['Earth Obelisk', 'Water Obelisk', 'Desert Obelisk', 'Island Obelisk'];\n\n/** Parse perfection tracker data from the save file root, including Gold Clock and obelisk status. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parsePerfection(root: any): SavePerfection {\n  const locations = ensureArray(root.locations?.GameLocation);\n  let hasGoldClock = false;\n  const obelisks: string[] = [];\n\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    if (str(l.name) !== 'Farm') continue;\n\n    const buildings = ensureArray((l.buildings as Record<string, unknown>)?.Building);\n    for (const building of buildings) {\n      const b = building as Record<string, unknown>;\n      const btype = str(b.buildingType);\n      if (btype === 'Gold Clock') hasGoldClock = true;\n      if (OBELISK_TYPES.includes(btype) && !obelisks.includes(btype)) {\n        obelisks.push(btype);\n      }\n    }\n    break;\n  }\n\n  return {\n    farmPerfect: root.farmPerfect === true || root.farmPerfect === 'true',\n    waivers: num(root.perfectionWaivers),\n    hasGoldClock,\n    obelisks,\n  };\n}\n","import type {\n  SaveMastery,\n  SaveMasteryPerk,\n  SavePlayer,\n  SaveSkills,\n  SaveToolLevel,\n  SaveToolLevels,\n  SaveUpgradingTool,\n} from '../../types';\nimport { ensureArray, num, str } from '../util';\n\nconst XP_THRESHOLDS = [0, 100, 380, 770, 1300, 2150, 3300, 4800, 6900, 10000, 15000];\n\nfunction xpToLevel(xp: number): number {\n  let level = 0;\n  for (let i = XP_THRESHOLDS.length - 1; i >= 0; i--) {\n    if (xp >= XP_THRESHOLDS[i]) {\n      level = i;\n      break;\n    }\n  }\n  return level;\n}\n\nfunction parseSkills(xpArray: unknown): SaveSkills {\n  const xpValues = ensureArray(xpArray);\n  const xp = xpValues.map(num);\n  return {\n    farming: { level: xpToLevel(xp[0] ?? 0), xp: xp[0] ?? 0 },\n    fishing: { level: xpToLevel(xp[1] ?? 0), xp: xp[1] ?? 0 },\n    foraging: { level: xpToLevel(xp[2] ?? 0), xp: xp[2] ?? 0 },\n    mining: { level: xpToLevel(xp[3] ?? 0), xp: xp[3] ?? 0 },\n    combat: { level: xpToLevel(xp[4] ?? 0), xp: xp[4] ?? 0 },\n  };\n}\n\nfunction getStatValue(stats: Record<string, unknown>, key: string): number {\n  const items = ensureArray((stats?.Values as Record<string, unknown>)?.item) as Array<\n    Record<string, unknown>\n  >;\n  for (const item of items) {\n    const k = (item.key as Record<string, unknown>)?.string;\n    if (k === key) {\n      return num((item.value as Record<string, unknown>)?.unsignedInt);\n    }\n  }\n  return 0;\n}\n\nconst MASTERY_PERKS: Array<{ statKey: string; id: string; name: string }> = [\n  { statKey: 'mastery_0', id: 'farming', name: 'Farming Mastery' },\n  { statKey: 'mastery_1', id: 'fishing', name: 'Fishing Mastery' },\n  { statKey: 'mastery_2', id: 'foraging', name: 'Foraging Mastery' },\n  { statKey: 'mastery_3', id: 'mining', name: 'Mining Mastery' },\n  { statKey: 'mastery_4', id: 'combat', name: 'Combat Mastery' },\n];\n\nfunction parseMastery(stats: Record<string, unknown>): SaveMastery {\n  const perks: SaveMasteryPerk[] = MASTERY_PERKS.map(({ statKey, id, name }) => ({\n    id,\n    name,\n    unlocked: getStatValue(stats, statKey) > 0,\n  }));\n\n  return {\n    xp: getStatValue(stats, 'MasteryExp'),\n    levelsSpent: getStatValue(stats, 'masteryLevelsSpent'),\n    perks,\n  };\n}\n\nconst TOOL_TYPES = ['WateringCan', 'Pan', 'Pickaxe', 'Axe', 'Hoe', 'FishingRod'] as const;\nconst TOOL_KEY_MAP: Record<string, SaveUpgradingTool['tool']> = {\n  WateringCan: 'wateringCan',\n  Pan: 'pan',\n  Pickaxe: 'pickaxe',\n  Axe: 'axe',\n  Hoe: 'hoe',\n};\n\nconst FISHING_ROD_LEVEL: Record<string, number> = {\n  TrainingRod: 0,\n  BambooPole: 1,\n  FiberglassRod: 2,\n  IridiumRod: 3,\n  AdvancedIridiumRod: 4,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction collectToolItems(node: any, depth = 0): any[] {\n  if (!node || typeof node !== 'object' || depth > 20) return [];\n  const results: unknown[] = [];\n  if (Array.isArray(node)) {\n    for (const child of node) results.push(...collectToolItems(child, depth + 1));\n    return results;\n  }\n  const obj = node as Record<string, unknown>;\n  const xsiType =\n    (obj as Record<string, string>)['@_xsi:type'] ??\n    (obj as Record<string, string>)['@_type'] ??\n    '';\n  if (TOOL_TYPES.includes(xsiType as (typeof TOOL_TYPES)[number])) {\n    results.push(obj);\n  }\n  for (const key of [\n    'Item',\n    'items',\n    'objects',\n    'item',\n    'Object',\n    'value',\n    'GameLocation',\n    'Building',\n    'buildings',\n    'indoors',\n    'heldObject',\n  ]) {\n    if (obj[key]) results.push(...collectToolItems(obj[key], depth + 1));\n  }\n  return results;\n}\n\nfunction getEnchantmentName(item: Record<string, unknown>): string | null {\n  const enc = item.enchantments;\n  if (!enc) return null;\n  const first = Array.isArray(enc) ? enc[0] : enc;\n  if (!first || typeof first !== 'object') return null;\n  const xsiType = (first as Record<string, string>)['@_xsi:type'] ?? '';\n  return xsiType.replace(/Enchantment$/, '') || null;\n}\n\nfunction toolLevel(level: number, enchantment: string | null = null): SaveToolLevel {\n  return { level, enchantment };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseToolLevels(player: any, root: any): SaveToolLevels {\n  const levels: SaveToolLevels = {\n    wateringCan: toolLevel(0),\n    pan: toolLevel(0),\n    pickaxe: toolLevel(0),\n    axe: toolLevel(0),\n    hoe: toolLevel(0),\n    trashCan: toolLevel(num(player.trashCanLevel)),\n    fishingRod: toolLevel(-1),\n    currentlyUpgrading: null,\n  };\n\n  // If a tool is at the blacksmith, it's absent from inventory.\n  // upgradeLevel in the XML is the target level, so current = target - 1.\n  // Pan's upgradeLevel is off by an extra 1 in the save file, so pan uses target - 2.\n  const upgrading = player.toolBeingUpgraded as Record<string, unknown> | undefined;\n  if (upgrading) {\n    const xsiType =\n      (upgrading['@_xsi:type'] as string | undefined) ??\n      (upgrading['@_type'] as string | undefined) ??\n      '';\n    const key = TOOL_KEY_MAP[xsiType] as SaveUpgradingTool['tool'] | undefined;\n    if (key) {\n      const offset = key === 'pan' ? 2 : 1;\n      const currentLevel = num(upgrading.upgradeLevel) - offset;\n      if (currentLevel > levels[key].level) {\n        levels[key] = toolLevel(currentLevel, getEnchantmentName(upgrading));\n      }\n      levels.currentlyUpgrading = { tool: key, name: str(upgrading.name as string) };\n    }\n  }\n\n  const allItems = [\n    ...collectToolItems(player.items),\n    ...collectToolItems(root.locations?.GameLocation),\n  ];\n\n  for (const item of allItems) {\n    const i = item as Record<string, unknown>;\n    const xsiType = (i['@_xsi:type'] as string) ?? (i['@_type'] as string) ?? '';\n    const key = TOOL_KEY_MAP[xsiType];\n    if (key) {\n      const level = num(i.upgradeLevel);\n      if (level > levels[key].level) {\n        levels[key] = toolLevel(level, getEnchantmentName(i));\n      }\n    } else if (xsiType === 'FishingRod') {\n      const rodLevel = FISHING_ROD_LEVEL[i.itemId as string] ?? -1;\n      if (rodLevel > levels.fishingRod.level) {\n        levels.fishingRod = toolLevel(rodLevel, getEnchantmentName(i));\n      }\n    }\n  }\n\n  return levels;\n}\n\n/** Parse core player info, skills, and mastery data from the player node and save file root. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parsePlayer(player: any, root: any, mail: Set<string>): SavePlayer {\n  return {\n    name: str(player.name),\n    farmName: str(player.farmName),\n    favoriteThing: str(player.favoriteThing),\n    gender: str(player.Gender),\n    money: num(player.money),\n    totalMoneyEarned: num(player.totalMoneyEarned),\n    spouse: player.spouse ? str(player.spouse) : null,\n    houseUpgradeLevel: num(player.houseUpgradeLevel),\n    luckLevel: num(player.luckLevel),\n    maxItems: num(player.maxItems),\n    maxHealth: num(player.maxHealth),\n    maxStamina: num(player.maxStamina),\n    skills: parseSkills(player.experiencePoints?.int),\n    mastery: parseMastery(player.stats),\n    toolLevels: parseToolLevels(player, root),\n    willyBackRoomInvitation: mail.has('willyBackRoomInvitation'),\n    lostBooksFound: num(root.lostBooksFound),\n    helpWantedQuests: getStatValue(player.stats, 'questsCompleted'),\n    gameVersion: str(root.gameVersion),\n    millisecondsPlayed: num(player.millisecondsPlayed),\n  };\n}\n","import specialItemsData from '@/data/special-items.json';\nimport type { SavePowerEntry, SavePowers } from '../../types';\n\ninterface SpecialItemDef {\n  id: string;\n  name: string;\n  type: string;\n  mailFlags?: string[];\n  eventFlags?: string[];\n}\n\nconst POWER_ITEMS = (specialItemsData as SpecialItemDef[]).filter(\n  (item) => item.type === 'special-item',\n);\n\n/** Additional power entries not represented as special items in the data (arcade victories). */\nconst EXTRA_POWERS: Array<{\n  id: string;\n  name: string;\n  check: (mail: Set<string>) => boolean;\n}> = [\n  { id: 'Beat_PK', name: 'Prairie King Victory', check: (m) => m.has('Beat_PK') },\n  { id: 'JunimoKart', name: 'Junimo Kart Victory', check: (m) => m.has('JunimoKart') },\n];\n\n/** Parse special item acquisition status using pre-computed mail flags and events. */\nexport function parsePowers(mail: Set<string>, events: Set<string>): SavePowers {\n  const specialItems: SavePowerEntry[] = POWER_ITEMS.map((item) => {\n    const mailMatch = item.mailFlags?.some((f) => mail.has(f)) ?? false;\n    const eventMatch = item.eventFlags?.some((f) => events.has(f)) ?? false;\n    return {\n      id: item.id,\n      name: item.name,\n      acquired: mailMatch || eventMatch,\n    };\n  });\n\n  for (const extra of EXTRA_POWERS) {\n    specialItems.push({\n      id: extra.id,\n      name: extra.name,\n      acquired: extra.check(mail),\n    });\n  }\n\n  return { specialItems };\n}\n","import professionsData from '@/data/professions.json';\nimport type { SaveProfession } from '../../types';\nimport { ensureArray, num } from '../util';\n\nconst PROFESSION_NAMES = new Map(\n  (professionsData as Array<{ id: string; name: string }>).map((p) => [parseInt(p.id, 10), p.name]),\n);\n\n/** Parse the player's unlocked professions from the professions node into named entries. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseProfessions(professions: any): SaveProfession[] {\n  return ensureArray(professions?.int).map((raw) => {\n    const id = num(raw);\n    return { id, name: PROFESSION_NAMES.get(id) ?? `Unknown(${id})` };\n  });\n}\n","import type { SaveQuest } from '../../types';\nimport { ensureArray, num, str } from '../util';\n\n/** Parse active quests from the player's quest log. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseQuests(questLog: any): SaveQuest[] {\n  const result: SaveQuest[] = [];\n  for (const quest of ensureArray(questLog?.Quest)) {\n    const q = quest as Record<string, unknown>;\n    result.push({\n      id: str(q.id),\n      title: str(q.questTitle),\n      description: str(q._questDescription),\n      type: num(q.questType),\n      completed: q.completed === true || q.completed === 'true',\n    });\n  }\n  return result;\n}\n","import type { SaveRaccoons } from '../../types';\nimport { num } from '../util';\n\n/** Parse raccoon quest progress from the save file root and pre-computed mail flags. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseRaccoons(root: any, mail: Set<string>): SaveRaccoons {\n  return {\n    timesFed: num(root.timesFedRaccoons),\n    daysPlayedWhenLastFinished: num(root.daysPlayedWhenLastRaccoonBundleWasFinished),\n    treeFallen: mail.has('raccoonTreeFallen'),\n    movedIn: mail.has('raccoonMovedIn'),\n  };\n}\n","import type { SaveRarecrows } from '../../types';\nimport { ensureArray, extractDictItems, str } from '../util';\n\nfunction collectFromItems(items: unknown, ids: Set<string>): void {\n  for (const item of ensureArray(items as unknown[])) {\n    const it = item as Record<string, unknown>;\n    if (str(it.name) === 'Rarecrow') {\n      ids.add(str(it.itemId));\n    }\n  }\n}\n\nfunction collectFromObjects(objects: unknown, ids: Set<string>): void {\n  for (const { value } of extractDictItems(objects)) {\n    const obj = (value as Record<string, unknown>)?.Object as Record<string, unknown>;\n    if (!obj) continue;\n    if (str(obj.name) === 'Rarecrow') {\n      ids.add(str(obj.itemId));\n    }\n    // Also check items stored inside chests and other containers\n    if (obj.items) {\n      collectFromItems((obj.items as Record<string, unknown>).Item, ids);\n    }\n  }\n}\n\n/** Parse all placed rarecrow item IDs from every game location (including building interiors). */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseRarecrows(root: any): SaveRarecrows {\n  const ids = new Set<string>();\n  const locations = ensureArray(root.locations?.GameLocation);\n\n  for (const loc of locations) {\n    const l = loc as Record<string, unknown>;\n    collectFromObjects(l.objects, ids);\n\n    const buildings = ensureArray((l.buildings as Record<string, unknown>)?.Building);\n    for (const building of buildings) {\n      const b = building as Record<string, unknown>;\n      collectFromObjects((b.indoors as Record<string, unknown>)?.objects, ids);\n    }\n  }\n\n  return { placed: Array.from(ids) };\n}\n","import cookingData from '@/data/cooking.json';\nimport type { SaveRecipeEntry } from '../../types';\nimport { extractDictItems, num, str } from '../util';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseRecipes(data: any): SaveRecipeEntry[] {\n  const result: SaveRecipeEntry[] = [];\n  for (const item of extractDictItems(data)) {\n    const key = item.key as Record<string, unknown>;\n    const val = item.value as Record<string, unknown>;\n    const name = str(key?.string);\n    if (!name) continue;\n\n    result.push({\n      name,\n      timesMade: num(val?.int),\n    });\n  }\n  return result;\n}\n\nconst cookingIdToName = new Map<string, string>(\n  (cookingData as { id: string; name: string }[]).map((r) => [r.id, r.name]),\n);\n\n/**\n * Parse known cooking recipes and how many times each has been made.\n * cookingRecipes has recipe names as keys (tracks what is known, values are always 0).\n * recipesCooked has item IDs as keys with actual times-cooked counts.\n * We merge both: known list from cookingRecipes, counts from recipesCooked.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseCookingRecipes(knownData: any, cookedData: any): SaveRecipeEntry[] {\n  const cookedCounts = new Map<string, number>();\n  for (const item of extractDictItems(cookedData)) {\n    const key = item.key as Record<string, unknown>;\n    const val = item.value as Record<string, unknown>;\n    const id = str(key?.string);\n    if (id) cookedCounts.set(id, num(val?.int));\n  }\n\n  const cookedByName = new Map<string, number>();\n  for (const [id, count] of cookedCounts) {\n    const name = cookingIdToName.get(id);\n    if (name) cookedByName.set(name, count);\n  }\n\n  const result: SaveRecipeEntry[] = [];\n  for (const item of extractDictItems(knownData)) {\n    const key = item.key as Record<string, unknown>;\n    const name = str(key?.string);\n    if (!name) continue;\n    result.push({\n      name,\n      timesMade: cookedByName.get(name) ?? 0,\n    });\n  }\n  return result;\n}\n\n/** Parse known crafting recipes and how many times each has been crafted from the player node. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseCraftingRecipes(data: any): SaveRecipeEntry[] {\n  return parseRecipes(data);\n}\n","import type { SaveSecretNotes } from '../../types';\nimport { ensureArray, num } from '../util';\n\n/** Parse secret notes and journal scraps found from the player node and pre-computed mail flags. */\nexport function parseSecretNotes(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  player: any,\n  mail: Set<string>,\n  events: Set<string>,\n): SaveSecretNotes {\n  const allNotes = ensureArray(player.secretNotesSeen?.int).map(num);\n\n  return {\n    notesFound: allNotes.filter((n) => n < 1000),\n    journalScrapsFound: allNotes.filter((n) => n >= 1000).map((n) => n - 1000),\n    hasMagnifyingGlass:\n      mail.has('HasMagnifyingGlass') ||\n      player.hasMagnifyingGlass === true ||\n      player.hasMagnifyingGlass === 'true',\n    hasSeenKrobus: events.has('520702'),\n  };\n}\n","import type { SaveShippedEntry } from '../../types';\nimport { extractDictItems, normalizeItemId, num, str } from '../util';\n\n/** Parse the player's item shipping log with item IDs and total counts shipped. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseShipped(basicShipped: any): SaveShippedEntry[] {\n  const result: SaveShippedEntry[] = [];\n  for (const item of extractDictItems(basicShipped)) {\n    const key = item.key as Record<string, unknown>;\n    const val = item.value as Record<string, unknown>;\n    const id = normalizeItemId(str(key?.string));\n    if (!id) continue;\n\n    result.push({\n      id,\n      count: num(val?.int),\n    });\n  }\n  return result;\n}\n","import stardropData from '@/data/stardrops.json';\nimport type { SaveStardropEntry } from '../../types';\nimport { ensureArray, str } from '../util';\n\n/** Parse stardrop collection status by checking mail flags for each stardrop source. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseStardrops(mailReceived: any): SaveStardropEntry[] {\n  const mail = new Set(ensureArray(mailReceived?.string).map((m) => str(m)));\n  return (stardropData as Array<{ id: string; name: string }>).map((stardrop) => ({\n    id: stardrop.id,\n    name: stardrop.name,\n    collected: mail.has(stardrop.id),\n  }));\n}\n","import type { SaveStats } from '../../types';\nimport { ensureArray, num } from '../util';\n\n/** Parse lifetime gameplay statistics from the player node. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseStats(player: any): SaveStats {\n  const raw: Record<string, number> = {};\n  const items = ensureArray(player.stats?.Values?.item) as Array<Record<string, unknown>>;\n\n  for (const item of items) {\n    const key = (item.key as Record<string, unknown>)?.string as string;\n    const val = num((item.value as Record<string, unknown>)?.unsignedInt);\n    if (key) raw[key] = val;\n  }\n\n  return {\n    daysPlayed: raw.daysPlayed ?? 0,\n    stepsTaken: raw.stepsTaken ?? 0,\n    fishCaught: raw.fishCaught ?? 0,\n    itemsShipped: raw.itemsShipped ?? 0,\n    itemsForaged: raw.itemsForaged ?? 0,\n    itemsCrafted: raw.itemsCrafted ?? 0,\n    itemsCooked: raw.itemsCooked ?? 0,\n    monstersKilled: raw.monstersKilled ?? 0,\n    questsCompleted: raw.questsCompleted ?? 0,\n    geodesCracked: raw.geodesCracked ?? 0,\n    giftsGiven: raw.giftsGiven ?? 0,\n    timesFished: raw.timesFished ?? 0,\n    timesUnconscious: raw.timesUnconscious ?? 0,\n    seedsSown: raw.seedsSown ?? 0,\n    treesChopped: raw.TreesChopped ?? 0,\n    rocksCrushed: raw.rocksCrushed ?? 0,\n    raw,\n  };\n}\n","import type { SaveWalnuts } from '../../types';\nimport { ensureArray, num, str } from '../util';\n\n/** Parse golden walnut collection progress from the save file root. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseWalnuts(root: any): SaveWalnuts {\n  const collected = ensureArray(root.collectedNutTracker?.string)\n    .map((s) => str(s))\n    .filter(Boolean);\n\n  return {\n    found: num(root.goldenWalnutsFound),\n    collected,\n  };\n}\n","import { parseAchievements } from './parsers/v1/achievements';\nimport { parseAnimals, parseFishPonds } from './parsers/v1/animals';\nimport { parseBuildings } from './parsers/v1/buildings';\nimport { parseBundles } from './parsers/v1/bundles';\nimport { parseCommunityCenter } from './parsers/v1/community-center';\nimport { parseDate } from './parsers/v1/date';\nimport { parseChildren, parseHorse, parsePets } from './parsers/v1/family';\nimport { parseFishCaught } from './parsers/v1/fish';\nimport { parseFriendships } from './parsers/v1/friendships';\nimport { parseInventory } from './parsers/v1/inventory';\nimport { parseIslandUpgrades } from './parsers/v1/island-upgrades';\nimport { parseJoja } from './parsers/v1/joja';\nimport { parseBooksRead, parseSpecialOrders } from './parsers/v1/mail';\nimport { parseMineProgress } from './parsers/v1/mine-progress';\nimport { parseMonstersKilled } from './parsers/v1/monsters';\nimport { parseMuseum } from './parsers/v1/museum';\nimport { parsePerfection } from './parsers/v1/perfection';\nimport { parsePlayer } from './parsers/v1/player';\nimport { parsePowers } from './parsers/v1/powers';\nimport { parseProfessions } from './parsers/v1/professions';\nimport { parseQuests } from './parsers/v1/quests';\nimport { parseRaccoons } from './parsers/v1/raccoons';\nimport { parseRarecrows } from './parsers/v1/rarecrows';\nimport { parseCookingRecipes, parseCraftingRecipes } from './parsers/v1/recipes';\nimport { parseSecretNotes } from './parsers/v1/secret-notes';\nimport { parseShipped } from './parsers/v1/shipping';\nimport { parseStardrops } from './parsers/v1/stardrops';\nimport { parseStats } from './parsers/v1/stats';\nimport { parseWalnuts } from './parsers/v1/walnuts';\nimport type { SaveData } from './types';\n\n/** Shared context built once from the parsed XML, passed to all versioned parsers. */\nexport interface ParseContext {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  root: any;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  player: any;\n  mailArray: string[];\n  mailSet: Set<string>;\n  eventsSeen: string[];\n  eventsSet: Set<string>;\n}\n\n/** A versioned parser set: takes a ParseContext and returns all SaveData fields except apiVersion. */\ntype ParserSetFn = (ctx: ParseContext) => Omit<SaveData, 'apiVersion'>;\n\n/**\n * v1 parser set — the initial parser covering all game versions from 1.0.0 onward.\n * Each field maps to one of the individual parsers in `parsers/v1/`.\n */\nconst v1: ParserSetFn = (ctx) => ({\n  player: parsePlayer(ctx.player, ctx.root, ctx.mailSet),\n  farm: { type: ctx.root.whichFarm, name: ctx.player.farmName },\n  date: parseDate(ctx.player, ctx.root),\n  inventory: parseInventory(ctx.player.items),\n  fishCaught: parseFishCaught(ctx.player.fishCaught),\n  itemsShipped: parseShipped(ctx.player.basicShipped),\n  museum: parseMuseum(ctx.root, ctx.player),\n  friendships: parseFriendships(ctx.player.friendshipData),\n  achievements: parseAchievements(ctx.player.achievements),\n  activeQuests: parseQuests(ctx.player.questLog),\n  stardrops: parseStardrops(ctx.player.mailReceived),\n  stats: parseStats(ctx.player),\n  animals: parseAnimals(ctx.root),\n  fishPonds: parseFishPonds(ctx.root),\n  buildings: parseBuildings(ctx.root),\n  cookingRecipes: parseCookingRecipes(ctx.player.cookingRecipes, ctx.player.recipesCooked),\n  craftingRecipes: parseCraftingRecipes(ctx.player.craftingRecipes),\n  bundles: parseBundles(ctx.root, ctx.mailSet),\n  monstersKilled: parseMonstersKilled(ctx.player),\n  mail: ctx.mailArray,\n  specialOrders: parseSpecialOrders(ctx.root),\n  professions: parseProfessions(ctx.player.professions),\n  booksRead: parseBooksRead(ctx.player),\n  eventsSeen: ctx.eventsSeen,\n  secretNotes: parseSecretNotes(ctx.player, ctx.mailSet, ctx.eventsSet),\n  walnuts: parseWalnuts(ctx.root),\n  islandUpgrades: parseIslandUpgrades(ctx.mailSet),\n  children: parseChildren(ctx.root),\n  pets: parsePets(ctx.root, ctx.player),\n  horse: parseHorse(ctx.root),\n  powers: parsePowers(ctx.mailSet, ctx.eventsSet),\n  raccoons: parseRaccoons(ctx.root, ctx.mailSet),\n  rarecrows: parseRarecrows(ctx.root),\n  perfection: parsePerfection(ctx.root),\n  mineProgress: parseMineProgress(ctx.player, ctx.root, ctx.mailSet),\n  communityCenter: parseCommunityCenter(ctx.mailSet, ctx.eventsSet),\n  joja: parseJoja(ctx.mailSet, ctx.eventsSet),\n});\n\n/*\n * To add a new API version:\n *\n * 1. Create new parser files (e.g. `parsers/v2/bundles.ts`) for changed parsers only.\n * 2. Define the new version spreading from the previous one:\n *\n *    import { parseBundlesV2 } from './parsers/v2/bundles';\n *\n *    const v2: ParserSetFn = (ctx) => ({\n *      ...v1(ctx),\n *      bundles: parseBundlesV2(ctx.root, ctx.mailSet),\n *    });\n *\n * 3. Add it to PARSER_SETS below.\n * 4. Update VERSION_RANGES in versions.ts.\n */\n\n/** Registry of parser sets keyed by API version number. */\nconst PARSER_SETS: Record<number, ParserSetFn> = {\n  1: v1,\n};\n\n/** Get the parser set function for a given API version. Falls back to the latest registered version. */\nexport function getParserSet(apiVersion: number): ParserSetFn {\n  return PARSER_SETS[apiVersion] ?? PARSER_SETS[Math.max(...Object.keys(PARSER_SETS).map(Number))];\n}\n","import { ensureArray, str } from '../util';\n\n/** Extract the list of event IDs the player has witnessed from the player node. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseEventsSeen(player: any): string[] {\n  return ensureArray(player.eventsSeen?.int)\n    .map((e) => str(e))\n    .filter(Boolean);\n}\n","/** A mapping from a game version range to an API version. */\nexport interface VersionRange {\n  minVersion: string;\n  maxVersion: string | null;\n  apiVersion: number;\n}\n\n/**\n * Game version ranges and their corresponding API versions.\n * Ranges are checked in order — the first match wins.\n * A `null` maxVersion means \"up to any future version\" (open-ended).\n */\nexport const VERSION_RANGES: VersionRange[] = [\n  { minVersion: '1.0.0', maxVersion: null, apiVersion: 1 },\n];\n\n/** The latest API version supported by this package. */\nexport const LATEST_API_VERSION = 1;\n\n/**\n * Compare two semver-style version strings (e.g. \"1.6.14\").\n * Returns -1 if a < b, 0 if equal, 1 if a > b.\n */\nfunction compareVersions(a: string, b: string): number {\n  const pa = a.split('.').map(Number);\n  const pb = b.split('.').map(Number);\n  const len = Math.max(pa.length, pb.length);\n  for (let i = 0; i < len; i++) {\n    const na = pa[i] ?? 0;\n    const nb = pb[i] ?? 0;\n    if (na < nb) return -1;\n    if (na > nb) return 1;\n  }\n  return 0;\n}\n\n/**\n * Resolve a game version string to the corresponding API version number.\n * Returns the API version for the first matching range, or the latest API version\n * if no range matches (forward-compatible default).\n */\nexport function resolveApiVersion(gameVersion: string): number {\n  for (const range of VERSION_RANGES) {\n    const aboveMin = compareVersions(gameVersion, range.minVersion) >= 0;\n    const belowMax =\n      range.maxVersion === null || compareVersions(gameVersion, range.maxVersion) <= 0;\n    if (aboveMin && belowMax) {\n      return range.apiVersion;\n    }\n  }\n  return LATEST_API_VERSION;\n}\n"],"mappings":"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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA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CN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAe;AAAA,EACjB;AAAA,EACA;AAAA,IA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","names":["weather","achievements","locations","buildings","animals","locations","buildings","locations","bundles","events","locations","events","locations","locations","buildings","allItems","events","specialItems","professions","locations","buildings","events"]}