stardew-valley-data 0.33.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.1] - 2026-04-05
9
+
10
+ ### Fix
11
+
12
+ - `parseFishingRod` now resolves rod tier by `itemId` instead of `name` — older save files set all
13
+ fishing rod names to `"Fishing Rod"`, causing every rod to fall back to level -1 (unknown);
14
+ switching to `itemId` (`TrainingRod`, `BambooPole`, `FiberglassRod`, `IridiumRod`,
15
+ `AdvancedIridiumRod`) correctly identifies the rod in both old and new saves
16
+
17
+ ## [1.0.0] - 2026-04-05
18
+
19
+ ### Added
20
+
21
+ - `rarecrows` module — `RarecrowQuery` class and `rarecrows()` factory exposing all 8 rarecrows with
22
+ `number`, `name`, `image`, and `obtain` fields; `sortByNumber()` sort method
23
+ - `SaveData.rarecrows: SaveRarecrows` — parses all placed rarecrow item IDs from the save file,
24
+ including rarecrows stored inside chests and building interior objects
25
+ - `SaveRarecrows` interface (`placed: string[]`) exported from `save-file`
26
+
8
27
  ## [0.33.0] - 2026-04-04
9
28
 
10
29
  ### Added
package/README.md CHANGED
@@ -12,12 +12,6 @@
12
12
 
13
13
  ---
14
14
 
15
- > **Pre-1.0 Notice:** This package is under active development. Breaking changes to the save file
16
- > parser structure, data types, and other APIs may occur in any release before `1.0.0`. Pin your
17
- > version or review the [Change Log](CHANGELOG.md) before upgrading.
18
-
19
- ---
20
-
21
15
  ## 📦 Installation
22
16
 
23
17
  ```bash
@@ -0,0 +1,58 @@
1
+ [
2
+ {
3
+ "id": "110",
4
+ "number": 1,
5
+ "name": "Rarecrow 1",
6
+ "image": "images/scarecrows/Rarecrow 1.png",
7
+ "obtain": "Purchase at the Stardew Valley Fair for 800 Tokens."
8
+ },
9
+ {
10
+ "id": "113",
11
+ "number": 2,
12
+ "name": "Rarecrow 2",
13
+ "image": "images/scarecrows/Rarecrow 2.png",
14
+ "obtain": "Purchase at the Spirit's Eve festival for 5,000g."
15
+ },
16
+ {
17
+ "id": "126",
18
+ "number": 3,
19
+ "name": "Rarecrow 3",
20
+ "image": "images/scarecrows/Rarecrow 3.png",
21
+ "obtain": "Purchase at the Casino for 10,000 Qi Coins."
22
+ },
23
+ {
24
+ "id": "136",
25
+ "number": 4,
26
+ "name": "Rarecrow 4",
27
+ "image": "images/scarecrows/Rarecrow 4.png",
28
+ "obtain": "Purchase at the Traveling Cart randomly during fall or winter for 4,000g, or purchase at the Festival of Ice for 5,000g."
29
+ },
30
+ {
31
+ "id": "137",
32
+ "number": 5,
33
+ "name": "Rarecrow 5",
34
+ "image": "images/scarecrows/Rarecrow 5.png",
35
+ "obtain": "Purchase at the Flower Dance for 2,500g."
36
+ },
37
+ {
38
+ "id": "138",
39
+ "number": 6,
40
+ "name": "Rarecrow 6",
41
+ "image": "images/scarecrows/Rarecrow 6.png",
42
+ "obtain": "Purchase from the Dwarf for 2,500g."
43
+ },
44
+ {
45
+ "id": "139",
46
+ "number": 7,
47
+ "name": "Rarecrow 7",
48
+ "image": "images/scarecrows/Rarecrow 7.png",
49
+ "obtain": "Donate 20 Artifacts (not counting Minerals) to the Museum. Can be purchased from the Night Market once the first one is earned."
50
+ },
51
+ {
52
+ "id": "140",
53
+ "number": 8,
54
+ "name": "Rarecrow 8",
55
+ "image": "images/scarecrows/Rarecrow 8.png",
56
+ "obtain": "Donate 40 items to the Museum. Can be purchased from the Night Market once the first one is earned."
57
+ }
58
+ ]
package/dist/index.d.mts CHANGED
@@ -301,7 +301,7 @@ interface MonsterSlayerGoal {
301
301
  reward: SlayerReward;
302
302
  }
303
303
 
304
- type SearchResultKind = 'crop' | 'crop-seed' | 'fruit-tree' | 'fruit-tree-produce' | 'wild-tree' | 'wild-tree-seed' | 'wild-tree-tapper' | 'animal' | 'animal-produce' | 'artisan-good' | 'monster' | 'monster-loot' | 'ring' | 'tool' | 'weapon' | 'hat' | 'footwear' | 'forageable' | 'fish' | 'bait' | 'tackle' | 'cooked-dish' | 'artifact' | 'mineral' | 'geode' | 'mining-node' | 'mineral-resource' | 'crafting-recipe';
304
+ type SearchResultKind = 'crop' | 'crop-seed' | 'fruit-tree' | 'fruit-tree-produce' | 'wild-tree' | 'wild-tree-seed' | 'wild-tree-tapper' | 'animal' | 'animal-produce' | 'artisan-good' | 'monster' | 'monster-loot' | 'ring' | 'tool' | 'weapon' | 'hat' | 'footwear' | 'forageable' | 'fish' | 'bait' | 'tackle' | 'cooked-dish' | 'artifact' | 'mineral' | 'geode' | 'mining-node' | 'mineral-resource' | 'crafting-recipe' | 'rarecrow';
305
305
  interface SearchResult {
306
306
  kind: SearchResultKind;
307
307
  id: string;
@@ -1255,6 +1255,14 @@ interface Building {
1255
1255
  image: string;
1256
1256
  }
1257
1257
 
1258
+ interface Rarecrow {
1259
+ id: string;
1260
+ number: number;
1261
+ name: string;
1262
+ image: string;
1263
+ obtain: string;
1264
+ }
1265
+
1258
1266
  /**
1259
1267
  * Abstract base class providing the five standard terminal methods shared by all query builders.
1260
1268
  * Subclasses hold a typed data array and implement domain-specific filter and sort methods.
@@ -2644,6 +2652,15 @@ declare class BuildingQuery extends QueryBase<Building> {
2644
2652
  /** Returns a BuildingQuery for all building data. Pass `source` to wrap a pre-filtered array. */
2645
2653
  declare function buildings(source?: Building[]): BuildingQuery;
2646
2654
 
2655
+ /** Query builder for rarecrow data. All sort methods return a new RarecrowQuery for chaining. */
2656
+ declare class RarecrowQuery extends QueryBase<Rarecrow> {
2657
+ constructor(data?: Rarecrow[]);
2658
+ /** Sort by rarecrow number. Default: `'asc'`. */
2659
+ sortByNumber(order?: 'asc' | 'desc'): RarecrowQuery;
2660
+ }
2661
+ /** Returns a RarecrowQuery for all rarecrow data. Pass `source` to wrap a pre-filtered array. */
2662
+ declare function rarecrows(source?: Rarecrow[]): RarecrowQuery;
2663
+
2647
2664
  /** Top-level parsed save file containing all extracted game data. */
2648
2665
  interface SaveData {
2649
2666
  apiVersion: number;
@@ -2679,6 +2696,7 @@ interface SaveData {
2679
2696
  horse: SaveHorse | null;
2680
2697
  powers: SavePowers;
2681
2698
  raccoons: SaveRaccoons;
2699
+ rarecrows: SaveRarecrows;
2682
2700
  perfection: SavePerfection;
2683
2701
  mineProgress: SaveMineProgress;
2684
2702
  communityCenter: SaveCommunityCenter;
@@ -2952,6 +2970,10 @@ interface SavePowerEntry {
2952
2970
  name: string;
2953
2971
  acquired: boolean;
2954
2972
  }
2973
+ /** Placed rarecrow item IDs found across all game locations. */
2974
+ interface SaveRarecrows {
2975
+ placed: string[];
2976
+ }
2955
2977
  /** Raccoon quest progress including times fed and unlock milestones. */
2956
2978
  interface SaveRaccoons {
2957
2979
  timesFed: number;
@@ -3045,4 +3067,4 @@ declare function resolveApiVersion(gameVersion: string): number;
3045
3067
  */
3046
3068
  declare function parseSaveFile(xml: string): SaveData;
3047
3069
 
3048
- export { type Achievement, AchievementQuery, type Animal, type AnimalProduce, AnimalQuery, type Artifact, ArtifactQuery, ArtisanCalculator, type ArtisanEnergyResult, type ArtisanGood, type ArtisanGoodBuff, ArtisanGoodQuery, type ArtisanIngredient, type ArtisanResult, type ArtisanUses, type Backpack, type Bait, BaitQuery, type BarItem, type BlacksmithItem, BlacksmithQuery, type BooksellerAvailability, type BooksellerItem, BooksellerItemQuery, type BooksellerTrade, BooksellerTradeQuery, type Buff, type Building, type BuildingBuilder, type BuildingMaterial, BuildingQuery, type Bundle, type BundleItem, BundleQuery, type BundleReward, type BundleRoom, type CarpenterCategory, type CarpenterDay, type CarpenterItem, CarpenterQuery, type CasinoCategory, type CasinoItem, CasinoQuery, type CaskAging, type ChoppedTreeProduce, type CollectionItem, CollectionItemQuery, CollectionsQuery, type Concession, ConcessionQuery, type ConcessionTag, type CookedDish, type CookingBuff, CookingQuery, type CraftingIngredient, type CraftingOutput, CraftingQuery, type CraftingRecipe, type Crop, CropQuery, type DayOfWeek, type DesertTraderDay, type DesertTraderItem, DesertTraderQuery, type DwarfShopCategory, type DwarfShopItem, DwarfShopQuery, type EnergyHealth, EventQuery, type FarmAnimal, type FarmMap, FarmMapQuery, type Festival, type FieldOfficeCollection, type FieldOfficeCollectionData, type FieldOfficeDonation, FieldOfficeDonationQuery, FieldOfficeQuery, type FieldOfficeReward, type Fish, type FishCatchType, type FishCategory, type FishPond, type FishPondProduce, FishQuery, type FishRoe, type FishWeather, type FishingRod, type FishingRodLevel, type Footwear, FootwearQuery, type Forageable, ForageableQuery, type FruitTree, type FruitTreeProduce, type GameEvent, type GameLocation, type GeodeContainer, type GeodeContent, type GiftPreferences, type GoldBundle, type GoldenWalnut, GoldenWalnutQuery, type GoldenWalnutTrackingType, type GrandpaCategory, GrandpaEvaluator, type GrandpaInput, type GrandpaResult, type GrandpaScoreEntry, type GuildCategory, type GuildItem, GuildQuery, type GuildWeaponType, type HarvestQuantity, type Hat, HatQuery, type HeartEvent, type HouseRenovation, HouseRenovationQuery, type HouseUpgrade, type HouseUpgradeMaterial, HouseUpgradeQuery, type Ingredient, type IslandTraderDay, type IslandTraderItem, IslandTraderQuery, type ItemBundle, type ItemQuality, type JojaBundle, type JojaItem, JojaParrotCalculator, JojaQuery, type KnowledgeBonus, KnowledgeCalculator, type KrobusDay, type KrobusItem, KrobusQuery, type KrobusStockType, LATEST_API_VERSION, type LocationCategory, type LocationDay, type LocationHours, LocationQuery, type LocationType, type LostBook, LostBookQuery, MASTERY_LEVELS, type MarnieCategory, type MarnieItem, MarnieQuery, type MasteryLevel, type MasterySkill, type MasteryUnlock, type MedicalSupply, MedicalSupplyQuery, type MeleeWeapon, type Mineral, type MineralItem, MineralQuery, type MixedSeed, type MixedSeedProduces, MixedSeedQuery, type Monster, type MonsterLoot, MonsterLootQuery, MonsterQuery, type MonsterSlayerGoal, MonsterSlayerGoalQuery, type MonsterVariant, type NodeDrop, type NodeItem, type OasisCategory, type OasisDay, type OasisItem, OasisQuery, type OreItem, type PerfectionCategory, PerfectionQuery, type Pet, type PierreCategory, type PierreItem, PierreQuery, type PriceFormula, type ProfessionBonus, ProfessionCalculator, type ProfessionData, ProfessionQuery, type ProfessionSkill, type QiCurrency, type QiStockItem, QiStockQuery, type Quality, QualityCalculator, type QualityEnergyHealth, type QualityPrice, type Quest, QuestQuery, type RecipeSource, type ResourceItem, type Ring, RingQuery, SKILL_TITLES, type SaloonCategory, type SaloonItem, SaloonQuery, type SaveAnimal, type SaveBuilding, type SaveBundleData, type SaveBundleItem, type SaveBundleReward, type SaveBundleRoom, type SaveBundleStatus, type SaveChild, type SaveCollectionEntry, type SaveData, type SaveDate, type SaveFarm, type SaveFishEntry, type SaveFriendship, type SaveIslandUpgrades, type SaveItem, type SaveMastery, type SaveMasteryPerk, type SaveMineProgress, type SaveMonsterKillEntry, type SaveMuseum, type SavePerfection, type SavePet, type SavePlayer, type SavePowerEntry, type SavePowers, type SaveProfession, type SaveQuest, type SaveRaccoons, type SaveRecipeEntry, type SaveSecretNotes, type SaveShippedEntry, type SaveSkillLevel, type SaveSkills, type SaveSpecialOrders, type SaveStardropEntry, type SaveStats, type SaveWalnuts, type SearchResult, type SearchResultKind, type Season, type SeasonData, SeasonQuery, type SecretNote, SecretNoteQuery, type SecretNoteType, type SeedBuyPrice, type SimpleTool, type Skill, type SkillLevel, type SkillLevelRecipes, type SkillMastery, SkillQuery, type SlayerReward, type Slingshot, type SmeltRecipe, type SpecialItem, SpecialItemQuery, type SpecialItemType, type SpecialOrderCategory, type SpecialOrderData, SpecialOrderQuery, type Stage, type StarDrop, StarDropQuery, type StarDropSource, type Tackle, TackleQuery, type TitleThreshold, type Tool, type ToolLevel, ToolQuery, type ToolType, type TraderShopItem, type Tree, TreeQuery, type Trinket, TrinketQuery, type TrinketSource, type UniversalGifts, type UpgradeLevel, type UpgradeableTool, type VersionRange, type Villager, VillagerQuery, type VolcanoShopCategory, type VolcanoShopCurrency, type VolcanoShopItem, VolcanoShopQuery, type Weapon, WeaponQuery, type WeaponStat, WeaponStatQuery, type WeaponType, type Weather, WeatherQuery, type WildTree, type WildTreeTapper, type WillyCategory, type WillyItem, WillyQuery, type WizardBuilding, type WizardBuildingMaterial, WizardQuery, achievements, animals, applyPriceFormula, artifacts, artisanCalculator, artisanGoods, bait, blacksmith, booksellerShop, booksellerTrades, buildings, bundles, calculateArtisanPrice, carpenter, casino, collections, concessions, cooking, crafting, crops, desertTrader, dwarfShop, events, fieldOffice, fieldOfficeDonations, findFestival, fish, footwear, forageables, getMasteryLevel, getProfessionOptions, getTitle, getTitleScore, goldenWalnuts, grandpaEvaluator, guild, hats, houseRenovations, houseUpgrades, isFarmAnimal, isPet, islandTrader, joja, jojaParrotCalculator, knowledgeCalculator, krobus, locations, lostBooks, maps, marnie, medicalSupplies, minerals, mixedSeeds, monsterLoot, monsterSlayerGoals, monsters, oasis, parseSaveFile, perfection, pierre, professionCalculator, professions, qiStock, qualityCalculator, quests, resolveApiVersion, rings, saloon, search, seasons, secretNotes, skills, specialItems, specialOrders, starDrops, tackle, tools, trees, trinkets, universalGifts, villagers, volcanoShop, weaponStats, weapons, weather, willy, wizard };
3070
+ export { type Achievement, AchievementQuery, type Animal, type AnimalProduce, AnimalQuery, type Artifact, ArtifactQuery, ArtisanCalculator, type ArtisanEnergyResult, type ArtisanGood, type ArtisanGoodBuff, ArtisanGoodQuery, type ArtisanIngredient, type ArtisanResult, type ArtisanUses, type Backpack, type Bait, BaitQuery, type BarItem, type BlacksmithItem, BlacksmithQuery, type BooksellerAvailability, type BooksellerItem, BooksellerItemQuery, type BooksellerTrade, BooksellerTradeQuery, type Buff, type Building, type BuildingBuilder, type BuildingMaterial, BuildingQuery, type Bundle, type BundleItem, BundleQuery, type BundleReward, type BundleRoom, type CarpenterCategory, type CarpenterDay, type CarpenterItem, CarpenterQuery, type CasinoCategory, type CasinoItem, CasinoQuery, type CaskAging, type ChoppedTreeProduce, type CollectionItem, CollectionItemQuery, CollectionsQuery, type Concession, ConcessionQuery, type ConcessionTag, type CookedDish, type CookingBuff, CookingQuery, type CraftingIngredient, type CraftingOutput, CraftingQuery, type CraftingRecipe, type Crop, CropQuery, type DayOfWeek, type DesertTraderDay, type DesertTraderItem, DesertTraderQuery, type DwarfShopCategory, type DwarfShopItem, DwarfShopQuery, type EnergyHealth, EventQuery, type FarmAnimal, type FarmMap, FarmMapQuery, type Festival, type FieldOfficeCollection, type FieldOfficeCollectionData, type FieldOfficeDonation, FieldOfficeDonationQuery, FieldOfficeQuery, type FieldOfficeReward, type Fish, type FishCatchType, type FishCategory, type FishPond, type FishPondProduce, FishQuery, type FishRoe, type FishWeather, type FishingRod, type FishingRodLevel, type Footwear, FootwearQuery, type Forageable, ForageableQuery, type FruitTree, type FruitTreeProduce, type GameEvent, type GameLocation, type GeodeContainer, type GeodeContent, type GiftPreferences, type GoldBundle, type GoldenWalnut, GoldenWalnutQuery, type GoldenWalnutTrackingType, type GrandpaCategory, GrandpaEvaluator, type GrandpaInput, type GrandpaResult, type GrandpaScoreEntry, type GuildCategory, type GuildItem, GuildQuery, type GuildWeaponType, type HarvestQuantity, type Hat, HatQuery, type HeartEvent, type HouseRenovation, HouseRenovationQuery, type HouseUpgrade, type HouseUpgradeMaterial, HouseUpgradeQuery, type Ingredient, type IslandTraderDay, type IslandTraderItem, IslandTraderQuery, type ItemBundle, type ItemQuality, type JojaBundle, type JojaItem, JojaParrotCalculator, JojaQuery, type KnowledgeBonus, KnowledgeCalculator, type KrobusDay, type KrobusItem, KrobusQuery, type KrobusStockType, LATEST_API_VERSION, type LocationCategory, type LocationDay, type LocationHours, LocationQuery, type LocationType, type LostBook, LostBookQuery, MASTERY_LEVELS, type MarnieCategory, type MarnieItem, MarnieQuery, type MasteryLevel, type MasterySkill, type MasteryUnlock, type MedicalSupply, MedicalSupplyQuery, type MeleeWeapon, type Mineral, type MineralItem, MineralQuery, type MixedSeed, type MixedSeedProduces, MixedSeedQuery, type Monster, type MonsterLoot, MonsterLootQuery, MonsterQuery, type MonsterSlayerGoal, MonsterSlayerGoalQuery, type MonsterVariant, type NodeDrop, type NodeItem, type OasisCategory, type OasisDay, type OasisItem, OasisQuery, type OreItem, type PerfectionCategory, PerfectionQuery, type Pet, type PierreCategory, type PierreItem, PierreQuery, type PriceFormula, type ProfessionBonus, ProfessionCalculator, type ProfessionData, ProfessionQuery, type ProfessionSkill, type QiCurrency, type QiStockItem, QiStockQuery, type Quality, QualityCalculator, type QualityEnergyHealth, type QualityPrice, type Quest, QuestQuery, type Rarecrow, RarecrowQuery, type RecipeSource, type ResourceItem, type Ring, RingQuery, SKILL_TITLES, type SaloonCategory, type SaloonItem, SaloonQuery, type SaveAnimal, type SaveBuilding, type SaveBundleData, type SaveBundleItem, type SaveBundleReward, type SaveBundleRoom, type SaveBundleStatus, type SaveChild, type SaveCollectionEntry, type SaveData, type SaveDate, type SaveFarm, type SaveFishEntry, type SaveFriendship, type SaveIslandUpgrades, type SaveItem, type SaveMastery, type SaveMasteryPerk, type SaveMineProgress, type SaveMonsterKillEntry, type SaveMuseum, type SavePerfection, type SavePet, type SavePlayer, type SavePowerEntry, type SavePowers, type SaveProfession, type SaveQuest, type SaveRaccoons, type SaveRarecrows, type SaveRecipeEntry, type SaveSecretNotes, type SaveShippedEntry, type SaveSkillLevel, type SaveSkills, type SaveSpecialOrders, type SaveStardropEntry, type SaveStats, type SaveWalnuts, type SearchResult, type SearchResultKind, type Season, type SeasonData, SeasonQuery, type SecretNote, SecretNoteQuery, type SecretNoteType, type SeedBuyPrice, type SimpleTool, type Skill, type SkillLevel, type SkillLevelRecipes, type SkillMastery, SkillQuery, type SlayerReward, type Slingshot, type SmeltRecipe, type SpecialItem, SpecialItemQuery, type SpecialItemType, type SpecialOrderCategory, type SpecialOrderData, SpecialOrderQuery, type Stage, type StarDrop, StarDropQuery, type StarDropSource, type Tackle, TackleQuery, type TitleThreshold, type Tool, type ToolLevel, ToolQuery, type ToolType, type TraderShopItem, type Tree, TreeQuery, type Trinket, TrinketQuery, type TrinketSource, type UniversalGifts, type UpgradeLevel, type UpgradeableTool, type VersionRange, type Villager, VillagerQuery, type VolcanoShopCategory, type VolcanoShopCurrency, type VolcanoShopItem, VolcanoShopQuery, type Weapon, WeaponQuery, type WeaponStat, WeaponStatQuery, type WeaponType, type Weather, WeatherQuery, type WildTree, type WildTreeTapper, type WillyCategory, type WillyItem, WillyQuery, type WizardBuilding, type WizardBuildingMaterial, WizardQuery, achievements, animals, applyPriceFormula, artifacts, artisanCalculator, artisanGoods, bait, blacksmith, booksellerShop, booksellerTrades, buildings, bundles, calculateArtisanPrice, carpenter, casino, collections, concessions, cooking, crafting, crops, desertTrader, dwarfShop, events, fieldOffice, fieldOfficeDonations, findFestival, fish, footwear, forageables, getMasteryLevel, getProfessionOptions, getTitle, getTitleScore, goldenWalnuts, grandpaEvaluator, guild, hats, houseRenovations, houseUpgrades, isFarmAnimal, isPet, islandTrader, joja, jojaParrotCalculator, knowledgeCalculator, krobus, locations, lostBooks, maps, marnie, medicalSupplies, minerals, mixedSeeds, monsterLoot, monsterSlayerGoals, monsters, oasis, parseSaveFile, perfection, pierre, professionCalculator, professions, qiStock, qualityCalculator, quests, rarecrows, resolveApiVersion, rings, saloon, search, seasons, secretNotes, skills, specialItems, specialOrders, starDrops, tackle, tools, trees, trinkets, universalGifts, villagers, volcanoShop, weaponStats, weapons, weather, willy, wizard };
package/dist/index.d.ts CHANGED
@@ -301,7 +301,7 @@ interface MonsterSlayerGoal {
301
301
  reward: SlayerReward;
302
302
  }
303
303
 
304
- type SearchResultKind = 'crop' | 'crop-seed' | 'fruit-tree' | 'fruit-tree-produce' | 'wild-tree' | 'wild-tree-seed' | 'wild-tree-tapper' | 'animal' | 'animal-produce' | 'artisan-good' | 'monster' | 'monster-loot' | 'ring' | 'tool' | 'weapon' | 'hat' | 'footwear' | 'forageable' | 'fish' | 'bait' | 'tackle' | 'cooked-dish' | 'artifact' | 'mineral' | 'geode' | 'mining-node' | 'mineral-resource' | 'crafting-recipe';
304
+ type SearchResultKind = 'crop' | 'crop-seed' | 'fruit-tree' | 'fruit-tree-produce' | 'wild-tree' | 'wild-tree-seed' | 'wild-tree-tapper' | 'animal' | 'animal-produce' | 'artisan-good' | 'monster' | 'monster-loot' | 'ring' | 'tool' | 'weapon' | 'hat' | 'footwear' | 'forageable' | 'fish' | 'bait' | 'tackle' | 'cooked-dish' | 'artifact' | 'mineral' | 'geode' | 'mining-node' | 'mineral-resource' | 'crafting-recipe' | 'rarecrow';
305
305
  interface SearchResult {
306
306
  kind: SearchResultKind;
307
307
  id: string;
@@ -1255,6 +1255,14 @@ interface Building {
1255
1255
  image: string;
1256
1256
  }
1257
1257
 
1258
+ interface Rarecrow {
1259
+ id: string;
1260
+ number: number;
1261
+ name: string;
1262
+ image: string;
1263
+ obtain: string;
1264
+ }
1265
+
1258
1266
  /**
1259
1267
  * Abstract base class providing the five standard terminal methods shared by all query builders.
1260
1268
  * Subclasses hold a typed data array and implement domain-specific filter and sort methods.
@@ -2644,6 +2652,15 @@ declare class BuildingQuery extends QueryBase<Building> {
2644
2652
  /** Returns a BuildingQuery for all building data. Pass `source` to wrap a pre-filtered array. */
2645
2653
  declare function buildings(source?: Building[]): BuildingQuery;
2646
2654
 
2655
+ /** Query builder for rarecrow data. All sort methods return a new RarecrowQuery for chaining. */
2656
+ declare class RarecrowQuery extends QueryBase<Rarecrow> {
2657
+ constructor(data?: Rarecrow[]);
2658
+ /** Sort by rarecrow number. Default: `'asc'`. */
2659
+ sortByNumber(order?: 'asc' | 'desc'): RarecrowQuery;
2660
+ }
2661
+ /** Returns a RarecrowQuery for all rarecrow data. Pass `source` to wrap a pre-filtered array. */
2662
+ declare function rarecrows(source?: Rarecrow[]): RarecrowQuery;
2663
+
2647
2664
  /** Top-level parsed save file containing all extracted game data. */
2648
2665
  interface SaveData {
2649
2666
  apiVersion: number;
@@ -2679,6 +2696,7 @@ interface SaveData {
2679
2696
  horse: SaveHorse | null;
2680
2697
  powers: SavePowers;
2681
2698
  raccoons: SaveRaccoons;
2699
+ rarecrows: SaveRarecrows;
2682
2700
  perfection: SavePerfection;
2683
2701
  mineProgress: SaveMineProgress;
2684
2702
  communityCenter: SaveCommunityCenter;
@@ -2952,6 +2970,10 @@ interface SavePowerEntry {
2952
2970
  name: string;
2953
2971
  acquired: boolean;
2954
2972
  }
2973
+ /** Placed rarecrow item IDs found across all game locations. */
2974
+ interface SaveRarecrows {
2975
+ placed: string[];
2976
+ }
2955
2977
  /** Raccoon quest progress including times fed and unlock milestones. */
2956
2978
  interface SaveRaccoons {
2957
2979
  timesFed: number;
@@ -3045,4 +3067,4 @@ declare function resolveApiVersion(gameVersion: string): number;
3045
3067
  */
3046
3068
  declare function parseSaveFile(xml: string): SaveData;
3047
3069
 
3048
- export { type Achievement, AchievementQuery, type Animal, type AnimalProduce, AnimalQuery, type Artifact, ArtifactQuery, ArtisanCalculator, type ArtisanEnergyResult, type ArtisanGood, type ArtisanGoodBuff, ArtisanGoodQuery, type ArtisanIngredient, type ArtisanResult, type ArtisanUses, type Backpack, type Bait, BaitQuery, type BarItem, type BlacksmithItem, BlacksmithQuery, type BooksellerAvailability, type BooksellerItem, BooksellerItemQuery, type BooksellerTrade, BooksellerTradeQuery, type Buff, type Building, type BuildingBuilder, type BuildingMaterial, BuildingQuery, type Bundle, type BundleItem, BundleQuery, type BundleReward, type BundleRoom, type CarpenterCategory, type CarpenterDay, type CarpenterItem, CarpenterQuery, type CasinoCategory, type CasinoItem, CasinoQuery, type CaskAging, type ChoppedTreeProduce, type CollectionItem, CollectionItemQuery, CollectionsQuery, type Concession, ConcessionQuery, type ConcessionTag, type CookedDish, type CookingBuff, CookingQuery, type CraftingIngredient, type CraftingOutput, CraftingQuery, type CraftingRecipe, type Crop, CropQuery, type DayOfWeek, type DesertTraderDay, type DesertTraderItem, DesertTraderQuery, type DwarfShopCategory, type DwarfShopItem, DwarfShopQuery, type EnergyHealth, EventQuery, type FarmAnimal, type FarmMap, FarmMapQuery, type Festival, type FieldOfficeCollection, type FieldOfficeCollectionData, type FieldOfficeDonation, FieldOfficeDonationQuery, FieldOfficeQuery, type FieldOfficeReward, type Fish, type FishCatchType, type FishCategory, type FishPond, type FishPondProduce, FishQuery, type FishRoe, type FishWeather, type FishingRod, type FishingRodLevel, type Footwear, FootwearQuery, type Forageable, ForageableQuery, type FruitTree, type FruitTreeProduce, type GameEvent, type GameLocation, type GeodeContainer, type GeodeContent, type GiftPreferences, type GoldBundle, type GoldenWalnut, GoldenWalnutQuery, type GoldenWalnutTrackingType, type GrandpaCategory, GrandpaEvaluator, type GrandpaInput, type GrandpaResult, type GrandpaScoreEntry, type GuildCategory, type GuildItem, GuildQuery, type GuildWeaponType, type HarvestQuantity, type Hat, HatQuery, type HeartEvent, type HouseRenovation, HouseRenovationQuery, type HouseUpgrade, type HouseUpgradeMaterial, HouseUpgradeQuery, type Ingredient, type IslandTraderDay, type IslandTraderItem, IslandTraderQuery, type ItemBundle, type ItemQuality, type JojaBundle, type JojaItem, JojaParrotCalculator, JojaQuery, type KnowledgeBonus, KnowledgeCalculator, type KrobusDay, type KrobusItem, KrobusQuery, type KrobusStockType, LATEST_API_VERSION, type LocationCategory, type LocationDay, type LocationHours, LocationQuery, type LocationType, type LostBook, LostBookQuery, MASTERY_LEVELS, type MarnieCategory, type MarnieItem, MarnieQuery, type MasteryLevel, type MasterySkill, type MasteryUnlock, type MedicalSupply, MedicalSupplyQuery, type MeleeWeapon, type Mineral, type MineralItem, MineralQuery, type MixedSeed, type MixedSeedProduces, MixedSeedQuery, type Monster, type MonsterLoot, MonsterLootQuery, MonsterQuery, type MonsterSlayerGoal, MonsterSlayerGoalQuery, type MonsterVariant, type NodeDrop, type NodeItem, type OasisCategory, type OasisDay, type OasisItem, OasisQuery, type OreItem, type PerfectionCategory, PerfectionQuery, type Pet, type PierreCategory, type PierreItem, PierreQuery, type PriceFormula, type ProfessionBonus, ProfessionCalculator, type ProfessionData, ProfessionQuery, type ProfessionSkill, type QiCurrency, type QiStockItem, QiStockQuery, type Quality, QualityCalculator, type QualityEnergyHealth, type QualityPrice, type Quest, QuestQuery, type RecipeSource, type ResourceItem, type Ring, RingQuery, SKILL_TITLES, type SaloonCategory, type SaloonItem, SaloonQuery, type SaveAnimal, type SaveBuilding, type SaveBundleData, type SaveBundleItem, type SaveBundleReward, type SaveBundleRoom, type SaveBundleStatus, type SaveChild, type SaveCollectionEntry, type SaveData, type SaveDate, type SaveFarm, type SaveFishEntry, type SaveFriendship, type SaveIslandUpgrades, type SaveItem, type SaveMastery, type SaveMasteryPerk, type SaveMineProgress, type SaveMonsterKillEntry, type SaveMuseum, type SavePerfection, type SavePet, type SavePlayer, type SavePowerEntry, type SavePowers, type SaveProfession, type SaveQuest, type SaveRaccoons, type SaveRecipeEntry, type SaveSecretNotes, type SaveShippedEntry, type SaveSkillLevel, type SaveSkills, type SaveSpecialOrders, type SaveStardropEntry, type SaveStats, type SaveWalnuts, type SearchResult, type SearchResultKind, type Season, type SeasonData, SeasonQuery, type SecretNote, SecretNoteQuery, type SecretNoteType, type SeedBuyPrice, type SimpleTool, type Skill, type SkillLevel, type SkillLevelRecipes, type SkillMastery, SkillQuery, type SlayerReward, type Slingshot, type SmeltRecipe, type SpecialItem, SpecialItemQuery, type SpecialItemType, type SpecialOrderCategory, type SpecialOrderData, SpecialOrderQuery, type Stage, type StarDrop, StarDropQuery, type StarDropSource, type Tackle, TackleQuery, type TitleThreshold, type Tool, type ToolLevel, ToolQuery, type ToolType, type TraderShopItem, type Tree, TreeQuery, type Trinket, TrinketQuery, type TrinketSource, type UniversalGifts, type UpgradeLevel, type UpgradeableTool, type VersionRange, type Villager, VillagerQuery, type VolcanoShopCategory, type VolcanoShopCurrency, type VolcanoShopItem, VolcanoShopQuery, type Weapon, WeaponQuery, type WeaponStat, WeaponStatQuery, type WeaponType, type Weather, WeatherQuery, type WildTree, type WildTreeTapper, type WillyCategory, type WillyItem, WillyQuery, type WizardBuilding, type WizardBuildingMaterial, WizardQuery, achievements, animals, applyPriceFormula, artifacts, artisanCalculator, artisanGoods, bait, blacksmith, booksellerShop, booksellerTrades, buildings, bundles, calculateArtisanPrice, carpenter, casino, collections, concessions, cooking, crafting, crops, desertTrader, dwarfShop, events, fieldOffice, fieldOfficeDonations, findFestival, fish, footwear, forageables, getMasteryLevel, getProfessionOptions, getTitle, getTitleScore, goldenWalnuts, grandpaEvaluator, guild, hats, houseRenovations, houseUpgrades, isFarmAnimal, isPet, islandTrader, joja, jojaParrotCalculator, knowledgeCalculator, krobus, locations, lostBooks, maps, marnie, medicalSupplies, minerals, mixedSeeds, monsterLoot, monsterSlayerGoals, monsters, oasis, parseSaveFile, perfection, pierre, professionCalculator, professions, qiStock, qualityCalculator, quests, resolveApiVersion, rings, saloon, search, seasons, secretNotes, skills, specialItems, specialOrders, starDrops, tackle, tools, trees, trinkets, universalGifts, villagers, volcanoShop, weaponStats, weapons, weather, willy, wizard };
3070
+ export { type Achievement, AchievementQuery, type Animal, type AnimalProduce, AnimalQuery, type Artifact, ArtifactQuery, ArtisanCalculator, type ArtisanEnergyResult, type ArtisanGood, type ArtisanGoodBuff, ArtisanGoodQuery, type ArtisanIngredient, type ArtisanResult, type ArtisanUses, type Backpack, type Bait, BaitQuery, type BarItem, type BlacksmithItem, BlacksmithQuery, type BooksellerAvailability, type BooksellerItem, BooksellerItemQuery, type BooksellerTrade, BooksellerTradeQuery, type Buff, type Building, type BuildingBuilder, type BuildingMaterial, BuildingQuery, type Bundle, type BundleItem, BundleQuery, type BundleReward, type BundleRoom, type CarpenterCategory, type CarpenterDay, type CarpenterItem, CarpenterQuery, type CasinoCategory, type CasinoItem, CasinoQuery, type CaskAging, type ChoppedTreeProduce, type CollectionItem, CollectionItemQuery, CollectionsQuery, type Concession, ConcessionQuery, type ConcessionTag, type CookedDish, type CookingBuff, CookingQuery, type CraftingIngredient, type CraftingOutput, CraftingQuery, type CraftingRecipe, type Crop, CropQuery, type DayOfWeek, type DesertTraderDay, type DesertTraderItem, DesertTraderQuery, type DwarfShopCategory, type DwarfShopItem, DwarfShopQuery, type EnergyHealth, EventQuery, type FarmAnimal, type FarmMap, FarmMapQuery, type Festival, type FieldOfficeCollection, type FieldOfficeCollectionData, type FieldOfficeDonation, FieldOfficeDonationQuery, FieldOfficeQuery, type FieldOfficeReward, type Fish, type FishCatchType, type FishCategory, type FishPond, type FishPondProduce, FishQuery, type FishRoe, type FishWeather, type FishingRod, type FishingRodLevel, type Footwear, FootwearQuery, type Forageable, ForageableQuery, type FruitTree, type FruitTreeProduce, type GameEvent, type GameLocation, type GeodeContainer, type GeodeContent, type GiftPreferences, type GoldBundle, type GoldenWalnut, GoldenWalnutQuery, type GoldenWalnutTrackingType, type GrandpaCategory, GrandpaEvaluator, type GrandpaInput, type GrandpaResult, type GrandpaScoreEntry, type GuildCategory, type GuildItem, GuildQuery, type GuildWeaponType, type HarvestQuantity, type Hat, HatQuery, type HeartEvent, type HouseRenovation, HouseRenovationQuery, type HouseUpgrade, type HouseUpgradeMaterial, HouseUpgradeQuery, type Ingredient, type IslandTraderDay, type IslandTraderItem, IslandTraderQuery, type ItemBundle, type ItemQuality, type JojaBundle, type JojaItem, JojaParrotCalculator, JojaQuery, type KnowledgeBonus, KnowledgeCalculator, type KrobusDay, type KrobusItem, KrobusQuery, type KrobusStockType, LATEST_API_VERSION, type LocationCategory, type LocationDay, type LocationHours, LocationQuery, type LocationType, type LostBook, LostBookQuery, MASTERY_LEVELS, type MarnieCategory, type MarnieItem, MarnieQuery, type MasteryLevel, type MasterySkill, type MasteryUnlock, type MedicalSupply, MedicalSupplyQuery, type MeleeWeapon, type Mineral, type MineralItem, MineralQuery, type MixedSeed, type MixedSeedProduces, MixedSeedQuery, type Monster, type MonsterLoot, MonsterLootQuery, MonsterQuery, type MonsterSlayerGoal, MonsterSlayerGoalQuery, type MonsterVariant, type NodeDrop, type NodeItem, type OasisCategory, type OasisDay, type OasisItem, OasisQuery, type OreItem, type PerfectionCategory, PerfectionQuery, type Pet, type PierreCategory, type PierreItem, PierreQuery, type PriceFormula, type ProfessionBonus, ProfessionCalculator, type ProfessionData, ProfessionQuery, type ProfessionSkill, type QiCurrency, type QiStockItem, QiStockQuery, type Quality, QualityCalculator, type QualityEnergyHealth, type QualityPrice, type Quest, QuestQuery, type Rarecrow, RarecrowQuery, type RecipeSource, type ResourceItem, type Ring, RingQuery, SKILL_TITLES, type SaloonCategory, type SaloonItem, SaloonQuery, type SaveAnimal, type SaveBuilding, type SaveBundleData, type SaveBundleItem, type SaveBundleReward, type SaveBundleRoom, type SaveBundleStatus, type SaveChild, type SaveCollectionEntry, type SaveData, type SaveDate, type SaveFarm, type SaveFishEntry, type SaveFriendship, type SaveIslandUpgrades, type SaveItem, type SaveMastery, type SaveMasteryPerk, type SaveMineProgress, type SaveMonsterKillEntry, type SaveMuseum, type SavePerfection, type SavePet, type SavePlayer, type SavePowerEntry, type SavePowers, type SaveProfession, type SaveQuest, type SaveRaccoons, type SaveRarecrows, type SaveRecipeEntry, type SaveSecretNotes, type SaveShippedEntry, type SaveSkillLevel, type SaveSkills, type SaveSpecialOrders, type SaveStardropEntry, type SaveStats, type SaveWalnuts, type SearchResult, type SearchResultKind, type Season, type SeasonData, SeasonQuery, type SecretNote, SecretNoteQuery, type SecretNoteType, type SeedBuyPrice, type SimpleTool, type Skill, type SkillLevel, type SkillLevelRecipes, type SkillMastery, SkillQuery, type SlayerReward, type Slingshot, type SmeltRecipe, type SpecialItem, SpecialItemQuery, type SpecialItemType, type SpecialOrderCategory, type SpecialOrderData, SpecialOrderQuery, type Stage, type StarDrop, StarDropQuery, type StarDropSource, type Tackle, TackleQuery, type TitleThreshold, type Tool, type ToolLevel, ToolQuery, type ToolType, type TraderShopItem, type Tree, TreeQuery, type Trinket, TrinketQuery, type TrinketSource, type UniversalGifts, type UpgradeLevel, type UpgradeableTool, type VersionRange, type Villager, VillagerQuery, type VolcanoShopCategory, type VolcanoShopCurrency, type VolcanoShopItem, VolcanoShopQuery, type Weapon, WeaponQuery, type WeaponStat, WeaponStatQuery, type WeaponType, type Weather, WeatherQuery, type WildTree, type WildTreeTapper, type WillyCategory, type WillyItem, WillyQuery, type WizardBuilding, type WizardBuildingMaterial, WizardQuery, achievements, animals, applyPriceFormula, artifacts, artisanCalculator, artisanGoods, bait, blacksmith, booksellerShop, booksellerTrades, buildings, bundles, calculateArtisanPrice, carpenter, casino, collections, concessions, cooking, crafting, crops, desertTrader, dwarfShop, events, fieldOffice, fieldOfficeDonations, findFestival, fish, footwear, forageables, getMasteryLevel, getProfessionOptions, getTitle, getTitleScore, goldenWalnuts, grandpaEvaluator, guild, hats, houseRenovations, houseUpgrades, isFarmAnimal, isPet, islandTrader, joja, jojaParrotCalculator, knowledgeCalculator, krobus, locations, lostBooks, maps, marnie, medicalSupplies, minerals, mixedSeeds, monsterLoot, monsterSlayerGoals, monsters, oasis, parseSaveFile, perfection, pierre, professionCalculator, professions, qiStock, qualityCalculator, quests, rarecrows, resolveApiVersion, rings, saloon, search, seasons, secretNotes, skills, specialItems, specialOrders, starDrops, tackle, tools, trees, trinkets, universalGifts, villagers, volcanoShop, weaponStats, weapons, weather, willy, wizard };
package/dist/index.js CHANGED
@@ -78,6 +78,7 @@ __export(index_exports, {
78
78
  QiStockQuery: () => QiStockQuery,
79
79
  QualityCalculator: () => QualityCalculator,
80
80
  QuestQuery: () => QuestQuery,
81
+ RarecrowQuery: () => RarecrowQuery,
81
82
  RingQuery: () => RingQuery,
82
83
  SKILL_TITLES: () => SKILL_TITLES,
83
84
  SaloonQuery: () => SaloonQuery,
@@ -163,6 +164,7 @@ __export(index_exports, {
163
164
  qiStock: () => qiStock,
164
165
  qualityCalculator: () => qualityCalculator,
165
166
  quests: () => quests,
167
+ rarecrows: () => rarecrows,
166
168
  resolveApiVersion: () => resolveApiVersion,
167
169
  rings: () => rings,
168
170
  saloon: () => saloon,
@@ -23294,6 +23296,83 @@ function minerals(source = allMineralData) {
23294
23296
  return new MineralQuery(source);
23295
23297
  }
23296
23298
 
23299
+ // data/rarecrows.json
23300
+ var rarecrows_default = [
23301
+ {
23302
+ id: "110",
23303
+ number: 1,
23304
+ name: "Rarecrow 1",
23305
+ image: "images/scarecrows/Rarecrow 1.png",
23306
+ obtain: "Purchase at the Stardew Valley Fair for 800 Tokens."
23307
+ },
23308
+ {
23309
+ id: "113",
23310
+ number: 2,
23311
+ name: "Rarecrow 2",
23312
+ image: "images/scarecrows/Rarecrow 2.png",
23313
+ obtain: "Purchase at the Spirit's Eve festival for 5,000g."
23314
+ },
23315
+ {
23316
+ id: "126",
23317
+ number: 3,
23318
+ name: "Rarecrow 3",
23319
+ image: "images/scarecrows/Rarecrow 3.png",
23320
+ obtain: "Purchase at the Casino for 10,000 Qi Coins."
23321
+ },
23322
+ {
23323
+ id: "136",
23324
+ number: 4,
23325
+ name: "Rarecrow 4",
23326
+ image: "images/scarecrows/Rarecrow 4.png",
23327
+ obtain: "Purchase at the Traveling Cart randomly during fall or winter for 4,000g, or purchase at the Festival of Ice for 5,000g."
23328
+ },
23329
+ {
23330
+ id: "137",
23331
+ number: 5,
23332
+ name: "Rarecrow 5",
23333
+ image: "images/scarecrows/Rarecrow 5.png",
23334
+ obtain: "Purchase at the Flower Dance for 2,500g."
23335
+ },
23336
+ {
23337
+ id: "138",
23338
+ number: 6,
23339
+ name: "Rarecrow 6",
23340
+ image: "images/scarecrows/Rarecrow 6.png",
23341
+ obtain: "Purchase from the Dwarf for 2,500g."
23342
+ },
23343
+ {
23344
+ id: "139",
23345
+ number: 7,
23346
+ name: "Rarecrow 7",
23347
+ image: "images/scarecrows/Rarecrow 7.png",
23348
+ obtain: "Donate 20 Artifacts (not counting Minerals) to the Museum. Can be purchased from the Night Market once the first one is earned."
23349
+ },
23350
+ {
23351
+ id: "140",
23352
+ number: 8,
23353
+ name: "Rarecrow 8",
23354
+ image: "images/scarecrows/Rarecrow 8.png",
23355
+ obtain: "Donate 40 items to the Museum. Can be purchased from the Night Market once the first one is earned."
23356
+ }
23357
+ ];
23358
+
23359
+ // src/modules/rarecrows/index.ts
23360
+ var rarecrewsData = rarecrows_default;
23361
+ var RarecrowQuery = class _RarecrowQuery extends QueryBase {
23362
+ constructor(data = rarecrewsData) {
23363
+ super(data);
23364
+ }
23365
+ /** Sort by rarecrow number. Default: `'asc'`. */
23366
+ sortByNumber(order = "asc") {
23367
+ return new _RarecrowQuery(
23368
+ [...this.data].sort((a, b) => order === "asc" ? a.number - b.number : b.number - a.number)
23369
+ );
23370
+ }
23371
+ };
23372
+ function rarecrows(source = rarecrewsData) {
23373
+ return new RarecrowQuery(source);
23374
+ }
23375
+
23297
23376
  // data/rings.json
23298
23377
  var rings_default = [
23299
23378
  {
@@ -26804,6 +26883,11 @@ function search(query, kinds) {
26804
26883
  }
26805
26884
  }
26806
26885
  }
26886
+ for (const crow of rarecrows().get()) {
26887
+ if (matches(query, crow.id, crow.name)) {
26888
+ add({ kind: "rarecrow", id: crow.id, name: crow.name, image: crow.image, sellPrice: null });
26889
+ }
26890
+ }
26807
26891
  return dedupe(raw);
26808
26892
  }
26809
26893
 
@@ -41626,11 +41710,11 @@ var TOOL_KEY_MAP = {
41626
41710
  Hoe: "hoe"
41627
41711
  };
41628
41712
  var FISHING_ROD_LEVEL = {
41629
- "Training Rod": 0,
41630
- "Bamboo Pole": 1,
41631
- "Fiberglass Rod": 2,
41632
- "Iridium Rod": 3,
41633
- "Advanced Iridium Rod": 4
41713
+ TrainingRod: 0,
41714
+ BambooPole: 1,
41715
+ FiberglassRod: 2,
41716
+ IridiumRod: 3,
41717
+ AdvancedIridiumRod: 4
41634
41718
  };
41635
41719
  function collectToolItems(node, depth = 0) {
41636
41720
  if (!node || typeof node !== "object" || depth > 20) return [];
@@ -41710,7 +41794,7 @@ function parseToolLevels(player, root) {
41710
41794
  levels[key] = toolLevel(level, getEnchantmentName(i));
41711
41795
  }
41712
41796
  } else if (xsiType === "FishingRod") {
41713
- const rodLevel = FISHING_ROD_LEVEL[i.name] ?? -1;
41797
+ const rodLevel = FISHING_ROD_LEVEL[i.itemId] ?? -1;
41714
41798
  if (rodLevel > levels.fishingRod.level) {
41715
41799
  levels.fishingRod = toolLevel(rodLevel, getEnchantmentName(i));
41716
41800
  }
@@ -41808,6 +41892,42 @@ function parseRaccoons(root, mail) {
41808
41892
  };
41809
41893
  }
41810
41894
 
41895
+ // src/save-file/parsers/v1/rarecrows.ts
41896
+ function collectFromItems(items, ids) {
41897
+ for (const item of ensureArray(items)) {
41898
+ const it = item;
41899
+ if (str(it.name) === "Rarecrow") {
41900
+ ids.add(str(it.itemId));
41901
+ }
41902
+ }
41903
+ }
41904
+ function collectFromObjects(objects, ids) {
41905
+ for (const { value } of extractDictItems(objects)) {
41906
+ const obj = value?.Object;
41907
+ if (!obj) continue;
41908
+ if (str(obj.name) === "Rarecrow") {
41909
+ ids.add(str(obj.itemId));
41910
+ }
41911
+ if (obj.items) {
41912
+ collectFromItems(obj.items.Item, ids);
41913
+ }
41914
+ }
41915
+ }
41916
+ function parseRarecrows(root) {
41917
+ const ids = /* @__PURE__ */ new Set();
41918
+ const locations2 = ensureArray(root.locations?.GameLocation);
41919
+ for (const loc of locations2) {
41920
+ const l = loc;
41921
+ collectFromObjects(l.objects, ids);
41922
+ const buildings2 = ensureArray(l.buildings?.Building);
41923
+ for (const building of buildings2) {
41924
+ const b = building;
41925
+ collectFromObjects(b.indoors?.objects, ids);
41926
+ }
41927
+ }
41928
+ return { placed: Array.from(ids) };
41929
+ }
41930
+
41811
41931
  // src/save-file/parsers/v1/recipes.ts
41812
41932
  function parseRecipes(data) {
41813
41933
  const result = [];
@@ -41965,6 +42085,7 @@ var v1 = (ctx) => ({
41965
42085
  horse: parseHorse(ctx.root),
41966
42086
  powers: parsePowers(ctx.mailSet, ctx.eventsSet),
41967
42087
  raccoons: parseRaccoons(ctx.root, ctx.mailSet),
42088
+ rarecrows: parseRarecrows(ctx.root),
41968
42089
  perfection: parsePerfection(ctx.root),
41969
42090
  mineProgress: parseMineProgress(ctx.player, ctx.root, ctx.mailSet),
41970
42091
  communityCenter: parseCommunityCenter(ctx.mailSet, ctx.eventsSet),
@@ -42108,6 +42229,7 @@ function parseSaveFile(xml) {
42108
42229
  QiStockQuery,
42109
42230
  QualityCalculator,
42110
42231
  QuestQuery,
42232
+ RarecrowQuery,
42111
42233
  RingQuery,
42112
42234
  SKILL_TITLES,
42113
42235
  SaloonQuery,
@@ -42193,6 +42315,7 @@ function parseSaveFile(xml) {
42193
42315
  qiStock,
42194
42316
  qualityCalculator,
42195
42317
  quests,
42318
+ rarecrows,
42196
42319
  resolveApiVersion,
42197
42320
  rings,
42198
42321
  saloon,