stardew-valley-data 0.25.0 → 0.27.0

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,36 @@ 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
+ ## [0.27.0] - 2026-03-22
9
+
10
+ ### Added
11
+
12
+ - `data/joja-development.json` — 5 Joja Community Development projects with `id`, `name`,
13
+ `description`, `cost`, `ccEquivalent` (maps to Community Center room mail flag), and `order`:
14
+ Greenhouse (35,000g), Bridge (25,000g), Panning (20,000g), Minecarts (15,000g), Bus (40,000g)
15
+ - `parseJoja()` parser added — new `joja` field on `SaveData` tracking `isMember` (from `JojaMember`
16
+ mail flag), `completed` (event `502261`), and `developments[]` (array of `{ id, purchased }`
17
+ driven by `joja-development.json`)
18
+ - `SaveJoja` and `SaveJojaDevelopment` interfaces added to save file types
19
+ - `images/shop/Joja Development Form.png` downloaded (640×288)
20
+
21
+ ## [0.26.0] - 2026-03-22
22
+
23
+ ### Added
24
+
25
+ - `data/island-upgrades.json` — 11 Ginger Island parrot upgrades with `id` (mail flag), `name`,
26
+ `description`, `cost` (Golden Walnuts), and `location`
27
+ - `JojaParrotCalculator` class and `jojaParrotCalculator()` factory added to the `calculator` module
28
+ — `cost(walnutsFound)` returns gold needed (remaining × 10,000g), `remaining()` returns unfound
29
+ count, `total` (130), and `costPerWalnut` (10,000g) getters
30
+
31
+ ### Changed
32
+
33
+ - `SaveIslandUpgrades` type changed from a flat object with named booleans to `SaveIslandUpgrade[]`
34
+ — array of `{ id: string; unlocked: boolean }` driven by the data file IDs
35
+ - `parseIslandUpgrades()` parser updated to iterate `island-upgrades.json` IDs instead of hardcoded
36
+ property names
37
+
8
38
  ## [0.25.0] - 2026-03-22
9
39
 
10
40
  ### Added
@@ -0,0 +1,79 @@
1
+ [
2
+ {
3
+ "id": "Island_FirstParrot",
4
+ "name": "Ginger Island North",
5
+ "description": "Feed Leo's parrot friend to unlock access to the north side of the island.",
6
+ "cost": 1,
7
+ "location": "Leo's Hut"
8
+ },
9
+ {
10
+ "id": "Island_Turtle",
11
+ "name": "Ginger Island West",
12
+ "description": "A turtle ferries the player to the western island region.",
13
+ "cost": 10,
14
+ "location": "Leo's Hut area"
15
+ },
16
+ {
17
+ "id": "Island_UpgradeHouse",
18
+ "name": "Island Farmhouse",
19
+ "description": "Provides sleeping quarters on the west side of the island so the player can stay overnight.",
20
+ "cost": 20,
21
+ "location": "Ginger Island West"
22
+ },
23
+ {
24
+ "id": "Island_Resort",
25
+ "name": "Island Resort",
26
+ "description": "Unlocks the beach resort on the south side of the island. Villagers can visit.",
27
+ "cost": 20,
28
+ "location": "Island South"
29
+ },
30
+ {
31
+ "id": "Island_UpgradeTrader",
32
+ "name": "Island Trader",
33
+ "description": "Unlocks the Island Trader shop on the north side of the island.",
34
+ "cost": 10,
35
+ "location": "Island North"
36
+ },
37
+ {
38
+ "id": "Island_UpgradeBridge",
39
+ "name": "Dig Site Bridge",
40
+ "description": "Repairs the bridge to access the island dig site.",
41
+ "cost": 10,
42
+ "location": "Island North"
43
+ },
44
+ {
45
+ "id": "Island_UpgradeParrotPlatform",
46
+ "name": "Parrot Express",
47
+ "description": "Enables the fast-travel parrot platform system around the island.",
48
+ "cost": 10,
49
+ "location": "Ginger Island (multiple stops)"
50
+ },
51
+ {
52
+ "id": "Island_UpgradeHouse_Mailbox",
53
+ "name": "Farmhouse Mailbox",
54
+ "description": "Adds a mailbox to the island farmhouse so the player can receive mail.",
55
+ "cost": 5,
56
+ "location": "Island Farmhouse"
57
+ },
58
+ {
59
+ "id": "Island_W_Obelisk",
60
+ "name": "Farm Obelisk",
61
+ "description": "Builds an obelisk near the island farmhouse that teleports the player back to the farm.",
62
+ "cost": 20,
63
+ "location": "Island Farmhouse"
64
+ },
65
+ {
66
+ "id": "Island_VolcanoBridge",
67
+ "name": "Volcano Bridge",
68
+ "description": "Builds a permanent bridge at the volcano dungeon entrance.",
69
+ "cost": 5,
70
+ "location": "Volcano Dungeon entrance"
71
+ },
72
+ {
73
+ "id": "Island_VolcanoShortcutOut",
74
+ "name": "Volcano Exit Shortcut",
75
+ "description": "Creates a shortcut exit passage on volcano dungeon level 5.",
76
+ "cost": 5,
77
+ "location": "Volcano Dungeon level 5"
78
+ }
79
+ ]
@@ -0,0 +1,42 @@
1
+ [
2
+ {
3
+ "id": "jojaPantry",
4
+ "name": "Greenhouse",
5
+ "description": "Repairs the old ruins on the farm, turning it into a greenhouse.",
6
+ "cost": 35000,
7
+ "ccEquivalent": "ccPantry",
8
+ "order": 0
9
+ },
10
+ {
11
+ "id": "jojaCraftsRoom",
12
+ "name": "Bridge",
13
+ "description": "Repairs the broken bridge east of the Mines, enabling access to the Quarry.",
14
+ "cost": 25000,
15
+ "ccEquivalent": "ccCraftsRoom",
16
+ "order": 1
17
+ },
18
+ {
19
+ "id": "jojaFishTank",
20
+ "name": "Panning",
21
+ "description": "Removes the glimmering boulder near the mine entrance, enabling copper panning.",
22
+ "cost": 20000,
23
+ "ccEquivalent": "ccFishTank",
24
+ "order": 2
25
+ },
26
+ {
27
+ "id": "jojaBoilerRoom",
28
+ "name": "Minecarts",
29
+ "description": "Repairs the minecart system between the Bus Stop, the Mountains, and Pelican Town.",
30
+ "cost": 15000,
31
+ "ccEquivalent": "ccBoilerRoom",
32
+ "order": 3
33
+ },
34
+ {
35
+ "id": "jojaVault",
36
+ "name": "Bus",
37
+ "description": "Repairs the bus that runs to the Calico Desert.",
38
+ "cost": 40000,
39
+ "ccEquivalent": "ccVault",
40
+ "order": 4
41
+ }
42
+ ]
package/dist/index.d.mts CHANGED
@@ -1464,6 +1464,22 @@ declare class KnowledgeCalculator {
1464
1464
  }
1465
1465
  /** Returns a KnowledgeCalculator instance for computing knowledge bonus sell prices. */
1466
1466
  declare function knowledgeCalculator(): KnowledgeCalculator;
1467
+ /**
1468
+ * Calculates the cost to purchase remaining Golden Walnuts from the Joja Parrot.
1469
+ * Each unfound walnut costs 10,000g. All remaining walnuts are delivered after sleeping.
1470
+ */
1471
+ declare class JojaParrotCalculator {
1472
+ /** Calculate the gold cost to buy all remaining walnuts. */
1473
+ cost(walnutsFound: number): number;
1474
+ /** Returns how many walnuts are still unfound. */
1475
+ remaining(walnutsFound: number): number;
1476
+ /** The total number of Golden Walnuts available in the game. */
1477
+ get total(): number;
1478
+ /** The cost per individual unfound walnut (10,000g). */
1479
+ get costPerWalnut(): number;
1480
+ }
1481
+ /** Returns a JojaParrotCalculator instance for computing Golden Walnut purchase costs. */
1482
+ declare function jojaParrotCalculator(): JojaParrotCalculator;
1467
1483
 
1468
1484
  /** Query builder for crop data. All filter and sort methods return a new CropQuery for chaining. */
1469
1485
  declare class CropQuery extends QueryBase<Crop> {
@@ -2660,6 +2676,7 @@ interface SaveData {
2660
2676
  perfection: SavePerfection;
2661
2677
  mineProgress: SaveMineProgress;
2662
2678
  communityCenter: SaveCommunityCenter;
2679
+ joja: SaveJoja;
2663
2680
  }
2664
2681
  /** Core player profile including name, money, skills, and mastery progress. */
2665
2682
  interface SavePlayer {
@@ -2878,20 +2895,13 @@ interface SaveWalnuts {
2878
2895
  found: number;
2879
2896
  collected: string[];
2880
2897
  }
2881
- /** Ginger Island upgrade and unlock status for each parrot-purchasable feature. */
2882
- interface SaveIslandUpgrades {
2883
- firstParrot: boolean;
2884
- turtle: boolean;
2885
- house: boolean;
2886
- resort: boolean;
2887
- trader: boolean;
2888
- bridge: boolean;
2889
- parrotPlatforms: boolean;
2890
- mailbox: boolean;
2891
- obelisk: boolean;
2892
- volcanoBridge: boolean;
2893
- volcanoShortcut: boolean;
2898
+ /** A single Ginger Island parrot upgrade with unlock status. */
2899
+ interface SaveIslandUpgrade {
2900
+ id: string;
2901
+ unlocked: boolean;
2894
2902
  }
2903
+ /** Ginger Island upgrade and unlock status for each parrot-purchasable feature. */
2904
+ type SaveIslandUpgrades = SaveIslandUpgrade[];
2895
2905
  /** A player's child with name, age stage, and gender. */
2896
2906
  interface SaveChild {
2897
2907
  name: string;
@@ -2953,6 +2963,17 @@ interface SaveCommunityCenter {
2953
2963
  jojaAbandoned: boolean;
2954
2964
  rooms: SaveCommunityCenterRooms;
2955
2965
  }
2966
+ /** A single Joja development project with purchase status. */
2967
+ interface SaveJojaDevelopment {
2968
+ id: string;
2969
+ purchased: boolean;
2970
+ }
2971
+ /** Joja membership, development project completion, and route status. */
2972
+ interface SaveJoja {
2973
+ isMember: boolean;
2974
+ completed: boolean;
2975
+ developments: SaveJojaDevelopment[];
2976
+ }
2956
2977
  /** Mine and Skull Cavern progress including deepest levels reached and key ownership. */
2957
2978
  interface SaveMineProgress {
2958
2979
  deepestMineLevel: number;
@@ -3003,4 +3024,4 @@ declare function resolveApiVersion(gameVersion: string): number;
3003
3024
  */
3004
3025
  declare function parseSaveFile(xml: string): SaveData;
3005
3026
 
3006
- 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 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, 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, 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 };
3027
+ 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 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 };
package/dist/index.d.ts CHANGED
@@ -1464,6 +1464,22 @@ declare class KnowledgeCalculator {
1464
1464
  }
1465
1465
  /** Returns a KnowledgeCalculator instance for computing knowledge bonus sell prices. */
1466
1466
  declare function knowledgeCalculator(): KnowledgeCalculator;
1467
+ /**
1468
+ * Calculates the cost to purchase remaining Golden Walnuts from the Joja Parrot.
1469
+ * Each unfound walnut costs 10,000g. All remaining walnuts are delivered after sleeping.
1470
+ */
1471
+ declare class JojaParrotCalculator {
1472
+ /** Calculate the gold cost to buy all remaining walnuts. */
1473
+ cost(walnutsFound: number): number;
1474
+ /** Returns how many walnuts are still unfound. */
1475
+ remaining(walnutsFound: number): number;
1476
+ /** The total number of Golden Walnuts available in the game. */
1477
+ get total(): number;
1478
+ /** The cost per individual unfound walnut (10,000g). */
1479
+ get costPerWalnut(): number;
1480
+ }
1481
+ /** Returns a JojaParrotCalculator instance for computing Golden Walnut purchase costs. */
1482
+ declare function jojaParrotCalculator(): JojaParrotCalculator;
1467
1483
 
1468
1484
  /** Query builder for crop data. All filter and sort methods return a new CropQuery for chaining. */
1469
1485
  declare class CropQuery extends QueryBase<Crop> {
@@ -2660,6 +2676,7 @@ interface SaveData {
2660
2676
  perfection: SavePerfection;
2661
2677
  mineProgress: SaveMineProgress;
2662
2678
  communityCenter: SaveCommunityCenter;
2679
+ joja: SaveJoja;
2663
2680
  }
2664
2681
  /** Core player profile including name, money, skills, and mastery progress. */
2665
2682
  interface SavePlayer {
@@ -2878,20 +2895,13 @@ interface SaveWalnuts {
2878
2895
  found: number;
2879
2896
  collected: string[];
2880
2897
  }
2881
- /** Ginger Island upgrade and unlock status for each parrot-purchasable feature. */
2882
- interface SaveIslandUpgrades {
2883
- firstParrot: boolean;
2884
- turtle: boolean;
2885
- house: boolean;
2886
- resort: boolean;
2887
- trader: boolean;
2888
- bridge: boolean;
2889
- parrotPlatforms: boolean;
2890
- mailbox: boolean;
2891
- obelisk: boolean;
2892
- volcanoBridge: boolean;
2893
- volcanoShortcut: boolean;
2898
+ /** A single Ginger Island parrot upgrade with unlock status. */
2899
+ interface SaveIslandUpgrade {
2900
+ id: string;
2901
+ unlocked: boolean;
2894
2902
  }
2903
+ /** Ginger Island upgrade and unlock status for each parrot-purchasable feature. */
2904
+ type SaveIslandUpgrades = SaveIslandUpgrade[];
2895
2905
  /** A player's child with name, age stage, and gender. */
2896
2906
  interface SaveChild {
2897
2907
  name: string;
@@ -2953,6 +2963,17 @@ interface SaveCommunityCenter {
2953
2963
  jojaAbandoned: boolean;
2954
2964
  rooms: SaveCommunityCenterRooms;
2955
2965
  }
2966
+ /** A single Joja development project with purchase status. */
2967
+ interface SaveJojaDevelopment {
2968
+ id: string;
2969
+ purchased: boolean;
2970
+ }
2971
+ /** Joja membership, development project completion, and route status. */
2972
+ interface SaveJoja {
2973
+ isMember: boolean;
2974
+ completed: boolean;
2975
+ developments: SaveJojaDevelopment[];
2976
+ }
2956
2977
  /** Mine and Skull Cavern progress including deepest levels reached and key ownership. */
2957
2978
  interface SaveMineProgress {
2958
2979
  deepestMineLevel: number;
@@ -3003,4 +3024,4 @@ declare function resolveApiVersion(gameVersion: string): number;
3003
3024
  */
3004
3025
  declare function parseSaveFile(xml: string): SaveData;
3005
3026
 
3006
- 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 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, 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, 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 };
3027
+ 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 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 };
package/dist/index.js CHANGED
@@ -55,6 +55,7 @@ __export(index_exports, {
55
55
  HouseRenovationQuery: () => HouseRenovationQuery,
56
56
  HouseUpgradeQuery: () => HouseUpgradeQuery,
57
57
  IslandTraderQuery: () => IslandTraderQuery,
58
+ JojaParrotCalculator: () => JojaParrotCalculator,
58
59
  JojaQuery: () => JojaQuery,
59
60
  KnowledgeCalculator: () => KnowledgeCalculator,
60
61
  KrobusQuery: () => KrobusQuery,
@@ -140,6 +141,7 @@ __export(index_exports, {
140
141
  isPet: () => isPet,
141
142
  islandTrader: () => islandTrader,
142
143
  joja: () => joja,
144
+ jojaParrotCalculator: () => jojaParrotCalculator,
143
145
  knowledgeCalculator: () => knowledgeCalculator,
144
146
  krobus: () => krobus,
145
147
  locations: () => locations,
@@ -4550,6 +4552,30 @@ var KnowledgeCalculator = class {
4550
4552
  function knowledgeCalculator() {
4551
4553
  return new KnowledgeCalculator();
4552
4554
  }
4555
+ var TOTAL_GOLDEN_WALNUTS = 130;
4556
+ var JOJA_PARROT_COST_PER_WALNUT = 1e4;
4557
+ var JojaParrotCalculator = class {
4558
+ /** Calculate the gold cost to buy all remaining walnuts. */
4559
+ cost(walnutsFound) {
4560
+ const remaining = Math.max(0, TOTAL_GOLDEN_WALNUTS - walnutsFound);
4561
+ return remaining * JOJA_PARROT_COST_PER_WALNUT;
4562
+ }
4563
+ /** Returns how many walnuts are still unfound. */
4564
+ remaining(walnutsFound) {
4565
+ return Math.max(0, TOTAL_GOLDEN_WALNUTS - walnutsFound);
4566
+ }
4567
+ /** The total number of Golden Walnuts available in the game. */
4568
+ get total() {
4569
+ return TOTAL_GOLDEN_WALNUTS;
4570
+ }
4571
+ /** The cost per individual unfound walnut (10,000g). */
4572
+ get costPerWalnut() {
4573
+ return JOJA_PARROT_COST_PER_WALNUT;
4574
+ }
4575
+ };
4576
+ function jojaParrotCalculator() {
4577
+ return new JojaParrotCalculator();
4578
+ }
4553
4579
 
4554
4580
  // data/crops.json
4555
4581
  var crops_default = [
@@ -41117,20 +41143,150 @@ function parseInventory(items) {
41117
41143
  return result;
41118
41144
  }
41119
41145
 
41146
+ // data/island-upgrades.json
41147
+ var island_upgrades_default = [
41148
+ {
41149
+ id: "Island_FirstParrot",
41150
+ name: "Ginger Island North",
41151
+ description: "Feed Leo's parrot friend to unlock access to the north side of the island.",
41152
+ cost: 1,
41153
+ location: "Leo's Hut"
41154
+ },
41155
+ {
41156
+ id: "Island_Turtle",
41157
+ name: "Ginger Island West",
41158
+ description: "A turtle ferries the player to the western island region.",
41159
+ cost: 10,
41160
+ location: "Leo's Hut area"
41161
+ },
41162
+ {
41163
+ id: "Island_UpgradeHouse",
41164
+ name: "Island Farmhouse",
41165
+ description: "Provides sleeping quarters on the west side of the island so the player can stay overnight.",
41166
+ cost: 20,
41167
+ location: "Ginger Island West"
41168
+ },
41169
+ {
41170
+ id: "Island_Resort",
41171
+ name: "Island Resort",
41172
+ description: "Unlocks the beach resort on the south side of the island. Villagers can visit.",
41173
+ cost: 20,
41174
+ location: "Island South"
41175
+ },
41176
+ {
41177
+ id: "Island_UpgradeTrader",
41178
+ name: "Island Trader",
41179
+ description: "Unlocks the Island Trader shop on the north side of the island.",
41180
+ cost: 10,
41181
+ location: "Island North"
41182
+ },
41183
+ {
41184
+ id: "Island_UpgradeBridge",
41185
+ name: "Dig Site Bridge",
41186
+ description: "Repairs the bridge to access the island dig site.",
41187
+ cost: 10,
41188
+ location: "Island North"
41189
+ },
41190
+ {
41191
+ id: "Island_UpgradeParrotPlatform",
41192
+ name: "Parrot Express",
41193
+ description: "Enables the fast-travel parrot platform system around the island.",
41194
+ cost: 10,
41195
+ location: "Ginger Island (multiple stops)"
41196
+ },
41197
+ {
41198
+ id: "Island_UpgradeHouse_Mailbox",
41199
+ name: "Farmhouse Mailbox",
41200
+ description: "Adds a mailbox to the island farmhouse so the player can receive mail.",
41201
+ cost: 5,
41202
+ location: "Island Farmhouse"
41203
+ },
41204
+ {
41205
+ id: "Island_W_Obelisk",
41206
+ name: "Farm Obelisk",
41207
+ description: "Builds an obelisk near the island farmhouse that teleports the player back to the farm.",
41208
+ cost: 20,
41209
+ location: "Island Farmhouse"
41210
+ },
41211
+ {
41212
+ id: "Island_VolcanoBridge",
41213
+ name: "Volcano Bridge",
41214
+ description: "Builds a permanent bridge at the volcano dungeon entrance.",
41215
+ cost: 5,
41216
+ location: "Volcano Dungeon entrance"
41217
+ },
41218
+ {
41219
+ id: "Island_VolcanoShortcutOut",
41220
+ name: "Volcano Exit Shortcut",
41221
+ description: "Creates a shortcut exit passage on volcano dungeon level 5.",
41222
+ cost: 5,
41223
+ location: "Volcano Dungeon level 5"
41224
+ }
41225
+ ];
41226
+
41120
41227
  // src/save-file/parsers/v1/island-upgrades.ts
41228
+ var UPGRADE_IDS = island_upgrades_default.map((u) => u.id);
41121
41229
  function parseIslandUpgrades(mail) {
41230
+ return UPGRADE_IDS.map((id) => ({
41231
+ id,
41232
+ unlocked: mail.has(id)
41233
+ }));
41234
+ }
41235
+
41236
+ // data/joja-development.json
41237
+ var joja_development_default = [
41238
+ {
41239
+ id: "jojaPantry",
41240
+ name: "Greenhouse",
41241
+ description: "Repairs the old ruins on the farm, turning it into a greenhouse.",
41242
+ cost: 35e3,
41243
+ ccEquivalent: "ccPantry",
41244
+ order: 0
41245
+ },
41246
+ {
41247
+ id: "jojaCraftsRoom",
41248
+ name: "Bridge",
41249
+ description: "Repairs the broken bridge east of the Mines, enabling access to the Quarry.",
41250
+ cost: 25e3,
41251
+ ccEquivalent: "ccCraftsRoom",
41252
+ order: 1
41253
+ },
41254
+ {
41255
+ id: "jojaFishTank",
41256
+ name: "Panning",
41257
+ description: "Removes the glimmering boulder near the mine entrance, enabling copper panning.",
41258
+ cost: 2e4,
41259
+ ccEquivalent: "ccFishTank",
41260
+ order: 2
41261
+ },
41262
+ {
41263
+ id: "jojaBoilerRoom",
41264
+ name: "Minecarts",
41265
+ description: "Repairs the minecart system between the Bus Stop, the Mountains, and Pelican Town.",
41266
+ cost: 15e3,
41267
+ ccEquivalent: "ccBoilerRoom",
41268
+ order: 3
41269
+ },
41270
+ {
41271
+ id: "jojaVault",
41272
+ name: "Bus",
41273
+ description: "Repairs the bus that runs to the Calico Desert.",
41274
+ cost: 4e4,
41275
+ ccEquivalent: "ccVault",
41276
+ order: 4
41277
+ }
41278
+ ];
41279
+
41280
+ // src/save-file/parsers/v1/joja.ts
41281
+ var DEVELOPMENT_IDS = joja_development_default.map((d) => d.id);
41282
+ function parseJoja(mail, events2) {
41122
41283
  return {
41123
- firstParrot: mail.has("Island_FirstParrot"),
41124
- turtle: mail.has("Island_Turtle"),
41125
- house: mail.has("Island_UpgradeHouse"),
41126
- resort: mail.has("Island_Resort"),
41127
- trader: mail.has("Island_UpgradeTrader"),
41128
- bridge: mail.has("Island_UpgradeBridge"),
41129
- parrotPlatforms: mail.has("Island_UpgradeParrotPlatform"),
41130
- mailbox: mail.has("Island_UpgradeHouse_Mailbox"),
41131
- obelisk: mail.has("Island_W_Obelisk"),
41132
- volcanoBridge: mail.has("Island_VolcanoBridge"),
41133
- volcanoShortcut: mail.has("Island_VolcanoShortcutOut")
41284
+ isMember: mail.has("JojaMember"),
41285
+ completed: events2.has("502261"),
41286
+ developments: DEVELOPMENT_IDS.map((id) => ({
41287
+ id,
41288
+ purchased: mail.has(id)
41289
+ }))
41134
41290
  };
41135
41291
  }
41136
41292
 
@@ -41627,7 +41783,8 @@ var v1 = (ctx) => ({
41627
41783
  raccoons: parseRaccoons(ctx.root, ctx.mailSet),
41628
41784
  perfection: parsePerfection(ctx.root),
41629
41785
  mineProgress: parseMineProgress(ctx.player, ctx.root, ctx.mailSet),
41630
- communityCenter: parseCommunityCenter(ctx.mailSet, ctx.eventsSet)
41786
+ communityCenter: parseCommunityCenter(ctx.mailSet, ctx.eventsSet),
41787
+ joja: parseJoja(ctx.mailSet, ctx.eventsSet)
41631
41788
  });
41632
41789
  var PARSER_SETS = {
41633
41790
  1: v1
@@ -41744,6 +41901,7 @@ function parseSaveFile(xml) {
41744
41901
  HouseRenovationQuery,
41745
41902
  HouseUpgradeQuery,
41746
41903
  IslandTraderQuery,
41904
+ JojaParrotCalculator,
41747
41905
  JojaQuery,
41748
41906
  KnowledgeCalculator,
41749
41907
  KrobusQuery,
@@ -41829,6 +41987,7 @@ function parseSaveFile(xml) {
41829
41987
  isPet,
41830
41988
  islandTrader,
41831
41989
  joja,
41990
+ jojaParrotCalculator,
41832
41991
  knowledgeCalculator,
41833
41992
  krobus,
41834
41993
  locations,